@strands-agents/sdk 1.4.0 → 1.6.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/README.md +11 -11
- package/dist/src/__fixtures__/agent-helpers.d.ts.map +1 -1
- package/dist/src/__fixtures__/agent-helpers.js +9 -0
- package/dist/src/__fixtures__/agent-helpers.js.map +1 -1
- package/dist/src/__fixtures__/register-node-defaults.d.ts +2 -0
- package/dist/src/__fixtures__/register-node-defaults.d.ts.map +1 -0
- package/dist/src/__fixtures__/register-node-defaults.js +6 -0
- package/dist/src/__fixtures__/register-node-defaults.js.map +1 -0
- package/dist/src/__fixtures__/test-sandbox.node.d.ts.map +1 -1
- package/dist/src/__fixtures__/test-sandbox.node.js +4 -3
- package/dist/src/__fixtures__/test-sandbox.node.js.map +1 -1
- package/dist/src/__tests__/default-slot.test.d.ts +2 -0
- package/dist/src/__tests__/default-slot.test.d.ts.map +1 -0
- package/dist/src/__tests__/default-slot.test.js +33 -0
- package/dist/src/__tests__/default-slot.test.js.map +1 -0
- package/dist/src/a2a/__tests__/async-lock.test.d.ts +2 -0
- package/dist/src/a2a/__tests__/async-lock.test.d.ts.map +1 -0
- package/dist/src/a2a/__tests__/async-lock.test.js +137 -0
- package/dist/src/a2a/__tests__/async-lock.test.js.map +1 -0
- package/dist/src/a2a/__tests__/executor.test.js +146 -8
- package/dist/src/a2a/__tests__/executor.test.js.map +1 -1
- package/dist/src/a2a/__tests__/server.test.js +20 -0
- package/dist/src/a2a/__tests__/server.test.js.map +1 -1
- package/dist/src/a2a/async-lock.d.ts +22 -0
- package/dist/src/a2a/async-lock.d.ts.map +1 -0
- package/dist/src/a2a/async-lock.js +38 -0
- package/dist/src/a2a/async-lock.js.map +1 -0
- package/dist/src/a2a/executor.d.ts +59 -24
- package/dist/src/a2a/executor.d.ts.map +1 -1
- package/dist/src/a2a/executor.js +209 -32
- package/dist/src/a2a/executor.js.map +1 -1
- package/dist/src/a2a/index.d.ts +1 -1
- package/dist/src/a2a/index.d.ts.map +1 -1
- package/dist/src/a2a/index.js +1 -1
- package/dist/src/a2a/index.js.map +1 -1
- package/dist/src/a2a/server.d.ts +18 -2
- package/dist/src/a2a/server.d.ts.map +1 -1
- package/dist/src/a2a/server.js +13 -2
- package/dist/src/a2a/server.js.map +1 -1
- package/dist/src/agent/__tests__/agent.context-manager.test.d.ts +2 -0
- package/dist/src/agent/__tests__/agent.context-manager.test.d.ts.map +1 -0
- package/dist/src/agent/__tests__/agent.context-manager.test.js +107 -0
- package/dist/src/agent/__tests__/agent.context-manager.test.js.map +1 -0
- package/dist/src/agent/__tests__/agent.stateful-model.test.js +2 -2
- package/dist/src/agent/__tests__/agent.stateful-model.test.js.map +1 -1
- package/dist/src/agent/__tests__/agent.tracer.test.node.js +14 -0
- package/dist/src/agent/__tests__/agent.tracer.test.node.js.map +1 -1
- package/dist/src/agent/agent.d.ts +135 -2
- package/dist/src/agent/agent.d.ts.map +1 -1
- package/dist/src/agent/agent.js +506 -189
- package/dist/src/agent/agent.js.map +1 -1
- package/dist/src/context-manager/modes/agentic/agentic-context.d.ts +19 -0
- package/dist/src/context-manager/modes/agentic/agentic-context.d.ts.map +1 -0
- package/dist/src/context-manager/modes/agentic/agentic-context.js +245 -0
- package/dist/src/context-manager/modes/agentic/agentic-context.js.map +1 -0
- package/dist/src/conversation-manager/__tests__/agentic-context.test.d.ts +2 -0
- package/dist/src/conversation-manager/__tests__/agentic-context.test.d.ts.map +1 -0
- package/dist/src/conversation-manager/__tests__/agentic-context.test.js +332 -0
- package/dist/src/conversation-manager/__tests__/agentic-context.test.js.map +1 -0
- package/dist/src/conversation-manager/__tests__/context-compression.test.d.ts +2 -0
- package/dist/src/conversation-manager/__tests__/context-compression.test.d.ts.map +1 -0
- package/dist/src/conversation-manager/__tests__/context-compression.test.js +176 -0
- package/dist/src/conversation-manager/__tests__/context-compression.test.js.map +1 -0
- package/dist/src/conversation-manager/__tests__/pin.test.d.ts +2 -0
- package/dist/src/conversation-manager/__tests__/pin.test.d.ts.map +1 -0
- package/dist/src/conversation-manager/__tests__/pin.test.js +119 -0
- package/dist/src/conversation-manager/__tests__/pin.test.js.map +1 -0
- package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js +49 -0
- package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js.map +1 -1
- package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js +58 -0
- package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js.map +1 -1
- package/dist/src/conversation-manager/__tests__/token-usage-middleware.test.d.ts +2 -0
- package/dist/src/conversation-manager/__tests__/token-usage-middleware.test.d.ts.map +1 -0
- package/dist/src/conversation-manager/__tests__/token-usage-middleware.test.js +138 -0
- package/dist/src/conversation-manager/__tests__/token-usage-middleware.test.js.map +1 -0
- package/dist/src/conversation-manager/compression/context-compression.d.ts +39 -0
- package/dist/src/conversation-manager/compression/context-compression.d.ts.map +1 -0
- package/dist/src/conversation-manager/compression/context-compression.js +150 -0
- package/dist/src/conversation-manager/compression/context-compression.js.map +1 -0
- package/dist/src/conversation-manager/compression/pin-message.d.ts +45 -0
- package/dist/src/conversation-manager/compression/pin-message.d.ts.map +1 -0
- package/dist/src/conversation-manager/compression/pin-message.js +106 -0
- package/dist/src/conversation-manager/compression/pin-message.js.map +1 -0
- package/dist/src/conversation-manager/conversation-manager.d.ts +2 -0
- package/dist/src/conversation-manager/conversation-manager.d.ts.map +1 -1
- package/dist/src/conversation-manager/conversation-manager.js +2 -2
- package/dist/src/conversation-manager/conversation-manager.js.map +1 -1
- package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts +7 -0
- package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts.map +1 -1
- package/dist/src/conversation-manager/sliding-window-conversation-manager.js +30 -38
- package/dist/src/conversation-manager/sliding-window-conversation-manager.js.map +1 -1
- package/dist/src/conversation-manager/summarizing-conversation-manager.d.ts +7 -19
- package/dist/src/conversation-manager/summarizing-conversation-manager.d.ts.map +1 -1
- package/dist/src/conversation-manager/summarizing-conversation-manager.js +20 -109
- package/dist/src/conversation-manager/summarizing-conversation-manager.js.map +1 -1
- package/dist/src/default-slot.d.ts +6 -0
- package/dist/src/default-slot.d.ts.map +1 -0
- package/dist/src/default-slot.js +18 -0
- package/dist/src/default-slot.js.map +1 -0
- package/dist/src/errors.d.ts +8 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +11 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +8 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/index.node.d.ts +2 -0
- package/dist/src/index.node.d.ts.map +1 -0
- package/dist/src/index.node.js +9 -0
- package/dist/src/index.node.js.map +1 -0
- package/dist/src/injection/__tests__/message-injection.test.d.ts +2 -0
- package/dist/src/injection/__tests__/message-injection.test.d.ts.map +1 -0
- package/dist/src/injection/__tests__/message-injection.test.js +200 -0
- package/dist/src/injection/__tests__/message-injection.test.js.map +1 -0
- package/dist/src/injection/index.d.ts +6 -0
- package/dist/src/injection/index.d.ts.map +1 -0
- package/dist/src/injection/index.js +2 -0
- package/dist/src/injection/index.js.map +1 -0
- package/dist/src/injection/message-injection.d.ts +65 -0
- package/dist/src/injection/message-injection.d.ts.map +1 -0
- package/dist/src/injection/message-injection.js +134 -0
- package/dist/src/injection/message-injection.js.map +1 -0
- package/dist/src/injection/types.d.ts +63 -0
- package/dist/src/injection/types.d.ts.map +1 -0
- package/dist/src/injection/types.js +2 -0
- package/dist/src/injection/types.js.map +1 -0
- package/dist/src/injection/xml.d.ts +27 -0
- package/dist/src/injection/xml.d.ts.map +1 -0
- package/dist/src/injection/xml.js +31 -0
- package/dist/src/injection/xml.js.map +1 -0
- package/dist/src/interrupt.d.ts +5 -1
- package/dist/src/interrupt.d.ts.map +1 -1
- package/dist/src/interrupt.js +6 -0
- package/dist/src/interrupt.js.map +1 -1
- package/dist/src/memory/__tests__/memory-manager.test.d.ts +2 -0
- package/dist/src/memory/__tests__/memory-manager.test.d.ts.map +1 -0
- package/dist/src/memory/__tests__/memory-manager.test.js +679 -0
- package/dist/src/memory/__tests__/memory-manager.test.js.map +1 -0
- package/dist/src/memory/extraction/__tests__/extraction.test.d.ts +2 -0
- package/dist/src/memory/extraction/__tests__/extraction.test.d.ts.map +1 -0
- package/dist/src/memory/extraction/__tests__/extraction.test.js +637 -0
- package/dist/src/memory/extraction/__tests__/extraction.test.js.map +1 -0
- package/dist/src/memory/extraction/__tests__/model-extractor.test.d.ts +2 -0
- package/dist/src/memory/extraction/__tests__/model-extractor.test.d.ts.map +1 -0
- package/dist/src/memory/extraction/__tests__/model-extractor.test.js +68 -0
- package/dist/src/memory/extraction/__tests__/model-extractor.test.js.map +1 -0
- package/dist/src/memory/extraction/__tests__/resolve-extraction-config.test.d.ts +2 -0
- package/dist/src/memory/extraction/__tests__/resolve-extraction-config.test.d.ts.map +1 -0
- package/dist/src/memory/extraction/__tests__/resolve-extraction-config.test.js +81 -0
- package/dist/src/memory/extraction/__tests__/resolve-extraction-config.test.js.map +1 -0
- package/dist/src/memory/extraction/coordinator.d.ts +128 -0
- package/dist/src/memory/extraction/coordinator.d.ts.map +1 -0
- package/dist/src/memory/extraction/coordinator.js +245 -0
- package/dist/src/memory/extraction/coordinator.js.map +1 -0
- package/dist/src/memory/extraction/model-extractor.d.ts +32 -0
- package/dist/src/memory/extraction/model-extractor.d.ts.map +1 -0
- package/dist/src/memory/extraction/model-extractor.js +118 -0
- package/dist/src/memory/extraction/model-extractor.js.map +1 -0
- package/dist/src/memory/extraction/resolve-extraction-config.d.ts +46 -0
- package/dist/src/memory/extraction/resolve-extraction-config.d.ts.map +1 -0
- package/dist/src/memory/extraction/resolve-extraction-config.js +59 -0
- package/dist/src/memory/extraction/resolve-extraction-config.js.map +1 -0
- package/dist/src/memory/extraction/triggers.d.ts +41 -0
- package/dist/src/memory/extraction/triggers.d.ts.map +1 -0
- package/dist/src/memory/extraction/triggers.js +59 -0
- package/dist/src/memory/extraction/triggers.js.map +1 -0
- package/dist/src/memory/extraction/types.d.ts +133 -0
- package/dist/src/memory/extraction/types.d.ts.map +1 -0
- package/dist/src/memory/extraction/types.js +19 -0
- package/dist/src/memory/extraction/types.js.map +1 -0
- package/dist/src/memory/index.d.ts +10 -0
- package/dist/src/memory/index.d.ts.map +1 -0
- package/dist/src/memory/index.js +5 -0
- package/dist/src/memory/index.js.map +1 -0
- package/dist/src/memory/memory-manager.d.ts +178 -0
- package/dist/src/memory/memory-manager.d.ts.map +1 -0
- package/dist/src/memory/memory-manager.js +526 -0
- package/dist/src/memory/memory-manager.js.map +1 -0
- package/dist/src/memory/types.d.ts +278 -0
- package/dist/src/memory/types.d.ts.map +1 -0
- package/dist/src/memory/types.js +2 -0
- package/dist/src/memory/types.js.map +1 -0
- package/dist/src/middleware/__tests__/agent-middleware.test.d.ts +2 -0
- package/dist/src/middleware/__tests__/agent-middleware.test.d.ts.map +1 -0
- package/dist/src/middleware/__tests__/agent-middleware.test.js +1206 -0
- package/dist/src/middleware/__tests__/agent-middleware.test.js.map +1 -0
- package/dist/src/middleware/__tests__/copy-on-input.test.d.ts +2 -0
- package/dist/src/middleware/__tests__/copy-on-input.test.d.ts.map +1 -0
- package/dist/src/middleware/__tests__/copy-on-input.test.js +379 -0
- package/dist/src/middleware/__tests__/copy-on-input.test.js.map +1 -0
- package/dist/src/middleware/__tests__/custom-stages.test.d.ts +2 -0
- package/dist/src/middleware/__tests__/custom-stages.test.d.ts.map +1 -0
- package/dist/src/middleware/__tests__/custom-stages.test.js +97 -0
- package/dist/src/middleware/__tests__/custom-stages.test.js.map +1 -0
- package/dist/src/middleware/__tests__/middleware-interrupts.test.d.ts +2 -0
- package/dist/src/middleware/__tests__/middleware-interrupts.test.d.ts.map +1 -0
- package/dist/src/middleware/__tests__/middleware-interrupts.test.js +267 -0
- package/dist/src/middleware/__tests__/middleware-interrupts.test.js.map +1 -0
- package/dist/src/middleware/__tests__/registry.test.d.ts +2 -0
- package/dist/src/middleware/__tests__/registry.test.d.ts.map +1 -0
- package/dist/src/middleware/__tests__/registry.test.js +525 -0
- package/dist/src/middleware/__tests__/registry.test.js.map +1 -0
- package/dist/src/middleware/index.d.ts +5 -0
- package/dist/src/middleware/index.d.ts.map +1 -0
- package/dist/src/middleware/index.js +3 -0
- package/dist/src/middleware/index.js.map +1 -0
- package/dist/src/middleware/registry.d.ts +58 -0
- package/dist/src/middleware/registry.d.ts.map +1 -0
- package/dist/src/middleware/registry.js +107 -0
- package/dist/src/middleware/registry.js.map +1 -0
- package/dist/src/middleware/stages.d.ts +145 -0
- package/dist/src/middleware/stages.d.ts.map +1 -0
- package/dist/src/middleware/stages.js +34 -0
- package/dist/src/middleware/stages.js.map +1 -0
- package/dist/src/middleware/types.d.ts +88 -0
- package/dist/src/middleware/types.d.ts.map +1 -0
- package/dist/src/middleware/types.js +2 -0
- package/dist/src/middleware/types.js.map +1 -0
- package/dist/src/models/__tests__/anthropic.test.js +16 -1
- package/dist/src/models/__tests__/anthropic.test.js.map +1 -1
- package/dist/src/models/__tests__/bedrock.test.js +39 -0
- package/dist/src/models/__tests__/bedrock.test.js.map +1 -1
- package/dist/src/models/__tests__/model.test.js +46 -3
- package/dist/src/models/__tests__/model.test.js.map +1 -1
- package/dist/src/models/anthropic.js +2 -2
- package/dist/src/models/anthropic.js.map +1 -1
- package/dist/src/models/bedrock.d.ts.map +1 -1
- package/dist/src/models/bedrock.js +12 -5
- package/dist/src/models/bedrock.js.map +1 -1
- package/dist/src/models/defaults.d.ts.map +1 -1
- package/dist/src/models/defaults.js +2 -0
- package/dist/src/models/defaults.js.map +1 -1
- package/dist/src/models/model.d.ts.map +1 -1
- package/dist/src/models/model.js +7 -3
- package/dist/src/models/model.js.map +1 -1
- package/dist/src/models/openai/__tests__/responses.test.js +8 -14
- package/dist/src/models/openai/__tests__/responses.test.js.map +1 -1
- package/dist/src/sandbox/__tests__/default.test.browser.d.ts +2 -0
- package/dist/src/sandbox/__tests__/default.test.browser.d.ts.map +1 -0
- package/dist/src/sandbox/__tests__/default.test.browser.js +11 -0
- package/dist/src/sandbox/__tests__/default.test.browser.js.map +1 -0
- package/dist/src/sandbox/__tests__/default.test.node.d.ts +2 -0
- package/dist/src/sandbox/__tests__/default.test.node.d.ts.map +1 -0
- package/dist/src/sandbox/__tests__/default.test.node.js +23 -0
- package/dist/src/sandbox/__tests__/default.test.node.js.map +1 -0
- package/dist/src/sandbox/__tests__/docker.test.node.d.ts +2 -0
- package/dist/src/sandbox/__tests__/docker.test.node.d.ts.map +1 -0
- package/dist/src/sandbox/__tests__/docker.test.node.js +89 -0
- package/dist/src/sandbox/__tests__/docker.test.node.js.map +1 -0
- package/dist/src/sandbox/__tests__/errors.test.node.d.ts +2 -0
- package/dist/src/sandbox/__tests__/errors.test.node.d.ts.map +1 -0
- package/dist/src/sandbox/__tests__/errors.test.node.js +33 -0
- package/dist/src/sandbox/__tests__/errors.test.node.js.map +1 -0
- package/dist/src/sandbox/__tests__/not-a-sandbox-local-environment.test.node.d.ts +2 -0
- package/dist/src/sandbox/__tests__/not-a-sandbox-local-environment.test.node.d.ts.map +1 -0
- package/dist/src/sandbox/__tests__/not-a-sandbox-local-environment.test.node.js +124 -0
- package/dist/src/sandbox/__tests__/not-a-sandbox-local-environment.test.node.js.map +1 -0
- package/dist/src/sandbox/__tests__/posix-shell.test.node.js +50 -4
- package/dist/src/sandbox/__tests__/posix-shell.test.node.js.map +1 -1
- package/dist/src/sandbox/__tests__/ssh.test.node.d.ts +2 -0
- package/dist/src/sandbox/__tests__/ssh.test.node.d.ts.map +1 -0
- package/dist/src/sandbox/__tests__/ssh.test.node.js +262 -0
- package/dist/src/sandbox/__tests__/ssh.test.node.js.map +1 -0
- package/dist/src/sandbox/base.d.ts +17 -4
- package/dist/src/sandbox/base.d.ts.map +1 -1
- package/dist/src/sandbox/base.js +10 -2
- package/dist/src/sandbox/base.js.map +1 -1
- package/dist/src/sandbox/constants.d.ts +18 -0
- package/dist/src/sandbox/constants.d.ts.map +1 -1
- package/dist/src/sandbox/constants.js +20 -0
- package/dist/src/sandbox/constants.js.map +1 -1
- package/dist/src/sandbox/default.d.ts +3 -0
- package/dist/src/sandbox/default.d.ts.map +1 -0
- package/dist/src/sandbox/default.js +3 -0
- package/dist/src/sandbox/default.js.map +1 -0
- package/dist/src/sandbox/docker.d.ts +38 -0
- package/dist/src/sandbox/docker.d.ts.map +1 -0
- package/dist/src/sandbox/docker.js +61 -0
- package/dist/src/sandbox/docker.js.map +1 -0
- package/dist/src/sandbox/errors.d.ts +26 -0
- package/dist/src/sandbox/errors.d.ts.map +1 -0
- package/dist/src/sandbox/errors.js +35 -0
- package/dist/src/sandbox/errors.js.map +1 -0
- package/dist/src/sandbox/index.d.ts +5 -0
- package/dist/src/sandbox/index.d.ts.map +1 -0
- package/dist/src/sandbox/index.js +4 -0
- package/dist/src/sandbox/index.js.map +1 -0
- package/dist/src/sandbox/not-a-sandbox-local-environment.d.ts +16 -0
- package/dist/src/sandbox/not-a-sandbox-local-environment.d.ts.map +1 -0
- package/dist/src/sandbox/not-a-sandbox-local-environment.js +83 -0
- package/dist/src/sandbox/not-a-sandbox-local-environment.js.map +1 -0
- package/dist/src/sandbox/posix-shell.d.ts +21 -0
- package/dist/src/sandbox/posix-shell.d.ts.map +1 -1
- package/dist/src/sandbox/posix-shell.js +41 -3
- package/dist/src/sandbox/posix-shell.js.map +1 -1
- package/dist/src/sandbox/ssh.d.ts +56 -0
- package/dist/src/sandbox/ssh.d.ts.map +1 -0
- package/dist/src/sandbox/ssh.js +121 -0
- package/dist/src/sandbox/ssh.js.map +1 -0
- package/dist/src/sandbox/stream-process.d.ts.map +1 -1
- package/dist/src/sandbox/stream-process.js +3 -2
- package/dist/src/sandbox/stream-process.js.map +1 -1
- package/dist/src/tsconfig.tsbuildinfo +1 -1
- package/dist/src/types/agent.d.ts +21 -0
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/agent.js.map +1 -1
- package/dist/src/types/messages.d.ts +9 -1
- package/dist/src/types/messages.d.ts.map +1 -1
- package/dist/src/types/messages.js +13 -1
- package/dist/src/types/messages.js.map +1 -1
- package/dist/src/vended-interventions/cedar/__tests__/cedar.test.node.d.ts +2 -0
- package/dist/src/vended-interventions/cedar/__tests__/cedar.test.node.d.ts.map +1 -0
- package/dist/src/vended-interventions/cedar/__tests__/cedar.test.node.js +675 -0
- package/dist/src/vended-interventions/cedar/__tests__/cedar.test.node.js.map +1 -0
- package/dist/src/vended-interventions/cedar/cedar.d.ts +102 -0
- package/dist/src/vended-interventions/cedar/cedar.d.ts.map +1 -0
- package/dist/src/vended-interventions/cedar/cedar.js +228 -0
- package/dist/src/vended-interventions/cedar/cedar.js.map +1 -0
- package/dist/src/vended-interventions/cedar/index.d.ts +3 -0
- package/dist/src/vended-interventions/cedar/index.d.ts.map +1 -0
- package/dist/src/vended-interventions/cedar/index.js +2 -0
- package/dist/src/vended-interventions/cedar/index.js.map +1 -0
- package/dist/src/vended-interventions/cedar/schema-generator.d.ts +10 -0
- package/dist/src/vended-interventions/cedar/schema-generator.d.ts.map +1 -0
- package/dist/src/vended-interventions/cedar/schema-generator.js +33 -0
- package/dist/src/vended-interventions/cedar/schema-generator.js.map +1 -0
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.d.ts +2 -0
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.d.ts.map +1 -0
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.js +611 -0
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.js.map +1 -0
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/index.d.ts +2 -0
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/index.d.ts.map +1 -0
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/index.js +2 -0
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/index.js.map +1 -0
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/store.d.ts +230 -0
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/store.d.ts.map +1 -0
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/store.js +370 -0
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/store.js.map +1 -0
- package/dist/src/vended-plugins/context-injector/__tests__/plugin.test.d.ts +2 -0
- package/dist/src/vended-plugins/context-injector/__tests__/plugin.test.d.ts.map +1 -0
- package/dist/src/vended-plugins/context-injector/__tests__/plugin.test.js +96 -0
- package/dist/src/vended-plugins/context-injector/__tests__/plugin.test.js.map +1 -0
- package/dist/src/vended-plugins/context-injector/index.d.ts +25 -0
- package/dist/src/vended-plugins/context-injector/index.d.ts.map +1 -0
- package/dist/src/vended-plugins/context-injector/index.js +23 -0
- package/dist/src/vended-plugins/context-injector/index.js.map +1 -0
- package/dist/src/vended-plugins/context-injector/plugin.d.ts +55 -0
- package/dist/src/vended-plugins/context-injector/plugin.d.ts.map +1 -0
- package/dist/src/vended-plugins/context-injector/plugin.js +41 -0
- package/dist/src/vended-plugins/context-injector/plugin.js.map +1 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/file-storage-sandbox.test.node.d.ts +2 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/file-storage-sandbox.test.node.d.ts.map +1 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/file-storage-sandbox.test.node.js +68 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/file-storage-sandbox.test.node.js.map +1 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js +43 -4
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js.map +1 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.node.d.ts +2 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.node.d.ts.map +1 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.node.js +93 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.node.js.map +1 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.js +68 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.js.map +1 -1
- package/dist/src/vended-plugins/context-offloader/index.d.ts +1 -1
- package/dist/src/vended-plugins/context-offloader/index.d.ts.map +1 -1
- package/dist/src/vended-plugins/context-offloader/plugin.d.ts +4 -1
- package/dist/src/vended-plugins/context-offloader/plugin.d.ts.map +1 -1
- package/dist/src/vended-plugins/context-offloader/plugin.js +40 -8
- package/dist/src/vended-plugins/context-offloader/plugin.js.map +1 -1
- package/dist/src/vended-plugins/context-offloader/search.d.ts.map +1 -1
- package/dist/src/vended-plugins/context-offloader/search.js +3 -5
- package/dist/src/vended-plugins/context-offloader/search.js.map +1 -1
- package/dist/src/vended-plugins/context-offloader/storage.d.ts +58 -6
- package/dist/src/vended-plugins/context-offloader/storage.d.ts.map +1 -1
- package/dist/src/vended-plugins/context-offloader/storage.js +136 -14
- package/dist/src/vended-plugins/context-offloader/storage.js.map +1 -1
- package/dist/src/vended-plugins/goal/__tests__/plugin.test.d.ts +2 -0
- package/dist/src/vended-plugins/goal/__tests__/plugin.test.d.ts.map +1 -0
- package/dist/src/vended-plugins/goal/__tests__/plugin.test.js +736 -0
- package/dist/src/vended-plugins/goal/__tests__/plugin.test.js.map +1 -0
- package/dist/src/vended-plugins/goal/index.d.ts +21 -0
- package/dist/src/vended-plugins/goal/index.d.ts.map +1 -0
- package/dist/src/vended-plugins/goal/index.js +20 -0
- package/dist/src/vended-plugins/goal/index.js.map +1 -0
- package/dist/src/vended-plugins/goal/judge.d.ts +41 -0
- package/dist/src/vended-plugins/goal/judge.d.ts.map +1 -0
- package/dist/src/vended-plugins/goal/judge.js +92 -0
- package/dist/src/vended-plugins/goal/judge.js.map +1 -0
- package/dist/src/vended-plugins/goal/plugin.d.ts +214 -0
- package/dist/src/vended-plugins/goal/plugin.d.ts.map +1 -0
- package/dist/src/vended-plugins/goal/plugin.js +287 -0
- package/dist/src/vended-plugins/goal/plugin.js.map +1 -0
- package/dist/src/vended-plugins/index.d.ts +3 -1
- package/dist/src/vended-plugins/index.d.ts.map +1 -1
- package/dist/src/vended-plugins/index.js +3 -1
- package/dist/src/vended-plugins/index.js.map +1 -1
- package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.js +17 -7
- package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.js.map +1 -1
- package/dist/src/vended-plugins/skills/agent-skills.d.ts +21 -7
- package/dist/src/vended-plugins/skills/agent-skills.d.ts.map +1 -1
- package/dist/src/vended-plugins/skills/agent-skills.js +144 -77
- package/dist/src/vended-plugins/skills/agent-skills.js.map +1 -1
- package/dist/src/vended-tools/bash/__tests__/bash.test.node.js +44 -4
- package/dist/src/vended-tools/bash/__tests__/bash.test.node.js.map +1 -1
- package/dist/src/vended-tools/bash/bash.d.ts +3 -24
- package/dist/src/vended-tools/bash/bash.d.ts.map +1 -1
- package/dist/src/vended-tools/bash/bash.js +9 -9
- package/dist/src/vended-tools/bash/bash.js.map +1 -1
- package/dist/src/vended-tools/bash/index.d.ts +3 -1
- package/dist/src/vended-tools/bash/index.d.ts.map +1 -1
- package/dist/src/vended-tools/bash/index.js +2 -1
- package/dist/src/vended-tools/bash/index.js.map +1 -1
- package/dist/src/vended-tools/bash/make-bash.d.ts +22 -0
- package/dist/src/vended-tools/bash/make-bash.d.ts.map +1 -0
- package/dist/src/vended-tools/bash/make-bash.js +40 -0
- package/dist/src/vended-tools/bash/make-bash.js.map +1 -0
- package/dist/src/vended-tools/bash/types.d.ts +1 -0
- package/dist/src/vended-tools/bash/types.d.ts.map +1 -1
- package/dist/src/vended-tools/bash/types.js +2 -0
- package/dist/src/vended-tools/bash/types.js.map +1 -1
- package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js +83 -1
- package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js.map +1 -1
- package/dist/src/vended-tools/file-editor/file-editor.d.ts +19 -10
- package/dist/src/vended-tools/file-editor/file-editor.d.ts.map +1 -1
- package/dist/src/vended-tools/file-editor/file-editor.js +188 -218
- package/dist/src/vended-tools/file-editor/file-editor.js.map +1 -1
- package/dist/src/vended-tools/file-editor/index.d.ts +2 -1
- package/dist/src/vended-tools/file-editor/index.d.ts.map +1 -1
- package/dist/src/vended-tools/file-editor/index.js +1 -1
- package/dist/src/vended-tools/file-editor/index.js.map +1 -1
- package/package.json +59 -6
- package/dist/src/utils/shell-quote.d.ts +0 -12
- package/dist/src/utils/shell-quote.d.ts.map +0 -1
- package/dist/src/utils/shell-quote.js +0 -14
- package/dist/src/utils/shell-quote.js.map +0 -1
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
import { BedrockAgentRuntimeClient, RetrieveCommand } from '@aws-sdk/client-bedrock-agent-runtime';
|
|
2
|
+
import { BedrockAgentClient, IngestKnowledgeBaseDocumentsCommand, } from '@aws-sdk/client-bedrock-agent';
|
|
3
|
+
import { v7 as uuidv7 } from 'uuid';
|
|
4
|
+
import { logger } from '../../logging/logger.js';
|
|
5
|
+
const DEFAULT_MAX_SEARCH_RESULTS = 10;
|
|
6
|
+
/** Converts a caller metadata value into a Bedrock attribute value, or `undefined` if unsupported. */
|
|
7
|
+
function toAttributeValue(value) {
|
|
8
|
+
if (typeof value === 'string')
|
|
9
|
+
return { type: 'STRING', stringValue: value };
|
|
10
|
+
if (typeof value === 'number')
|
|
11
|
+
return { type: 'NUMBER', numberValue: value };
|
|
12
|
+
if (typeof value === 'boolean')
|
|
13
|
+
return { type: 'BOOLEAN', booleanValue: value };
|
|
14
|
+
if (Array.isArray(value) && value.length > 0 && value.every((item) => typeof item === 'string')) {
|
|
15
|
+
return { type: 'STRING_LIST', stringListValue: value };
|
|
16
|
+
}
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* A {@link MemoryStore} backed by Amazon Bedrock Knowledge Bases. Supports semantic search via
|
|
21
|
+
* Retrieve and document ingestion via IngestKnowledgeBaseDocuments for CUSTOM and S3 data sources.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* import { BedrockKnowledgeBaseStore } from '@strands-agents/sdk/vended-memory-stores/bedrock-knowledge-base'
|
|
26
|
+
*
|
|
27
|
+
* const store = new BedrockKnowledgeBaseStore({
|
|
28
|
+
* config: {
|
|
29
|
+
* knowledgeBaseId: 'KB123',
|
|
30
|
+
* dataSourceType: 'CUSTOM',
|
|
31
|
+
* dataSourceId: 'DS456',
|
|
32
|
+
* },
|
|
33
|
+
* scope: 'user-abc',
|
|
34
|
+
* writable: true,
|
|
35
|
+
* })
|
|
36
|
+
*
|
|
37
|
+
* const results = await store.search('what are my preferences?')
|
|
38
|
+
* const { documentId } = await store.add('User prefers dark mode')
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export class BedrockKnowledgeBaseStore {
|
|
42
|
+
name;
|
|
43
|
+
description;
|
|
44
|
+
maxSearchResults;
|
|
45
|
+
writable;
|
|
46
|
+
extraction;
|
|
47
|
+
_runtimeClient;
|
|
48
|
+
_agentClient;
|
|
49
|
+
_s3Client;
|
|
50
|
+
_s3Config;
|
|
51
|
+
_knowledgeBaseId;
|
|
52
|
+
_dataSourceType;
|
|
53
|
+
_dataSourceId;
|
|
54
|
+
/**
|
|
55
|
+
* Logical namespace isolating documents: applied as a metadata filter on {@link search} and stamped
|
|
56
|
+
* on writes via {@link add}. Unlike {@link name}, it is not a store-identity field, so it never
|
|
57
|
+
* affects `MemoryManager` routing. For per-tenant isolation, construct one store per scope — cheap,
|
|
58
|
+
* since they can share a single {@link BedrockKnowledgeBaseConfig}.
|
|
59
|
+
*/
|
|
60
|
+
scope;
|
|
61
|
+
/** Metadata attribute key used for scope-based filtering. */
|
|
62
|
+
scopeMetadataKey;
|
|
63
|
+
/**
|
|
64
|
+
* Explicit retrieval filter. When set, it overrides the scope-derived filter for {@link search}.
|
|
65
|
+
* Note the asymmetry: an explicit filter affects search only; writes always scope by {@link scope}.
|
|
66
|
+
*/
|
|
67
|
+
filter;
|
|
68
|
+
constructor(options) {
|
|
69
|
+
const { config, scope, name, description, writable, maxSearchResults, filter, extraction } = options;
|
|
70
|
+
this.name = name;
|
|
71
|
+
if (description !== undefined)
|
|
72
|
+
this.description = description;
|
|
73
|
+
if (maxSearchResults !== undefined) {
|
|
74
|
+
if (maxSearchResults < 1) {
|
|
75
|
+
throw new Error('BedrockKnowledgeBaseStore: maxSearchResults must be at least 1.');
|
|
76
|
+
}
|
|
77
|
+
this.maxSearchResults = maxSearchResults;
|
|
78
|
+
}
|
|
79
|
+
this.writable = writable ?? false;
|
|
80
|
+
if (extraction !== undefined)
|
|
81
|
+
this.extraction = extraction;
|
|
82
|
+
this._runtimeClient = config.runtimeClient ?? new BedrockAgentRuntimeClient({});
|
|
83
|
+
this._agentClient = config.agentClient;
|
|
84
|
+
this._s3Client = config.s3?.client;
|
|
85
|
+
this._s3Config = config.s3;
|
|
86
|
+
this._knowledgeBaseId = config.knowledgeBaseId;
|
|
87
|
+
this._dataSourceType = config.dataSourceType;
|
|
88
|
+
this._dataSourceId = config.dataSourceId;
|
|
89
|
+
if (this.writable)
|
|
90
|
+
this._validateWriteConfig();
|
|
91
|
+
this.scope = scope;
|
|
92
|
+
this.scopeMetadataKey = config.scopeMetadataKey ?? 'namespace';
|
|
93
|
+
this.filter = filter;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Resolves the effective retrieval filter for a search: an explicit {@link filter} wins; otherwise
|
|
97
|
+
* one is derived from {@link scope} / {@link scopeMetadataKey}.
|
|
98
|
+
*/
|
|
99
|
+
_resolveFilter() {
|
|
100
|
+
if (this.filter)
|
|
101
|
+
return this.filter;
|
|
102
|
+
if (this.scope)
|
|
103
|
+
return { equals: { key: this.scopeMetadataKey, value: this.scope } };
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Searches the knowledge base for entries matching the query.
|
|
108
|
+
*
|
|
109
|
+
* @param query - The search query text
|
|
110
|
+
* @param options - Optional search configuration
|
|
111
|
+
* @returns Matching memory entries ordered by relevance. Each entry's `metadata` includes
|
|
112
|
+
* user-provided attributes plus two reserved synthetic keys: `_relevanceScore` (number) and
|
|
113
|
+
* `_sourceLocation` (Bedrock retrieval location object).
|
|
114
|
+
*/
|
|
115
|
+
async search(query, options) {
|
|
116
|
+
if (options?.maxSearchResults !== undefined && options.maxSearchResults < 1) {
|
|
117
|
+
throw new Error('BedrockKnowledgeBaseStore: maxSearchResults must be at least 1.');
|
|
118
|
+
}
|
|
119
|
+
const limit = options?.maxSearchResults || this.maxSearchResults || DEFAULT_MAX_SEARCH_RESULTS;
|
|
120
|
+
const filter = this._resolveFilter();
|
|
121
|
+
let response;
|
|
122
|
+
try {
|
|
123
|
+
response = await this._runtimeClient.send(new RetrieveCommand({
|
|
124
|
+
knowledgeBaseId: this._knowledgeBaseId,
|
|
125
|
+
retrievalQuery: { text: query },
|
|
126
|
+
retrievalConfiguration: {
|
|
127
|
+
vectorSearchConfiguration: {
|
|
128
|
+
numberOfResults: limit,
|
|
129
|
+
...(filter && { filter }),
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
}));
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
logger.error(`store=<${this.name}>, knowledgeBaseId=<${this._knowledgeBaseId}>, error=<${error}> | knowledge base retrieve failed`, error);
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
return (response.retrievalResults ?? []).map((result) => {
|
|
139
|
+
const metadata = {};
|
|
140
|
+
if (result.metadata) {
|
|
141
|
+
for (const [key, value] of Object.entries(result.metadata)) {
|
|
142
|
+
metadata[key] = value;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (result.location) {
|
|
146
|
+
metadata._sourceLocation = result.location;
|
|
147
|
+
}
|
|
148
|
+
if (result.score != null) {
|
|
149
|
+
metadata._relevanceScore = result.score;
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
content: result.content?.text ?? '',
|
|
153
|
+
metadata,
|
|
154
|
+
};
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Ingests `content` (with optional `metadata`) into the knowledge base.
|
|
159
|
+
*
|
|
160
|
+
* Only `CUSTOM` and `S3` data sources support this — they are the sole `dataSourceType`s that
|
|
161
|
+
* accept direct ingestion (`IngestKnowledgeBaseDocuments`). `OTHER` backends sync from an external
|
|
162
|
+
* store or are query-only, so the store is read-only and `add` is unavailable. Requires
|
|
163
|
+
* `dataSourceId` (and, for `S3`, an `s3` config); see {@link BedrockKnowledgeBaseStoreConfig}.
|
|
164
|
+
*
|
|
165
|
+
* @param content - The text content to ingest
|
|
166
|
+
* @param metadata - Optional metadata attributes to attach to the document
|
|
167
|
+
* @returns The document identifier (UUID for CUSTOM, s3:// URI for S3)
|
|
168
|
+
*/
|
|
169
|
+
async add(content, metadata) {
|
|
170
|
+
if (!this.writable) {
|
|
171
|
+
throw new Error('BedrockKnowledgeBaseStore: store is not writable. Set writable: true in config to enable add().');
|
|
172
|
+
}
|
|
173
|
+
if (!content.trim()) {
|
|
174
|
+
throw new Error('BedrockKnowledgeBaseStore: content must not be empty.');
|
|
175
|
+
}
|
|
176
|
+
const { dataSourceId, dataSourceType } = this._validateWriteConfig();
|
|
177
|
+
// S3 and CUSTOM data sources accept fundamentally different documents. S3 ingests objects, so
|
|
178
|
+
// its document references objects uploaded to S3 first; CUSTOM ingests the text inline. Either
|
|
179
|
+
// way the store mints the document's identifier (CUSTOM: a UUID; S3: the content object's URI)
|
|
180
|
+
// and returns it, so the caller has a stable handle to the document Bedrock now tracks.
|
|
181
|
+
let document;
|
|
182
|
+
let documentId;
|
|
183
|
+
if (dataSourceType === 'S3') {
|
|
184
|
+
const objectUris = await this._uploadS3Objects(content, metadata);
|
|
185
|
+
document = this._buildS3Document(objectUris);
|
|
186
|
+
documentId = objectUris.contentUri;
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
documentId = uuidv7();
|
|
190
|
+
document = this._buildCustomDocument(documentId, content, metadata);
|
|
191
|
+
}
|
|
192
|
+
try {
|
|
193
|
+
await this._getAgentClient().send(new IngestKnowledgeBaseDocumentsCommand({
|
|
194
|
+
knowledgeBaseId: this._knowledgeBaseId,
|
|
195
|
+
dataSourceId,
|
|
196
|
+
documents: [document],
|
|
197
|
+
}));
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
logger.error(`store=<${this.name}>, knowledgeBaseId=<${this._knowledgeBaseId}>, dataSourceId=<${dataSourceId}>, dataSourceType=<${dataSourceType}>, error=<${error}> | knowledge base document ingestion failed`, error);
|
|
201
|
+
throw error;
|
|
202
|
+
}
|
|
203
|
+
return { documentId };
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Uploads the objects that back one S3 ingestion and returns their `s3://` URIs.
|
|
207
|
+
*
|
|
208
|
+
* A single `add` produces up to *two* objects — hence the plural name and the multi-URI return:
|
|
209
|
+
* - `contentUri`: the content itself, uploaded as a `.txt` object. Always written.
|
|
210
|
+
* - `sidecarUri`: a `<object-key>.metadata.json` sidecar carrying scope/metadata, written *only*
|
|
211
|
+
* when there is any to attach (so it's optional in the return). Unlike a `CUSTOM` document, an
|
|
212
|
+
* S3 document can't carry attributes inline, so the sidecar is Bedrock's out-of-band convention
|
|
213
|
+
* for attaching them: it sits beside the content object and Bedrock pairs the two by name.
|
|
214
|
+
*
|
|
215
|
+
* Bedrock reads and indexes these objects on ingestion.
|
|
216
|
+
*
|
|
217
|
+
* Note: uploads are not transactional. If the sidecar upload (or the subsequent ingestion) fails
|
|
218
|
+
* after the content object lands, the uploaded object(s) remain in the bucket un-ingested. They are
|
|
219
|
+
* inert — a later data-source sync may pick them up, or they can be cleaned up out of band.
|
|
220
|
+
*/
|
|
221
|
+
async _uploadS3Objects(content, metadata) {
|
|
222
|
+
const s3 = this._s3Config;
|
|
223
|
+
const prefix = s3.prefix.endsWith('/') ? s3.prefix : `${s3.prefix}/`;
|
|
224
|
+
const key = `${prefix}${uuidv7()}.txt`;
|
|
225
|
+
const contentUri = await this._putObject(s3, key, content, 'text/plain; charset=utf-8');
|
|
226
|
+
const attributes = this._buildS3SidecarAttributes(metadata);
|
|
227
|
+
if (Object.keys(attributes).length === 0) {
|
|
228
|
+
return { contentUri };
|
|
229
|
+
}
|
|
230
|
+
// The sidecar must sit beside the source object and be named `<object-key>.metadata.json`.
|
|
231
|
+
const sidecar = JSON.stringify({ metadataAttributes: attributes });
|
|
232
|
+
const sidecarUri = await this._putObject(s3, `${key}.metadata.json`, sidecar, 'application/json');
|
|
233
|
+
return { contentUri, sidecarUri };
|
|
234
|
+
}
|
|
235
|
+
/** Uploads a single object to the configured bucket and returns its `s3://` URI. */
|
|
236
|
+
async _putObject(s3, key, body, contentType) {
|
|
237
|
+
try {
|
|
238
|
+
const { PutObjectCommand } = await import('@aws-sdk/client-s3');
|
|
239
|
+
const client = await this._getS3Client();
|
|
240
|
+
await client.send(new PutObjectCommand({ Bucket: s3.bucket, Key: key, Body: body, ContentType: contentType }));
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
logger.error(`store=<${this.name}>, uri=<s3://${s3.bucket}/${key}>, error=<${error}> | S3 upload failed before ingestion`, error);
|
|
244
|
+
throw error;
|
|
245
|
+
}
|
|
246
|
+
return `s3://${s3.bucket}/${key}`;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Builds a document for an `S3` data source from the URIs produced by {@link _uploadS3Objects}.
|
|
250
|
+
*
|
|
251
|
+
* Takes both URIs because an S3 document references objects by location rather than carrying data
|
|
252
|
+
* inline: `contentUri` becomes the document's content (the object to index), and `sidecarUri`,
|
|
253
|
+
* when present, becomes its metadata (an `S3_LOCATION` pointing at the sidecar). With no
|
|
254
|
+
* scope/metadata there's no sidecar, so `sidecarUri` is omitted and the document carries no
|
|
255
|
+
* metadata.
|
|
256
|
+
*/
|
|
257
|
+
_buildS3Document({ contentUri, sidecarUri, }) {
|
|
258
|
+
const document = {
|
|
259
|
+
content: {
|
|
260
|
+
dataSourceType: 'S3',
|
|
261
|
+
s3: { s3Location: { uri: contentUri } },
|
|
262
|
+
},
|
|
263
|
+
};
|
|
264
|
+
if (sidecarUri) {
|
|
265
|
+
document.metadata = {
|
|
266
|
+
type: 'S3_LOCATION',
|
|
267
|
+
s3Location: { uri: sidecarUri },
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
return document;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Resolves scope and caller metadata into a flat list of key-value pairs, handling collision
|
|
274
|
+
* detection and unsupported-type filtering. Shared by both CUSTOM (inline attributes) and S3
|
|
275
|
+
* (sidecar) document builders.
|
|
276
|
+
*/
|
|
277
|
+
_resolveAttributes(metadata) {
|
|
278
|
+
const attrs = [];
|
|
279
|
+
if (this.scope) {
|
|
280
|
+
attrs.push({ key: this.scopeMetadataKey, value: { type: 'STRING', stringValue: this.scope } });
|
|
281
|
+
}
|
|
282
|
+
if (metadata) {
|
|
283
|
+
for (const [key, value] of Object.entries(metadata)) {
|
|
284
|
+
if (this.scope && key === this.scopeMetadataKey) {
|
|
285
|
+
logger.warn(`store=<${this.name}>, key=<${key}> | dropping metadata key that collides with scopeMetadataKey`);
|
|
286
|
+
continue;
|
|
287
|
+
}
|
|
288
|
+
const attributeValue = toAttributeValue(value);
|
|
289
|
+
if (attributeValue) {
|
|
290
|
+
attrs.push({ key, value: attributeValue });
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
logger.debug(`store=<${this.name}>, key=<${key}> | dropping metadata value of unsupported type`);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return attrs;
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Builds a document for a `CUSTOM` data source: the text ingested inline, with the scope and any
|
|
301
|
+
* caller metadata attached as inline attributes for retrieval filtering. The caller supplies
|
|
302
|
+
* `documentId` (so it can return that same id to its own caller) and it becomes the document's
|
|
303
|
+
* `customDocumentIdentifier`.
|
|
304
|
+
*/
|
|
305
|
+
_buildCustomDocument(documentId, content, metadata) {
|
|
306
|
+
const attrs = this._resolveAttributes(metadata);
|
|
307
|
+
const document = {
|
|
308
|
+
content: {
|
|
309
|
+
dataSourceType: 'CUSTOM',
|
|
310
|
+
custom: {
|
|
311
|
+
customDocumentIdentifier: { id: documentId },
|
|
312
|
+
sourceType: 'IN_LINE',
|
|
313
|
+
inlineContent: {
|
|
314
|
+
type: 'TEXT',
|
|
315
|
+
textContent: { data: content },
|
|
316
|
+
},
|
|
317
|
+
},
|
|
318
|
+
},
|
|
319
|
+
};
|
|
320
|
+
if (attrs.length > 0) {
|
|
321
|
+
document.metadata = {
|
|
322
|
+
type: 'IN_LINE_ATTRIBUTE',
|
|
323
|
+
inlineAttributes: attrs.map(({ key, value }) => ({ key, value })),
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
return document;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Builds the `metadataAttributes` map for an S3 `.metadata.json` sidecar from the scope and caller
|
|
330
|
+
* metadata. Returns an empty map when there's nothing to attach — {@link _uploadS3Objects} treats
|
|
331
|
+
* that as "no sidecar" and skips writing the second object.
|
|
332
|
+
*/
|
|
333
|
+
_buildS3SidecarAttributes(metadata) {
|
|
334
|
+
const attrs = this._resolveAttributes(metadata);
|
|
335
|
+
const attributes = {};
|
|
336
|
+
for (const { key, value } of attrs) {
|
|
337
|
+
attributes[key] = { value, includeForEmbedding: false };
|
|
338
|
+
}
|
|
339
|
+
return attributes;
|
|
340
|
+
}
|
|
341
|
+
_validateWriteConfig() {
|
|
342
|
+
if (this._dataSourceType !== 'CUSTOM' && this._dataSourceType !== 'S3') {
|
|
343
|
+
throw new Error(`BedrockKnowledgeBaseStore: add requires dataSourceType 'CUSTOM' or 'S3', but it is '${this._dataSourceType ?? 'undefined'}'. ` +
|
|
344
|
+
"'OTHER' backends are read-only.");
|
|
345
|
+
}
|
|
346
|
+
if (!this._dataSourceId) {
|
|
347
|
+
throw new Error('BedrockKnowledgeBaseStore: dataSourceId is required for write operations. ' +
|
|
348
|
+
'Provide it in the config to enable add().');
|
|
349
|
+
}
|
|
350
|
+
if (this._dataSourceType === 'S3' && !this._s3Config) {
|
|
351
|
+
throw new Error("BedrockKnowledgeBaseStore: s3 config is required when dataSourceType is 'S3'. " +
|
|
352
|
+
'Provide bucket and prefix to enable add().');
|
|
353
|
+
}
|
|
354
|
+
return { dataSourceId: this._dataSourceId, dataSourceType: this._dataSourceType };
|
|
355
|
+
}
|
|
356
|
+
async _getS3Client() {
|
|
357
|
+
if (!this._s3Client) {
|
|
358
|
+
const { S3Client: S3ClientImpl } = await import('@aws-sdk/client-s3');
|
|
359
|
+
this._s3Client = new S3ClientImpl({});
|
|
360
|
+
}
|
|
361
|
+
return this._s3Client;
|
|
362
|
+
}
|
|
363
|
+
_getAgentClient() {
|
|
364
|
+
if (!this._agentClient) {
|
|
365
|
+
this._agentClient = new BedrockAgentClient({});
|
|
366
|
+
}
|
|
367
|
+
return this._agentClient;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../../src/vended-memory-stores/bedrock-knowledge-base/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.test.d.ts","sourceRoot":"","sources":["../../../../../src/vended-plugins/context-injector/__tests__/plugin.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { ContextInjector } from '../plugin.js';
|
|
3
|
+
import { InvokeModelStage } from '../../../middleware/index.js';
|
|
4
|
+
import { Message, TextBlock } from '../../../types/messages.js';
|
|
5
|
+
import { createMockAgent } from '../../../__fixtures__/agent-helpers.js';
|
|
6
|
+
const user = (text) => new Message({ role: 'user', content: [new TextBlock(text)] });
|
|
7
|
+
const assistant = (text) => new Message({ role: 'assistant', content: [new TextBlock(text)] });
|
|
8
|
+
// Builds a mock agent that captures addMiddleware registrations, with a real appState/cancelSignal.
|
|
9
|
+
function makeAgent() {
|
|
10
|
+
const addMiddleware = vi.fn();
|
|
11
|
+
const agent = createMockAgent({ extra: { addMiddleware } });
|
|
12
|
+
return { agent, addMiddleware };
|
|
13
|
+
}
|
|
14
|
+
describe('ContextInjector', () => {
|
|
15
|
+
describe('plugin interface', () => {
|
|
16
|
+
it('defaults to the strands:context-injector name', () => {
|
|
17
|
+
expect(new ContextInjector({ renderContent: async () => 'x' }).name).toBe('strands:context-injector');
|
|
18
|
+
});
|
|
19
|
+
it('honors a custom name (so multiple injectors can be told apart)', () => {
|
|
20
|
+
expect(new ContextInjector({ name: 'now', renderContent: async () => 'x' }).name).toBe('now');
|
|
21
|
+
});
|
|
22
|
+
it('registers an InvokeModelStage input middleware on initAgent', () => {
|
|
23
|
+
const { agent, addMiddleware } = makeAgent();
|
|
24
|
+
new ContextInjector({ renderContent: async () => 'x' }).initAgent(agent);
|
|
25
|
+
expect(addMiddleware).toHaveBeenCalledTimes(1);
|
|
26
|
+
expect(addMiddleware.mock.calls[0][0]).toBe(InvokeModelStage.Input);
|
|
27
|
+
expect(typeof addMiddleware.mock.calls[0][1]).toBe('function');
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
describe('registered handler', () => {
|
|
31
|
+
// Runs the handler the plugin registered, with a context backed by the mock agent.
|
|
32
|
+
async function run(plugin, messages) {
|
|
33
|
+
const { agent, addMiddleware } = makeAgent();
|
|
34
|
+
plugin.initAgent(agent);
|
|
35
|
+
const handler = addMiddleware.mock.calls[0][1];
|
|
36
|
+
return handler({ messages, agent });
|
|
37
|
+
}
|
|
38
|
+
it('folds renderContent() text into the latest user message', async () => {
|
|
39
|
+
const result = await run(new ContextInjector({ renderContent: async () => 'INJECTED' }), [
|
|
40
|
+
assistant('prior'),
|
|
41
|
+
user('ask'),
|
|
42
|
+
]);
|
|
43
|
+
expect(result.messages.map((m) => m.toJSON())).toStrictEqual([
|
|
44
|
+
{ role: 'assistant', content: [{ text: 'prior' }] },
|
|
45
|
+
{ role: 'user', content: [{ text: 'INJECTED' }, { text: 'ask' }] },
|
|
46
|
+
]);
|
|
47
|
+
});
|
|
48
|
+
it('skips on a non-user turn by default (userTurn trigger)', async () => {
|
|
49
|
+
const renderContent = vi.fn(async () => 'x');
|
|
50
|
+
const input = [user('ask'), assistant('reply')];
|
|
51
|
+
const result = await run(new ContextInjector({ renderContent }), input);
|
|
52
|
+
expect(renderContent).not.toHaveBeenCalled();
|
|
53
|
+
expect(result.messages).toBe(input);
|
|
54
|
+
});
|
|
55
|
+
it("'everyTurn' injects regardless of the latest role", async () => {
|
|
56
|
+
const result = await run(new ContextInjector({ trigger: 'everyTurn', renderContent: async () => 'INJECTED' }), [
|
|
57
|
+
user('ask'),
|
|
58
|
+
assistant('reply'),
|
|
59
|
+
]);
|
|
60
|
+
// No later user message than index 0, so the fold targets it.
|
|
61
|
+
expect(result.messages.map((m) => m.toJSON())).toStrictEqual([
|
|
62
|
+
{ role: 'user', content: [{ text: 'INJECTED' }, { text: 'ask' }] },
|
|
63
|
+
{ role: 'assistant', content: [{ text: 'reply' }] },
|
|
64
|
+
]);
|
|
65
|
+
});
|
|
66
|
+
it('exposes appState and the agent to renderContent', async () => {
|
|
67
|
+
const { agent, addMiddleware } = makeAgent();
|
|
68
|
+
let sawAgent = false;
|
|
69
|
+
let sawAppState = false;
|
|
70
|
+
new ContextInjector({
|
|
71
|
+
renderContent: async (ctx) => {
|
|
72
|
+
sawAgent = ctx.agent === agent;
|
|
73
|
+
sawAppState = ctx.appState === agent.appState;
|
|
74
|
+
return undefined;
|
|
75
|
+
},
|
|
76
|
+
}).initAgent(agent);
|
|
77
|
+
const handler = addMiddleware.mock.calls[0][1];
|
|
78
|
+
await handler({ messages: [user('ask')], agent });
|
|
79
|
+
expect(sawAgent).toBe(true);
|
|
80
|
+
expect(sawAppState).toBe(true);
|
|
81
|
+
});
|
|
82
|
+
it('fails open (passes context through) when renderContent throws', async () => {
|
|
83
|
+
const result = await run(new ContextInjector({
|
|
84
|
+
renderContent: async () => {
|
|
85
|
+
throw new Error('boom');
|
|
86
|
+
},
|
|
87
|
+
}), [assistant('prior'), user('ask')]);
|
|
88
|
+
// Unchanged: the original messages, no injected block.
|
|
89
|
+
expect(result.messages.map((m) => m.toJSON())).toStrictEqual([
|
|
90
|
+
{ role: 'assistant', content: [{ text: 'prior' }] },
|
|
91
|
+
{ role: 'user', content: [{ text: 'ask' }] },
|
|
92
|
+
]);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
//# sourceMappingURL=plugin.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.test.js","sourceRoot":"","sources":["../../../../../src/vended-plugins/context-injector/__tests__/plugin.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAC/D,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAE/D,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAA;AAExE,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAA;AAC5F,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAA;AAEtG,oGAAoG;AACpG,SAAS,SAAS;IAChB,MAAM,aAAa,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;IAC7B,MAAM,KAAK,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,EAAE,aAAa,EAAW,EAAE,CAAC,CAAA;IACpE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAA;AACjC,CAAC;AAED,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,CAAC,IAAI,eAAe,CAAC,EAAE,aAAa,EAAE,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;QACvG,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;YACxE,MAAM,CAAC,IAAI,eAAe,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC/F,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;YACrE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,SAAS,EAAE,CAAA;YAC5C,IAAI,eAAe,CAAC,EAAE,aAAa,EAAE,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;YAExE,MAAM,CAAC,aAAa,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;YAC9C,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAA;YACpE,MAAM,CAAC,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACjE,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,mFAAmF;QACnF,KAAK,UAAU,GAAG,CAAC,MAAuB,EAAE,QAAmB;YAC7D,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,SAAS,EAAE,CAAA;YAC5C,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;YACvB,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAA6D,CAAA;YAC3G,OAAO,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAmC,CAAC,CAAA;QACtE,CAAC;QAED,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACvE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,eAAe,CAAC,EAAE,aAAa,EAAE,KAAK,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC,EAAE;gBACvF,SAAS,CAAC,OAAO,CAAC;gBAClB,IAAI,CAAC,KAAK,CAAC;aACZ,CAAC,CAAA;YACF,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;gBAC3D,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE;gBACnD,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE;aACnE,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACtE,MAAM,aAAa,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,CAAC,CAAA;YAC5C,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;YAC/C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,eAAe,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,KAAK,CAAC,CAAA;YACvE,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;YAC5C,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACrC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,eAAe,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,KAAK,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC,EAAE;gBAC7G,IAAI,CAAC,KAAK,CAAC;gBACX,SAAS,CAAC,OAAO,CAAC;aACnB,CAAC,CAAA;YACF,8DAA8D;YAC9D,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;gBAC3D,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE;gBAClE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE;aACpD,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,SAAS,EAAE,CAAA;YAC5C,IAAI,QAAQ,GAAG,KAAK,CAAA;YACpB,IAAI,WAAW,GAAG,KAAK,CAAA;YACvB,IAAI,eAAe,CAAC;gBAClB,aAAa,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;oBAC3B,QAAQ,GAAG,GAAG,CAAC,KAAK,KAAK,KAAK,CAAA;oBAC9B,WAAW,GAAG,GAAG,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,CAAA;oBAC7C,OAAO,SAAS,CAAA;gBAClB,CAAC;aACF,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;YACnB,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAA6D,CAAA;YAC3G,MAAM,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAmC,CAAC,CAAA;YAElF,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC3B,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;YAC7E,MAAM,MAAM,GAAG,MAAM,GAAG,CACtB,IAAI,eAAe,CAAC;gBAClB,aAAa,EAAE,KAAK,IAAI,EAAE;oBACxB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAA;gBACzB,CAAC;aACF,CAAC,EACF,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAClC,CAAA;YACD,uDAAuD;YACvD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;gBAC3D,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE;gBACnD,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE;aAC7C,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context-injection plugin for Strands Agents.
|
|
3
|
+
*
|
|
4
|
+
* Provides the {@link ContextInjector} plugin, which folds just-in-time text into the model input
|
|
5
|
+
* before each call without touching durable history.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { Agent } from '@strands-agents/sdk'
|
|
10
|
+
* import { ContextInjector } from '@strands-agents/sdk/vended-plugins/context-injector'
|
|
11
|
+
*
|
|
12
|
+
* const agent = new Agent({
|
|
13
|
+
* model,
|
|
14
|
+
* plugins: [
|
|
15
|
+
* new ContextInjector({
|
|
16
|
+
* renderContent: async ({ messages }) => `<context>${derive(messages)}</context>`,
|
|
17
|
+
* }),
|
|
18
|
+
* ],
|
|
19
|
+
* })
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export { ContextInjector } from './plugin.js';
|
|
23
|
+
export type { ContextInjectorConfig } from './plugin.js';
|
|
24
|
+
export type { InjectionTrigger, InjectionContext } from '../../injection/types.js';
|
|
25
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/vended-plugins/context-injector/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,YAAY,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AACxD,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context-injection plugin for Strands Agents.
|
|
3
|
+
*
|
|
4
|
+
* Provides the {@link ContextInjector} plugin, which folds just-in-time text into the model input
|
|
5
|
+
* before each call without touching durable history.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { Agent } from '@strands-agents/sdk'
|
|
10
|
+
* import { ContextInjector } from '@strands-agents/sdk/vended-plugins/context-injector'
|
|
11
|
+
*
|
|
12
|
+
* const agent = new Agent({
|
|
13
|
+
* model,
|
|
14
|
+
* plugins: [
|
|
15
|
+
* new ContextInjector({
|
|
16
|
+
* renderContent: async ({ messages }) => `<context>${derive(messages)}</context>`,
|
|
17
|
+
* }),
|
|
18
|
+
* ],
|
|
19
|
+
* })
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export { ContextInjector } from './plugin.js';
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/vended-plugins/context-injector/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { Plugin } from '../../plugins/plugin.js';
|
|
2
|
+
import type { LocalAgent } from '../../types/agent.js';
|
|
3
|
+
import type { InjectionTrigger, InjectionContext } from '../../injection/types.js';
|
|
4
|
+
/** Configuration for the {@link ContextInjector} plugin. */
|
|
5
|
+
export interface ContextInjectorConfig {
|
|
6
|
+
/**
|
|
7
|
+
* Plugin name, for logging and duplicate detection. Defaults to `'strands:context-injector'`. Set a
|
|
8
|
+
* distinct name when registering more than one injector so they can be told apart.
|
|
9
|
+
*/
|
|
10
|
+
name?: string;
|
|
11
|
+
/**
|
|
12
|
+
* When to inject. An {@link InjectionTrigger} name selects a built-in policy (`'userTurn'` —
|
|
13
|
+
* default — or `'everyTurn'`); a predicate over the {@link InjectionContext} is the escape hatch. A
|
|
14
|
+
* predicate that throws fails open (injection is skipped).
|
|
15
|
+
*
|
|
16
|
+
* @defaultValue 'userTurn'
|
|
17
|
+
*/
|
|
18
|
+
trigger?: InjectionTrigger | ((context: InjectionContext) => boolean);
|
|
19
|
+
/**
|
|
20
|
+
* Renders the text to inject for this call, or `undefined`/`''` to skip. The text reaches the model
|
|
21
|
+
* verbatim, so it is a prompt-injection surface: escape any attacker-influenced fields yourself. A
|
|
22
|
+
* callback that throws fails open (injection is skipped, the model call proceeds).
|
|
23
|
+
*/
|
|
24
|
+
renderContent: (context: InjectionContext) => Promise<string | undefined>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Plugin that injects just-in-time context into the model input before each call.
|
|
28
|
+
*
|
|
29
|
+
* Before each model call, the plugin asks {@link ContextInjectorConfig.renderContent} for text and
|
|
30
|
+
* makes it available to the model for that call, gated by {@link ContextInjectorConfig.trigger}. The
|
|
31
|
+
* injected text is ephemeral: it augments the model input for that one call and never persists into the
|
|
32
|
+
* durable conversation or session.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* import { Agent } from '@strands-agents/sdk'
|
|
37
|
+
* import { ContextInjector } from '@strands-agents/sdk/vended-plugins/context-injector'
|
|
38
|
+
*
|
|
39
|
+
* const agent = new Agent({
|
|
40
|
+
* model,
|
|
41
|
+
* plugins: [new ContextInjector({ renderContent: async () => `<now>${new Date().toISOString()}</now>` })],
|
|
42
|
+
* })
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
* @remarks
|
|
46
|
+
* Multiple injectors may be registered; each contributes its text independently, in plugin-registration
|
|
47
|
+
* order.
|
|
48
|
+
*/
|
|
49
|
+
export declare class ContextInjector implements Plugin {
|
|
50
|
+
readonly name: string;
|
|
51
|
+
private readonly _config;
|
|
52
|
+
constructor(config: ContextInjectorConfig);
|
|
53
|
+
initAgent(agent: LocalAgent): void;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../../src/vended-plugins/context-injector/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAGtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAElF,4DAA4D;AAC5D,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,gBAAgB,GAAG,CAAC,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,CAAA;IACrE;;;;OAIG;IACH,aAAa,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;CAC1E;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,eAAgB,YAAW,MAAM;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAErB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;gBAEnC,MAAM,EAAE,qBAAqB;IAKzC,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;CAUnC"}
|