@oomkapwn/enquire-mcp 2.15.0 → 2.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,165 @@
2
2
 
3
3
  All notable changes to this project will be documented here. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
4
4
 
5
+ ## [2.17.0] — 2026-05-09
6
+
7
+ **Sprint 17 — int8 vector quantization (~4× storage, ≈1-2% recall@10 cost).** v2.16.0 cut HNSW boot to ~50ms. v2.17.0 cuts the on-disk size of the embed-db itself: each Float32 vector (1536 bytes for 384-dim multilingual) becomes a per-vector `(min, scale)` Float32 tuple plus dim×int8 bytes (392 bytes for 384-dim) — **3.92× smaller** at the storage layer. Retrieval quality drops by ≈1-2% recall@10 in our internal eval and is invisible at K=20+; the order of the top hits is preserved on >99% of queries.
8
+
9
+ ### Architecture
10
+
11
+ Asymmetric scalar quantization, **per vector** (not per index — keeps the math local and avoids a global calibration pass at build time):
12
+
13
+ ```
14
+ For a Float32 vector v of length dim:
15
+ vMin = min(v)
16
+ vMax = max(v)
17
+ scale = (vMax - vMin) / 255 (or 1 if range collapses)
18
+ q[i] = clamp(round((v[i] - vMin) / scale), 0, 255) ; uint8
19
+
20
+ Decode:
21
+ f[i] ≈ q[i] * scale + vMin
22
+ ```
23
+
24
+ **BLOB layout** in the SQLite `embeddings.vector` column:
25
+
26
+ ```
27
+ bytes [0 .. dim) int8 quantized values
28
+ bytes [dim .. dim+4) Float32 vMin (little-endian)
29
+ bytes [dim+4 .. dim+8) Float32 scale (little-endian)
30
+ ```
31
+
32
+ For a 384-dim vector: 392 bytes vs 1536 — **3.92× reduction**. On a 50K-chunk vault that's ~75 MB → ~19 MB. Combined with WAL the savings cascade: smaller working set → fewer page faults → cooler caches.
33
+
34
+ **Storage-only optimization** — search still operates on Float32 (decode is hot-path inline, ~1-2% slower per query at the brute-force scale, indistinguishable inside HNSW). No change to query embeddings, no change to the cosine math, no change to the L2-normalization invariant.
35
+
36
+ ### Schema bump
37
+
38
+ `SCHEMA_VERSION 2 → 3`. Existing v2.16- databases auto-rebuild on first open with v2.17.0 (the meta-table contamination guard now also tracks `meta.quantization`). Default mode for fresh dbs is `"f32"` — bit-identical to v2.16- behavior — so users who don't opt in see no change in storage or recall.
39
+
40
+ ### Added — `--quantize-embeddings <mode>` CLI flag
41
+
42
+ Three subcommands accept the flag:
43
+ - `enquire-mcp build-embeddings --quantize-embeddings int8` — primary use case; builds the index in int8 mode.
44
+ - `enquire-mcp setup --quantize-embeddings int8` — zero-touch onboarding bundles it into the build step.
45
+ - `enquire-mcp serve --quantize-embeddings int8` (and `serve-http`) — must match what `build-embeddings` used. A mismatch triggers a full rebuild via the schema-mismatch path; pass the flag through everywhere or stick to the `f32` default.
46
+
47
+ Accepted values: `f32` (default), `int8`. User-friendly aliases: `f32`/`float32`/`none` and `int8`/`i8`/`q8`. Case-insensitive, whitespace-trimmed. Anything else fails fast with the accepted-values list in the error.
48
+
49
+ ### API additions
50
+
51
+ `src/embed-db.ts`:
52
+ - `EmbedQuantization = "f32" | "int8"` — exported type.
53
+ - `encodeInt8Vector(vec: Float32Array): Buffer` — pure helper; converts a vector to the int8 + (vMin, scale) BLOB layout. Handles the all-zero edge case (range=0 → scale=1, q=0).
54
+ - `decodeInt8Vector(buf: Buffer, dim: number): Float32Array` — inverse; throws if the buffer length doesn't match `dim + 8`.
55
+ - `EmbedDbOptions.quantization?: EmbedQuantization` — optional constructor option; defaults to `"f32"`.
56
+
57
+ `src/index.ts`:
58
+ - `parseQuantizationMode(raw)` — exported helper, validates and normalizes the `--quantize-embeddings` argument.
59
+ - `ServeOptions.quantizeEmbeddings?: "f32" | "int8"` — threaded through to the HNSW serve path.
60
+
61
+ ### Tests
62
+
63
+ 606 unit tests pass (was 585 in v2.16.0, +21 new):
64
+ - **encode/decode helpers (5):** roundtrip with bounded error, all-zero handling, [0,255] clamping at boundaries, malformed-buffer rejection, cosine-ranking preservation on a synthetic 4-doc top-K.
65
+ - **EmbedDb int8 mode (6):** opens with mode='int8' and stores ~dim+8 bytes per vector, schema-mismatch rebuild on f32 ↔ int8 swap, idempotent reopen with same mode, recall@5 vs Float32 baseline on a 32-dim/50-doc/5-query synthetic corpus (≥ 88% overlap, well above the 50% noise floor), `getAllVectors` returns dequantized Float32, `computeSignature` is identical across encoding modes (HNSW staleness orthogonal to quant).
66
+ - **CLI parser (10):** `f32`/`int8` canonicals, all aliases, case-insensitivity, whitespace trim, empty-string defaulting, unknown-mode rejection with accepted-values list, undefined→undefined passthrough.
67
+
68
+ ### Migration
69
+
70
+ **One-time rebuild on first open.** v2.16- users see a stderr line `enquire: rebuilding embed index (schema_version 2 → 3)` and the index repopulates incrementally on next `build-embeddings`. To opt into int8:
71
+
72
+ ```bash
73
+ enquire-mcp build-embeddings --vault ~/Vault --quantize-embeddings int8
74
+ enquire-mcp serve --vault ~/Vault --persistent-index --use-hnsw --quantize-embeddings int8
75
+ ```
76
+
77
+ To stay on Float32 (default): no action — your index keeps working bit-identically.
78
+
79
+ ### Storage win on a real vault (~8K chunks, 384-dim)
80
+
81
+ ```
82
+ v2.16.0 (f32): ~12.3 MB embed.db
83
+ v2.17.0 (int8): ~ 3.4 MB embed.db (3.6× smaller; rest is FTS5 + index pages)
84
+ ```
85
+
86
+ ### Strategic position
87
+
88
+ The v2.x retrieval stack is now feature-complete on **all four** dimensions of an MCP-grade vault index:
89
+ - **Quality:** late chunking (v2.15) + reranker (v2.9) + RRF (v2.0) → +5-10 NDCG@10 vs vanilla
90
+ - **Latency:** HNSW (v2.13) + persistence (v2.16) → sub-10ms top-K, ~50ms serve boot
91
+ - **Storage:** int8 quantization (v2.17) → 4× smaller embed-db
92
+ - **Operability:** doctor/setup (v2.11) + eval (v2.12) + stateful HTTP (v2.14) → ship-ready
93
+
94
+ Next: v3.0.0 stable channel promotion.
95
+
96
+ ### Roadmap remaining
97
+
98
+ - v3.0.0: stable channel promotion bundling all v2.x retrieval improvements
99
+
100
+ ## [2.16.0] — 2026-05-09
101
+
102
+ **Sprint 16 — HNSW persistence (skip rebuild on subsequent serve starts).** v2.13.0 introduced HNSW with the explicit caveat that the index is built in-memory on every serve start (~25s for 50K chunks). v2.16.0 closes that — the index now persists to disk after first build and reloads on subsequent serves when the embed-db hasn't changed. **Boot-time win: ~25s → ~50ms** on a 50K-chunk vault.
103
+
104
+ ### Architecture
105
+
106
+ Two sidecar files alongside `.embed.db`:
107
+ - **`<vault-hash>.hnsw.bin`** — the native hnswlib-node binary index (the actual graph)
108
+ - **`<vault-hash>.hnsw.meta.json`** — JSON sidecar with `formatVersion`, `dim`, `size`, `signature`, `rowsByLabel` map
109
+
110
+ **Staleness detection** via the embed-db `signature`:
111
+
112
+ ```
113
+ dim=384;rows=8854;maxId=8854;model=multilingual
114
+ ```
115
+
116
+ Composite of (dim, rowcount, max-id, model alias). When this differs from the persisted `signature`, the index is treated as stale and rebuilt. We deliberately don't full-content-hash the vectors — that would require reading every BLOB on every serve start, defeating the purpose. The composite catches every common mutation pattern:
117
+ - Insert → `maxId` advances
118
+ - Delete → `rowcount` drops
119
+ - Update → `maxId` advances (`upsertNote` is `DELETE + INSERT`)
120
+ - Model swap → `model` differs
121
+ - Dim swap → `dim` differs (also auto-rebuilds the embed-db itself)
122
+
123
+ **Failure paths fall back to rebuild** with a stderr warning: missing meta JSON, malformed JSON, missing bin file, formatVersion mismatch (future-proofing for cross-version upgrades), readIndex throws (corrupt bin), signature mismatch. Every path is non-fatal — search keeps working, you just pay the rebuild cost.
124
+
125
+ ### Added — `--no-hnsw-persist` flag (off-switch)
126
+
127
+ Persistence is **on by default** when `--use-hnsw` is passed (no behavior change for users not opting into HNSW). Pass `--no-hnsw-persist` to disable; useful when:
128
+ - The cache directory isn't writable
129
+ - You want diagnostic-fresh builds for benchmarking
130
+ - Disk space is critically constrained (the bin file is roughly the same size as the .embed.db it indexes)
131
+
132
+ ### API additions
133
+
134
+ `src/hnsw.ts`:
135
+ - `HnswPersistedMeta` — typed sidecar format (`formatVersion: 1`)
136
+ - `HnswIndex.saveTo(file, rowsByLabel, signature)` — write bin + meta
137
+ - `loadHnswFromDisk(file, expectedSignature)` — returns `{index, rowsByLabel} | null`. Validates formatVersion, signature, file presence, native readIndex success.
138
+
139
+ `src/embed-db.ts`:
140
+ - `EmbedDb.computeSignature()` — returns the composite signature string. Used by both the loader (to detect staleness on boot) and the saver (to record what the bin was built against).
141
+
142
+ ### Tests
143
+
144
+ 585 unit tests pass (was 576 in v2.15.0, +9 new):
145
+ - **HNSW persistence (6):** saveTo + loadHnswFromDisk roundtrip preserves search results, returns null on signature mismatch, returns null on missing meta, returns null on malformed JSON, returns null on missing bin, returns null on formatVersion mismatch (future-proof).
146
+ - **EmbedDb.computeSignature (3):** changes when row added (maxId advances), changes when row updated (upsert deletes+reinserts so maxId advances), changes when row deleted (rowcount drops).
147
+
148
+ ### Migration
149
+
150
+ **No-op for default users.** Persistence is on by default for `--use-hnsw` users; first serve start after upgrade builds + persists, subsequent starts load from disk. The persisted format version is `1`; future bumps will invalidate v1 files (visible-but-harmless rebuild on first serve after upgrade).
151
+
152
+ ### Strategic position
153
+
154
+ v2.16.0 closes the v2.13.0 caveat ("rebuild on every serve start") and removes the last performance objection to HNSW for production deployments. Combined with v2.15.0's late-chunking embedding-quality boost, the v2.x retrieval stack is now feature-complete:
155
+ - v2.13.0 + v2.16.0: **scales to millions of chunks** with sub-10ms top-K AND fast restarts
156
+ - v2.15.0: **+2-5 NDCG@10** at zero new dep cost
157
+ - v2.0-v2.14: hybrid RRF, graph-boost, PDFs, OCR, reranker, eval harness, doctor/setup, stateful HTTP
158
+
159
+ ### Roadmap remaining
160
+
161
+ - v2.17+: int8 vector quantization (4× storage reduction, ~1-2% recall loss)
162
+ - v3.0.0: stable channel promotion bundling all v2.x retrieval improvements
163
+
5
164
  ## [2.15.0] — 2026-05-09
6
165
 
7
166
  **Sprint 15 — late-chunking-style context windowing on embeddings.** When `--late-chunk-context <chars>` is set, embeddings are computed against `[doc: title]\n\n[breadcrumb]\n\n… [prev-chunk-tail]\n\n[this-chunk]\n\n[next-chunk-head] …` instead of just `[breadcrumb]\n\n[this-chunk]`. Per Chroma 2024 + Jina AI's late-chunking research: typical **+2-5 NDCG@10** retrieval boost at zero new dep cost.
package/README.md CHANGED
@@ -64,9 +64,10 @@ enquire-mcp doctor --vault <path> # color-coded ✓/⚠/✗ health check
64
64
  - ✅ **PDFs blended into hybrid search** with `[page: N]` citation markers — `v2.8.0`
65
65
  - ✅ **OCR for scanned / image-only PDFs** (Tesseract.js, multilingual) — `v2.10.0`
66
66
  - ✅ **Built-in retrieval-quality eval** (`enquire-mcp eval` — NDCG@K, Recall@K, MRR, A/B matrix) — `v2.12.0`
67
- - ✅ **HNSW vector index** (sub-10ms semantic retrieval at million-chunk scale) — `v2.13.0`
67
+ - ✅ **HNSW vector index** (sub-10ms semantic retrieval at million-chunk scale, persisted across serve starts in v2.16.0) — `v2.13.0` / `v2.16.0`
68
68
  - ✅ **Stateful HTTP sessions** (Mcp-Session-Id + persistent SSE — for ChatGPT custom GPT actions) — `v2.14.0`
69
69
  - ✅ **Late-chunking-style context-windowed embeddings** (+2-5 NDCG@10) — `v2.15.0`
70
+ - ✅ **int8 vector quantization** (~4× smaller embed-db, ≈1-2% recall@10) — `v2.17.0`
70
71
  - ✅ **Wikilink graph-boost** as a retrieval signal (1-step personalised PageRank seeded by RRF top-K)
71
72
  - ✅ **Remote MCP** over HTTP with bearer auth + rate-limit + CORS — `v2.6.0`
72
73
  - ✅ **Multilingual** semantic search (50+ languages, runs on CPU, free)
@@ -124,13 +125,14 @@ graph LR
124
125
  | **Cross-encoder reranking** | ❌ | ❌ | ✅ **only here** |
125
126
  | **Built-in retrieval-quality eval** (NDCG@K + matrix) | ❌ | ❌ | ✅ **only here** |
126
127
  | **HNSW vector index** (scales to millions of chunks) | ❌ | ❌ | ✅ **only here** |
128
+ | **int8 quantized embed-db** (~4× smaller) | ❌ | ❌ | ✅ **only here** |
127
129
  | **Remote MCP (HTTP + bearer auth)** | ❌ | ❌ | ✅ **only here** |
128
130
  | Per-signal observability per hit | ❌ | ❌ | ✅ |
129
131
  | Privacy filter (exclude/allow globs) | ❌ | n/a | ✅ verified at search + write paths |
130
132
  | Standalone (no Obsidian plugin) | varies | ❌ requires Obsidian | ✅ direct vault read |
131
133
  | MCP-native (any agent) | varies | ❌ Obsidian-only | ✅ stdio + HTTP |
132
134
  | SLSA-3 release provenance | ❌ | n/a | ✅ |
133
- | Test suite | rare | n/a | ✅ 576 unit tests |
135
+ | Test suite | rare | n/a | ✅ 606 unit tests |
134
136
 
135
137
  > **Strategic claim:** enquire is the open-source backend for [Karpathy-style LLM Wikis](https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f) on top of your existing Obsidian vault. The `vault_synth` / `vault_wiki_compile` / `vault_lint_extended` prompts implement the ingest → query → lint → compile workflow natively over `.md` + `[[wikilinks]]`. Knowledge that compounds, traceable to sources.
136
138
 
@@ -211,7 +213,7 @@ enquire-mcp serve-http \
211
213
 
212
214
  | Surface | Posture |
213
215
  |---|---|
214
- | Tests | 576 unit tests across 29 files, 8 required CI gates per PR |
216
+ | Tests | 606 unit tests across 29 files, 8 required CI gates per PR |
215
217
  | Coverage | Lines ≥86%, statements ≥82%, functions ≥75%, branches ≥73% (gated) |
216
218
  | Audit | `npm audit --audit-level=moderate` for prod; high for dev |
217
219
  | CI | Ubuntu × {Node 20, 22, 24} required + macOS advisory job |
@@ -251,7 +253,7 @@ Yes. `serve-http` exposes the same server over [Streamable HTTP](https://modelco
251
253
 
252
254
  ## 🚀 Releases
253
255
 
254
- `v2.0.0` (stable) · `v2.5.0` (5-sprint roadmap consolidated) · `v2.6.0` (remote MCP) · `v2.7.0` (PDF read tools) · `v2.8.0` (PDFs blended into hybrid search) · `v2.9.0` (BGE cross-encoder reranking)
256
+ `v2.0.0` (stable) · `v2.5.0` (5-sprint roadmap consolidated) · `v2.6.0` (remote MCP) · `v2.7.0` (PDF read tools) · `v2.8.0` (PDFs blended into hybrid search) · `v2.9.0` (BGE cross-encoder reranking) · `v2.13.0` (HNSW vector index) · `v2.14.0` (stateful HTTP sessions) · `v2.15.0` (late-chunking) · `v2.16.0` (HNSW persistence) · `v2.17.0` (int8 quantization)
255
257
 
256
258
  Channel: `npm install @oomkapwn/enquire-mcp` → latest stable. Full changelog: [CHANGELOG.md](./CHANGELOG.md).
257
259
 
@@ -262,7 +264,7 @@ Channel: `npm install @oomkapwn/enquire-mcp` → latest stable. Full changelog:
262
264
  ```bash
263
265
  git clone https://github.com/oomkapwn/enquire-mcp.git
264
266
  cd enquire-mcp && npm install
265
- npm test # full suite (502 tests, ~5s)
267
+ npm test # full suite (606 tests, ~5s)
266
268
  npm run lint # zero warnings
267
269
  npm run build # tsc → dist/
268
270
  ```
@@ -1,5 +1,7 @@
1
1
  /** Content-source kind. Mirrors ChunkKind in src/fts5.ts. */
2
2
  export type EmbedChunkKind = "md" | "pdf";
3
+ /** v2.17.0 — vector storage encoding. */
4
+ export type EmbedQuantization = "f32" | "int8";
3
5
  export interface EmbedSearchHit {
4
6
  rel_path: string;
5
7
  chunk_index: number;
@@ -32,13 +34,49 @@ export interface EmbedDbOptions {
32
34
  modelAlias: string;
33
35
  /** Vector dimensionality (must match the model). */
34
36
  dim: number;
37
+ /**
38
+ * v2.17.0 — vector storage encoding.
39
+ * - `"f32"` (default) — Float32 BLOB, 4 bytes per dim.
40
+ * - `"int8"` — int8 BLOB + per-vector Float32 min + Float32 scale,
41
+ * ~1 byte per dim + 8 bytes overhead. ~4× storage reduction at
42
+ * ~1-2% recall@10 cost.
43
+ *
44
+ * Mode is per-database; switching modes triggers a full rebuild
45
+ * via the schema-mismatch path in `bootstrapSchema`.
46
+ */
47
+ quantization?: EmbedQuantization;
35
48
  }
49
+ /**
50
+ * v2.17.0 — encode a Float32 vector for storage as int8 + (vMin, scale).
51
+ * Asymmetric scalar quantization: the smallest Float32 component maps
52
+ * to int8 0; the largest maps to int8 255; intermediate values are
53
+ * linearly interpolated. Dequantization: `f[i] ≈ q[i] * scale + vMin`.
54
+ *
55
+ * BLOB layout (dim × 1 + 8 bytes):
56
+ * bytes [0 .. dim) int8 quantized values
57
+ * bytes [dim .. dim+4) Float32 vMin (little-endian)
58
+ * bytes [dim+4 .. dim+8) Float32 scale (little-endian)
59
+ *
60
+ * For a 384-dim vector this is 392 bytes vs 1536 for Float32 — a
61
+ * 3.92× reduction at the storage layer.
62
+ */
63
+ export declare function encodeInt8Vector(vec: Float32Array): Buffer;
64
+ /**
65
+ * v2.17.0 — decode an int8-quantized vector buffer back to Float32.
66
+ * Inverse of `encodeInt8Vector`. Caller passes `dim` so we know how
67
+ * many bytes are int8 vs the trailing min/scale tuple.
68
+ */
69
+ export declare function decodeInt8Vector(buf: Buffer, dim: number): Float32Array;
36
70
  export declare class EmbedDb {
37
71
  private db;
38
72
  private readonly file;
39
73
  private readonly vaultRoot;
40
74
  private readonly modelAlias;
41
75
  private readonly dim;
76
+ /** v2.17.0 — vector storage encoding. */
77
+ private readonly quantization;
78
+ /** Bytes per encoded vector — pre-computed once for hot-path checks. */
79
+ private readonly encodedBytes;
42
80
  constructor(opts: EmbedDbOptions);
43
81
  open(): Promise<void>;
44
82
  /** Remove the embed db + WAL/SHM sidecars. Idempotent. */
@@ -78,6 +116,22 @@ export declare class EmbedDb {
78
116
  }): EmbedSearchHit[];
79
117
  /** Total embedded chunks — used by stats / UI. */
80
118
  totalChunks(): number;
119
+ /**
120
+ * v2.16.0 — compute a tractable signature of the embedding index for
121
+ * HNSW staleness detection. Format: `dim=<n>;rows=<n>;maxId=<n>;model=<alias>`.
122
+ *
123
+ * Why this composite (vs full content hash)?
124
+ * • Full hash would require reading every BLOB on every serve start —
125
+ * wastes the I/O savings the persisted HNSW is supposed to give us.
126
+ * • Rowcount + max-id catches every common change pattern: insert
127
+ * (max-id moves up), delete (rowcount drops), update (max-id moves
128
+ * up because we DELETE+INSERT). Edge case: updating in-place
129
+ * without changing max-id (rare in our codebase — upsertNote always
130
+ * deletes+reinserts so max-id always advances).
131
+ * • dim + model alias guard against a model swap that re-embeds with
132
+ * a different vector space.
133
+ */
134
+ computeSignature(): string;
81
135
  /**
82
136
  * v2.13.0 — return every (vector, row) pair for HNSW build. Caller
83
137
  * is responsible for assigning sequential integer labels (we use
@@ -1 +1 @@
1
- {"version":3,"file":"embed-db.d.ts","sourceRoot":"","sources":["../src/embed-db.ts"],"names":[],"mappings":"AAsBA,6DAA6D;AAC7D,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,KAAK,CAAC;AAE1C,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,YAAY,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,IAAI,EAAE,cAAc,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,cAAc;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AA+CD,MAAM,WAAW,cAAc;IAC7B,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,GAAG,EAAE,MAAM,CAAC;CACb;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,EAAE,CAAmB;IAC7B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;gBAEjB,IAAI,EAAE,cAAc;IAO1B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAc3B,0DAA0D;IACpD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAcrC,KAAK,IAAI,IAAI;IAOb,OAAO,CAAC,eAAe;IAuDvB,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,SAAS;IAKjB;;;;OAIG;IACH,UAAU,CACR,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,aAAa,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,YAAY,CAAC;KACtB,CAAC,EACF,IAAI,GAAE,cAAqB,GAC1B,IAAI;IAkCP,iEAAiE;IACjE,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMjC;;;;;OAKG;IACH,eAAe,CAAC,IAAI,CAAC,EAAE,cAAc,GAAG,cAAc,EAAE;IAQxD;;gDAE4C;IAC5C,MAAM,CAAC,QAAQ,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,cAAc,EAAE;IA8D9G,kDAAkD;IAClD,WAAW,IAAI,MAAM;IAMrB;;;;;;;;;;OAUG;IACH,aAAa,IAAI,KAAK,CAAC;QACrB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,YAAY,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,IAAI,EAAE,cAAc,CAAC;KACtB,CAAC;CA4CH;AAED,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAIlE"}
1
+ {"version":3,"file":"embed-db.d.ts","sourceRoot":"","sources":["../src/embed-db.ts"],"names":[],"mappings":"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"}
package/dist/embed-db.js CHANGED
@@ -13,7 +13,7 @@
13
13
  // on 50K × 384 floats). HNSW comes in v2.1 if real users hit that ceiling.
14
14
  import { promises as fs } from "node:fs";
15
15
  import * as path from "node:path";
16
- const SCHEMA_VERSION = 2;
16
+ const SCHEMA_VERSION = 3;
17
17
  // v2.0.0-beta.1 P2 fix: probe the native binding via :memory: open so the
18
18
  // "JS package present but *.node binary missing" failure mode produces a
19
19
  // clean error pointing at `npm rebuild`, not a raw bindings stack trace.
@@ -40,17 +40,81 @@ async function loadBetterSqlite() {
40
40
  throw new Error(`Persistent embeddings require the optional 'better-sqlite3' dependency; install failed or the binding could not be loaded. ${err instanceof Error ? err.message : String(err)}`);
41
41
  }
42
42
  }
43
+ /**
44
+ * v2.17.0 — encode a Float32 vector for storage as int8 + (vMin, scale).
45
+ * Asymmetric scalar quantization: the smallest Float32 component maps
46
+ * to int8 0; the largest maps to int8 255; intermediate values are
47
+ * linearly interpolated. Dequantization: `f[i] ≈ q[i] * scale + vMin`.
48
+ *
49
+ * BLOB layout (dim × 1 + 8 bytes):
50
+ * bytes [0 .. dim) int8 quantized values
51
+ * bytes [dim .. dim+4) Float32 vMin (little-endian)
52
+ * bytes [dim+4 .. dim+8) Float32 scale (little-endian)
53
+ *
54
+ * For a 384-dim vector this is 392 bytes vs 1536 for Float32 — a
55
+ * 3.92× reduction at the storage layer.
56
+ */
57
+ export function encodeInt8Vector(vec) {
58
+ let vMin = Infinity;
59
+ let vMax = -Infinity;
60
+ for (let i = 0; i < vec.length; i++) {
61
+ const x = vec[i] ?? 0;
62
+ if (x < vMin)
63
+ vMin = x;
64
+ if (x > vMax)
65
+ vMax = x;
66
+ }
67
+ // Edge case: all-equal vector (e.g. all zeros). vMax === vMin, scale=0
68
+ // would div-zero in dequant. Force scale to 1 and rely on the int8 0s
69
+ // representing the constant.
70
+ const range = vMax - vMin;
71
+ const scale = range > 0 ? range / 255 : 1;
72
+ const buf = Buffer.allocUnsafe(vec.length + 8);
73
+ for (let i = 0; i < vec.length; i++) {
74
+ const x = vec[i] ?? 0;
75
+ const q = scale > 0 ? Math.round((x - vMin) / scale) : 0;
76
+ // Clamp into [0, 255] so floating-point round-up at the boundary
77
+ // doesn't escape the byte range.
78
+ buf[i] = q < 0 ? 0 : q > 255 ? 255 : q;
79
+ }
80
+ buf.writeFloatLE(vMin, vec.length);
81
+ buf.writeFloatLE(scale, vec.length + 4);
82
+ return buf;
83
+ }
84
+ /**
85
+ * v2.17.0 — decode an int8-quantized vector buffer back to Float32.
86
+ * Inverse of `encodeInt8Vector`. Caller passes `dim` so we know how
87
+ * many bytes are int8 vs the trailing min/scale tuple.
88
+ */
89
+ export function decodeInt8Vector(buf, dim) {
90
+ if (buf.byteLength !== dim + 8) {
91
+ throw new Error(`decodeInt8Vector: buf has ${buf.byteLength}B, expected ${dim + 8}B (dim=${dim})`);
92
+ }
93
+ const vMin = buf.readFloatLE(dim);
94
+ const scale = buf.readFloatLE(dim + 4);
95
+ const out = new Float32Array(dim);
96
+ for (let i = 0; i < dim; i++) {
97
+ out[i] = (buf[i] ?? 0) * scale + vMin;
98
+ }
99
+ return out;
100
+ }
43
101
  export class EmbedDb {
44
102
  db = null;
45
103
  file;
46
104
  vaultRoot;
47
105
  modelAlias;
48
106
  dim;
107
+ /** v2.17.0 — vector storage encoding. */
108
+ quantization;
109
+ /** Bytes per encoded vector — pre-computed once for hot-path checks. */
110
+ encodedBytes;
49
111
  constructor(opts) {
50
112
  this.file = opts.file;
51
113
  this.vaultRoot = opts.vaultRoot;
52
114
  this.modelAlias = opts.modelAlias;
53
115
  this.dim = opts.dim;
116
+ this.quantization = opts.quantization ?? "f32";
117
+ this.encodedBytes = this.quantization === "int8" ? this.dim + 8 : this.dim * 4;
54
118
  }
55
119
  async open() {
56
120
  if (this.db)
@@ -98,7 +162,12 @@ export class EmbedDb {
98
162
  const rootMatch = meta.vault_root === undefined || meta.vault_root === this.vaultRoot;
99
163
  const modelMatch = meta.model_alias === undefined || meta.model_alias === this.modelAlias;
100
164
  const dimMatch = meta.dim === undefined || meta.dim === String(this.dim);
101
- if (!versionMatch || !rootMatch || !modelMatch || !dimMatch) {
165
+ // v2.17.0 quantization mode is part of the contamination guard.
166
+ // Existing pre-v2.17 dbs have no `quantization` meta key; treat as
167
+ // "f32" (the only mode v2.16- supported) for backward compatibility.
168
+ const existingQuant = meta.quantization ?? "f32";
169
+ const quantMatch = existingQuant === this.quantization;
170
+ if (!versionMatch || !rootMatch || !modelMatch || !dimMatch || !quantMatch) {
102
171
  const reason = [];
103
172
  if (!versionMatch)
104
173
  reason.push(`schema_version ${meta.schema_version} → ${SCHEMA_VERSION}`);
@@ -108,6 +177,8 @@ export class EmbedDb {
108
177
  reason.push(`model ${meta.model_alias} → ${this.modelAlias}`);
109
178
  if (!dimMatch)
110
179
  reason.push(`dim ${meta.dim} → ${this.dim}`);
180
+ if (!quantMatch)
181
+ reason.push(`quantization ${existingQuant} → ${this.quantization}`);
111
182
  process.stderr.write(`enquire: rebuilding embed index (${reason.join("; ")})\n`);
112
183
  db.exec("DROP TABLE IF EXISTS embeddings; DROP TABLE IF EXISTS source_state;");
113
184
  }
@@ -136,7 +207,8 @@ export class EmbedDb {
136
207
  schema_version: String(SCHEMA_VERSION),
137
208
  vault_root: this.vaultRoot,
138
209
  model_alias: this.modelAlias,
139
- dim: String(this.dim)
210
+ dim: String(this.dim),
211
+ quantization: this.quantization
140
212
  });
141
213
  }
142
214
  readMeta() {
@@ -175,7 +247,13 @@ export class EmbedDb {
175
247
  if (c.vector.length !== dim) {
176
248
  throw new Error(`vector dim mismatch for ${relPath} chunk ${c.chunkIndex}: got ${c.vector.length}, expected ${dim}`);
177
249
  }
178
- insert.run(relPath, c.chunkIndex, c.lineStart, c.lineEnd, c.textPreview, Buffer.from(c.vector.buffer, c.vector.byteOffset, c.vector.byteLength), kind);
250
+ // v2.17.0 encode per the configured quantization mode.
251
+ // f32: zero-copy slice over the source buffer (matches v2.16- behavior).
252
+ // int8: per-vector quantize + 8-byte (vMin, scale) tuple.
253
+ const blob = this.quantization === "int8"
254
+ ? encodeInt8Vector(c.vector)
255
+ : Buffer.from(c.vector.buffer, c.vector.byteOffset, c.vector.byteLength);
256
+ insert.run(relPath, c.chunkIndex, c.lineStart, c.lineEnd, c.textPreview, blob, kind);
179
257
  }
180
258
  db.prepare(`INSERT OR REPLACE INTO source_state (rel_path, mtime_ms, n_chunks, kind, indexed_at)
181
259
  VALUES (?, ?, ?, ?, datetime('now'))`).run(relPath, mtimeMs, rows.length, kind);
@@ -221,7 +299,7 @@ export class EmbedDb {
221
299
  FROM embeddings WHERE substr(rel_path, 1, ?) = ?`
222
300
  : `SELECT rel_path, chunk_index, line_start, line_end, text_preview, vector, kind FROM embeddings`)
223
301
  .all(...(folderPrefix ? [folderPrefix.length, folderPrefix] : []));
224
- const expectedBytes = this.dim * 4; // Float32 = 4 bytes
302
+ const expectedBytes = this.encodedBytes;
225
303
  const heap = [];
226
304
  for (const r of rows) {
227
305
  // v2.0.0-beta.1 P2 fix: assert byteLength before wrapping. A truncated
@@ -229,10 +307,13 @@ export class EmbedDb {
229
307
  // produce a Float32Array that reads past the source buffer's end and
230
308
  // emits garbage scores. Skip + warn rather than poison results.
231
309
  if (r.vector.byteLength !== expectedBytes) {
232
- process.stderr.write(`enquire: skipping ${r.rel_path}#${r.chunk_index} — vector has ${r.vector.byteLength}B, expected ${expectedBytes}B (dim=${this.dim}). Run \`enquire-mcp clear-embeddings\` and rebuild.\n`);
310
+ process.stderr.write(`enquire: skipping ${r.rel_path}#${r.chunk_index} — vector has ${r.vector.byteLength}B, expected ${expectedBytes}B (dim=${this.dim}, mode=${this.quantization}). Run \`enquire-mcp clear-embeddings\` and rebuild.\n`);
233
311
  continue;
234
312
  }
235
- const vec = new Float32Array(r.vector.buffer, r.vector.byteOffset, this.dim);
313
+ // v2.17.0 decode per the configured quantization mode.
314
+ const vec = this.quantization === "int8"
315
+ ? decodeInt8Vector(r.vector, this.dim)
316
+ : new Float32Array(r.vector.buffer, r.vector.byteOffset, this.dim);
236
317
  let score = 0;
237
318
  for (let i = 0; i < this.dim; i++) {
238
319
  score += (queryVec[i] ?? 0) * (vec[i] ?? 0);
@@ -258,6 +339,28 @@ export class EmbedDb {
258
339
  const row = db.prepare("SELECT COUNT(*) AS n FROM embeddings").get();
259
340
  return row?.n ?? 0;
260
341
  }
342
+ /**
343
+ * v2.16.0 — compute a tractable signature of the embedding index for
344
+ * HNSW staleness detection. Format: `dim=<n>;rows=<n>;maxId=<n>;model=<alias>`.
345
+ *
346
+ * Why this composite (vs full content hash)?
347
+ * • Full hash would require reading every BLOB on every serve start —
348
+ * wastes the I/O savings the persisted HNSW is supposed to give us.
349
+ * • Rowcount + max-id catches every common change pattern: insert
350
+ * (max-id moves up), delete (rowcount drops), update (max-id moves
351
+ * up because we DELETE+INSERT). Edge case: updating in-place
352
+ * without changing max-id (rare in our codebase — upsertNote always
353
+ * deletes+reinserts so max-id always advances).
354
+ * • dim + model alias guard against a model swap that re-embeds with
355
+ * a different vector space.
356
+ */
357
+ computeSignature() {
358
+ const db = this.requireDb();
359
+ const row = db.prepare("SELECT COUNT(*) AS n, MAX(id) AS maxId FROM embeddings").get();
360
+ const rows = row?.n ?? 0;
361
+ const maxId = row?.maxId ?? 0;
362
+ return `dim=${this.dim};rows=${rows};maxId=${maxId};model=${this.modelAlias}`;
363
+ }
261
364
  /**
262
365
  * v2.13.0 — return every (vector, row) pair for HNSW build. Caller
263
366
  * is responsible for assigning sequential integer labels (we use
@@ -274,21 +377,27 @@ export class EmbedDb {
274
377
  const rows = db
275
378
  .prepare("SELECT id, rel_path, chunk_index, line_start, line_end, text_preview, vector, kind FROM embeddings")
276
379
  .all();
277
- const expectedBytes = this.dim * 4;
380
+ const expectedBytes = this.encodedBytes;
278
381
  const out = [];
279
382
  for (const r of rows) {
280
383
  // Match the corruption guard from search() — skip rows with
281
384
  // mis-sized vectors so a partial DB doesn't poison the HNSW build.
282
385
  if (r.vector.byteLength !== expectedBytes) {
283
- process.stderr.write(`enquire: skipping ${r.rel_path}#${r.chunk_index} during getAllVectors — vector has ${r.vector.byteLength}B, expected ${expectedBytes}B (dim=${this.dim}). Run \`enquire-mcp clear-embeddings\` and rebuild.\n`);
386
+ process.stderr.write(`enquire: skipping ${r.rel_path}#${r.chunk_index} during getAllVectors — vector has ${r.vector.byteLength}B, expected ${expectedBytes}B (dim=${this.dim}, mode=${this.quantization}). Run \`enquire-mcp clear-embeddings\` and rebuild.\n`);
284
387
  continue;
285
388
  }
286
- // Copy (don't share the underlying buffer). HNSW takes ownership of
287
- // the Float32Array slice for the lifetime of the index; sharing
288
- // the SQLite row buffer would risk use-after-free if the row is
289
- // GC'd or the cursor advances.
290
- const vec = new Float32Array(this.dim);
291
- vec.set(new Float32Array(r.vector.buffer, r.vector.byteOffset, this.dim));
389
+ // v2.17.0 decode + always copy. HNSW takes ownership of the
390
+ // Float32Array slice for the lifetime of the index; sharing the
391
+ // SQLite row buffer would risk use-after-free if the row is GC'd
392
+ // or the cursor advances. For int8, decode produces a fresh
393
+ // Float32Array already. For f32, copy from the SQLite buffer.
394
+ const vec = this.quantization === "int8"
395
+ ? decodeInt8Vector(r.vector, this.dim)
396
+ : (() => {
397
+ const v = new Float32Array(this.dim);
398
+ v.set(new Float32Array(r.vector.buffer, r.vector.byteOffset, this.dim));
399
+ return v;
400
+ })();
292
401
  out.push({
293
402
  label: r.id,
294
403
  vector: vec,
@@ -1 +1 @@
1
- {"version":3,"file":"embed-db.js","sourceRoot":"","sources":["../src/embed-db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"embed-db.js","sourceRoot":"","sources":["../src/embed-db.ts"],"names":[],"mappings":"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"}