@pattern-js/mod-vectors 0.4.0-main.c8eb671

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.
Files changed (45) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +21 -0
  3. package/dist/admin.d.ts +20 -0
  4. package/dist/admin.d.ts.map +1 -0
  5. package/dist/admin.js +249 -0
  6. package/dist/admin.js.map +1 -0
  7. package/dist/chunk.d.ts +28 -0
  8. package/dist/chunk.d.ts.map +1 -0
  9. package/dist/chunk.js +74 -0
  10. package/dist/chunk.js.map +1 -0
  11. package/dist/engine-local.d.ts +62 -0
  12. package/dist/engine-local.d.ts.map +1 -0
  13. package/dist/engine-local.js +418 -0
  14. package/dist/engine-local.js.map +1 -0
  15. package/dist/index.d.ts +9 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +9 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/mod.d.ts +21 -0
  20. package/dist/mod.d.ts.map +1 -0
  21. package/dist/mod.js +49 -0
  22. package/dist/mod.js.map +1 -0
  23. package/dist/ops.d.ts +12 -0
  24. package/dist/ops.d.ts.map +1 -0
  25. package/dist/ops.js +138 -0
  26. package/dist/ops.js.map +1 -0
  27. package/dist/service.d.ts +72 -0
  28. package/dist/service.d.ts.map +1 -0
  29. package/dist/service.js +166 -0
  30. package/dist/service.js.map +1 -0
  31. package/dist/types.d.ts +104 -0
  32. package/dist/types.d.ts.map +1 -0
  33. package/dist/types.js +33 -0
  34. package/dist/types.js.map +1 -0
  35. package/docs/index.md +94 -0
  36. package/docs/ops/vectors.chunk.md +8 -0
  37. package/docs/ops/vectors.collection.ensure.md +7 -0
  38. package/docs/ops/vectors.collections.ingest.md +10 -0
  39. package/docs/ops/vectors.collections.list.md +3 -0
  40. package/docs/ops/vectors.collections.search.md +7 -0
  41. package/docs/ops/vectors.delete.md +5 -0
  42. package/docs/ops/vectors.index.md +7 -0
  43. package/docs/ops/vectors.query.md +13 -0
  44. package/docs/ops/vectors.upsert.md +8 -0
  45. package/package.json +53 -0
@@ -0,0 +1,418 @@
1
+ /**
2
+ * @pattern-js/mod-vectors — the default "local" engine.
3
+ *
4
+ * node:sqlite-backed (WAL + busy_timeout, the mod-store recipe): durable AND
5
+ * offload-safe — a worker's own service instance opens the SAME file, so
6
+ * offloaded workflows see every vector the host wrote. Vectors are Float32
7
+ * BLOBs, L2-normalized at write time so cosine similarity is a dot product;
8
+ * search is an honest brute-force scan with a top-k heap (fine to ~100k
9
+ * vectors — past that, register a real driver: the SPI carries filter+mode).
10
+ *
11
+ * Filterables prune BEFORE the scan through the indexed `vec_meta` side
12
+ * table. Keyword ranking uses FTS5 when this sqlite build has it (probed at
13
+ * open) and a zero-dep token-overlap scorer otherwise; hybrid fuses the two
14
+ * rankings with reciprocal-rank fusion (RRF, k=60) — no score calibration.
15
+ */
16
+ import { mkdirSync } from "node:fs";
17
+ import { dirname } from "node:path";
18
+ const MIGRATIONS = [
19
+ // v1 — collections, rows, the filterable side table.
20
+ `
21
+ CREATE TABLE IF NOT EXISTS vec_collections (
22
+ name TEXT PRIMARY KEY,
23
+ alias TEXT NOT NULL,
24
+ dims INTEGER,
25
+ metric TEXT NOT NULL DEFAULT 'cosine',
26
+ filterables TEXT NOT NULL DEFAULT '[]'
27
+ );
28
+
29
+ CREATE TABLE IF NOT EXISTS vec_rows (
30
+ collection TEXT NOT NULL,
31
+ id TEXT NOT NULL,
32
+ vector BLOB,
33
+ text TEXT,
34
+ meta TEXT,
35
+ hash TEXT NOT NULL,
36
+ updated_at INTEGER NOT NULL,
37
+ PRIMARY KEY (collection, id)
38
+ );
39
+
40
+ CREATE TABLE IF NOT EXISTS vec_meta (
41
+ collection TEXT NOT NULL,
42
+ id TEXT NOT NULL,
43
+ field TEXT NOT NULL,
44
+ value TEXT NOT NULL,
45
+ PRIMARY KEY (collection, id, field, value)
46
+ );
47
+ CREATE INDEX IF NOT EXISTS idx_vec_meta_lookup ON vec_meta (collection, field, value);
48
+ `,
49
+ ];
50
+ /** L2-normalize into a fresh Float32Array (cosine ≡ dot afterwards). */
51
+ export function normalize(vector) {
52
+ const out = new Float32Array(vector.length);
53
+ let sum = 0;
54
+ for (let i = 0; i < vector.length; i++)
55
+ sum += Number(vector[i]) * Number(vector[i]);
56
+ const norm = Math.sqrt(sum) || 1;
57
+ for (let i = 0; i < vector.length; i++)
58
+ out[i] = Number(vector[i]) / norm;
59
+ return out;
60
+ }
61
+ const tokenize = (s) => s
62
+ .toLowerCase()
63
+ .split(/[^\p{L}\p{N}.]+/u)
64
+ .filter((t) => t.length > 1);
65
+ /** Escape a free-text query into a safe FTS5 OR-query ("tok" OR "tok"…). */
66
+ function ftsQuery(text) {
67
+ const tokens = tokenize(text).map((t) => `"${t.replaceAll('"', '""')}"`);
68
+ return tokens.join(" OR ");
69
+ }
70
+ /** Reciprocal-rank fusion of one or more rankings (RRF, k=60). */
71
+ export function rrfFuse(rankings, k = 60) {
72
+ const scores = new Map();
73
+ for (const ranking of rankings) {
74
+ ranking.forEach((id, rank) => {
75
+ scores.set(id, (scores.get(id) ?? 0) + 1 / (k + rank + 1));
76
+ });
77
+ }
78
+ return scores;
79
+ }
80
+ export class LocalVectorsEngine {
81
+ id = "local";
82
+ db;
83
+ /** Whether this sqlite build compiled FTS5 (probed at open). */
84
+ hasFts;
85
+ constructor(opts) {
86
+ const DatabaseSync = process.getBuiltinModule("node:sqlite")?.DatabaseSync;
87
+ if (!DatabaseSync) {
88
+ throw new Error("node:sqlite is not available in this Node build — @pattern-js/mod-vectors needs Node ≥22.5 (≥24 recommended).");
89
+ }
90
+ if (opts.path !== ":memory:")
91
+ mkdirSync(dirname(opts.path), { recursive: true });
92
+ this.db = new DatabaseSync(opts.path);
93
+ this.db.exec("PRAGMA journal_mode = WAL");
94
+ this.db.exec("PRAGMA busy_timeout = 5000");
95
+ this.runMigrations();
96
+ let fts = false;
97
+ if (!opts.disableFts) {
98
+ try {
99
+ this.db.exec("CREATE VIRTUAL TABLE IF NOT EXISTS vec_fts USING fts5(collection UNINDEXED, id UNINDEXED, text)");
100
+ fts = true;
101
+ }
102
+ catch {
103
+ fts = false; // this sqlite build has no FTS5 — the token-overlap scorer takes over
104
+ }
105
+ }
106
+ this.hasFts = fts;
107
+ }
108
+ runMigrations() {
109
+ this.db.exec(`CREATE TABLE IF NOT EXISTS _vectors_migrations (version INTEGER PRIMARY KEY, applied_at INTEGER NOT NULL)`);
110
+ const row = this.db.prepare("SELECT MAX(version) AS v FROM _vectors_migrations").get();
111
+ const current = row?.v ?? 0;
112
+ for (let i = current; i < MIGRATIONS.length; i++) {
113
+ this.db.exec("BEGIN");
114
+ try {
115
+ this.db.exec(MIGRATIONS[i]);
116
+ this.db.prepare("INSERT INTO _vectors_migrations (version, applied_at) VALUES (?, ?)").run(i + 1, Date.now());
117
+ this.db.exec("COMMIT");
118
+ }
119
+ catch (err) {
120
+ this.db.exec("ROLLBACK");
121
+ throw err;
122
+ }
123
+ }
124
+ }
125
+ /* ── collections ─────────────────────────────────────────────────────── */
126
+ async ensureCollection(spec) {
127
+ const existing = await this.getCollection(spec.name);
128
+ if (!existing) {
129
+ this.db
130
+ .prepare("INSERT INTO vec_collections (name, alias, dims, metric, filterables) VALUES (?,?,?,?,?)")
131
+ .run(spec.name, spec.alias, spec.dims ?? null, spec.metric, JSON.stringify(spec.filterables));
132
+ return;
133
+ }
134
+ if (existing.dims != null && spec.dims != null && existing.dims !== spec.dims) {
135
+ throw new Error(`vectors: collection "${spec.name}" is locked to ${existing.dims} dims (alias "${existing.alias}") — ` +
136
+ `got dims ${spec.dims}. Re-embedding into a fresh collection is the fix; dims never silently change.`);
137
+ }
138
+ // Idempotent re-declare: alias/filterables may evolve, dims only ever locks.
139
+ this.db
140
+ .prepare("UPDATE vec_collections SET alias=?, filterables=?, dims=COALESCE(dims, ?) WHERE name=?")
141
+ .run(spec.alias, JSON.stringify(spec.filterables), spec.dims ?? null, spec.name);
142
+ }
143
+ async getCollection(name) {
144
+ const r = this.db.prepare("SELECT * FROM vec_collections WHERE name = ?").get(name);
145
+ if (!r)
146
+ return null;
147
+ return {
148
+ name: String(r.name),
149
+ alias: String(r.alias),
150
+ dims: r.dims == null ? undefined : Number(r.dims),
151
+ metric: "cosine",
152
+ filterables: JSON.parse(String(r.filterables ?? "[]")),
153
+ };
154
+ }
155
+ async listCollections() {
156
+ const rows = this.db.prepare("SELECT * FROM vec_collections ORDER BY name").all();
157
+ return rows.map((r) => {
158
+ const count = this.db.prepare("SELECT COUNT(*) AS n FROM vec_rows WHERE collection = ?").get(String(r.name));
159
+ return {
160
+ name: String(r.name),
161
+ alias: String(r.alias),
162
+ dims: r.dims == null ? undefined : Number(r.dims),
163
+ metric: "cosine",
164
+ filterables: JSON.parse(String(r.filterables ?? "[]")),
165
+ rows: Number(count.n),
166
+ };
167
+ });
168
+ }
169
+ /** Lock dims on the collection's first vector write; mismatch names the alias. */
170
+ lockDims(collection, dims) {
171
+ const spec = this.db.prepare("SELECT alias, dims FROM vec_collections WHERE name = ?").get(collection);
172
+ if (!spec)
173
+ throw new Error(`vectors: collection "${collection}" does not exist — run vectors.collection.ensure first`);
174
+ if (spec.dims == null) {
175
+ this.db.prepare("UPDATE vec_collections SET dims = ? WHERE name = ?").run(dims, collection);
176
+ return;
177
+ }
178
+ if (Number(spec.dims) !== dims) {
179
+ throw new Error(`vectors: collection "${collection}" expects ${spec.dims}-dim vectors (embedding alias "${spec.alias}") — ` +
180
+ `got ${dims}. The alias was probably re-pointed at a different model; re-index into a fresh collection.`);
181
+ }
182
+ }
183
+ /* ── writes ──────────────────────────────────────────────────────────── */
184
+ async hashes(collection, ids) {
185
+ const out = new Map();
186
+ for (const batch of chunks(ids, 400)) {
187
+ const rows = this.db
188
+ .prepare(`SELECT id, hash FROM vec_rows WHERE collection = ? AND id IN (${batch.map(() => "?").join(",")})`)
189
+ .all(collection, ...batch);
190
+ for (const r of rows)
191
+ out.set(String(r.id), String(r.hash));
192
+ }
193
+ return out;
194
+ }
195
+ async upsert(collection, rows) {
196
+ if (!rows.length)
197
+ return;
198
+ for (const row of rows)
199
+ if (row.vector)
200
+ this.lockDims(collection, row.vector.length);
201
+ const now = Date.now();
202
+ const upsertRow = this.db.prepare(`INSERT INTO vec_rows (collection, id, vector, text, meta, hash, updated_at) VALUES (?,?,?,?,?,?,?)
203
+ ON CONFLICT(collection, id) DO UPDATE SET vector=excluded.vector, text=excluded.text, meta=excluded.meta, hash=excluded.hash, updated_at=excluded.updated_at`);
204
+ const clearMeta = this.db.prepare("DELETE FROM vec_meta WHERE collection = ? AND id = ?");
205
+ const addMeta = this.db.prepare("INSERT OR IGNORE INTO vec_meta (collection, id, field, value) VALUES (?,?,?,?)");
206
+ const clearFts = this.hasFts ? this.db.prepare("DELETE FROM vec_fts WHERE collection = ? AND id = ?") : null;
207
+ const addFts = this.hasFts ? this.db.prepare("INSERT INTO vec_fts (collection, id, text) VALUES (?,?,?)") : null;
208
+ this.db.exec("BEGIN");
209
+ try {
210
+ for (const row of rows) {
211
+ const blob = row.vector ? Buffer.from(row.vector.buffer, row.vector.byteOffset, row.vector.byteLength) : null;
212
+ upsertRow.run(collection, row.id, blob, row.text, row.meta ? JSON.stringify(row.meta) : null, row.hash, now);
213
+ clearMeta.run(collection, row.id);
214
+ for (const [field, values] of Object.entries(row.filterValues)) {
215
+ for (const v of values)
216
+ addMeta.run(collection, row.id, field, String(v));
217
+ }
218
+ if (clearFts && addFts) {
219
+ clearFts.run(collection, row.id);
220
+ if (row.text)
221
+ addFts.run(collection, row.id, row.text);
222
+ }
223
+ }
224
+ this.db.exec("COMMIT");
225
+ }
226
+ catch (err) {
227
+ this.db.exec("ROLLBACK");
228
+ throw err;
229
+ }
230
+ }
231
+ async delete(collection, ids) {
232
+ let n = 0;
233
+ this.db.exec("BEGIN");
234
+ try {
235
+ for (const batch of chunks(ids, 400)) {
236
+ const marks = batch.map(() => "?").join(",");
237
+ n += Number(this.db.prepare(`DELETE FROM vec_rows WHERE collection = ? AND id IN (${marks})`).run(collection, ...batch).changes);
238
+ this.db.prepare(`DELETE FROM vec_meta WHERE collection = ? AND id IN (${marks})`).run(collection, ...batch);
239
+ if (this.hasFts)
240
+ this.db.prepare(`DELETE FROM vec_fts WHERE collection = ? AND id IN (${marks})`).run(collection, ...batch);
241
+ }
242
+ this.db.exec("COMMIT");
243
+ }
244
+ catch (err) {
245
+ this.db.exec("ROLLBACK");
246
+ throw err;
247
+ }
248
+ return n;
249
+ }
250
+ /* ── queries ─────────────────────────────────────────────────────────── */
251
+ async query(collection, q) {
252
+ // (1) Filter first: the indexed side table prunes to a candidate id set
253
+ // BEFORE any scoring touches a vector.
254
+ const candidates = q.filter && Object.keys(q.filter).length ? this.filterIds(collection, q.filter) : null;
255
+ if (candidates && candidates.size === 0)
256
+ return [];
257
+ const wide = Math.max(q.k * 4, 20); // fusion quality: rank deeper than k on each side
258
+ if (q.mode === "vector")
259
+ return this.vectorRank(collection, q.vector, q.k, candidates);
260
+ if (q.mode === "keyword")
261
+ return this.keywordRank(collection, q.text ?? "", q.k, candidates);
262
+ const [byVector, byKeyword] = [
263
+ q.vector ? this.vectorRank(collection, q.vector, wide, candidates) : [],
264
+ this.keywordRank(collection, q.text ?? "", wide, candidates),
265
+ ];
266
+ const fused = rrfFuse([byVector.map((m) => m.id), byKeyword.map((m) => m.id)]);
267
+ const byId = new Map([...byVector, ...byKeyword].map((m) => [m.id, m]));
268
+ return [...fused.entries()]
269
+ .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0])) // deterministic tie-break
270
+ .slice(0, q.k)
271
+ .map(([id, score]) => ({ ...byId.get(id), score }));
272
+ }
273
+ async list(collection, q) {
274
+ const limit = Math.max(1, Math.min(q.limit ?? 100, 1000));
275
+ const offset = Math.max(0, q.offset ?? 0);
276
+ const parse = (r) => ({
277
+ id: String(r.id),
278
+ text: r.text ?? null,
279
+ meta: r.meta == null ? null : JSON.parse(String(r.meta)),
280
+ updatedAt: Number(r.updated_at),
281
+ });
282
+ const candidates = q.filter && Object.keys(q.filter).length ? this.filterIds(collection, q.filter) : null;
283
+ if (candidates === null) {
284
+ const rows = this.db
285
+ .prepare("SELECT id, text, meta, updated_at FROM vec_rows WHERE collection = ? ORDER BY updated_at DESC, id LIMIT ? OFFSET ?")
286
+ .all(collection, limit, offset);
287
+ return rows.map(parse);
288
+ }
289
+ if (candidates.size === 0)
290
+ return [];
291
+ const out = [];
292
+ for (const batch of chunks([...candidates], 400)) {
293
+ const rows = this.db
294
+ .prepare(`SELECT id, text, meta, updated_at FROM vec_rows WHERE collection = ? AND id IN (${batch.map(() => "?").join(",")})`)
295
+ .all(collection, ...batch);
296
+ out.push(...rows.map(parse));
297
+ }
298
+ return out.sort((a, b) => b.updatedAt - a.updatedAt || a.id.localeCompare(b.id)).slice(offset, offset + limit);
299
+ }
300
+ /** AND of equality/any-of via the side table: one indexed lookup per field, intersected. */
301
+ filterIds(collection, filter) {
302
+ let acc = null;
303
+ for (const [field, raw] of Object.entries(filter)) {
304
+ const values = Array.isArray(raw) ? raw : [raw];
305
+ const marks = values.map(() => "?").join(",");
306
+ const rows = this.db
307
+ .prepare(`SELECT DISTINCT id FROM vec_meta WHERE collection = ? AND field = ? AND value IN (${marks})`)
308
+ .all(collection, field, ...values.map(String));
309
+ const ids = new Set(rows.map((r) => String(r.id)));
310
+ if (acc === null) {
311
+ acc = ids;
312
+ }
313
+ else {
314
+ const prev = acc;
315
+ acc = new Set([...prev].filter((id) => ids.has(id)));
316
+ }
317
+ if (acc.size === 0)
318
+ return acc;
319
+ }
320
+ return acc ?? new Set();
321
+ }
322
+ /** Brute-force cosine over the (possibly pruned) rows with a bounded top-k. */
323
+ vectorRank(collection, vector, k, candidates) {
324
+ const rows = this.loadRows(collection, candidates, /* needVector */ true);
325
+ const top = [];
326
+ for (const row of rows) {
327
+ const v = row.vector;
328
+ if (v.length !== vector.length)
329
+ continue; // legacy rows from a re-pointed alias never match silently
330
+ let dot = 0;
331
+ for (let i = 0; i < v.length; i++)
332
+ dot += v[i] * vector[i];
333
+ if (top.length < k) {
334
+ top.push({ score: dot, row });
335
+ if (top.length === k)
336
+ top.sort((a, b) => a.score - b.score);
337
+ continue;
338
+ }
339
+ if (dot > top[0].score) {
340
+ top[0] = { score: dot, row };
341
+ top.sort((a, b) => a.score - b.score);
342
+ }
343
+ }
344
+ return top
345
+ .sort((a, b) => b.score - a.score || a.row.id.localeCompare(b.row.id))
346
+ .map(({ score, row }) => ({ id: row.id, score, text: row.text, meta: row.meta }));
347
+ }
348
+ keywordRank(collection, text, k, candidates) {
349
+ if (!text.trim())
350
+ return [];
351
+ if (this.hasFts) {
352
+ const match = ftsQuery(text);
353
+ if (!match)
354
+ return [];
355
+ const rows = this.db
356
+ .prepare(`SELECT id, rank FROM vec_fts WHERE vec_fts MATCH ? AND collection = ? ORDER BY rank LIMIT ?`)
357
+ .all(match, collection, candidates ? k * 10 : k);
358
+ const picked = rows.map((r) => String(r.id)).filter((id) => !candidates || candidates.has(id)).slice(0, k);
359
+ return this.hydrate(collection, picked).map((m, i) => ({ ...m, score: 1 / (i + 1) }));
360
+ }
361
+ // Fallback scorer: token overlap over the text column (honest, zero-dep).
362
+ const queryTokens = tokenize(text);
363
+ const rows = this.loadRows(collection, candidates, /* needVector */ false);
364
+ const scored = rows
365
+ .map((row) => {
366
+ const rowTokens = new Set(tokenize(row.text ?? ""));
367
+ let score = 0;
368
+ for (const t of queryTokens)
369
+ if (rowTokens.has(t))
370
+ score += 1;
371
+ return { row, score };
372
+ })
373
+ .filter((s) => s.score > 0)
374
+ .sort((a, b) => b.score - a.score || a.row.id.localeCompare(b.row.id))
375
+ .slice(0, k);
376
+ return scored.map(({ row, score }) => ({ id: row.id, score, text: row.text, meta: row.meta }));
377
+ }
378
+ loadRows(collection, candidates, needVector) {
379
+ const parse = (r) => ({
380
+ id: String(r.id),
381
+ vector: r.vector ? new Float32Array(r.vector.buffer, r.vector.byteOffset, r.vector.byteLength / 4) : null,
382
+ text: r.text ?? null,
383
+ meta: r.meta == null ? null : JSON.parse(String(r.meta)),
384
+ });
385
+ const vectorClause = needVector ? " AND vector IS NOT NULL" : "";
386
+ if (!candidates) {
387
+ return this.db.prepare(`SELECT * FROM vec_rows WHERE collection = ?${vectorClause}`).all(collection).map(parse);
388
+ }
389
+ const out = [];
390
+ for (const batch of chunks([...candidates], 400)) {
391
+ const rows = this.db
392
+ .prepare(`SELECT * FROM vec_rows WHERE collection = ? AND id IN (${batch.map(() => "?").join(",")})${vectorClause}`)
393
+ .all(collection, ...batch);
394
+ out.push(...rows.map(parse));
395
+ }
396
+ return out;
397
+ }
398
+ hydrate(collection, ids) {
399
+ if (!ids.length)
400
+ return [];
401
+ const rows = this.loadRows(collection, new Set(ids), false);
402
+ const byId = new Map(rows.map((r) => [r.id, r]));
403
+ return ids
404
+ .map((id) => byId.get(id))
405
+ .filter((r) => Boolean(r))
406
+ .map((r) => ({ id: r.id, score: 0, text: r.text, meta: r.meta }));
407
+ }
408
+ async close() {
409
+ this.db.close();
410
+ }
411
+ }
412
+ function chunks(items, size) {
413
+ const out = [];
414
+ for (let i = 0; i < items.length; i += size)
415
+ out.push(items.slice(i, i + size));
416
+ return out;
417
+ }
418
+ //# sourceMappingURL=engine-local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-local.js","sourceRoot":"","sources":["../src/engine-local.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /** @pattern-js/mod-vectors — public surface (vector search for Pattern). */
2
+ export { vectorsMod, type VectorsOptions } from "./mod.js";
3
+ export { default } from "./mod.js";
4
+ export { DefaultVectorsService, VECTORS_SERVICE, type VectorsService } from "./service.js";
5
+ export { LocalVectorsEngine, normalize, rrfFuse, type LocalEngineOptions } from "./engine-local.js";
6
+ export { chunkText, chunkDoc, type Chunk, type ChunkOptions } from "./chunk.js";
7
+ export { vectorsOps } from "./ops.js";
8
+ export { collectionSpecSchema, filterSchema, queryModeSchema, vectorItemSchema, type CollectionInfo, type CollectionSpec, type EngineQuery, type EngineRow, type Filter, type FilterValue, type Match, type QueryMode, type VectorItem, type VectorsEngine, } from "./types.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAE5E,OAAO,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC3F,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACpG,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,KAAK,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,KAAK,EACV,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,aAAa,GACnB,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ /** @pattern-js/mod-vectors — public surface (vector search for Pattern). */
2
+ export { vectorsMod } from "./mod.js";
3
+ export { default } from "./mod.js";
4
+ export { DefaultVectorsService, VECTORS_SERVICE } from "./service.js";
5
+ export { LocalVectorsEngine, normalize, rrfFuse } from "./engine-local.js";
6
+ export { chunkText, chunkDoc } from "./chunk.js";
7
+ export { vectorsOps } from "./ops.js";
8
+ export { collectionSpecSchema, filterSchema, queryModeSchema, vectorItemSchema, } from "./types.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAE5E,OAAO,EAAE,UAAU,EAAuB,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAuB,MAAM,cAAc,CAAC;AAC3F,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,OAAO,EAA2B,MAAM,mBAAmB,CAAC;AACpG,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAiC,MAAM,YAAY,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,eAAe,EACf,gBAAgB,GAWjB,MAAM,YAAY,CAAC"}
package/dist/mod.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @pattern-js/mod-vectors — the mod.
3
+ *
4
+ * `setup` opens the local sqlite engine (`.pattern-data/vectors.db` — the
5
+ * gitignored data home, never `.pattern/`) and registers the VectorsService
6
+ * under "vectorsService". DB-backed on purpose: offloaded workflows run on
7
+ * workers with their OWN service instances, and a worker opening the same
8
+ * WAL file sees every vector the host wrote — an in-memory index would be
9
+ * invisible there. Driver mods (sqlite-vec, pgvector) call
10
+ * `registerEngine(spec)` in their `ready`, mod-email-style.
11
+ */
12
+ import { type PatternMod } from "@pattern-js/core";
13
+ export interface VectorsOptions {
14
+ /** Database file (default "./.pattern-data/vectors.db"; ":memory:" for tests). */
15
+ path?: string;
16
+ }
17
+ export declare function vectorsMod(options?: VectorsOptions): PatternMod;
18
+ /** A ready-to-use vectors mod with defaults (for `loadMods`/`engine.use`). */
19
+ declare const _default: PatternMod;
20
+ export default _default;
21
+ //# sourceMappingURL=mod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,EAA0B,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAM3E,MAAM,WAAW,cAAc;IAC7B,kFAAkF;IAClF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAYD,wBAAgB,UAAU,CAAC,OAAO,GAAE,cAAmB,GAAG,UAAU,CAcnE;AAED,8EAA8E;;AAC9E,wBAA4B"}
package/dist/mod.js ADDED
@@ -0,0 +1,49 @@
1
+ /**
2
+ * @pattern-js/mod-vectors — the mod.
3
+ *
4
+ * `setup` opens the local sqlite engine (`.pattern-data/vectors.db` — the
5
+ * gitignored data home, never `.pattern/`) and registers the VectorsService
6
+ * under "vectorsService". DB-backed on purpose: offloaded workflows run on
7
+ * workers with their OWN service instances, and a worker opening the same
8
+ * WAL file sees every vector the host wrote — an in-memory index would be
9
+ * invisible there. Driver mods (sqlite-vec, pgvector) call
10
+ * `registerEngine(spec)` in their `ready`, mod-email-style.
11
+ */
12
+ import { existsSync } from "node:fs";
13
+ import { resolve } from "node:path";
14
+ import { fileURLToPath } from "node:url";
15
+ import { localFs, provideFilesystem } from "@pattern-js/runtime-node";
16
+ import { defineMod } from "@pattern-js/core";
17
+ import { LocalVectorsEngine } from "./engine-local.js";
18
+ import { DefaultVectorsService, VECTORS_SERVICE } from "./service.js";
19
+ import { vectorsOps } from "./ops.js";
20
+ import { collectionsIngestOp, collectionsListOp, collectionsSearchOp, vectorsAdminRoutes, vectorsFrontend } from "./admin.js";
21
+ /** The packaged docs/ chapter. */
22
+ function packagedDocs(engine) {
23
+ try {
24
+ const dir = fileURLToPath(new URL("../docs", import.meta.url));
25
+ if (existsSync(dir))
26
+ provideFilesystem(engine, "vectors-docs", localFs(dir));
27
+ }
28
+ catch {
29
+ /* packaged without docs — the contribution is simply skipped */
30
+ }
31
+ }
32
+ export function vectorsMod(options = {}) {
33
+ return defineMod({
34
+ name: "@pattern-js/mod-vectors",
35
+ docs: { filesystem: "vectors-docs", title: "Vectors", order: 32 },
36
+ ops: [...vectorsOps, collectionsListOp, collectionsIngestOp, collectionsSearchOp],
37
+ workflows: vectorsAdminRoutes(),
38
+ frontend: vectorsFrontend(),
39
+ setup: (engine) => {
40
+ packagedDocs(engine);
41
+ const path = options.path ?? resolve(process.cwd(), ".pattern-data/vectors.db");
42
+ const service = new DefaultVectorsService(new LocalVectorsEngine({ path }));
43
+ engine.provideService(VECTORS_SERVICE, service);
44
+ },
45
+ });
46
+ }
47
+ /** A ready-to-use vectors mod with defaults (for `loadMods`/`engine.use`). */
48
+ export default vectorsMod();
49
+ //# sourceMappingURL=mod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.js","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,SAAS,EAAgC,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAO9H,kCAAkC;AAClC,SAAS,YAAY,CAAC,MAAc;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/D,IAAI,UAAU,CAAC,GAAG,CAAC;YAAE,iBAAiB,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/E,CAAC;IAAC,MAAM,CAAC;QACP,gEAAgE;IAClE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,UAA0B,EAAE;IACrD,OAAO,SAAS,CAAC;QACf,IAAI,EAAE,yBAAyB;QAC/B,IAAI,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE;QACjE,GAAG,EAAE,CAAC,GAAG,UAAU,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,mBAAmB,CAAC;QACjF,SAAS,EAAE,kBAAkB,EAAE;QAC/B,QAAQ,EAAE,eAAe,EAAE;QAC3B,KAAK,EAAE,CAAC,MAAc,EAAE,EAAE;YACxB,YAAY,CAAC,MAAM,CAAC,CAAC;YACrB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,0BAA0B,CAAC,CAAC;YAChF,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,IAAI,kBAAkB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC5E,MAAM,CAAC,cAAc,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAClD,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,eAAe,UAAU,EAAE,CAAC"}
package/dist/ops.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @pattern-js/mod-vectors — the `vectors.*` op catalog.
3
+ *
4
+ * Pure domain ops over the VectorsService: declare a collection, chunk text,
5
+ * upsert (text is embedded through the collection's declared alias), query
6
+ * (vector / keyword / hybrid, filterable), delete — plus `vectors.index`,
7
+ * the chunk→embed→upsert convenience that makes on-canvas RAG ingestion a
8
+ * single node.
9
+ */
10
+ import { type OpDefinition } from "@pattern-js/core";
11
+ export declare const vectorsOps: OpDefinition[];
12
+ //# sourceMappingURL=ops.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ops.d.ts","sourceRoot":"","sources":["../src/ops.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAA4B,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAoJ/E,eAAO,MAAM,UAAU,EAAE,YAAY,EAAyD,CAAC"}