@strands-agents/sdk 1.5.0 → 1.7.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.
Files changed (232) hide show
  1. package/dist/src/__fixtures__/agent-helpers.d.ts.map +1 -1
  2. package/dist/src/__fixtures__/agent-helpers.js +3 -0
  3. package/dist/src/__fixtures__/agent-helpers.js.map +1 -1
  4. package/dist/src/agent/__tests__/agent.context-manager.test.js +0 -1
  5. package/dist/src/agent/__tests__/agent.context-manager.test.js.map +1 -1
  6. package/dist/src/agent/__tests__/agent.stateful-model.test.js +2 -2
  7. package/dist/src/agent/__tests__/agent.stateful-model.test.js.map +1 -1
  8. package/dist/src/agent/agent.d.ts +8 -5
  9. package/dist/src/agent/agent.d.ts.map +1 -1
  10. package/dist/src/agent/agent.js +60 -33
  11. package/dist/src/agent/agent.js.map +1 -1
  12. package/dist/src/context-manager/modes/agentic/agentic-context.d.ts +19 -0
  13. package/dist/src/context-manager/modes/agentic/agentic-context.d.ts.map +1 -0
  14. package/dist/src/context-manager/modes/agentic/agentic-context.js +245 -0
  15. package/dist/src/context-manager/modes/agentic/agentic-context.js.map +1 -0
  16. package/dist/src/conversation-manager/__tests__/agentic-context.test.d.ts +2 -0
  17. package/dist/src/conversation-manager/__tests__/agentic-context.test.d.ts.map +1 -0
  18. package/dist/src/conversation-manager/__tests__/agentic-context.test.js +332 -0
  19. package/dist/src/conversation-manager/__tests__/agentic-context.test.js.map +1 -0
  20. package/dist/src/conversation-manager/__tests__/context-compression.test.d.ts +2 -0
  21. package/dist/src/conversation-manager/__tests__/context-compression.test.d.ts.map +1 -0
  22. package/dist/src/conversation-manager/__tests__/context-compression.test.js +176 -0
  23. package/dist/src/conversation-manager/__tests__/context-compression.test.js.map +1 -0
  24. package/dist/src/conversation-manager/__tests__/pin.test.js +1 -1
  25. package/dist/src/conversation-manager/__tests__/pin.test.js.map +1 -1
  26. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js +1 -1
  27. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js.map +1 -1
  28. package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js +1 -1
  29. package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js.map +1 -1
  30. package/dist/src/conversation-manager/__tests__/token-usage-middleware.test.d.ts +2 -0
  31. package/dist/src/conversation-manager/__tests__/token-usage-middleware.test.d.ts.map +1 -0
  32. package/dist/src/conversation-manager/__tests__/token-usage-middleware.test.js +138 -0
  33. package/dist/src/conversation-manager/__tests__/token-usage-middleware.test.js.map +1 -0
  34. package/dist/src/conversation-manager/compression/context-compression.d.ts +39 -0
  35. package/dist/src/conversation-manager/compression/context-compression.d.ts.map +1 -0
  36. package/dist/src/conversation-manager/compression/context-compression.js +150 -0
  37. package/dist/src/conversation-manager/compression/context-compression.js.map +1 -0
  38. package/dist/src/conversation-manager/{pin-message.d.ts → compression/pin-message.d.ts} +1 -1
  39. package/dist/src/conversation-manager/compression/pin-message.d.ts.map +1 -0
  40. package/dist/src/conversation-manager/{pin-message.js → compression/pin-message.js} +1 -1
  41. package/dist/src/conversation-manager/compression/pin-message.js.map +1 -0
  42. package/dist/src/conversation-manager/conversation-manager.d.ts +2 -0
  43. package/dist/src/conversation-manager/conversation-manager.d.ts.map +1 -1
  44. package/dist/src/conversation-manager/conversation-manager.js +2 -2
  45. package/dist/src/conversation-manager/conversation-manager.js.map +1 -1
  46. package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts.map +1 -1
  47. package/dist/src/conversation-manager/sliding-window-conversation-manager.js +4 -35
  48. package/dist/src/conversation-manager/sliding-window-conversation-manager.js.map +1 -1
  49. package/dist/src/conversation-manager/summarizing-conversation-manager.d.ts +0 -19
  50. package/dist/src/conversation-manager/summarizing-conversation-manager.d.ts.map +1 -1
  51. package/dist/src/conversation-manager/summarizing-conversation-manager.js +4 -107
  52. package/dist/src/conversation-manager/summarizing-conversation-manager.js.map +1 -1
  53. package/dist/src/index.d.ts +3 -3
  54. package/dist/src/index.d.ts.map +1 -1
  55. package/dist/src/index.js +1 -1
  56. package/dist/src/index.js.map +1 -1
  57. package/dist/src/injection/__tests__/message-injection.test.d.ts +2 -0
  58. package/dist/src/injection/__tests__/message-injection.test.d.ts.map +1 -0
  59. package/dist/src/injection/__tests__/message-injection.test.js +200 -0
  60. package/dist/src/injection/__tests__/message-injection.test.js.map +1 -0
  61. package/dist/src/injection/index.d.ts +6 -0
  62. package/dist/src/injection/index.d.ts.map +1 -0
  63. package/dist/src/injection/index.js +2 -0
  64. package/dist/src/injection/index.js.map +1 -0
  65. package/dist/src/injection/message-injection.d.ts +65 -0
  66. package/dist/src/injection/message-injection.d.ts.map +1 -0
  67. package/dist/src/injection/message-injection.js +134 -0
  68. package/dist/src/injection/message-injection.js.map +1 -0
  69. package/dist/src/injection/types.d.ts +63 -0
  70. package/dist/src/injection/types.d.ts.map +1 -0
  71. package/dist/src/injection/types.js +2 -0
  72. package/dist/src/injection/types.js.map +1 -0
  73. package/dist/src/injection/xml.d.ts +27 -0
  74. package/dist/src/injection/xml.d.ts.map +1 -0
  75. package/dist/src/injection/xml.js +31 -0
  76. package/dist/src/injection/xml.js.map +1 -0
  77. package/dist/src/memory/__tests__/memory-manager.test.js +188 -2
  78. package/dist/src/memory/__tests__/memory-manager.test.js.map +1 -1
  79. package/dist/src/memory/__tests__/memory-tracing.test.d.ts +2 -0
  80. package/dist/src/memory/__tests__/memory-tracing.test.d.ts.map +1 -0
  81. package/dist/src/memory/__tests__/memory-tracing.test.js +250 -0
  82. package/dist/src/memory/__tests__/memory-tracing.test.js.map +1 -0
  83. package/dist/src/memory/extraction/__tests__/extraction.test.js +41 -39
  84. package/dist/src/memory/extraction/__tests__/extraction.test.js.map +1 -1
  85. package/dist/src/memory/extraction/__tests__/model-extractor.test.js +37 -1
  86. package/dist/src/memory/extraction/__tests__/model-extractor.test.js.map +1 -1
  87. package/dist/src/memory/extraction/coordinator.d.ts +6 -1
  88. package/dist/src/memory/extraction/coordinator.d.ts.map +1 -1
  89. package/dist/src/memory/extraction/coordinator.js +48 -10
  90. package/dist/src/memory/extraction/coordinator.js.map +1 -1
  91. package/dist/src/memory/extraction/model-extractor.d.ts.map +1 -1
  92. package/dist/src/memory/extraction/model-extractor.js +30 -9
  93. package/dist/src/memory/extraction/model-extractor.js.map +1 -1
  94. package/dist/src/memory/extraction/types.d.ts +7 -0
  95. package/dist/src/memory/extraction/types.d.ts.map +1 -1
  96. package/dist/src/memory/extraction/types.js.map +1 -1
  97. package/dist/src/memory/index.d.ts +2 -1
  98. package/dist/src/memory/index.d.ts.map +1 -1
  99. package/dist/src/memory/index.js.map +1 -1
  100. package/dist/src/memory/memory-manager.d.ts +64 -4
  101. package/dist/src/memory/memory-manager.d.ts.map +1 -1
  102. package/dist/src/memory/memory-manager.js +236 -36
  103. package/dist/src/memory/memory-manager.js.map +1 -1
  104. package/dist/src/memory/types.d.ts +72 -0
  105. package/dist/src/memory/types.d.ts.map +1 -1
  106. package/dist/src/middleware/__tests__/agent-middleware.test.js +0 -1
  107. package/dist/src/middleware/__tests__/agent-middleware.test.js.map +1 -1
  108. package/dist/src/middleware/__tests__/copy-on-input.test.d.ts +2 -0
  109. package/dist/src/middleware/__tests__/copy-on-input.test.d.ts.map +1 -0
  110. package/dist/src/middleware/__tests__/copy-on-input.test.js +379 -0
  111. package/dist/src/middleware/__tests__/copy-on-input.test.js.map +1 -0
  112. package/dist/src/middleware/stages.d.ts +14 -7
  113. package/dist/src/middleware/stages.d.ts.map +1 -1
  114. package/dist/src/middleware/stages.js +3 -0
  115. package/dist/src/middleware/stages.js.map +1 -1
  116. package/dist/src/models/__tests__/google.test.js +41 -0
  117. package/dist/src/models/__tests__/google.test.js.map +1 -1
  118. package/dist/src/models/google/adapters.d.ts.map +1 -1
  119. package/dist/src/models/google/adapters.js +21 -3
  120. package/dist/src/models/google/adapters.js.map +1 -1
  121. package/dist/src/models/openai/__tests__/errors.test.js +9 -0
  122. package/dist/src/models/openai/__tests__/errors.test.js.map +1 -1
  123. package/dist/src/models/openai/__tests__/responses.test.js +47 -0
  124. package/dist/src/models/openai/__tests__/responses.test.js.map +1 -1
  125. package/dist/src/models/openai/errors.d.ts.map +1 -1
  126. package/dist/src/models/openai/errors.js +4 -1
  127. package/dist/src/models/openai/errors.js.map +1 -1
  128. package/dist/src/models/openai/responses-adapter.d.ts +1 -0
  129. package/dist/src/models/openai/responses-adapter.d.ts.map +1 -1
  130. package/dist/src/models/openai/responses-adapter.js +24 -10
  131. package/dist/src/models/openai/responses-adapter.js.map +1 -1
  132. package/dist/src/multiagent/__tests__/graph.test.js +22 -1
  133. package/dist/src/multiagent/__tests__/graph.test.js.map +1 -1
  134. package/dist/src/multiagent/graph.d.ts.map +1 -1
  135. package/dist/src/multiagent/graph.js +4 -1
  136. package/dist/src/multiagent/graph.js.map +1 -1
  137. package/dist/src/sandbox/__tests__/docker.test.node.js +2 -2
  138. package/dist/src/sandbox/__tests__/docker.test.node.js.map +1 -1
  139. package/dist/src/sandbox/__tests__/ssh.test.node.js +2 -2
  140. package/dist/src/sandbox/__tests__/ssh.test.node.js.map +1 -1
  141. package/dist/src/sandbox/base.d.ts +0 -5
  142. package/dist/src/sandbox/base.d.ts.map +1 -1
  143. package/dist/src/sandbox/base.js +0 -5
  144. package/dist/src/sandbox/base.js.map +1 -1
  145. package/dist/src/sandbox/docker.d.ts.map +1 -1
  146. package/dist/src/sandbox/docker.js +2 -0
  147. package/dist/src/sandbox/docker.js.map +1 -1
  148. package/dist/src/sandbox/ssh.d.ts.map +1 -1
  149. package/dist/src/sandbox/ssh.js +2 -0
  150. package/dist/src/sandbox/ssh.js.map +1 -1
  151. package/dist/src/telemetry/__tests__/tracer.test.node.js +207 -9
  152. package/dist/src/telemetry/__tests__/tracer.test.node.js.map +1 -1
  153. package/dist/src/telemetry/tracer.d.ts +82 -2
  154. package/dist/src/telemetry/tracer.d.ts.map +1 -1
  155. package/dist/src/telemetry/tracer.js +242 -3
  156. package/dist/src/telemetry/tracer.js.map +1 -1
  157. package/dist/src/telemetry/types.d.ts +86 -1
  158. package/dist/src/telemetry/types.d.ts.map +1 -1
  159. package/dist/src/tsconfig.tsbuildinfo +1 -1
  160. package/dist/src/types/json.js +2 -2
  161. package/dist/src/types/json.js.map +1 -1
  162. package/dist/src/types/messages.d.ts +8 -0
  163. package/dist/src/types/messages.d.ts.map +1 -1
  164. package/dist/src/types/messages.js +13 -1
  165. package/dist/src/types/messages.js.map +1 -1
  166. package/dist/src/vended-interventions/cedar/__tests__/cedar.test.node.d.ts +2 -0
  167. package/dist/src/vended-interventions/cedar/__tests__/cedar.test.node.d.ts.map +1 -0
  168. package/dist/src/vended-interventions/cedar/__tests__/cedar.test.node.js +756 -0
  169. package/dist/src/vended-interventions/cedar/__tests__/cedar.test.node.js.map +1 -0
  170. package/dist/src/vended-interventions/cedar/cedar.d.ts +114 -0
  171. package/dist/src/vended-interventions/cedar/cedar.d.ts.map +1 -0
  172. package/dist/src/vended-interventions/cedar/cedar.js +239 -0
  173. package/dist/src/vended-interventions/cedar/cedar.js.map +1 -0
  174. package/dist/src/vended-interventions/cedar/index.d.ts +3 -0
  175. package/dist/src/vended-interventions/cedar/index.d.ts.map +1 -0
  176. package/dist/src/vended-interventions/cedar/index.js +2 -0
  177. package/dist/src/vended-interventions/cedar/index.js.map +1 -0
  178. package/dist/src/vended-interventions/cedar/schema-generator.d.ts +10 -0
  179. package/dist/src/vended-interventions/cedar/schema-generator.d.ts.map +1 -0
  180. package/dist/src/vended-interventions/cedar/schema-generator.js +38 -0
  181. package/dist/src/vended-interventions/cedar/schema-generator.js.map +1 -0
  182. package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.node.d.ts +2 -0
  183. package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.node.d.ts.map +1 -0
  184. package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/{bedrock-knowledge-base-store.test.js → bedrock-knowledge-base-store.test.node.js} +154 -7
  185. package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.node.js.map +1 -0
  186. package/dist/src/vended-memory-stores/bedrock-knowledge-base/index.d.ts +1 -1
  187. package/dist/src/vended-memory-stores/bedrock-knowledge-base/index.d.ts.map +1 -1
  188. package/dist/src/vended-memory-stores/bedrock-knowledge-base/index.js.map +1 -1
  189. package/dist/src/vended-memory-stores/bedrock-knowledge-base/store.d.ts +57 -0
  190. package/dist/src/vended-memory-stores/bedrock-knowledge-base/store.d.ts.map +1 -1
  191. package/dist/src/vended-memory-stores/bedrock-knowledge-base/store.js +86 -11
  192. package/dist/src/vended-memory-stores/bedrock-knowledge-base/store.js.map +1 -1
  193. package/dist/src/vended-plugins/context-injector/__tests__/plugin.test.d.ts +2 -0
  194. package/dist/src/vended-plugins/context-injector/__tests__/plugin.test.d.ts.map +1 -0
  195. package/dist/src/vended-plugins/context-injector/__tests__/plugin.test.js +96 -0
  196. package/dist/src/vended-plugins/context-injector/__tests__/plugin.test.js.map +1 -0
  197. package/dist/src/vended-plugins/context-injector/index.d.ts +25 -0
  198. package/dist/src/vended-plugins/context-injector/index.d.ts.map +1 -0
  199. package/dist/src/vended-plugins/context-injector/index.js +23 -0
  200. package/dist/src/vended-plugins/context-injector/index.js.map +1 -0
  201. package/dist/src/vended-plugins/context-injector/plugin.d.ts +55 -0
  202. package/dist/src/vended-plugins/context-injector/plugin.d.ts.map +1 -0
  203. package/dist/src/vended-plugins/context-injector/plugin.js +41 -0
  204. package/dist/src/vended-plugins/context-injector/plugin.js.map +1 -0
  205. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js +43 -4
  206. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js.map +1 -1
  207. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.node.js +5 -1
  208. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.node.js.map +1 -1
  209. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.js +68 -0
  210. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.js.map +1 -1
  211. package/dist/src/vended-plugins/context-offloader/plugin.d.ts.map +1 -1
  212. package/dist/src/vended-plugins/context-offloader/plugin.js +12 -2
  213. package/dist/src/vended-plugins/context-offloader/plugin.js.map +1 -1
  214. package/dist/src/vended-plugins/context-offloader/storage.d.ts +29 -1
  215. package/dist/src/vended-plugins/context-offloader/storage.d.ts.map +1 -1
  216. package/dist/src/vended-plugins/context-offloader/storage.js +76 -5
  217. package/dist/src/vended-plugins/context-offloader/storage.js.map +1 -1
  218. package/dist/src/vended-plugins/index.d.ts +2 -1
  219. package/dist/src/vended-plugins/index.d.ts.map +1 -1
  220. package/dist/src/vended-plugins/index.js +2 -1
  221. package/dist/src/vended-plugins/index.js.map +1 -1
  222. package/dist/src/vended-plugins/skills/skill.d.ts.map +1 -1
  223. package/dist/src/vended-plugins/skills/skill.js +4 -2
  224. package/dist/src/vended-plugins/skills/skill.js.map +1 -1
  225. package/dist/src/vended-tools/http-request/http-request.js +1 -1
  226. package/dist/src/vended-tools/http-request/http-request.js.map +1 -1
  227. package/package.json +54 -36
  228. package/dist/src/conversation-manager/pin-message.d.ts.map +0 -1
  229. package/dist/src/conversation-manager/pin-message.js.map +0 -1
  230. package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.d.ts +0 -2
  231. package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.d.ts.map +0 -1
  232. package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.js.map +0 -1
@@ -1,5 +1,5 @@
1
- import { BedrockAgentRuntimeClient, RetrieveCommand } from '@aws-sdk/client-bedrock-agent-runtime';
2
- import { BedrockAgentClient, IngestKnowledgeBaseDocumentsCommand, } from '@aws-sdk/client-bedrock-agent';
1
+ import { BedrockAgentRuntimeClient, RetrieveCommand, } from '@aws-sdk/client-bedrock-agent-runtime';
2
+ import { BedrockAgentClient, GetKnowledgeBaseCommand, IngestKnowledgeBaseDocumentsCommand, } from '@aws-sdk/client-bedrock-agent';
3
3
  import { v7 as uuidv7 } from 'uuid';
4
4
  import { logger } from '../../logging/logger.js';
5
5
  const DEFAULT_MAX_SEARCH_RESULTS = 10;
@@ -20,6 +20,12 @@ function toAttributeValue(value) {
20
20
  * A {@link MemoryStore} backed by Amazon Bedrock Knowledge Bases. Supports semantic search via
21
21
  * Retrieve and document ingestion via IngestKnowledgeBaseDocuments for CUSTOM and S3 data sources.
22
22
  *
23
+ * Works with all knowledge base types (MANAGED, VECTOR, KENDRA, SQL); the type is detected via
24
+ * `GetKnowledgeBase` during {@link initialize} and determines whether Retrieve uses
25
+ * `managedSearchConfiguration` or `vectorSearchConfiguration`. Detection requires the
26
+ * `bedrock:GetKnowledgeBase` permission; a failure raises at agent construction (via MemoryManager)
27
+ * or on first `search()` standalone. To skip detection, provide `knowledgeBaseType` in the config.
28
+ *
23
29
  * @example
24
30
  * ```typescript
25
31
  * import { BedrockKnowledgeBaseStore } from '@strands-agents/sdk/vended-memory-stores/bedrock-knowledge-base'
@@ -51,6 +57,8 @@ export class BedrockKnowledgeBaseStore {
51
57
  _knowledgeBaseId;
52
58
  _dataSourceType;
53
59
  _dataSourceId;
60
+ /** The knowledge base type, resolved eagerly in {@link initialize} via `GetKnowledgeBase`. */
61
+ _kbType;
54
62
  /**
55
63
  * Logical namespace isolating documents: applied as a metadata filter on {@link search} and stamped
56
64
  * on writes via {@link add}. Unlike {@link name}, it is not a store-identity field, so it never
@@ -65,8 +73,10 @@ export class BedrockKnowledgeBaseStore {
65
73
  * Note the asymmetry: an explicit filter affects search only; writes always scope by {@link scope}.
66
74
  */
67
75
  filter;
76
+ /** Document-level access control entries stamped on every write, for ACL-aware data sources. */
77
+ accessControlList;
68
78
  constructor(options) {
69
- const { config, scope, name, description, writable, maxSearchResults, filter, extraction } = options;
79
+ const { config, scope, name, description, writable, maxSearchResults, filter, extraction, accessControlList } = options;
70
80
  this.name = name;
71
81
  if (description !== undefined)
72
82
  this.description = description;
@@ -84,6 +94,7 @@ export class BedrockKnowledgeBaseStore {
84
94
  this._s3Client = config.s3?.client;
85
95
  this._s3Config = config.s3;
86
96
  this._knowledgeBaseId = config.knowledgeBaseId;
97
+ this._kbType = config.knowledgeBaseType;
87
98
  this._dataSourceType = config.dataSourceType;
88
99
  this._dataSourceId = config.dataSourceId;
89
100
  if (this.writable)
@@ -91,6 +102,7 @@ export class BedrockKnowledgeBaseStore {
91
102
  this.scope = scope;
92
103
  this.scopeMetadataKey = config.scopeMetadataKey ?? 'namespace';
93
104
  this.filter = filter;
105
+ this.accessControlList = accessControlList;
94
106
  }
95
107
  /**
96
108
  * Resolves the effective retrieval filter for a search: an explicit {@link filter} wins; otherwise
@@ -103,6 +115,27 @@ export class BedrockKnowledgeBaseStore {
103
115
  return { equals: { key: this.scopeMetadataKey, value: this.scope } };
104
116
  return undefined;
105
117
  }
118
+ /**
119
+ * Resolve the knowledge base type via `GetKnowledgeBase` and cache the result.
120
+ *
121
+ * Idempotent: subsequent calls return immediately. When the store is registered with a
122
+ * `MemoryManager`, this runs at agent construction so permission or connectivity issues surface
123
+ * early. Standalone callers get the same check on first `search()`.
124
+ *
125
+ * @throws Error if the `GetKnowledgeBase` call fails for any reason.
126
+ */
127
+ async initialize() {
128
+ if (this._kbType !== undefined)
129
+ return;
130
+ try {
131
+ const response = await this._getAgentClient().send(new GetKnowledgeBaseCommand({ knowledgeBaseId: this._knowledgeBaseId }));
132
+ this._kbType = response.knowledgeBase.knowledgeBaseConfiguration.type;
133
+ }
134
+ catch (error) {
135
+ logger.error(`store=<${this.name}>, knowledgeBaseId=<${this._knowledgeBaseId}>, error=<${error}> | knowledge base type detection failed`);
136
+ throw error;
137
+ }
138
+ }
106
139
  /**
107
140
  * Searches the knowledge base for entries matching the query.
108
141
  *
@@ -118,17 +151,20 @@ export class BedrockKnowledgeBaseStore {
118
151
  }
119
152
  const limit = options?.maxSearchResults || this.maxSearchResults || DEFAULT_MAX_SEARCH_RESULTS;
120
153
  const filter = this._resolveFilter();
154
+ const searchConfiguration = { numberOfResults: limit, ...(filter && { filter }) };
155
+ // A managed knowledge base takes `managedSearchConfiguration`, a vector one
156
+ // `vectorSearchConfiguration`; both accept the same fields, so only the wrapping key differs.
157
+ await this.initialize();
158
+ const managed = this._kbType === 'MANAGED';
159
+ const retrievalConfiguration = managed
160
+ ? { managedSearchConfiguration: searchConfiguration }
161
+ : { vectorSearchConfiguration: searchConfiguration };
121
162
  let response;
122
163
  try {
123
164
  response = await this._runtimeClient.send(new RetrieveCommand({
124
165
  knowledgeBaseId: this._knowledgeBaseId,
125
166
  retrievalQuery: { text: query },
126
- retrievalConfiguration: {
127
- vectorSearchConfiguration: {
128
- numberOfResults: limit,
129
- ...(filter && { filter }),
130
- },
131
- },
167
+ retrievalConfiguration,
132
168
  }));
133
169
  }
134
170
  catch (error) {
@@ -198,10 +234,24 @@ export class BedrockKnowledgeBaseStore {
198
234
  }
199
235
  catch (error) {
200
236
  logger.error(`store=<${this.name}>, knowledgeBaseId=<${this._knowledgeBaseId}>, dataSourceId=<${dataSourceId}>, dataSourceType=<${dataSourceType}>, error=<${error}> | knowledge base document ingestion failed`, error);
237
+ if (this._isMissingAclError(error)) {
238
+ throw new Error('BedrockKnowledgeBaseStore: ingestion was rejected because the data source has ACL awareness ' +
239
+ 'enabled but this store has no accessControlList configured. Set accessControlList in the store ' +
240
+ 'config to write to an ACL-enabled data source.', { cause: error });
241
+ }
201
242
  throw error;
202
243
  }
203
244
  return { documentId };
204
245
  }
246
+ _isMissingAclError(error) {
247
+ if (this.accessControlList != null)
248
+ return false;
249
+ if (!(error instanceof Error))
250
+ return false;
251
+ if (error.name !== 'ValidationException')
252
+ return false;
253
+ return error.message.toLowerCase().includes('accesscontrollist');
254
+ }
205
255
  /**
206
256
  * Uploads the objects that back one S3 ingestion and returns their `s3://` URIs.
207
257
  *
@@ -224,11 +274,17 @@ export class BedrockKnowledgeBaseStore {
224
274
  const key = `${prefix}${uuidv7()}.txt`;
225
275
  const contentUri = await this._putObject(s3, key, content, 'text/plain; charset=utf-8');
226
276
  const attributes = this._buildS3SidecarAttributes(metadata);
227
- if (Object.keys(attributes).length === 0) {
277
+ const sidecarAcl = this._buildS3SidecarAcl();
278
+ // A sidecar is written only when there is something to put in it: scope/metadata attributes,
279
+ // an ACL, or both.
280
+ if (Object.keys(attributes).length === 0 && sidecarAcl.length === 0) {
228
281
  return { contentUri };
229
282
  }
230
283
  // The sidecar must sit beside the source object and be named `<object-key>.metadata.json`.
231
- const sidecar = JSON.stringify({ metadataAttributes: attributes });
284
+ const sidecarBody = { metadataAttributes: attributes };
285
+ if (sidecarAcl.length > 0)
286
+ sidecarBody.accessControlList = sidecarAcl;
287
+ const sidecar = JSON.stringify(sidecarBody);
232
288
  const sidecarUri = await this._putObject(s3, `${key}.metadata.json`, sidecar, 'application/json');
233
289
  return { contentUri, sidecarUri };
234
290
  }
@@ -304,6 +360,12 @@ export class BedrockKnowledgeBaseStore {
304
360
  */
305
361
  _buildCustomDocument(documentId, content, metadata) {
306
362
  const attrs = this._resolveAttributes(metadata);
363
+ // An inline ACL rides on IN_LINE_ATTRIBUTE metadata, which Bedrock requires to carry at least
364
+ // one attribute; an ACL with no scope/metadata has no valid inline shape.
365
+ if (this.accessControlList && attrs.length === 0) {
366
+ throw new Error('BedrockKnowledgeBaseStore: an inline accessControlList requires at least one metadata ' +
367
+ 'attribute, but this CUSTOM write has none. Set a scope or pass metadata to add().');
368
+ }
307
369
  const document = {
308
370
  content: {
309
371
  dataSourceType: 'CUSTOM',
@@ -321,6 +383,9 @@ export class BedrockKnowledgeBaseStore {
321
383
  document.metadata = {
322
384
  type: 'IN_LINE_ATTRIBUTE',
323
385
  inlineAttributes: attrs.map(({ key, value }) => ({ key, value })),
386
+ ...(this.accessControlList && {
387
+ accessControlList: this.accessControlList,
388
+ }),
324
389
  };
325
390
  }
326
391
  return document;
@@ -338,6 +403,16 @@ export class BedrockKnowledgeBaseStore {
338
403
  }
339
404
  return attributes;
340
405
  }
406
+ /**
407
+ * Builds the `accessControlList` array for an S3 `.metadata.json` sidecar. The sidecar uses
408
+ * capitalized field names (`Name`/`Type`/`Access`), unlike the lowercase keys the `CUSTOM` inline
409
+ * document takes, so entries are translated here.
410
+ */
411
+ _buildS3SidecarAcl() {
412
+ if (!this.accessControlList)
413
+ return [];
414
+ return this.accessControlList.map((entry) => ({ Name: entry.name, Type: entry.type, Access: entry.access }));
415
+ }
341
416
  _validateWriteConfig() {
342
417
  if (this._dataSourceType !== 'CUSTOM' && this._dataSourceType !== 'S3') {
343
418
  throw new Error(`BedrockKnowledgeBaseStore: add requires dataSourceType 'CUSTOM' or 'S3', but it is '${this._dataSourceType ?? 'undefined'}'. ` +
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../../src/vended-memory-stores/bedrock-knowledge-base/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,eAAe,EAAwB,MAAM,uCAAuC,CAAA;AACxH,OAAO,EACL,kBAAkB,EAGlB,mCAAmC,GACpC,MAAM,+BAA+B,CAAA;AAEtC,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAA;AAKnC,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,MAAM,0BAA0B,GAAG,EAAE,CAAA;AAUrC,sGAAsG;AACtG,SAAS,gBAAgB,CAAC,KAAgB;IACxC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,CAAA;IAC5E,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,CAAA;IAC5E,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,CAAA;IAC/E,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;QAChG,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,eAAe,EAAE,KAAK,EAAE,CAAA;IACxD,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAmGD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,yBAAyB;IAC3B,IAAI,CAAQ;IACZ,WAAW,CAAS;IACpB,gBAAgB,CAAS;IACzB,QAAQ,CAAS;IACjB,UAAU,CAA6B;IAE/B,cAAc,CAA2B;IAClD,YAAY,CAAgC;IAC5C,SAAS,CAAsB;IACtB,SAAS,CAA0C;IACnD,gBAAgB,CAAQ;IACxB,eAAe,CAAuC;IACtD,aAAa,CAAoB;IAElD;;;;;OAKG;IACa,KAAK,CAAoB;IACzC,6DAA6D;IAC7C,gBAAgB,CAAQ;IACxC;;;OAGG;IACa,MAAM,CAA6B;IAEnD,YAAY,OAAwC;QAClD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAA;QAEpG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,WAAW,KAAK,SAAS;YAAE,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC7D,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,gBAAgB,GAAG,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAA;YACpF,CAAC;YACD,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAA;QAC1C,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,KAAK,CAAA;QACjC,IAAI,UAAU,KAAK,SAAS;YAAE,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAE1D,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,aAAa,IAAI,IAAI,yBAAyB,CAAC,EAAE,CAAC,CAAA;QAC/E,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,WAAW,CAAA;QACtC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,EAAE,EAAE,MAAM,CAAA;QAClC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,EAAE,CAAA;QAC1B,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,eAAe,CAAA;QAC9C,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,cAAc,CAAA;QAC5C,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,YAAY,CAAA;QAExC,IAAI,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,oBAAoB,EAAE,CAAA;QAE9C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,WAAW,CAAA;QAC9D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAED;;;OAGG;IACK,cAAc;QACpB,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,MAAM,CAAA;QACnC,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAA;QACpF,OAAO,SAAS,CAAA;IAClB,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,OAAuB;QACjD,IAAI,OAAO,EAAE,gBAAgB,KAAK,SAAS,IAAI,OAAO,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;YAC5E,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAA;QACpF,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,EAAE,gBAAgB,IAAI,IAAI,CAAC,gBAAgB,IAAI,0BAA0B,CAAA;QAC9F,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;QAEpC,IAAI,QAAQ,CAAA;QACZ,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CACvC,IAAI,eAAe,CAAC;gBAClB,eAAe,EAAE,IAAI,CAAC,gBAAgB;gBACtC,cAAc,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;gBAC/B,sBAAsB,EAAE;oBACtB,yBAAyB,EAAE;wBACzB,eAAe,EAAE,KAAK;wBACtB,GAAG,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,CAAC;qBAC1B;iBACF;aACF,CAAC,CACH,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CACV,UAAU,IAAI,CAAC,IAAI,uBAAuB,IAAI,CAAC,gBAAgB,aAAa,KAAK,oCAAoC,EACrH,KAAK,CACN,CAAA;YACD,MAAM,KAAK,CAAA;QACb,CAAC;QAED,OAAO,CAAC,QAAQ,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YACtD,MAAM,QAAQ,GAA8B,EAAE,CAAA;YAC9C,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACpB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC3D,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAkB,CAAA;gBACpC,CAAC;YACH,CAAC;YACD,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACpB,QAAQ,CAAC,eAAe,GAAG,MAAM,CAAC,QAAgC,CAAA;YACpE,CAAC;YACD,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;gBACzB,QAAQ,CAAC,eAAe,GAAG,MAAM,CAAC,KAAK,CAAA;YACzC,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE;gBACnC,QAAQ;aACT,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,GAAG,CAAC,OAAe,EAAE,QAAoC;QAC7D,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,iGAAiG,CAAC,CAAA;QACpH,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAA;QAC1E,CAAC;QACD,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAA;QAEpE,8FAA8F;QAC9F,+FAA+F;QAC/F,+FAA+F;QAC/F,wFAAwF;QACxF,IAAI,QAA+B,CAAA;QACnC,IAAI,UAAkB,CAAA;QACtB,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;YACjE,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAA;YAC5C,UAAU,GAAG,UAAU,CAAC,UAAU,CAAA;QACpC,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,MAAM,EAAE,CAAA;YACrB,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;QACrE,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC,IAAI,CAC/B,IAAI,mCAAmC,CAAC;gBACtC,eAAe,EAAE,IAAI,CAAC,gBAAgB;gBACtC,YAAY;gBACZ,SAAS,EAAE,CAAC,QAAQ,CAAC;aACtB,CAAC,CACH,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CACV,UAAU,IAAI,CAAC,IAAI,uBAAuB,IAAI,CAAC,gBAAgB,oBAAoB,YAAY,sBAAsB,cAAc,aAAa,KAAK,8CAA8C,EACnM,KAAK,CACN,CAAA;YACD,MAAM,KAAK,CAAA;QACb,CAAC;QAED,OAAO,EAAE,UAAU,EAAE,CAAA;IACvB,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACK,KAAK,CAAC,gBAAgB,CAC5B,OAAe,EACf,QAAoC;QAEpC,MAAM,EAAE,GAAG,IAAI,CAAC,SAAU,CAAA;QAC1B,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,GAAG,CAAA;QACpE,MAAM,GAAG,GAAG,GAAG,MAAM,GAAG,MAAM,EAAE,MAAM,CAAA;QAEtC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,2BAA2B,CAAC,CAAA;QAEvF,MAAM,UAAU,GAAG,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAA;QAC3D,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzC,OAAO,EAAE,UAAU,EAAE,CAAA;QACvB,CAAC;QAED,2FAA2F;QAC3F,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,kBAAkB,EAAE,UAAU,EAAE,CAAC,CAAA;QAClE,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,GAAG,gBAAgB,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAA;QACjG,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,CAAA;IACnC,CAAC;IAED,oFAAoF;IAC5E,KAAK,CAAC,UAAU,CACtB,EAAgC,EAChC,GAAW,EACX,IAAY,EACZ,WAAmB;QAEnB,IAAI,CAAC;YACH,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAA;YAC/D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAA;YACxC,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC,CAAA;QAChH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CACV,UAAU,IAAI,CAAC,IAAI,gBAAgB,EAAE,CAAC,MAAM,IAAI,GAAG,aAAa,KAAK,uCAAuC,EAC5G,KAAK,CACN,CAAA;YACD,MAAM,KAAK,CAAA;QACb,CAAC;QACD,OAAO,QAAQ,EAAE,CAAC,MAAM,IAAI,GAAG,EAAE,CAAA;IACnC,CAAC;IAED;;;;;;;;OAQG;IACK,gBAAgB,CAAC,EACvB,UAAU,EACV,UAAU,GAIX;QACC,MAAM,QAAQ,GAA0B;YACtC,OAAO,EAAE;gBACP,cAAc,EAAE,IAAI;gBACpB,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE;aACxC;SACF,CAAA;QAED,IAAI,UAAU,EAAE,CAAC;YACf,QAAQ,CAAC,QAAQ,GAAG;gBAClB,IAAI,EAAE,aAAa;gBACnB,UAAU,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE;aAChC,CAAA;QACH,CAAC;QAED,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED;;;;OAIG;IACK,kBAAkB,CACxB,QAAoC;QAEpC,MAAM,KAAK,GAA0D,EAAE,CAAA;QAEvE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QAChG,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACpD,IAAI,IAAI,CAAC,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBAChD,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,WAAW,GAAG,+DAA+D,CAAC,CAAA;oBAC7G,SAAQ;gBACV,CAAC;gBACD,MAAM,cAAc,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAA;gBAC9C,IAAI,cAAc,EAAE,CAAC;oBACnB,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAA;gBAC5C,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,IAAI,WAAW,GAAG,iDAAiD,CAAC,CAAA;gBAClG,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;IAED;;;;;OAKG;IACK,oBAAoB,CAC1B,UAAkB,EAClB,OAAe,EACf,QAAoC;QAEpC,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAA;QAE/C,MAAM,QAAQ,GAA0B;YACtC,OAAO,EAAE;gBACP,cAAc,EAAE,QAAQ;gBACxB,MAAM,EAAE;oBACN,wBAAwB,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE;oBAC5C,UAAU,EAAE,SAAS;oBACrB,aAAa,EAAE;wBACb,IAAI,EAAE,MAAM;wBACZ,WAAW,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;qBAC/B;iBACF;aACF;SACF,CAAA;QAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,QAAQ,CAAC,QAAQ,GAAG;gBAClB,IAAI,EAAE,mBAAmB;gBACzB,gBAAgB,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;aAClE,CAAA;QACH,CAAC;QAED,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED;;;;OAIG;IACK,yBAAyB,CAAC,QAAoC;QACpE,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAA;QAC/C,MAAM,UAAU,GAAuC,EAAE,CAAA;QACzD,KAAK,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,KAAK,EAAE,CAAC;YACnC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAA;QACzD,CAAC;QACD,OAAO,UAAU,CAAA;IACnB,CAAC;IAEO,oBAAoB;QAC1B,IAAI,IAAI,CAAC,eAAe,KAAK,QAAQ,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI,EAAE,CAAC;YACvE,MAAM,IAAI,KAAK,CACb,uFAAuF,IAAI,CAAC,eAAe,IAAI,WAAW,KAAK;gBAC7H,iCAAiC,CACpC,CAAA;QACH,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CACb,4EAA4E;gBAC1E,2CAA2C,CAC9C,CAAA;QACH,CAAC;QACD,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CACb,gFAAgF;gBAC9E,4CAA4C,CAC/C,CAAA;QACH,CAAC;QACD,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,aAAa,EAAE,cAAc,EAAE,IAAI,CAAC,eAAe,EAAE,CAAA;IACnF,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAA;YACrE,IAAI,CAAC,SAAS,GAAG,IAAI,YAAY,CAAC,EAAE,CAAC,CAAA;QACvC,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,YAAY,GAAG,IAAI,kBAAkB,CAAC,EAAE,CAAC,CAAA;QAChD,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;CACF"}
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=plugin.test.d.ts.map
@@ -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":"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"}
@@ -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"}
@@ -0,0 +1,41 @@
1
+ import { InvokeModelStage } from '../../middleware/index.js';
2
+ import { createInjectionMiddleware } from '../../injection/message-injection.js';
3
+ /**
4
+ * Plugin that injects just-in-time context into the model input before each call.
5
+ *
6
+ * Before each model call, the plugin asks {@link ContextInjectorConfig.renderContent} for text and
7
+ * makes it available to the model for that call, gated by {@link ContextInjectorConfig.trigger}. The
8
+ * injected text is ephemeral: it augments the model input for that one call and never persists into the
9
+ * durable conversation or session.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * import { Agent } from '@strands-agents/sdk'
14
+ * import { ContextInjector } from '@strands-agents/sdk/vended-plugins/context-injector'
15
+ *
16
+ * const agent = new Agent({
17
+ * model,
18
+ * plugins: [new ContextInjector({ renderContent: async () => `<now>${new Date().toISOString()}</now>` })],
19
+ * })
20
+ * ```
21
+ *
22
+ * @remarks
23
+ * Multiple injectors may be registered; each contributes its text independently, in plugin-registration
24
+ * order.
25
+ */
26
+ export class ContextInjector {
27
+ name;
28
+ _config;
29
+ constructor(config) {
30
+ this.name = config.name ?? 'strands:context-injector';
31
+ this._config = config;
32
+ }
33
+ initAgent(agent) {
34
+ const config = this._config;
35
+ agent.addMiddleware(InvokeModelStage.Input, createInjectionMiddleware({
36
+ ...(config.trigger !== undefined && { trigger: config.trigger }),
37
+ renderContent: config.renderContent,
38
+ }));
39
+ }
40
+ }
41
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../../src/vended-plugins/context-injector/plugin.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAA;AA0BhF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,OAAO,eAAe;IACjB,IAAI,CAAQ;IAEJ,OAAO,CAAuB;IAE/C,YAAY,MAA6B;QACvC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,0BAA0B,CAAA;QACrD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACvB,CAAC;IAED,SAAS,CAAC,KAAiB;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAA;QAC3B,KAAK,CAAC,aAAa,CACjB,gBAAgB,CAAC,KAAK,EACtB,yBAAyB,CAAC;YACxB,GAAG,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;YAChE,aAAa,EAAE,MAAM,CAAC,aAAa;SACpC,CAAC,CACH,CAAA;IACH,CAAC;CACF"}
@@ -1,7 +1,7 @@
1
1
  import { describe, it, expect, vi } from 'vitest';
2
2
  import { ContextOffloader } from '../plugin.js';
3
3
  import { InMemoryStorage } from '../storage.js';
4
- import { AfterToolCallEvent } from '../../../hooks/events.js';
4
+ import { AfterToolCallEvent, BeforeModelCallEvent } from '../../../hooks/events.js';
5
5
  import { TextBlock, JsonBlock, ToolResultBlock } from '../../../types/messages.js';
6
6
  import { ImageBlock, VideoBlock, DocumentBlock } from '../../../types/media.js';
7
7
  import { createMockAgent, invokeTrackedHook } from '../../../__fixtures__/agent-helpers.js';
@@ -42,12 +42,14 @@ describe('ContextOffloader', () => {
42
42
  const plugin = new ContextOffloader({ storage: new InMemoryStorage() });
43
43
  expect(plugin.name).toBe('strands:context-offloader');
44
44
  });
45
- it('registers AfterToolCallEvent hook', () => {
45
+ it('registers hooks', () => {
46
46
  const plugin = new ContextOffloader({ storage: new InMemoryStorage() });
47
47
  const agent = createMockAgent();
48
48
  plugin.initAgent(agent);
49
- expect(agent.trackedHooks).toHaveLength(1);
50
- expect(agent.trackedHooks[0].eventType).toBe(AfterToolCallEvent);
49
+ expect(agent.trackedHooks).toHaveLength(2);
50
+ const eventTypes = agent.trackedHooks.map((h) => h.eventType);
51
+ expect(eventTypes).toContain(AfterToolCallEvent);
52
+ expect(eventTypes).toContain(BeforeModelCallEvent);
51
53
  });
52
54
  it('returns retrieval tool by default', () => {
53
55
  const plugin = new ContextOffloader({ storage: new InMemoryStorage() });
@@ -496,5 +498,42 @@ describe('ContextOffloader', () => {
496
498
  expect(result).not.toContain('line 2');
497
499
  });
498
500
  });
501
+ describe('eviction via BeforeModelCallEvent', () => {
502
+ it('calls _evict on storage with incrementing cycle count', () => {
503
+ const storage = new InMemoryStorage(5);
504
+ const plugin = new ContextOffloader({ storage, maxResultTokens: 10, previewTokens: 5 });
505
+ const agent = createMockAgent();
506
+ plugin.initAgent(agent);
507
+ const hook = agent.trackedHooks.find((h) => h.eventType === BeforeModelCallEvent);
508
+ const event = new BeforeModelCallEvent({ agent, model: mockModel, invocationState: {} });
509
+ hook.callback(event);
510
+ expect(storage._currentCycle).toBe(1);
511
+ hook.callback(event);
512
+ expect(storage._currentCycle).toBe(2);
513
+ });
514
+ it('evicts stale entries on BeforeModelCallEvent', async () => {
515
+ const storage = new InMemoryStorage(2);
516
+ const plugin = new ContextOffloader({ storage, maxResultTokens: 10, previewTokens: 5 });
517
+ const agent = createMockAgent();
518
+ plugin.initAgent(agent);
519
+ const ref = await storage.store('key1', new TextEncoder().encode('test'));
520
+ const hook = agent.trackedHooks.find((h) => h.eventType === BeforeModelCallEvent);
521
+ const event = new BeforeModelCallEvent({ agent, model: mockModel, invocationState: {} });
522
+ // Advance 3 cycles: threshold = 3 - 2 = 1, stored at 0, 0 < 1 → evicted
523
+ hook.callback(event);
524
+ hook.callback(event);
525
+ hook.callback(event);
526
+ await expect(storage.retrieve(ref)).rejects.toThrow('Reference not found');
527
+ });
528
+ it('does not crash when storage lacks _evict', () => {
529
+ const storage = { store: vi.fn(), retrieve: vi.fn() };
530
+ const plugin = new ContextOffloader({ storage, maxResultTokens: 10, previewTokens: 5 });
531
+ const agent = createMockAgent();
532
+ plugin.initAgent(agent);
533
+ const hook = agent.trackedHooks.find((h) => h.eventType === BeforeModelCallEvent);
534
+ const event = new BeforeModelCallEvent({ agent, model: mockModel, invocationState: {} });
535
+ expect(() => hook.callback(event)).not.toThrow();
536
+ });
537
+ });
499
538
  });
500
539
  //# sourceMappingURL=plugin.test.js.map