{"version":3,"file":"qdrant.cjs","names":["#opts","#client"],"sources":["../../../src/batteries/vector/qdrant/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/qdrant\n */\n\nimport { sha256 } from 'js-sha256'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { normalizeScore, sanitizeMetadata } from '../helpers'\nimport { isFilterCondition, isRawFilter, isFilterGroup } from '../filters'\nimport {\n  E_VECTOR_STORE_DRIVER_UNAVAILABLE,\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_FILTER_OPERATOR,\n  E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { VectorFilter } from '../filters'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from '../types'\n\n/** Translate a neutral {@link VectorFilter} into a Qdrant filter object. */\nexport const translateQdrantFilter = (\n  filter?: VectorFilter\n): Record<string, unknown> | undefined => {\n  if (!filter) return undefined\n  if (isRawFilter(filter)) {\n    if (filter.$dialect === 'qdrant') {\n      return filter.$raw as Record<string, unknown>\n    }\n    throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['qdrant', String(filter.$dialect)])\n  }\n  if (isFilterCondition(filter)) {\n    const { field, op, value } = filter\n    if (value === undefined) {\n      if (op === 'exists') {\n        return { must_not: [{ is_empty: { key: field } }] }\n      }\n      throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['qdrant', op])\n    }\n    if (op === 'eq') {\n      return { must: [{ key: field, match: { value } }] }\n    }\n    if (op === 'ne') {\n      return { must_not: [{ key: field, match: { value } }] }\n    }\n    if (op === 'gt') {\n      return { must: [{ key: field, range: { gt: value } }] }\n    }\n    if (op === 'gte') {\n      return { must: [{ key: field, range: { gte: value } }] }\n    }\n    if (op === 'lt') {\n      return { must: [{ key: field, range: { lt: value } }] }\n    }\n    if (op === 'lte') {\n      return { must: [{ key: field, range: { lte: value } }] }\n    }\n    if (op === 'in') {\n      return { must: [{ key: field, match: { any: value } }] }\n    }\n    if (op === 'nin') {\n      return { must_not: [{ key: field, match: { any: value } }] }\n    }\n    if (op === 'exists') {\n      return value === false\n        ? { must: [{ is_empty: { key: field } }] }\n        : { must_not: [{ is_empty: { key: field } }] }\n    }\n    if (op === 'contains') {\n      return { must: [{ key: field, match: { value } }] }\n    }\n    throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['qdrant', op])\n  }\n  if (isFilterGroup(filter)) {\n    const { and, or, not } = filter\n    if (and) {\n      const children = and\n        .map((f) => translateQdrantFilter(f) as Record<string, unknown>)\n        .filter((c) => c !== undefined)\n      if (children.length === 0) return undefined\n      if (children.length === 1) return children[0]\n      return { must: children }\n    }\n    if (or) {\n      const children = or\n        .map((f) => translateQdrantFilter(f) as Record<string, unknown>)\n        .filter((c) => c !== undefined)\n      if (children.length === 0) return undefined\n      if (children.length === 1) return children[0]\n      return { should: children }\n    }\n    if (not) {\n      const child = translateQdrantFilter(not)\n      if (!child) return { must_not: [] }\n      return { must_not: [child] }\n    }\n    return undefined\n  }\n  return undefined\n}\n\nexport interface QdrantVectorStoreOptions extends BaseVectorStoreOptions {\n  /** Connection and authentication parameters for the backend. */\n  connection?: { url?: string; host?: string; port?: number; apiKey?: string; https?: boolean }\n}\n\nconst getQdrantClient = async () => {\n  try {\n    const mod = await import('@qdrant/js-client-rest')\n    return mod.QdrantClient\n  } catch {\n    throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@qdrant/js-client-rest'])\n  }\n}\n\nconst uuidFromId = (id: string): string => {\n  const h = sha256(id)\n  return (\n    h.slice(0, 8) +\n    '-' +\n    h.slice(8, 12) +\n    '-' +\n    h.slice(12, 16) +\n    '-' +\n    h.slice(16, 20) +\n    '-' +\n    h.slice(20, 32)\n  )\n}\n\nexport class QdrantVectorStore extends BaseVectorStore {\n  readonly capabilities: VectorStoreCapabilities = {\n    transactions: false,\n    namedVectors: true,\n    rename: false,\n    rawSql: false,\n    builtInEncoding: false,\n    // Strongly consistent (writes use wait=true): visible on resolve, so the option is a no-op.\n    consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n  }\n  #client: any | null = null\n  get #opts() {\n    return this.options as QdrantVectorStoreOptions\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  async connect(): Promise<void> {\n    if (this.#client) return\n    const QdrantClient = await getQdrantClient()\n    const c = this.#opts.connection || {}\n    this.#client = new QdrantClient({\n      url: c.url,\n      host: c.host,\n      port: c.port,\n      apiKey: c.apiKey,\n      https: c.https,\n    })\n  }\n  async close(): Promise<void> {\n    this.#client = null\n  }\n  async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n    const client = this.#client || (await this.connect(), this.#client!)\n    const dist =\n      spec.vector.metric === 'cosine' ? 'Cosine' : spec.vector.metric === 'dot' ? 'Dot' : 'Euclid'\n    if (ifNotExists && (await this.hasCollection(spec.collection))) return\n    try {\n      await client.createCollection(spec.collection, {\n        vectors: { size: spec.vector.dimensions, distance: dist },\n      })\n    } catch (err) {\n      throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n    }\n  }\n  async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n    const client = this.#client || (await this.connect(), this.#client!)\n    if (ifExists && !(await this.hasCollection(collection))) return\n    try {\n      await client.deleteCollection(collection)\n    } catch (err) {\n      throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', String(err)])\n    }\n  }\n  async hasCollection(collection: string): Promise<boolean> {\n    const client = this.#client || (await this.connect(), this.#client!)\n    try {\n      await client.getCollection(collection)\n      return true\n    } catch {\n      return false\n    }\n  }\n  async renameCollection(_from: string, _to: string): Promise<void> {\n    throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'qdrant'])\n  }\n  async executeUpsert(plan: UpsertPlan): Promise<void> {\n    if (plan.records.length === 0) return\n    validateRecords(plan.records)\n    const client = this.#client || (await this.connect(), this.#client!)\n    const expected = this.#opts.dimensions\n    const points: any[] = []\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      points.push({\n        id: uuidFromId(r.id),\n        vector,\n        payload: { ...sanitizeMetadata(r.metadata), __id: r.id, __document: r.document },\n      })\n    }\n    try {\n      await client.upsert(plan.collection, { points })\n    } catch (err) {\n      throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n    }\n  }\n  async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n    const client = this.#client || (await this.connect(), this.#client!)\n    const metric = this.#opts.metric ?? 'cosine'\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        const res = await client.scroll(plan.collection, {\n          filter: { must: [{ key: '__id', match: { value: plan.near.id } }] },\n          limit: 1,\n          with_payload: true,\n          with_vector: true,\n        })\n        if (res.points.length === 0) {\n          throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n        }\n        queryVector = res.points[0].vector as number[]\n      }\n    }\n    let hits: any[]\n    if (queryVector) {\n      const filter = this.translateQdrantFilter(plan.filter)\n      const res = await client.query(plan.collection, {\n        query: { nearest: queryVector },\n        limit: plan.topK,\n        offset: plan.offset,\n        filter,\n        with_payload: true,\n        with_vector: !!plan.projection.vector,\n      })\n      hits = res.points\n    } else {\n      const filter = this.translateQdrantFilter(plan.filter)\n      const res = await client.scroll(plan.collection, {\n        filter,\n        limit: plan.topK,\n        with_payload: true,\n        with_vector: !!plan.projection.vector,\n      })\n      hits = res.points\n    }\n    const proj = plan.projection\n    return hits.map((hit) => this.projectHit(hit, proj, metric))\n  }\n  async executeDelete(plan: DeletePlan): Promise<void> {\n    const client = this.#client || (await this.connect(), this.#client!)\n    try {\n      if (plan.ids) {\n        await client.delete(plan.collection, { points: plan.ids.map(uuidFromId) })\n      } else if (plan.filter) {\n        await client.delete(plan.collection, { filter: this.translateQdrantFilter(plan.filter) })\n      } else {\n        await client.delete(plan.collection, { filter: {} })\n      }\n    } catch (err) {\n      throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n    }\n  }\n  /** Project a raw Qdrant hit into a {@link VectorMatch} per the requested projection, normalizing its score. */\n  projectHit(hit: any, projection: any, metric: string): VectorMatch {\n    const out: VectorMatch = {}\n    const payload = hit.payload || {}\n    if (projection.id) {\n      out.id = payload.__id\n    }\n    if (projection.vector && hit.vector) {\n      out.vector = hit.vector as number[]\n    }\n    if (projection.document) {\n      out.document = payload.__document\n    }\n    if (projection.metadata) {\n      const meta: Record<string, unknown> = {}\n      for (const k in payload) {\n        if (k !== '__id' && k !== '__document') {\n          meta[k] = payload[k]\n        }\n      }\n      out.metadata = meta as any\n    }\n    if (projection.score !== false && 'score' in hit) {\n      out.score = normalizeScore(\n        hit.score as number,\n        metric as any,\n        metric === 'euclidean' ? 'distance' : 'similarity'\n      )\n    }\n    return out\n  }\n  /** Instance wrapper over the module-level {@link translateQdrantFilter}. */\n  translateQdrantFilter(filter?: VectorFilter): Record<string, unknown> | undefined {\n    return translateQdrantFilter(filter)\n  }\n}\n"],"mappings":"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"}