@mastra/s3vectors 1.0.0-beta.1 → 1.0.0-beta.2

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/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # @mastra/s3vectors
2
2
 
3
+ ## 1.0.0-beta.2
4
+
5
+ ### Patch Changes
6
+
7
+ - Standardize error IDs across all storage and vector stores using centralized helper functions (`createStorageErrorId` and `createVectorErrorId`). This ensures consistent error ID patterns (`MASTRA_STORAGE_{STORE}_{OPERATION}_{STATUS}` and `MASTRA_VECTOR_{STORE}_{OPERATION}_{STATUS}`) across the codebase for better error tracking and debugging. ([#10913](https://github.com/mastra-ai/mastra/pull/10913))
8
+
9
+ - Updated dependencies [[`3076c67`](https://github.com/mastra-ai/mastra/commit/3076c6778b18988ae7d5c4c5c466366974b2d63f), [`85d7ee1`](https://github.com/mastra-ai/mastra/commit/85d7ee18ff4e14d625a8a30ec6656bb49804989b), [`c6c1092`](https://github.com/mastra-ai/mastra/commit/c6c1092f8fbf76109303f69e000e96fd1960c4ce), [`81dc110`](https://github.com/mastra-ai/mastra/commit/81dc11008d147cf5bdc8996ead1aa61dbdebb6fc), [`7aedb74`](https://github.com/mastra-ai/mastra/commit/7aedb74883adf66af38e270e4068fd42e7a37036), [`8f02d80`](https://github.com/mastra-ai/mastra/commit/8f02d800777397e4b45d7f1ad041988a8b0c6630), [`d7aad50`](https://github.com/mastra-ai/mastra/commit/d7aad501ce61646b76b4b511e558ac4eea9884d0), [`ce0a73a`](https://github.com/mastra-ai/mastra/commit/ce0a73abeaa75b10ca38f9e40a255a645d50ebfb), [`a02e542`](https://github.com/mastra-ai/mastra/commit/a02e542d23179bad250b044b17ff023caa61739f), [`a372c64`](https://github.com/mastra-ai/mastra/commit/a372c640ad1fd12e8f0613cebdc682fc156b4d95), [`8846867`](https://github.com/mastra-ai/mastra/commit/8846867ffa9a3746767618e314bebac08eb77d87), [`42a42cf`](https://github.com/mastra-ai/mastra/commit/42a42cf3132b9786feecbb8c13c583dce5b0e198), [`ae08bf0`](https://github.com/mastra-ai/mastra/commit/ae08bf0ebc6a4e4da992b711c4a389c32ba84cf4), [`21735a7`](https://github.com/mastra-ai/mastra/commit/21735a7ef306963554a69a89b44f06c3bcd85141), [`1d877b8`](https://github.com/mastra-ai/mastra/commit/1d877b8d7b536a251c1a7a18db7ddcf4f68d6f8b)]:
10
+ - @mastra/core@1.0.0-beta.7
11
+
3
12
  ## 1.0.0-beta.1
4
13
 
5
14
  ### Patch Changes
package/dist/index.cjs CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  var clientS3vectors = require('@aws-sdk/client-s3vectors');
4
4
  var error = require('@mastra/core/error');
5
+ var storage = require('@mastra/core/storage');
5
6
  var vector = require('@mastra/core/vector');
6
7
  var uuid = require('uuid');
7
8
  var filter = require('@mastra/core/vector/filter');
@@ -182,7 +183,7 @@ var S3Vectors = class _S3Vectors extends vector.MastraVector {
182
183
  if (!opts?.vectorBucketName) {
183
184
  throw new error.MastraError(
184
185
  {
185
- id: "STORAGE_S3VECTORS_VECTOR_MISSING_BUCKET_NAME",
186
+ id: storage.createVectorErrorId("S3VECTORS", "INITIALIZATION", "MISSING_BUCKET_NAME"),
186
187
  domain: error.ErrorDomain.STORAGE,
187
188
  category: error.ErrorCategory.USER
188
189
  },
@@ -209,7 +210,7 @@ var S3Vectors = class _S3Vectors extends vector.MastraVector {
209
210
  } catch (error$1) {
210
211
  throw new error.MastraError(
211
212
  {
212
- id: "STORAGE_S3VECTORS_VECTOR_DISCONNECT_FAILED",
213
+ id: storage.createVectorErrorId("S3VECTORS", "DISCONNECT", "FAILED"),
213
214
  domain: error.ErrorDomain.STORAGE,
214
215
  category: error.ErrorCategory.THIRD_PARTY
215
216
  },
@@ -237,7 +238,7 @@ var S3Vectors = class _S3Vectors extends vector.MastraVector {
237
238
  } catch (error$1) {
238
239
  throw new error.MastraError(
239
240
  {
240
- id: "STORAGE_S3VECTORS_VECTOR_CREATE_INDEX_INVALID_ARGS",
241
+ id: storage.createVectorErrorId("S3VECTORS", "CREATE_INDEX", "INVALID_ARGS"),
241
242
  domain: error.ErrorDomain.STORAGE,
242
243
  category: error.ErrorCategory.USER,
243
244
  details: { indexName, dimension, metric }
@@ -264,7 +265,7 @@ var S3Vectors = class _S3Vectors extends vector.MastraVector {
264
265
  }
265
266
  throw new error.MastraError(
266
267
  {
267
- id: "STORAGE_S3VECTORS_VECTOR_CREATE_INDEX_FAILED",
268
+ id: storage.createVectorErrorId("S3VECTORS", "CREATE_INDEX", "FAILED"),
268
269
  domain: error.ErrorDomain.STORAGE,
269
270
  category: error.ErrorCategory.THIRD_PARTY,
270
271
  details: { indexName, dimension, metric }
@@ -303,7 +304,7 @@ var S3Vectors = class _S3Vectors extends vector.MastraVector {
303
304
  } catch (error$1) {
304
305
  throw new error.MastraError(
305
306
  {
306
- id: "STORAGE_S3VECTORS_VECTOR_UPSERT_FAILED",
307
+ id: storage.createVectorErrorId("S3VECTORS", "UPSERT", "FAILED"),
307
308
  domain: error.ErrorDomain.STORAGE,
308
309
  category: error.ErrorCategory.THIRD_PARTY,
309
310
  details: { indexName }
@@ -385,7 +386,7 @@ var S3Vectors = class _S3Vectors extends vector.MastraVector {
385
386
  } catch (error$1) {
386
387
  throw new error.MastraError(
387
388
  {
388
- id: "STORAGE_S3VECTORS_VECTOR_QUERY_FAILED",
389
+ id: storage.createVectorErrorId("S3VECTORS", "QUERY", "FAILED"),
389
390
  domain: error.ErrorDomain.STORAGE,
390
391
  category: error.ErrorCategory.THIRD_PARTY,
391
392
  details: { indexName }
@@ -420,7 +421,7 @@ var S3Vectors = class _S3Vectors extends vector.MastraVector {
420
421
  } catch (error$1) {
421
422
  throw new error.MastraError(
422
423
  {
423
- id: "STORAGE_S3VECTORS_VECTOR_LIST_INDEXES_FAILED",
424
+ id: storage.createVectorErrorId("S3VECTORS", "LIST_INDEXES", "FAILED"),
424
425
  domain: error.ErrorDomain.STORAGE,
425
426
  category: error.ErrorCategory.THIRD_PARTY
426
427
  },
@@ -446,7 +447,7 @@ var S3Vectors = class _S3Vectors extends vector.MastraVector {
446
447
  } catch (error$1) {
447
448
  throw new error.MastraError(
448
449
  {
449
- id: "STORAGE_S3VECTORS_VECTOR_DESCRIBE_INDEX_FAILED",
450
+ id: storage.createVectorErrorId("S3VECTORS", "DESCRIBE_INDEX", "FAILED"),
450
451
  domain: error.ErrorDomain.STORAGE,
451
452
  category: error.ErrorCategory.THIRD_PARTY,
452
453
  details: { indexName }
@@ -468,7 +469,7 @@ var S3Vectors = class _S3Vectors extends vector.MastraVector {
468
469
  } catch (error$1) {
469
470
  throw new error.MastraError(
470
471
  {
471
- id: "STORAGE_S3VECTORS_VECTOR_DELETE_INDEX_FAILED",
472
+ id: storage.createVectorErrorId("S3VECTORS", "DELETE_INDEX", "FAILED"),
472
473
  domain: error.ErrorDomain.STORAGE,
473
474
  category: error.ErrorCategory.THIRD_PARTY,
474
475
  details: { indexName }
@@ -491,7 +492,7 @@ var S3Vectors = class _S3Vectors extends vector.MastraVector {
491
492
  async updateVector({ indexName, id, update }) {
492
493
  if (!id) {
493
494
  throw new error.MastraError({
494
- id: "STORAGE_S3VECTORS_VECTOR_UPDATE_VECTOR_INVALID_ARGS",
495
+ id: storage.createVectorErrorId("S3VECTORS", "UPDATE_VECTOR", "INVALID_ARGS"),
495
496
  domain: error.ErrorDomain.STORAGE,
496
497
  category: error.ErrorCategory.USER,
497
498
  text: "id is required for S3Vectors updateVector",
@@ -528,7 +529,7 @@ var S3Vectors = class _S3Vectors extends vector.MastraVector {
528
529
  } catch (error$1) {
529
530
  throw new error.MastraError(
530
531
  {
531
- id: "STORAGE_S3VECTORS_VECTOR_UPDATE_VECTOR_FAILED",
532
+ id: storage.createVectorErrorId("S3VECTORS", "UPDATE_VECTOR", "FAILED"),
532
533
  domain: error.ErrorDomain.STORAGE,
533
534
  category: error.ErrorCategory.THIRD_PARTY,
534
535
  details: {
@@ -560,7 +561,7 @@ var S3Vectors = class _S3Vectors extends vector.MastraVector {
560
561
  } catch (error$1) {
561
562
  throw new error.MastraError(
562
563
  {
563
- id: "STORAGE_S3VECTORS_VECTOR_DELETE_VECTOR_FAILED",
564
+ id: storage.createVectorErrorId("S3VECTORS", "DELETE_VECTOR", "FAILED"),
564
565
  domain: error.ErrorDomain.STORAGE,
565
566
  category: error.ErrorCategory.THIRD_PARTY,
566
567
  details: {
@@ -574,7 +575,7 @@ var S3Vectors = class _S3Vectors extends vector.MastraVector {
574
575
  }
575
576
  async deleteVectors({ indexName, filter, ids }) {
576
577
  throw new error.MastraError({
577
- id: "STORAGE_S3VECTORS_VECTOR_DELETE_VECTORS_NOT_SUPPORTED",
578
+ id: storage.createVectorErrorId("S3VECTORS", "DELETE_VECTORS", "NOT_SUPPORTED"),
578
579
  text: "deleteVectors is not yet implemented for S3Vectors vector store",
579
580
  domain: error.ErrorDomain.STORAGE,
580
581
  category: error.ErrorCategory.SYSTEM,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/vector/filter.ts","../src/vector/index.ts","../src/vector/prompt.ts"],"names":["BaseFilterTranslator","MastraVector","MastraError","ErrorDomain","ErrorCategory","S3VectorsClient","error","CreateIndexCommand","uuidv4","PutVectorsCommand","QueryVectorsCommand","GetVectorsCommand","ListIndexesCommand","DeleteIndexCommand","DeleteVectorsCommand","GetIndexCommand","ListVectorsCommand"],"mappings":"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","file":"index.cjs","sourcesContent":["import { BaseFilterTranslator } from '@mastra/core/vector/filter';\nimport type {\n VectorFilter,\n LogicalOperatorValueMap,\n OperatorSupport,\n QueryOperator,\n OperatorValueMap,\n BlacklistedRootOperators,\n} from '@mastra/core/vector/filter';\n\n/**\n * S3 Vectors supports a strict subset of operators and value types.\n *\n * - logical: `$and`, `$or` (non-empty arrays)\n * - basic: `$eq`, `$ne` (string | number | boolean)\n * - numeric: `$gt`, `$gte`, `$lt`, `$lte` (number)\n * - array: `$in`, `$nin` (non-empty arrays of string | number | boolean)\n * - element: `$exists` (boolean)\n */\ntype S3VectorsOperatorValueMap = Pick<\n OperatorValueMap,\n '$eq' | '$ne' | '$gt' | '$gte' | '$lt' | '$lte' | '$in' | '$nin' | '$exists'\n>;\n\ntype S3VectorsLogicalOperatorValueMap = Pick<LogicalOperatorValueMap, '$and' | '$or'>;\n\ntype S3VectorsBlacklisted = BlacklistedRootOperators;\n\ntype S3VectorsFieldValue = string | number | boolean;\n\n/**\n * High-level filter type accepted by this translator.\n * @remarks\n * Field values are limited to string/number/boolean at equality positions.\n */\nexport type S3VectorsFilter = VectorFilter<\n keyof S3VectorsOperatorValueMap,\n S3VectorsOperatorValueMap,\n S3VectorsLogicalOperatorValueMap,\n S3VectorsBlacklisted,\n S3VectorsFieldValue\n>;\n\n/**\n * Translates a high-level filter into the S3 Vectors filter shape.\n *\n * @remarks\n * - Canonicalizes **implicit AND** (e.g. `{a:1,b:2}`) into explicit `{$and:[{a:1},{b:2}]}` in any\n * non-field context that lacks `$and/$or`.\n * - Normalizes `Date` values to epoch milliseconds where allowed (numeric comparisons and array elements).\n * - Disallows `Date` at equality positions (including implicit equality).\n * - Validates shapes using the base class after translation.\n */\nexport class S3VectorsFilterTranslator extends BaseFilterTranslator<S3VectorsFilter> {\n /** @inheritdoc */\n protected override getSupportedOperators(): OperatorSupport {\n return {\n logical: ['$and', '$or'],\n basic: ['$eq', '$ne'],\n numeric: ['$gt', '$gte', '$lt', '$lte'],\n array: ['$in', '$nin'],\n element: ['$exists'],\n };\n }\n\n /**\n * Translates and validates a filter.\n * @param filter - Input filter; may be `undefined`, `null`, or `{}` (all treated as empty).\n * @returns The translated filter (or the original value if empty).\n */\n translate(filter?: S3VectorsFilter): any {\n if (this.isEmpty(filter)) return filter;\n // Perform translation (including Date → number normalization) before base shape validation.\n const translated = this.translateNode(filter as any, false);\n this.validateFilter(translated as any);\n return translated;\n }\n\n /**\n * Recursively translates a node.\n * @param node - Current node to translate.\n * @param inFieldValue - When `true`, the node is the value of a field (i.e., equality context).\n * @remarks\n * - In a **field-value** context, only primitives or operator objects are allowed.\n * - In a **non-field** context (root / logical branches), operator keys are processed;\n * plain keys become field equalities and are validated.\n * - Implicit AND is canonicalized in non-field contexts when multiple non-logical keys exist.\n */\n private translateNode(node: any, inFieldValue = false): any {\n // Primitive or Date (normalize when in a field-equality context)\n if (this.isPrimitive(node) || node instanceof Date) {\n return inFieldValue ? this.validateAndNormalizePrimitive(node) : node;\n }\n\n // Arrays are not allowed as direct equality values\n if (Array.isArray(node)) {\n if (inFieldValue) {\n throw new Error('Array equality is not supported in S3 Vectors. Use $in / $nin operators.');\n }\n return node;\n }\n\n // Object\n const entries = Object.entries(node as Record<string, any>);\n\n if (inFieldValue) {\n if (entries.length === 0) {\n throw new Error('Invalid equality value. Only string, number, or boolean are supported by S3 Vectors');\n }\n const allOperatorKeys = entries.every(([k]) => this.isOperator(k));\n if (!allOperatorKeys) {\n // Disallow shapes like: { field: { a:1, b:2 } }\n throw new Error('Invalid equality value. Only string, number, or boolean are supported by S3 Vectors');\n }\n const opEntries = entries.map(([key, value]) => [key, this.translateOperatorValue(key as QueryOperator, value)]);\n return Object.fromEntries(opEntries);\n }\n\n // Root / filter context\n const translatedEntries = entries.map(([key, value]) => {\n if (this.isOperator(key)) {\n return [key, this.translateOperatorValue(key as QueryOperator, value)];\n }\n return [key, this.translateNode(value, true)];\n });\n const obj = Object.fromEntries(translatedEntries);\n\n // Canonicalize implicit AND → explicit $and (if no $and/$or present and multiple non-logical keys)\n const keys = Object.keys(obj);\n const hasLogical = keys.some(k => k === '$and' || k === '$or');\n if (!hasLogical) {\n const nonLogical = keys.filter(k => k !== '$and' && k !== '$or');\n if (nonLogical.length > 1) {\n return { $and: nonLogical.map(k => ({ [k]: obj[k] })) };\n }\n }\n\n return obj;\n }\n\n /**\n * Translates a single operator and validates its value.\n * @param operator - One of the supported query operators.\n * @param value - Operator value to normalize/validate.\n */\n private translateOperatorValue(operator: QueryOperator, value: any): any {\n // Logical operators\n if (operator === '$and' || operator === '$or') {\n if (!Array.isArray(value) || value.length === 0) {\n throw new Error(`Value for logical operator ${operator} must be a non-empty array`);\n }\n return value.map(item => this.translateNode(item));\n }\n\n // Equality / inequality (Date is not allowed)\n if (operator === '$eq' || operator === '$ne') {\n if (value instanceof Date) {\n throw new Error('Invalid equality value. Only string, number, or boolean are supported by S3 Vectors');\n }\n return this.toPrimitiveForS3(value, operator);\n }\n\n // Numeric comparisons: require number; allow Date by converting to epoch ms\n if (operator === '$gt' || operator === '$gte' || operator === '$lt' || operator === '$lte') {\n const n = this.toNumberForRange(value, operator);\n return n;\n }\n\n // Array operators: non-empty arrays of primitives (Date converted to number)\n if (operator === '$in' || operator === '$nin') {\n if (!Array.isArray(value) || value.length === 0) {\n throw new Error(`Value for array operator ${operator} must be a non-empty array`);\n }\n return value.map(v => this.toPrimitiveForS3(v, operator));\n }\n\n // Existence check\n if (operator === '$exists') {\n if (typeof value !== 'boolean') {\n throw new Error(`Value for $exists operator must be a boolean`);\n }\n return value;\n }\n\n throw new Error(`Unsupported operator: ${operator}`);\n }\n\n /**\n * Normalizes a value to an S3-accepted primitive.\n * @param value - String | Number | Boolean | Date.\n * @param operatorForMessage - Operator name used in error messages.\n * @returns The normalized primitive; `Date` becomes epoch milliseconds.\n * @throws If the value is not a supported primitive or is null/undefined.\n */\n private toPrimitiveForS3(value: any, operatorForMessage: string): string | number | boolean {\n if (value === null || value === undefined) {\n // Error message for equality matches tests\n if (operatorForMessage === 'equality') {\n throw new Error('S3 Vectors does not support null/undefined for equality');\n }\n throw new Error(`Value for ${operatorForMessage} must be string, number, or boolean`);\n }\n if (value instanceof Date) {\n return value.getTime();\n }\n const t = typeof value;\n if (t === 'string' || t === 'boolean') return value;\n if (t === 'number') return Object.is(value, -0) ? 0 : value;\n throw new Error(`Value for ${operatorForMessage} must be string, number, or boolean`);\n }\n\n /**\n * Ensures a numeric value for range operators; allows `Date` by converting to epoch ms.\n * @param value - Candidate value.\n * @param operatorForMessage - Operator name used in error messages.\n * @throws If the value is not a number (or a Date).\n */\n private toNumberForRange(value: any, operatorForMessage: string): number {\n if (value instanceof Date) return value.getTime();\n if (typeof value === 'number' && !Number.isNaN(value)) return Object.is(value, -0) ? 0 : value;\n throw new Error(`Value for ${operatorForMessage} must be a number`);\n }\n\n /**\n * Validates and normalizes a primitive used in field equality (implicit `$eq`).\n * @param value - Candidate equality value.\n * @throws If the value is a `Date` or not a supported primitive.\n */\n private validateAndNormalizePrimitive(value: any): S3VectorsFieldValue {\n if (value instanceof Date) {\n throw new Error('Invalid equality value. Only string, number, or boolean are supported by S3 Vectors');\n }\n return this.toPrimitiveForS3(value, 'equality') as S3VectorsFieldValue;\n }\n\n /**\n * Determines whether a filter is considered empty.\n * @param filter - Input filter.\n */\n protected override isEmpty(filter: any): boolean {\n return filter === undefined || filter === null || (typeof filter === 'object' && Object.keys(filter).length === 0);\n }\n}\n","import {\n S3VectorsClient,\n CreateIndexCommand,\n DeleteIndexCommand,\n ListIndexesCommand,\n GetIndexCommand,\n PutVectorsCommand,\n QueryVectorsCommand,\n GetVectorsCommand,\n DeleteVectorsCommand,\n ListVectorsCommand,\n} from '@aws-sdk/client-s3vectors';\nimport type { S3VectorsClientConfig } from '@aws-sdk/client-s3vectors';\nimport { MastraError, ErrorDomain, ErrorCategory } from '@mastra/core/error';\nimport { MastraVector } from '@mastra/core/vector';\nimport type {\n QueryResult,\n IndexStats,\n CreateIndexParams,\n UpsertVectorParams,\n DeleteVectorsParams,\n QueryVectorParams,\n DescribeIndexParams,\n DeleteIndexParams,\n DeleteVectorParams,\n UpdateVectorParams,\n} from '@mastra/core/vector';\nimport { v4 as uuidv4 } from 'uuid';\nimport { S3VectorsFilterTranslator } from './filter';\nimport type { S3VectorsFilter } from './filter';\n\n/**\n * Options for the S3Vectors store.\n * @property vectorBucketName - Target S3 Vectors bucket name.\n * @property clientConfig - AWS SDK client options (e.g., region/credentials).\n * @property nonFilterableMetadataKeys - Metadata keys that must not be filterable (forwarded to S3 Vectors).\n */\nexport interface S3VectorsOptions {\n vectorBucketName: string;\n clientConfig?: S3VectorsClientConfig;\n nonFilterableMetadataKeys?: string[];\n}\n\ntype S3DistanceMetric = 'cosine' | 'euclidean';\ntype MastraMetric = NonNullable<CreateIndexParams['metric']>;\ntype SupportedMastraMetric = Exclude<MastraMetric, 'dotproduct'>;\n\n/**\n * Vector store backed by Amazon S3 Vectors.\n *\n * @remarks\n * - Supports `cosine` and `euclidean` distance metrics.\n * - Filters must use explicit logical operators (`$and` / `$or`). The attached translator\n * canonicalizes implicit AND (e.g., `{a:1,b:2}` → `{ $and: [{a:1},{b:2}] }`) where permitted by spec.\n * - Methods wrap AWS errors in `MastraError` with domain/category metadata.\n */\nexport class S3Vectors extends MastraVector<S3VectorsFilter> {\n private readonly client: S3VectorsClient;\n private readonly vectorBucketName: string;\n private readonly nonFilterableMetadataKeys?: string[];\n private readonly filterTranslator = new S3VectorsFilterTranslator();\n\n private static readonly METRIC_MAP: Record<SupportedMastraMetric, S3DistanceMetric> = {\n cosine: 'cosine',\n euclidean: 'euclidean',\n } as const;\n\n constructor(opts: S3VectorsOptions & { id: string }) {\n super({ id: opts.id });\n if (!opts?.vectorBucketName) {\n throw new MastraError(\n {\n id: 'STORAGE_S3VECTORS_VECTOR_MISSING_BUCKET_NAME',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n new Error('vectorBucketName is required'),\n );\n }\n this.vectorBucketName = opts.vectorBucketName;\n this.nonFilterableMetadataKeys = opts.nonFilterableMetadataKeys;\n this.client = new S3VectorsClient({ ...(opts.clientConfig ?? {}) });\n }\n\n /**\n * No-op to satisfy the base interface.\n *\n * @remarks The AWS SDK manages HTTP per request; no persistent connection is needed.\n */\n async connect(): Promise<void> {}\n\n /**\n * Closes the underlying AWS SDK HTTP handler to free sockets.\n */\n async disconnect(): Promise<void> {\n try {\n this.client.destroy();\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_S3VECTORS_VECTOR_DISCONNECT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /**\n * Creates an index or validates an existing one.\n *\n * @param params.indexName - Logical index name; normalized internally.\n * @param params.dimension - Vector dimension (must be a positive integer).\n * @param params.metric - Distance metric (`cosine` | `euclidean`). Defaults to `cosine`.\n * @throws {MastraError} If arguments are invalid or AWS returns an error.\n * @remarks\n * On `ConflictException`, we verify the existing index schema via the parent implementation\n * and return if it matches.\n */\n async createIndex({ indexName, dimension, metric = 'cosine' }: CreateIndexParams): Promise<void> {\n indexName = normalizeIndexName(indexName);\n\n let s3Metric: S3DistanceMetric;\n try {\n assertPositiveInteger(dimension, 'dimension');\n s3Metric = S3Vectors.toS3Metric(metric);\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_S3VECTORS_VECTOR_CREATE_INDEX_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName, dimension, metric },\n },\n error,\n );\n }\n\n try {\n const input: any = {\n ...this.bucketParams(),\n indexName,\n dataType: 'float32',\n dimension,\n distanceMetric: s3Metric,\n };\n if (this.nonFilterableMetadataKeys?.length) {\n input.metadataConfiguration = { nonFilterableMetadataKeys: this.nonFilterableMetadataKeys };\n }\n\n await this.client.send(new CreateIndexCommand(input));\n } catch (error: any) {\n if (error?.name === 'ConflictException') {\n await this.validateExistingIndex(indexName, dimension, metric);\n return;\n }\n throw new MastraError(\n {\n id: 'STORAGE_S3VECTORS_VECTOR_CREATE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName, dimension, metric },\n },\n error,\n );\n }\n }\n\n /**\n * Upserts vectors in bulk.\n *\n * @param params.indexName - Index to write to.\n * @param params.vectors - Array of vectors; each must match the index dimension.\n * @param params.metadata - Optional metadata per vector; `Date` values are normalized to epoch ms.\n * @param params.ids - Optional explicit IDs; if omitted, UUIDs are generated.\n * @returns Array of IDs used for the upsert (explicit or generated).\n * @throws {MastraError} If validation fails or AWS returns an error.\n */\n async upsert({ indexName, vectors, metadata, ids }: UpsertVectorParams): Promise<string[]> {\n indexName = normalizeIndexName(indexName);\n try {\n const { dimension } = await this.getIndexInfo(indexName);\n validateVectorDimensions(vectors, dimension);\n\n const generatedIds = ids ?? vectors.map(() => uuidv4());\n\n const putInput = {\n ...this.bucketParams(),\n indexName,\n vectors: vectors.map((vec, i) => ({\n key: generatedIds[i],\n data: { float32: vec },\n metadata: normalizeMetadata(metadata?.[i]),\n })),\n };\n\n await this.client.send(new PutVectorsCommand(putInput));\n return generatedIds;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_S3VECTORS_VECTOR_UPSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n /**\n * Queries nearest neighbors.\n *\n * @param params.indexName - Target index.\n * @param params.queryVector - Query vector (non-empty float32 array).\n * @param params.topK - Number of neighbors to return (positive integer). Defaults to 10.\n * @param params.filter - Metadata filter using explicit `$and`/`$or` (translator canonicalizes implicit AND).\n * @param params.includeVector - If `true`, fetches missing vector data in a second call.\n * @returns Results sorted by `score` descending.\n * @throws {MastraError} If validation fails or AWS returns an error.\n * @remarks\n * `score = 1/(1+distance)` (monotonic transform), so ranking matches the underlying distance.\n */\n async query({\n indexName,\n queryVector,\n topK = 10,\n filter,\n includeVector = false,\n }: QueryVectorParams<S3VectorsFilter>): Promise<QueryResult[]> {\n indexName = normalizeIndexName(indexName);\n\n try {\n if (!Array.isArray(queryVector) || queryVector.length === 0) {\n throw new Error('queryVector must be a non-empty float32 array');\n }\n assertPositiveInteger(topK, 'topK');\n\n const translated = this.transformFilter(filter);\n\n const out = await this.client.send(\n new QueryVectorsCommand({\n ...this.bucketParams(),\n indexName,\n topK,\n queryVector: { float32: queryVector },\n filter: translated && Object.keys(translated).length > 0 ? (translated as any) : undefined,\n returnMetadata: true,\n returnDistance: true,\n }),\n );\n\n const vectors = (out.vectors ?? []).filter(v => !!v?.key);\n\n // If includeVector is requested and some results lack data, fetch only the missing ones.\n let dataMap: Record<string, number[] | undefined> | undefined;\n if (includeVector) {\n const missingKeys = vectors.filter(v => !v.data?.float32 && v.key).map(v => v.key!) as string[];\n\n if (missingKeys.length > 0) {\n const got = await this.client.send(\n new GetVectorsCommand({\n ...this.bucketParams(),\n indexName,\n keys: missingKeys,\n returnData: true,\n returnMetadata: false,\n }),\n );\n dataMap = {};\n for (const g of got.vectors ?? []) {\n if (g.key) dataMap[g.key] = g.data?.float32 as number[] | undefined;\n }\n }\n }\n\n return vectors.map(v => {\n const id = v.key!;\n const score = S3Vectors.distanceToScore(v.distance ?? 0);\n\n const result: QueryResult = { id, score };\n\n const md = v.metadata as Record<string, unknown> | undefined;\n if (md !== undefined) result.metadata = md;\n\n if (includeVector) {\n const vec = (v.data?.float32 as number[] | undefined) ?? dataMap?.[id];\n if (vec !== undefined) result.vector = vec;\n }\n\n return result;\n });\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_S3VECTORS_VECTOR_QUERY_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n /**\n * Lists indexes within the configured bucket.\n *\n * @returns Array of index names.\n * @throws {MastraError} On AWS errors.\n */\n async listIndexes(): Promise<string[]> {\n try {\n const names: string[] = [];\n let nextToken: string | undefined;\n\n do {\n const out = await this.client.send(\n new ListIndexesCommand({\n ...this.bucketParams(),\n nextToken,\n } as any),\n );\n for (const idx of out.indexes ?? []) {\n if (idx.indexName) names.push(idx.indexName);\n }\n nextToken = out.nextToken;\n } while (nextToken);\n\n return names;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_S3VECTORS_VECTOR_LIST_INDEXES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /**\n * Returns index attributes.\n *\n * @param params.indexName - Index name.\n * @returns Object containing `dimension`, `metric`, and `count`.\n * @throws {MastraError} On AWS errors.\n * @remarks\n * `count` is computed via `ListVectors` pagination and may be costly (O(n)).\n */\n async describeIndex({ indexName }: DescribeIndexParams): Promise<IndexStats> {\n indexName = normalizeIndexName(indexName);\n try {\n const { dimension, metric } = await this.getIndexInfo(indexName);\n const count = await this.countVectors(indexName);\n return { dimension, metric, count };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_S3VECTORS_VECTOR_DESCRIBE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n /**\n * Deletes an index.\n *\n * @param params.indexName - Index name.\n * @throws {MastraError} On AWS errors.\n */\n async deleteIndex({ indexName }: DeleteIndexParams): Promise<void> {\n indexName = normalizeIndexName(indexName);\n try {\n await this.client.send(new DeleteIndexCommand({ ...this.bucketParams(), indexName } as any));\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_S3VECTORS_VECTOR_DELETE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n /**\n * Updates (replaces) a vector and/or its metadata by ID.\n *\n * @param params.indexName - Target index.\n * @param params.id - Vector ID.\n * @param params.update.vector - New vector; if omitted, the existing vector is reused.\n * @param params.update.metadata - New metadata, merged with current metadata.\n * @throws {MastraError} If the vector does not exist and `update.vector` is omitted, or on AWS error.\n * @remarks\n * S3 Vectors `PutVectors` is replace-all; we `Get` the current item, merge, then `Put`.\n */\n async updateVector({ indexName, id, update }: UpdateVectorParams): Promise<void> {\n if (!id) {\n throw new MastraError({\n id: 'STORAGE_S3VECTORS_VECTOR_UPDATE_VECTOR_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'id is required for S3Vectors updateVector',\n details: { indexName },\n });\n }\n\n indexName = normalizeIndexName(indexName);\n try {\n if (!update.vector && !update.metadata) {\n throw new Error('No updates provided');\n }\n\n const got = await this.client.send(\n new GetVectorsCommand({\n ...this.bucketParams(),\n indexName,\n keys: [id],\n returnData: true,\n returnMetadata: true,\n }),\n );\n const current = (got.vectors ?? [])[0];\n\n const newVector: number[] | undefined = update.vector ?? (current?.data?.float32 as number[] | undefined);\n if (!newVector) {\n throw new Error(`Vector \"${id}\" not found. Provide update.vector to create it.`);\n }\n\n const newMetadata =\n update.metadata !== undefined\n ? normalizeMetadata(update.metadata)\n : ((current?.metadata as Record<string, any>) ?? {});\n\n await this.client.send(\n new PutVectorsCommand({\n ...this.bucketParams(),\n indexName,\n vectors: [{ key: id, data: { float32: newVector }, metadata: newMetadata }],\n }),\n );\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_S3VECTORS_VECTOR_UPDATE_VECTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n ...(id && { id }),\n },\n },\n error,\n );\n }\n }\n\n /**\n * Deletes a vector by ID.\n *\n * @param params.indexName - Target index.\n * @param params.id - Vector ID to delete.\n * @throws {MastraError} On AWS errors.\n */\n async deleteVector({ indexName, id }: DeleteVectorParams): Promise<void> {\n indexName = normalizeIndexName(indexName);\n try {\n await this.client.send(\n new DeleteVectorsCommand({\n ...this.bucketParams(),\n indexName,\n keys: [id],\n }),\n );\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_S3VECTORS_VECTOR_DELETE_VECTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n ...(id && { id }),\n },\n },\n error,\n );\n }\n }\n\n async deleteVectors({ indexName, filter, ids }: DeleteVectorsParams): Promise<void> {\n throw new MastraError({\n id: 'STORAGE_S3VECTORS_VECTOR_DELETE_VECTORS_NOT_SUPPORTED',\n text: 'deleteVectors is not yet implemented for S3Vectors vector store',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n details: {\n indexName,\n ...(filter && { filter: JSON.stringify(filter) }),\n ...(ids && { idsCount: ids.length }),\n },\n });\n }\n\n // -------- internal helpers --------\n\n /**\n * Returns shared bucket parameters for AWS SDK calls.\n * @internal\n */\n private bucketParams(): { vectorBucketName: string } {\n return { vectorBucketName: this.vectorBucketName };\n }\n\n /**\n * Retrieves index dimension/metric via `GetIndex`.\n * @internal\n * @throws {Error} If the index does not exist.\n * @returns `{ dimension, metric }`, where `metric` includes `'dotproduct'` to satisfy Mastra types (S3 never returns it).\n */\n private async getIndexInfo(\n indexName: string,\n ): Promise<{ dimension: number; metric: 'cosine' | 'euclidean' | 'dotproduct' }> {\n const out = await this.client.send(new GetIndexCommand({ ...this.bucketParams(), indexName } as any));\n const idx = out.index;\n if (!idx) throw new Error(`Index \"${indexName}\" not found`);\n const metric = (idx.distanceMetric as S3DistanceMetric) ?? 'cosine';\n return {\n dimension: idx.dimension ?? 0,\n metric,\n };\n }\n\n /**\n * Pages through `ListVectors` and counts total items.\n * @internal\n * @remarks O(n). Avoid calling on hot paths.\n */\n private async countVectors(indexName: string): Promise<number> {\n let total = 0;\n let nextToken: string | undefined;\n\n do {\n const out = await this.client.send(\n new ListVectorsCommand({\n ...this.bucketParams(),\n indexName,\n maxResults: 1000,\n nextToken,\n returnData: false,\n returnMetadata: false,\n }),\n );\n total += (out.vectors ?? []).length;\n nextToken = out.nextToken;\n } while (nextToken);\n\n return total;\n }\n\n /**\n * Translates a high-level filter to the S3 Vectors filter shape.\n * @internal\n * @remarks Implicit AND is canonicalized by the translator where permitted by spec.\n */\n private transformFilter(filter?: S3VectorsFilter): any {\n if (!filter) return undefined;\n return this.filterTranslator.translate(filter);\n }\n\n /**\n * Converts a Mastra metric to an S3 metric.\n * @internal\n * @throws {Error} If the metric is not supported by S3 Vectors.\n */\n private static toS3Metric(metric: MastraMetric): S3DistanceMetric {\n const m = S3Vectors.METRIC_MAP[metric as SupportedMastraMetric];\n if (!m) {\n throw new Error(`Invalid metric: \"${metric}\". S3 Vectors supports only: cosine, euclidean`);\n }\n return m;\n }\n\n /**\n * Monotonic transform from distance (smaller is better) to score (larger is better).\n * @returns Number in (0, 1], preserving ranking.\n */\n private static distanceToScore(distance: number): number {\n return 1 / (1 + distance);\n }\n}\n\n// --- module-private utilities (not exported) ---\n\n/**\n * Ensures a value is a positive integer.\n * @throws {Error} If the value is not a positive integer.\n * @internal\n */\nfunction assertPositiveInteger(value: number, name: string): void {\n if (!Number.isInteger(value) || value <= 0) {\n throw new Error(`${name} must be a positive integer`);\n }\n}\n\n/**\n * Validates that all vectors match the required dimension.\n * @throws {Error} If any vector length differs from `dimension`.\n * @internal\n */\nfunction validateVectorDimensions(vectors: number[][], dimension: number): void {\n if (!Array.isArray(vectors) || vectors.length === 0) {\n throw new Error('No vectors provided for validation');\n }\n for (let i = 0; i < vectors.length; i++) {\n const len = vectors[i]?.length;\n if (len !== dimension) {\n throw new Error(`Vector at index ${i} has invalid dimension ${len}. Expected ${dimension} dimensions.`);\n }\n }\n}\n\n/**\n * Normalizes metadata values for S3 Vectors: `Date` → epoch ms.\n * @internal\n */\nfunction normalizeMetadata(meta: Record<string, any> | undefined): Record<string, any> {\n if (!meta) return {};\n const out: Record<string, any> = {};\n for (const [k, v] of Object.entries(meta)) {\n out[k] = v instanceof Date ? v.getTime() : v;\n }\n return out;\n}\n\n/**\n * Normalizes an index name to this store's canonical form (underscore → hyphen, lowercase).\n * @internal\n * @throws {TypeError} If the provided name is not a string.\n */\nfunction normalizeIndexName(str: string) {\n if (typeof str !== 'string') {\n throw new TypeError('Index name must be a string');\n }\n return str.replace(/_/g, '-').toLowerCase();\n}\n","/**\n * Vector store specific prompt that details supported operators and examples.\n * This prompt helps users construct valid filters for Amazon S3 Vectors.\n */\nexport const S3VECTORS_PROMPT = `When querying Amazon S3 Vectors, you can ONLY use the operators listed below. Any other operators will be rejected.\nImportant: Don't explain how to construct the filter - use the specified operators and fields to search the content and return relevant results.\nIf a user tries to give an explicit operator that is not supported, reject the filter entirely and let them know that the operator is not supported.\n\nBasic Comparison Operators:\n- $eq: Exact match (default when using field: value)\n Example: { \"category\": \"electronics\" }\n- $ne: Not equal\n Example: { \"category\": { \"$ne\": \"electronics\" } }\n- $gt: Greater than\n Example: { \"price\": { \"$gt\": 100 } }\n- $gte: Greater than or equal\n Example: { \"price\": { \"$gte\": 100 } }\n- $lt: Less than\n Example: { \"price\": { \"$lt\": 100 } }\n- $lte: Less than or equal\n Example: { \"price\": { \"$lte\": 100 } }\n\nArray Operators (non-empty arrays of string | number | boolean):\n- $in: Match any value in array\n Example: { \"category\": { \"$in\": [\"electronics\", \"books\"] } }\n- $nin: Does not match any value in array\n Example: { \"category\": { \"$nin\": [\"electronics\", \"books\"] } }\n\nLogical Operators:\n- $and: Logical AND (can be implicit or explicit)\n Implicit Example: { \"price\": { \"$gt\": 100 }, \"category\": \"electronics\" }\n Explicit Example: { \"$and\": [{ \"price\": { \"$gt\": 100 } }, { \"category\": \"electronics\" }] }\n- $or: Logical OR\n Example: { \"$or\": [{ \"price\": { \"$lt\": 50 } }, { \"category\": \"books\" }] }\n\nElement Operators:\n- $exists: Check if field exists\n Example: { \"rating\": { \"$exists\": true } }\n\nUnsupported / Disallowed Operators (REJECT if present):\n- $not, $nor, $regex, $all, $elemMatch, $size, $text (and any operator not listed as supported)\n\nRestrictions:\n- Only logical operators ($and, $or) can be used at the top level\n- Empty arrays for $and / $or / $in / $nin are NOT allowed\n- Nested fields are supported using dot notation\n- Multiple conditions on the same field are supported\n- At least one key-value pair is required in filter object\n- Empty objects and undefined values are treated as no filter\n- Invalid types in comparison operators will throw errors\n- All non-logical operators must be used within a field condition\n Valid: { \"field\": { \"$gt\": 100 } }\n Valid: { \"$and\": [...] }\n Invalid: { \"$gt\": 100 }\n- Logical operators must contain field conditions, not direct operators\n Valid: { \"$and\": [{ \"field\": { \"$gt\": 100 } }] }\n Invalid: { \"$and\": [{ \"$gt\": 100 }] }\n- Logical operators ($and, $or):\n - Can only be used at top level or nested within other logical operators\n - Can not be used on a field level, or be nested inside a field\n - Can not be used inside an operator\n - Valid: { \"$and\": [{ \"field\": { \"$gt\": 100 } }] }\n - Valid: { \"$or\": [{ \"$and\": [{ \"field\": { \"$gt\": 100 } }] }] }\n - Invalid: { \"field\": { \"$and\": [{ \"$gt\": 100 }] } }\n - Invalid: { \"field\": { \"$or\": [{ \"$gt\": 100 }] } }\n - Invalid: { \"field\": { \"$gt\": { \"$and\": [{...}] } } }\n- Equality values must be string, number, or boolean (arrays and objects are not allowed for equality)\n- Filters operate only on filterable metadata keys; using a non-filterable key will fail\n- Filterable metadata values are primitives (string/number/boolean) or arrays of primitives; large/long-text fields should be non-filterable and are not usable in filters\n\nExample Complex Query:\n{\n \"$and\": [\n { \"category\": { \"$in\": [\"electronics\", \"computers\"] } },\n { \"price\": { \"$gte\": 100, \"$lte\": 1000 } },\n { \"$or\": [\n { \"stock\": { \"$gt\": 0 } },\n { \"preorder\": true }\n ] }\n ]\n}`;\n"]}
1
+ {"version":3,"sources":["../src/vector/filter.ts","../src/vector/index.ts","../src/vector/prompt.ts"],"names":["BaseFilterTranslator","MastraVector","MastraError","createVectorErrorId","ErrorDomain","ErrorCategory","S3VectorsClient","error","CreateIndexCommand","uuidv4","PutVectorsCommand","QueryVectorsCommand","GetVectorsCommand","ListIndexesCommand","DeleteIndexCommand","DeleteVectorsCommand","GetIndexCommand","ListVectorsCommand"],"mappings":"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","file":"index.cjs","sourcesContent":["import { BaseFilterTranslator } from '@mastra/core/vector/filter';\nimport type {\n VectorFilter,\n LogicalOperatorValueMap,\n OperatorSupport,\n QueryOperator,\n OperatorValueMap,\n BlacklistedRootOperators,\n} from '@mastra/core/vector/filter';\n\n/**\n * S3 Vectors supports a strict subset of operators and value types.\n *\n * - logical: `$and`, `$or` (non-empty arrays)\n * - basic: `$eq`, `$ne` (string | number | boolean)\n * - numeric: `$gt`, `$gte`, `$lt`, `$lte` (number)\n * - array: `$in`, `$nin` (non-empty arrays of string | number | boolean)\n * - element: `$exists` (boolean)\n */\ntype S3VectorsOperatorValueMap = Pick<\n OperatorValueMap,\n '$eq' | '$ne' | '$gt' | '$gte' | '$lt' | '$lte' | '$in' | '$nin' | '$exists'\n>;\n\ntype S3VectorsLogicalOperatorValueMap = Pick<LogicalOperatorValueMap, '$and' | '$or'>;\n\ntype S3VectorsBlacklisted = BlacklistedRootOperators;\n\ntype S3VectorsFieldValue = string | number | boolean;\n\n/**\n * High-level filter type accepted by this translator.\n * @remarks\n * Field values are limited to string/number/boolean at equality positions.\n */\nexport type S3VectorsFilter = VectorFilter<\n keyof S3VectorsOperatorValueMap,\n S3VectorsOperatorValueMap,\n S3VectorsLogicalOperatorValueMap,\n S3VectorsBlacklisted,\n S3VectorsFieldValue\n>;\n\n/**\n * Translates a high-level filter into the S3 Vectors filter shape.\n *\n * @remarks\n * - Canonicalizes **implicit AND** (e.g. `{a:1,b:2}`) into explicit `{$and:[{a:1},{b:2}]}` in any\n * non-field context that lacks `$and/$or`.\n * - Normalizes `Date` values to epoch milliseconds where allowed (numeric comparisons and array elements).\n * - Disallows `Date` at equality positions (including implicit equality).\n * - Validates shapes using the base class after translation.\n */\nexport class S3VectorsFilterTranslator extends BaseFilterTranslator<S3VectorsFilter> {\n /** @inheritdoc */\n protected override getSupportedOperators(): OperatorSupport {\n return {\n logical: ['$and', '$or'],\n basic: ['$eq', '$ne'],\n numeric: ['$gt', '$gte', '$lt', '$lte'],\n array: ['$in', '$nin'],\n element: ['$exists'],\n };\n }\n\n /**\n * Translates and validates a filter.\n * @param filter - Input filter; may be `undefined`, `null`, or `{}` (all treated as empty).\n * @returns The translated filter (or the original value if empty).\n */\n translate(filter?: S3VectorsFilter): any {\n if (this.isEmpty(filter)) return filter;\n // Perform translation (including Date → number normalization) before base shape validation.\n const translated = this.translateNode(filter as any, false);\n this.validateFilter(translated as any);\n return translated;\n }\n\n /**\n * Recursively translates a node.\n * @param node - Current node to translate.\n * @param inFieldValue - When `true`, the node is the value of a field (i.e., equality context).\n * @remarks\n * - In a **field-value** context, only primitives or operator objects are allowed.\n * - In a **non-field** context (root / logical branches), operator keys are processed;\n * plain keys become field equalities and are validated.\n * - Implicit AND is canonicalized in non-field contexts when multiple non-logical keys exist.\n */\n private translateNode(node: any, inFieldValue = false): any {\n // Primitive or Date (normalize when in a field-equality context)\n if (this.isPrimitive(node) || node instanceof Date) {\n return inFieldValue ? this.validateAndNormalizePrimitive(node) : node;\n }\n\n // Arrays are not allowed as direct equality values\n if (Array.isArray(node)) {\n if (inFieldValue) {\n throw new Error('Array equality is not supported in S3 Vectors. Use $in / $nin operators.');\n }\n return node;\n }\n\n // Object\n const entries = Object.entries(node as Record<string, any>);\n\n if (inFieldValue) {\n if (entries.length === 0) {\n throw new Error('Invalid equality value. Only string, number, or boolean are supported by S3 Vectors');\n }\n const allOperatorKeys = entries.every(([k]) => this.isOperator(k));\n if (!allOperatorKeys) {\n // Disallow shapes like: { field: { a:1, b:2 } }\n throw new Error('Invalid equality value. Only string, number, or boolean are supported by S3 Vectors');\n }\n const opEntries = entries.map(([key, value]) => [key, this.translateOperatorValue(key as QueryOperator, value)]);\n return Object.fromEntries(opEntries);\n }\n\n // Root / filter context\n const translatedEntries = entries.map(([key, value]) => {\n if (this.isOperator(key)) {\n return [key, this.translateOperatorValue(key as QueryOperator, value)];\n }\n return [key, this.translateNode(value, true)];\n });\n const obj = Object.fromEntries(translatedEntries);\n\n // Canonicalize implicit AND → explicit $and (if no $and/$or present and multiple non-logical keys)\n const keys = Object.keys(obj);\n const hasLogical = keys.some(k => k === '$and' || k === '$or');\n if (!hasLogical) {\n const nonLogical = keys.filter(k => k !== '$and' && k !== '$or');\n if (nonLogical.length > 1) {\n return { $and: nonLogical.map(k => ({ [k]: obj[k] })) };\n }\n }\n\n return obj;\n }\n\n /**\n * Translates a single operator and validates its value.\n * @param operator - One of the supported query operators.\n * @param value - Operator value to normalize/validate.\n */\n private translateOperatorValue(operator: QueryOperator, value: any): any {\n // Logical operators\n if (operator === '$and' || operator === '$or') {\n if (!Array.isArray(value) || value.length === 0) {\n throw new Error(`Value for logical operator ${operator} must be a non-empty array`);\n }\n return value.map(item => this.translateNode(item));\n }\n\n // Equality / inequality (Date is not allowed)\n if (operator === '$eq' || operator === '$ne') {\n if (value instanceof Date) {\n throw new Error('Invalid equality value. Only string, number, or boolean are supported by S3 Vectors');\n }\n return this.toPrimitiveForS3(value, operator);\n }\n\n // Numeric comparisons: require number; allow Date by converting to epoch ms\n if (operator === '$gt' || operator === '$gte' || operator === '$lt' || operator === '$lte') {\n const n = this.toNumberForRange(value, operator);\n return n;\n }\n\n // Array operators: non-empty arrays of primitives (Date converted to number)\n if (operator === '$in' || operator === '$nin') {\n if (!Array.isArray(value) || value.length === 0) {\n throw new Error(`Value for array operator ${operator} must be a non-empty array`);\n }\n return value.map(v => this.toPrimitiveForS3(v, operator));\n }\n\n // Existence check\n if (operator === '$exists') {\n if (typeof value !== 'boolean') {\n throw new Error(`Value for $exists operator must be a boolean`);\n }\n return value;\n }\n\n throw new Error(`Unsupported operator: ${operator}`);\n }\n\n /**\n * Normalizes a value to an S3-accepted primitive.\n * @param value - String | Number | Boolean | Date.\n * @param operatorForMessage - Operator name used in error messages.\n * @returns The normalized primitive; `Date` becomes epoch milliseconds.\n * @throws If the value is not a supported primitive or is null/undefined.\n */\n private toPrimitiveForS3(value: any, operatorForMessage: string): string | number | boolean {\n if (value === null || value === undefined) {\n // Error message for equality matches tests\n if (operatorForMessage === 'equality') {\n throw new Error('S3 Vectors does not support null/undefined for equality');\n }\n throw new Error(`Value for ${operatorForMessage} must be string, number, or boolean`);\n }\n if (value instanceof Date) {\n return value.getTime();\n }\n const t = typeof value;\n if (t === 'string' || t === 'boolean') return value;\n if (t === 'number') return Object.is(value, -0) ? 0 : value;\n throw new Error(`Value for ${operatorForMessage} must be string, number, or boolean`);\n }\n\n /**\n * Ensures a numeric value for range operators; allows `Date` by converting to epoch ms.\n * @param value - Candidate value.\n * @param operatorForMessage - Operator name used in error messages.\n * @throws If the value is not a number (or a Date).\n */\n private toNumberForRange(value: any, operatorForMessage: string): number {\n if (value instanceof Date) return value.getTime();\n if (typeof value === 'number' && !Number.isNaN(value)) return Object.is(value, -0) ? 0 : value;\n throw new Error(`Value for ${operatorForMessage} must be a number`);\n }\n\n /**\n * Validates and normalizes a primitive used in field equality (implicit `$eq`).\n * @param value - Candidate equality value.\n * @throws If the value is a `Date` or not a supported primitive.\n */\n private validateAndNormalizePrimitive(value: any): S3VectorsFieldValue {\n if (value instanceof Date) {\n throw new Error('Invalid equality value. Only string, number, or boolean are supported by S3 Vectors');\n }\n return this.toPrimitiveForS3(value, 'equality') as S3VectorsFieldValue;\n }\n\n /**\n * Determines whether a filter is considered empty.\n * @param filter - Input filter.\n */\n protected override isEmpty(filter: any): boolean {\n return filter === undefined || filter === null || (typeof filter === 'object' && Object.keys(filter).length === 0);\n }\n}\n","import {\n S3VectorsClient,\n CreateIndexCommand,\n DeleteIndexCommand,\n ListIndexesCommand,\n GetIndexCommand,\n PutVectorsCommand,\n QueryVectorsCommand,\n GetVectorsCommand,\n DeleteVectorsCommand,\n ListVectorsCommand,\n} from '@aws-sdk/client-s3vectors';\nimport type { S3VectorsClientConfig } from '@aws-sdk/client-s3vectors';\nimport { MastraError, ErrorDomain, ErrorCategory } from '@mastra/core/error';\nimport { createVectorErrorId } from '@mastra/core/storage';\nimport { MastraVector } from '@mastra/core/vector';\nimport type {\n QueryResult,\n IndexStats,\n CreateIndexParams,\n UpsertVectorParams,\n DeleteVectorsParams,\n QueryVectorParams,\n DescribeIndexParams,\n DeleteIndexParams,\n DeleteVectorParams,\n UpdateVectorParams,\n} from '@mastra/core/vector';\nimport { v4 as uuidv4 } from 'uuid';\nimport { S3VectorsFilterTranslator } from './filter';\nimport type { S3VectorsFilter } from './filter';\n\n/**\n * Options for the S3Vectors store.\n * @property vectorBucketName - Target S3 Vectors bucket name.\n * @property clientConfig - AWS SDK client options (e.g., region/credentials).\n * @property nonFilterableMetadataKeys - Metadata keys that must not be filterable (forwarded to S3 Vectors).\n */\nexport interface S3VectorsOptions {\n vectorBucketName: string;\n clientConfig?: S3VectorsClientConfig;\n nonFilterableMetadataKeys?: string[];\n}\n\ntype S3DistanceMetric = 'cosine' | 'euclidean';\ntype MastraMetric = NonNullable<CreateIndexParams['metric']>;\ntype SupportedMastraMetric = Exclude<MastraMetric, 'dotproduct'>;\n\n/**\n * Vector store backed by Amazon S3 Vectors.\n *\n * @remarks\n * - Supports `cosine` and `euclidean` distance metrics.\n * - Filters must use explicit logical operators (`$and` / `$or`). The attached translator\n * canonicalizes implicit AND (e.g., `{a:1,b:2}` → `{ $and: [{a:1},{b:2}] }`) where permitted by spec.\n * - Methods wrap AWS errors in `MastraError` with domain/category metadata.\n */\nexport class S3Vectors extends MastraVector<S3VectorsFilter> {\n private readonly client: S3VectorsClient;\n private readonly vectorBucketName: string;\n private readonly nonFilterableMetadataKeys?: string[];\n private readonly filterTranslator = new S3VectorsFilterTranslator();\n\n private static readonly METRIC_MAP: Record<SupportedMastraMetric, S3DistanceMetric> = {\n cosine: 'cosine',\n euclidean: 'euclidean',\n } as const;\n\n constructor(opts: S3VectorsOptions & { id: string }) {\n super({ id: opts.id });\n if (!opts?.vectorBucketName) {\n throw new MastraError(\n {\n id: createVectorErrorId('S3VECTORS', 'INITIALIZATION', 'MISSING_BUCKET_NAME'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n new Error('vectorBucketName is required'),\n );\n }\n this.vectorBucketName = opts.vectorBucketName;\n this.nonFilterableMetadataKeys = opts.nonFilterableMetadataKeys;\n this.client = new S3VectorsClient({ ...(opts.clientConfig ?? {}) });\n }\n\n /**\n * No-op to satisfy the base interface.\n *\n * @remarks The AWS SDK manages HTTP per request; no persistent connection is needed.\n */\n async connect(): Promise<void> {}\n\n /**\n * Closes the underlying AWS SDK HTTP handler to free sockets.\n */\n async disconnect(): Promise<void> {\n try {\n this.client.destroy();\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('S3VECTORS', 'DISCONNECT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /**\n * Creates an index or validates an existing one.\n *\n * @param params.indexName - Logical index name; normalized internally.\n * @param params.dimension - Vector dimension (must be a positive integer).\n * @param params.metric - Distance metric (`cosine` | `euclidean`). Defaults to `cosine`.\n * @throws {MastraError} If arguments are invalid or AWS returns an error.\n * @remarks\n * On `ConflictException`, we verify the existing index schema via the parent implementation\n * and return if it matches.\n */\n async createIndex({ indexName, dimension, metric = 'cosine' }: CreateIndexParams): Promise<void> {\n indexName = normalizeIndexName(indexName);\n\n let s3Metric: S3DistanceMetric;\n try {\n assertPositiveInteger(dimension, 'dimension');\n s3Metric = S3Vectors.toS3Metric(metric);\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('S3VECTORS', 'CREATE_INDEX', 'INVALID_ARGS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName, dimension, metric },\n },\n error,\n );\n }\n\n try {\n const input: any = {\n ...this.bucketParams(),\n indexName,\n dataType: 'float32',\n dimension,\n distanceMetric: s3Metric,\n };\n if (this.nonFilterableMetadataKeys?.length) {\n input.metadataConfiguration = { nonFilterableMetadataKeys: this.nonFilterableMetadataKeys };\n }\n\n await this.client.send(new CreateIndexCommand(input));\n } catch (error: any) {\n if (error?.name === 'ConflictException') {\n await this.validateExistingIndex(indexName, dimension, metric);\n return;\n }\n throw new MastraError(\n {\n id: createVectorErrorId('S3VECTORS', 'CREATE_INDEX', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName, dimension, metric },\n },\n error,\n );\n }\n }\n\n /**\n * Upserts vectors in bulk.\n *\n * @param params.indexName - Index to write to.\n * @param params.vectors - Array of vectors; each must match the index dimension.\n * @param params.metadata - Optional metadata per vector; `Date` values are normalized to epoch ms.\n * @param params.ids - Optional explicit IDs; if omitted, UUIDs are generated.\n * @returns Array of IDs used for the upsert (explicit or generated).\n * @throws {MastraError} If validation fails or AWS returns an error.\n */\n async upsert({ indexName, vectors, metadata, ids }: UpsertVectorParams): Promise<string[]> {\n indexName = normalizeIndexName(indexName);\n try {\n const { dimension } = await this.getIndexInfo(indexName);\n validateVectorDimensions(vectors, dimension);\n\n const generatedIds = ids ?? vectors.map(() => uuidv4());\n\n const putInput = {\n ...this.bucketParams(),\n indexName,\n vectors: vectors.map((vec, i) => ({\n key: generatedIds[i],\n data: { float32: vec },\n metadata: normalizeMetadata(metadata?.[i]),\n })),\n };\n\n await this.client.send(new PutVectorsCommand(putInput));\n return generatedIds;\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('S3VECTORS', 'UPSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n /**\n * Queries nearest neighbors.\n *\n * @param params.indexName - Target index.\n * @param params.queryVector - Query vector (non-empty float32 array).\n * @param params.topK - Number of neighbors to return (positive integer). Defaults to 10.\n * @param params.filter - Metadata filter using explicit `$and`/`$or` (translator canonicalizes implicit AND).\n * @param params.includeVector - If `true`, fetches missing vector data in a second call.\n * @returns Results sorted by `score` descending.\n * @throws {MastraError} If validation fails or AWS returns an error.\n * @remarks\n * `score = 1/(1+distance)` (monotonic transform), so ranking matches the underlying distance.\n */\n async query({\n indexName,\n queryVector,\n topK = 10,\n filter,\n includeVector = false,\n }: QueryVectorParams<S3VectorsFilter>): Promise<QueryResult[]> {\n indexName = normalizeIndexName(indexName);\n\n try {\n if (!Array.isArray(queryVector) || queryVector.length === 0) {\n throw new Error('queryVector must be a non-empty float32 array');\n }\n assertPositiveInteger(topK, 'topK');\n\n const translated = this.transformFilter(filter);\n\n const out = await this.client.send(\n new QueryVectorsCommand({\n ...this.bucketParams(),\n indexName,\n topK,\n queryVector: { float32: queryVector },\n filter: translated && Object.keys(translated).length > 0 ? (translated as any) : undefined,\n returnMetadata: true,\n returnDistance: true,\n }),\n );\n\n const vectors = (out.vectors ?? []).filter(v => !!v?.key);\n\n // If includeVector is requested and some results lack data, fetch only the missing ones.\n let dataMap: Record<string, number[] | undefined> | undefined;\n if (includeVector) {\n const missingKeys = vectors.filter(v => !v.data?.float32 && v.key).map(v => v.key!) as string[];\n\n if (missingKeys.length > 0) {\n const got = await this.client.send(\n new GetVectorsCommand({\n ...this.bucketParams(),\n indexName,\n keys: missingKeys,\n returnData: true,\n returnMetadata: false,\n }),\n );\n dataMap = {};\n for (const g of got.vectors ?? []) {\n if (g.key) dataMap[g.key] = g.data?.float32 as number[] | undefined;\n }\n }\n }\n\n return vectors.map(v => {\n const id = v.key!;\n const score = S3Vectors.distanceToScore(v.distance ?? 0);\n\n const result: QueryResult = { id, score };\n\n const md = v.metadata as Record<string, unknown> | undefined;\n if (md !== undefined) result.metadata = md;\n\n if (includeVector) {\n const vec = (v.data?.float32 as number[] | undefined) ?? dataMap?.[id];\n if (vec !== undefined) result.vector = vec;\n }\n\n return result;\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('S3VECTORS', 'QUERY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n /**\n * Lists indexes within the configured bucket.\n *\n * @returns Array of index names.\n * @throws {MastraError} On AWS errors.\n */\n async listIndexes(): Promise<string[]> {\n try {\n const names: string[] = [];\n let nextToken: string | undefined;\n\n do {\n const out = await this.client.send(\n new ListIndexesCommand({\n ...this.bucketParams(),\n nextToken,\n } as any),\n );\n for (const idx of out.indexes ?? []) {\n if (idx.indexName) names.push(idx.indexName);\n }\n nextToken = out.nextToken;\n } while (nextToken);\n\n return names;\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('S3VECTORS', 'LIST_INDEXES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /**\n * Returns index attributes.\n *\n * @param params.indexName - Index name.\n * @returns Object containing `dimension`, `metric`, and `count`.\n * @throws {MastraError} On AWS errors.\n * @remarks\n * `count` is computed via `ListVectors` pagination and may be costly (O(n)).\n */\n async describeIndex({ indexName }: DescribeIndexParams): Promise<IndexStats> {\n indexName = normalizeIndexName(indexName);\n try {\n const { dimension, metric } = await this.getIndexInfo(indexName);\n const count = await this.countVectors(indexName);\n return { dimension, metric, count };\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('S3VECTORS', 'DESCRIBE_INDEX', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n /**\n * Deletes an index.\n *\n * @param params.indexName - Index name.\n * @throws {MastraError} On AWS errors.\n */\n async deleteIndex({ indexName }: DeleteIndexParams): Promise<void> {\n indexName = normalizeIndexName(indexName);\n try {\n await this.client.send(new DeleteIndexCommand({ ...this.bucketParams(), indexName } as any));\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('S3VECTORS', 'DELETE_INDEX', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n /**\n * Updates (replaces) a vector and/or its metadata by ID.\n *\n * @param params.indexName - Target index.\n * @param params.id - Vector ID.\n * @param params.update.vector - New vector; if omitted, the existing vector is reused.\n * @param params.update.metadata - New metadata, merged with current metadata.\n * @throws {MastraError} If the vector does not exist and `update.vector` is omitted, or on AWS error.\n * @remarks\n * S3 Vectors `PutVectors` is replace-all; we `Get` the current item, merge, then `Put`.\n */\n async updateVector({ indexName, id, update }: UpdateVectorParams): Promise<void> {\n if (!id) {\n throw new MastraError({\n id: createVectorErrorId('S3VECTORS', 'UPDATE_VECTOR', 'INVALID_ARGS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'id is required for S3Vectors updateVector',\n details: { indexName },\n });\n }\n\n indexName = normalizeIndexName(indexName);\n try {\n if (!update.vector && !update.metadata) {\n throw new Error('No updates provided');\n }\n\n const got = await this.client.send(\n new GetVectorsCommand({\n ...this.bucketParams(),\n indexName,\n keys: [id],\n returnData: true,\n returnMetadata: true,\n }),\n );\n const current = (got.vectors ?? [])[0];\n\n const newVector: number[] | undefined = update.vector ?? (current?.data?.float32 as number[] | undefined);\n if (!newVector) {\n throw new Error(`Vector \"${id}\" not found. Provide update.vector to create it.`);\n }\n\n const newMetadata =\n update.metadata !== undefined\n ? normalizeMetadata(update.metadata)\n : ((current?.metadata as Record<string, any>) ?? {});\n\n await this.client.send(\n new PutVectorsCommand({\n ...this.bucketParams(),\n indexName,\n vectors: [{ key: id, data: { float32: newVector }, metadata: newMetadata }],\n }),\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('S3VECTORS', 'UPDATE_VECTOR', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n ...(id && { id }),\n },\n },\n error,\n );\n }\n }\n\n /**\n * Deletes a vector by ID.\n *\n * @param params.indexName - Target index.\n * @param params.id - Vector ID to delete.\n * @throws {MastraError} On AWS errors.\n */\n async deleteVector({ indexName, id }: DeleteVectorParams): Promise<void> {\n indexName = normalizeIndexName(indexName);\n try {\n await this.client.send(\n new DeleteVectorsCommand({\n ...this.bucketParams(),\n indexName,\n keys: [id],\n }),\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('S3VECTORS', 'DELETE_VECTOR', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n ...(id && { id }),\n },\n },\n error,\n );\n }\n }\n\n async deleteVectors({ indexName, filter, ids }: DeleteVectorsParams): Promise<void> {\n throw new MastraError({\n id: createVectorErrorId('S3VECTORS', 'DELETE_VECTORS', 'NOT_SUPPORTED'),\n text: 'deleteVectors is not yet implemented for S3Vectors vector store',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n details: {\n indexName,\n ...(filter && { filter: JSON.stringify(filter) }),\n ...(ids && { idsCount: ids.length }),\n },\n });\n }\n\n // -------- internal helpers --------\n\n /**\n * Returns shared bucket parameters for AWS SDK calls.\n * @internal\n */\n private bucketParams(): { vectorBucketName: string } {\n return { vectorBucketName: this.vectorBucketName };\n }\n\n /**\n * Retrieves index dimension/metric via `GetIndex`.\n * @internal\n * @throws {Error} If the index does not exist.\n * @returns `{ dimension, metric }`, where `metric` includes `'dotproduct'` to satisfy Mastra types (S3 never returns it).\n */\n private async getIndexInfo(\n indexName: string,\n ): Promise<{ dimension: number; metric: 'cosine' | 'euclidean' | 'dotproduct' }> {\n const out = await this.client.send(new GetIndexCommand({ ...this.bucketParams(), indexName } as any));\n const idx = out.index;\n if (!idx) throw new Error(`Index \"${indexName}\" not found`);\n const metric = (idx.distanceMetric as S3DistanceMetric) ?? 'cosine';\n return {\n dimension: idx.dimension ?? 0,\n metric,\n };\n }\n\n /**\n * Pages through `ListVectors` and counts total items.\n * @internal\n * @remarks O(n). Avoid calling on hot paths.\n */\n private async countVectors(indexName: string): Promise<number> {\n let total = 0;\n let nextToken: string | undefined;\n\n do {\n const out = await this.client.send(\n new ListVectorsCommand({\n ...this.bucketParams(),\n indexName,\n maxResults: 1000,\n nextToken,\n returnData: false,\n returnMetadata: false,\n }),\n );\n total += (out.vectors ?? []).length;\n nextToken = out.nextToken;\n } while (nextToken);\n\n return total;\n }\n\n /**\n * Translates a high-level filter to the S3 Vectors filter shape.\n * @internal\n * @remarks Implicit AND is canonicalized by the translator where permitted by spec.\n */\n private transformFilter(filter?: S3VectorsFilter): any {\n if (!filter) return undefined;\n return this.filterTranslator.translate(filter);\n }\n\n /**\n * Converts a Mastra metric to an S3 metric.\n * @internal\n * @throws {Error} If the metric is not supported by S3 Vectors.\n */\n private static toS3Metric(metric: MastraMetric): S3DistanceMetric {\n const m = S3Vectors.METRIC_MAP[metric as SupportedMastraMetric];\n if (!m) {\n throw new Error(`Invalid metric: \"${metric}\". S3 Vectors supports only: cosine, euclidean`);\n }\n return m;\n }\n\n /**\n * Monotonic transform from distance (smaller is better) to score (larger is better).\n * @returns Number in (0, 1], preserving ranking.\n */\n private static distanceToScore(distance: number): number {\n return 1 / (1 + distance);\n }\n}\n\n// --- module-private utilities (not exported) ---\n\n/**\n * Ensures a value is a positive integer.\n * @throws {Error} If the value is not a positive integer.\n * @internal\n */\nfunction assertPositiveInteger(value: number, name: string): void {\n if (!Number.isInteger(value) || value <= 0) {\n throw new Error(`${name} must be a positive integer`);\n }\n}\n\n/**\n * Validates that all vectors match the required dimension.\n * @throws {Error} If any vector length differs from `dimension`.\n * @internal\n */\nfunction validateVectorDimensions(vectors: number[][], dimension: number): void {\n if (!Array.isArray(vectors) || vectors.length === 0) {\n throw new Error('No vectors provided for validation');\n }\n for (let i = 0; i < vectors.length; i++) {\n const len = vectors[i]?.length;\n if (len !== dimension) {\n throw new Error(`Vector at index ${i} has invalid dimension ${len}. Expected ${dimension} dimensions.`);\n }\n }\n}\n\n/**\n * Normalizes metadata values for S3 Vectors: `Date` → epoch ms.\n * @internal\n */\nfunction normalizeMetadata(meta: Record<string, any> | undefined): Record<string, any> {\n if (!meta) return {};\n const out: Record<string, any> = {};\n for (const [k, v] of Object.entries(meta)) {\n out[k] = v instanceof Date ? v.getTime() : v;\n }\n return out;\n}\n\n/**\n * Normalizes an index name to this store's canonical form (underscore → hyphen, lowercase).\n * @internal\n * @throws {TypeError} If the provided name is not a string.\n */\nfunction normalizeIndexName(str: string) {\n if (typeof str !== 'string') {\n throw new TypeError('Index name must be a string');\n }\n return str.replace(/_/g, '-').toLowerCase();\n}\n","/**\n * Vector store specific prompt that details supported operators and examples.\n * This prompt helps users construct valid filters for Amazon S3 Vectors.\n */\nexport const S3VECTORS_PROMPT = `When querying Amazon S3 Vectors, you can ONLY use the operators listed below. Any other operators will be rejected.\nImportant: Don't explain how to construct the filter - use the specified operators and fields to search the content and return relevant results.\nIf a user tries to give an explicit operator that is not supported, reject the filter entirely and let them know that the operator is not supported.\n\nBasic Comparison Operators:\n- $eq: Exact match (default when using field: value)\n Example: { \"category\": \"electronics\" }\n- $ne: Not equal\n Example: { \"category\": { \"$ne\": \"electronics\" } }\n- $gt: Greater than\n Example: { \"price\": { \"$gt\": 100 } }\n- $gte: Greater than or equal\n Example: { \"price\": { \"$gte\": 100 } }\n- $lt: Less than\n Example: { \"price\": { \"$lt\": 100 } }\n- $lte: Less than or equal\n Example: { \"price\": { \"$lte\": 100 } }\n\nArray Operators (non-empty arrays of string | number | boolean):\n- $in: Match any value in array\n Example: { \"category\": { \"$in\": [\"electronics\", \"books\"] } }\n- $nin: Does not match any value in array\n Example: { \"category\": { \"$nin\": [\"electronics\", \"books\"] } }\n\nLogical Operators:\n- $and: Logical AND (can be implicit or explicit)\n Implicit Example: { \"price\": { \"$gt\": 100 }, \"category\": \"electronics\" }\n Explicit Example: { \"$and\": [{ \"price\": { \"$gt\": 100 } }, { \"category\": \"electronics\" }] }\n- $or: Logical OR\n Example: { \"$or\": [{ \"price\": { \"$lt\": 50 } }, { \"category\": \"books\" }] }\n\nElement Operators:\n- $exists: Check if field exists\n Example: { \"rating\": { \"$exists\": true } }\n\nUnsupported / Disallowed Operators (REJECT if present):\n- $not, $nor, $regex, $all, $elemMatch, $size, $text (and any operator not listed as supported)\n\nRestrictions:\n- Only logical operators ($and, $or) can be used at the top level\n- Empty arrays for $and / $or / $in / $nin are NOT allowed\n- Nested fields are supported using dot notation\n- Multiple conditions on the same field are supported\n- At least one key-value pair is required in filter object\n- Empty objects and undefined values are treated as no filter\n- Invalid types in comparison operators will throw errors\n- All non-logical operators must be used within a field condition\n Valid: { \"field\": { \"$gt\": 100 } }\n Valid: { \"$and\": [...] }\n Invalid: { \"$gt\": 100 }\n- Logical operators must contain field conditions, not direct operators\n Valid: { \"$and\": [{ \"field\": { \"$gt\": 100 } }] }\n Invalid: { \"$and\": [{ \"$gt\": 100 }] }\n- Logical operators ($and, $or):\n - Can only be used at top level or nested within other logical operators\n - Can not be used on a field level, or be nested inside a field\n - Can not be used inside an operator\n - Valid: { \"$and\": [{ \"field\": { \"$gt\": 100 } }] }\n - Valid: { \"$or\": [{ \"$and\": [{ \"field\": { \"$gt\": 100 } }] }] }\n - Invalid: { \"field\": { \"$and\": [{ \"$gt\": 100 }] } }\n - Invalid: { \"field\": { \"$or\": [{ \"$gt\": 100 }] } }\n - Invalid: { \"field\": { \"$gt\": { \"$and\": [{...}] } } }\n- Equality values must be string, number, or boolean (arrays and objects are not allowed for equality)\n- Filters operate only on filterable metadata keys; using a non-filterable key will fail\n- Filterable metadata values are primitives (string/number/boolean) or arrays of primitives; large/long-text fields should be non-filterable and are not usable in filters\n\nExample Complex Query:\n{\n \"$and\": [\n { \"category\": { \"$in\": [\"electronics\", \"computers\"] } },\n { \"price\": { \"$gte\": 100, \"$lte\": 1000 } },\n { \"$or\": [\n { \"stock\": { \"$gt\": 0 } },\n { \"preorder\": true }\n ] }\n ]\n}`;\n"]}
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { S3VectorsClient, CreateIndexCommand, PutVectorsCommand, QueryVectorsCommand, GetVectorsCommand, ListIndexesCommand, DeleteIndexCommand, DeleteVectorsCommand, GetIndexCommand, ListVectorsCommand } from '@aws-sdk/client-s3vectors';
2
2
  import { MastraError, ErrorCategory, ErrorDomain } from '@mastra/core/error';
3
+ import { createVectorErrorId } from '@mastra/core/storage';
3
4
  import { MastraVector } from '@mastra/core/vector';
4
5
  import { v4 } from 'uuid';
5
6
  import { BaseFilterTranslator } from '@mastra/core/vector/filter';
@@ -180,7 +181,7 @@ var S3Vectors = class _S3Vectors extends MastraVector {
180
181
  if (!opts?.vectorBucketName) {
181
182
  throw new MastraError(
182
183
  {
183
- id: "STORAGE_S3VECTORS_VECTOR_MISSING_BUCKET_NAME",
184
+ id: createVectorErrorId("S3VECTORS", "INITIALIZATION", "MISSING_BUCKET_NAME"),
184
185
  domain: ErrorDomain.STORAGE,
185
186
  category: ErrorCategory.USER
186
187
  },
@@ -207,7 +208,7 @@ var S3Vectors = class _S3Vectors extends MastraVector {
207
208
  } catch (error) {
208
209
  throw new MastraError(
209
210
  {
210
- id: "STORAGE_S3VECTORS_VECTOR_DISCONNECT_FAILED",
211
+ id: createVectorErrorId("S3VECTORS", "DISCONNECT", "FAILED"),
211
212
  domain: ErrorDomain.STORAGE,
212
213
  category: ErrorCategory.THIRD_PARTY
213
214
  },
@@ -235,7 +236,7 @@ var S3Vectors = class _S3Vectors extends MastraVector {
235
236
  } catch (error) {
236
237
  throw new MastraError(
237
238
  {
238
- id: "STORAGE_S3VECTORS_VECTOR_CREATE_INDEX_INVALID_ARGS",
239
+ id: createVectorErrorId("S3VECTORS", "CREATE_INDEX", "INVALID_ARGS"),
239
240
  domain: ErrorDomain.STORAGE,
240
241
  category: ErrorCategory.USER,
241
242
  details: { indexName, dimension, metric }
@@ -262,7 +263,7 @@ var S3Vectors = class _S3Vectors extends MastraVector {
262
263
  }
263
264
  throw new MastraError(
264
265
  {
265
- id: "STORAGE_S3VECTORS_VECTOR_CREATE_INDEX_FAILED",
266
+ id: createVectorErrorId("S3VECTORS", "CREATE_INDEX", "FAILED"),
266
267
  domain: ErrorDomain.STORAGE,
267
268
  category: ErrorCategory.THIRD_PARTY,
268
269
  details: { indexName, dimension, metric }
@@ -301,7 +302,7 @@ var S3Vectors = class _S3Vectors extends MastraVector {
301
302
  } catch (error) {
302
303
  throw new MastraError(
303
304
  {
304
- id: "STORAGE_S3VECTORS_VECTOR_UPSERT_FAILED",
305
+ id: createVectorErrorId("S3VECTORS", "UPSERT", "FAILED"),
305
306
  domain: ErrorDomain.STORAGE,
306
307
  category: ErrorCategory.THIRD_PARTY,
307
308
  details: { indexName }
@@ -383,7 +384,7 @@ var S3Vectors = class _S3Vectors extends MastraVector {
383
384
  } catch (error) {
384
385
  throw new MastraError(
385
386
  {
386
- id: "STORAGE_S3VECTORS_VECTOR_QUERY_FAILED",
387
+ id: createVectorErrorId("S3VECTORS", "QUERY", "FAILED"),
387
388
  domain: ErrorDomain.STORAGE,
388
389
  category: ErrorCategory.THIRD_PARTY,
389
390
  details: { indexName }
@@ -418,7 +419,7 @@ var S3Vectors = class _S3Vectors extends MastraVector {
418
419
  } catch (error) {
419
420
  throw new MastraError(
420
421
  {
421
- id: "STORAGE_S3VECTORS_VECTOR_LIST_INDEXES_FAILED",
422
+ id: createVectorErrorId("S3VECTORS", "LIST_INDEXES", "FAILED"),
422
423
  domain: ErrorDomain.STORAGE,
423
424
  category: ErrorCategory.THIRD_PARTY
424
425
  },
@@ -444,7 +445,7 @@ var S3Vectors = class _S3Vectors extends MastraVector {
444
445
  } catch (error) {
445
446
  throw new MastraError(
446
447
  {
447
- id: "STORAGE_S3VECTORS_VECTOR_DESCRIBE_INDEX_FAILED",
448
+ id: createVectorErrorId("S3VECTORS", "DESCRIBE_INDEX", "FAILED"),
448
449
  domain: ErrorDomain.STORAGE,
449
450
  category: ErrorCategory.THIRD_PARTY,
450
451
  details: { indexName }
@@ -466,7 +467,7 @@ var S3Vectors = class _S3Vectors extends MastraVector {
466
467
  } catch (error) {
467
468
  throw new MastraError(
468
469
  {
469
- id: "STORAGE_S3VECTORS_VECTOR_DELETE_INDEX_FAILED",
470
+ id: createVectorErrorId("S3VECTORS", "DELETE_INDEX", "FAILED"),
470
471
  domain: ErrorDomain.STORAGE,
471
472
  category: ErrorCategory.THIRD_PARTY,
472
473
  details: { indexName }
@@ -489,7 +490,7 @@ var S3Vectors = class _S3Vectors extends MastraVector {
489
490
  async updateVector({ indexName, id, update }) {
490
491
  if (!id) {
491
492
  throw new MastraError({
492
- id: "STORAGE_S3VECTORS_VECTOR_UPDATE_VECTOR_INVALID_ARGS",
493
+ id: createVectorErrorId("S3VECTORS", "UPDATE_VECTOR", "INVALID_ARGS"),
493
494
  domain: ErrorDomain.STORAGE,
494
495
  category: ErrorCategory.USER,
495
496
  text: "id is required for S3Vectors updateVector",
@@ -526,7 +527,7 @@ var S3Vectors = class _S3Vectors extends MastraVector {
526
527
  } catch (error) {
527
528
  throw new MastraError(
528
529
  {
529
- id: "STORAGE_S3VECTORS_VECTOR_UPDATE_VECTOR_FAILED",
530
+ id: createVectorErrorId("S3VECTORS", "UPDATE_VECTOR", "FAILED"),
530
531
  domain: ErrorDomain.STORAGE,
531
532
  category: ErrorCategory.THIRD_PARTY,
532
533
  details: {
@@ -558,7 +559,7 @@ var S3Vectors = class _S3Vectors extends MastraVector {
558
559
  } catch (error) {
559
560
  throw new MastraError(
560
561
  {
561
- id: "STORAGE_S3VECTORS_VECTOR_DELETE_VECTOR_FAILED",
562
+ id: createVectorErrorId("S3VECTORS", "DELETE_VECTOR", "FAILED"),
562
563
  domain: ErrorDomain.STORAGE,
563
564
  category: ErrorCategory.THIRD_PARTY,
564
565
  details: {
@@ -572,7 +573,7 @@ var S3Vectors = class _S3Vectors extends MastraVector {
572
573
  }
573
574
  async deleteVectors({ indexName, filter, ids }) {
574
575
  throw new MastraError({
575
- id: "STORAGE_S3VECTORS_VECTOR_DELETE_VECTORS_NOT_SUPPORTED",
576
+ id: createVectorErrorId("S3VECTORS", "DELETE_VECTORS", "NOT_SUPPORTED"),
576
577
  text: "deleteVectors is not yet implemented for S3Vectors vector store",
577
578
  domain: ErrorDomain.STORAGE,
578
579
  category: ErrorCategory.SYSTEM,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/vector/filter.ts","../src/vector/index.ts","../src/vector/prompt.ts"],"names":["uuidv4"],"mappings":"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","file":"index.js","sourcesContent":["import { BaseFilterTranslator } from '@mastra/core/vector/filter';\nimport type {\n VectorFilter,\n LogicalOperatorValueMap,\n OperatorSupport,\n QueryOperator,\n OperatorValueMap,\n BlacklistedRootOperators,\n} from '@mastra/core/vector/filter';\n\n/**\n * S3 Vectors supports a strict subset of operators and value types.\n *\n * - logical: `$and`, `$or` (non-empty arrays)\n * - basic: `$eq`, `$ne` (string | number | boolean)\n * - numeric: `$gt`, `$gte`, `$lt`, `$lte` (number)\n * - array: `$in`, `$nin` (non-empty arrays of string | number | boolean)\n * - element: `$exists` (boolean)\n */\ntype S3VectorsOperatorValueMap = Pick<\n OperatorValueMap,\n '$eq' | '$ne' | '$gt' | '$gte' | '$lt' | '$lte' | '$in' | '$nin' | '$exists'\n>;\n\ntype S3VectorsLogicalOperatorValueMap = Pick<LogicalOperatorValueMap, '$and' | '$or'>;\n\ntype S3VectorsBlacklisted = BlacklistedRootOperators;\n\ntype S3VectorsFieldValue = string | number | boolean;\n\n/**\n * High-level filter type accepted by this translator.\n * @remarks\n * Field values are limited to string/number/boolean at equality positions.\n */\nexport type S3VectorsFilter = VectorFilter<\n keyof S3VectorsOperatorValueMap,\n S3VectorsOperatorValueMap,\n S3VectorsLogicalOperatorValueMap,\n S3VectorsBlacklisted,\n S3VectorsFieldValue\n>;\n\n/**\n * Translates a high-level filter into the S3 Vectors filter shape.\n *\n * @remarks\n * - Canonicalizes **implicit AND** (e.g. `{a:1,b:2}`) into explicit `{$and:[{a:1},{b:2}]}` in any\n * non-field context that lacks `$and/$or`.\n * - Normalizes `Date` values to epoch milliseconds where allowed (numeric comparisons and array elements).\n * - Disallows `Date` at equality positions (including implicit equality).\n * - Validates shapes using the base class after translation.\n */\nexport class S3VectorsFilterTranslator extends BaseFilterTranslator<S3VectorsFilter> {\n /** @inheritdoc */\n protected override getSupportedOperators(): OperatorSupport {\n return {\n logical: ['$and', '$or'],\n basic: ['$eq', '$ne'],\n numeric: ['$gt', '$gte', '$lt', '$lte'],\n array: ['$in', '$nin'],\n element: ['$exists'],\n };\n }\n\n /**\n * Translates and validates a filter.\n * @param filter - Input filter; may be `undefined`, `null`, or `{}` (all treated as empty).\n * @returns The translated filter (or the original value if empty).\n */\n translate(filter?: S3VectorsFilter): any {\n if (this.isEmpty(filter)) return filter;\n // Perform translation (including Date → number normalization) before base shape validation.\n const translated = this.translateNode(filter as any, false);\n this.validateFilter(translated as any);\n return translated;\n }\n\n /**\n * Recursively translates a node.\n * @param node - Current node to translate.\n * @param inFieldValue - When `true`, the node is the value of a field (i.e., equality context).\n * @remarks\n * - In a **field-value** context, only primitives or operator objects are allowed.\n * - In a **non-field** context (root / logical branches), operator keys are processed;\n * plain keys become field equalities and are validated.\n * - Implicit AND is canonicalized in non-field contexts when multiple non-logical keys exist.\n */\n private translateNode(node: any, inFieldValue = false): any {\n // Primitive or Date (normalize when in a field-equality context)\n if (this.isPrimitive(node) || node instanceof Date) {\n return inFieldValue ? this.validateAndNormalizePrimitive(node) : node;\n }\n\n // Arrays are not allowed as direct equality values\n if (Array.isArray(node)) {\n if (inFieldValue) {\n throw new Error('Array equality is not supported in S3 Vectors. Use $in / $nin operators.');\n }\n return node;\n }\n\n // Object\n const entries = Object.entries(node as Record<string, any>);\n\n if (inFieldValue) {\n if (entries.length === 0) {\n throw new Error('Invalid equality value. Only string, number, or boolean are supported by S3 Vectors');\n }\n const allOperatorKeys = entries.every(([k]) => this.isOperator(k));\n if (!allOperatorKeys) {\n // Disallow shapes like: { field: { a:1, b:2 } }\n throw new Error('Invalid equality value. Only string, number, or boolean are supported by S3 Vectors');\n }\n const opEntries = entries.map(([key, value]) => [key, this.translateOperatorValue(key as QueryOperator, value)]);\n return Object.fromEntries(opEntries);\n }\n\n // Root / filter context\n const translatedEntries = entries.map(([key, value]) => {\n if (this.isOperator(key)) {\n return [key, this.translateOperatorValue(key as QueryOperator, value)];\n }\n return [key, this.translateNode(value, true)];\n });\n const obj = Object.fromEntries(translatedEntries);\n\n // Canonicalize implicit AND → explicit $and (if no $and/$or present and multiple non-logical keys)\n const keys = Object.keys(obj);\n const hasLogical = keys.some(k => k === '$and' || k === '$or');\n if (!hasLogical) {\n const nonLogical = keys.filter(k => k !== '$and' && k !== '$or');\n if (nonLogical.length > 1) {\n return { $and: nonLogical.map(k => ({ [k]: obj[k] })) };\n }\n }\n\n return obj;\n }\n\n /**\n * Translates a single operator and validates its value.\n * @param operator - One of the supported query operators.\n * @param value - Operator value to normalize/validate.\n */\n private translateOperatorValue(operator: QueryOperator, value: any): any {\n // Logical operators\n if (operator === '$and' || operator === '$or') {\n if (!Array.isArray(value) || value.length === 0) {\n throw new Error(`Value for logical operator ${operator} must be a non-empty array`);\n }\n return value.map(item => this.translateNode(item));\n }\n\n // Equality / inequality (Date is not allowed)\n if (operator === '$eq' || operator === '$ne') {\n if (value instanceof Date) {\n throw new Error('Invalid equality value. Only string, number, or boolean are supported by S3 Vectors');\n }\n return this.toPrimitiveForS3(value, operator);\n }\n\n // Numeric comparisons: require number; allow Date by converting to epoch ms\n if (operator === '$gt' || operator === '$gte' || operator === '$lt' || operator === '$lte') {\n const n = this.toNumberForRange(value, operator);\n return n;\n }\n\n // Array operators: non-empty arrays of primitives (Date converted to number)\n if (operator === '$in' || operator === '$nin') {\n if (!Array.isArray(value) || value.length === 0) {\n throw new Error(`Value for array operator ${operator} must be a non-empty array`);\n }\n return value.map(v => this.toPrimitiveForS3(v, operator));\n }\n\n // Existence check\n if (operator === '$exists') {\n if (typeof value !== 'boolean') {\n throw new Error(`Value for $exists operator must be a boolean`);\n }\n return value;\n }\n\n throw new Error(`Unsupported operator: ${operator}`);\n }\n\n /**\n * Normalizes a value to an S3-accepted primitive.\n * @param value - String | Number | Boolean | Date.\n * @param operatorForMessage - Operator name used in error messages.\n * @returns The normalized primitive; `Date` becomes epoch milliseconds.\n * @throws If the value is not a supported primitive or is null/undefined.\n */\n private toPrimitiveForS3(value: any, operatorForMessage: string): string | number | boolean {\n if (value === null || value === undefined) {\n // Error message for equality matches tests\n if (operatorForMessage === 'equality') {\n throw new Error('S3 Vectors does not support null/undefined for equality');\n }\n throw new Error(`Value for ${operatorForMessage} must be string, number, or boolean`);\n }\n if (value instanceof Date) {\n return value.getTime();\n }\n const t = typeof value;\n if (t === 'string' || t === 'boolean') return value;\n if (t === 'number') return Object.is(value, -0) ? 0 : value;\n throw new Error(`Value for ${operatorForMessage} must be string, number, or boolean`);\n }\n\n /**\n * Ensures a numeric value for range operators; allows `Date` by converting to epoch ms.\n * @param value - Candidate value.\n * @param operatorForMessage - Operator name used in error messages.\n * @throws If the value is not a number (or a Date).\n */\n private toNumberForRange(value: any, operatorForMessage: string): number {\n if (value instanceof Date) return value.getTime();\n if (typeof value === 'number' && !Number.isNaN(value)) return Object.is(value, -0) ? 0 : value;\n throw new Error(`Value for ${operatorForMessage} must be a number`);\n }\n\n /**\n * Validates and normalizes a primitive used in field equality (implicit `$eq`).\n * @param value - Candidate equality value.\n * @throws If the value is a `Date` or not a supported primitive.\n */\n private validateAndNormalizePrimitive(value: any): S3VectorsFieldValue {\n if (value instanceof Date) {\n throw new Error('Invalid equality value. Only string, number, or boolean are supported by S3 Vectors');\n }\n return this.toPrimitiveForS3(value, 'equality') as S3VectorsFieldValue;\n }\n\n /**\n * Determines whether a filter is considered empty.\n * @param filter - Input filter.\n */\n protected override isEmpty(filter: any): boolean {\n return filter === undefined || filter === null || (typeof filter === 'object' && Object.keys(filter).length === 0);\n }\n}\n","import {\n S3VectorsClient,\n CreateIndexCommand,\n DeleteIndexCommand,\n ListIndexesCommand,\n GetIndexCommand,\n PutVectorsCommand,\n QueryVectorsCommand,\n GetVectorsCommand,\n DeleteVectorsCommand,\n ListVectorsCommand,\n} from '@aws-sdk/client-s3vectors';\nimport type { S3VectorsClientConfig } from '@aws-sdk/client-s3vectors';\nimport { MastraError, ErrorDomain, ErrorCategory } from '@mastra/core/error';\nimport { MastraVector } from '@mastra/core/vector';\nimport type {\n QueryResult,\n IndexStats,\n CreateIndexParams,\n UpsertVectorParams,\n DeleteVectorsParams,\n QueryVectorParams,\n DescribeIndexParams,\n DeleteIndexParams,\n DeleteVectorParams,\n UpdateVectorParams,\n} from '@mastra/core/vector';\nimport { v4 as uuidv4 } from 'uuid';\nimport { S3VectorsFilterTranslator } from './filter';\nimport type { S3VectorsFilter } from './filter';\n\n/**\n * Options for the S3Vectors store.\n * @property vectorBucketName - Target S3 Vectors bucket name.\n * @property clientConfig - AWS SDK client options (e.g., region/credentials).\n * @property nonFilterableMetadataKeys - Metadata keys that must not be filterable (forwarded to S3 Vectors).\n */\nexport interface S3VectorsOptions {\n vectorBucketName: string;\n clientConfig?: S3VectorsClientConfig;\n nonFilterableMetadataKeys?: string[];\n}\n\ntype S3DistanceMetric = 'cosine' | 'euclidean';\ntype MastraMetric = NonNullable<CreateIndexParams['metric']>;\ntype SupportedMastraMetric = Exclude<MastraMetric, 'dotproduct'>;\n\n/**\n * Vector store backed by Amazon S3 Vectors.\n *\n * @remarks\n * - Supports `cosine` and `euclidean` distance metrics.\n * - Filters must use explicit logical operators (`$and` / `$or`). The attached translator\n * canonicalizes implicit AND (e.g., `{a:1,b:2}` → `{ $and: [{a:1},{b:2}] }`) where permitted by spec.\n * - Methods wrap AWS errors in `MastraError` with domain/category metadata.\n */\nexport class S3Vectors extends MastraVector<S3VectorsFilter> {\n private readonly client: S3VectorsClient;\n private readonly vectorBucketName: string;\n private readonly nonFilterableMetadataKeys?: string[];\n private readonly filterTranslator = new S3VectorsFilterTranslator();\n\n private static readonly METRIC_MAP: Record<SupportedMastraMetric, S3DistanceMetric> = {\n cosine: 'cosine',\n euclidean: 'euclidean',\n } as const;\n\n constructor(opts: S3VectorsOptions & { id: string }) {\n super({ id: opts.id });\n if (!opts?.vectorBucketName) {\n throw new MastraError(\n {\n id: 'STORAGE_S3VECTORS_VECTOR_MISSING_BUCKET_NAME',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n new Error('vectorBucketName is required'),\n );\n }\n this.vectorBucketName = opts.vectorBucketName;\n this.nonFilterableMetadataKeys = opts.nonFilterableMetadataKeys;\n this.client = new S3VectorsClient({ ...(opts.clientConfig ?? {}) });\n }\n\n /**\n * No-op to satisfy the base interface.\n *\n * @remarks The AWS SDK manages HTTP per request; no persistent connection is needed.\n */\n async connect(): Promise<void> {}\n\n /**\n * Closes the underlying AWS SDK HTTP handler to free sockets.\n */\n async disconnect(): Promise<void> {\n try {\n this.client.destroy();\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_S3VECTORS_VECTOR_DISCONNECT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /**\n * Creates an index or validates an existing one.\n *\n * @param params.indexName - Logical index name; normalized internally.\n * @param params.dimension - Vector dimension (must be a positive integer).\n * @param params.metric - Distance metric (`cosine` | `euclidean`). Defaults to `cosine`.\n * @throws {MastraError} If arguments are invalid or AWS returns an error.\n * @remarks\n * On `ConflictException`, we verify the existing index schema via the parent implementation\n * and return if it matches.\n */\n async createIndex({ indexName, dimension, metric = 'cosine' }: CreateIndexParams): Promise<void> {\n indexName = normalizeIndexName(indexName);\n\n let s3Metric: S3DistanceMetric;\n try {\n assertPositiveInteger(dimension, 'dimension');\n s3Metric = S3Vectors.toS3Metric(metric);\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_S3VECTORS_VECTOR_CREATE_INDEX_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName, dimension, metric },\n },\n error,\n );\n }\n\n try {\n const input: any = {\n ...this.bucketParams(),\n indexName,\n dataType: 'float32',\n dimension,\n distanceMetric: s3Metric,\n };\n if (this.nonFilterableMetadataKeys?.length) {\n input.metadataConfiguration = { nonFilterableMetadataKeys: this.nonFilterableMetadataKeys };\n }\n\n await this.client.send(new CreateIndexCommand(input));\n } catch (error: any) {\n if (error?.name === 'ConflictException') {\n await this.validateExistingIndex(indexName, dimension, metric);\n return;\n }\n throw new MastraError(\n {\n id: 'STORAGE_S3VECTORS_VECTOR_CREATE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName, dimension, metric },\n },\n error,\n );\n }\n }\n\n /**\n * Upserts vectors in bulk.\n *\n * @param params.indexName - Index to write to.\n * @param params.vectors - Array of vectors; each must match the index dimension.\n * @param params.metadata - Optional metadata per vector; `Date` values are normalized to epoch ms.\n * @param params.ids - Optional explicit IDs; if omitted, UUIDs are generated.\n * @returns Array of IDs used for the upsert (explicit or generated).\n * @throws {MastraError} If validation fails or AWS returns an error.\n */\n async upsert({ indexName, vectors, metadata, ids }: UpsertVectorParams): Promise<string[]> {\n indexName = normalizeIndexName(indexName);\n try {\n const { dimension } = await this.getIndexInfo(indexName);\n validateVectorDimensions(vectors, dimension);\n\n const generatedIds = ids ?? vectors.map(() => uuidv4());\n\n const putInput = {\n ...this.bucketParams(),\n indexName,\n vectors: vectors.map((vec, i) => ({\n key: generatedIds[i],\n data: { float32: vec },\n metadata: normalizeMetadata(metadata?.[i]),\n })),\n };\n\n await this.client.send(new PutVectorsCommand(putInput));\n return generatedIds;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_S3VECTORS_VECTOR_UPSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n /**\n * Queries nearest neighbors.\n *\n * @param params.indexName - Target index.\n * @param params.queryVector - Query vector (non-empty float32 array).\n * @param params.topK - Number of neighbors to return (positive integer). Defaults to 10.\n * @param params.filter - Metadata filter using explicit `$and`/`$or` (translator canonicalizes implicit AND).\n * @param params.includeVector - If `true`, fetches missing vector data in a second call.\n * @returns Results sorted by `score` descending.\n * @throws {MastraError} If validation fails or AWS returns an error.\n * @remarks\n * `score = 1/(1+distance)` (monotonic transform), so ranking matches the underlying distance.\n */\n async query({\n indexName,\n queryVector,\n topK = 10,\n filter,\n includeVector = false,\n }: QueryVectorParams<S3VectorsFilter>): Promise<QueryResult[]> {\n indexName = normalizeIndexName(indexName);\n\n try {\n if (!Array.isArray(queryVector) || queryVector.length === 0) {\n throw new Error('queryVector must be a non-empty float32 array');\n }\n assertPositiveInteger(topK, 'topK');\n\n const translated = this.transformFilter(filter);\n\n const out = await this.client.send(\n new QueryVectorsCommand({\n ...this.bucketParams(),\n indexName,\n topK,\n queryVector: { float32: queryVector },\n filter: translated && Object.keys(translated).length > 0 ? (translated as any) : undefined,\n returnMetadata: true,\n returnDistance: true,\n }),\n );\n\n const vectors = (out.vectors ?? []).filter(v => !!v?.key);\n\n // If includeVector is requested and some results lack data, fetch only the missing ones.\n let dataMap: Record<string, number[] | undefined> | undefined;\n if (includeVector) {\n const missingKeys = vectors.filter(v => !v.data?.float32 && v.key).map(v => v.key!) as string[];\n\n if (missingKeys.length > 0) {\n const got = await this.client.send(\n new GetVectorsCommand({\n ...this.bucketParams(),\n indexName,\n keys: missingKeys,\n returnData: true,\n returnMetadata: false,\n }),\n );\n dataMap = {};\n for (const g of got.vectors ?? []) {\n if (g.key) dataMap[g.key] = g.data?.float32 as number[] | undefined;\n }\n }\n }\n\n return vectors.map(v => {\n const id = v.key!;\n const score = S3Vectors.distanceToScore(v.distance ?? 0);\n\n const result: QueryResult = { id, score };\n\n const md = v.metadata as Record<string, unknown> | undefined;\n if (md !== undefined) result.metadata = md;\n\n if (includeVector) {\n const vec = (v.data?.float32 as number[] | undefined) ?? dataMap?.[id];\n if (vec !== undefined) result.vector = vec;\n }\n\n return result;\n });\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_S3VECTORS_VECTOR_QUERY_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n /**\n * Lists indexes within the configured bucket.\n *\n * @returns Array of index names.\n * @throws {MastraError} On AWS errors.\n */\n async listIndexes(): Promise<string[]> {\n try {\n const names: string[] = [];\n let nextToken: string | undefined;\n\n do {\n const out = await this.client.send(\n new ListIndexesCommand({\n ...this.bucketParams(),\n nextToken,\n } as any),\n );\n for (const idx of out.indexes ?? []) {\n if (idx.indexName) names.push(idx.indexName);\n }\n nextToken = out.nextToken;\n } while (nextToken);\n\n return names;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_S3VECTORS_VECTOR_LIST_INDEXES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /**\n * Returns index attributes.\n *\n * @param params.indexName - Index name.\n * @returns Object containing `dimension`, `metric`, and `count`.\n * @throws {MastraError} On AWS errors.\n * @remarks\n * `count` is computed via `ListVectors` pagination and may be costly (O(n)).\n */\n async describeIndex({ indexName }: DescribeIndexParams): Promise<IndexStats> {\n indexName = normalizeIndexName(indexName);\n try {\n const { dimension, metric } = await this.getIndexInfo(indexName);\n const count = await this.countVectors(indexName);\n return { dimension, metric, count };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_S3VECTORS_VECTOR_DESCRIBE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n /**\n * Deletes an index.\n *\n * @param params.indexName - Index name.\n * @throws {MastraError} On AWS errors.\n */\n async deleteIndex({ indexName }: DeleteIndexParams): Promise<void> {\n indexName = normalizeIndexName(indexName);\n try {\n await this.client.send(new DeleteIndexCommand({ ...this.bucketParams(), indexName } as any));\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_S3VECTORS_VECTOR_DELETE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n /**\n * Updates (replaces) a vector and/or its metadata by ID.\n *\n * @param params.indexName - Target index.\n * @param params.id - Vector ID.\n * @param params.update.vector - New vector; if omitted, the existing vector is reused.\n * @param params.update.metadata - New metadata, merged with current metadata.\n * @throws {MastraError} If the vector does not exist and `update.vector` is omitted, or on AWS error.\n * @remarks\n * S3 Vectors `PutVectors` is replace-all; we `Get` the current item, merge, then `Put`.\n */\n async updateVector({ indexName, id, update }: UpdateVectorParams): Promise<void> {\n if (!id) {\n throw new MastraError({\n id: 'STORAGE_S3VECTORS_VECTOR_UPDATE_VECTOR_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'id is required for S3Vectors updateVector',\n details: { indexName },\n });\n }\n\n indexName = normalizeIndexName(indexName);\n try {\n if (!update.vector && !update.metadata) {\n throw new Error('No updates provided');\n }\n\n const got = await this.client.send(\n new GetVectorsCommand({\n ...this.bucketParams(),\n indexName,\n keys: [id],\n returnData: true,\n returnMetadata: true,\n }),\n );\n const current = (got.vectors ?? [])[0];\n\n const newVector: number[] | undefined = update.vector ?? (current?.data?.float32 as number[] | undefined);\n if (!newVector) {\n throw new Error(`Vector \"${id}\" not found. Provide update.vector to create it.`);\n }\n\n const newMetadata =\n update.metadata !== undefined\n ? normalizeMetadata(update.metadata)\n : ((current?.metadata as Record<string, any>) ?? {});\n\n await this.client.send(\n new PutVectorsCommand({\n ...this.bucketParams(),\n indexName,\n vectors: [{ key: id, data: { float32: newVector }, metadata: newMetadata }],\n }),\n );\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_S3VECTORS_VECTOR_UPDATE_VECTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n ...(id && { id }),\n },\n },\n error,\n );\n }\n }\n\n /**\n * Deletes a vector by ID.\n *\n * @param params.indexName - Target index.\n * @param params.id - Vector ID to delete.\n * @throws {MastraError} On AWS errors.\n */\n async deleteVector({ indexName, id }: DeleteVectorParams): Promise<void> {\n indexName = normalizeIndexName(indexName);\n try {\n await this.client.send(\n new DeleteVectorsCommand({\n ...this.bucketParams(),\n indexName,\n keys: [id],\n }),\n );\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_S3VECTORS_VECTOR_DELETE_VECTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n ...(id && { id }),\n },\n },\n error,\n );\n }\n }\n\n async deleteVectors({ indexName, filter, ids }: DeleteVectorsParams): Promise<void> {\n throw new MastraError({\n id: 'STORAGE_S3VECTORS_VECTOR_DELETE_VECTORS_NOT_SUPPORTED',\n text: 'deleteVectors is not yet implemented for S3Vectors vector store',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n details: {\n indexName,\n ...(filter && { filter: JSON.stringify(filter) }),\n ...(ids && { idsCount: ids.length }),\n },\n });\n }\n\n // -------- internal helpers --------\n\n /**\n * Returns shared bucket parameters for AWS SDK calls.\n * @internal\n */\n private bucketParams(): { vectorBucketName: string } {\n return { vectorBucketName: this.vectorBucketName };\n }\n\n /**\n * Retrieves index dimension/metric via `GetIndex`.\n * @internal\n * @throws {Error} If the index does not exist.\n * @returns `{ dimension, metric }`, where `metric` includes `'dotproduct'` to satisfy Mastra types (S3 never returns it).\n */\n private async getIndexInfo(\n indexName: string,\n ): Promise<{ dimension: number; metric: 'cosine' | 'euclidean' | 'dotproduct' }> {\n const out = await this.client.send(new GetIndexCommand({ ...this.bucketParams(), indexName } as any));\n const idx = out.index;\n if (!idx) throw new Error(`Index \"${indexName}\" not found`);\n const metric = (idx.distanceMetric as S3DistanceMetric) ?? 'cosine';\n return {\n dimension: idx.dimension ?? 0,\n metric,\n };\n }\n\n /**\n * Pages through `ListVectors` and counts total items.\n * @internal\n * @remarks O(n). Avoid calling on hot paths.\n */\n private async countVectors(indexName: string): Promise<number> {\n let total = 0;\n let nextToken: string | undefined;\n\n do {\n const out = await this.client.send(\n new ListVectorsCommand({\n ...this.bucketParams(),\n indexName,\n maxResults: 1000,\n nextToken,\n returnData: false,\n returnMetadata: false,\n }),\n );\n total += (out.vectors ?? []).length;\n nextToken = out.nextToken;\n } while (nextToken);\n\n return total;\n }\n\n /**\n * Translates a high-level filter to the S3 Vectors filter shape.\n * @internal\n * @remarks Implicit AND is canonicalized by the translator where permitted by spec.\n */\n private transformFilter(filter?: S3VectorsFilter): any {\n if (!filter) return undefined;\n return this.filterTranslator.translate(filter);\n }\n\n /**\n * Converts a Mastra metric to an S3 metric.\n * @internal\n * @throws {Error} If the metric is not supported by S3 Vectors.\n */\n private static toS3Metric(metric: MastraMetric): S3DistanceMetric {\n const m = S3Vectors.METRIC_MAP[metric as SupportedMastraMetric];\n if (!m) {\n throw new Error(`Invalid metric: \"${metric}\". S3 Vectors supports only: cosine, euclidean`);\n }\n return m;\n }\n\n /**\n * Monotonic transform from distance (smaller is better) to score (larger is better).\n * @returns Number in (0, 1], preserving ranking.\n */\n private static distanceToScore(distance: number): number {\n return 1 / (1 + distance);\n }\n}\n\n// --- module-private utilities (not exported) ---\n\n/**\n * Ensures a value is a positive integer.\n * @throws {Error} If the value is not a positive integer.\n * @internal\n */\nfunction assertPositiveInteger(value: number, name: string): void {\n if (!Number.isInteger(value) || value <= 0) {\n throw new Error(`${name} must be a positive integer`);\n }\n}\n\n/**\n * Validates that all vectors match the required dimension.\n * @throws {Error} If any vector length differs from `dimension`.\n * @internal\n */\nfunction validateVectorDimensions(vectors: number[][], dimension: number): void {\n if (!Array.isArray(vectors) || vectors.length === 0) {\n throw new Error('No vectors provided for validation');\n }\n for (let i = 0; i < vectors.length; i++) {\n const len = vectors[i]?.length;\n if (len !== dimension) {\n throw new Error(`Vector at index ${i} has invalid dimension ${len}. Expected ${dimension} dimensions.`);\n }\n }\n}\n\n/**\n * Normalizes metadata values for S3 Vectors: `Date` → epoch ms.\n * @internal\n */\nfunction normalizeMetadata(meta: Record<string, any> | undefined): Record<string, any> {\n if (!meta) return {};\n const out: Record<string, any> = {};\n for (const [k, v] of Object.entries(meta)) {\n out[k] = v instanceof Date ? v.getTime() : v;\n }\n return out;\n}\n\n/**\n * Normalizes an index name to this store's canonical form (underscore → hyphen, lowercase).\n * @internal\n * @throws {TypeError} If the provided name is not a string.\n */\nfunction normalizeIndexName(str: string) {\n if (typeof str !== 'string') {\n throw new TypeError('Index name must be a string');\n }\n return str.replace(/_/g, '-').toLowerCase();\n}\n","/**\n * Vector store specific prompt that details supported operators and examples.\n * This prompt helps users construct valid filters for Amazon S3 Vectors.\n */\nexport const S3VECTORS_PROMPT = `When querying Amazon S3 Vectors, you can ONLY use the operators listed below. Any other operators will be rejected.\nImportant: Don't explain how to construct the filter - use the specified operators and fields to search the content and return relevant results.\nIf a user tries to give an explicit operator that is not supported, reject the filter entirely and let them know that the operator is not supported.\n\nBasic Comparison Operators:\n- $eq: Exact match (default when using field: value)\n Example: { \"category\": \"electronics\" }\n- $ne: Not equal\n Example: { \"category\": { \"$ne\": \"electronics\" } }\n- $gt: Greater than\n Example: { \"price\": { \"$gt\": 100 } }\n- $gte: Greater than or equal\n Example: { \"price\": { \"$gte\": 100 } }\n- $lt: Less than\n Example: { \"price\": { \"$lt\": 100 } }\n- $lte: Less than or equal\n Example: { \"price\": { \"$lte\": 100 } }\n\nArray Operators (non-empty arrays of string | number | boolean):\n- $in: Match any value in array\n Example: { \"category\": { \"$in\": [\"electronics\", \"books\"] } }\n- $nin: Does not match any value in array\n Example: { \"category\": { \"$nin\": [\"electronics\", \"books\"] } }\n\nLogical Operators:\n- $and: Logical AND (can be implicit or explicit)\n Implicit Example: { \"price\": { \"$gt\": 100 }, \"category\": \"electronics\" }\n Explicit Example: { \"$and\": [{ \"price\": { \"$gt\": 100 } }, { \"category\": \"electronics\" }] }\n- $or: Logical OR\n Example: { \"$or\": [{ \"price\": { \"$lt\": 50 } }, { \"category\": \"books\" }] }\n\nElement Operators:\n- $exists: Check if field exists\n Example: { \"rating\": { \"$exists\": true } }\n\nUnsupported / Disallowed Operators (REJECT if present):\n- $not, $nor, $regex, $all, $elemMatch, $size, $text (and any operator not listed as supported)\n\nRestrictions:\n- Only logical operators ($and, $or) can be used at the top level\n- Empty arrays for $and / $or / $in / $nin are NOT allowed\n- Nested fields are supported using dot notation\n- Multiple conditions on the same field are supported\n- At least one key-value pair is required in filter object\n- Empty objects and undefined values are treated as no filter\n- Invalid types in comparison operators will throw errors\n- All non-logical operators must be used within a field condition\n Valid: { \"field\": { \"$gt\": 100 } }\n Valid: { \"$and\": [...] }\n Invalid: { \"$gt\": 100 }\n- Logical operators must contain field conditions, not direct operators\n Valid: { \"$and\": [{ \"field\": { \"$gt\": 100 } }] }\n Invalid: { \"$and\": [{ \"$gt\": 100 }] }\n- Logical operators ($and, $or):\n - Can only be used at top level or nested within other logical operators\n - Can not be used on a field level, or be nested inside a field\n - Can not be used inside an operator\n - Valid: { \"$and\": [{ \"field\": { \"$gt\": 100 } }] }\n - Valid: { \"$or\": [{ \"$and\": [{ \"field\": { \"$gt\": 100 } }] }] }\n - Invalid: { \"field\": { \"$and\": [{ \"$gt\": 100 }] } }\n - Invalid: { \"field\": { \"$or\": [{ \"$gt\": 100 }] } }\n - Invalid: { \"field\": { \"$gt\": { \"$and\": [{...}] } } }\n- Equality values must be string, number, or boolean (arrays and objects are not allowed for equality)\n- Filters operate only on filterable metadata keys; using a non-filterable key will fail\n- Filterable metadata values are primitives (string/number/boolean) or arrays of primitives; large/long-text fields should be non-filterable and are not usable in filters\n\nExample Complex Query:\n{\n \"$and\": [\n { \"category\": { \"$in\": [\"electronics\", \"computers\"] } },\n { \"price\": { \"$gte\": 100, \"$lte\": 1000 } },\n { \"$or\": [\n { \"stock\": { \"$gt\": 0 } },\n { \"preorder\": true }\n ] }\n ]\n}`;\n"]}
1
+ {"version":3,"sources":["../src/vector/filter.ts","../src/vector/index.ts","../src/vector/prompt.ts"],"names":["uuidv4"],"mappings":"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","file":"index.js","sourcesContent":["import { BaseFilterTranslator } from '@mastra/core/vector/filter';\nimport type {\n VectorFilter,\n LogicalOperatorValueMap,\n OperatorSupport,\n QueryOperator,\n OperatorValueMap,\n BlacklistedRootOperators,\n} from '@mastra/core/vector/filter';\n\n/**\n * S3 Vectors supports a strict subset of operators and value types.\n *\n * - logical: `$and`, `$or` (non-empty arrays)\n * - basic: `$eq`, `$ne` (string | number | boolean)\n * - numeric: `$gt`, `$gte`, `$lt`, `$lte` (number)\n * - array: `$in`, `$nin` (non-empty arrays of string | number | boolean)\n * - element: `$exists` (boolean)\n */\ntype S3VectorsOperatorValueMap = Pick<\n OperatorValueMap,\n '$eq' | '$ne' | '$gt' | '$gte' | '$lt' | '$lte' | '$in' | '$nin' | '$exists'\n>;\n\ntype S3VectorsLogicalOperatorValueMap = Pick<LogicalOperatorValueMap, '$and' | '$or'>;\n\ntype S3VectorsBlacklisted = BlacklistedRootOperators;\n\ntype S3VectorsFieldValue = string | number | boolean;\n\n/**\n * High-level filter type accepted by this translator.\n * @remarks\n * Field values are limited to string/number/boolean at equality positions.\n */\nexport type S3VectorsFilter = VectorFilter<\n keyof S3VectorsOperatorValueMap,\n S3VectorsOperatorValueMap,\n S3VectorsLogicalOperatorValueMap,\n S3VectorsBlacklisted,\n S3VectorsFieldValue\n>;\n\n/**\n * Translates a high-level filter into the S3 Vectors filter shape.\n *\n * @remarks\n * - Canonicalizes **implicit AND** (e.g. `{a:1,b:2}`) into explicit `{$and:[{a:1},{b:2}]}` in any\n * non-field context that lacks `$and/$or`.\n * - Normalizes `Date` values to epoch milliseconds where allowed (numeric comparisons and array elements).\n * - Disallows `Date` at equality positions (including implicit equality).\n * - Validates shapes using the base class after translation.\n */\nexport class S3VectorsFilterTranslator extends BaseFilterTranslator<S3VectorsFilter> {\n /** @inheritdoc */\n protected override getSupportedOperators(): OperatorSupport {\n return {\n logical: ['$and', '$or'],\n basic: ['$eq', '$ne'],\n numeric: ['$gt', '$gte', '$lt', '$lte'],\n array: ['$in', '$nin'],\n element: ['$exists'],\n };\n }\n\n /**\n * Translates and validates a filter.\n * @param filter - Input filter; may be `undefined`, `null`, or `{}` (all treated as empty).\n * @returns The translated filter (or the original value if empty).\n */\n translate(filter?: S3VectorsFilter): any {\n if (this.isEmpty(filter)) return filter;\n // Perform translation (including Date → number normalization) before base shape validation.\n const translated = this.translateNode(filter as any, false);\n this.validateFilter(translated as any);\n return translated;\n }\n\n /**\n * Recursively translates a node.\n * @param node - Current node to translate.\n * @param inFieldValue - When `true`, the node is the value of a field (i.e., equality context).\n * @remarks\n * - In a **field-value** context, only primitives or operator objects are allowed.\n * - In a **non-field** context (root / logical branches), operator keys are processed;\n * plain keys become field equalities and are validated.\n * - Implicit AND is canonicalized in non-field contexts when multiple non-logical keys exist.\n */\n private translateNode(node: any, inFieldValue = false): any {\n // Primitive or Date (normalize when in a field-equality context)\n if (this.isPrimitive(node) || node instanceof Date) {\n return inFieldValue ? this.validateAndNormalizePrimitive(node) : node;\n }\n\n // Arrays are not allowed as direct equality values\n if (Array.isArray(node)) {\n if (inFieldValue) {\n throw new Error('Array equality is not supported in S3 Vectors. Use $in / $nin operators.');\n }\n return node;\n }\n\n // Object\n const entries = Object.entries(node as Record<string, any>);\n\n if (inFieldValue) {\n if (entries.length === 0) {\n throw new Error('Invalid equality value. Only string, number, or boolean are supported by S3 Vectors');\n }\n const allOperatorKeys = entries.every(([k]) => this.isOperator(k));\n if (!allOperatorKeys) {\n // Disallow shapes like: { field: { a:1, b:2 } }\n throw new Error('Invalid equality value. Only string, number, or boolean are supported by S3 Vectors');\n }\n const opEntries = entries.map(([key, value]) => [key, this.translateOperatorValue(key as QueryOperator, value)]);\n return Object.fromEntries(opEntries);\n }\n\n // Root / filter context\n const translatedEntries = entries.map(([key, value]) => {\n if (this.isOperator(key)) {\n return [key, this.translateOperatorValue(key as QueryOperator, value)];\n }\n return [key, this.translateNode(value, true)];\n });\n const obj = Object.fromEntries(translatedEntries);\n\n // Canonicalize implicit AND → explicit $and (if no $and/$or present and multiple non-logical keys)\n const keys = Object.keys(obj);\n const hasLogical = keys.some(k => k === '$and' || k === '$or');\n if (!hasLogical) {\n const nonLogical = keys.filter(k => k !== '$and' && k !== '$or');\n if (nonLogical.length > 1) {\n return { $and: nonLogical.map(k => ({ [k]: obj[k] })) };\n }\n }\n\n return obj;\n }\n\n /**\n * Translates a single operator and validates its value.\n * @param operator - One of the supported query operators.\n * @param value - Operator value to normalize/validate.\n */\n private translateOperatorValue(operator: QueryOperator, value: any): any {\n // Logical operators\n if (operator === '$and' || operator === '$or') {\n if (!Array.isArray(value) || value.length === 0) {\n throw new Error(`Value for logical operator ${operator} must be a non-empty array`);\n }\n return value.map(item => this.translateNode(item));\n }\n\n // Equality / inequality (Date is not allowed)\n if (operator === '$eq' || operator === '$ne') {\n if (value instanceof Date) {\n throw new Error('Invalid equality value. Only string, number, or boolean are supported by S3 Vectors');\n }\n return this.toPrimitiveForS3(value, operator);\n }\n\n // Numeric comparisons: require number; allow Date by converting to epoch ms\n if (operator === '$gt' || operator === '$gte' || operator === '$lt' || operator === '$lte') {\n const n = this.toNumberForRange(value, operator);\n return n;\n }\n\n // Array operators: non-empty arrays of primitives (Date converted to number)\n if (operator === '$in' || operator === '$nin') {\n if (!Array.isArray(value) || value.length === 0) {\n throw new Error(`Value for array operator ${operator} must be a non-empty array`);\n }\n return value.map(v => this.toPrimitiveForS3(v, operator));\n }\n\n // Existence check\n if (operator === '$exists') {\n if (typeof value !== 'boolean') {\n throw new Error(`Value for $exists operator must be a boolean`);\n }\n return value;\n }\n\n throw new Error(`Unsupported operator: ${operator}`);\n }\n\n /**\n * Normalizes a value to an S3-accepted primitive.\n * @param value - String | Number | Boolean | Date.\n * @param operatorForMessage - Operator name used in error messages.\n * @returns The normalized primitive; `Date` becomes epoch milliseconds.\n * @throws If the value is not a supported primitive or is null/undefined.\n */\n private toPrimitiveForS3(value: any, operatorForMessage: string): string | number | boolean {\n if (value === null || value === undefined) {\n // Error message for equality matches tests\n if (operatorForMessage === 'equality') {\n throw new Error('S3 Vectors does not support null/undefined for equality');\n }\n throw new Error(`Value for ${operatorForMessage} must be string, number, or boolean`);\n }\n if (value instanceof Date) {\n return value.getTime();\n }\n const t = typeof value;\n if (t === 'string' || t === 'boolean') return value;\n if (t === 'number') return Object.is(value, -0) ? 0 : value;\n throw new Error(`Value for ${operatorForMessage} must be string, number, or boolean`);\n }\n\n /**\n * Ensures a numeric value for range operators; allows `Date` by converting to epoch ms.\n * @param value - Candidate value.\n * @param operatorForMessage - Operator name used in error messages.\n * @throws If the value is not a number (or a Date).\n */\n private toNumberForRange(value: any, operatorForMessage: string): number {\n if (value instanceof Date) return value.getTime();\n if (typeof value === 'number' && !Number.isNaN(value)) return Object.is(value, -0) ? 0 : value;\n throw new Error(`Value for ${operatorForMessage} must be a number`);\n }\n\n /**\n * Validates and normalizes a primitive used in field equality (implicit `$eq`).\n * @param value - Candidate equality value.\n * @throws If the value is a `Date` or not a supported primitive.\n */\n private validateAndNormalizePrimitive(value: any): S3VectorsFieldValue {\n if (value instanceof Date) {\n throw new Error('Invalid equality value. Only string, number, or boolean are supported by S3 Vectors');\n }\n return this.toPrimitiveForS3(value, 'equality') as S3VectorsFieldValue;\n }\n\n /**\n * Determines whether a filter is considered empty.\n * @param filter - Input filter.\n */\n protected override isEmpty(filter: any): boolean {\n return filter === undefined || filter === null || (typeof filter === 'object' && Object.keys(filter).length === 0);\n }\n}\n","import {\n S3VectorsClient,\n CreateIndexCommand,\n DeleteIndexCommand,\n ListIndexesCommand,\n GetIndexCommand,\n PutVectorsCommand,\n QueryVectorsCommand,\n GetVectorsCommand,\n DeleteVectorsCommand,\n ListVectorsCommand,\n} from '@aws-sdk/client-s3vectors';\nimport type { S3VectorsClientConfig } from '@aws-sdk/client-s3vectors';\nimport { MastraError, ErrorDomain, ErrorCategory } from '@mastra/core/error';\nimport { createVectorErrorId } from '@mastra/core/storage';\nimport { MastraVector } from '@mastra/core/vector';\nimport type {\n QueryResult,\n IndexStats,\n CreateIndexParams,\n UpsertVectorParams,\n DeleteVectorsParams,\n QueryVectorParams,\n DescribeIndexParams,\n DeleteIndexParams,\n DeleteVectorParams,\n UpdateVectorParams,\n} from '@mastra/core/vector';\nimport { v4 as uuidv4 } from 'uuid';\nimport { S3VectorsFilterTranslator } from './filter';\nimport type { S3VectorsFilter } from './filter';\n\n/**\n * Options for the S3Vectors store.\n * @property vectorBucketName - Target S3 Vectors bucket name.\n * @property clientConfig - AWS SDK client options (e.g., region/credentials).\n * @property nonFilterableMetadataKeys - Metadata keys that must not be filterable (forwarded to S3 Vectors).\n */\nexport interface S3VectorsOptions {\n vectorBucketName: string;\n clientConfig?: S3VectorsClientConfig;\n nonFilterableMetadataKeys?: string[];\n}\n\ntype S3DistanceMetric = 'cosine' | 'euclidean';\ntype MastraMetric = NonNullable<CreateIndexParams['metric']>;\ntype SupportedMastraMetric = Exclude<MastraMetric, 'dotproduct'>;\n\n/**\n * Vector store backed by Amazon S3 Vectors.\n *\n * @remarks\n * - Supports `cosine` and `euclidean` distance metrics.\n * - Filters must use explicit logical operators (`$and` / `$or`). The attached translator\n * canonicalizes implicit AND (e.g., `{a:1,b:2}` → `{ $and: [{a:1},{b:2}] }`) where permitted by spec.\n * - Methods wrap AWS errors in `MastraError` with domain/category metadata.\n */\nexport class S3Vectors extends MastraVector<S3VectorsFilter> {\n private readonly client: S3VectorsClient;\n private readonly vectorBucketName: string;\n private readonly nonFilterableMetadataKeys?: string[];\n private readonly filterTranslator = new S3VectorsFilterTranslator();\n\n private static readonly METRIC_MAP: Record<SupportedMastraMetric, S3DistanceMetric> = {\n cosine: 'cosine',\n euclidean: 'euclidean',\n } as const;\n\n constructor(opts: S3VectorsOptions & { id: string }) {\n super({ id: opts.id });\n if (!opts?.vectorBucketName) {\n throw new MastraError(\n {\n id: createVectorErrorId('S3VECTORS', 'INITIALIZATION', 'MISSING_BUCKET_NAME'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n new Error('vectorBucketName is required'),\n );\n }\n this.vectorBucketName = opts.vectorBucketName;\n this.nonFilterableMetadataKeys = opts.nonFilterableMetadataKeys;\n this.client = new S3VectorsClient({ ...(opts.clientConfig ?? {}) });\n }\n\n /**\n * No-op to satisfy the base interface.\n *\n * @remarks The AWS SDK manages HTTP per request; no persistent connection is needed.\n */\n async connect(): Promise<void> {}\n\n /**\n * Closes the underlying AWS SDK HTTP handler to free sockets.\n */\n async disconnect(): Promise<void> {\n try {\n this.client.destroy();\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('S3VECTORS', 'DISCONNECT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /**\n * Creates an index or validates an existing one.\n *\n * @param params.indexName - Logical index name; normalized internally.\n * @param params.dimension - Vector dimension (must be a positive integer).\n * @param params.metric - Distance metric (`cosine` | `euclidean`). Defaults to `cosine`.\n * @throws {MastraError} If arguments are invalid or AWS returns an error.\n * @remarks\n * On `ConflictException`, we verify the existing index schema via the parent implementation\n * and return if it matches.\n */\n async createIndex({ indexName, dimension, metric = 'cosine' }: CreateIndexParams): Promise<void> {\n indexName = normalizeIndexName(indexName);\n\n let s3Metric: S3DistanceMetric;\n try {\n assertPositiveInteger(dimension, 'dimension');\n s3Metric = S3Vectors.toS3Metric(metric);\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('S3VECTORS', 'CREATE_INDEX', 'INVALID_ARGS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName, dimension, metric },\n },\n error,\n );\n }\n\n try {\n const input: any = {\n ...this.bucketParams(),\n indexName,\n dataType: 'float32',\n dimension,\n distanceMetric: s3Metric,\n };\n if (this.nonFilterableMetadataKeys?.length) {\n input.metadataConfiguration = { nonFilterableMetadataKeys: this.nonFilterableMetadataKeys };\n }\n\n await this.client.send(new CreateIndexCommand(input));\n } catch (error: any) {\n if (error?.name === 'ConflictException') {\n await this.validateExistingIndex(indexName, dimension, metric);\n return;\n }\n throw new MastraError(\n {\n id: createVectorErrorId('S3VECTORS', 'CREATE_INDEX', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName, dimension, metric },\n },\n error,\n );\n }\n }\n\n /**\n * Upserts vectors in bulk.\n *\n * @param params.indexName - Index to write to.\n * @param params.vectors - Array of vectors; each must match the index dimension.\n * @param params.metadata - Optional metadata per vector; `Date` values are normalized to epoch ms.\n * @param params.ids - Optional explicit IDs; if omitted, UUIDs are generated.\n * @returns Array of IDs used for the upsert (explicit or generated).\n * @throws {MastraError} If validation fails or AWS returns an error.\n */\n async upsert({ indexName, vectors, metadata, ids }: UpsertVectorParams): Promise<string[]> {\n indexName = normalizeIndexName(indexName);\n try {\n const { dimension } = await this.getIndexInfo(indexName);\n validateVectorDimensions(vectors, dimension);\n\n const generatedIds = ids ?? vectors.map(() => uuidv4());\n\n const putInput = {\n ...this.bucketParams(),\n indexName,\n vectors: vectors.map((vec, i) => ({\n key: generatedIds[i],\n data: { float32: vec },\n metadata: normalizeMetadata(metadata?.[i]),\n })),\n };\n\n await this.client.send(new PutVectorsCommand(putInput));\n return generatedIds;\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('S3VECTORS', 'UPSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n /**\n * Queries nearest neighbors.\n *\n * @param params.indexName - Target index.\n * @param params.queryVector - Query vector (non-empty float32 array).\n * @param params.topK - Number of neighbors to return (positive integer). Defaults to 10.\n * @param params.filter - Metadata filter using explicit `$and`/`$or` (translator canonicalizes implicit AND).\n * @param params.includeVector - If `true`, fetches missing vector data in a second call.\n * @returns Results sorted by `score` descending.\n * @throws {MastraError} If validation fails or AWS returns an error.\n * @remarks\n * `score = 1/(1+distance)` (monotonic transform), so ranking matches the underlying distance.\n */\n async query({\n indexName,\n queryVector,\n topK = 10,\n filter,\n includeVector = false,\n }: QueryVectorParams<S3VectorsFilter>): Promise<QueryResult[]> {\n indexName = normalizeIndexName(indexName);\n\n try {\n if (!Array.isArray(queryVector) || queryVector.length === 0) {\n throw new Error('queryVector must be a non-empty float32 array');\n }\n assertPositiveInteger(topK, 'topK');\n\n const translated = this.transformFilter(filter);\n\n const out = await this.client.send(\n new QueryVectorsCommand({\n ...this.bucketParams(),\n indexName,\n topK,\n queryVector: { float32: queryVector },\n filter: translated && Object.keys(translated).length > 0 ? (translated as any) : undefined,\n returnMetadata: true,\n returnDistance: true,\n }),\n );\n\n const vectors = (out.vectors ?? []).filter(v => !!v?.key);\n\n // If includeVector is requested and some results lack data, fetch only the missing ones.\n let dataMap: Record<string, number[] | undefined> | undefined;\n if (includeVector) {\n const missingKeys = vectors.filter(v => !v.data?.float32 && v.key).map(v => v.key!) as string[];\n\n if (missingKeys.length > 0) {\n const got = await this.client.send(\n new GetVectorsCommand({\n ...this.bucketParams(),\n indexName,\n keys: missingKeys,\n returnData: true,\n returnMetadata: false,\n }),\n );\n dataMap = {};\n for (const g of got.vectors ?? []) {\n if (g.key) dataMap[g.key] = g.data?.float32 as number[] | undefined;\n }\n }\n }\n\n return vectors.map(v => {\n const id = v.key!;\n const score = S3Vectors.distanceToScore(v.distance ?? 0);\n\n const result: QueryResult = { id, score };\n\n const md = v.metadata as Record<string, unknown> | undefined;\n if (md !== undefined) result.metadata = md;\n\n if (includeVector) {\n const vec = (v.data?.float32 as number[] | undefined) ?? dataMap?.[id];\n if (vec !== undefined) result.vector = vec;\n }\n\n return result;\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('S3VECTORS', 'QUERY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n /**\n * Lists indexes within the configured bucket.\n *\n * @returns Array of index names.\n * @throws {MastraError} On AWS errors.\n */\n async listIndexes(): Promise<string[]> {\n try {\n const names: string[] = [];\n let nextToken: string | undefined;\n\n do {\n const out = await this.client.send(\n new ListIndexesCommand({\n ...this.bucketParams(),\n nextToken,\n } as any),\n );\n for (const idx of out.indexes ?? []) {\n if (idx.indexName) names.push(idx.indexName);\n }\n nextToken = out.nextToken;\n } while (nextToken);\n\n return names;\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('S3VECTORS', 'LIST_INDEXES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /**\n * Returns index attributes.\n *\n * @param params.indexName - Index name.\n * @returns Object containing `dimension`, `metric`, and `count`.\n * @throws {MastraError} On AWS errors.\n * @remarks\n * `count` is computed via `ListVectors` pagination and may be costly (O(n)).\n */\n async describeIndex({ indexName }: DescribeIndexParams): Promise<IndexStats> {\n indexName = normalizeIndexName(indexName);\n try {\n const { dimension, metric } = await this.getIndexInfo(indexName);\n const count = await this.countVectors(indexName);\n return { dimension, metric, count };\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('S3VECTORS', 'DESCRIBE_INDEX', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n /**\n * Deletes an index.\n *\n * @param params.indexName - Index name.\n * @throws {MastraError} On AWS errors.\n */\n async deleteIndex({ indexName }: DeleteIndexParams): Promise<void> {\n indexName = normalizeIndexName(indexName);\n try {\n await this.client.send(new DeleteIndexCommand({ ...this.bucketParams(), indexName } as any));\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('S3VECTORS', 'DELETE_INDEX', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n /**\n * Updates (replaces) a vector and/or its metadata by ID.\n *\n * @param params.indexName - Target index.\n * @param params.id - Vector ID.\n * @param params.update.vector - New vector; if omitted, the existing vector is reused.\n * @param params.update.metadata - New metadata, merged with current metadata.\n * @throws {MastraError} If the vector does not exist and `update.vector` is omitted, or on AWS error.\n * @remarks\n * S3 Vectors `PutVectors` is replace-all; we `Get` the current item, merge, then `Put`.\n */\n async updateVector({ indexName, id, update }: UpdateVectorParams): Promise<void> {\n if (!id) {\n throw new MastraError({\n id: createVectorErrorId('S3VECTORS', 'UPDATE_VECTOR', 'INVALID_ARGS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'id is required for S3Vectors updateVector',\n details: { indexName },\n });\n }\n\n indexName = normalizeIndexName(indexName);\n try {\n if (!update.vector && !update.metadata) {\n throw new Error('No updates provided');\n }\n\n const got = await this.client.send(\n new GetVectorsCommand({\n ...this.bucketParams(),\n indexName,\n keys: [id],\n returnData: true,\n returnMetadata: true,\n }),\n );\n const current = (got.vectors ?? [])[0];\n\n const newVector: number[] | undefined = update.vector ?? (current?.data?.float32 as number[] | undefined);\n if (!newVector) {\n throw new Error(`Vector \"${id}\" not found. Provide update.vector to create it.`);\n }\n\n const newMetadata =\n update.metadata !== undefined\n ? normalizeMetadata(update.metadata)\n : ((current?.metadata as Record<string, any>) ?? {});\n\n await this.client.send(\n new PutVectorsCommand({\n ...this.bucketParams(),\n indexName,\n vectors: [{ key: id, data: { float32: newVector }, metadata: newMetadata }],\n }),\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('S3VECTORS', 'UPDATE_VECTOR', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n ...(id && { id }),\n },\n },\n error,\n );\n }\n }\n\n /**\n * Deletes a vector by ID.\n *\n * @param params.indexName - Target index.\n * @param params.id - Vector ID to delete.\n * @throws {MastraError} On AWS errors.\n */\n async deleteVector({ indexName, id }: DeleteVectorParams): Promise<void> {\n indexName = normalizeIndexName(indexName);\n try {\n await this.client.send(\n new DeleteVectorsCommand({\n ...this.bucketParams(),\n indexName,\n keys: [id],\n }),\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('S3VECTORS', 'DELETE_VECTOR', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n ...(id && { id }),\n },\n },\n error,\n );\n }\n }\n\n async deleteVectors({ indexName, filter, ids }: DeleteVectorsParams): Promise<void> {\n throw new MastraError({\n id: createVectorErrorId('S3VECTORS', 'DELETE_VECTORS', 'NOT_SUPPORTED'),\n text: 'deleteVectors is not yet implemented for S3Vectors vector store',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n details: {\n indexName,\n ...(filter && { filter: JSON.stringify(filter) }),\n ...(ids && { idsCount: ids.length }),\n },\n });\n }\n\n // -------- internal helpers --------\n\n /**\n * Returns shared bucket parameters for AWS SDK calls.\n * @internal\n */\n private bucketParams(): { vectorBucketName: string } {\n return { vectorBucketName: this.vectorBucketName };\n }\n\n /**\n * Retrieves index dimension/metric via `GetIndex`.\n * @internal\n * @throws {Error} If the index does not exist.\n * @returns `{ dimension, metric }`, where `metric` includes `'dotproduct'` to satisfy Mastra types (S3 never returns it).\n */\n private async getIndexInfo(\n indexName: string,\n ): Promise<{ dimension: number; metric: 'cosine' | 'euclidean' | 'dotproduct' }> {\n const out = await this.client.send(new GetIndexCommand({ ...this.bucketParams(), indexName } as any));\n const idx = out.index;\n if (!idx) throw new Error(`Index \"${indexName}\" not found`);\n const metric = (idx.distanceMetric as S3DistanceMetric) ?? 'cosine';\n return {\n dimension: idx.dimension ?? 0,\n metric,\n };\n }\n\n /**\n * Pages through `ListVectors` and counts total items.\n * @internal\n * @remarks O(n). Avoid calling on hot paths.\n */\n private async countVectors(indexName: string): Promise<number> {\n let total = 0;\n let nextToken: string | undefined;\n\n do {\n const out = await this.client.send(\n new ListVectorsCommand({\n ...this.bucketParams(),\n indexName,\n maxResults: 1000,\n nextToken,\n returnData: false,\n returnMetadata: false,\n }),\n );\n total += (out.vectors ?? []).length;\n nextToken = out.nextToken;\n } while (nextToken);\n\n return total;\n }\n\n /**\n * Translates a high-level filter to the S3 Vectors filter shape.\n * @internal\n * @remarks Implicit AND is canonicalized by the translator where permitted by spec.\n */\n private transformFilter(filter?: S3VectorsFilter): any {\n if (!filter) return undefined;\n return this.filterTranslator.translate(filter);\n }\n\n /**\n * Converts a Mastra metric to an S3 metric.\n * @internal\n * @throws {Error} If the metric is not supported by S3 Vectors.\n */\n private static toS3Metric(metric: MastraMetric): S3DistanceMetric {\n const m = S3Vectors.METRIC_MAP[metric as SupportedMastraMetric];\n if (!m) {\n throw new Error(`Invalid metric: \"${metric}\". S3 Vectors supports only: cosine, euclidean`);\n }\n return m;\n }\n\n /**\n * Monotonic transform from distance (smaller is better) to score (larger is better).\n * @returns Number in (0, 1], preserving ranking.\n */\n private static distanceToScore(distance: number): number {\n return 1 / (1 + distance);\n }\n}\n\n// --- module-private utilities (not exported) ---\n\n/**\n * Ensures a value is a positive integer.\n * @throws {Error} If the value is not a positive integer.\n * @internal\n */\nfunction assertPositiveInteger(value: number, name: string): void {\n if (!Number.isInteger(value) || value <= 0) {\n throw new Error(`${name} must be a positive integer`);\n }\n}\n\n/**\n * Validates that all vectors match the required dimension.\n * @throws {Error} If any vector length differs from `dimension`.\n * @internal\n */\nfunction validateVectorDimensions(vectors: number[][], dimension: number): void {\n if (!Array.isArray(vectors) || vectors.length === 0) {\n throw new Error('No vectors provided for validation');\n }\n for (let i = 0; i < vectors.length; i++) {\n const len = vectors[i]?.length;\n if (len !== dimension) {\n throw new Error(`Vector at index ${i} has invalid dimension ${len}. Expected ${dimension} dimensions.`);\n }\n }\n}\n\n/**\n * Normalizes metadata values for S3 Vectors: `Date` → epoch ms.\n * @internal\n */\nfunction normalizeMetadata(meta: Record<string, any> | undefined): Record<string, any> {\n if (!meta) return {};\n const out: Record<string, any> = {};\n for (const [k, v] of Object.entries(meta)) {\n out[k] = v instanceof Date ? v.getTime() : v;\n }\n return out;\n}\n\n/**\n * Normalizes an index name to this store's canonical form (underscore → hyphen, lowercase).\n * @internal\n * @throws {TypeError} If the provided name is not a string.\n */\nfunction normalizeIndexName(str: string) {\n if (typeof str !== 'string') {\n throw new TypeError('Index name must be a string');\n }\n return str.replace(/_/g, '-').toLowerCase();\n}\n","/**\n * Vector store specific prompt that details supported operators and examples.\n * This prompt helps users construct valid filters for Amazon S3 Vectors.\n */\nexport const S3VECTORS_PROMPT = `When querying Amazon S3 Vectors, you can ONLY use the operators listed below. Any other operators will be rejected.\nImportant: Don't explain how to construct the filter - use the specified operators and fields to search the content and return relevant results.\nIf a user tries to give an explicit operator that is not supported, reject the filter entirely and let them know that the operator is not supported.\n\nBasic Comparison Operators:\n- $eq: Exact match (default when using field: value)\n Example: { \"category\": \"electronics\" }\n- $ne: Not equal\n Example: { \"category\": { \"$ne\": \"electronics\" } }\n- $gt: Greater than\n Example: { \"price\": { \"$gt\": 100 } }\n- $gte: Greater than or equal\n Example: { \"price\": { \"$gte\": 100 } }\n- $lt: Less than\n Example: { \"price\": { \"$lt\": 100 } }\n- $lte: Less than or equal\n Example: { \"price\": { \"$lte\": 100 } }\n\nArray Operators (non-empty arrays of string | number | boolean):\n- $in: Match any value in array\n Example: { \"category\": { \"$in\": [\"electronics\", \"books\"] } }\n- $nin: Does not match any value in array\n Example: { \"category\": { \"$nin\": [\"electronics\", \"books\"] } }\n\nLogical Operators:\n- $and: Logical AND (can be implicit or explicit)\n Implicit Example: { \"price\": { \"$gt\": 100 }, \"category\": \"electronics\" }\n Explicit Example: { \"$and\": [{ \"price\": { \"$gt\": 100 } }, { \"category\": \"electronics\" }] }\n- $or: Logical OR\n Example: { \"$or\": [{ \"price\": { \"$lt\": 50 } }, { \"category\": \"books\" }] }\n\nElement Operators:\n- $exists: Check if field exists\n Example: { \"rating\": { \"$exists\": true } }\n\nUnsupported / Disallowed Operators (REJECT if present):\n- $not, $nor, $regex, $all, $elemMatch, $size, $text (and any operator not listed as supported)\n\nRestrictions:\n- Only logical operators ($and, $or) can be used at the top level\n- Empty arrays for $and / $or / $in / $nin are NOT allowed\n- Nested fields are supported using dot notation\n- Multiple conditions on the same field are supported\n- At least one key-value pair is required in filter object\n- Empty objects and undefined values are treated as no filter\n- Invalid types in comparison operators will throw errors\n- All non-logical operators must be used within a field condition\n Valid: { \"field\": { \"$gt\": 100 } }\n Valid: { \"$and\": [...] }\n Invalid: { \"$gt\": 100 }\n- Logical operators must contain field conditions, not direct operators\n Valid: { \"$and\": [{ \"field\": { \"$gt\": 100 } }] }\n Invalid: { \"$and\": [{ \"$gt\": 100 }] }\n- Logical operators ($and, $or):\n - Can only be used at top level or nested within other logical operators\n - Can not be used on a field level, or be nested inside a field\n - Can not be used inside an operator\n - Valid: { \"$and\": [{ \"field\": { \"$gt\": 100 } }] }\n - Valid: { \"$or\": [{ \"$and\": [{ \"field\": { \"$gt\": 100 } }] }] }\n - Invalid: { \"field\": { \"$and\": [{ \"$gt\": 100 }] } }\n - Invalid: { \"field\": { \"$or\": [{ \"$gt\": 100 }] } }\n - Invalid: { \"field\": { \"$gt\": { \"$and\": [{...}] } } }\n- Equality values must be string, number, or boolean (arrays and objects are not allowed for equality)\n- Filters operate only on filterable metadata keys; using a non-filterable key will fail\n- Filterable metadata values are primitives (string/number/boolean) or arrays of primitives; large/long-text fields should be non-filterable and are not usable in filters\n\nExample Complex Query:\n{\n \"$and\": [\n { \"category\": { \"$in\": [\"electronics\", \"computers\"] } },\n { \"price\": { \"$gte\": 100, \"$lte\": 1000 } },\n { \"$or\": [\n { \"stock\": { \"$gt\": 0 } },\n { \"preorder\": true }\n ] }\n ]\n}`;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vector/index.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAEvE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,qBAAqB,CAAC;IACrC,yBAAyB,CAAC,EAAE,MAAM,EAAE,CAAC;CACtC;AAMD;;;;;;;;GAQG;AACH,qBAAa,SAAU,SAAQ,YAAY,CAAC,eAAe,CAAC;IAC1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAW;IACtD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmC;IAEpE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAGvB;gBAEC,IAAI,EAAE,gBAAgB,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE;IAiBnD;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAE9B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAejC;;;;;;;;;;OAUG;IACG,WAAW,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAiB,EAAE,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiDhG;;;;;;;;;OASG;IACG,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAiC1F;;;;;;;;;;;;OAYG;IACG,KAAK,CAAC,EACV,SAAS,EACT,WAAW,EACX,IAAS,EACT,MAAM,EACN,aAAqB,GACtB,EAAE,iBAAiB,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA4E9D;;;;;OAKG;IACG,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IA+BtC;;;;;;;;OAQG;IACG,aAAa,CAAC,EAAE,SAAS,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC;IAmB5E;;;;;OAKG;IACG,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBlE;;;;;;;;;;OAUG;IACG,YAAY,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IA6DhF;;;;;;OAMG;IACG,YAAY,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BlE,aAAa,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBnF;;;OAGG;IACH,OAAO,CAAC,YAAY;IAIpB;;;;;OAKG;YACW,YAAY;IAa1B;;;;OAIG;YACW,YAAY;IAsB1B;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAKvB;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;IAQzB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;CAG/B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vector/index.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAGvE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,qBAAqB,CAAC;IACrC,yBAAyB,CAAC,EAAE,MAAM,EAAE,CAAC;CACtC;AAMD;;;;;;;;GAQG;AACH,qBAAa,SAAU,SAAQ,YAAY,CAAC,eAAe,CAAC;IAC1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAW;IACtD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmC;IAEpE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAGvB;gBAEC,IAAI,EAAE,gBAAgB,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE;IAiBnD;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAE9B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAejC;;;;;;;;;;OAUG;IACG,WAAW,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAiB,EAAE,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiDhG;;;;;;;;;OASG;IACG,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAiC1F;;;;;;;;;;;;OAYG;IACG,KAAK,CAAC,EACV,SAAS,EACT,WAAW,EACX,IAAS,EACT,MAAM,EACN,aAAqB,GACtB,EAAE,iBAAiB,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA4E9D;;;;;OAKG;IACG,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IA+BtC;;;;;;;;OAQG;IACG,aAAa,CAAC,EAAE,SAAS,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC;IAmB5E;;;;;OAKG;IACG,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBlE;;;;;;;;;;OAUG;IACG,YAAY,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IA6DhF;;;;;;OAMG;IACG,YAAY,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BlE,aAAa,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBnF;;;OAGG;IACH,OAAO,CAAC,YAAY;IAIpB;;;;;OAKG;YACW,YAAY;IAa1B;;;;OAIG;YACW,YAAY;IAsB1B;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAKvB;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;IAQzB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;CAG/B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mastra/s3vectors",
3
- "version": "1.0.0-beta.1",
3
+ "version": "1.0.0-beta.2",
4
4
  "description": "Amazon S3 Vectors store provider for Mastra",
5
5
  "type": "module",
6
6
  "files": [
@@ -37,10 +37,10 @@
37
37
  "tsup": "^8.5.0",
38
38
  "typescript": "^5.8.3",
39
39
  "vitest": "4.0.12",
40
- "@internal/storage-test-utils": "0.0.49",
41
40
  "@internal/lint": "0.0.53",
41
+ "@internal/storage-test-utils": "0.0.49",
42
42
  "@internal/types-builder": "0.0.28",
43
- "@mastra/core": "1.0.0-beta.5"
43
+ "@mastra/core": "1.0.0-beta.7"
44
44
  },
45
45
  "peerDependencies": {
46
46
  "@mastra/core": ">=1.0.0-0 <2.0.0-0"