{"version":3,"sources":["../src/vector/filter.ts","../src/vector/index.ts"],"names":["BaseFilterTranslator","fieldWithKeyword","MastraVector","OpenSearchClient","MastraError","createVectorErrorId","ErrorDomain","ErrorCategory","error","validateUpsert","validateTopK"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n  BlacklistedRootOperators,\n  LogicalOperatorValueMap,\n  OperatorSupport,\n  OperatorValueMap,\n  QueryOperator,\n  VectorFilter,\n} from '@mastra/core/vector/filter';\nimport { BaseFilterTranslator } from '@mastra/core/vector/filter';\n\ntype OpenSearchOperatorValueMap = Omit<OperatorValueMap, '$options' | '$nor' | '$elemMatch'>;\n\ntype OpenSearchLogicalOperatorValueMap = Omit<LogicalOperatorValueMap, '$nor'>;\n\ntype OpenSearchBlacklisted = BlacklistedRootOperators | '$nor';\n\nexport type OpenSearchVectorFilter = VectorFilter<\n  keyof OpenSearchOperatorValueMap,\n  OpenSearchOperatorValueMap,\n  OpenSearchLogicalOperatorValueMap,\n  OpenSearchBlacklisted\n>;\n/**\n * Translator for OpenSearch filter queries.\n * Maintains OpenSearch-compatible syntax while ensuring proper validation\n * and normalization of values.\n */\nexport class OpenSearchFilterTranslator extends BaseFilterTranslator<OpenSearchVectorFilter> {\n  protected override getSupportedOperators(): OperatorSupport {\n    return {\n      ...BaseFilterTranslator.DEFAULT_OPERATORS,\n      logical: ['$and', '$or', '$not'],\n      array: ['$in', '$nin', '$all'],\n      regex: ['$regex'],\n      custom: [],\n    };\n  }\n\n  translate(filter?: OpenSearchVectorFilter): OpenSearchVectorFilter {\n    if (this.isEmpty(filter)) return undefined;\n    this.validateFilter(filter);\n    return this.translateNode(filter);\n  }\n\n  private translateNode(node: OpenSearchVectorFilter): any {\n    // Handle primitive values and arrays\n    if (this.isPrimitive(node) || Array.isArray(node)) {\n      return node;\n    }\n\n    const entries = Object.entries(node as Record<string, any>);\n\n    // Extract logical operators and field conditions\n    const logicalOperators: [string, any][] = [];\n    const fieldConditions: [string, any][] = [];\n\n    entries.forEach(([key, value]) => {\n      if (this.isLogicalOperator(key)) {\n        logicalOperators.push([key, value]);\n      } else {\n        fieldConditions.push([key, value]);\n      }\n    });\n\n    // If we have a single logical operator\n    if (logicalOperators.length === 1 && fieldConditions.length === 0) {\n      const [operator, value] = logicalOperators[0] as [QueryOperator, any];\n      if (!Array.isArray(value) && typeof value !== 'object') {\n        throw new Error(`Invalid logical operator structure: ${operator} must have an array or object value`);\n      }\n      return this.translateLogicalOperator(operator, value);\n    }\n\n    // Process field conditions\n    const fieldConditionQueries = fieldConditions.map(([key, value]) => {\n      // Handle nested objects\n      if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n        // Check if the object contains operators\n        const hasOperators = Object.keys(value).some(k => this.isOperator(k));\n\n        // Use a more direct approach based on whether operators are present\n        const nestedField = `metadata.${key}`;\n        return hasOperators\n          ? this.translateFieldConditions(nestedField, value)\n          : this.translateNestedObject(nestedField, value);\n      }\n\n      // Handle arrays\n      if (Array.isArray(value)) {\n        const fieldWithKeyword = this.addKeywordIfNeeded(`metadata.${key}`, value);\n        return { terms: { [fieldWithKeyword]: value } };\n      }\n\n      // Handle simple field equality\n      const fieldWithKeyword = this.addKeywordIfNeeded(`metadata.${key}`, value);\n      return { term: { [fieldWithKeyword]: value } };\n    });\n\n    // Handle case with both logical operators and field conditions or multiple logical operators\n    if (logicalOperators.length > 0) {\n      const logicalConditions = logicalOperators.map(([operator, value]) =>\n        this.translateOperator(operator as QueryOperator, value),\n      );\n\n      return {\n        bool: {\n          must: [...logicalConditions, ...fieldConditionQueries],\n        },\n      };\n    }\n\n    // If we only have field conditions\n    if (fieldConditionQueries.length > 1) {\n      return {\n        bool: {\n          must: fieldConditionQueries,\n        },\n      };\n    }\n\n    // If we have only one field condition\n    if (fieldConditionQueries.length === 1) {\n      return fieldConditionQueries[0];\n    }\n\n    // If we have no conditions (e.g., only empty $and arrays)\n    return { match_all: {} };\n  }\n\n  /**\n   * Handles translation of nested objects with dot notation fields\n   */\n  private translateNestedObject(field: string, value: Record<string, any>): any {\n    const conditions = Object.entries(value).map(([subField, subValue]) => {\n      const fullField = `${field}.${subField}`;\n\n      // Check if this is an operator in a nested field\n      if (this.isOperator(subField)) {\n        return this.translateOperator(subField as QueryOperator, subValue, field);\n      }\n\n      if (typeof subValue === 'object' && subValue !== null && !Array.isArray(subValue)) {\n        // Check if the nested object contains operators\n        const hasOperators = Object.keys(subValue).some(k => this.isOperator(k));\n        if (hasOperators) {\n          return this.translateFieldConditions(fullField, subValue);\n        }\n        return this.translateNestedObject(fullField, subValue);\n      }\n      const fieldWithKeyword = this.addKeywordIfNeeded(fullField, subValue);\n      return { term: { [fieldWithKeyword]: subValue } };\n    });\n\n    return {\n      bool: {\n        must: conditions,\n      },\n    };\n  }\n\n  private translateLogicalOperator(operator: QueryOperator, value: any): any {\n    const conditions = Array.isArray(value) ? value.map(item => this.translateNode(item)) : [this.translateNode(value)];\n    switch (operator) {\n      case '$and':\n        // For empty $and, return a query that matches everything\n        if (Array.isArray(value) && value.length === 0) {\n          return { match_all: {} };\n        }\n        return {\n          bool: {\n            must: conditions,\n          },\n        };\n      case '$or':\n        // For empty $or, return a query that matches nothing\n        if (Array.isArray(value) && value.length === 0) {\n          return {\n            bool: {\n              must_not: [{ match_all: {} }],\n            },\n          };\n        }\n        return {\n          bool: {\n            should: conditions,\n          },\n        };\n      case '$not':\n        return {\n          bool: {\n            must_not: conditions,\n          },\n        };\n      default:\n        return value;\n    }\n  }\n\n  private translateFieldOperator(field: string, operator: QueryOperator, value: any): any {\n    // Handle basic comparison operators\n    if (this.isBasicOperator(operator)) {\n      const normalizedValue = this.normalizeComparisonValue(value);\n      const fieldWithKeyword = this.addKeywordIfNeeded(field, value);\n      switch (operator) {\n        case '$eq':\n          // Handle null equality: field does not exist or is null\n          if (value === null) {\n            return {\n              bool: {\n                must_not: [{ exists: { field } }],\n              },\n            };\n          }\n          return { term: { [fieldWithKeyword]: normalizedValue } };\n        case '$ne':\n          // Handle null inequality: field exists (i.e., is not null)\n          if (value === null) {\n            return { exists: { field } };\n          }\n          return {\n            bool: {\n              must_not: [{ term: { [fieldWithKeyword]: normalizedValue } }],\n            },\n          };\n        default:\n          return { term: { [fieldWithKeyword]: normalizedValue } };\n      }\n    }\n\n    // Handle numeric operators\n    if (this.isNumericOperator(operator)) {\n      const normalizedValue = this.normalizeComparisonValue(value);\n      const rangeOp = operator.replace('$', '');\n      return { range: { [field]: { [rangeOp]: normalizedValue } } };\n    }\n\n    // Handle array operators\n    if (this.isArrayOperator(operator)) {\n      if (!Array.isArray(value)) {\n        throw new Error(`Invalid array operator value: ${operator} requires an array value`);\n      }\n      const normalizedValues = this.normalizeArrayValues(value);\n      const fieldWithKeyword = this.addKeywordIfNeeded(field, value);\n      switch (operator) {\n        case '$in':\n          return { terms: { [fieldWithKeyword]: normalizedValues } };\n        case '$nin':\n          // For empty arrays, return a query that matches everything\n          if (normalizedValues.length === 0) {\n            return { match_all: {} };\n          }\n          return {\n            bool: {\n              must_not: [{ terms: { [fieldWithKeyword]: normalizedValues } }],\n            },\n          };\n        case '$all':\n          // For empty arrays, return a query that will match nothing\n          if (normalizedValues.length === 0) {\n            return {\n              bool: {\n                must_not: [{ match_all: {} }],\n              },\n            };\n          }\n          return {\n            bool: {\n              must: normalizedValues.map(v => ({ term: { [fieldWithKeyword]: v } })),\n            },\n          };\n        default:\n          return { terms: { [fieldWithKeyword]: normalizedValues } };\n      }\n    }\n\n    // Handle element operators\n    if (this.isElementOperator(operator)) {\n      switch (operator) {\n        case '$exists':\n          return value ? { exists: { field } } : { bool: { must_not: [{ exists: { field } }] } };\n        default:\n          return { exists: { field } };\n      }\n    }\n\n    // Handle regex operators\n    if (this.isRegexOperator(operator)) {\n      return this.translateRegexOperator(field, value);\n    }\n\n    const fieldWithKeyword = this.addKeywordIfNeeded(field, value);\n    return { term: { [fieldWithKeyword]: value } };\n  }\n\n  /**\n   * Translates regex patterns to OpenSearch query syntax\n   */\n  private translateRegexOperator(field: string, value: any): any {\n    // Convert value to string if it's not already\n    const regexValue = typeof value === 'string' ? value : value.toString();\n\n    // Check for problematic patterns (like newlines, etc.)\n    if (regexValue.includes('\\n') || regexValue.includes('\\r')) {\n      // For patterns with newlines, use a simpler approach\n      // OpenSearch doesn't support dotall flag like JavaScript\n      return { match: { [field]: value } };\n    }\n\n    // Process regex pattern to handle anchors properly\n    let processedRegex = regexValue;\n    const hasStartAnchor = regexValue.startsWith('^');\n    const hasEndAnchor = regexValue.endsWith('$');\n\n    // If we have anchors, use wildcard query for better handling\n    if (hasStartAnchor || hasEndAnchor) {\n      // Remove anchors\n      if (hasStartAnchor) {\n        processedRegex = processedRegex.substring(1);\n      }\n      if (hasEndAnchor) {\n        processedRegex = processedRegex.substring(0, processedRegex.length - 1);\n      }\n\n      // Create wildcard pattern\n      let wildcardPattern = processedRegex;\n      if (!hasStartAnchor) {\n        wildcardPattern = '*' + wildcardPattern;\n      }\n      if (!hasEndAnchor) {\n        wildcardPattern = wildcardPattern + '*';\n      }\n\n      return { wildcard: { [field]: wildcardPattern } };\n    }\n\n    // Use regexp for other regex patterns\n    // Escape any backslashes to prevent OpenSearch from misinterpreting them\n    const escapedRegex = regexValue.replace(/\\\\/g, '\\\\\\\\');\n    return { regexp: { [field]: escapedRegex } };\n  }\n\n  private addKeywordIfNeeded(field: string, value: any): string {\n    // Add .keyword suffix for string fields\n    if (typeof value === 'string') {\n      return `${field}.keyword`;\n    }\n    // Add .keyword suffix for string array fields\n    if (Array.isArray(value) && value.every(item => typeof item === 'string')) {\n      return `${field}.keyword`;\n    }\n    return field;\n  }\n\n  /**\n   * Helper method to handle special cases for the $not operator\n   */\n  private handleNotOperatorSpecialCases(value: any, field: string): any | null {\n    // For \"not null\", we need to use exists query\n    if (value === null) {\n      return { exists: { field } };\n    }\n\n    if (typeof value === 'object' && value !== null) {\n      // For \"not {$eq: null}\", we need to use exists query\n      if ('$eq' in value && value.$eq === null) {\n        return { exists: { field } };\n      }\n\n      // For \"not {$ne: null}\", we need to use must_not exists query\n      if ('$ne' in value && value.$ne === null) {\n        return {\n          bool: {\n            must_not: [{ exists: { field } }],\n          },\n        };\n      }\n    }\n\n    return null; // No special case applies\n  }\n\n  private translateOperator(operator: QueryOperator, value: any, field?: string): any {\n    // Check if this is a valid operator\n    if (!this.isOperator(operator)) {\n      throw new Error(`Unsupported operator: ${operator}`);\n    }\n\n    // Special case for $not with null or $eq: null\n    if (operator === '$not' && field) {\n      const specialCaseResult = this.handleNotOperatorSpecialCases(value, field);\n      if (specialCaseResult) {\n        return specialCaseResult;\n      }\n    }\n\n    // Handle logical operators\n    if (this.isLogicalOperator(operator)) {\n      // For $not operator with field context and nested operators, handle specially\n      if (operator === '$not' && field && typeof value === 'object' && value !== null && !Array.isArray(value)) {\n        const entries = Object.entries(value);\n\n        // Handle multiple operators in $not\n        if (entries.length > 0) {\n          // If all entries are operators, handle them as a single condition\n          if (entries.every(([op]) => this.isOperator(op))) {\n            const translatedCondition = this.translateFieldConditions(field, value);\n            return {\n              bool: {\n                must_not: [translatedCondition],\n              },\n            };\n          }\n\n          // Handle single nested operator\n          if (entries.length === 1 && entries[0] && this.isOperator(entries[0][0])) {\n            const [nestedOp, nestedVal] = entries[0] as [QueryOperator, any];\n            const translatedNested = this.translateFieldOperator(field, nestedOp, nestedVal);\n            return {\n              bool: {\n                must_not: [translatedNested],\n              },\n            };\n          }\n        }\n      }\n      return this.translateLogicalOperator(operator, value);\n    }\n\n    // If a field is provided, use translateFieldOperator for more specific translation\n    if (field) {\n      return this.translateFieldOperator(field, operator, value);\n    }\n\n    // For non-logical operators without a field context, just return the value\n    // The actual translation happens in translateFieldConditions where we have the field context\n    return value;\n  }\n\n  /**\n   * Translates field conditions to OpenSearch query syntax\n   * Handles special cases like range queries and multiple operators\n   */\n  private translateFieldConditions(field: string, conditions: Record<string, any>): any {\n    // Special case: Optimize multiple numeric operators into a single range query\n    if (this.canOptimizeToRangeQuery(conditions)) {\n      return this.createRangeQuery(field, conditions);\n    }\n\n    // Handle all other operators consistently\n    const queryConditions: any[] = [];\n    Object.entries(conditions).forEach(([operator, value]) => {\n      if (this.isOperator(operator)) {\n        queryConditions.push(this.translateOperator(operator as QueryOperator, value, field));\n      } else {\n        // Handle non-operator keys (should not happen in normal usage)\n        const fieldWithKeyword = this.addKeywordIfNeeded(`${field}.${operator}`, value);\n        queryConditions.push({ term: { [fieldWithKeyword]: value } });\n      }\n    });\n\n    // Return single condition without wrapping\n    if (queryConditions.length === 1) {\n      return queryConditions[0];\n    }\n\n    // Combine multiple conditions with AND logic\n    return {\n      bool: {\n        must: queryConditions,\n      },\n    };\n  }\n\n  /**\n   * Checks if conditions can be optimized to a range query\n   */\n  private canOptimizeToRangeQuery(conditions: Record<string, any>): boolean {\n    return Object.keys(conditions).every(op => this.isNumericOperator(op)) && Object.keys(conditions).length > 0;\n  }\n\n  /**\n   * Creates a range query from numeric operators\n   */\n  private createRangeQuery(field: string, conditions: Record<string, any>): any {\n    const rangeParams = Object.fromEntries(\n      Object.entries(conditions).map(([op, val]) => [op.replace('$', ''), this.normalizeComparisonValue(val)]),\n    );\n\n    return { range: { [field]: rangeParams } };\n  }\n}\n","import { MastraError, ErrorDomain, ErrorCategory } from '@mastra/core/error';\nimport { createVectorErrorId } from '@mastra/core/storage';\nimport type {\n  CreateIndexParams,\n  DeleteIndexParams,\n  DeleteVectorParams,\n  DescribeIndexParams,\n  IndexStats,\n  QueryResult,\n  QueryVectorParams,\n  UpdateVectorParams,\n  UpsertVectorParams,\n  DeleteVectorsParams,\n} from '@mastra/core/vector';\nimport { MastraVector, validateUpsert, validateTopK } from '@mastra/core/vector';\nimport { Client as OpenSearchClient } from '@opensearch-project/opensearch';\nimport type { ClientOptions } from '@opensearch-project/opensearch';\nimport { OpenSearchFilterTranslator } from './filter';\nimport type { OpenSearchVectorFilter } from './filter';\n\n/**\n * Configuration for OpenSearchVector.\n *\n * Extends the OpenSearch ClientOptions with a required id.\n * All OpenSearch client options are supported (node, auth, ssl, compression, etc.).\n *\n * @example\n * ```typescript\n * // Simple URL config\n * const vector = new OpenSearchVector({\n *   id: 'my-vector',\n *   node: 'http://localhost:9200',\n * });\n *\n * // With authentication\n * const vector = new OpenSearchVector({\n *   id: 'my-vector',\n *   node: 'https://my-opensearch-cluster.com',\n *   auth: { username: 'admin', password: 'secret' },\n *   ssl: { rejectUnauthorized: false },\n * });\n * ```\n */\nexport type OpenSearchVectorConfig = ClientOptions & { id: string };\n\nconst METRIC_MAPPING = {\n  cosine: 'cosinesimil',\n  euclidean: 'l2',\n  dotproduct: 'innerproduct',\n} as const;\n\nconst REVERSE_METRIC_MAPPING = {\n  cosinesimil: 'cosine',\n  l2: 'euclidean',\n  innerproduct: 'dotproduct',\n} as const;\n\ntype OpenSearchVectorParams = QueryVectorParams<OpenSearchVectorFilter>;\n\nexport class OpenSearchVector extends MastraVector<OpenSearchVectorFilter> {\n  private client: OpenSearchClient;\n\n  /**\n   * Creates a new OpenSearchVector client.\n   *\n   * @param config - OpenSearch client configuration options plus a required id.\n   * @see OpenSearchVectorConfig for all available options.\n   */\n  constructor({ id, ...clientOptions }: OpenSearchVectorConfig) {\n    super({ id });\n    this.client = new OpenSearchClient(clientOptions);\n  }\n\n  /**\n   * Creates a new collection with the specified configuration.\n   *\n   * @param {string} indexName - The name of the collection to create.\n   * @param {number} dimension - The dimension of the vectors to be stored in the collection.\n   * @param {'cosine' | 'euclidean' | 'dotproduct'} [metric=cosine] - The metric to use to sort vectors in the collection.\n   * @returns {Promise<void>} A promise that resolves when the collection is created.\n   */\n  async createIndex({ indexName, dimension, metric = 'cosine' }: CreateIndexParams): Promise<void> {\n    if (!Number.isInteger(dimension) || dimension <= 0) {\n      throw new MastraError({\n        id: createVectorErrorId('OPENSEARCH', 'CREATE_INDEX', 'INVALID_ARGS'),\n        domain: ErrorDomain.STORAGE,\n        category: ErrorCategory.USER,\n        text: 'Dimension must be a positive integer',\n        details: { indexName, dimension },\n      });\n    }\n\n    try {\n      await this.client.indices.create({\n        index: indexName,\n        body: {\n          settings: { index: { knn: true } },\n          mappings: {\n            properties: {\n              metadata: { type: 'object' },\n              id: { type: 'keyword' },\n              embedding: {\n                type: 'knn_vector',\n                dimension: dimension,\n                method: {\n                  name: 'hnsw',\n                  space_type: METRIC_MAPPING[metric],\n                  engine: 'faiss',\n                  parameters: { ef_construction: 128, m: 16 },\n                },\n              },\n            },\n          },\n        },\n      });\n    } catch (error: any) {\n      const message = error?.message || error?.toString();\n      if (message && message.toLowerCase().includes('already exists')) {\n        // Fetch collection info and check dimension\n        await this.validateExistingIndex(indexName, dimension, metric);\n        return;\n      }\n      throw new MastraError(\n        {\n          id: createVectorErrorId('OPENSEARCH', '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   * Lists all indexes.\n   *\n   * @returns {Promise<string[]>} A promise that resolves to an array of indexes.\n   */\n  async listIndexes(): Promise<string[]> {\n    try {\n      const response = await this.client.cat.indices({ format: 'json' });\n      const indexes = response.body\n        .map((record: { index?: string }) => record.index)\n        .filter((index: string | undefined) => index !== undefined);\n\n      return indexes;\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createVectorErrorId('OPENSEARCH', 'LIST_INDEXES', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n        },\n        error,\n      );\n    }\n  }\n\n  /**\n   * Retrieves statistics about a vector index.\n   *\n   * @param {string} indexName - The name of the index to describe\n   * @returns A promise that resolves to the index statistics including dimension, count and metric\n   */\n  async describeIndex({ indexName }: DescribeIndexParams): Promise<IndexStats> {\n    const { body: indexInfo } = await this.client.indices.get({ index: indexName });\n    const mappings = indexInfo[indexName]?.mappings;\n    const embedding: any = mappings?.properties?.embedding;\n    const spaceType = embedding.method.space_type as keyof typeof REVERSE_METRIC_MAPPING;\n\n    const { body: countInfo } = await this.client.count({ index: indexName });\n\n    return {\n      dimension: Number(embedding.dimension),\n      count: Number(countInfo.count),\n      metric: REVERSE_METRIC_MAPPING[spaceType],\n    };\n  }\n\n  /**\n   * Deletes the specified index.\n   *\n   * @param {string} indexName - The name of the index to delete.\n   * @returns {Promise<void>} A promise that resolves when the index is deleted.\n   */\n  async deleteIndex({ indexName }: DeleteIndexParams): Promise<void> {\n    try {\n      await this.client.indices.delete({ index: indexName });\n    } catch (error) {\n      const mastraError = new MastraError(\n        {\n          id: createVectorErrorId('OPENSEARCH', 'DELETE_INDEX', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { indexName },\n        },\n        error,\n      );\n      this.logger?.error(mastraError.toString());\n      this.logger?.trackException(mastraError);\n    }\n  }\n\n  /**\n   * Inserts or updates vectors in the specified collection.\n   *\n   * @param {string} indexName - The name of the collection to upsert into.\n   * @param {number[][]} vectors - An array of vectors to upsert.\n   * @param {Record<string, any>[]} [metadata] - An optional array of metadata objects corresponding to each vector.\n   * @param {string[]} [ids] - An optional array of IDs corresponding to each vector. If not provided, new IDs will be generated.\n   * @returns {Promise<string[]>} A promise that resolves to an array of IDs of the upserted vectors.\n   */\n  async upsert({ indexName, vectors, metadata = [], ids }: UpsertVectorParams): Promise<string[]> {\n    // Validate input parameters and vector values\n    validateUpsert('OPENSEARCH', vectors, metadata, ids, true);\n\n    const vectorIds = ids || vectors.map(() => crypto.randomUUID());\n    const operations = [];\n\n    try {\n      // Get index stats to check dimension\n      const indexInfo = await this.describeIndex({ indexName });\n\n      // Validate vector dimensions\n      this.validateVectorDimensions(vectors, indexInfo.dimension);\n\n      for (let i = 0; i < vectors.length; i++) {\n        const operation = {\n          index: {\n            _index: indexName,\n            _id: vectorIds[i],\n          },\n        };\n\n        const document = {\n          id: vectorIds[i],\n          embedding: vectors[i],\n          metadata: metadata[i] || {},\n        };\n\n        operations.push(operation);\n        operations.push(document);\n      }\n\n      if (operations.length > 0) {\n        await this.client.bulk({ body: operations, refresh: true });\n      }\n\n      return vectorIds;\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createVectorErrorId('OPENSEARCH', 'UPSERT', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { indexName, vectorCount: vectors?.length || 0 },\n        },\n        error,\n      );\n    }\n  }\n\n  /**\n   * Queries the specified collection using a vector and optional filter.\n   *\n   * @param {string} indexName - The name of the collection to query.\n   * @param {number[]} queryVector - The vector to query with.\n   * @param {number} [topK] - The maximum number of results to return.\n   * @param {Record<string, any>} [filter] - An optional filter to apply to the query. For more on filters in OpenSearch, see the filtering reference: https://opensearch.org/docs/latest/query-dsl/\n   * @param {boolean} [includeVectors=false] - Whether to include the vectors in the response.\n   * @returns {Promise<QueryResult[]>} A promise that resolves to an array of query results.\n   */\n  async query({\n    indexName,\n    queryVector,\n    filter,\n    topK = 10,\n    includeVector = false,\n  }: OpenSearchVectorParams): Promise<QueryResult[]> {\n    if (!queryVector) {\n      throw new MastraError({\n        id: createVectorErrorId('OPENSEARCH', 'QUERY', 'MISSING_VECTOR'),\n        text: 'queryVector is required for OpenSearch queries. Metadata-only queries are not supported by this vector store.',\n        domain: ErrorDomain.STORAGE,\n        category: ErrorCategory.USER,\n        details: { indexName },\n      });\n    }\n\n    // Validate topK parameter\n    validateTopK('OPENSEARCH', topK);\n\n    try {\n      const translatedFilter = this.transformFilter(filter);\n\n      const response = await this.client.search({\n        index: indexName,\n        body: {\n          query: {\n            bool: {\n              must: { knn: { embedding: { vector: queryVector, k: topK } } },\n              filter: translatedFilter ? [translatedFilter] : [],\n            },\n          },\n          _source: ['id', 'metadata', 'embedding'],\n        },\n      });\n\n      const results = response.body.hits.hits.map((hit: any) => {\n        const source = hit._source || {};\n        return {\n          id: String(source.id || ''),\n          score: typeof hit._score === 'number' ? hit._score : 0,\n          metadata: source.metadata || {},\n          ...(includeVector && { vector: source.embedding as number[] }),\n        };\n      });\n\n      return results;\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createVectorErrorId('OPENSEARCH', 'QUERY', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: { indexName, topK },\n        },\n        error,\n      );\n    }\n  }\n\n  /**\n   * Validates the dimensions of the vectors.\n   *\n   * @param {number[][]} vectors - The vectors to validate.\n   * @param {number} dimension - The dimension of the vectors.\n   * @returns {void}\n   */\n  private validateVectorDimensions(vectors: number[][], dimension: number) {\n    if (vectors.some(vector => vector.length !== dimension)) {\n      throw new Error('Vector dimension does not match index dimension');\n    }\n  }\n\n  /**\n   * Transforms the filter to the OpenSearch DSL.\n   *\n   * @param {OpenSearchVectorFilter} filter - The filter to transform.\n   * @returns {Record<string, any>} The transformed filter.\n   */\n  private transformFilter(filter?: OpenSearchVectorFilter): any {\n    const translator = new OpenSearchFilterTranslator();\n    return translator.translate(filter);\n  }\n\n  /**\n   * Updates vectors by ID or filter with the provided vector and/or metadata.\n   * @param params - Parameters containing either id or filter for targeting vectors to update\n   * @param params.indexName - The name of the index containing the vector(s).\n   * @param params.id - The ID of a single vector to update (mutually exclusive with filter).\n   * @param params.filter - A filter to match multiple vectors to update (mutually exclusive with id).\n   * @param params.update - An object containing the vector and/or metadata to update.\n   * @returns A promise that resolves when the update is complete.\n   * @throws Will throw an error if no updates are provided or if the update operation fails.\n   */\n  async updateVector(params: UpdateVectorParams<OpenSearchVectorFilter>): Promise<void> {\n    const { indexName, update } = params;\n\n    // Validate mutually exclusive parameters\n    if ('id' in params && 'filter' in params && params.id && params.filter) {\n      throw new MastraError({\n        id: createVectorErrorId('OPENSEARCH', 'UPDATE_VECTOR', 'MUTUALLY_EXCLUSIVE'),\n        domain: ErrorDomain.STORAGE,\n        category: ErrorCategory.USER,\n        text: 'id and filter are mutually exclusive',\n        details: { indexName },\n      });\n    }\n\n    if (!update.vector && !update.metadata) {\n      throw new MastraError({\n        id: createVectorErrorId('OPENSEARCH', 'UPDATE_VECTOR', 'NO_UPDATES'),\n        domain: ErrorDomain.STORAGE,\n        category: ErrorCategory.USER,\n        text: 'No updates provided',\n        details: { indexName },\n      });\n    }\n\n    // Validate empty filter\n    if ('filter' in params && params.filter && Object.keys(params.filter).length === 0) {\n      throw new MastraError({\n        id: createVectorErrorId('OPENSEARCH', 'UPDATE_VECTOR', 'EMPTY_FILTER'),\n        domain: ErrorDomain.STORAGE,\n        category: ErrorCategory.USER,\n        text: 'Cannot update with empty filter',\n        details: { indexName },\n      });\n    }\n\n    // Type-narrowing: check if updating by id or by filter\n    if ('id' in params && params.id) {\n      // Update by ID\n      await this.updateVectorById(indexName, params.id, update);\n    } else if ('filter' in params && params.filter) {\n      // Update by filter\n      await this.updateVectorsByFilter(indexName, params.filter, update);\n    } else {\n      throw new MastraError({\n        id: createVectorErrorId('OPENSEARCH', 'UPDATE_VECTOR', 'NO_TARGET'),\n        domain: ErrorDomain.STORAGE,\n        category: ErrorCategory.USER,\n        text: 'Either id or filter must be provided',\n        details: { indexName },\n      });\n    }\n  }\n\n  /**\n   * Updates a single vector by its ID.\n   */\n  private async updateVectorById(\n    indexName: string,\n    id: string,\n    update: { vector?: number[]; metadata?: Record<string, any> },\n  ): Promise<void> {\n    let existingDoc;\n    try {\n      // First get the current document to merge with updates\n      const { body } = await this.client\n        .get({\n          index: indexName,\n          id: id,\n        })\n        .catch(() => {\n          throw new Error(`Document with ID ${id} not found in index ${indexName}`);\n        });\n\n      if (!body || !body._source) {\n        throw new Error(`Document with ID ${id} has no source data in index ${indexName}`);\n      }\n      existingDoc = body;\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createVectorErrorId('OPENSEARCH', 'UPDATE_VECTOR', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.USER,\n          details: {\n            indexName,\n            id,\n          },\n        },\n        error,\n      );\n    }\n\n    const source = existingDoc._source;\n    const updatedDoc: Record<string, any> = {\n      id: source?.id || id,\n    };\n\n    try {\n      // Update vector if provided\n      if (update.vector) {\n        // Get index stats to check dimension\n        const indexInfo = await this.describeIndex({ indexName });\n\n        // Validate vector dimensions\n        this.validateVectorDimensions([update.vector], indexInfo.dimension);\n\n        updatedDoc.embedding = update.vector;\n      } else if (source?.embedding) {\n        updatedDoc.embedding = source.embedding;\n      }\n\n      // Update metadata if provided\n      if (update.metadata) {\n        updatedDoc.metadata = update.metadata;\n      } else {\n        updatedDoc.metadata = source?.metadata || {};\n      }\n\n      // Update the document\n      await this.client.index({\n        index: indexName,\n        id: id,\n        body: updatedDoc,\n        refresh: true,\n      });\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createVectorErrorId('OPENSEARCH', 'UPDATE_VECTOR', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: {\n            indexName,\n            id,\n          },\n        },\n        error,\n      );\n    }\n  }\n\n  /**\n   * Updates multiple vectors matching a filter.\n   */\n  private async updateVectorsByFilter(\n    indexName: string,\n    filter: OpenSearchVectorFilter,\n    update: { vector?: number[]; metadata?: Record<string, any> },\n  ): Promise<void> {\n    try {\n      const translator = new OpenSearchFilterTranslator();\n      const translatedFilter = translator.translate(filter);\n\n      // Build the update script\n      const scriptSource: string[] = [];\n      const scriptParams: Record<string, any> = {};\n\n      if (update.vector) {\n        scriptSource.push('ctx._source.embedding = params.embedding');\n        scriptParams.embedding = update.vector;\n      }\n\n      if (update.metadata) {\n        scriptSource.push('ctx._source.metadata = params.metadata');\n        scriptParams.metadata = update.metadata;\n      }\n\n      // Use update_by_query to update all matching documents\n      await this.client.updateByQuery({\n        index: indexName,\n        body: {\n          query: (translatedFilter as any) || { match_all: {} },\n          script: {\n            source: scriptSource.join('; '),\n            params: scriptParams,\n            lang: 'painless',\n          },\n        },\n        refresh: true,\n      });\n    } catch (error) {\n      throw new MastraError(\n        {\n          id: createVectorErrorId('OPENSEARCH', 'UPDATE_VECTOR_BY_FILTER', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: {\n            indexName,\n            filter: JSON.stringify(filter),\n          },\n        },\n        error,\n      );\n    }\n  }\n\n  /**\n   * Deletes a vector by its ID.\n   * @param indexName - The name of the index containing the vector.\n   * @param id - The ID of the vector to delete.\n   * @returns A promise that resolves when the deletion is complete.\n   * @throws Will throw an error if the deletion operation fails.\n   */\n  async deleteVector({ indexName, id }: DeleteVectorParams): Promise<void> {\n    try {\n      await this.client.delete({\n        index: indexName,\n        id: id,\n        refresh: true,\n      });\n    } catch (error: unknown) {\n      // Don't throw error if document doesn't exist (404)\n      if (error && typeof error === 'object' && 'statusCode' in error && error.statusCode === 404) {\n        return;\n      }\n      throw new MastraError(\n        {\n          id: createVectorErrorId('OPENSEARCH', '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<OpenSearchVectorFilter>): Promise<void> {\n    // Validate mutually exclusive parameters\n    if (ids && filter) {\n      throw new MastraError({\n        id: createVectorErrorId('OPENSEARCH', 'DELETE_VECTORS', 'MUTUALLY_EXCLUSIVE'),\n        domain: ErrorDomain.STORAGE,\n        category: ErrorCategory.USER,\n        text: 'ids and filter are mutually exclusive',\n        details: { indexName },\n      });\n    }\n\n    if (!ids && !filter) {\n      throw new MastraError({\n        id: createVectorErrorId('OPENSEARCH', 'DELETE_VECTORS', 'NO_TARGET'),\n        domain: ErrorDomain.STORAGE,\n        category: ErrorCategory.USER,\n        text: 'Either filter or ids must be provided',\n        details: { indexName },\n      });\n    }\n\n    // Validate non-empty arrays and objects\n    if (ids && ids.length === 0) {\n      throw new MastraError({\n        id: createVectorErrorId('OPENSEARCH', 'DELETE_VECTORS', 'EMPTY_IDS'),\n        domain: ErrorDomain.STORAGE,\n        category: ErrorCategory.USER,\n        text: 'Cannot delete with empty ids array',\n        details: { indexName },\n      });\n    }\n\n    if (filter && Object.keys(filter).length === 0) {\n      throw new MastraError({\n        id: createVectorErrorId('OPENSEARCH', 'DELETE_VECTORS', 'EMPTY_FILTER'),\n        domain: ErrorDomain.STORAGE,\n        category: ErrorCategory.USER,\n        text: 'Cannot delete with empty filter',\n        details: { indexName },\n      });\n    }\n\n    try {\n      if (ids) {\n        // Delete by IDs using bulk API\n        const bulkBody = ids.flatMap(id => [{ delete: { _index: indexName, _id: id } }]);\n\n        await this.client.bulk({\n          body: bulkBody,\n          refresh: true,\n        });\n      } else if (filter) {\n        // Delete by filter using delete_by_query\n        const translator = new OpenSearchFilterTranslator();\n        const translatedFilter = translator.translate(filter);\n\n        await this.client.deleteByQuery({\n          index: indexName,\n          body: {\n            query: (translatedFilter as any) || { match_all: {} },\n          },\n          refresh: true,\n        });\n      }\n    } catch (error) {\n      if (error instanceof MastraError) throw error;\n      throw new MastraError(\n        {\n          id: createVectorErrorId('OPENSEARCH', 'DELETE_VECTORS', 'FAILED'),\n          domain: ErrorDomain.STORAGE,\n          category: ErrorCategory.THIRD_PARTY,\n          details: {\n            indexName,\n            ...(filter && { filter: JSON.stringify(filter) }),\n            ...(ids && { idsCount: ids.length }),\n          },\n        },\n        error,\n      );\n    }\n  }\n}\n"]}