{"version":3,"file":"vespa.mjs","names":["#opts","#connected","#endpoint","#untilDate","#collections","#deploy","#configUrl","#buildPackage","#sleep","#clearCollection","#vecValues","#parseMeta","#project"],"sources":["../../../src/batteries/vector/vespa/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/vespa\n *\n * Vespa vector-store adapter. A logical collection maps to a document-type in a deployed\n * application package; the adapter maintains the application-package STATE in memory (the set of\n * live collections + their dims/metric) and redeploys the whole package on each schema change\n * via the config server (dependency-free store-zip). Feed/get/delete/search are performed over\n * the document + search HTTP APIs; scores are recomputed locally (cosineSim/dotProd/euclideanDist)\n * to guarantee the [0,1] contract regardless of backend metric quirks. Metadata is a JSON string\n * field filtered with the neutral filter tree's JS reference evaluator for cross-adapter parity.\n *\n * Vespa has NO runtime \"create collection\". A collection = a document-type declared in a .sd schema\n * file inside a deployed application package. The adapter maintains the application-package STATE\n * in memory and redeploys the whole package on each schema change via the config server.\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_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\n// ZIP writer (no compression)\nconst crc32Table: number[] = (() => {\n  const t: number[] = []\n  for (let n = 0; n < 256; n++) {\n    let c = n\n    for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1\n    t[n] = c >>> 0\n  }\n  return t\n})()\n\nconst crc32 = (buf: Buffer): number => {\n  let c = 0xffffffff\n  for (let i = 0; i < buf.length; i++) c = crc32Table[(c ^ buf[i]) & 0xff] ^ (c >>> 8)\n  return (c ^ 0xffffffff) >>> 0\n}\n\nconst storeZip = (files: Array<{ name: string; data: Buffer }>): Buffer => {\n  const locals: Buffer[] = []\n  const central: Buffer[] = []\n  let offset = 0\n  for (const f of files) {\n    const name = Buffer.from(f.name, 'utf8')\n    const data = f.data\n    const crc = crc32(data)\n    const lh = Buffer.alloc(30)\n    lh.writeUInt32LE(0x04034b50, 0)\n    lh.writeUInt16LE(20, 4)\n    lh.writeUInt32LE(crc, 14)\n    lh.writeUInt32LE(data.length, 18)\n    lh.writeUInt32LE(data.length, 22)\n    lh.writeUInt16LE(name.length, 26)\n    const local = Buffer.concat([lh, name, data])\n    locals.push(local)\n    const ch = Buffer.alloc(46)\n    ch.writeUInt32LE(0x02014b50, 0)\n    ch.writeUInt16LE(20, 4)\n    ch.writeUInt16LE(20, 6)\n    ch.writeUInt32LE(crc, 16)\n    ch.writeUInt32LE(data.length, 20)\n    ch.writeUInt32LE(data.length, 24)\n    ch.writeUInt16LE(name.length, 28)\n    ch.writeUInt32LE(offset, 42)\n    central.push(Buffer.concat([ch, name]))\n    offset += local.length\n  }\n  const cd = Buffer.concat(central)\n  const localAll = Buffer.concat(locals)\n  const eocd = Buffer.alloc(22)\n  eocd.writeUInt32LE(0x06054b50, 0)\n  eocd.writeUInt16LE(files.length, 8)\n  eocd.writeUInt16LE(files.length, 10)\n  eocd.writeUInt32LE(cd.length, 12)\n  eocd.writeUInt32LE(localAll.length, 16)\n  return Buffer.concat([localAll, cd, eocd])\n}\n\nconst metricToVespa = (metric: DistanceMetric): string =>\n  metric === 'cosine' ? 'angular' : metric === 'euclidean' ? 'euclidean' : 'dotproduct'\n\nconst cosineSim = (a: number[], b: number[]): number => {\n  let dot = 0\n  let normA = 0\n  let normB = 0\n  for (const [i, av] of a.entries()) {\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  for (const [i, av] of a.entries()) {\n    s += av * b[i]\n  }\n  return s\n}\n\nconst euclideanDist = (a: number[], b: number[]): number => {\n  let s = 0\n  for (const [i, av] of a.entries()) {\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    const raw = cosineSim(vec, query)\n    return normalizeScore(raw, 'cosine', 'similarity')\n  }\n}\n\nexport interface VespaVectorStoreOptions extends BaseVectorStoreOptions {\n  /** Connection and authentication parameters for the backend. */\n  connection?: {\n    endpoint?: string\n    configUrl?: string\n  }\n}\n\nexport class VespaVectorStore 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  #collections: Map<string, { dims: number; metric: DistanceMetric }> = new Map()\n  #connected: boolean = false\n\n  get #opts(): VespaVectorStoreOptions {\n    return this.options as VespaVectorStoreOptions\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' && typeof fetch === 'function'\n  }\n\n  isAvailable(): boolean {\n    return typeof process !== 'undefined' && typeof fetch === 'function'\n  }\n\n  async connect(): Promise<void> {\n    if (this.#connected) return\n    const endpoint = this.#endpoint()\n    try {\n      const res = await fetch(endpoint + '/ApplicationStatus')\n      if (!res.ok) {\n        const body = (await res.json()) as any\n        throw new E_VECTOR_STORE_CONNECTION_FAILED([\n          `Vespa config server unreachable: ${body?.message ?? res.statusText}`,\n        ])\n      }\n    } catch (err) {\n      throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n    }\n    this.#connected = true\n  }\n\n  async close(): Promise<void> {\n    this.#connected = false\n  }\n\n  #endpoint(): string {\n    return this.#opts.connection?.endpoint ?? 'http://localhost:8080'\n  }\n\n  #configUrl(): string {\n    return this.#opts.connection?.configUrl ?? 'http://localhost:19071'\n  }\n\n  #untilDate(): string {\n    return new Date(Date.now() + 25 * 86400 * 1000).toISOString().slice(0, 10)\n  }\n\n  #buildPackage(): Buffer {\n    const files: Array<{ name: string; data: Buffer }> = []\n\n    // hosts.xml (constant)\n    files.push({\n      name: 'hosts.xml',\n      data: Buffer.from(\n        '<?xml version=\"1.0\" encoding=\"utf-8\" ?>\\n<hosts><host name=\"localhost\"><alias>node1</alias></host></hosts>\\n',\n        'utf8'\n      ),\n    })\n\n    // validation-overrides.xml\n    const until = this.#untilDate()\n    files.push({\n      name: 'validation-overrides.xml',\n      data: Buffer.from(\n        `<validation-overrides>\\n  <allow until=\"${until}\">schema-removal</allow>\\n  <allow until=\"${until}\">field-type-change</allow>\\n  <allow until=\"${until}\">indexing-change</allow>\\n</validation-overrides>\\n`,\n        'utf8'\n      ),\n    })\n\n    // services.xml (one <document> line per live collection)\n    let docLines = ''\n    for (const [coll] of this.#collections) {\n      docLines += `    <document type=\"${coll}\" mode=\"index\"/>\\n`\n    }\n    if (docLines === '') docLines = '    <document type=\"empty\" mode=\"index\"/>\\n'\n    files.push({\n      name: 'services.xml',\n      data: Buffer.from(\n        `<?xml version=\"1.0\" encoding=\"utf-8\" ?>\\n<services version=\"1.0\">\\n  <container id=\"default\" version=\"1.0\"><document-api/><search/></container>\\n  <content id=\"docs\" version=\"1.0\">\\n    <redundancy>1</redundancy>\\n    <documents>\\n${docLines}    </documents>\\n    <nodes><node distribution-key=\"0\" hostalias=\"node1\"/></nodes>\\n    <tuning><resource-limits><disk>0.97</disk><memory>0.95</memory></resource-limits></tuning>\\n  </content>\\n</services>\\n`,\n        'utf8'\n      ),\n    })\n\n    // schemas/<coll>.sd\n    for (const [coll, spec] of this.#collections) {\n      const metric = metricToVespa(spec.metric)\n      const sd = `schema ${coll} {\\n  document ${coll} {\\n    field id type string {\\n      indexing: summary | attribute\\n      attribute: fast-search\\n    }\\n    field vec type tensor<float>(x[${spec.dims}]) {\\n      indexing: summary | attribute | index\\n      attribute { distance-metric: ${metric} }\\n      index { hnsw { max-links-per-node: 16 neighbors-to-explore-at-insert: 100 } }\\n    }\\n    field document type string { indexing: summary }\\n    field metadata type string { indexing: summary }\\n  }\\n  rank-profile vector_nearest {\\n    inputs { query(q) tensor<float>(x[${spec.dims}]) }\\n    first-phase { expression: closeness(field, vec) }\\n  }\\n}\\n`\n      files.push({\n        name: `schemas/${coll}.sd`,\n        data: Buffer.from(sd, 'utf8'),\n      })\n    }\n\n    return storeZip(files)\n  }\n\n  async #deploy(): Promise<void> {\n    const url = this.#configUrl() + '/application/v2/tenant/default/prepareandactivate'\n    const pkg = this.#buildPackage()\n    // fetch's BodyInit doesn't accept a Node Buffer directly under the DOM lib types; a Uint8Array\n    // view over the same bytes is an accepted BodyInit and avoids a copy.\n    const res = await fetch(url, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/zip' },\n      // The installed DOM lib's BodyInit doesn't list Uint8Array, but the runtime (undici/Node)\n      // accepts a typed-array body fine — cast through the accepted union.\n      body: new Uint8Array(pkg.buffer, pkg.byteOffset, pkg.byteLength) as unknown as BodyInit,\n    })\n    if (!res.ok) {\n      const data = (await res.json()) as any\n      throw new E_VECTOR_STORE_COLLECTION_FAILED(['deploy', data?.message ?? `HTTP ${res.status}`])\n    }\n    // Poll ApplicationStatus until 200\n    const endpoint = this.#endpoint()\n    for (let i = 0; i < 60; i++) {\n      try {\n        const sres = await fetch(endpoint + '/ApplicationStatus')\n        if (sres.ok) return\n      } catch {\n        // continue polling\n      }\n      await this.#sleep(1000)\n    }\n  }\n\n  async #sleep(ms: number): Promise<void> {\n    await new Promise((r) => setTimeout(r, ms))\n  }\n\n  #vecValues(field: any): number[] {\n    if (field?.values && Array.isArray(field.values)) return field.values\n    if (field?.cells && Array.isArray(field.cells)) {\n      return field.cells.map((c: any) => c.value)\n    }\n    return []\n  }\n\n  async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n    const coll = spec.collection\n    if (this.#collections.has(coll)) {\n      if (ifNotExists) return\n      throw new E_VECTOR_STORE_COLLECTION_FAILED([\n        'createCollection',\n        `collection already exists: ${coll}`,\n      ])\n    }\n    this.#collections.set(coll, { dims: spec.vector.dimensions, metric: spec.vector.metric })\n    try {\n      await this.#deploy()\n      // Wait for schema to be query-ready\n      const endpoint = this.#endpoint()\n      for (let i = 0; i < 30; i++) {\n        try {\n          const q = encodeURIComponent(`select id from ${coll} where true`)\n          const res = await fetch(`${endpoint}/search/?yql=${q}&hits=1`)\n          if (res.ok) break\n        } catch {\n          // continue polling\n        }\n        await this.#sleep(500)\n      }\n      // Clear any residual documents (redeploy preserves data)\n      await this.#clearCollection(coll)\n    } catch (err) {\n      throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n    }\n  }\n\n  async #clearCollection(coll: string): Promise<void> {\n    try {\n      const endpoint = this.#endpoint()\n      const res = await fetch(\n        `${endpoint}/document/v1/default/${coll}/docid?selection=true&cluster=docs`,\n        {\n          method: 'DELETE',\n        }\n      )\n      if (!res.ok) {\n        const body = (await res.json()) as any\n        // Ignore 404 for non-existing collection\n        if (body?.message?.includes('No document type') || res.status === 404) {\n          return\n        }\n      }\n    } catch {\n      // Ignore errors during clear\n    }\n  }\n\n  async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n    if (!this.#collections.has(collection)) {\n      if (ifExists) return\n      throw new E_VECTOR_STORE_COLLECTION_FAILED([\n        'dropCollection',\n        `collection not found: ${collection}`,\n      ])\n    }\n    try {\n      await this.#clearCollection(collection)\n      this.#collections.delete(collection)\n      if (this.#collections.size === 0) {\n        // Do not redeploy an empty content cluster; just forget it locally\n        return\n      }\n      await this.#deploy()\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    return this.#collections.has(collection)\n  }\n\n  async renameCollection(_from: string, _to: string): Promise<void> {\n    throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'vespa'])\n  }\n\n  async executeUpsert(plan: UpsertPlan): Promise<void> {\n    if (plan.records.length === 0) return\n    validateRecords(plan.records)\n    const coll = plan.collection\n    const endpoint = this.#endpoint()\n    const dims = this.#opts.dimensions ?? this.#collections.get(coll)?.dims\n    try {\n      const ids = []\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 (dims !== undefined && vector.length !== dims) {\n          throw new E_VECTOR_STORE_DIMENSION_MISMATCH([dims, vector.length])\n        }\n        const body = {\n          fields: {\n            id: r.id,\n            vec: { values: vector },\n            document: r.document ?? '',\n            metadata: r.metadata ? JSON.stringify(r.metadata) : '{}',\n          },\n        }\n        const res = await fetch(\n          `${endpoint}/document/v1/default/${coll}/docid/${encodeURIComponent(r.id)}`,\n          {\n            method: 'POST',\n            headers: { 'Content-Type': 'application/json' },\n            body: JSON.stringify(body),\n          }\n        )\n        if (!res.ok) {\n          const errData = (await res.json()) as any\n          throw new Error(errData?.message ?? `HTTP ${res.status}`)\n        }\n        ids.push(r.id)\n      }\n      // Brief settle for HNSW index\n      await this.#sleep(500)\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 coll = plan.collection\n    const endpoint = this.#endpoint()\n    const metric = this.#collections.get(coll)?.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 fetch(\n          `${endpoint}/document/v1/default/${coll}/docid/${encodeURIComponent(plan.near.id)}`\n        )\n        if (!res.ok) {\n          throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n        }\n        const data = (await res.json()) as any\n        const vec = this.#vecValues(data.fields?.vec)\n        if (!vec || vec.length === 0) {\n          throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n        }\n        queryVector = vec\n      }\n    }\n\n    const offset = plan.offset ?? 0\n    const topK = plan.topK ?? 10\n    const k = plan.filter ? 400 : topK + offset\n    const yql = queryVector\n      ? `select id, document, metadata, vec from ${coll} where {targetHits:${k}}nearestNeighbor(vec, q)`\n      : `select id, document, metadata, vec from ${coll} where true`\n\n    try {\n      const body: any = {\n        yql,\n        hits: k,\n      }\n      if (queryVector) {\n        body['input.query(q)'] = queryVector\n        body['ranking.profile'] = 'vector_nearest'\n      }\n      const res = await fetch(`${endpoint}/search/`, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify(body),\n      })\n      if (!res.ok) {\n        throw new Error(`HTTP ${res.status}`)\n      }\n      const data = (await res.json()) as any\n      const root = data.root as any\n      const children = root.children ?? []\n\n      if (queryVector) {\n        const filtered = children\n          .filter((c: any) =>\n            evaluateFilter(plan.filter ?? {}, this.#parseMeta(c.fields?.metadata))\n          )\n          .map((c: any) => {\n            const vec = this.#vecValues(c.fields?.vec)\n            const score = computeScore(vec, queryVector, metric)\n            return { ...c.fields, score }\n          })\n        filtered.sort((a: any, b: any) => b.score - a.score)\n        return filtered.slice(offset, offset + topK).map((d: any) => this.#project(d, plan, true))\n      } else {\n        const filtered = children.filter((c: any) =>\n          evaluateFilter(plan.filter ?? {}, this.#parseMeta(c.fields?.metadata))\n        )\n        return filtered.slice(offset, offset + topK).map((d: any) => this.#project(d, plan, false))\n      }\n    } catch (err) {\n      if ((err as any)?.message?.includes('Referenced id not found')) {\n        throw err\n      }\n      throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n    }\n  }\n\n  async executeDelete(plan: DeletePlan): Promise<void> {\n    const coll = plan.collection\n    const endpoint = this.#endpoint()\n    try {\n      if (plan.ids && plan.ids.length > 0) {\n        for (const id of plan.ids) {\n          const res = await fetch(\n            `${endpoint}/document/v1/default/${coll}/docid/${encodeURIComponent(id)}`,\n            { method: 'DELETE' }\n          )\n          if (!res.ok && res.status !== 404) {\n            const body = (await res.json()) as any\n            throw new Error(body?.message ?? `HTTP ${res.status}`)\n          }\n        }\n      } else if (plan.filter) {\n        const yql = `select id, metadata, vec from ${coll} where true`\n        const res = await fetch(`${endpoint}/search/`, {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({ yql, hits: 400 }),\n        })\n        if (!res.ok) {\n          throw new Error(`HTTP ${res.status}`)\n        }\n        const data = (await res.json()) as any\n        const children = data.root.children ?? []\n        const targets = children\n          .filter((c: any) => evaluateFilter(plan.filter!, this.#parseMeta(c.fields?.metadata)))\n          .map((c: any) => c.fields?.id)\n        for (const id of targets) {\n          await fetch(`${endpoint}/document/v1/default/${coll}/docid/${encodeURIComponent(id)}`, {\n            method: 'DELETE',\n          })\n        }\n      } else {\n        await fetch(`${endpoint}/document/v1/default/${coll}/docid?selection=true&cluster=docs`, {\n          method: 'DELETE',\n        })\n      }\n    } catch (err) {\n      throw new E_VECTOR_STORE_DELETE_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) {\n      const vec = this.#vecValues(doc.vec)\n      if (vec && vec.length > 0) out.vector = vec.map(Number)\n    }\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"],"mappings":"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"}