{"version":3,"file":"couchbase.mjs","names":["#opts","#phys","#cluster","#cb","#bucket","#sleep","#scope","#scopeName","#coll","#dims","#metrics","#vecIndexName","#parseMeta","#project"],"sources":["../../../src/batteries/vector/couchbase/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/couchbase\n *\n * Couchbase (Enterprise) vector-store adapter. Vector search is Enterprise Edition only; the\n * Community Edition will throw \"vector typed fields not supported\". A logical collection maps to a\n * Couchbase scope.collection inside a bucket. KV operations (upsert/get/remove) use strong\n * consistency, while the scoped FTS vector index is async (settle-polled after writes).\n *\n * Scoring rule: do NOT trust FTS native scores (they vary per metric and are unbounded for\n * euclidean/l2_norm). Instead, use FTS only to retrieve the candidate id set, then KV-get each\n * candidate doc and RE-COMPUTE the similarity score from the stored vec vs query vec using\n * normalizeScore — guaranteeing the [0,1] contract regardless of backend metric quirks.\n *\n * Filter-scan, enumerate, and delete-by-filter use N1QL with RequestPlus for strong consistency.\n */\n\nimport { evaluateFilter } from '../filters'\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport {\n  E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n  E_VECTOR_STORE_CONNECTION_FAILED,\n  E_VECTOR_STORE_COLLECTION_FAILED,\n  E_VECTOR_STORE_UPSERT_FAILED,\n  E_VECTOR_STORE_SEARCH_FAILED,\n  E_VECTOR_STORE_DELETE_FAILED,\n  E_VECTOR_STORE_DIMENSION_MISMATCH,\n  E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type {\n  VectorMatch,\n  VectorStoreCapabilities,\n  BaseVectorStoreOptions,\n  VectorMetadata,\n  DistanceMetric,\n} from '../types'\n\nconst similarity = (metric: DistanceMetric): string =>\n  metric === 'cosine' ? 'cosine' : metric === 'dot' ? 'dot_product' : 'l2_norm'\n\nconst cosineSim = (a: number[], b: number[]): number => {\n  let dot = 0\n  let normA = 0\n  let normB = 0\n  a.forEach((av, i) => {\n    const bv = b[i]\n    dot += av * bv\n    normA += av * av\n    normB += bv * bv\n  })\n  const denom = Math.sqrt(normA) * Math.sqrt(normB)\n  return denom === 0 ? 0 : dot / denom\n}\n\nconst dotProd = (a: number[], b: number[]): number => {\n  let s = 0\n  a.forEach((av, i) => {\n    s += av * b[i]\n  })\n  return s\n}\n\nconst euclideanDist = (a: number[], b: number[]): number => {\n  let s = 0\n  a.forEach((av, i) => {\n    const d = av - b[i]\n    s += d * d\n  })\n  return Math.sqrt(s)\n}\n\nconst computeScore = (vec: number[], query: number[], metric: DistanceMetric): number => {\n  if (metric === 'cosine') {\n    const raw = cosineSim(vec, query)\n    return normalizeScore(raw, 'cosine', 'similarity')\n  } else if (metric === 'dot') {\n    const raw = dotProd(vec, query)\n    return normalizeScore(raw, 'dot', 'similarity')\n  } else if (metric === 'euclidean') {\n    const raw = euclideanDist(vec, query)\n    return normalizeScore(raw, 'euclidean', 'distance')\n  } else {\n    // Fallback\n    const raw = cosineSim(vec, query)\n    return normalizeScore(raw, 'cosine', 'similarity')\n  }\n}\n\nconst getCB = async (): Promise<any> => {\n  try {\n    return await import('couchbase')\n  } catch {\n    throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['couchbase'])\n  }\n}\n\nexport interface CouchbaseVectorStoreOptions extends BaseVectorStoreOptions {\n  /** Connection and authentication parameters for the backend. */\n  connection: {\n    url: string\n    username: string\n    password: string\n    bucket: string\n    scope?: string\n    /**\n     * When set, the physical Couchbase collection becomes `${collectionPrefix}${collection}`. The\n     * logical collection the builder/base see is unchanged. Lets callers (and the test suite)\n     * isolate otherwise identically-named collections — useful because the scoped FTS vector index\n     * builds asynchronously, so a fresh collection per use avoids drop+rebuild-index churn.\n     */\n    collectionPrefix?: string\n  }\n}\n\nexport class CouchbaseVectorStore extends BaseVectorStore {\n  readonly capabilities: VectorStoreCapabilities = {\n    transactions: false,\n    namedVectors: false,\n    rename: false,\n    rawSql: false,\n    builtInEncoding: false,\n    consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n  }\n\n  #cluster: any | null = null\n  #bucket: any | null = null\n  #cb: any | null = null\n  #dims: Map<string, number> = new Map()\n  #metrics: Map<string, DistanceMetric> = new Map()\n\n  get #opts(): CouchbaseVectorStoreOptions {\n    return this.options as CouchbaseVectorStoreOptions\n  }\n\n  #scopeName(): string {\n    return this.#opts.connection.scope ?? '_default'\n  }\n\n  // Map a logical collection name to its physical Couchbase collection (optional prefix).\n  #phys(collection: string): string {\n    const prefix = this.#opts.connection.collectionPrefix\n    return prefix ? `${prefix}${collection}` : collection\n  }\n\n  #vecIndexName(collection: string): string {\n    return `${this.#phys(collection)}_vec`\n  }\n\n  /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */\n  static isAvailable(): boolean {\n    return typeof process !== 'undefined'\n  }\n\n  isAvailable(): boolean {\n    return typeof process !== 'undefined'\n  }\n\n  async connect(): Promise<void> {\n    if (this.#cluster) return\n    const couchbase = await getCB()\n    this.#cb = couchbase\n    const c = this.#opts.connection\n    try {\n      this.#cluster = await couchbase.connect(c.url, { username: c.username, password: c.password })\n      this.#bucket = this.#cluster.bucket(c.bucket)\n    } catch (err) {\n      throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n    }\n  }\n\n  async close(): Promise<void> {\n    if (this.#cluster) {\n      await this.#cluster.close()\n      this.#cluster = null\n      this.#bucket = null\n    }\n  }\n\n  async #sleep(ms: number): Promise<void> {\n    await new Promise((r) => setTimeout(r, ms))\n  }\n\n  async #scope(): Promise<any> {\n    if (!this.#bucket) await this.connect()\n    return this.#bucket.scope(this.#scopeName())\n  }\n\n  async #coll(scope: any, collection: string): Promise<any> {\n    return scope.collection(this.#phys(collection))\n  }\n\n  async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n    if (!this.#bucket) await this.connect()\n    const cm = this.#bucket.collections()\n    const scopeName = this.#scopeName()\n    this.#dims.set(spec.collection, spec.vector.dimensions)\n    this.#metrics.set(spec.collection, spec.vector.metric)\n\n    // Physical collection name (logical name + optional prefix); the FTS index, N1QL identifiers\n    // and the collection-manager ops all key off the physical name.\n    const collectionName = this.#phys(spec.collection)\n    const indexName = this.#vecIndexName(spec.collection)\n\n    try {\n      // Create scope.collection\n      try {\n        await cm.createCollection({ name: collectionName, scopeName })\n      } catch (err: any) {\n        if (err.message && err.message.includes('CollectionExists')) {\n          if (ifNotExists) {\n            // Clear existing collection\n            try {\n              await this.#cluster.query(\n                `DELETE FROM \\`${this.#opts.connection.bucket}\\`.\\`${scopeName}\\`.\\`${collectionName}\\``\n              )\n            } catch {\n              // Ignore cleanup failures\n            }\n          } else {\n            // Drop and recreate\n            await cm.dropCollection(collectionName, scopeName)\n            await cm.createCollection({ name: collectionName, scopeName })\n          }\n        } else {\n          throw err\n        }\n      }\n\n      // Wait for collection to be ready\n      await this.#sleep(1000)\n\n      // Create primary index\n      try {\n        await this.#cluster.query(\n          `CREATE PRIMARY INDEX ON \\`${this.#opts.connection.bucket}\\`.\\`${scopeName}\\`.\\`${collectionName}\\``\n        )\n      } catch {\n        // Ignore if already exists\n      }\n\n      // Create FTS vector index\n      const mgr = this.#bucket.scope(scopeName).searchIndexes()\n      try {\n        await mgr.upsertIndex({\n          name: indexName,\n          sourceType: 'gocbcore',\n          sourceName: this.#opts.connection.bucket,\n          type: 'fulltext-index',\n          planParams: { indexPartitions: 1 },\n          params: {\n            doc_config: {\n              mode: 'scope.collection.type_field',\n              type_field: 'type',\n            },\n            mapping: {\n              default_mapping: { enabled: false },\n              default_analyzer: 'standard',\n              default_type: '_default',\n              types: {\n                [`${scopeName}.${collectionName}`]: {\n                  enabled: true,\n                  dynamic: false,\n                  properties: {\n                    vec: {\n                      enabled: true,\n                      fields: [\n                        {\n                          name: 'vec',\n                          type: 'vector',\n                          dims: spec.vector.dimensions,\n                          similarity: similarity(spec.vector.metric),\n                          index: true,\n                        },\n                      ],\n                    },\n                  },\n                },\n              },\n            },\n          },\n        })\n      } catch {\n        // Ignore if index already exists\n      }\n\n      // Poll until index is queryable\n      const scope = this.#bucket.scope(scopeName)\n      const probe = new Array(spec.vector.dimensions).fill(0)\n      probe[0] = 1\n      for (let i = 0; i < 60; i++) {\n        try {\n          const req = this.#cb.SearchRequest.create(\n            this.#cb.VectorSearch.fromVectorQuery(\n              this.#cb.VectorQuery.create('vec', probe).numCandidates(10)\n            )\n          )\n          await scope.search(indexName, req, { timeout: 10000 })\n          break\n        } catch {\n          await this.#sleep(1000)\n        }\n      }\n    } catch (err) {\n      throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n    }\n  }\n\n  async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n    if (!this.#bucket) await this.connect()\n    const cm = this.#bucket.collections()\n    const scopeName = this.#scopeName()\n    const physical = this.#phys(collection)\n    const indexName = this.#vecIndexName(collection)\n    const mgr = this.#bucket.scope(scopeName).searchIndexes()\n\n    try {\n      // Drop FTS index\n      try {\n        await mgr.dropIndex(indexName)\n      } catch {\n        // Ignore if index doesn't exist\n      }\n\n      // Drop collection\n      try {\n        const scopes = await cm.getAllScopes()\n        const scope = scopes.find((s: any) => s.name === scopeName)\n        if (!scope) {\n          if (ifExists) return\n          throw new Error(`scope not found: ${scopeName}`)\n        }\n        const coll = scope.collections?.find((c: any) => c.name === physical)\n        if (!coll) {\n          if (ifExists) return\n          throw new Error(`collection not found: ${collection}`)\n        }\n      } catch (err: any) {\n        if (err.message && err.message.includes('not found')) {\n          if (ifExists) return\n          throw err\n        }\n        throw err\n      }\n\n      await cm.dropCollection(physical, scopeName)\n      this.#dims.delete(collection)\n      this.#metrics.delete(collection)\n    } catch (err) {\n      throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', String(err)])\n    }\n  }\n\n  async hasCollection(collection: string): Promise<boolean> {\n    if (!this.#bucket) await this.connect()\n    const cm = this.#bucket.collections()\n    const scopeName = this.#scopeName()\n    try {\n      const scopes = await cm.getAllScopes()\n      const scope = scopes.find((s: any) => s.name === scopeName)\n      if (!scope) return false\n      return !!scope.collections?.find((c: any) => c.name === this.#phys(collection))\n    } catch {\n      return false\n    }\n  }\n\n  async renameCollection(_from: string, _to: string): Promise<void> {\n    throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'couchbase'])\n  }\n\n  async executeUpsert(plan: UpsertPlan): Promise<void> {\n    if (plan.records.length === 0) return\n    validateRecords(plan.records)\n    const scope = await this.#scope()\n    const coll = await this.#coll(scope, plan.collection)\n    const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n    const dims = expected ?? 0\n    const indexName = this.#vecIndexName(plan.collection)\n\n    try {\n      const ids: string[] = []\n      for (const r of plan.records) {\n        let vector = r.vector\n        if (!vector && r.document) {\n          const [v] = await this.encode([r.document], 'document')\n          vector = v\n        }\n        if (!vector) {\n          throw new E_VECTOR_STORE_UPSERT_FAILED(['Record missing vector and document'])\n        }\n        if (expected !== undefined && vector.length !== expected) {\n          throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n        }\n        await coll.upsert(r.id, {\n          id: r.id,\n          vec: vector,\n          document: r.document ?? '',\n          metadata: r.metadata ? JSON.stringify(r.metadata) : '{}',\n          type: plan.collection,\n        })\n        ids.push(r.id)\n      }\n\n      // Poll until FTS index shows all ids\n      const probe = new Array(dims).fill(0)\n      probe[0] = 1\n      const deadline = Date.now() + 10_000\n      while (Date.now() < deadline) {\n        let seen = new Set<string>()\n        try {\n          const req = this.#cb.SearchRequest.create(\n            this.#cb.VectorSearch.fromVectorQuery(\n              this.#cb.VectorQuery.create('vec', probe).numCandidates(100)\n            )\n          )\n          const res: any = await scope.search(indexName, req, { timeout: 10000 })\n          seen = new Set(res.rows?.map((row: any) => row.id) ?? [])\n        } catch {\n          // Continue polling\n        }\n        if (ids.every((id) => seen.has(id))) break\n        await this.#sleep(300)\n      }\n    } catch (err) {\n      if (\n        isInstanceOf(err, 'E_VECTOR_STORE_DIMENSION_MISMATCH', E_VECTOR_STORE_DIMENSION_MISMATCH) ||\n        isInstanceOf(err, 'E_VECTOR_STORE_UPSERT_FAILED', E_VECTOR_STORE_UPSERT_FAILED)\n      ) {\n        throw err\n      }\n      throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n    }\n  }\n\n  async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n    const scope = await this.#scope()\n    const coll = await this.#coll(scope, plan.collection)\n    const indexName = this.#vecIndexName(plan.collection)\n    const metric: DistanceMetric =\n      this.#metrics.get(plan.collection) ?? this.#opts.metric ?? 'cosine'\n    const oversample = 10\n\n    let queryVector: number[] | undefined\n    if (plan.near) {\n      if ('vector' in plan.near) {\n        queryVector = plan.near.vector\n      } else if ('serverText' in plan.near) {\n        const [v] = await this.encode([plan.near.serverText], 'query')\n        queryVector = v\n      } else if ('id' in plan.near) {\n        try {\n          const got: any = await coll.get(plan.near.id)\n          queryVector = got.content?.vec\n          if (!queryVector) {\n            throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n          }\n        } catch (err: any) {\n          if (err.message && err.message.includes('DocumentNotFound')) {\n            throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n          }\n          throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n        }\n      }\n    }\n\n    const offset = plan.offset ?? 0\n\n    try {\n      if (queryVector) {\n        // Similarity search: FTS for candidates, then KV-get and re-score\n        const k = (plan.filter ? 1000 : (plan.topK + offset) * oversample) || 100\n        const req = this.#cb.SearchRequest.create(\n          this.#cb.VectorSearch.fromVectorQuery(\n            this.#cb.VectorQuery.create('vec', queryVector).numCandidates(Math.max(k, 100))\n          )\n        )\n        const res: any = await scope.search(indexName, req, { timeout: 10000 })\n        const candidateIds = res.rows?.map((row: any) => row.id) ?? []\n\n        // KV-get each candidate to get full doc\n        const candidates: any[] = []\n        for (const id of candidateIds) {\n          try {\n            const got: any = await coll.get(id)\n            candidates.push(got.content)\n          } catch {\n            // Skip docs that can't be read\n          }\n        }\n\n        // Apply filter and compute scores\n        const filtered = candidates.filter((d) =>\n          evaluateFilter(plan.filter ?? {}, this.#parseMeta(d.metadata))\n        )\n\n        // Re-compute scores and sort\n        const scored = filtered.map((d) => ({\n          ...d,\n          score: computeScore(d.vec, queryVector, metric),\n        }))\n        scored.sort((a, b) => b.score - a.score)\n\n        return scored\n          .slice(offset, offset + plan.topK)\n          .map((d: any) => this.#project(d, plan, true))\n      } else {\n        // Filter-scan: N1QL\n        const bucket = this.#opts.connection.bucket\n        const scopeName = this.#scopeName()\n        const q = await this.#cluster.query(\n          `SELECT d.id, d.vec, d.document, d.metadata FROM \\`${bucket}\\`.\\`${scopeName}\\`.\\`${this.#phys(plan.collection)}\\` d`,\n          { scanConsistency: this.#cb.QueryScanConsistency.RequestPlus }\n        )\n        const docs: any[] = q.rows ?? []\n\n        const filtered = docs.filter((d) =>\n          evaluateFilter(plan.filter ?? {}, this.#parseMeta(d.metadata))\n        )\n\n        return filtered\n          .slice(offset, offset + plan.topK)\n          .map((d: any) => this.#project(d, plan, false))\n      }\n    } catch (err: any) {\n      if (err?.message?.includes('Referenced id not found')) {\n        throw err\n      }\n      throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n    }\n  }\n\n  #parseMeta(val: unknown): VectorMetadata {\n    if (typeof val === 'string') {\n      try {\n        return JSON.parse(val) as VectorMetadata\n      } catch {\n        return {}\n      }\n    }\n    if (val && typeof val === 'object') return val as VectorMetadata\n    return {}\n  }\n\n  #project(doc: any, plan: SearchPlan, hasScore: boolean): VectorMatch {\n    const proj = plan.projection\n    const out: VectorMatch = {}\n    if (proj.id) out.id = doc.id as string\n    if (proj.vector && Array.isArray(doc.vec)) out.vector = (doc.vec as number[]).map(Number)\n    if (proj.document) out.document = (doc.document ?? undefined) as string | undefined\n    if (proj.metadata) out.metadata = this.#parseMeta(doc.metadata)\n    if (hasScore && typeof doc.score === 'number') {\n      out.score = doc.score\n    }\n    return out\n  }\n\n  async executeDelete(plan: DeletePlan): Promise<void> {\n    const scope = await this.#scope()\n    const coll = await this.#coll(scope, plan.collection)\n    const bucket = this.#opts.connection.bucket\n    const scopeName = this.#scopeName()\n\n    try {\n      if (plan.ids && plan.ids.length > 0) {\n        // Delete by ids\n        for (const id of plan.ids) {\n          try {\n            await coll.remove(id)\n          } catch {\n            // Ignore DocumentNotFoundError\n          }\n        }\n      } else if (plan.filter) {\n        // Enumerate via N1QL, filter, then delete\n        const q = await this.#cluster.query(\n          `SELECT d.id, d.metadata FROM \\`${bucket}\\`.\\`${scopeName}\\`.\\`${this.#phys(plan.collection)}\\` d`,\n          { scanConsistency: this.#cb.QueryScanConsistency.RequestPlus }\n        )\n        const docs: any[] = q.rows ?? []\n\n        const targets = docs\n          .filter((d) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n          .map((d: any) => d.id as string)\n\n        for (const id of targets) {\n          try {\n            await coll.remove(id)\n          } catch {\n            // Ignore DocumentNotFoundError\n          }\n        }\n      } else {\n        // Delete all\n        await this.#cluster.query(\n          `DELETE FROM \\`${bucket}\\`.\\`${scopeName}\\`.\\`${this.#phys(plan.collection)}\\` d`,\n          { scanConsistency: this.#cb.QueryScanConsistency.RequestPlus }\n        )\n      }\n    } catch (err) {\n      throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n    }\n  }\n}\n"],"mappings":"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"}