@strands-agents/sdk 1.6.0 → 1.8.0
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/src/agent/agent.d.ts +1 -1
- package/dist/src/agent/agent.d.ts.map +1 -1
- package/dist/src/agent/agent.js +1 -1
- package/dist/src/agent/agent.js.map +1 -1
- package/dist/src/context-manager/modes/agentic/agentic-context.d.ts +3 -3
- package/dist/src/context-manager/modes/agentic/agentic-context.d.ts.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/index.node.d.ts.map +1 -1
- package/dist/src/index.node.js +3 -0
- package/dist/src/index.node.js.map +1 -1
- package/dist/src/interventions/actions.d.ts.map +1 -1
- package/dist/src/interventions/actions.js.map +1 -1
- package/dist/src/{mcp.d.ts → mcp/client.d.ts} +13 -4
- package/dist/src/mcp/client.d.ts.map +1 -0
- package/dist/src/{mcp.js → mcp/client.js} +15 -3
- package/dist/src/mcp/client.js.map +1 -0
- package/dist/src/mcp/config.d.ts +52 -0
- package/dist/src/mcp/config.d.ts.map +1 -0
- package/dist/src/mcp/config.js +12 -0
- package/dist/src/mcp/config.js.map +1 -0
- package/dist/src/mcp/config.node.d.ts +16 -0
- package/dist/src/mcp/config.node.d.ts.map +1 -0
- package/dist/src/mcp/config.node.js +145 -0
- package/dist/src/mcp/config.node.js.map +1 -0
- package/dist/src/mcp/index.d.ts +3 -0
- package/dist/src/mcp/index.d.ts.map +1 -0
- package/dist/src/mcp/index.js +2 -0
- package/dist/src/mcp/index.js.map +1 -0
- package/dist/src/memory/extraction/coordinator.d.ts +6 -1
- package/dist/src/memory/extraction/coordinator.d.ts.map +1 -1
- package/dist/src/memory/extraction/coordinator.js +48 -10
- package/dist/src/memory/extraction/coordinator.js.map +1 -1
- package/dist/src/memory/extraction/model-extractor.d.ts.map +1 -1
- package/dist/src/memory/extraction/model-extractor.js +30 -9
- package/dist/src/memory/extraction/model-extractor.js.map +1 -1
- package/dist/src/memory/extraction/types.d.ts +7 -0
- package/dist/src/memory/extraction/types.d.ts.map +1 -1
- package/dist/src/memory/extraction/types.js.map +1 -1
- package/dist/src/memory/memory-manager.d.ts +15 -2
- package/dist/src/memory/memory-manager.d.ts.map +1 -1
- package/dist/src/memory/memory-manager.js +123 -45
- package/dist/src/memory/memory-manager.js.map +1 -1
- package/dist/src/memory/types.d.ts +7 -0
- package/dist/src/memory/types.d.ts.map +1 -1
- package/dist/src/models/google/adapters.d.ts.map +1 -1
- package/dist/src/models/google/adapters.js +21 -3
- package/dist/src/models/google/adapters.js.map +1 -1
- package/dist/src/models/model.d.ts.map +1 -1
- package/dist/src/models/model.js +2 -1
- package/dist/src/models/model.js.map +1 -1
- package/dist/src/models/openai/errors.d.ts.map +1 -1
- package/dist/src/models/openai/errors.js +4 -1
- package/dist/src/models/openai/errors.js.map +1 -1
- package/dist/src/models/openai/responses-adapter.d.ts +1 -0
- package/dist/src/models/openai/responses-adapter.d.ts.map +1 -1
- package/dist/src/models/openai/responses-adapter.js +24 -10
- package/dist/src/models/openai/responses-adapter.js.map +1 -1
- package/dist/src/multiagent/graph.d.ts +7 -0
- package/dist/src/multiagent/graph.d.ts.map +1 -1
- package/dist/src/multiagent/graph.js +26 -2
- package/dist/src/multiagent/graph.js.map +1 -1
- package/dist/src/multiagent/nodes.d.ts +5 -0
- package/dist/src/multiagent/nodes.d.ts.map +1 -1
- package/dist/src/multiagent/nodes.js +15 -0
- package/dist/src/multiagent/nodes.js.map +1 -1
- package/dist/src/multiagent/state.d.ts.map +1 -1
- package/dist/src/multiagent/state.js.map +1 -1
- package/dist/src/telemetry/tracer.d.ts +82 -2
- package/dist/src/telemetry/tracer.d.ts.map +1 -1
- package/dist/src/telemetry/tracer.js +242 -3
- package/dist/src/telemetry/tracer.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +86 -1
- package/dist/src/telemetry/types.d.ts.map +1 -1
- package/dist/src/tools/function-tool.d.ts +1 -1
- package/dist/src/tools/function-tool.d.ts.map +1 -1
- package/dist/src/tools/function-tool.js +4 -12
- package/dist/src/tools/function-tool.js.map +1 -1
- package/dist/src/tools/mcp-tool.d.ts +2 -1
- package/dist/src/tools/mcp-tool.d.ts.map +1 -1
- package/dist/src/tools/mcp-tool.js +1 -0
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/tool-factory.d.ts +1 -1
- package/dist/src/tools/tool-factory.d.ts.map +1 -1
- package/dist/src/tools/types.d.ts +4 -0
- package/dist/src/tools/types.d.ts.map +1 -1
- package/dist/src/tools/zod-tool.d.ts +4 -2
- package/dist/src/tools/zod-tool.d.ts.map +1 -1
- package/dist/src/tools/zod-tool.js.map +1 -1
- package/dist/src/tsconfig.tsbuildinfo +1 -1
- package/dist/src/types/json.js +2 -2
- package/dist/src/types/json.js.map +1 -1
- package/dist/src/types/media.d.ts.map +1 -1
- package/dist/src/types/media.js.map +1 -1
- package/dist/src/types/messages.d.ts.map +1 -1
- package/dist/src/types/messages.js.map +1 -1
- package/dist/src/vended-interventions/cedar/cedar.d.ts +12 -0
- package/dist/src/vended-interventions/cedar/cedar.d.ts.map +1 -1
- package/dist/src/vended-interventions/cedar/cedar.js +15 -4
- package/dist/src/vended-interventions/cedar/cedar.js.map +1 -1
- package/dist/src/vended-interventions/cedar/schema-generator.d.ts +1 -1
- package/dist/src/vended-interventions/cedar/schema-generator.d.ts.map +1 -1
- package/dist/src/vended-interventions/cedar/schema-generator.js +8 -3
- package/dist/src/vended-interventions/cedar/schema-generator.js.map +1 -1
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/index.d.ts +1 -1
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/index.d.ts.map +1 -1
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/index.js.map +1 -1
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/store.d.ts +57 -0
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/store.d.ts.map +1 -1
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/store.js +86 -11
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/store.js.map +1 -1
- package/dist/src/vended-memory-stores/local/index.d.ts +2 -0
- package/dist/src/vended-memory-stores/local/index.d.ts.map +1 -0
- package/dist/src/vended-memory-stores/local/index.js +2 -0
- package/dist/src/vended-memory-stores/local/index.js.map +1 -0
- package/dist/src/vended-memory-stores/local/store.d.ts +122 -0
- package/dist/src/vended-memory-stores/local/store.d.ts.map +1 -0
- package/dist/src/vended-memory-stores/local/store.js +281 -0
- package/dist/src/vended-memory-stores/local/store.js.map +1 -0
- package/dist/src/vended-plugins/context-offloader/search.d.ts.map +1 -1
- package/dist/src/vended-plugins/context-offloader/search.js +4 -2
- package/dist/src/vended-plugins/context-offloader/search.js.map +1 -1
- package/dist/src/vended-plugins/context-offloader/storage.d.ts.map +1 -1
- package/dist/src/vended-plugins/context-offloader/storage.js +16 -3
- package/dist/src/vended-plugins/context-offloader/storage.js.map +1 -1
- package/dist/src/vended-plugins/skills/skill.d.ts.map +1 -1
- package/dist/src/vended-plugins/skills/skill.js +4 -2
- package/dist/src/vended-plugins/skills/skill.js.map +1 -1
- package/dist/src/vended-tools/http-request/http-request.js +1 -1
- package/dist/src/vended-tools/http-request/http-request.js.map +1 -1
- package/dist/src/vended-tools/notebook/notebook.d.ts +1 -1
- package/package.json +46 -39
- package/dist/src/__fixtures__/agent-helpers.d.ts +0 -136
- package/dist/src/__fixtures__/agent-helpers.d.ts.map +0 -1
- package/dist/src/__fixtures__/agent-helpers.js +0 -156
- package/dist/src/__fixtures__/agent-helpers.js.map +0 -1
- package/dist/src/__fixtures__/environment.d.ts +0 -12
- package/dist/src/__fixtures__/environment.d.ts.map +0 -1
- package/dist/src/__fixtures__/environment.js +0 -12
- package/dist/src/__fixtures__/environment.js.map +0 -1
- package/dist/src/__fixtures__/metrics-helpers.d.ts +0 -55
- package/dist/src/__fixtures__/metrics-helpers.d.ts.map +0 -1
- package/dist/src/__fixtures__/metrics-helpers.js +0 -57
- package/dist/src/__fixtures__/metrics-helpers.js.map +0 -1
- package/dist/src/__fixtures__/mock-message-model.d.ts +0 -103
- package/dist/src/__fixtures__/mock-message-model.d.ts.map +0 -1
- package/dist/src/__fixtures__/mock-message-model.js +0 -245
- package/dist/src/__fixtures__/mock-message-model.js.map +0 -1
- package/dist/src/__fixtures__/mock-meter.d.ts +0 -32
- package/dist/src/__fixtures__/mock-meter.d.ts.map +0 -1
- package/dist/src/__fixtures__/mock-meter.js +0 -47
- package/dist/src/__fixtures__/mock-meter.js.map +0 -1
- package/dist/src/__fixtures__/mock-plugin.d.ts +0 -13
- package/dist/src/__fixtures__/mock-plugin.d.ts.map +0 -1
- package/dist/src/__fixtures__/mock-plugin.js +0 -35
- package/dist/src/__fixtures__/mock-plugin.js.map +0 -1
- package/dist/src/__fixtures__/mock-span.d.ts +0 -78
- package/dist/src/__fixtures__/mock-span.d.ts.map +0 -1
- package/dist/src/__fixtures__/mock-span.js +0 -93
- package/dist/src/__fixtures__/mock-span.js.map +0 -1
- package/dist/src/__fixtures__/mock-storage-provider.d.ts +0 -42
- package/dist/src/__fixtures__/mock-storage-provider.d.ts.map +0 -1
- package/dist/src/__fixtures__/mock-storage-provider.js +0 -122
- package/dist/src/__fixtures__/mock-storage-provider.js.map +0 -1
- package/dist/src/__fixtures__/model-test-helpers.d.ts +0 -56
- package/dist/src/__fixtures__/model-test-helpers.d.ts.map +0 -1
- package/dist/src/__fixtures__/model-test-helpers.js +0 -85
- package/dist/src/__fixtures__/model-test-helpers.js.map +0 -1
- package/dist/src/__fixtures__/register-node-defaults.d.ts +0 -2
- package/dist/src/__fixtures__/register-node-defaults.d.ts.map +0 -1
- package/dist/src/__fixtures__/register-node-defaults.js +0 -6
- package/dist/src/__fixtures__/register-node-defaults.js.map +0 -1
- package/dist/src/__fixtures__/slim-types.d.ts +0 -51
- package/dist/src/__fixtures__/slim-types.d.ts.map +0 -1
- package/dist/src/__fixtures__/slim-types.js +0 -6
- package/dist/src/__fixtures__/slim-types.js.map +0 -1
- package/dist/src/__fixtures__/test-sandbox.node.d.ts +0 -15
- package/dist/src/__fixtures__/test-sandbox.node.d.ts.map +0 -1
- package/dist/src/__fixtures__/test-sandbox.node.js +0 -23
- package/dist/src/__fixtures__/test-sandbox.node.js.map +0 -1
- package/dist/src/__fixtures__/tool-helpers.d.ts +0 -45
- package/dist/src/__fixtures__/tool-helpers.d.ts.map +0 -1
- package/dist/src/__fixtures__/tool-helpers.js +0 -101
- package/dist/src/__fixtures__/tool-helpers.js.map +0 -1
- package/dist/src/__tests__/default-slot.test.d.ts +0 -2
- package/dist/src/__tests__/default-slot.test.d.ts.map +0 -1
- package/dist/src/__tests__/default-slot.test.js +0 -33
- package/dist/src/__tests__/default-slot.test.js.map +0 -1
- package/dist/src/__tests__/errors.test.d.ts +0 -2
- package/dist/src/__tests__/errors.test.d.ts.map +0 -1
- package/dist/src/__tests__/errors.test.js +0 -170
- package/dist/src/__tests__/errors.test.js.map +0 -1
- package/dist/src/__tests__/index.test.d.ts +0 -2
- package/dist/src/__tests__/index.test.d.ts.map +0 -1
- package/dist/src/__tests__/index.test.js +0 -48
- package/dist/src/__tests__/index.test.js.map +0 -1
- package/dist/src/__tests__/interrupt.test.d.ts +0 -2
- package/dist/src/__tests__/interrupt.test.d.ts.map +0 -1
- package/dist/src/__tests__/interrupt.test.js +0 -264
- package/dist/src/__tests__/interrupt.test.js.map +0 -1
- package/dist/src/__tests__/mcp.test.d.ts +0 -2
- package/dist/src/__tests__/mcp.test.d.ts.map +0 -1
- package/dist/src/__tests__/mcp.test.js +0 -1003
- package/dist/src/__tests__/mcp.test.js.map +0 -1
- package/dist/src/__tests__/mime.test.d.ts +0 -2
- package/dist/src/__tests__/mime.test.d.ts.map +0 -1
- package/dist/src/__tests__/mime.test.js +0 -83
- package/dist/src/__tests__/mime.test.js.map +0 -1
- package/dist/src/__tests__/state-store.test.d.ts +0 -2
- package/dist/src/__tests__/state-store.test.d.ts.map +0 -1
- package/dist/src/__tests__/state-store.test.js +0 -285
- package/dist/src/__tests__/state-store.test.js.map +0 -1
- package/dist/src/a2a/__tests__/a2a-agent.test.d.ts +0 -2
- package/dist/src/a2a/__tests__/a2a-agent.test.d.ts.map +0 -1
- package/dist/src/a2a/__tests__/a2a-agent.test.js +0 -383
- package/dist/src/a2a/__tests__/a2a-agent.test.js.map +0 -1
- package/dist/src/a2a/__tests__/adapters.test.d.ts +0 -2
- package/dist/src/a2a/__tests__/adapters.test.d.ts.map +0 -1
- package/dist/src/a2a/__tests__/adapters.test.js +0 -151
- package/dist/src/a2a/__tests__/adapters.test.js.map +0 -1
- package/dist/src/a2a/__tests__/async-lock.test.d.ts +0 -2
- package/dist/src/a2a/__tests__/async-lock.test.d.ts.map +0 -1
- package/dist/src/a2a/__tests__/async-lock.test.js +0 -137
- package/dist/src/a2a/__tests__/async-lock.test.js.map +0 -1
- package/dist/src/a2a/__tests__/events.test.d.ts +0 -2
- package/dist/src/a2a/__tests__/events.test.d.ts.map +0 -1
- package/dist/src/a2a/__tests__/events.test.js +0 -68
- package/dist/src/a2a/__tests__/events.test.js.map +0 -1
- package/dist/src/a2a/__tests__/executor.test.d.ts +0 -2
- package/dist/src/a2a/__tests__/executor.test.d.ts.map +0 -1
- package/dist/src/a2a/__tests__/executor.test.js +0 -345
- package/dist/src/a2a/__tests__/executor.test.js.map +0 -1
- package/dist/src/a2a/__tests__/server.test.d.ts +0 -2
- package/dist/src/a2a/__tests__/server.test.d.ts.map +0 -1
- package/dist/src/a2a/__tests__/server.test.js +0 -71
- package/dist/src/a2a/__tests__/server.test.js.map +0 -1
- package/dist/src/a2a/__tests__/server.test.node.d.ts +0 -2
- package/dist/src/a2a/__tests__/server.test.node.d.ts.map +0 -1
- package/dist/src/a2a/__tests__/server.test.node.js +0 -110
- package/dist/src/a2a/__tests__/server.test.node.js.map +0 -1
- package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.d.ts +0 -2
- package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.js +0 -23
- package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.js.map +0 -1
- package/dist/src/agent/__tests__/agent-as-tool.test.d.ts +0 -2
- package/dist/src/agent/__tests__/agent-as-tool.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/agent-as-tool.test.js +0 -347
- package/dist/src/agent/__tests__/agent-as-tool.test.js.map +0 -1
- package/dist/src/agent/__tests__/agent.cancel.test.d.ts +0 -2
- package/dist/src/agent/__tests__/agent.cancel.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/agent.cancel.test.js +0 -337
- package/dist/src/agent/__tests__/agent.cancel.test.js.map +0 -1
- package/dist/src/agent/__tests__/agent.concurrent.test.d.ts +0 -2
- package/dist/src/agent/__tests__/agent.concurrent.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/agent.concurrent.test.js +0 -488
- package/dist/src/agent/__tests__/agent.concurrent.test.js.map +0 -1
- package/dist/src/agent/__tests__/agent.context-manager.test.d.ts +0 -2
- package/dist/src/agent/__tests__/agent.context-manager.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/agent.context-manager.test.js +0 -107
- package/dist/src/agent/__tests__/agent.context-manager.test.js.map +0 -1
- package/dist/src/agent/__tests__/agent.hook.test.d.ts +0 -2
- package/dist/src/agent/__tests__/agent.hook.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/agent.hook.test.js +0 -1332
- package/dist/src/agent/__tests__/agent.hook.test.js.map +0 -1
- package/dist/src/agent/__tests__/agent.interrupt.test.d.ts +0 -2
- package/dist/src/agent/__tests__/agent.interrupt.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/agent.interrupt.test.js +0 -779
- package/dist/src/agent/__tests__/agent.interrupt.test.js.map +0 -1
- package/dist/src/agent/__tests__/agent.invocation-state.test.d.ts +0 -2
- package/dist/src/agent/__tests__/agent.invocation-state.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/agent.invocation-state.test.js +0 -219
- package/dist/src/agent/__tests__/agent.invocation-state.test.js.map +0 -1
- package/dist/src/agent/__tests__/agent.model-retry.test.d.ts +0 -2
- package/dist/src/agent/__tests__/agent.model-retry.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/agent.model-retry.test.js +0 -161
- package/dist/src/agent/__tests__/agent.model-retry.test.js.map +0 -1
- package/dist/src/agent/__tests__/agent.stateful-model.test.d.ts +0 -2
- package/dist/src/agent/__tests__/agent.stateful-model.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/agent.stateful-model.test.js +0 -169
- package/dist/src/agent/__tests__/agent.stateful-model.test.js.map +0 -1
- package/dist/src/agent/__tests__/agent.test.d.ts +0 -2
- package/dist/src/agent/__tests__/agent.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/agent.test.js +0 -1624
- package/dist/src/agent/__tests__/agent.test.js.map +0 -1
- package/dist/src/agent/__tests__/agent.tracer.test.node.d.ts +0 -2
- package/dist/src/agent/__tests__/agent.tracer.test.node.d.ts.map +0 -1
- package/dist/src/agent/__tests__/agent.tracer.test.node.js +0 -535
- package/dist/src/agent/__tests__/agent.tracer.test.node.js.map +0 -1
- package/dist/src/agent/__tests__/printer.test.d.ts +0 -2
- package/dist/src/agent/__tests__/printer.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/printer.test.js +0 -188
- package/dist/src/agent/__tests__/printer.test.js.map +0 -1
- package/dist/src/agent/__tests__/snapshot.test.d.ts +0 -2
- package/dist/src/agent/__tests__/snapshot.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/snapshot.test.js +0 -442
- package/dist/src/agent/__tests__/snapshot.test.js.map +0 -1
- package/dist/src/agent/__tests__/tool-caller.test.d.ts +0 -2
- package/dist/src/agent/__tests__/tool-caller.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/tool-caller.test.js +0 -459
- package/dist/src/agent/__tests__/tool-caller.test.js.map +0 -1
- package/dist/src/conversation-manager/__tests__/agentic-context.test.d.ts +0 -2
- package/dist/src/conversation-manager/__tests__/agentic-context.test.d.ts.map +0 -1
- package/dist/src/conversation-manager/__tests__/agentic-context.test.js +0 -332
- package/dist/src/conversation-manager/__tests__/agentic-context.test.js.map +0 -1
- package/dist/src/conversation-manager/__tests__/context-compression.test.d.ts +0 -2
- package/dist/src/conversation-manager/__tests__/context-compression.test.d.ts.map +0 -1
- package/dist/src/conversation-manager/__tests__/context-compression.test.js +0 -176
- package/dist/src/conversation-manager/__tests__/context-compression.test.js.map +0 -1
- package/dist/src/conversation-manager/__tests__/conversation-manager.test.d.ts +0 -2
- package/dist/src/conversation-manager/__tests__/conversation-manager.test.d.ts.map +0 -1
- package/dist/src/conversation-manager/__tests__/conversation-manager.test.js +0 -321
- package/dist/src/conversation-manager/__tests__/conversation-manager.test.js.map +0 -1
- package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.d.ts +0 -2
- package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.d.ts.map +0 -1
- package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js +0 -64
- package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js.map +0 -1
- package/dist/src/conversation-manager/__tests__/pin.test.d.ts +0 -2
- package/dist/src/conversation-manager/__tests__/pin.test.d.ts.map +0 -1
- package/dist/src/conversation-manager/__tests__/pin.test.js +0 -119
- package/dist/src/conversation-manager/__tests__/pin.test.js.map +0 -1
- package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.d.ts +0 -2
- package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.d.ts.map +0 -1
- package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js +0 -1080
- package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js.map +0 -1
- package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.d.ts +0 -2
- package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.d.ts.map +0 -1
- package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js +0 -400
- package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js.map +0 -1
- package/dist/src/conversation-manager/__tests__/token-usage-middleware.test.d.ts +0 -2
- package/dist/src/conversation-manager/__tests__/token-usage-middleware.test.d.ts.map +0 -1
- package/dist/src/conversation-manager/__tests__/token-usage-middleware.test.js +0 -138
- package/dist/src/conversation-manager/__tests__/token-usage-middleware.test.js.map +0 -1
- package/dist/src/hooks/__tests__/events.test.d.ts +0 -2
- package/dist/src/hooks/__tests__/events.test.d.ts.map +0 -1
- package/dist/src/hooks/__tests__/events.test.js +0 -1060
- package/dist/src/hooks/__tests__/events.test.js.map +0 -1
- package/dist/src/hooks/__tests__/registry.test.d.ts +0 -2
- package/dist/src/hooks/__tests__/registry.test.d.ts.map +0 -1
- package/dist/src/hooks/__tests__/registry.test.js +0 -325
- package/dist/src/hooks/__tests__/registry.test.js.map +0 -1
- package/dist/src/injection/__tests__/message-injection.test.d.ts +0 -2
- package/dist/src/injection/__tests__/message-injection.test.d.ts.map +0 -1
- package/dist/src/injection/__tests__/message-injection.test.js +0 -200
- package/dist/src/injection/__tests__/message-injection.test.js.map +0 -1
- package/dist/src/interventions/__tests__/handler.test.d.ts +0 -2
- package/dist/src/interventions/__tests__/handler.test.d.ts.map +0 -1
- package/dist/src/interventions/__tests__/handler.test.js +0 -35
- package/dist/src/interventions/__tests__/handler.test.js.map +0 -1
- package/dist/src/interventions/__tests__/registry.test.d.ts +0 -2
- package/dist/src/interventions/__tests__/registry.test.d.ts.map +0 -1
- package/dist/src/interventions/__tests__/registry.test.js +0 -692
- package/dist/src/interventions/__tests__/registry.test.js.map +0 -1
- package/dist/src/logging/__tests__/logger.test.d.ts +0 -2
- package/dist/src/logging/__tests__/logger.test.d.ts.map +0 -1
- package/dist/src/logging/__tests__/logger.test.js +0 -70
- package/dist/src/logging/__tests__/logger.test.js.map +0 -1
- package/dist/src/logging/__tests__/warn-once.test.d.ts +0 -2
- package/dist/src/logging/__tests__/warn-once.test.d.ts.map +0 -1
- package/dist/src/logging/__tests__/warn-once.test.js +0 -30
- package/dist/src/logging/__tests__/warn-once.test.js.map +0 -1
- package/dist/src/mcp.d.ts.map +0 -1
- package/dist/src/mcp.js.map +0 -1
- package/dist/src/memory/__tests__/memory-manager.test.d.ts +0 -2
- package/dist/src/memory/__tests__/memory-manager.test.d.ts.map +0 -1
- package/dist/src/memory/__tests__/memory-manager.test.js +0 -679
- package/dist/src/memory/__tests__/memory-manager.test.js.map +0 -1
- package/dist/src/memory/extraction/__tests__/extraction.test.d.ts +0 -2
- package/dist/src/memory/extraction/__tests__/extraction.test.d.ts.map +0 -1
- package/dist/src/memory/extraction/__tests__/extraction.test.js +0 -637
- package/dist/src/memory/extraction/__tests__/extraction.test.js.map +0 -1
- package/dist/src/memory/extraction/__tests__/model-extractor.test.d.ts +0 -2
- package/dist/src/memory/extraction/__tests__/model-extractor.test.d.ts.map +0 -1
- package/dist/src/memory/extraction/__tests__/model-extractor.test.js +0 -68
- package/dist/src/memory/extraction/__tests__/model-extractor.test.js.map +0 -1
- package/dist/src/memory/extraction/__tests__/resolve-extraction-config.test.d.ts +0 -2
- package/dist/src/memory/extraction/__tests__/resolve-extraction-config.test.d.ts.map +0 -1
- package/dist/src/memory/extraction/__tests__/resolve-extraction-config.test.js +0 -81
- package/dist/src/memory/extraction/__tests__/resolve-extraction-config.test.js.map +0 -1
- package/dist/src/middleware/__tests__/agent-middleware.test.d.ts +0 -2
- package/dist/src/middleware/__tests__/agent-middleware.test.d.ts.map +0 -1
- package/dist/src/middleware/__tests__/agent-middleware.test.js +0 -1206
- package/dist/src/middleware/__tests__/agent-middleware.test.js.map +0 -1
- package/dist/src/middleware/__tests__/copy-on-input.test.d.ts +0 -2
- package/dist/src/middleware/__tests__/copy-on-input.test.d.ts.map +0 -1
- package/dist/src/middleware/__tests__/copy-on-input.test.js +0 -379
- package/dist/src/middleware/__tests__/copy-on-input.test.js.map +0 -1
- package/dist/src/middleware/__tests__/custom-stages.test.d.ts +0 -2
- package/dist/src/middleware/__tests__/custom-stages.test.d.ts.map +0 -1
- package/dist/src/middleware/__tests__/custom-stages.test.js +0 -97
- package/dist/src/middleware/__tests__/custom-stages.test.js.map +0 -1
- package/dist/src/middleware/__tests__/middleware-interrupts.test.d.ts +0 -2
- package/dist/src/middleware/__tests__/middleware-interrupts.test.d.ts.map +0 -1
- package/dist/src/middleware/__tests__/middleware-interrupts.test.js +0 -267
- package/dist/src/middleware/__tests__/middleware-interrupts.test.js.map +0 -1
- package/dist/src/middleware/__tests__/registry.test.d.ts +0 -2
- package/dist/src/middleware/__tests__/registry.test.d.ts.map +0 -1
- package/dist/src/middleware/__tests__/registry.test.js +0 -525
- package/dist/src/middleware/__tests__/registry.test.js.map +0 -1
- package/dist/src/models/__tests__/anthropic.test.d.ts +0 -2
- package/dist/src/models/__tests__/anthropic.test.d.ts.map +0 -1
- package/dist/src/models/__tests__/anthropic.test.js +0 -793
- package/dist/src/models/__tests__/anthropic.test.js.map +0 -1
- package/dist/src/models/__tests__/bedrock.test.d.ts +0 -2
- package/dist/src/models/__tests__/bedrock.test.d.ts.map +0 -1
- package/dist/src/models/__tests__/bedrock.test.js +0 -3964
- package/dist/src/models/__tests__/bedrock.test.js.map +0 -1
- package/dist/src/models/__tests__/defaults.test.d.ts +0 -2
- package/dist/src/models/__tests__/defaults.test.d.ts.map +0 -1
- package/dist/src/models/__tests__/defaults.test.js +0 -36
- package/dist/src/models/__tests__/defaults.test.js.map +0 -1
- package/dist/src/models/__tests__/google.test.d.ts +0 -2
- package/dist/src/models/__tests__/google.test.d.ts.map +0 -1
- package/dist/src/models/__tests__/google.test.js +0 -1104
- package/dist/src/models/__tests__/google.test.js.map +0 -1
- package/dist/src/models/__tests__/model.test.d.ts +0 -2
- package/dist/src/models/__tests__/model.test.d.ts.map +0 -1
- package/dist/src/models/__tests__/model.test.js +0 -921
- package/dist/src/models/__tests__/model.test.js.map +0 -1
- package/dist/src/models/__tests__/streaming.test.d.ts +0 -2
- package/dist/src/models/__tests__/streaming.test.d.ts.map +0 -1
- package/dist/src/models/__tests__/streaming.test.js +0 -50
- package/dist/src/models/__tests__/streaming.test.js.map +0 -1
- package/dist/src/models/__tests__/test-utils.d.ts +0 -10
- package/dist/src/models/__tests__/test-utils.d.ts.map +0 -1
- package/dist/src/models/__tests__/test-utils.js +0 -17
- package/dist/src/models/__tests__/test-utils.js.map +0 -1
- package/dist/src/models/__tests__/vercel.test.d.ts +0 -2
- package/dist/src/models/__tests__/vercel.test.d.ts.map +0 -1
- package/dist/src/models/__tests__/vercel.test.js +0 -740
- package/dist/src/models/__tests__/vercel.test.js.map +0 -1
- package/dist/src/models/openai/__tests__/chat.test.d.ts +0 -2
- package/dist/src/models/openai/__tests__/chat.test.d.ts.map +0 -1
- package/dist/src/models/openai/__tests__/chat.test.js +0 -1586
- package/dist/src/models/openai/__tests__/chat.test.js.map +0 -1
- package/dist/src/models/openai/__tests__/errors.test.d.ts +0 -2
- package/dist/src/models/openai/__tests__/errors.test.d.ts.map +0 -1
- package/dist/src/models/openai/__tests__/errors.test.js +0 -30
- package/dist/src/models/openai/__tests__/errors.test.js.map +0 -1
- package/dist/src/models/openai/__tests__/mantle.test.d.ts +0 -2
- package/dist/src/models/openai/__tests__/mantle.test.d.ts.map +0 -1
- package/dist/src/models/openai/__tests__/mantle.test.js +0 -189
- package/dist/src/models/openai/__tests__/mantle.test.js.map +0 -1
- package/dist/src/models/openai/__tests__/responses.test.d.ts +0 -2
- package/dist/src/models/openai/__tests__/responses.test.d.ts.map +0 -1
- package/dist/src/models/openai/__tests__/responses.test.js +0 -662
- package/dist/src/models/openai/__tests__/responses.test.js.map +0 -1
- package/dist/src/multiagent/__tests__/events.test.d.ts +0 -2
- package/dist/src/multiagent/__tests__/events.test.d.ts.map +0 -1
- package/dist/src/multiagent/__tests__/events.test.js +0 -493
- package/dist/src/multiagent/__tests__/events.test.js.map +0 -1
- package/dist/src/multiagent/__tests__/graph.invocation-state.test.d.ts +0 -2
- package/dist/src/multiagent/__tests__/graph.invocation-state.test.d.ts.map +0 -1
- package/dist/src/multiagent/__tests__/graph.invocation-state.test.js +0 -95
- package/dist/src/multiagent/__tests__/graph.invocation-state.test.js.map +0 -1
- package/dist/src/multiagent/__tests__/graph.test.d.ts +0 -2
- package/dist/src/multiagent/__tests__/graph.test.d.ts.map +0 -1
- package/dist/src/multiagent/__tests__/graph.test.js +0 -677
- package/dist/src/multiagent/__tests__/graph.test.js.map +0 -1
- package/dist/src/multiagent/__tests__/graph.tracer.test.d.ts +0 -2
- package/dist/src/multiagent/__tests__/graph.tracer.test.d.ts.map +0 -1
- package/dist/src/multiagent/__tests__/graph.tracer.test.js +0 -218
- package/dist/src/multiagent/__tests__/graph.tracer.test.js.map +0 -1
- package/dist/src/multiagent/__tests__/interrupts.test.d.ts +0 -2
- package/dist/src/multiagent/__tests__/interrupts.test.d.ts.map +0 -1
- package/dist/src/multiagent/__tests__/interrupts.test.js +0 -390
- package/dist/src/multiagent/__tests__/interrupts.test.js.map +0 -1
- package/dist/src/multiagent/__tests__/nodes.test.d.ts +0 -2
- package/dist/src/multiagent/__tests__/nodes.test.d.ts.map +0 -1
- package/dist/src/multiagent/__tests__/nodes.test.js +0 -321
- package/dist/src/multiagent/__tests__/nodes.test.js.map +0 -1
- package/dist/src/multiagent/__tests__/queue.test.d.ts +0 -2
- package/dist/src/multiagent/__tests__/queue.test.d.ts.map +0 -1
- package/dist/src/multiagent/__tests__/queue.test.js +0 -118
- package/dist/src/multiagent/__tests__/queue.test.js.map +0 -1
- package/dist/src/multiagent/__tests__/snapshot.test.d.ts +0 -2
- package/dist/src/multiagent/__tests__/snapshot.test.d.ts.map +0 -1
- package/dist/src/multiagent/__tests__/snapshot.test.js +0 -161
- package/dist/src/multiagent/__tests__/snapshot.test.js.map +0 -1
- package/dist/src/multiagent/__tests__/state.test.d.ts +0 -2
- package/dist/src/multiagent/__tests__/state.test.d.ts.map +0 -1
- package/dist/src/multiagent/__tests__/state.test.js +0 -526
- package/dist/src/multiagent/__tests__/state.test.js.map +0 -1
- package/dist/src/multiagent/__tests__/swarm.invocation-state.test.d.ts +0 -2
- package/dist/src/multiagent/__tests__/swarm.invocation-state.test.d.ts.map +0 -1
- package/dist/src/multiagent/__tests__/swarm.invocation-state.test.js +0 -56
- package/dist/src/multiagent/__tests__/swarm.invocation-state.test.js.map +0 -1
- package/dist/src/multiagent/__tests__/swarm.test.d.ts +0 -2
- package/dist/src/multiagent/__tests__/swarm.test.d.ts.map +0 -1
- package/dist/src/multiagent/__tests__/swarm.test.js +0 -477
- package/dist/src/multiagent/__tests__/swarm.test.js.map +0 -1
- package/dist/src/multiagent/__tests__/swarm.tracer.test.d.ts +0 -2
- package/dist/src/multiagent/__tests__/swarm.tracer.test.d.ts.map +0 -1
- package/dist/src/multiagent/__tests__/swarm.tracer.test.js +0 -235
- package/dist/src/multiagent/__tests__/swarm.tracer.test.js.map +0 -1
- package/dist/src/plugins/__tests__/plugin.test.d.ts +0 -2
- package/dist/src/plugins/__tests__/plugin.test.d.ts.map +0 -1
- package/dist/src/plugins/__tests__/plugin.test.js +0 -114
- package/dist/src/plugins/__tests__/plugin.test.js.map +0 -1
- package/dist/src/plugins/__tests__/registry.test.d.ts +0 -2
- package/dist/src/plugins/__tests__/registry.test.d.ts.map +0 -1
- package/dist/src/plugins/__tests__/registry.test.js +0 -147
- package/dist/src/plugins/__tests__/registry.test.js.map +0 -1
- package/dist/src/registry/__tests__/tool-registry.test.d.ts +0 -2
- package/dist/src/registry/__tests__/tool-registry.test.d.ts.map +0 -1
- package/dist/src/registry/__tests__/tool-registry.test.js +0 -210
- package/dist/src/registry/__tests__/tool-registry.test.js.map +0 -1
- package/dist/src/retry/__tests__/backoff-strategy.test.d.ts +0 -2
- package/dist/src/retry/__tests__/backoff-strategy.test.d.ts.map +0 -1
- package/dist/src/retry/__tests__/backoff-strategy.test.js +0 -116
- package/dist/src/retry/__tests__/backoff-strategy.test.js.map +0 -1
- package/dist/src/retry/__tests__/default-model-retry-strategy.test.d.ts +0 -2
- package/dist/src/retry/__tests__/default-model-retry-strategy.test.d.ts.map +0 -1
- package/dist/src/retry/__tests__/default-model-retry-strategy.test.js +0 -225
- package/dist/src/retry/__tests__/default-model-retry-strategy.test.js.map +0 -1
- package/dist/src/sandbox/__tests__/default.test.browser.d.ts +0 -2
- package/dist/src/sandbox/__tests__/default.test.browser.d.ts.map +0 -1
- package/dist/src/sandbox/__tests__/default.test.browser.js +0 -11
- package/dist/src/sandbox/__tests__/default.test.browser.js.map +0 -1
- package/dist/src/sandbox/__tests__/default.test.node.d.ts +0 -2
- package/dist/src/sandbox/__tests__/default.test.node.d.ts.map +0 -1
- package/dist/src/sandbox/__tests__/default.test.node.js +0 -23
- package/dist/src/sandbox/__tests__/default.test.node.js.map +0 -1
- package/dist/src/sandbox/__tests__/docker.test.node.d.ts +0 -2
- package/dist/src/sandbox/__tests__/docker.test.node.d.ts.map +0 -1
- package/dist/src/sandbox/__tests__/docker.test.node.js +0 -89
- package/dist/src/sandbox/__tests__/docker.test.node.js.map +0 -1
- package/dist/src/sandbox/__tests__/errors.test.node.d.ts +0 -2
- package/dist/src/sandbox/__tests__/errors.test.node.d.ts.map +0 -1
- package/dist/src/sandbox/__tests__/errors.test.node.js +0 -33
- package/dist/src/sandbox/__tests__/errors.test.node.js.map +0 -1
- package/dist/src/sandbox/__tests__/not-a-sandbox-local-environment.test.node.d.ts +0 -2
- package/dist/src/sandbox/__tests__/not-a-sandbox-local-environment.test.node.d.ts.map +0 -1
- package/dist/src/sandbox/__tests__/not-a-sandbox-local-environment.test.node.js +0 -124
- package/dist/src/sandbox/__tests__/not-a-sandbox-local-environment.test.node.js.map +0 -1
- package/dist/src/sandbox/__tests__/posix-shell.test.node.d.ts +0 -2
- package/dist/src/sandbox/__tests__/posix-shell.test.node.d.ts.map +0 -1
- package/dist/src/sandbox/__tests__/posix-shell.test.node.js +0 -298
- package/dist/src/sandbox/__tests__/posix-shell.test.node.js.map +0 -1
- package/dist/src/sandbox/__tests__/ssh.test.node.d.ts +0 -2
- package/dist/src/sandbox/__tests__/ssh.test.node.d.ts.map +0 -1
- package/dist/src/sandbox/__tests__/ssh.test.node.js +0 -262
- package/dist/src/sandbox/__tests__/ssh.test.node.js.map +0 -1
- package/dist/src/session/__tests__/file-storage.test.node.d.ts +0 -2
- package/dist/src/session/__tests__/file-storage.test.node.d.ts.map +0 -1
- package/dist/src/session/__tests__/file-storage.test.node.js +0 -278
- package/dist/src/session/__tests__/file-storage.test.node.js.map +0 -1
- package/dist/src/session/__tests__/s3-storage.test.d.ts +0 -2
- package/dist/src/session/__tests__/s3-storage.test.d.ts.map +0 -1
- package/dist/src/session/__tests__/s3-storage.test.js +0 -461
- package/dist/src/session/__tests__/s3-storage.test.js.map +0 -1
- package/dist/src/session/__tests__/session-manager.test.d.ts +0 -2
- package/dist/src/session/__tests__/session-manager.test.d.ts.map +0 -1
- package/dist/src/session/__tests__/session-manager.test.js +0 -832
- package/dist/src/session/__tests__/session-manager.test.js.map +0 -1
- package/dist/src/session/__tests__/validation.test.d.ts +0 -2
- package/dist/src/session/__tests__/validation.test.d.ts.map +0 -1
- package/dist/src/session/__tests__/validation.test.js +0 -47
- package/dist/src/session/__tests__/validation.test.js.map +0 -1
- package/dist/src/telemetry/__tests__/config.test.d.ts +0 -2
- package/dist/src/telemetry/__tests__/config.test.d.ts.map +0 -1
- package/dist/src/telemetry/__tests__/config.test.js +0 -64
- package/dist/src/telemetry/__tests__/config.test.js.map +0 -1
- package/dist/src/telemetry/__tests__/config.test.node.d.ts +0 -2
- package/dist/src/telemetry/__tests__/config.test.node.d.ts.map +0 -1
- package/dist/src/telemetry/__tests__/config.test.node.js +0 -164
- package/dist/src/telemetry/__tests__/config.test.node.js.map +0 -1
- package/dist/src/telemetry/__tests__/json.test.d.ts +0 -2
- package/dist/src/telemetry/__tests__/json.test.d.ts.map +0 -1
- package/dist/src/telemetry/__tests__/json.test.js +0 -89
- package/dist/src/telemetry/__tests__/json.test.js.map +0 -1
- package/dist/src/telemetry/__tests__/local-trace.test.d.ts +0 -2
- package/dist/src/telemetry/__tests__/local-trace.test.d.ts.map +0 -1
- package/dist/src/telemetry/__tests__/local-trace.test.js +0 -158
- package/dist/src/telemetry/__tests__/local-trace.test.js.map +0 -1
- package/dist/src/telemetry/__tests__/meter.test.d.ts +0 -2
- package/dist/src/telemetry/__tests__/meter.test.d.ts.map +0 -1
- package/dist/src/telemetry/__tests__/meter.test.js +0 -695
- package/dist/src/telemetry/__tests__/meter.test.js.map +0 -1
- package/dist/src/telemetry/__tests__/tracer.test.node.d.ts +0 -2
- package/dist/src/telemetry/__tests__/tracer.test.node.d.ts.map +0 -1
- package/dist/src/telemetry/__tests__/tracer.test.node.js +0 -760
- package/dist/src/telemetry/__tests__/tracer.test.node.js.map +0 -1
- package/dist/src/tools/__tests__/structured-output-tool.test.d.ts +0 -2
- package/dist/src/tools/__tests__/structured-output-tool.test.d.ts.map +0 -1
- package/dist/src/tools/__tests__/structured-output-tool.test.js +0 -84
- package/dist/src/tools/__tests__/structured-output-tool.test.js.map +0 -1
- package/dist/src/tools/__tests__/tool-factory.test.d.ts +0 -2
- package/dist/src/tools/__tests__/tool-factory.test.d.ts.map +0 -1
- package/dist/src/tools/__tests__/tool-factory.test.js +0 -98
- package/dist/src/tools/__tests__/tool-factory.test.js.map +0 -1
- package/dist/src/tools/__tests__/tool.test.d.ts +0 -2
- package/dist/src/tools/__tests__/tool.test.d.ts.map +0 -1
- package/dist/src/tools/__tests__/tool.test.js +0 -1043
- package/dist/src/tools/__tests__/tool.test.js.map +0 -1
- package/dist/src/tools/__tests__/zod-tool.test-d.d.ts +0 -2
- package/dist/src/tools/__tests__/zod-tool.test-d.d.ts.map +0 -1
- package/dist/src/tools/__tests__/zod-tool.test-d.js +0 -227
- package/dist/src/tools/__tests__/zod-tool.test-d.js.map +0 -1
- package/dist/src/tools/__tests__/zod-tool.test.d.ts +0 -2
- package/dist/src/tools/__tests__/zod-tool.test.d.ts.map +0 -1
- package/dist/src/tools/__tests__/zod-tool.test.js +0 -563
- package/dist/src/tools/__tests__/zod-tool.test.js.map +0 -1
- package/dist/src/types/__tests__/agent.test.d.ts +0 -2
- package/dist/src/types/__tests__/agent.test.d.ts.map +0 -1
- package/dist/src/types/__tests__/agent.test.js +0 -476
- package/dist/src/types/__tests__/agent.test.js.map +0 -1
- package/dist/src/types/__tests__/citations.test.d.ts +0 -2
- package/dist/src/types/__tests__/citations.test.d.ts.map +0 -1
- package/dist/src/types/__tests__/citations.test.js +0 -104
- package/dist/src/types/__tests__/citations.test.js.map +0 -1
- package/dist/src/types/__tests__/json.test.d.ts +0 -2
- package/dist/src/types/__tests__/json.test.d.ts.map +0 -1
- package/dist/src/types/__tests__/json.test.js +0 -298
- package/dist/src/types/__tests__/json.test.js.map +0 -1
- package/dist/src/types/__tests__/media.test.d.ts +0 -2
- package/dist/src/types/__tests__/media.test.d.ts.map +0 -1
- package/dist/src/types/__tests__/media.test.js +0 -478
- package/dist/src/types/__tests__/media.test.js.map +0 -1
- package/dist/src/types/__tests__/messages.test.d.ts +0 -2
- package/dist/src/types/__tests__/messages.test.d.ts.map +0 -1
- package/dist/src/types/__tests__/messages.test.js +0 -681
- package/dist/src/types/__tests__/messages.test.js.map +0 -1
- package/dist/src/types/__tests__/validation.test.d.ts +0 -2
- package/dist/src/types/__tests__/validation.test.d.ts.map +0 -1
- package/dist/src/types/__tests__/validation.test.js +0 -30
- package/dist/src/types/__tests__/validation.test.js.map +0 -1
- package/dist/src/vended-interventions/cedar/__tests__/cedar.test.node.d.ts +0 -2
- package/dist/src/vended-interventions/cedar/__tests__/cedar.test.node.d.ts.map +0 -1
- package/dist/src/vended-interventions/cedar/__tests__/cedar.test.node.js +0 -675
- package/dist/src/vended-interventions/cedar/__tests__/cedar.test.node.js.map +0 -1
- package/dist/src/vended-interventions/hitl/__tests__/hitl.test.d.ts +0 -2
- package/dist/src/vended-interventions/hitl/__tests__/hitl.test.d.ts.map +0 -1
- package/dist/src/vended-interventions/hitl/__tests__/hitl.test.js +0 -358
- package/dist/src/vended-interventions/hitl/__tests__/hitl.test.js.map +0 -1
- package/dist/src/vended-interventions/steering/__tests__/handler.test.d.ts +0 -2
- package/dist/src/vended-interventions/steering/__tests__/handler.test.d.ts.map +0 -1
- package/dist/src/vended-interventions/steering/__tests__/handler.test.js +0 -163
- package/dist/src/vended-interventions/steering/__tests__/handler.test.js.map +0 -1
- package/dist/src/vended-interventions/steering/__tests__/llm.test.d.ts +0 -2
- package/dist/src/vended-interventions/steering/__tests__/llm.test.d.ts.map +0 -1
- package/dist/src/vended-interventions/steering/__tests__/llm.test.js +0 -60
- package/dist/src/vended-interventions/steering/__tests__/llm.test.js.map +0 -1
- package/dist/src/vended-interventions/steering/__tests__/tool-ledger.test.d.ts +0 -2
- package/dist/src/vended-interventions/steering/__tests__/tool-ledger.test.d.ts.map +0 -1
- package/dist/src/vended-interventions/steering/__tests__/tool-ledger.test.js +0 -94
- package/dist/src/vended-interventions/steering/__tests__/tool-ledger.test.js.map +0 -1
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.d.ts +0 -2
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.d.ts.map +0 -1
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.js +0 -611
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.js.map +0 -1
- package/dist/src/vended-plugins/context-injector/__tests__/plugin.test.d.ts +0 -2
- package/dist/src/vended-plugins/context-injector/__tests__/plugin.test.d.ts.map +0 -1
- package/dist/src/vended-plugins/context-injector/__tests__/plugin.test.js +0 -96
- package/dist/src/vended-plugins/context-injector/__tests__/plugin.test.js.map +0 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/file-storage-sandbox.test.node.d.ts +0 -2
- package/dist/src/vended-plugins/context-offloader/__tests__/file-storage-sandbox.test.node.d.ts.map +0 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/file-storage-sandbox.test.node.js +0 -68
- package/dist/src/vended-plugins/context-offloader/__tests__/file-storage-sandbox.test.node.js.map +0 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.d.ts +0 -2
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.d.ts.map +0 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js +0 -539
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js.map +0 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.node.d.ts +0 -2
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.node.d.ts.map +0 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.node.js +0 -93
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.node.js.map +0 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/search.test.d.ts +0 -2
- package/dist/src/vended-plugins/context-offloader/__tests__/search.test.d.ts.map +0 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/search.test.js +0 -149
- package/dist/src/vended-plugins/context-offloader/__tests__/search.test.js.map +0 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.d.ts +0 -2
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.d.ts.map +0 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.js +0 -216
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.js.map +0 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.d.ts +0 -2
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.d.ts.map +0 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.js +0 -78
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.js.map +0 -1
- package/dist/src/vended-plugins/goal/__tests__/plugin.test.d.ts +0 -2
- package/dist/src/vended-plugins/goal/__tests__/plugin.test.d.ts.map +0 -1
- package/dist/src/vended-plugins/goal/__tests__/plugin.test.js +0 -736
- package/dist/src/vended-plugins/goal/__tests__/plugin.test.js.map +0 -1
- package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.d.ts +0 -2
- package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.d.ts.map +0 -1
- package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.js +0 -482
- package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.js.map +0 -1
- package/dist/src/vended-plugins/skills/__tests__/skill.test.node.d.ts +0 -2
- package/dist/src/vended-plugins/skills/__tests__/skill.test.node.d.ts.map +0 -1
- package/dist/src/vended-plugins/skills/__tests__/skill.test.node.js +0 -476
- package/dist/src/vended-plugins/skills/__tests__/skill.test.node.js.map +0 -1
- package/dist/src/vended-tools/bash/__tests__/bash.test.node.d.ts +0 -2
- package/dist/src/vended-tools/bash/__tests__/bash.test.node.d.ts.map +0 -1
- package/dist/src/vended-tools/bash/__tests__/bash.test.node.js +0 -390
- package/dist/src/vended-tools/bash/__tests__/bash.test.node.js.map +0 -1
- package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.d.ts +0 -2
- package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.d.ts.map +0 -1
- package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js +0 -452
- package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js.map +0 -1
- package/dist/src/vended-tools/http-request/__tests__/http-request.test.d.ts +0 -2
- package/dist/src/vended-tools/http-request/__tests__/http-request.test.d.ts.map +0 -1
- package/dist/src/vended-tools/http-request/__tests__/http-request.test.js +0 -189
- package/dist/src/vended-tools/http-request/__tests__/http-request.test.js.map +0 -1
- package/dist/src/vended-tools/notebook/__tests__/notebook.test.d.ts +0 -2
- package/dist/src/vended-tools/notebook/__tests__/notebook.test.d.ts.map +0 -1
- package/dist/src/vended-tools/notebook/__tests__/notebook.test.js +0 -388
- package/dist/src/vended-tools/notebook/__tests__/notebook.test.js.map +0 -1
|
@@ -1,1080 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
import { SlidingWindowConversationManager } from '../sliding-window-conversation-manager.js';
|
|
3
|
-
import { ContextWindowOverflowError, DocumentBlock, ImageBlock, JsonBlock, Message, TextBlock, ToolUseBlock, ToolResultBlock, VideoBlock, } from '../../index.js';
|
|
4
|
-
import { AfterInvocationEvent, AfterModelCallEvent, BeforeModelCallEvent } from '../../hooks/events.js';
|
|
5
|
-
import { createMockAgent, invokeTrackedHook } from '../../__fixtures__/agent-helpers.js';
|
|
6
|
-
async function triggerSlidingWindow(manager, agent) {
|
|
7
|
-
const pluginAgent = createMockAgent();
|
|
8
|
-
manager.initAgent(pluginAgent);
|
|
9
|
-
await invokeTrackedHook(pluginAgent, new AfterInvocationEvent({ agent, invocationState: {} }));
|
|
10
|
-
}
|
|
11
|
-
// Helper to trigger context overflow handling through hooks
|
|
12
|
-
async function triggerContextOverflow(manager, agent, error) {
|
|
13
|
-
const pluginAgent = createMockAgent();
|
|
14
|
-
manager.initAgent(pluginAgent);
|
|
15
|
-
const event = new AfterModelCallEvent({ agent, model: {}, attemptCount: 1, error, invocationState: {} });
|
|
16
|
-
await invokeTrackedHook(pluginAgent, event);
|
|
17
|
-
return event;
|
|
18
|
-
}
|
|
19
|
-
describe('SlidingWindowConversationManager', () => {
|
|
20
|
-
describe('constructor', () => {
|
|
21
|
-
it('sets default windowSize to 40', () => {
|
|
22
|
-
const manager = new SlidingWindowConversationManager();
|
|
23
|
-
// Access through type assertion since these are private
|
|
24
|
-
expect(manager._windowSize).toBe(40);
|
|
25
|
-
});
|
|
26
|
-
it('sets default shouldTruncateResults to true', () => {
|
|
27
|
-
const manager = new SlidingWindowConversationManager();
|
|
28
|
-
expect(manager._shouldTruncateResults).toBe(true);
|
|
29
|
-
});
|
|
30
|
-
it('accepts custom windowSize', () => {
|
|
31
|
-
const manager = new SlidingWindowConversationManager({ windowSize: 20 });
|
|
32
|
-
expect(manager._windowSize).toBe(20);
|
|
33
|
-
});
|
|
34
|
-
it('accepts custom shouldTruncateResults', () => {
|
|
35
|
-
const manager = new SlidingWindowConversationManager({ shouldTruncateResults: false });
|
|
36
|
-
expect(manager._shouldTruncateResults).toBe(false);
|
|
37
|
-
});
|
|
38
|
-
});
|
|
39
|
-
describe('reduce', () => {
|
|
40
|
-
it('returns true when tool results are truncated even though message count is unchanged', () => {
|
|
41
|
-
const manager = new SlidingWindowConversationManager({ shouldTruncateResults: true });
|
|
42
|
-
const messages = [
|
|
43
|
-
new Message({
|
|
44
|
-
role: 'user',
|
|
45
|
-
content: [
|
|
46
|
-
new ToolResultBlock({
|
|
47
|
-
toolUseId: 'tool-1',
|
|
48
|
-
status: 'success',
|
|
49
|
-
content: [new TextBlock('x'.repeat(500))],
|
|
50
|
-
}),
|
|
51
|
-
],
|
|
52
|
-
}),
|
|
53
|
-
];
|
|
54
|
-
const result = manager.reduce({
|
|
55
|
-
agent: createMockAgent({ messages }),
|
|
56
|
-
model: {},
|
|
57
|
-
error: new ContextWindowOverflowError('overflow'),
|
|
58
|
-
});
|
|
59
|
-
expect(result).toBe(true);
|
|
60
|
-
expect(messages).toHaveLength(1); // length unchanged, but truncation occurred
|
|
61
|
-
});
|
|
62
|
-
it('returns true when messages are trimmed', () => {
|
|
63
|
-
const manager = new SlidingWindowConversationManager({ windowSize: 2, shouldTruncateResults: false });
|
|
64
|
-
const messages = [
|
|
65
|
-
new Message({ role: 'user', content: [new TextBlock('Message 1')] }),
|
|
66
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response 1')] }),
|
|
67
|
-
new Message({ role: 'user', content: [new TextBlock('Message 2')] }),
|
|
68
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response 2')] }),
|
|
69
|
-
];
|
|
70
|
-
const result = manager.reduce({
|
|
71
|
-
agent: createMockAgent({ messages }),
|
|
72
|
-
model: {},
|
|
73
|
-
error: new ContextWindowOverflowError('overflow'),
|
|
74
|
-
});
|
|
75
|
-
expect(result).toBe(true);
|
|
76
|
-
expect(messages).toHaveLength(2);
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
describe('applyManagement', () => {
|
|
80
|
-
it('skips reduction when message count is less than window size', async () => {
|
|
81
|
-
const manager = new SlidingWindowConversationManager({ windowSize: 10 });
|
|
82
|
-
const messages = [
|
|
83
|
-
new Message({ role: 'user', content: [new TextBlock('Message 1')] }),
|
|
84
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response 1')] }),
|
|
85
|
-
];
|
|
86
|
-
const mockAgent = createMockAgent({ messages });
|
|
87
|
-
await triggerSlidingWindow(manager, mockAgent);
|
|
88
|
-
expect(mockAgent.messages).toHaveLength(2);
|
|
89
|
-
});
|
|
90
|
-
it('skips reduction when message count equals window size', async () => {
|
|
91
|
-
const manager = new SlidingWindowConversationManager({ windowSize: 2 });
|
|
92
|
-
const messages = [
|
|
93
|
-
new Message({ role: 'user', content: [new TextBlock('Message 1')] }),
|
|
94
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response 1')] }),
|
|
95
|
-
];
|
|
96
|
-
const mockAgent = createMockAgent({ messages });
|
|
97
|
-
await triggerSlidingWindow(manager, mockAgent);
|
|
98
|
-
expect(mockAgent.messages).toHaveLength(2);
|
|
99
|
-
});
|
|
100
|
-
it('removes all messages when windowSize is 0', async () => {
|
|
101
|
-
const manager = new SlidingWindowConversationManager({ windowSize: 0 });
|
|
102
|
-
const messages = [
|
|
103
|
-
new Message({ role: 'user', content: [new TextBlock('Message 1')] }),
|
|
104
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response 1')] }),
|
|
105
|
-
];
|
|
106
|
-
const mockAgent = createMockAgent({ messages });
|
|
107
|
-
await triggerSlidingWindow(manager, mockAgent);
|
|
108
|
-
expect(mockAgent.messages).toHaveLength(0);
|
|
109
|
-
});
|
|
110
|
-
it('calls reduceContext when message count exceeds window size', async () => {
|
|
111
|
-
const manager = new SlidingWindowConversationManager({ windowSize: 2 });
|
|
112
|
-
const messages = [
|
|
113
|
-
new Message({ role: 'user', content: [new TextBlock('Message 1')] }),
|
|
114
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response 1')] }),
|
|
115
|
-
new Message({ role: 'user', content: [new TextBlock('Message 2')] }),
|
|
116
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response 2')] }),
|
|
117
|
-
];
|
|
118
|
-
const mockAgent = createMockAgent({ messages });
|
|
119
|
-
await triggerSlidingWindow(manager, mockAgent);
|
|
120
|
-
// Should have trimmed; first message must be user
|
|
121
|
-
expect(mockAgent.messages).toHaveLength(2);
|
|
122
|
-
expect(mockAgent.messages[0].role).toBe('user');
|
|
123
|
-
});
|
|
124
|
-
});
|
|
125
|
-
describe('reduceContext - tool result truncation', () => {
|
|
126
|
-
it('partially truncates large tool results preserving first and last 200 chars', async () => {
|
|
127
|
-
const manager = new SlidingWindowConversationManager({ shouldTruncateResults: true });
|
|
128
|
-
const middle = 'MIDDLE_CONTENT_TO_REMOVE'.repeat(10); // 240 chars, safely above MIN_TRUNCATION_GAIN
|
|
129
|
-
const original = 'A'.repeat(200) + middle + 'B'.repeat(200);
|
|
130
|
-
const messages = [
|
|
131
|
-
new Message({
|
|
132
|
-
role: 'user',
|
|
133
|
-
content: [
|
|
134
|
-
new ToolResultBlock({
|
|
135
|
-
toolUseId: 'tool-1',
|
|
136
|
-
status: 'success',
|
|
137
|
-
content: [new TextBlock(original)],
|
|
138
|
-
}),
|
|
139
|
-
],
|
|
140
|
-
}),
|
|
141
|
-
];
|
|
142
|
-
const mockAgent = createMockAgent({ messages });
|
|
143
|
-
await triggerContextOverflow(manager, mockAgent, new ContextWindowOverflowError('Context overflow'));
|
|
144
|
-
const expectedText = `${'A'.repeat(200)}\n<truncated chars="${middle.length}"/>\n${'B'.repeat(200)}`;
|
|
145
|
-
expect(messages[0].content[0]).toEqual(new ToolResultBlock({
|
|
146
|
-
toolUseId: 'tool-1',
|
|
147
|
-
status: 'success',
|
|
148
|
-
content: [new TextBlock(expectedText)],
|
|
149
|
-
}));
|
|
150
|
-
});
|
|
151
|
-
it('leaves small tool results unchanged', () => {
|
|
152
|
-
const manager = new SlidingWindowConversationManager({ shouldTruncateResults: true });
|
|
153
|
-
const messages = [
|
|
154
|
-
new Message({
|
|
155
|
-
role: 'user',
|
|
156
|
-
content: [
|
|
157
|
-
new ToolResultBlock({
|
|
158
|
-
toolUseId: 'tool-1',
|
|
159
|
-
status: 'success',
|
|
160
|
-
content: [new TextBlock('Small result')],
|
|
161
|
-
}),
|
|
162
|
-
],
|
|
163
|
-
}),
|
|
164
|
-
];
|
|
165
|
-
const result = manager._truncateToolResults(messages, 0);
|
|
166
|
-
expect(result).toBe(false);
|
|
167
|
-
});
|
|
168
|
-
it('finds oldest message with tool results', async () => {
|
|
169
|
-
const manager = new SlidingWindowConversationManager({ shouldTruncateResults: true });
|
|
170
|
-
const firstOriginal = 'F'.repeat(500);
|
|
171
|
-
const secondOriginal = 'S'.repeat(500);
|
|
172
|
-
const messages = [
|
|
173
|
-
new Message({ role: 'user', content: [new TextBlock('Message 1')] }),
|
|
174
|
-
new Message({
|
|
175
|
-
role: 'user',
|
|
176
|
-
content: [
|
|
177
|
-
new ToolResultBlock({
|
|
178
|
-
toolUseId: 'tool-1',
|
|
179
|
-
status: 'success',
|
|
180
|
-
content: [new TextBlock(firstOriginal)],
|
|
181
|
-
}),
|
|
182
|
-
],
|
|
183
|
-
}),
|
|
184
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response')] }),
|
|
185
|
-
new Message({
|
|
186
|
-
role: 'user',
|
|
187
|
-
content: [
|
|
188
|
-
new ToolResultBlock({
|
|
189
|
-
toolUseId: 'tool-2',
|
|
190
|
-
status: 'success',
|
|
191
|
-
content: [new TextBlock(secondOriginal)],
|
|
192
|
-
}),
|
|
193
|
-
],
|
|
194
|
-
}),
|
|
195
|
-
];
|
|
196
|
-
const mockAgent = createMockAgent({ messages });
|
|
197
|
-
await triggerContextOverflow(manager, mockAgent, new ContextWindowOverflowError('Context overflow'));
|
|
198
|
-
// Oldest tool-result message is truncated; newer one is untouched.
|
|
199
|
-
const expectedTruncated = `${'F'.repeat(200)}\n<truncated chars="100"/>\n${'F'.repeat(200)}`;
|
|
200
|
-
expect(messages[1].content[0]).toEqual(new ToolResultBlock({
|
|
201
|
-
toolUseId: 'tool-1',
|
|
202
|
-
status: 'success',
|
|
203
|
-
content: [new TextBlock(expectedTruncated)],
|
|
204
|
-
}));
|
|
205
|
-
expect(messages[3].content[0]).toEqual(new ToolResultBlock({
|
|
206
|
-
toolUseId: 'tool-2',
|
|
207
|
-
status: 'success',
|
|
208
|
-
content: [new TextBlock(secondOriginal)],
|
|
209
|
-
}));
|
|
210
|
-
});
|
|
211
|
-
it('returns after successful truncation without trimming messages', async () => {
|
|
212
|
-
const manager = new SlidingWindowConversationManager({ windowSize: 2, shouldTruncateResults: true });
|
|
213
|
-
const messages = [
|
|
214
|
-
new Message({ role: 'user', content: [new TextBlock('Message 1')] }),
|
|
215
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response 1')] }),
|
|
216
|
-
new Message({
|
|
217
|
-
role: 'user',
|
|
218
|
-
content: [
|
|
219
|
-
new ToolResultBlock({
|
|
220
|
-
toolUseId: 'tool-1',
|
|
221
|
-
status: 'success',
|
|
222
|
-
content: [new TextBlock('L'.repeat(500))],
|
|
223
|
-
}),
|
|
224
|
-
],
|
|
225
|
-
}),
|
|
226
|
-
];
|
|
227
|
-
const mockAgent = createMockAgent({ messages });
|
|
228
|
-
await triggerContextOverflow(manager, mockAgent, new ContextWindowOverflowError('Context overflow'));
|
|
229
|
-
// Should not have removed any messages, only truncated tool result
|
|
230
|
-
expect(mockAgent.messages).toHaveLength(3);
|
|
231
|
-
});
|
|
232
|
-
it('skips truncation when shouldTruncateResults is false', async () => {
|
|
233
|
-
const manager = new SlidingWindowConversationManager({ windowSize: 3, shouldTruncateResults: false });
|
|
234
|
-
const messages = [
|
|
235
|
-
new Message({ role: 'user', content: [new TextBlock('Message 1')] }),
|
|
236
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response 1')] }),
|
|
237
|
-
new Message({ role: 'user', content: [new TextBlock('Message 2')] }),
|
|
238
|
-
new Message({
|
|
239
|
-
role: 'assistant',
|
|
240
|
-
content: [new ToolUseBlock({ name: 'tool1', toolUseId: 'tool-1', input: {} })],
|
|
241
|
-
}),
|
|
242
|
-
new Message({
|
|
243
|
-
role: 'user',
|
|
244
|
-
content: [
|
|
245
|
-
new ToolResultBlock({
|
|
246
|
-
toolUseId: 'tool-1',
|
|
247
|
-
status: 'success',
|
|
248
|
-
content: [new TextBlock('L'.repeat(500))],
|
|
249
|
-
}),
|
|
250
|
-
],
|
|
251
|
-
}),
|
|
252
|
-
];
|
|
253
|
-
const mockAgent = createMockAgent({ messages });
|
|
254
|
-
await triggerContextOverflow(manager, mockAgent, new ContextWindowOverflowError('Context overflow'));
|
|
255
|
-
// Should have trimmed messages instead of truncating tool result
|
|
256
|
-
expect(mockAgent.messages).toHaveLength(3);
|
|
257
|
-
expect(mockAgent.messages[0].role).toBe('user');
|
|
258
|
-
// Tool result should not be truncated
|
|
259
|
-
expect(mockAgent.messages[2].content[0]).toEqual(new ToolResultBlock({
|
|
260
|
-
toolUseId: 'tool-1',
|
|
261
|
-
status: 'success',
|
|
262
|
-
content: [new TextBlock('L'.repeat(500))],
|
|
263
|
-
}));
|
|
264
|
-
});
|
|
265
|
-
it('does not re-truncate already-truncated results', async () => {
|
|
266
|
-
const manager = new SlidingWindowConversationManager({ shouldTruncateResults: true });
|
|
267
|
-
// Produced by an earlier run: 200 chars + marker + 200 chars = well under the 450-char
|
|
268
|
-
// threshold below which truncation is not worth running.
|
|
269
|
-
const alreadyTruncated = 'A'.repeat(200) + '\n<truncated chars="1000"/>\n' + 'B'.repeat(200);
|
|
270
|
-
const messages = [
|
|
271
|
-
new Message({
|
|
272
|
-
role: 'user',
|
|
273
|
-
content: [
|
|
274
|
-
new ToolResultBlock({
|
|
275
|
-
toolUseId: 'tool-1',
|
|
276
|
-
status: 'success',
|
|
277
|
-
content: [new TextBlock(alreadyTruncated)],
|
|
278
|
-
}),
|
|
279
|
-
],
|
|
280
|
-
}),
|
|
281
|
-
];
|
|
282
|
-
// First call should return false (too short to gain anything from re-truncating)
|
|
283
|
-
const result = manager._truncateToolResults(messages, 0);
|
|
284
|
-
expect(result).toBe(false);
|
|
285
|
-
// reduceContext should fall through to message trimming
|
|
286
|
-
const messages2 = [
|
|
287
|
-
new Message({
|
|
288
|
-
role: 'user',
|
|
289
|
-
content: [
|
|
290
|
-
new ToolResultBlock({
|
|
291
|
-
toolUseId: 'tool-1',
|
|
292
|
-
status: 'success',
|
|
293
|
-
content: [new TextBlock(alreadyTruncated)],
|
|
294
|
-
}),
|
|
295
|
-
],
|
|
296
|
-
}),
|
|
297
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response')] }),
|
|
298
|
-
new Message({ role: 'user', content: [new TextBlock('Message')] }),
|
|
299
|
-
];
|
|
300
|
-
const mockAgent = createMockAgent({ messages: messages2 });
|
|
301
|
-
await triggerContextOverflow(manager, mockAgent, new ContextWindowOverflowError('Context overflow'));
|
|
302
|
-
// Should have trimmed messages since truncation was skipped
|
|
303
|
-
expect(mockAgent.messages.length).toBeLessThan(3);
|
|
304
|
-
});
|
|
305
|
-
it('replaces image blocks nested in tool results with descriptive placeholders', () => {
|
|
306
|
-
const manager = new SlidingWindowConversationManager({ shouldTruncateResults: true });
|
|
307
|
-
const bytes = new Uint8Array(1234);
|
|
308
|
-
const messages = [
|
|
309
|
-
new Message({
|
|
310
|
-
role: 'user',
|
|
311
|
-
content: [
|
|
312
|
-
new ToolResultBlock({
|
|
313
|
-
toolUseId: 'tool-1',
|
|
314
|
-
status: 'success',
|
|
315
|
-
content: [new ImageBlock({ format: 'png', source: { bytes } }), new TextBlock('tail')],
|
|
316
|
-
}),
|
|
317
|
-
],
|
|
318
|
-
}),
|
|
319
|
-
];
|
|
320
|
-
const changed = manager._truncateToolResults(messages, 0);
|
|
321
|
-
expect(changed).toBe(true);
|
|
322
|
-
expect(messages[0].content[0]).toEqual(new ToolResultBlock({
|
|
323
|
-
toolUseId: 'tool-1',
|
|
324
|
-
status: 'success',
|
|
325
|
-
content: [new TextBlock('[image: png, source: bytes, 1234 bytes]'), new TextBlock('tail')],
|
|
326
|
-
}));
|
|
327
|
-
});
|
|
328
|
-
it('preserves the error field on truncated tool results', () => {
|
|
329
|
-
const manager = new SlidingWindowConversationManager({ shouldTruncateResults: true });
|
|
330
|
-
const originalError = new Error('tool blew up');
|
|
331
|
-
const messages = [
|
|
332
|
-
new Message({
|
|
333
|
-
role: 'user',
|
|
334
|
-
content: [
|
|
335
|
-
new ToolResultBlock({
|
|
336
|
-
toolUseId: 'tool-1',
|
|
337
|
-
status: 'error',
|
|
338
|
-
content: [new TextBlock('x'.repeat(500))],
|
|
339
|
-
error: originalError,
|
|
340
|
-
}),
|
|
341
|
-
],
|
|
342
|
-
}),
|
|
343
|
-
];
|
|
344
|
-
const changed = manager._truncateToolResults(messages, 0);
|
|
345
|
-
expect(changed).toBe(true);
|
|
346
|
-
const expectedText = `${'x'.repeat(200)}\n<truncated chars="100"/>\n${'x'.repeat(200)}`;
|
|
347
|
-
expect(messages[0].content[0]).toEqual(new ToolResultBlock({
|
|
348
|
-
toolUseId: 'tool-1',
|
|
349
|
-
status: 'error',
|
|
350
|
-
content: [new TextBlock(expectedText)],
|
|
351
|
-
error: originalError,
|
|
352
|
-
}));
|
|
353
|
-
});
|
|
354
|
-
it('image placeholder reflects non-bytes source kinds honestly', () => {
|
|
355
|
-
const manager = new SlidingWindowConversationManager({ shouldTruncateResults: true });
|
|
356
|
-
const messages = [
|
|
357
|
-
new Message({
|
|
358
|
-
role: 'user',
|
|
359
|
-
content: [
|
|
360
|
-
new ToolResultBlock({
|
|
361
|
-
toolUseId: 'tool-1',
|
|
362
|
-
status: 'success',
|
|
363
|
-
content: [
|
|
364
|
-
new ImageBlock({ format: 'jpeg', source: { url: 'https://example.com/x.jpg' } }),
|
|
365
|
-
new ImageBlock({ format: 'png', source: { location: { type: 's3', uri: 's3://bucket/key' } } }),
|
|
366
|
-
],
|
|
367
|
-
}),
|
|
368
|
-
],
|
|
369
|
-
}),
|
|
370
|
-
];
|
|
371
|
-
manager._truncateToolResults(messages, 0);
|
|
372
|
-
expect(messages[0].content[0]).toEqual(new ToolResultBlock({
|
|
373
|
-
toolUseId: 'tool-1',
|
|
374
|
-
status: 'success',
|
|
375
|
-
content: [new TextBlock('[image: jpeg, source: url]'), new TextBlock('[image: png, source: s3]')],
|
|
376
|
-
}));
|
|
377
|
-
});
|
|
378
|
-
it('replaces video bytes blocks with a descriptive placeholder', () => {
|
|
379
|
-
const manager = new SlidingWindowConversationManager({ shouldTruncateResults: true });
|
|
380
|
-
const messages = [
|
|
381
|
-
new Message({
|
|
382
|
-
role: 'user',
|
|
383
|
-
content: [
|
|
384
|
-
new ToolResultBlock({
|
|
385
|
-
toolUseId: 'tool-1',
|
|
386
|
-
status: 'success',
|
|
387
|
-
content: [new VideoBlock({ format: 'mp4', source: { bytes: new Uint8Array(4096) } })],
|
|
388
|
-
}),
|
|
389
|
-
],
|
|
390
|
-
}),
|
|
391
|
-
];
|
|
392
|
-
const changed = manager._truncateToolResults(messages, 0);
|
|
393
|
-
expect(changed).toBe(true);
|
|
394
|
-
expect(messages[0].content[0]).toEqual(new ToolResultBlock({
|
|
395
|
-
toolUseId: 'tool-1',
|
|
396
|
-
status: 'success',
|
|
397
|
-
content: [new TextBlock('[video: mp4, source: bytes, 4096 bytes]')],
|
|
398
|
-
}));
|
|
399
|
-
});
|
|
400
|
-
it('replaces video s3 blocks with a descriptive placeholder', () => {
|
|
401
|
-
const manager = new SlidingWindowConversationManager({ shouldTruncateResults: true });
|
|
402
|
-
const messages = [
|
|
403
|
-
new Message({
|
|
404
|
-
role: 'user',
|
|
405
|
-
content: [
|
|
406
|
-
new ToolResultBlock({
|
|
407
|
-
toolUseId: 'tool-1',
|
|
408
|
-
status: 'success',
|
|
409
|
-
content: [
|
|
410
|
-
new VideoBlock({
|
|
411
|
-
format: 'mp4',
|
|
412
|
-
source: { location: { type: 's3', uri: 's3://bucket/key' } },
|
|
413
|
-
}),
|
|
414
|
-
],
|
|
415
|
-
}),
|
|
416
|
-
],
|
|
417
|
-
}),
|
|
418
|
-
];
|
|
419
|
-
const changed = manager._truncateToolResults(messages, 0);
|
|
420
|
-
expect(changed).toBe(true);
|
|
421
|
-
expect(messages[0].content[0]).toEqual(new ToolResultBlock({
|
|
422
|
-
toolUseId: 'tool-1',
|
|
423
|
-
status: 'success',
|
|
424
|
-
content: [new TextBlock('[video: mp4, source: s3]')],
|
|
425
|
-
}));
|
|
426
|
-
});
|
|
427
|
-
it('replaces document bytes blocks with a descriptive placeholder', () => {
|
|
428
|
-
const manager = new SlidingWindowConversationManager({ shouldTruncateResults: true });
|
|
429
|
-
const messages = [
|
|
430
|
-
new Message({
|
|
431
|
-
role: 'user',
|
|
432
|
-
content: [
|
|
433
|
-
new ToolResultBlock({
|
|
434
|
-
toolUseId: 'tool-1',
|
|
435
|
-
status: 'success',
|
|
436
|
-
content: [
|
|
437
|
-
new DocumentBlock({
|
|
438
|
-
name: 'report',
|
|
439
|
-
format: 'pdf',
|
|
440
|
-
source: { bytes: new Uint8Array(8192) },
|
|
441
|
-
}),
|
|
442
|
-
],
|
|
443
|
-
}),
|
|
444
|
-
],
|
|
445
|
-
}),
|
|
446
|
-
];
|
|
447
|
-
const changed = manager._truncateToolResults(messages, 0);
|
|
448
|
-
expect(changed).toBe(true);
|
|
449
|
-
expect(messages[0].content[0]).toEqual(new ToolResultBlock({
|
|
450
|
-
toolUseId: 'tool-1',
|
|
451
|
-
status: 'success',
|
|
452
|
-
content: [new TextBlock('[document: report, pdf, source: bytes, 8192 bytes]')],
|
|
453
|
-
}));
|
|
454
|
-
});
|
|
455
|
-
it('replaces document s3 blocks with a descriptive placeholder', () => {
|
|
456
|
-
const manager = new SlidingWindowConversationManager({ shouldTruncateResults: true });
|
|
457
|
-
const messages = [
|
|
458
|
-
new Message({
|
|
459
|
-
role: 'user',
|
|
460
|
-
content: [
|
|
461
|
-
new ToolResultBlock({
|
|
462
|
-
toolUseId: 'tool-1',
|
|
463
|
-
status: 'success',
|
|
464
|
-
content: [
|
|
465
|
-
new DocumentBlock({
|
|
466
|
-
name: 'spec',
|
|
467
|
-
format: 'pdf',
|
|
468
|
-
source: { location: { type: 's3', uri: 's3://b/k' } },
|
|
469
|
-
}),
|
|
470
|
-
],
|
|
471
|
-
}),
|
|
472
|
-
],
|
|
473
|
-
}),
|
|
474
|
-
];
|
|
475
|
-
const changed = manager._truncateToolResults(messages, 0);
|
|
476
|
-
expect(changed).toBe(true);
|
|
477
|
-
expect(messages[0].content[0]).toEqual(new ToolResultBlock({
|
|
478
|
-
toolUseId: 'tool-1',
|
|
479
|
-
status: 'success',
|
|
480
|
-
content: [new TextBlock('[document: spec, pdf, source: s3]')],
|
|
481
|
-
}));
|
|
482
|
-
});
|
|
483
|
-
it('partially truncates large text inside a document text source', () => {
|
|
484
|
-
const manager = new SlidingWindowConversationManager({ shouldTruncateResults: true });
|
|
485
|
-
const middle = 'M'.repeat(240);
|
|
486
|
-
const originalText = 'A'.repeat(200) + middle + 'B'.repeat(200);
|
|
487
|
-
const messages = [
|
|
488
|
-
new Message({
|
|
489
|
-
role: 'user',
|
|
490
|
-
content: [
|
|
491
|
-
new ToolResultBlock({
|
|
492
|
-
toolUseId: 'tool-1',
|
|
493
|
-
status: 'success',
|
|
494
|
-
content: [new DocumentBlock({ name: 'report', format: 'txt', source: { text: originalText } })],
|
|
495
|
-
}),
|
|
496
|
-
],
|
|
497
|
-
}),
|
|
498
|
-
];
|
|
499
|
-
const changed = manager._truncateToolResults(messages, 0);
|
|
500
|
-
expect(changed).toBe(true);
|
|
501
|
-
const expectedText = `${'A'.repeat(200)}\n<truncated chars="${middle.length}"/>\n${'B'.repeat(200)}`;
|
|
502
|
-
expect(messages[0].content[0]).toEqual(new ToolResultBlock({
|
|
503
|
-
toolUseId: 'tool-1',
|
|
504
|
-
status: 'success',
|
|
505
|
-
content: [new DocumentBlock({ name: 'report', format: 'txt', source: { text: expectedText } })],
|
|
506
|
-
}));
|
|
507
|
-
});
|
|
508
|
-
it('leaves small text inside a document text source unchanged', () => {
|
|
509
|
-
const manager = new SlidingWindowConversationManager({ shouldTruncateResults: true });
|
|
510
|
-
const messages = [
|
|
511
|
-
new Message({
|
|
512
|
-
role: 'user',
|
|
513
|
-
content: [
|
|
514
|
-
new ToolResultBlock({
|
|
515
|
-
toolUseId: 'tool-1',
|
|
516
|
-
status: 'success',
|
|
517
|
-
content: [new DocumentBlock({ name: 'short', format: 'txt', source: { text: 'hello' } })],
|
|
518
|
-
}),
|
|
519
|
-
],
|
|
520
|
-
}),
|
|
521
|
-
];
|
|
522
|
-
const changed = manager._truncateToolResults(messages, 0);
|
|
523
|
-
expect(changed).toBe(false);
|
|
524
|
-
});
|
|
525
|
-
it('truncates long nested text blocks inside a document content source', () => {
|
|
526
|
-
const manager = new SlidingWindowConversationManager({ shouldTruncateResults: true });
|
|
527
|
-
const longText = 'A'.repeat(200) + 'M'.repeat(240) + 'B'.repeat(200);
|
|
528
|
-
const messages = [
|
|
529
|
-
new Message({
|
|
530
|
-
role: 'user',
|
|
531
|
-
content: [
|
|
532
|
-
new ToolResultBlock({
|
|
533
|
-
toolUseId: 'tool-1',
|
|
534
|
-
status: 'success',
|
|
535
|
-
content: [
|
|
536
|
-
new DocumentBlock({
|
|
537
|
-
name: 'pages',
|
|
538
|
-
format: 'txt',
|
|
539
|
-
source: { content: [new TextBlock(longText), new TextBlock('short')] },
|
|
540
|
-
}),
|
|
541
|
-
],
|
|
542
|
-
}),
|
|
543
|
-
],
|
|
544
|
-
}),
|
|
545
|
-
];
|
|
546
|
-
const changed = manager._truncateToolResults(messages, 0);
|
|
547
|
-
expect(changed).toBe(true);
|
|
548
|
-
const expectedText = `${'A'.repeat(200)}\n<truncated chars="240"/>\n${'B'.repeat(200)}`;
|
|
549
|
-
expect(messages[0].content[0]).toEqual(new ToolResultBlock({
|
|
550
|
-
toolUseId: 'tool-1',
|
|
551
|
-
status: 'success',
|
|
552
|
-
content: [
|
|
553
|
-
new DocumentBlock({
|
|
554
|
-
name: 'pages',
|
|
555
|
-
format: 'txt',
|
|
556
|
-
source: { content: [new TextBlock(expectedText), new TextBlock('short')] },
|
|
557
|
-
}),
|
|
558
|
-
],
|
|
559
|
-
}));
|
|
560
|
-
});
|
|
561
|
-
it('replaces large json blocks with a size placeholder', () => {
|
|
562
|
-
const manager = new SlidingWindowConversationManager({ shouldTruncateResults: true });
|
|
563
|
-
const big = { payload: 'x'.repeat(1000) };
|
|
564
|
-
const size = JSON.stringify(big).length;
|
|
565
|
-
const messages = [
|
|
566
|
-
new Message({
|
|
567
|
-
role: 'user',
|
|
568
|
-
content: [
|
|
569
|
-
new ToolResultBlock({
|
|
570
|
-
toolUseId: 'tool-1',
|
|
571
|
-
status: 'success',
|
|
572
|
-
content: [new JsonBlock({ json: big })],
|
|
573
|
-
}),
|
|
574
|
-
],
|
|
575
|
-
}),
|
|
576
|
-
];
|
|
577
|
-
const changed = manager._truncateToolResults(messages, 0);
|
|
578
|
-
expect(changed).toBe(true);
|
|
579
|
-
expect(messages[0].content[0]).toEqual(new ToolResultBlock({
|
|
580
|
-
toolUseId: 'tool-1',
|
|
581
|
-
status: 'success',
|
|
582
|
-
content: [new TextBlock(`[json: ${size} chars]`)],
|
|
583
|
-
}));
|
|
584
|
-
});
|
|
585
|
-
it('leaves small json blocks unchanged', () => {
|
|
586
|
-
const manager = new SlidingWindowConversationManager({ shouldTruncateResults: true });
|
|
587
|
-
const messages = [
|
|
588
|
-
new Message({
|
|
589
|
-
role: 'user',
|
|
590
|
-
content: [
|
|
591
|
-
new ToolResultBlock({
|
|
592
|
-
toolUseId: 'tool-1',
|
|
593
|
-
status: 'success',
|
|
594
|
-
content: [new JsonBlock({ json: { ok: true } })],
|
|
595
|
-
}),
|
|
596
|
-
],
|
|
597
|
-
}),
|
|
598
|
-
];
|
|
599
|
-
const changed = manager._truncateToolResults(messages, 0);
|
|
600
|
-
expect(changed).toBe(false);
|
|
601
|
-
});
|
|
602
|
-
it('does not call truncateToolResults unless an error is passed in', async () => {
|
|
603
|
-
const manager = new SlidingWindowConversationManager({ windowSize: 2, shouldTruncateResults: true });
|
|
604
|
-
const messages = [
|
|
605
|
-
new Message({ role: 'user', content: [new TextBlock('Message 1')] }),
|
|
606
|
-
new Message({
|
|
607
|
-
role: 'assistant',
|
|
608
|
-
content: [new ToolUseBlock({ name: 'tool1', toolUseId: 'id-1', input: {} })],
|
|
609
|
-
}),
|
|
610
|
-
new Message({
|
|
611
|
-
role: 'user',
|
|
612
|
-
content: [
|
|
613
|
-
new ToolResultBlock({
|
|
614
|
-
toolUseId: 'id-1',
|
|
615
|
-
status: 'success',
|
|
616
|
-
content: [new TextBlock('Tool result content')],
|
|
617
|
-
}),
|
|
618
|
-
],
|
|
619
|
-
}),
|
|
620
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response 1')] }),
|
|
621
|
-
new Message({ role: 'user', content: [new TextBlock('Message 2')] }),
|
|
622
|
-
];
|
|
623
|
-
const mockAgent = createMockAgent({ messages });
|
|
624
|
-
// Spy on _truncateToolResults to verify it's NOT called
|
|
625
|
-
const truncateSpy = vi.spyOn(manager, '_truncateToolResults');
|
|
626
|
-
// Trigger window size enforcement (no error parameter)
|
|
627
|
-
await triggerSlidingWindow(manager, mockAgent);
|
|
628
|
-
// Verify _truncateToolResults was NOT called during window enforcement
|
|
629
|
-
expect(truncateSpy).not.toHaveBeenCalled();
|
|
630
|
-
// Should have trimmed; first message must be user
|
|
631
|
-
expect(mockAgent.messages.length).toBe(1);
|
|
632
|
-
expect(mockAgent.messages[0].role).toBe('user');
|
|
633
|
-
truncateSpy.mockRestore();
|
|
634
|
-
});
|
|
635
|
-
});
|
|
636
|
-
describe('reduceContext - message trimming', () => {
|
|
637
|
-
it('trims oldest messages when tool results cannot be truncated', async () => {
|
|
638
|
-
const manager = new SlidingWindowConversationManager({ windowSize: 3, shouldTruncateResults: false });
|
|
639
|
-
const messages = [
|
|
640
|
-
new Message({ role: 'user', content: [new TextBlock('Message 1')] }),
|
|
641
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response 1')] }),
|
|
642
|
-
new Message({ role: 'user', content: [new TextBlock('Message 2')] }),
|
|
643
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response 2')] }),
|
|
644
|
-
new Message({ role: 'user', content: [new TextBlock('Message 3')] }),
|
|
645
|
-
];
|
|
646
|
-
const mockAgent = createMockAgent({ messages });
|
|
647
|
-
await triggerContextOverflow(manager, mockAgent, new ContextWindowOverflowError('Context overflow'));
|
|
648
|
-
expect(mockAgent.messages).toHaveLength(3);
|
|
649
|
-
expect(mockAgent.messages[0].content[0]).toEqual({ type: 'textBlock', text: 'Message 2' });
|
|
650
|
-
});
|
|
651
|
-
it('calculates correct trim index (messages.length - windowSize)', async () => {
|
|
652
|
-
const manager = new SlidingWindowConversationManager({ windowSize: 2 });
|
|
653
|
-
const messages = [
|
|
654
|
-
new Message({ role: 'user', content: [new TextBlock('Message 1')] }),
|
|
655
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response 1')] }),
|
|
656
|
-
new Message({ role: 'user', content: [new TextBlock('Message 2')] }),
|
|
657
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response 2')] }),
|
|
658
|
-
];
|
|
659
|
-
const mockAgent = createMockAgent({ messages });
|
|
660
|
-
await triggerContextOverflow(manager, mockAgent, new ContextWindowOverflowError('Context overflow'));
|
|
661
|
-
// Should remove 2 messages (4 - 2 = 2)
|
|
662
|
-
expect(mockAgent.messages).toHaveLength(2);
|
|
663
|
-
});
|
|
664
|
-
it('removes all messages when windowSize is 0 on context overflow', async () => {
|
|
665
|
-
const manager = new SlidingWindowConversationManager({ windowSize: 0, shouldTruncateResults: false });
|
|
666
|
-
const messages = [
|
|
667
|
-
new Message({ role: 'user', content: [new TextBlock('Message 1')] }),
|
|
668
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response 1')] }),
|
|
669
|
-
];
|
|
670
|
-
const mockAgent = createMockAgent({ messages });
|
|
671
|
-
await triggerContextOverflow(manager, mockAgent, new ContextWindowOverflowError('Context overflow'));
|
|
672
|
-
expect(mockAgent.messages).toHaveLength(0);
|
|
673
|
-
});
|
|
674
|
-
it('uses default trim index of 2 when messages <= windowSize', async () => {
|
|
675
|
-
const manager = new SlidingWindowConversationManager({ windowSize: 5 });
|
|
676
|
-
const messages = [
|
|
677
|
-
new Message({ role: 'user', content: [new TextBlock('Message 1')] }),
|
|
678
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response 1')] }),
|
|
679
|
-
new Message({ role: 'user', content: [new TextBlock('Message 2')] }),
|
|
680
|
-
];
|
|
681
|
-
const mockAgent = createMockAgent({ messages });
|
|
682
|
-
await triggerContextOverflow(manager, mockAgent, new ContextWindowOverflowError('Context overflow'));
|
|
683
|
-
// Should remove 2 messages (default when count <= windowSize)
|
|
684
|
-
expect(mockAgent.messages).toHaveLength(1);
|
|
685
|
-
});
|
|
686
|
-
it('removes messages from start of array using splice', async () => {
|
|
687
|
-
const manager = new SlidingWindowConversationManager({ windowSize: 2 });
|
|
688
|
-
const messages = [
|
|
689
|
-
new Message({ role: 'user', content: [new TextBlock('Message 1')] }),
|
|
690
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response 1')] }),
|
|
691
|
-
new Message({ role: 'user', content: [new TextBlock('Message 2')] }),
|
|
692
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response 2')] }),
|
|
693
|
-
];
|
|
694
|
-
const mockAgent = createMockAgent({ messages });
|
|
695
|
-
await triggerContextOverflow(manager, mockAgent, new ContextWindowOverflowError('Context overflow'));
|
|
696
|
-
// Should keep last 2 messages
|
|
697
|
-
expect(mockAgent.messages).toHaveLength(2);
|
|
698
|
-
expect(mockAgent.messages[0].content[0]).toEqual({ type: 'textBlock', text: 'Message 2' });
|
|
699
|
-
expect(mockAgent.messages[1].content[0]).toEqual({ type: 'textBlock', text: 'Response 2' });
|
|
700
|
-
});
|
|
701
|
-
});
|
|
702
|
-
describe('reduceContext - tool pair validation', () => {
|
|
703
|
-
it('does not trim at index where oldest message is toolResult', async () => {
|
|
704
|
-
const manager = new SlidingWindowConversationManager({ windowSize: 2, shouldTruncateResults: false });
|
|
705
|
-
const messages = [
|
|
706
|
-
new Message({
|
|
707
|
-
role: 'assistant',
|
|
708
|
-
content: [new ToolUseBlock({ name: 'tool1', toolUseId: 'id-1', input: {} })],
|
|
709
|
-
}),
|
|
710
|
-
new Message({
|
|
711
|
-
role: 'user',
|
|
712
|
-
content: [
|
|
713
|
-
new ToolResultBlock({
|
|
714
|
-
toolUseId: 'id-1',
|
|
715
|
-
status: 'success',
|
|
716
|
-
content: [new TextBlock('Result')],
|
|
717
|
-
}),
|
|
718
|
-
],
|
|
719
|
-
}),
|
|
720
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response')] }),
|
|
721
|
-
new Message({ role: 'user', content: [new TextBlock('Message')] }),
|
|
722
|
-
];
|
|
723
|
-
const mockAgent = createMockAgent({ messages });
|
|
724
|
-
await triggerContextOverflow(manager, mockAgent, new ContextWindowOverflowError('Context overflow'));
|
|
725
|
-
// Skips index 1 (toolResult) and index 2 (assistant), trims at index 3 (user)
|
|
726
|
-
expect(mockAgent.messages).toHaveLength(1);
|
|
727
|
-
expect(mockAgent.messages[0].content[0]).toEqual({ type: 'textBlock', text: 'Message' });
|
|
728
|
-
});
|
|
729
|
-
it('does not trim at index where oldest message is toolUse without following toolResult', async () => {
|
|
730
|
-
const manager = new SlidingWindowConversationManager({ windowSize: 2, shouldTruncateResults: false });
|
|
731
|
-
const messages = [
|
|
732
|
-
new Message({ role: 'user', content: [new TextBlock('Message 1')] }),
|
|
733
|
-
new Message({
|
|
734
|
-
role: 'assistant',
|
|
735
|
-
content: [new ToolUseBlock({ name: 'tool1', toolUseId: 'id-1', input: {} })],
|
|
736
|
-
}),
|
|
737
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response')] }), // Not a toolResult
|
|
738
|
-
new Message({ role: 'user', content: [new TextBlock('Message 2')] }),
|
|
739
|
-
];
|
|
740
|
-
const mockAgent = createMockAgent({ messages });
|
|
741
|
-
await triggerContextOverflow(manager, mockAgent, new ContextWindowOverflowError('Context overflow'));
|
|
742
|
-
// Skips index 1 (toolUse without following toolResult), skips index 2 (assistant), trims at index 3 (user)
|
|
743
|
-
expect(mockAgent.messages).toHaveLength(1);
|
|
744
|
-
expect(mockAgent.messages[0].content[0]).toEqual({ type: 'textBlock', text: 'Message 2' });
|
|
745
|
-
});
|
|
746
|
-
it('allows trim when oldest message is toolUse with following toolResult', async () => {
|
|
747
|
-
const manager = new SlidingWindowConversationManager({ windowSize: 2, shouldTruncateResults: false });
|
|
748
|
-
const messages = [
|
|
749
|
-
new Message({ role: 'user', content: [new TextBlock('Message 1')] }),
|
|
750
|
-
new Message({
|
|
751
|
-
role: 'assistant',
|
|
752
|
-
content: [new ToolUseBlock({ name: 'tool1', toolUseId: 'id-1', input: {} })],
|
|
753
|
-
}),
|
|
754
|
-
new Message({
|
|
755
|
-
role: 'user',
|
|
756
|
-
content: [
|
|
757
|
-
new ToolResultBlock({
|
|
758
|
-
toolUseId: 'id-1',
|
|
759
|
-
status: 'success',
|
|
760
|
-
content: [new TextBlock('Result')],
|
|
761
|
-
}),
|
|
762
|
-
],
|
|
763
|
-
}),
|
|
764
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response')] }),
|
|
765
|
-
new Message({ role: 'user', content: [new TextBlock('Message 2')] }),
|
|
766
|
-
];
|
|
767
|
-
const mockAgent = createMockAgent({ messages });
|
|
768
|
-
await triggerContextOverflow(manager, mockAgent, new ContextWindowOverflowError('Context overflow'));
|
|
769
|
-
// trimIndex starts at 3 (5 - 2 = 3), which is assistant 'Response' — skipped (not user).
|
|
770
|
-
// trimIndex 4 is user 'Message 2' — valid.
|
|
771
|
-
expect(mockAgent.messages).toHaveLength(1);
|
|
772
|
-
expect(mockAgent.messages[0].content[0]).toEqual({ type: 'textBlock', text: 'Message 2' });
|
|
773
|
-
});
|
|
774
|
-
it('allows trim at toolUse when toolResult immediately follows', async () => {
|
|
775
|
-
const manager = new SlidingWindowConversationManager({ windowSize: 4, shouldTruncateResults: false });
|
|
776
|
-
const messages = [
|
|
777
|
-
new Message({ role: 'user', content: [new TextBlock('Message 1')] }),
|
|
778
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response 1')] }),
|
|
779
|
-
new Message({ role: 'user', content: [new TextBlock('Message 2')] }),
|
|
780
|
-
new Message({
|
|
781
|
-
role: 'assistant',
|
|
782
|
-
content: [new ToolUseBlock({ name: 'tool1', toolUseId: 'id-1', input: {} })],
|
|
783
|
-
}),
|
|
784
|
-
new Message({
|
|
785
|
-
role: 'user',
|
|
786
|
-
content: [
|
|
787
|
-
new ToolResultBlock({
|
|
788
|
-
toolUseId: 'id-1',
|
|
789
|
-
status: 'success',
|
|
790
|
-
content: [new TextBlock('Result')],
|
|
791
|
-
}),
|
|
792
|
-
],
|
|
793
|
-
}),
|
|
794
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response 2')] }),
|
|
795
|
-
];
|
|
796
|
-
const mockAgent = createMockAgent({ messages });
|
|
797
|
-
await triggerContextOverflow(manager, mockAgent, new ContextWindowOverflowError('Context overflow'));
|
|
798
|
-
// trimIndex starts at 2 (6 - 4 = 2), which is user 'Message 2' — valid trim point
|
|
799
|
-
expect(mockAgent.messages).toHaveLength(4);
|
|
800
|
-
expect(mockAgent.messages[0].content[0]).toEqual({ type: 'textBlock', text: 'Message 2' });
|
|
801
|
-
});
|
|
802
|
-
it('allows trim when oldest message is text or other non-tool content', async () => {
|
|
803
|
-
const manager = new SlidingWindowConversationManager({ windowSize: 2 });
|
|
804
|
-
const messages = [
|
|
805
|
-
new Message({ role: 'user', content: [new TextBlock('Message 1')] }),
|
|
806
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response 1')] }),
|
|
807
|
-
new Message({ role: 'user', content: [new TextBlock('Message 2')] }),
|
|
808
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response 2')] }),
|
|
809
|
-
];
|
|
810
|
-
const mockAgent = createMockAgent({ messages });
|
|
811
|
-
await triggerContextOverflow(manager, mockAgent, new ContextWindowOverflowError('Context overflow'));
|
|
812
|
-
// trimIndex starts at 2 (4 - 2 = 2), which is user 'Message 2' — valid
|
|
813
|
-
expect(mockAgent.messages).toHaveLength(2);
|
|
814
|
-
expect(mockAgent.messages[0].content[0]).toEqual({ type: 'textBlock', text: 'Message 2' });
|
|
815
|
-
});
|
|
816
|
-
it('skips assistant message to ensure trimmed conversation starts with user', async () => {
|
|
817
|
-
const manager = new SlidingWindowConversationManager({ windowSize: 8 });
|
|
818
|
-
const messages = Array.from({ length: 9 }, (_, i) => new Message({ role: i % 2 === 0 ? 'user' : 'assistant', content: [new TextBlock(`message ${i}`)] }));
|
|
819
|
-
const mockAgent = createMockAgent({ messages });
|
|
820
|
-
await triggerSlidingWindow(manager, mockAgent);
|
|
821
|
-
// Naive trim would leave assistant at index 1 as first message.
|
|
822
|
-
// Fix skips it so conversation starts with user at index 2.
|
|
823
|
-
expect(mockAgent.messages[0].role).toBe('user');
|
|
824
|
-
expect(mockAgent.messages[0].content[0]).toEqual({ type: 'textBlock', text: 'message 2' });
|
|
825
|
-
});
|
|
826
|
-
it('returns false when no valid trim point exists', async () => {
|
|
827
|
-
const manager = new SlidingWindowConversationManager({ windowSize: 1, shouldTruncateResults: false });
|
|
828
|
-
const messages = [
|
|
829
|
-
new Message({
|
|
830
|
-
role: 'user',
|
|
831
|
-
content: [
|
|
832
|
-
new ToolResultBlock({
|
|
833
|
-
toolUseId: 'id-1',
|
|
834
|
-
status: 'success',
|
|
835
|
-
content: [new TextBlock('Result')],
|
|
836
|
-
}),
|
|
837
|
-
],
|
|
838
|
-
}),
|
|
839
|
-
];
|
|
840
|
-
const result = manager.reduce({
|
|
841
|
-
agent: createMockAgent({ messages }),
|
|
842
|
-
model: {},
|
|
843
|
-
error: new ContextWindowOverflowError('Context overflow'),
|
|
844
|
-
});
|
|
845
|
-
expect(result).toBe(false);
|
|
846
|
-
});
|
|
847
|
-
it('propagates the original ContextWindowOverflowError when reduce cannot reduce further', async () => {
|
|
848
|
-
const manager = new SlidingWindowConversationManager({ windowSize: 1, shouldTruncateResults: false });
|
|
849
|
-
const messages = [
|
|
850
|
-
new Message({
|
|
851
|
-
role: 'user',
|
|
852
|
-
content: [
|
|
853
|
-
new ToolResultBlock({
|
|
854
|
-
toolUseId: 'id-1',
|
|
855
|
-
status: 'success',
|
|
856
|
-
content: [new TextBlock('Result')],
|
|
857
|
-
}),
|
|
858
|
-
],
|
|
859
|
-
}),
|
|
860
|
-
];
|
|
861
|
-
const mockAgent = createMockAgent({ messages });
|
|
862
|
-
const originalError = new ContextWindowOverflowError('Context overflow');
|
|
863
|
-
// The base class hook does not set event.retry when reduce returns false,
|
|
864
|
-
// so the original error propagates out of the hook chain
|
|
865
|
-
const event = new AfterModelCallEvent({
|
|
866
|
-
agent: mockAgent,
|
|
867
|
-
model: {},
|
|
868
|
-
attemptCount: 1,
|
|
869
|
-
error: originalError,
|
|
870
|
-
invocationState: {},
|
|
871
|
-
});
|
|
872
|
-
const pluginAgent = createMockAgent();
|
|
873
|
-
manager.initAgent(pluginAgent);
|
|
874
|
-
await invokeTrackedHook(pluginAgent, event);
|
|
875
|
-
expect(event.retry).toBeUndefined();
|
|
876
|
-
});
|
|
877
|
-
});
|
|
878
|
-
describe('helper methods', () => {
|
|
879
|
-
describe('findOldestMessageWithToolResults', () => {
|
|
880
|
-
it('returns correct index when tool results exist', () => {
|
|
881
|
-
const manager = new SlidingWindowConversationManager();
|
|
882
|
-
const messages = [
|
|
883
|
-
new Message({ role: 'user', content: [new TextBlock('Message 1')] }),
|
|
884
|
-
new Message({
|
|
885
|
-
role: 'user',
|
|
886
|
-
content: [
|
|
887
|
-
new ToolResultBlock({
|
|
888
|
-
toolUseId: 'id-1',
|
|
889
|
-
status: 'success',
|
|
890
|
-
content: [new TextBlock('Result 1')],
|
|
891
|
-
}),
|
|
892
|
-
],
|
|
893
|
-
}),
|
|
894
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response')] }),
|
|
895
|
-
];
|
|
896
|
-
const index = manager._findOldestMessageWithToolResults(messages);
|
|
897
|
-
expect(index).toBe(1);
|
|
898
|
-
});
|
|
899
|
-
it('returns undefined when no tool results exist', () => {
|
|
900
|
-
const manager = new SlidingWindowConversationManager();
|
|
901
|
-
const messages = [
|
|
902
|
-
new Message({ role: 'user', content: [new TextBlock('Message 1')] }),
|
|
903
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response 1')] }),
|
|
904
|
-
];
|
|
905
|
-
const index = manager._findOldestMessageWithToolResults(messages);
|
|
906
|
-
expect(index).toBeUndefined();
|
|
907
|
-
});
|
|
908
|
-
it('iterates forward from start', () => {
|
|
909
|
-
const manager = new SlidingWindowConversationManager();
|
|
910
|
-
const messages = [
|
|
911
|
-
new Message({
|
|
912
|
-
role: 'user',
|
|
913
|
-
content: [
|
|
914
|
-
new ToolResultBlock({
|
|
915
|
-
toolUseId: 'id-1',
|
|
916
|
-
status: 'success',
|
|
917
|
-
content: [new TextBlock('Result 1')],
|
|
918
|
-
}),
|
|
919
|
-
],
|
|
920
|
-
}),
|
|
921
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response')] }),
|
|
922
|
-
new Message({
|
|
923
|
-
role: 'user',
|
|
924
|
-
content: [
|
|
925
|
-
new ToolResultBlock({
|
|
926
|
-
toolUseId: 'id-2',
|
|
927
|
-
status: 'success',
|
|
928
|
-
content: [new TextBlock('Result 2')],
|
|
929
|
-
}),
|
|
930
|
-
],
|
|
931
|
-
}),
|
|
932
|
-
];
|
|
933
|
-
const index = manager._findOldestMessageWithToolResults(messages);
|
|
934
|
-
// Should find the first one (index 0), not the last (index 2)
|
|
935
|
-
expect(index).toBe(0);
|
|
936
|
-
});
|
|
937
|
-
});
|
|
938
|
-
describe('truncateToolResults', () => {
|
|
939
|
-
it('returns true when changes are made', () => {
|
|
940
|
-
const manager = new SlidingWindowConversationManager();
|
|
941
|
-
const messages = [
|
|
942
|
-
new Message({
|
|
943
|
-
role: 'user',
|
|
944
|
-
content: [
|
|
945
|
-
new ToolResultBlock({
|
|
946
|
-
toolUseId: 'id-1',
|
|
947
|
-
status: 'success',
|
|
948
|
-
content: [new TextBlock('x'.repeat(500))],
|
|
949
|
-
}),
|
|
950
|
-
],
|
|
951
|
-
}),
|
|
952
|
-
];
|
|
953
|
-
const result = manager._truncateToolResults(messages, 0);
|
|
954
|
-
expect(result).toBe(true);
|
|
955
|
-
});
|
|
956
|
-
it('returns false when already truncated', () => {
|
|
957
|
-
const manager = new SlidingWindowConversationManager();
|
|
958
|
-
const alreadyTruncated = 'A'.repeat(200) + '\n<truncated chars="1000"/>\n' + 'B'.repeat(200);
|
|
959
|
-
const messages = [
|
|
960
|
-
new Message({
|
|
961
|
-
role: 'user',
|
|
962
|
-
content: [
|
|
963
|
-
new ToolResultBlock({
|
|
964
|
-
toolUseId: 'id-1',
|
|
965
|
-
status: 'success',
|
|
966
|
-
content: [new TextBlock(alreadyTruncated)],
|
|
967
|
-
}),
|
|
968
|
-
],
|
|
969
|
-
}),
|
|
970
|
-
];
|
|
971
|
-
const result = manager._truncateToolResults(messages, 0);
|
|
972
|
-
expect(result).toBe(false);
|
|
973
|
-
});
|
|
974
|
-
it('returns false when no tool results found', () => {
|
|
975
|
-
const manager = new SlidingWindowConversationManager();
|
|
976
|
-
const messages = [new Message({ role: 'user', content: [new TextBlock('Message')] })];
|
|
977
|
-
const result = manager._truncateToolResults(messages, 0);
|
|
978
|
-
expect(result).toBe(false);
|
|
979
|
-
});
|
|
980
|
-
});
|
|
981
|
-
});
|
|
982
|
-
describe('reduceOnThreshold', () => {
|
|
983
|
-
it('trims oldest messages when compressionThreshold is exceeded', async () => {
|
|
984
|
-
const manager = new SlidingWindowConversationManager({
|
|
985
|
-
windowSize: 4,
|
|
986
|
-
proactiveCompression: { compressionThreshold: 0.7 },
|
|
987
|
-
});
|
|
988
|
-
const messages = [
|
|
989
|
-
new Message({ role: 'user', content: [new TextBlock('Message 1')] }),
|
|
990
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response 1')] }),
|
|
991
|
-
new Message({ role: 'user', content: [new TextBlock('Message 2')] }),
|
|
992
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response 2')] }),
|
|
993
|
-
new Message({ role: 'user', content: [new TextBlock('Message 3')] }),
|
|
994
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response 3')] }),
|
|
995
|
-
];
|
|
996
|
-
const mockModel = { getConfig: () => ({ contextWindowLimit: 1000 }) };
|
|
997
|
-
const mockAgent = createMockAgent({ messages });
|
|
998
|
-
manager.initAgent(mockAgent);
|
|
999
|
-
const event = new BeforeModelCallEvent({
|
|
1000
|
-
agent: mockAgent,
|
|
1001
|
-
model: mockModel,
|
|
1002
|
-
invocationState: {},
|
|
1003
|
-
projectedInputTokens: 800,
|
|
1004
|
-
});
|
|
1005
|
-
await invokeTrackedHook(mockAgent, event);
|
|
1006
|
-
expect(mockAgent.messages.length).toBe(4);
|
|
1007
|
-
});
|
|
1008
|
-
it('does not trim when below compressionThreshold', async () => {
|
|
1009
|
-
const manager = new SlidingWindowConversationManager({
|
|
1010
|
-
windowSize: 4,
|
|
1011
|
-
proactiveCompression: { compressionThreshold: 0.7 },
|
|
1012
|
-
});
|
|
1013
|
-
const messages = [
|
|
1014
|
-
new Message({ role: 'user', content: [new TextBlock('Message 1')] }),
|
|
1015
|
-
new Message({ role: 'assistant', content: [new TextBlock('Response 1')] }),
|
|
1016
|
-
];
|
|
1017
|
-
const mockModel = { getConfig: () => ({ contextWindowLimit: 1000 }) };
|
|
1018
|
-
const mockAgent = createMockAgent({ messages });
|
|
1019
|
-
manager.initAgent(mockAgent);
|
|
1020
|
-
const event = new BeforeModelCallEvent({
|
|
1021
|
-
agent: mockAgent,
|
|
1022
|
-
model: mockModel,
|
|
1023
|
-
invocationState: {},
|
|
1024
|
-
projectedInputTokens: 500,
|
|
1025
|
-
});
|
|
1026
|
-
await invokeTrackedHook(mockAgent, event);
|
|
1027
|
-
expect(mockAgent.messages).toHaveLength(2);
|
|
1028
|
-
});
|
|
1029
|
-
});
|
|
1030
|
-
describe('pinFirst', () => {
|
|
1031
|
-
it('protects first N messages from trimming', async () => {
|
|
1032
|
-
// windowSize 2 on 6 messages: trimIndex = 4, but first 2 are pinned
|
|
1033
|
-
const manager = new SlidingWindowConversationManager({ windowSize: 2, pinFirst: 2 });
|
|
1034
|
-
const mockAgent = createMockAgent({
|
|
1035
|
-
messages: [
|
|
1036
|
-
new Message({ role: 'user', content: [new TextBlock('first')] }),
|
|
1037
|
-
new Message({ role: 'assistant', content: [new TextBlock('second')] }),
|
|
1038
|
-
new Message({ role: 'user', content: [new TextBlock('third')] }),
|
|
1039
|
-
new Message({ role: 'assistant', content: [new TextBlock('fourth')] }),
|
|
1040
|
-
new Message({ role: 'user', content: [new TextBlock('fifth')] }),
|
|
1041
|
-
new Message({ role: 'assistant', content: [new TextBlock('sixth')] }),
|
|
1042
|
-
],
|
|
1043
|
-
});
|
|
1044
|
-
await triggerSlidingWindow(manager, mockAgent);
|
|
1045
|
-
const texts = mockAgent.messages.map((m) => m.content[0].text);
|
|
1046
|
-
expect(texts).toEqual(['first', 'second', 'fifth', 'sixth']);
|
|
1047
|
-
});
|
|
1048
|
-
it('returns false when all messages in trim range are protected', () => {
|
|
1049
|
-
const manager = new SlidingWindowConversationManager({ windowSize: 2, pinFirst: 4 });
|
|
1050
|
-
const mockAgent = createMockAgent({
|
|
1051
|
-
messages: [
|
|
1052
|
-
new Message({ role: 'user', content: [new TextBlock('a')] }),
|
|
1053
|
-
new Message({ role: 'assistant', content: [new TextBlock('b')] }),
|
|
1054
|
-
new Message({ role: 'user', content: [new TextBlock('c')] }),
|
|
1055
|
-
new Message({ role: 'assistant', content: [new TextBlock('d')] }),
|
|
1056
|
-
],
|
|
1057
|
-
});
|
|
1058
|
-
const result = manager.reduce({ agent: mockAgent, model: {} });
|
|
1059
|
-
expect(result).toBe(false);
|
|
1060
|
-
});
|
|
1061
|
-
it('pinned message in middle of window survives trimming', async () => {
|
|
1062
|
-
const { pinMessage } = await import('../compression/pin-message.js');
|
|
1063
|
-
const messages = [
|
|
1064
|
-
new Message({ role: 'user', content: [new TextBlock('first')] }),
|
|
1065
|
-
new Message({ role: 'assistant', content: [new TextBlock('second')] }),
|
|
1066
|
-
new Message({ role: 'user', content: [new TextBlock('pinned-middle')] }),
|
|
1067
|
-
new Message({ role: 'assistant', content: [new TextBlock('fourth')] }),
|
|
1068
|
-
new Message({ role: 'user', content: [new TextBlock('fifth')] }),
|
|
1069
|
-
new Message({ role: 'assistant', content: [new TextBlock('sixth')] }),
|
|
1070
|
-
];
|
|
1071
|
-
pinMessage(messages, 2);
|
|
1072
|
-
const manager = new SlidingWindowConversationManager({ windowSize: 4 });
|
|
1073
|
-
const mockAgent = createMockAgent({ messages });
|
|
1074
|
-
await triggerSlidingWindow(manager, mockAgent);
|
|
1075
|
-
const texts = mockAgent.messages.map((m) => m.content[0].text);
|
|
1076
|
-
expect(texts).toEqual(['pinned-middle', 'fourth', 'fifth', 'sixth']);
|
|
1077
|
-
});
|
|
1078
|
-
});
|
|
1079
|
-
});
|
|
1080
|
-
//# sourceMappingURL=sliding-window-conversation-manager.test.js.map
|