{"version":3,"file":"mongodb.cjs","names":["#opts","#client","#db","#col","#name","#sleep","#dims","#settlePresent","#parseMeta","#project"],"sources":["../../../src/batteries/vector/mongodb/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/mongodb\n *\n * MongoDB Atlas Vector Search adapter. Each collection is a MongoDB collection with an Atlas\n * `vectorSearch` index on `vec`; KNN uses the `$vectorSearch` aggregation stage (cosine\n * `vectorSearchScore`, [0,1]). Metadata is a JSON string field filtered with the neutral filter\n * tree's JS reference evaluator for cross-adapter parity.\n *\n * Consistency note: the *document* collection is strongly consistent, but the Atlas vector\n * *index* updates asynchronously after a write (~1s). So filter-scans, fetch-by-id and the\n * delete read-back use a plain `find()` (immediate), and only KNN goes through `$vectorSearch` —\n * after which the adapter polls until the just-inserted ids are index-visible (strong mode).\n *\n * Driver: `mongodb`. Works against `mongodb/mongodb-atlas-local` or a real Atlas cluster.\n */\n\nimport { evaluateFilter } from '../filters'\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 INDEX = 'vec_idx'\n\nexport interface MongoDBVectorStoreOptions extends BaseVectorStoreOptions {\n  /** Connection and authentication parameters for the backend. */\n  connection: {\n    url: string\n    database?: string\n    /**\n     * When set, the physical MongoDB 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 Atlas vectorSearch\n     * index builds asynchronously, so a fresh collection per use avoids drop+rebuild churn.\n     */\n    collectionPrefix?: string\n  }\n}\n\nconst getMongo = async () => {\n  try {\n    const mod = await import('mongodb')\n    return mod.MongoClient\n  } catch {\n    throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['mongodb'])\n  }\n}\n\nconst similarity = (metric: DistanceMetric): string =>\n  metric === 'euclidean' ? 'euclidean' : metric === 'dot' ? 'dotProduct' : 'cosine'\n\nexport class MongoDBVectorStore extends BaseVectorStore {\n  readonly capabilities: VectorStoreCapabilities = {\n    transactions: false,\n    namedVectors: false,\n    rename: false,\n    rawSql: false,\n    builtInEncoding: false,\n    // The document store is strongly consistent; KNN settles on the async index after writes.\n    consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n  }\n\n  #client: any | null = null\n  #db: any | null = null\n  #dims: Map<string, number> = new Map()\n\n  get #opts(): MongoDBVectorStoreOptions {\n    return this.options as MongoDBVectorStoreOptions\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  isAvailable(): boolean {\n    return typeof process !== 'undefined'\n  }\n\n  async connect(): Promise<void> {\n    if (this.#client) return\n    const MongoClient = await getMongo()\n    const c = this.#opts.connection\n    try {\n      this.#client = new MongoClient(c.url)\n      await this.#client.connect()\n      this.#db = this.#client.db(c.database ?? 'vector')\n    } catch (err) {\n      throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n    }\n  }\n\n  async close(): Promise<void> {\n    if (this.#client) {\n      await this.#client.close()\n      this.#client = null\n      this.#db = null\n    }\n  }\n\n  // Map a logical collection name to its physical MongoDB collection (optional prefix).\n  #name(collection: string): string {\n    const prefix = this.#opts.connection?.collectionPrefix\n    return prefix ? `${prefix}${collection}` : collection\n  }\n\n  async #col(collection: string): Promise<any> {\n    if (!this.#db) await this.connect()\n    return this.#db.collection(this.#name(collection))\n  }\n\n  async #sleep(ms: number): Promise<void> {\n    await new Promise((r) => setTimeout(r, ms))\n  }\n\n  async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n    if (!this.#db) await this.connect()\n    this.#dims.set(spec.collection, spec.vector.dimensions)\n    const physical = this.#name(spec.collection)\n    try {\n      const names = await this.#db.listCollections({ name: physical }).toArray()\n      if (names.length > 0) {\n        if (ifNotExists) {\n          // Clear any residual documents so each store starts empty.\n          await this.#db.collection(physical).deleteMany({})\n          return\n        }\n        await this.#db\n          .collection(physical)\n          .drop()\n          .catch(() => undefined)\n      }\n      await this.#db.createCollection(physical).catch(() => undefined)\n      const col = this.#db.collection(physical)\n      // Create the Atlas vectorSearch index if absent, then wait until it's queryable.\n      const existing = await col\n        .listSearchIndexes()\n        .toArray()\n        .catch(() => [])\n      if (!existing.find((i: any) => i.name === INDEX)) {\n        await col.createSearchIndex({\n          name: INDEX,\n          type: 'vectorSearch',\n          definition: {\n            fields: [\n              {\n                type: 'vector',\n                path: 'vec',\n                numDimensions: spec.vector.dimensions,\n                similarity: similarity(spec.vector.metric),\n              },\n            ],\n          },\n        })\n      }\n      for (let i = 0; i < 60; i++) {\n        const list = await col.listSearchIndexes().toArray()\n        const idx = list.find((x: any) => x.name === INDEX)\n        if (idx?.queryable) break\n        await this.#sleep(1000)\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.#db) await this.connect()\n    const physical = this.#name(collection)\n    try {\n      const names = await this.#db.listCollections({ name: physical }).toArray()\n      if (names.length === 0) {\n        if (ifExists) return\n        throw new Error('collection not found: ' + collection)\n      }\n      // Clear documents (fast/immediate) and drop the collection; the search index goes with it.\n      await this.#db\n        .collection(physical)\n        .drop()\n        .catch(() => undefined)\n      this.#dims.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.#db) await this.connect()\n    const names = await this.#db.listCollections({ name: this.#name(collection) }).toArray()\n    return names.length > 0\n  }\n\n  async renameCollection(_from: string, _to: string): Promise<void> {\n    throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'mongodb'])\n  }\n\n  async executeUpsert(plan: UpsertPlan): Promise<void> {\n    if (plan.records.length === 0) return\n    validateRecords(plan.records)\n    const col = await this.#col(plan.collection)\n    const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n    const ids: string[] = []\n    try {\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 col.updateOne(\n          { id: r.id },\n          {\n            $set: {\n              id: r.id,\n              vec: vector,\n              document: r.document ?? '',\n              metadata: r.metadata ? JSON.stringify(r.metadata) : '{}',\n            },\n          },\n          { upsert: true }\n        )\n        ids.push(r.id)\n      }\n      // Settle: wait until the just-written ids are visible to $vectorSearch (the index is async).\n      await this.#settlePresent(col, ids, expected ?? this.#dims.get(plan.collection) ?? 0)\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  // Poll $vectorSearch until every id in `ids` appears (bounded). Best-effort: returns on timeout.\n  async #settlePresent(col: any, ids: string[], dims: number): Promise<void> {\n    if (ids.length === 0 || dims <= 0) return\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: Set<string>\n      try {\n        const res = await col\n          .aggregate([\n            {\n              $vectorSearch: {\n                index: INDEX,\n                path: 'vec',\n                queryVector: probe,\n                numCandidates: Math.max(ids.length * 10, 50),\n                limit: Math.max(ids.length * 5, 50),\n              },\n            },\n            { $project: { id: 1 } },\n          ])\n          .toArray()\n        seen = new Set(res.map((d: any) => d.id))\n      } catch {\n        seen = new Set()\n      }\n      if (ids.every((id) => seen.has(id))) return\n      await this.#sleep(300)\n    }\n  }\n\n  async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n    const col = await this.#col(plan.collection)\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        // Plain find() — strongly consistent, no index lag.\n        const doc = await col.findOne({ id: plan.near.id })\n        if (!doc) {\n          throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n        }\n        queryVector = doc.vec as number[]\n      }\n    }\n\n    const offset = plan.offset ?? 0\n    try {\n      if (queryVector) {\n        const k = (plan.filter ? 1000 : plan.topK + offset) || 10\n        const pipeline: any[] = [\n          {\n            $vectorSearch: {\n              index: INDEX,\n              path: 'vec',\n              queryVector,\n              numCandidates: Math.max(k * 10, 100),\n              limit: k,\n            },\n          },\n          {\n            $project: {\n              id: 1,\n              vec: 1,\n              document: 1,\n              metadata: 1,\n              score: { $meta: 'vectorSearchScore' },\n            },\n          },\n        ]\n        const docs = await col.aggregate(pipeline).toArray()\n        const filtered = plan.filter\n          ? docs.filter((d: any) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n          : docs\n        return filtered\n          .slice(offset, offset + plan.topK)\n          .map((d: any) => this.#project(d, plan, true))\n      } else {\n        // Filter-scan: plain find() (strongly consistent, no $vectorSearch index lag).\n        const docs = await col.find({}).toArray()\n        const filtered = plan.filter\n          ? docs.filter((d: any) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n          : docs\n        return filtered\n          .slice(offset, offset + plan.topK)\n          .map((d: any) => this.#project(d, plan, false))\n      }\n    } catch (err) {\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, isKnn: 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 (isKnn && typeof doc.score === 'number') {\n      // Atlas vectorSearchScore for cosine is already in [0,1], higher = closer.\n      out.score = doc.score\n    }\n    return out\n  }\n\n  async executeDelete(plan: DeletePlan): Promise<void> {\n    const col = await this.#col(plan.collection)\n    try {\n      if (plan.ids && plan.ids.length > 0) {\n        await col.deleteMany({ id: { $in: plan.ids } })\n      } else if (plan.filter) {\n        // Plain find() to resolve target ids (immediate), then delete by id.\n        const docs = await col.find({}).toArray()\n        const targets = docs\n          .filter((d: any) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n          .map((d: any) => d.id as string)\n        if (targets.length > 0) await col.deleteMany({ id: { $in: targets } })\n      } else {\n        await col.deleteMany({})\n      }\n    } catch (err) {\n      throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n    }\n  }\n}\n"],"mappings":"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"}