@getplumb/core 0.1.3 → 0.1.5

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/README.md CHANGED
@@ -8,7 +8,7 @@ The core library for [Plumb](https://getplumb.dev) — a local-first, MCP-native
8
8
 
9
9
  - **Two-layer memory:** raw conversation log (Layer 1) + extracted fact graph (Layer 2)
10
10
  - **Hybrid search:** BM25 + semantic vectors + RRF fusion + cross-encoder reranking
11
- - **Local storage:** SQLite + sqlite-vec, zero external dependencies
11
+ - **Local storage:** SQLite WASM, zero native dependencies (works on all platforms)
12
12
  - **Pluggable LLM:** bring your own OpenAI or Anthropic client for fact extraction
13
13
 
14
14
  ## Install
@@ -22,15 +22,16 @@ npm install @getplumb/core
22
22
  ```ts
23
23
  import { LocalStore } from '@getplumb/core';
24
24
 
25
- const store = new LocalStore({ dbPath: '~/.plumb/memory.db' });
26
- await store.init();
25
+ // Create store (async factory required for WASM initialization)
26
+ const store = await LocalStore.create({ dbPath: '~/.plumb/memory.db' });
27
27
 
28
28
  // Ingest a conversation turn
29
29
  await store.ingest({
30
30
  sessionId: 'my-session',
31
- userId: 'user-123',
32
31
  userMessage: 'I prefer TypeScript over Python',
33
- assistantMessage: 'Noted! TypeScript it is.'
32
+ agentResponse: 'Noted! TypeScript it is.',
33
+ timestamp: new Date(),
34
+ source: 'openclaw'
34
35
  });
35
36
 
36
37
  // Retrieve relevant memory
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Pipeline:
5
5
  * 1. BM25 keyword search over concatenated fact text (subject+predicate+object+context)
6
- * 2. KNN vector search via sqlite-vec vec_facts virtual table
6
+ * 2. KNN vector search via JS cosine similarity (replaces sqlite-vec)
7
7
  * 3. Reciprocal Rank Fusion (RRF, k=60) merges both ranked lists
8
8
  * 4. Recency decay: score *= e^(-lambda × age_in_days), using per-fact decay_rate
9
9
  * 5. Cross-encoder reranker (top-20 candidates → Xenova/ms-marco-MiniLM-L-6-v2)
@@ -14,15 +14,15 @@
14
14
  * medium=0.012 (half-life ~58 days) — project context, tool choices
15
15
  * fast=0.05 (half-life ~14 days) — transient state
16
16
  */
17
- import type Database from 'better-sqlite3';
17
+ import type { WasmDb } from './wasm-db.js';
18
18
  import type { SearchResult } from './types.js';
19
19
  /**
20
20
  * Hybrid search over facts.
21
21
  *
22
- * @param db The better-sqlite3 Database instance (with sqlite-vec loaded)
22
+ * @param db The WASM SQLite Database instance
23
23
  * @param userId Scopes the search to this user's data
24
24
  * @param query Natural language query string
25
25
  * @param limit Number of results to return (default 20)
26
26
  */
27
- export declare function searchFacts(db: Database.Database, userId: string, query: string, limit?: number): Promise<readonly SearchResult[]>;
27
+ export declare function searchFacts(db: WasmDb, userId: string, query: string, limit?: number): Promise<readonly SearchResult[]>;
28
28
  //# sourceMappingURL=fact-search.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fact-search.d.ts","sourceRoot":"","sources":["../src/fact-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAG3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA6F/C;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,KAAK,SAAK,GACT,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC,CAgGlC"}
1
+ {"version":3,"file":"fact-search.d.ts","sourceRoot":"","sources":["../src/fact-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA0F/C;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,KAAK,SAAK,GACT,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC,CAoGlC"}
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Pipeline:
5
5
  * 1. BM25 keyword search over concatenated fact text (subject+predicate+object+context)
6
- * 2. KNN vector search via sqlite-vec vec_facts virtual table
6
+ * 2. KNN vector search via JS cosine similarity (replaces sqlite-vec)
7
7
  * 3. Reciprocal Rank Fusion (RRF, k=60) merges both ranked lists
8
8
  * 4. Recency decay: score *= e^(-lambda × age_in_days), using per-fact decay_rate
9
9
  * 5. Cross-encoder reranker (top-20 candidates → Xenova/ms-marco-MiniLM-L-6-v2)
@@ -16,6 +16,7 @@
16
16
  */
17
17
  import { Bm25 } from './bm25.js';
18
18
  import { embedQuery, rerankScores } from './embedder.js';
19
+ import { knnSearch, deserializeEmbedding } from './vector-search.js';
19
20
  // RRF constant (standard k=60).
20
21
  const RRF_K = 60;
21
22
  // Number of candidates passed to the cross-encoder.
@@ -74,21 +75,25 @@ function rrf(vecRanked, bm25Ranked) {
74
75
  /**
75
76
  * Hybrid search over facts.
76
77
  *
77
- * @param db The better-sqlite3 Database instance (with sqlite-vec loaded)
78
+ * @param db The WASM SQLite Database instance
78
79
  * @param userId Scopes the search to this user's data
79
80
  * @param query Natural language query string
80
81
  * @param limit Number of results to return (default 20)
81
82
  */
82
83
  export async function searchFacts(db, userId, query, limit = 20) {
83
84
  // ── 1. Fetch all non-deleted fact rows for this user ────────────────────
84
- const allRows = db
85
- .prepare(`SELECT id, user_id, subject, predicate, object, confidence,
86
- decay_rate, timestamp, source_session_id, source_session_label,
87
- context, deleted_at
88
- FROM facts
89
- WHERE user_id = ? AND deleted_at IS NULL
90
- ORDER BY timestamp DESC`)
91
- .all(userId);
85
+ const stmt = db.prepare(`SELECT id, user_id, subject, predicate, object, confidence,
86
+ decay_rate, timestamp, source_session_id, source_session_label,
87
+ context, deleted_at, vec_rowid
88
+ FROM facts
89
+ WHERE user_id = ? AND deleted_at IS NULL
90
+ ORDER BY timestamp DESC`);
91
+ stmt.bind([userId]);
92
+ const allRows = [];
93
+ while (stmt.step()) {
94
+ allRows.push(stmt.get({}));
95
+ }
96
+ stmt.finalize();
92
97
  if (allRows.length === 0)
93
98
  return [];
94
99
  const idToRow = new Map(allRows.map((r) => [r.id, r]));
@@ -99,23 +104,28 @@ export async function searchFacts(db, userId, query, limit = 20) {
99
104
  const bm25Ranked = allRows
100
105
  .map((r, i) => [r.id, bm25RawScores[i] ?? 0])
101
106
  .sort((a, b) => b[1] - a[1]);
102
- // ── 3. Vector search via sqlite-vec ─────────────────────────────────────
107
+ // ── 3. Vector search via JS cosine similarity ───────────────────────────
103
108
  const queryVec = await embedQuery(query);
104
- const queryBlob = Buffer.from(queryVec.buffer);
109
+ // Fetch all embeddings from vec_facts
110
+ const vecStmt = db.prepare(`SELECT id, embedding FROM vec_facts`);
111
+ const vecCorpus = [];
112
+ while (vecStmt.step()) {
113
+ const row = vecStmt.get({});
114
+ vecCorpus.push({
115
+ id: row.id,
116
+ embedding: deserializeEmbedding(row.embedding),
117
+ });
118
+ }
119
+ vecStmt.finalize();
120
+ // Perform KNN search
105
121
  const vecFetchLimit = Math.min(allRows.length, Math.max(RERANK_TOP_K * 2, limit * 3, 50));
106
- const vecRows = db
107
- .prepare(`SELECT rowid, distance FROM vec_facts
108
- WHERE embedding MATCH ?
109
- ORDER BY distance
110
- LIMIT ?`)
111
- .all(queryBlob, vecFetchLimit);
122
+ const vecResults = knnSearch(queryVec, vecCorpus, vecFetchLimit);
123
+ // Map vec_facts ids back to fact ids
112
124
  const vecRanked = [];
113
- for (const vecRow of vecRows) {
114
- const factRow = db
115
- .prepare(`SELECT id FROM facts WHERE vec_rowid = ? AND user_id = ? AND deleted_at IS NULL`)
116
- .get(vecRow.rowid, userId);
125
+ for (const vecResult of vecResults) {
126
+ const factRow = allRows.find((r) => r.vec_rowid === vecResult.id);
117
127
  if (factRow !== undefined) {
118
- vecRanked.push([factRow.id, 1 - vecRow.distance]);
128
+ vecRanked.push([factRow.id, 1 - vecResult.distance]);
119
129
  }
120
130
  }
121
131
  // ── 4. RRF merge ────────────────────────────────────────────────────────
@@ -1 +1 @@
1
- {"version":3,"file":"fact-search.js","sourceRoot":"","sources":["../src/fact-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAIzD,gCAAgC;AAChC,MAAM,KAAK,GAAG,EAAE,CAAC;AAEjB,oDAAoD;AACpD,MAAM,YAAY,GAAG,EAAE,CAAC;AAExB,0CAA0C;AAC1C,MAAM,aAAa,GAA2B;IAC5C,IAAI,EAAE,KAAK;IACX,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,IAAI;CACX,CAAC;AAwBF,iFAAiF;AAEjF,SAAS,QAAQ,CAAC,GAAY;IAC5B,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;AACrF,CAAC;AAED,SAAS,SAAS,CAAC,SAAiB;IAClC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,YAAY,CAAC,SAAiB,EAAE,SAAiB;IACxD,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,aAAa,CAAC,MAAO,CAAC;IACjE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,SAAS,CAAC,GAAY;IAC7B,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,SAAS,EAAE,GAAG,CAAC,UAAuB;QACtC,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;QAClC,eAAe,EAAE,GAAG,CAAC,iBAAiB;QACtC,GAAG,CAAC,GAAG,CAAC,oBAAoB,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,GAAG,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9F,GAAG,CAAC,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1D,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,GAAG,CACV,SAAkC,EAClC,UAAmC;IAEnC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEzC,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;QACnD,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,EAAE,KAAK,SAAS;YAAE,SAAS;QAC/B,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC;IACD,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;QACpD,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACjC,IAAI,EAAE,KAAK,SAAS;YAAE,SAAS;QAC/B,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,iFAAiF;AAEjF;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,EAAqB,EACrB,MAAc,EACd,KAAa,EACb,KAAK,GAAG,EAAE;IAEV,2EAA2E;IAC3E,MAAM,OAAO,GAAG,EAAE;SACf,OAAO,CACN;;;;;+BAKyB,CAC1B;SACA,GAAG,CAAC,MAAM,CAAC,CAAC;IAEf,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAkB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAExE,4EAA4E;IAC5E,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9B,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEzC,MAAM,UAAU,GAA4B,OAAO;SAChD,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAoB,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;SAC9D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE/B,2EAA2E;IAC3E,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE/C,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAE1F,MAAM,OAAO,GAAG,EAAE;SACf,OAAO,CACN;;;eAGS,CACV;SACA,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAIjC,MAAM,SAAS,GAA4B,EAAE,CAAC;IAC9C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,EAAE;aACf,OAAO,CACN,iFAAiF,CAClF;aACA,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC7B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAE7C,2EAA2E;IAC3E,MAAM,aAAa,GAA4B,EAAE,CAAC;IAClD,KAAK,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,SAAS,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,GAAG,KAAK,SAAS;YAAE,SAAS;QAChC,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1D,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1C,2EAA2E;IAC3E,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC;IAEzE,2EAA2E;IAC3E,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC,CAAC,CAAC;IACtE,MAAM,cAAc,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAE3D,MAAM,iBAAiB,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAE9D,MAAM,MAAM,GAA8C,UAAU,CAAC,GAAG,CACtE,CAAC,CAAC,EAAE,EAAE,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3B,EAAE;QACF,UAAU,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa;KACzE,CAAC,CACH,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IAEnD,2EAA2E;IAC3E,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;QACvD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO;YACL,IAAI;YACJ,KAAK,EAAE,UAAU;YACjB,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;SACpC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"fact-search.js","sourceRoot":"","sources":["../src/fact-search.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import Database from 'better-sqlite3';
1
+ import { type WasmDb } from './wasm-db.js';
2
2
  import type { MemoryStore } from './store.js';
3
3
  import type { Fact, IngestResult, MessageExchange, SearchResult, StoreStatus } from './types.js';
4
4
  import { type LLMConfig } from './llm-client.js';
@@ -57,12 +57,17 @@ export type { LLMConfig };
57
57
  export declare class LocalStore implements MemoryStore {
58
58
  #private;
59
59
  /** Expose database for plugin use (e.g., NudgeManager) */
60
- get db(): Database.Database;
60
+ get db(): WasmDb;
61
61
  /** Expose userId for plugin use */
62
62
  get userId(): string;
63
63
  /** Expose extraction queue for lifecycle management (start/stop) */
64
64
  get extractionQueue(): ExtractionQueue;
65
- constructor(options?: LocalStoreOptions);
65
+ private constructor();
66
+ /**
67
+ * Create a new LocalStore instance (async factory).
68
+ * Required because WASM initialization is async.
69
+ */
70
+ static create(options?: LocalStoreOptions): Promise<LocalStore>;
66
71
  store(fact: Omit<Fact, 'id'>): Promise<string>;
67
72
  search(query: string, limit?: number): Promise<readonly SearchResult[]>;
68
73
  delete(id: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"local-store.d.ts","sourceRoot":"","sources":["../src/local-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"local-store.d.ts","sourceRoot":"","sources":["../src/local-store.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,8 @@
1
- import Database from 'better-sqlite3';
2
- import * as sqliteVec from 'sqlite-vec';
3
1
  import { createHash } from 'node:crypto';
4
2
  import { homedir } from 'node:os';
5
3
  import { mkdirSync } from 'node:fs';
6
4
  import { join, dirname } from 'node:path';
5
+ import { openDb } from './wasm-db.js';
7
6
  import { applySchema } from './schema.js';
8
7
  import { extractFacts } from './extractor.js';
9
8
  import { callLLMWithConfig } from './llm-client.js';
@@ -12,6 +11,7 @@ import { formatExchange } from './chunker.js';
12
11
  import { searchRawLog } from './raw-log-search.js';
13
12
  import { searchFacts } from './fact-search.js';
14
13
  import { ExtractionQueue } from './extraction-queue.js';
14
+ import { serializeEmbedding } from './vector-search.js';
15
15
  export class LocalStore {
16
16
  #db;
17
17
  #userId;
@@ -29,47 +29,92 @@ export class LocalStore {
29
29
  get extractionQueue() {
30
30
  return this.#extractionQueue;
31
31
  }
32
- constructor(options = {}) {
32
+ constructor(db, userId, llmConfig, extractionQueue) {
33
+ this.#db = db;
34
+ this.#userId = userId;
35
+ this.#llmConfig = llmConfig;
36
+ this.#extractionQueue = extractionQueue;
37
+ }
38
+ /**
39
+ * Create a new LocalStore instance (async factory).
40
+ * Required because WASM initialization is async.
41
+ */
42
+ static async create(options = {}) {
33
43
  const dbPath = options.dbPath ?? join(homedir(), '.plumb', 'memory.db');
34
- this.#userId = options.userId ?? 'default';
35
- this.#llmConfig = options.llmConfig;
44
+ const userId = options.userId ?? 'default';
45
+ const llmConfig = options.llmConfig;
36
46
  mkdirSync(dirname(dbPath), { recursive: true });
37
- this.#db = new Database(dbPath);
38
- this.#db.pragma('journal_mode = WAL');
39
- this.#db.pragma('foreign_keys = ON');
40
- // Load sqlite-vec extension — vector operations implemented in T-004.
41
- sqliteVec.load(this.#db);
42
- applySchema(this.#db);
43
- // Initialize extraction queue — either use provided queue or create a default one.
44
- // Bind extractFacts with this store and llmConfig so the queue only needs (exchange, userId).
47
+ const db = await openDb(dbPath);
48
+ // Enable WAL mode and foreign keys
49
+ db.exec('PRAGMA journal_mode = WAL');
50
+ db.exec('PRAGMA foreign_keys = ON');
51
+ applySchema(db);
52
+ // Use a mutable cell to hold the store reference (needed for circular dependency)
53
+ let storeRef = null;
54
+ // Initialize extraction queue with deferred store lookup
45
55
  const extractFn = (exchange, userId) => {
46
- const llmFn = this.#llmConfig
47
- ? (prompt) => callLLMWithConfig(prompt, this.#llmConfig)
56
+ if (!storeRef)
57
+ throw new Error('Store not initialized');
58
+ const llmFn = llmConfig
59
+ ? (prompt) => callLLMWithConfig(prompt, llmConfig)
48
60
  : undefined;
49
- return extractFacts(exchange, userId, this, llmFn);
61
+ return extractFacts(exchange, userId, storeRef, llmFn);
50
62
  };
51
- this.#extractionQueue = options.extractionQueue ?? new ExtractionQueue(extractFn);
63
+ const extractionQueue = options.extractionQueue ?? new ExtractionQueue(extractFn);
64
+ // Create store and assign to ref
65
+ const store = new LocalStore(db, userId, llmConfig, extractionQueue);
66
+ storeRef = store;
67
+ return store;
52
68
  }
53
69
  async store(fact) {
54
70
  const id = crypto.randomUUID();
55
71
  // Embed concatenated fact text for vector search.
56
72
  const text = `${fact.subject} ${fact.predicate} ${fact.object} ${fact.context ?? ''}`.trim();
57
73
  const embedding = await embed(text);
58
- const vecBlob = Buffer.from(embedding.buffer);
59
- const doInsert = this.#db.transaction(() => {
60
- this.#db.prepare(`
74
+ const embeddingJson = serializeEmbedding(embedding);
75
+ // Begin transaction
76
+ this.#db.exec('BEGIN');
77
+ try {
78
+ // Insert fact
79
+ const factStmt = this.#db.prepare(`
61
80
  INSERT INTO facts
62
81
  (id, user_id, subject, predicate, object,
63
82
  confidence, decay_rate, timestamp, source_session_id,
64
83
  source_session_label, context)
65
84
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
66
- `).run(id, this.#userId, fact.subject, fact.predicate, fact.object, fact.confidence, fact.decayRate, fact.timestamp.toISOString(), fact.sourceSessionId, fact.sourceSessionLabel ?? null, fact.context ?? null);
67
- // Insert embedding into vec_facts (auto-assigned rowid).
68
- const vecInfo = this.#db.prepare(`INSERT INTO vec_facts(embedding) VALUES (?)`).run(vecBlob);
85
+ `);
86
+ factStmt.bind([
87
+ id,
88
+ this.#userId,
89
+ fact.subject,
90
+ fact.predicate,
91
+ fact.object,
92
+ fact.confidence,
93
+ fact.decayRate,
94
+ fact.timestamp.toISOString(),
95
+ fact.sourceSessionId,
96
+ fact.sourceSessionLabel ?? null,
97
+ fact.context ?? null,
98
+ ]);
99
+ factStmt.step();
100
+ factStmt.finalize();
101
+ // Insert embedding into vec_facts (auto-assigned id).
102
+ const vecStmt = this.#db.prepare(`INSERT INTO vec_facts(embedding) VALUES (?)`);
103
+ vecStmt.bind([embeddingJson]);
104
+ vecStmt.step();
105
+ vecStmt.finalize();
106
+ const vecRowid = this.#db.selectValue('SELECT last_insert_rowid()');
69
107
  // Back-fill vec_rowid so fact-search can join without a mapping table.
70
- this.#db.prepare(`UPDATE facts SET vec_rowid = ? WHERE id = ?`).run(vecInfo.lastInsertRowid, id);
71
- });
72
- doInsert();
108
+ const updateStmt = this.#db.prepare(`UPDATE facts SET vec_rowid = ? WHERE id = ?`);
109
+ updateStmt.bind([vecRowid, id]);
110
+ updateStmt.step();
111
+ updateStmt.finalize();
112
+ this.#db.exec('COMMIT');
113
+ }
114
+ catch (err) {
115
+ this.#db.exec('ROLLBACK');
116
+ throw err;
117
+ }
73
118
  return id;
74
119
  }
75
120
  async search(query, limit = 20) {
@@ -77,20 +122,35 @@ export class LocalStore {
77
122
  }
78
123
  async delete(id) {
79
124
  // Soft delete only — never hard delete.
80
- this.#db.prepare(`
125
+ const stmt = this.#db.prepare(`
81
126
  UPDATE facts SET deleted_at = ? WHERE id = ? AND user_id = ?
82
- `).run(new Date().toISOString(), id, this.#userId);
127
+ `);
128
+ stmt.bind([new Date().toISOString(), id, this.#userId]);
129
+ stmt.step();
130
+ stmt.finalize();
83
131
  }
84
132
  async status() {
85
- const factCount = this.#db.prepare(`SELECT COUNT(*) AS c FROM facts WHERE user_id = ? AND deleted_at IS NULL`).get(this.#userId).c;
86
- const rawLogCount = this.#db.prepare(`SELECT COUNT(*) AS c FROM raw_log WHERE user_id = ?`).get(this.#userId).c;
87
- const lastIngestionRow = this.#db.prepare(`SELECT MAX(timestamp) AS ts FROM raw_log WHERE user_id = ?`).get(this.#userId);
88
- const pageCount = this.#db.pragma('page_count', { simple: true });
89
- const pageSize = this.#db.pragma('page_size', { simple: true });
133
+ const factStmt = this.#db.prepare(`SELECT COUNT(*) AS c FROM facts WHERE user_id = ? AND deleted_at IS NULL`);
134
+ factStmt.bind([this.#userId]);
135
+ factStmt.step();
136
+ const factCount = factStmt.get(0);
137
+ factStmt.finalize();
138
+ const rawLogStmt = this.#db.prepare(`SELECT COUNT(*) AS c FROM raw_log WHERE user_id = ?`);
139
+ rawLogStmt.bind([this.#userId]);
140
+ rawLogStmt.step();
141
+ const rawLogCount = rawLogStmt.get(0);
142
+ rawLogStmt.finalize();
143
+ const lastIngestionStmt = this.#db.prepare(`SELECT MAX(timestamp) AS ts FROM raw_log WHERE user_id = ?`);
144
+ lastIngestionStmt.bind([this.#userId]);
145
+ lastIngestionStmt.step();
146
+ const lastIngestionTs = lastIngestionStmt.get(0);
147
+ lastIngestionStmt.finalize();
148
+ const pageCount = this.#db.selectValue('PRAGMA page_count');
149
+ const pageSize = this.#db.selectValue('PRAGMA page_size');
90
150
  return {
91
151
  factCount,
92
152
  rawLogCount,
93
- lastIngestion: lastIngestionRow.ts !== null ? new Date(lastIngestionRow.ts) : null,
153
+ lastIngestion: lastIngestionTs !== null ? new Date(lastIngestionTs) : null,
94
154
  storageBytes: pageCount * pageSize,
95
155
  };
96
156
  }
@@ -99,31 +159,51 @@ export class LocalStore {
99
159
  const chunkText = formatExchange(exchange);
100
160
  // Compute content hash for deduplication (scoped per userId).
101
161
  const contentHash = createHash('sha256').update(chunkText).digest('hex');
102
- // Embed before opening the synchronous DB transaction.
162
+ // Embed before opening the DB transaction.
103
163
  const embedding = await embed(chunkText);
104
- const vecBlob = Buffer.from(embedding.buffer);
105
- // Layer 1: write raw exchange to raw_log and store vector in vec_raw_log.
106
- // vec_raw_log auto-assigns its own rowid; we store it back in raw_log.vec_rowid
107
- // so raw-log-search can join the two tables without a separate mapping table.
108
- const doInsert = this.#db.transaction(() => {
109
- this.#db.prepare(`
164
+ const embeddingJson = serializeEmbedding(embedding);
165
+ // Attempt insert catch UNIQUE constraint violations (duplicate content_hash).
166
+ try {
167
+ this.#db.exec('BEGIN');
168
+ // Insert into raw_log
169
+ const rawLogStmt = this.#db.prepare(`
110
170
  INSERT INTO raw_log
111
171
  (id, user_id, session_id, session_label,
112
172
  user_message, agent_response, timestamp, source, chunk_text, chunk_index, content_hash)
113
173
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
114
- `).run(rawLogId, this.#userId, exchange.sessionId, exchange.sessionLabel ?? null, exchange.userMessage, exchange.agentResponse, exchange.timestamp.toISOString(), exchange.source, chunkText, 0, contentHash);
115
- // Insert embedding into sqlite-vec (auto-assigned rowid).
116
- const vecInfo = this.#db.prepare(`INSERT INTO vec_raw_log(embedding) VALUES (?)`).run(vecBlob);
174
+ `);
175
+ rawLogStmt.bind([
176
+ rawLogId,
177
+ this.#userId,
178
+ exchange.sessionId,
179
+ exchange.sessionLabel ?? null,
180
+ exchange.userMessage,
181
+ exchange.agentResponse,
182
+ exchange.timestamp.toISOString(),
183
+ exchange.source,
184
+ chunkText,
185
+ 0,
186
+ contentHash,
187
+ ]);
188
+ rawLogStmt.step();
189
+ rawLogStmt.finalize();
190
+ // Insert embedding into vec_raw_log (auto-assigned id).
191
+ const vecStmt = this.#db.prepare(`INSERT INTO vec_raw_log(embedding) VALUES (?)`);
192
+ vecStmt.bind([embeddingJson]);
193
+ vecStmt.step();
194
+ vecStmt.finalize();
195
+ const vecRowid = this.#db.selectValue('SELECT last_insert_rowid()');
117
196
  // Back-fill vec_rowid so raw-log-search can join without a mapping table.
118
- this.#db.prepare(`UPDATE raw_log SET vec_rowid = ? WHERE id = ?`).run(vecInfo.lastInsertRowid, rawLogId);
119
- });
120
- // Attempt insert — catch UNIQUE constraint violations (duplicate content_hash).
121
- try {
122
- doInsert();
197
+ const updateStmt = this.#db.prepare(`UPDATE raw_log SET vec_rowid = ? WHERE id = ?`);
198
+ updateStmt.bind([vecRowid, rawLogId]);
199
+ updateStmt.step();
200
+ updateStmt.finalize();
201
+ this.#db.exec('COMMIT');
123
202
  }
124
203
  catch (err) {
204
+ this.#db.exec('ROLLBACK');
125
205
  // Check for SQLite UNIQUE constraint error on content_hash.
126
- if (err instanceof Error && 'code' in err && err.code === 'SQLITE_CONSTRAINT_UNIQUE') {
206
+ if (err instanceof Error && err.message.includes('UNIQUE constraint')) {
127
207
  // Duplicate content — skip ingestion and fact extraction.
128
208
  return {
129
209
  rawLogId: '',
@@ -173,10 +253,7 @@ export class LocalStore {
173
253
  */
174
254
  async reextractOrphans(throttleMs = 1000) {
175
255
  // Query for raw_log entries with no corresponding facts.
176
- // A session_id may have multiple raw_log chunks, but if ANY chunk has facts,
177
- // we skip the entire session. This is conservative but prevents re-extracting
178
- // sessions that already have partial facts.
179
- const orphanRows = this.#db.prepare(`
256
+ const stmt = this.#db.prepare(`
180
257
  SELECT
181
258
  id,
182
259
  user_id AS userId,
@@ -193,7 +270,14 @@ export class LocalStore {
193
270
  WHERE facts.source_session_id = raw_log.session_id
194
271
  )
195
272
  ORDER BY timestamp ASC
196
- `).all(this.#userId);
273
+ `);
274
+ stmt.bind([this.#userId]);
275
+ const orphanRows = [];
276
+ while (stmt.step()) {
277
+ const row = stmt.get({});
278
+ orphanRows.push(row);
279
+ }
280
+ stmt.finalize();
197
281
  const orphansFound = orphanRows.length;
198
282
  if (orphansFound === 0) {
199
283
  return { orphansFound: 0, factsCreated: 0 };
@@ -202,7 +286,7 @@ export class LocalStore {
202
286
  for (let i = 0; i < orphanRows.length; i++) {
203
287
  const row = orphanRows[i];
204
288
  if (!row)
205
- continue; // Type guard: skip if row is undefined (shouldn't happen)
289
+ continue;
206
290
  // Reconstruct MessageExchange from raw_log data
207
291
  const exchange = {
208
292
  userMessage: row.userMessage,
@@ -210,7 +294,6 @@ export class LocalStore {
210
294
  timestamp: new Date(row.timestamp),
211
295
  source: row.source,
212
296
  sessionId: row.sessionId,
213
- // Conditionally include sessionLabel only if it's not null (exactOptionalPropertyTypes)
214
297
  ...(row.sessionLabel !== null ? { sessionLabel: row.sessionLabel } : {}),
215
298
  };
216
299
  // Extract facts directly (bypasses ingest dedup gate)
@@ -237,14 +320,21 @@ export class LocalStore {
237
320
  * Returns subjects ordered by number of facts (non-deleted only).
238
321
  */
239
322
  topSubjects(userId, limit = 5) {
240
- return this.#db.prepare(`
323
+ const stmt = this.#db.prepare(`
241
324
  SELECT subject, COUNT(*) as count
242
325
  FROM facts
243
326
  WHERE user_id = ? AND deleted_at IS NULL
244
327
  GROUP BY subject
245
328
  ORDER BY count DESC
246
329
  LIMIT ?
247
- `).all(userId, limit);
330
+ `);
331
+ stmt.bind([userId, limit]);
332
+ const results = [];
333
+ while (stmt.step()) {
334
+ results.push(stmt.get({}));
335
+ }
336
+ stmt.finalize();
337
+ return results;
248
338
  }
249
339
  /**
250
340
  * Export all data for a user (for plumb export command).
@@ -253,7 +343,7 @@ export class LocalStore {
253
343
  */
254
344
  exportAll(userId) {
255
345
  // Export all non-deleted facts only (soft-deleted facts are excluded).
256
- const factRows = this.#db.prepare(`
346
+ const factStmt = this.#db.prepare(`
257
347
  SELECT
258
348
  id,
259
349
  user_id AS userId,
@@ -270,13 +360,19 @@ export class LocalStore {
270
360
  FROM facts
271
361
  WHERE user_id = ? AND deleted_at IS NULL
272
362
  ORDER BY timestamp DESC
273
- `).all(userId);
363
+ `);
364
+ factStmt.bind([userId]);
365
+ const factRows = [];
366
+ while (factStmt.step()) {
367
+ factRows.push(factStmt.get({}));
368
+ }
369
+ factStmt.finalize();
274
370
  const facts = factRows.map((row) => ({
275
371
  ...row,
276
372
  deleted: false, // All exported facts are non-deleted
277
373
  }));
278
374
  // Export all raw_log entries (no vector data).
279
- const rawLog = this.#db.prepare(`
375
+ const rawLogStmt = this.#db.prepare(`
280
376
  SELECT
281
377
  id,
282
378
  user_id AS userId,
@@ -292,7 +388,13 @@ export class LocalStore {
292
388
  FROM raw_log
293
389
  WHERE user_id = ?
294
390
  ORDER BY timestamp DESC
295
- `).all(userId);
391
+ `);
392
+ rawLogStmt.bind([userId]);
393
+ const rawLog = [];
394
+ while (rawLogStmt.step()) {
395
+ rawLog.push(rawLogStmt.get({}));
396
+ }
397
+ rawLogStmt.finalize();
296
398
  return { facts, rawLog };
297
399
  }
298
400
  /** Close the database connection. Call when done (e.g. in tests). */
@@ -1 +1 @@
1
- {"version":3,"file":"local-store.js","sourceRoot":"","sources":["../src/local-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"local-store.js","sourceRoot":"","sources":["../src/local-store.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Pipeline:
5
5
  * 1. BM25 keyword search over all raw_log chunk_text (built at query time)
6
- * 2. KNN vector search via sqlite-vec vec_raw_log virtual table
6
+ * 2. KNN vector search via JS cosine similarity (replaces sqlite-vec)
7
7
  * 3. Reciprocal Rank Fusion (RRF, k=60) merges both ranked lists
8
8
  * 4. Recency decay: score *= e^(-0.012 × age_in_days)
9
9
  * 5. Cross-encoder reranker (top-20 candidates → Xenova/ms-marco-MiniLM-L-6-v2)
@@ -12,7 +12,7 @@
12
12
  * Search is cross-session: no session filter is applied.
13
13
  * The caller (LocalStore) passes its internal db handle — no separate DB connection.
14
14
  */
15
- import type Database from 'better-sqlite3';
15
+ import type { WasmDb } from './wasm-db.js';
16
16
  export interface RawLogSearchResult {
17
17
  readonly chunk_text: string;
18
18
  readonly session_id: string;
@@ -24,10 +24,10 @@ export interface RawLogSearchResult {
24
24
  /**
25
25
  * Hybrid search over raw_log.
26
26
  *
27
- * @param db The better-sqlite3 Database instance (with sqlite-vec loaded)
27
+ * @param db The WASM SQLite Database instance
28
28
  * @param userId Scopes the search to this user's data
29
29
  * @param query Natural language query string
30
30
  * @param limit Number of results to return (default 10)
31
31
  */
32
- export declare function searchRawLog(db: Database.Database, userId: string, query: string, limit?: number): Promise<readonly RawLogSearchResult[]>;
32
+ export declare function searchRawLog(db: WasmDb, userId: string, query: string, limit?: number): Promise<readonly RawLogSearchResult[]>;
33
33
  //# sourceMappingURL=raw-log-search.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"raw-log-search.d.ts","sourceRoot":"","sources":["../src/raw-log-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAe3C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,8FAA8F;IAC9F,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAsDD;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,KAAK,SAAK,GACT,OAAO,CAAC,SAAS,kBAAkB,EAAE,CAAC,CAoGxC"}
1
+ {"version":3,"file":"raw-log-search.d.ts","sourceRoot":"","sources":["../src/raw-log-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAgB3C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,8FAA8F;IAC9F,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAiDD;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,KAAK,SAAK,GACT,OAAO,CAAC,SAAS,kBAAkB,EAAE,CAAC,CAoGxC"}
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Pipeline:
5
5
  * 1. BM25 keyword search over all raw_log chunk_text (built at query time)
6
- * 2. KNN vector search via sqlite-vec vec_raw_log virtual table
6
+ * 2. KNN vector search via JS cosine similarity (replaces sqlite-vec)
7
7
  * 3. Reciprocal Rank Fusion (RRF, k=60) merges both ranked lists
8
8
  * 4. Recency decay: score *= e^(-0.012 × age_in_days)
9
9
  * 5. Cross-encoder reranker (top-20 candidates → Xenova/ms-marco-MiniLM-L-6-v2)
@@ -14,6 +14,7 @@
14
14
  */
15
15
  import { Bm25 } from './bm25.js';
16
16
  import { embedQuery, rerankScores } from './embedder.js';
17
+ import { knnSearch, deserializeEmbedding } from './vector-search.js';
17
18
  // RRF constant (standard k=60; higher = less weight on top-1 rank).
18
19
  const RRF_K = 60;
19
20
  // Recency decay lambda for raw logs (medium — half-life ≈ 58 days).
@@ -52,19 +53,23 @@ function rrf(vecRanked, bm25Ranked) {
52
53
  /**
53
54
  * Hybrid search over raw_log.
54
55
  *
55
- * @param db The better-sqlite3 Database instance (with sqlite-vec loaded)
56
+ * @param db The WASM SQLite Database instance
56
57
  * @param userId Scopes the search to this user's data
57
58
  * @param query Natural language query string
58
59
  * @param limit Number of results to return (default 10)
59
60
  */
60
61
  export async function searchRawLog(db, userId, query, limit = 10) {
61
62
  // ── 1. Fetch all raw_log rows for this user ──────────────────────────────
62
- const allRows = db
63
- .prepare(`SELECT id, session_id, session_label, timestamp, chunk_text
64
- FROM raw_log
65
- WHERE user_id = ?
66
- ORDER BY timestamp DESC`)
67
- .all(userId);
63
+ const stmt = db.prepare(`SELECT id, session_id, session_label, timestamp, chunk_text, vec_rowid
64
+ FROM raw_log
65
+ WHERE user_id = ?
66
+ ORDER BY timestamp DESC`);
67
+ stmt.bind([userId]);
68
+ const allRows = [];
69
+ while (stmt.step()) {
70
+ allRows.push(stmt.get({}));
71
+ }
72
+ stmt.finalize();
68
73
  if (allRows.length === 0)
69
74
  return [];
70
75
  const idToRow = new Map(allRows.map((r) => [r.id, r]));
@@ -75,27 +80,28 @@ export async function searchRawLog(db, userId, query, limit = 10) {
75
80
  const bm25Ranked = allRows
76
81
  .map((r, i) => [r.id, bm25RawScores[i] ?? 0])
77
82
  .sort((a, b) => b[1] - a[1]);
78
- // ── 3. Vector search via sqlite-vec ─────────────────────────────────────
83
+ // ── 3. Vector search via JS cosine similarity ───────────────────────────
79
84
  const queryVec = await embedQuery(query);
80
- const queryBlob = Buffer.from(queryVec.buffer);
81
- // Fetch enough candidates for RRF merge (all docs for small corpora, top-N otherwise).
85
+ // Fetch all embeddings from vec_raw_log
86
+ const vecStmt = db.prepare(`SELECT id, embedding FROM vec_raw_log`);
87
+ const vecCorpus = [];
88
+ while (vecStmt.step()) {
89
+ const row = vecStmt.get({});
90
+ vecCorpus.push({
91
+ id: row.id,
92
+ embedding: deserializeEmbedding(row.embedding),
93
+ });
94
+ }
95
+ vecStmt.finalize();
96
+ // Perform KNN search
82
97
  const vecFetchLimit = Math.min(allRows.length, Math.max(RERANK_TOP_K * 2, limit * 3, 50));
83
- // Query vec_raw_log for nearest neighbours; resolve back to raw_log via vec_rowid column.
84
- const vecRows = db
85
- .prepare(`SELECT rowid, distance FROM vec_raw_log
86
- WHERE embedding MATCH ?
87
- ORDER BY distance
88
- LIMIT ?`)
89
- .all(queryBlob, vecFetchLimit);
98
+ const vecResults = knnSearch(queryVec, vecCorpus, vecFetchLimit);
99
+ // Map vec_raw_log ids back to raw_log ids
90
100
  const vecRanked = [];
91
- for (const vecRow of vecRows) {
92
- const logRow = db
93
- .prepare(`SELECT id FROM raw_log WHERE vec_rowid = ? AND user_id = ?`)
94
- .get(vecRow.rowid, userId);
101
+ for (const vecResult of vecResults) {
102
+ const logRow = allRows.find((r) => r.vec_rowid === vecResult.id);
95
103
  if (logRow !== undefined) {
96
- // sqlite-vec cosine distance is in [0,2] for normalized vectors.
97
- // Similarity = 1 − distance gives [−1,1]; in practice ≥ 0 for meaningful matches.
98
- vecRanked.push([logRow.id, 1 - vecRow.distance]);
104
+ vecRanked.push([logRow.id, 1 - vecResult.distance]);
99
105
  }
100
106
  }
101
107
  // ── 4. RRF merge ────────────────────────────────────────────────────────
@@ -1 +1 @@
1
- {"version":3,"file":"raw-log-search.js","sourceRoot":"","sources":["../src/raw-log-search.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"raw-log-search.js","sourceRoot":"","sources":["../src/raw-log-search.ts"],"names":[],"mappings":"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"}
package/dist/schema.d.ts CHANGED
@@ -15,20 +15,19 @@ export declare const CREATE_FACTS_INDEXES: string[];
15
15
  export declare const CREATE_RAW_LOG_TABLE = "\n CREATE TABLE IF NOT EXISTS raw_log (\n id TEXT PRIMARY KEY,\n user_id TEXT NOT NULL,\n session_id TEXT NOT NULL,\n session_label TEXT,\n user_message TEXT NOT NULL,\n agent_response TEXT NOT NULL,\n timestamp TEXT NOT NULL,\n source TEXT NOT NULL,\n chunk_text TEXT NOT NULL,\n chunk_index INTEGER NOT NULL,\n vec_rowid INTEGER,\n content_hash TEXT,\n UNIQUE(user_id, content_hash)\n )\n";
16
16
  export declare const CREATE_RAW_LOG_INDEXES: string[];
17
17
  /**
18
- * sqlite-vec virtual table for KNN vector search over raw_log chunks.
19
- * Rowid mirrors the raw_log SQLite rowid for O(1) joins without a separate mapping table.
20
- * FLOAT[384] matches BAAI/bge-small-en-v1.5 output dimension.
18
+ * Embeddings table for vector search over raw_log chunks.
19
+ * Stores embeddings as JSON arrays (WASM-compatible, no native extension needed).
21
20
  */
22
- export declare const CREATE_VEC_RAW_LOG = "\n CREATE VIRTUAL TABLE IF NOT EXISTS vec_raw_log USING vec0(\n embedding FLOAT[384]\n )\n";
21
+ export declare const CREATE_VEC_RAW_LOG = "\n CREATE TABLE IF NOT EXISTS vec_raw_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n embedding TEXT NOT NULL\n )\n";
23
22
  /**
24
- * sqlite-vec virtual table for KNN vector search over facts.
25
- * FLOAT[384] matches BAAI/bge-small-en-v1.5 output dimension.
23
+ * Embeddings table for vector search over facts.
24
+ * Stores embeddings as JSON arrays (WASM-compatible, no native extension needed).
26
25
  */
27
- export declare const CREATE_VEC_FACTS = "\n CREATE VIRTUAL TABLE IF NOT EXISTS vec_facts USING vec0(\n embedding FLOAT[384]\n )\n";
26
+ export declare const CREATE_VEC_FACTS = "\n CREATE TABLE IF NOT EXISTS vec_facts (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n embedding TEXT NOT NULL\n )\n";
28
27
  /**
29
28
  * Nudge log table for tracking one-time upgrade prompts.
30
29
  * Each trigger type fires exactly once per install.
31
30
  */
32
31
  export declare const CREATE_NUDGE_LOG_TABLE = "\n CREATE TABLE IF NOT EXISTS nudge_log (\n id TEXT PRIMARY KEY,\n trigger_type TEXT NOT NULL,\n fired_at TEXT NOT NULL\n )\n";
33
- export declare function applySchema(db: import('better-sqlite3').Database): void;
32
+ export declare function applySchema(db: import('./wasm-db.js').WasmDb): void;
34
33
  //# sourceMappingURL=schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,kBAAkB,0fAe9B,CAAC;AAEF,eAAO,MAAM,oBAAoB,UAKhC,CAAC;AAEF,eAAO,MAAM,oBAAoB,8dAgBhC,CAAC;AAEF,eAAO,MAAM,sBAAsB,UAIlC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,oGAI9B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,kGAI5B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,8JAMlC,CAAC;AAEF,wBAAgB,WAAW,CAAC,EAAE,EAAE,OAAO,gBAAgB,EAAE,QAAQ,GAAG,IAAI,CAkCvE"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,kBAAkB,0fAe9B,CAAC;AAEF,eAAO,MAAM,oBAAoB,UAKhC,CAAC;AAEF,eAAO,MAAM,oBAAoB,8dAgBhC,CAAC;AAEF,eAAO,MAAM,sBAAsB,UAIlC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,gIAK9B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,8HAK5B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,8JAMlC,CAAC;AAEF,wBAAgB,WAAW,CAAC,EAAE,EAAE,OAAO,cAAc,EAAE,MAAM,GAAG,IAAI,CA8CnE"}
package/dist/schema.js CHANGED
@@ -55,22 +55,23 @@ export const CREATE_RAW_LOG_INDEXES = [
55
55
  `CREATE INDEX IF NOT EXISTS idx_raw_log_timestamp ON raw_log (timestamp)`,
56
56
  ];
57
57
  /**
58
- * sqlite-vec virtual table for KNN vector search over raw_log chunks.
59
- * Rowid mirrors the raw_log SQLite rowid for O(1) joins without a separate mapping table.
60
- * FLOAT[384] matches BAAI/bge-small-en-v1.5 output dimension.
58
+ * Embeddings table for vector search over raw_log chunks.
59
+ * Stores embeddings as JSON arrays (WASM-compatible, no native extension needed).
61
60
  */
62
61
  export const CREATE_VEC_RAW_LOG = `
63
- CREATE VIRTUAL TABLE IF NOT EXISTS vec_raw_log USING vec0(
64
- embedding FLOAT[384]
62
+ CREATE TABLE IF NOT EXISTS vec_raw_log (
63
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
64
+ embedding TEXT NOT NULL
65
65
  )
66
66
  `;
67
67
  /**
68
- * sqlite-vec virtual table for KNN vector search over facts.
69
- * FLOAT[384] matches BAAI/bge-small-en-v1.5 output dimension.
68
+ * Embeddings table for vector search over facts.
69
+ * Stores embeddings as JSON arrays (WASM-compatible, no native extension needed).
70
70
  */
71
71
  export const CREATE_VEC_FACTS = `
72
- CREATE VIRTUAL TABLE IF NOT EXISTS vec_facts USING vec0(
73
- embedding FLOAT[384]
72
+ CREATE TABLE IF NOT EXISTS vec_facts (
73
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
74
+ embedding TEXT NOT NULL
74
75
  )
75
76
  `;
76
77
  /**
@@ -96,13 +97,21 @@ export function applySchema(db) {
96
97
  db.exec(CREATE_VEC_RAW_LOG);
97
98
  db.exec(CREATE_VEC_FACTS);
98
99
  // Conditional migration: add vec_rowid column to facts if it doesn't exist yet.
99
- const factsColumns = db.pragma('table_info(facts)');
100
+ const factsColumns = db.exec({
101
+ sql: 'PRAGMA table_info(facts)',
102
+ rowMode: 'object',
103
+ returnValue: 'resultRows',
104
+ });
100
105
  const hasVecRowid = factsColumns.some((c) => c.name === 'vec_rowid');
101
106
  if (!hasVecRowid) {
102
107
  db.exec('ALTER TABLE facts ADD COLUMN vec_rowid INTEGER');
103
108
  }
104
109
  // Conditional migration: add content_hash column to raw_log if it doesn't exist yet.
105
- const rawLogColumns = db.pragma('table_info(raw_log)');
110
+ const rawLogColumns = db.exec({
111
+ sql: 'PRAGMA table_info(raw_log)',
112
+ rowMode: 'object',
113
+ returnValue: 'resultRows',
114
+ });
106
115
  const hasContentHash = rawLogColumns.some((c) => c.name === 'content_hash');
107
116
  if (!hasContentHash) {
108
117
  db.exec('ALTER TABLE raw_log ADD COLUMN content_hash TEXT');
@@ -111,7 +120,11 @@ export function applySchema(db) {
111
120
  db.exec('CREATE UNIQUE INDEX IF NOT EXISTS idx_raw_log_content_hash ON raw_log(user_id, content_hash)');
112
121
  }
113
122
  // Conditional migration: create nudge_log table if it doesn't exist yet.
114
- const tables = db.prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name='nudge_log'`).all();
123
+ const tables = db.exec({
124
+ sql: `SELECT name FROM sqlite_master WHERE type='table' AND name='nudge_log'`,
125
+ rowMode: 'object',
126
+ returnValue: 'resultRows',
127
+ });
115
128
  if (tables.length === 0) {
116
129
  db.exec(CREATE_NUDGE_LOG_TABLE);
117
130
  }
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;CAejC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,iEAAiE;IACjE,8EAA8E;IAC9E,qEAAqE;IACrE,uEAAuE;CACxE,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;CAgBnC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,qEAAqE;IACrE,2EAA2E;IAC3E,yEAAyE;CAC1E,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;CAIjC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;CAI/B,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;CAMrC,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,EAAqC;IAC/D,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC5B,KAAK,MAAM,GAAG,IAAI,oBAAoB,EAAE,CAAC;QACvC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IACD,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,sBAAsB,EAAE,CAAC;QACzC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IACD,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC5B,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAE1B,gFAAgF;IAChF,MAAM,YAAY,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAA4B,CAAC;IAC/E,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;IACrE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,EAAE,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;IAC5D,CAAC;IAED,qFAAqF;IACrF,MAAM,aAAa,GAAG,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAA4B,CAAC;IAClF,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;IAC5E,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,EAAE,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;QAC5D,uDAAuD;QACvD,2FAA2F;QAC3F,EAAE,CAAC,IAAI,CAAC,8FAA8F,CAAC,CAAC;IAC1G,CAAC;IAED,yEAAyE;IACzE,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,wEAAwE,CAAC,CAAC,GAAG,EAAE,CAAC;IAC1G,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAClC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;CAejC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,iEAAiE;IACjE,8EAA8E;IAC9E,qEAAqE;IACrE,uEAAuE;CACxE,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;CAgBnC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,qEAAqE;IACrE,2EAA2E;IAC3E,yEAAyE;CAC1E,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;CAKjC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;CAK/B,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;CAMrC,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,EAAiC;IAC3D,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC5B,KAAK,MAAM,GAAG,IAAI,oBAAoB,EAAE,CAAC;QACvC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IACD,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,sBAAsB,EAAE,CAAC;QACzC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IACD,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC5B,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAE1B,gFAAgF;IAChF,MAAM,YAAY,GAAG,EAAE,CAAC,IAAI,CAAC;QAC3B,GAAG,EAAE,0BAA0B;QAC/B,OAAO,EAAE,QAAQ;QACjB,WAAW,EAAE,YAAY;KAC1B,CAA4B,CAAC;IAC9B,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;IACrE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,EAAE,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;IAC5D,CAAC;IAED,qFAAqF;IACrF,MAAM,aAAa,GAAG,EAAE,CAAC,IAAI,CAAC;QAC5B,GAAG,EAAE,4BAA4B;QACjC,OAAO,EAAE,QAAQ;QACjB,WAAW,EAAE,YAAY;KAC1B,CAA4B,CAAC;IAC9B,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;IAC5E,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,EAAE,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;QAC5D,uDAAuD;QACvD,2FAA2F;QAC3F,EAAE,CAAC,IAAI,CAAC,8FAA8F,CAAC,CAAC;IAC1G,CAAC;IAED,yEAAyE;IACzE,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC;QACrB,GAAG,EAAE,wEAAwE;QAC7E,OAAO,EAAE,QAAQ;QACjB,WAAW,EAAE,YAAY;KAC1B,CAA4B,CAAC;IAC9B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAClC,CAAC;AACH,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * JavaScript-based vector similarity search.
3
+ *
4
+ * Replaces sqlite-vec native extension with pure JS cosine similarity.
5
+ * For current Plumb scale (thousands of facts, not millions), computing
6
+ * cosine similarity in-memory is acceptable.
7
+ */
8
+ export interface VectorSearchResult {
9
+ readonly id: number;
10
+ readonly distance: number;
11
+ }
12
+ /**
13
+ * Compute cosine distance between two vectors.
14
+ * Returns distance in [0, 2] where 0 = identical, 2 = opposite.
15
+ * For normalized vectors, similarity = 1 - distance.
16
+ */
17
+ export declare function cosineDistance(a: Float32Array, b: Float32Array): number;
18
+ /**
19
+ * Find k-nearest neighbors in a vector corpus.
20
+ *
21
+ * @param queryVec Query embedding
22
+ * @param corpus Array of [id, embedding] pairs
23
+ * @param k Number of results to return
24
+ * @returns Top-k results ordered by distance (ascending)
25
+ */
26
+ export declare function knnSearch(queryVec: Float32Array, corpus: Array<{
27
+ id: number;
28
+ embedding: Float32Array;
29
+ }>, k: number): VectorSearchResult[];
30
+ /**
31
+ * Serialize embedding to JSON string for storage.
32
+ */
33
+ export declare function serializeEmbedding(embedding: Float32Array): string;
34
+ /**
35
+ * Deserialize embedding from JSON string.
36
+ */
37
+ export declare function deserializeEmbedding(json: string): Float32Array;
38
+ //# sourceMappingURL=vector-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-search.d.ts","sourceRoot":"","sources":["../src/vector-search.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CAkBvE;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CACvB,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,YAAY,CAAA;CAAE,CAAC,EACtD,CAAC,EAAE,MAAM,GACR,kBAAkB,EAAE,CAUtB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,YAAY,GAAG,MAAM,CAElE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAE/D"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * JavaScript-based vector similarity search.
3
+ *
4
+ * Replaces sqlite-vec native extension with pure JS cosine similarity.
5
+ * For current Plumb scale (thousands of facts, not millions), computing
6
+ * cosine similarity in-memory is acceptable.
7
+ */
8
+ /**
9
+ * Compute cosine distance between two vectors.
10
+ * Returns distance in [0, 2] where 0 = identical, 2 = opposite.
11
+ * For normalized vectors, similarity = 1 - distance.
12
+ */
13
+ export function cosineDistance(a, b) {
14
+ if (a.length !== b.length) {
15
+ throw new Error('Vectors must have the same dimension');
16
+ }
17
+ let dotProduct = 0;
18
+ let normA = 0;
19
+ let normB = 0;
20
+ for (let i = 0; i < a.length; i++) {
21
+ dotProduct += a[i] * b[i];
22
+ normA += a[i] * a[i];
23
+ normB += b[i] * b[i];
24
+ }
25
+ const similarity = dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
26
+ // Distance = 1 - similarity, scaled to [0, 2]
27
+ return 1 - similarity;
28
+ }
29
+ /**
30
+ * Find k-nearest neighbors in a vector corpus.
31
+ *
32
+ * @param queryVec Query embedding
33
+ * @param corpus Array of [id, embedding] pairs
34
+ * @param k Number of results to return
35
+ * @returns Top-k results ordered by distance (ascending)
36
+ */
37
+ export function knnSearch(queryVec, corpus, k) {
38
+ // Compute distances for all vectors
39
+ const distances = corpus.map(({ id, embedding }) => ({
40
+ id,
41
+ distance: cosineDistance(queryVec, embedding),
42
+ }));
43
+ // Sort by distance (ascending) and take top k
44
+ distances.sort((a, b) => a.distance - b.distance);
45
+ return distances.slice(0, k);
46
+ }
47
+ /**
48
+ * Serialize embedding to JSON string for storage.
49
+ */
50
+ export function serializeEmbedding(embedding) {
51
+ return JSON.stringify(Array.from(embedding));
52
+ }
53
+ /**
54
+ * Deserialize embedding from JSON string.
55
+ */
56
+ export function deserializeEmbedding(json) {
57
+ return new Float32Array(JSON.parse(json));
58
+ }
59
+ //# sourceMappingURL=vector-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-search.js","sourceRoot":"","sources":["../src/vector-search.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,CAAe,EAAE,CAAe;IAC7D,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QAC5B,KAAK,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACvB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IACzB,CAAC;IAED,MAAM,UAAU,GAAG,UAAU,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,8CAA8C;IAC9C,OAAO,CAAC,GAAG,UAAU,CAAC;AACxB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS,CACvB,QAAsB,EACtB,MAAsD,EACtD,CAAS;IAET,oCAAoC;IACpC,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;QACnD,EAAE;QACF,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC;KAC9C,CAAC,CAAC,CAAC;IAEJ,8CAA8C;IAC9C,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAClD,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAuB;IACxD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAa,CAAC,CAAC;AACxD,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * WASM SQLite database wrapper.
3
+ * Provides the WasmDb type for use across the codebase.
4
+ * The @sqlite.org/sqlite-wasm oo1 API is used directly - this file only exports types.
5
+ */
6
+ import type SqliteWasm from '@sqlite.org/sqlite-wasm';
7
+ type Sqlite3Init = typeof SqliteWasm;
8
+ export type WasmDb = InstanceType<Awaited<ReturnType<Sqlite3Init>>['oo1']['DB']>;
9
+ /**
10
+ * Open a WASM SQLite database.
11
+ * @param path Absolute path to the database file
12
+ */
13
+ export declare function openDb(path: string): Promise<WasmDb>;
14
+ export {};
15
+ //# sourceMappingURL=wasm-db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wasm-db.d.ts","sourceRoot":"","sources":["../src/wasm-db.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoBH,OAAO,KAAK,UAAU,MAAM,yBAAyB,CAAC;AACtD,KAAK,WAAW,GAAG,OAAO,UAAU,CAAC;AAarC,MAAM,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAEjF;;;GAGG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK1D"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * WASM SQLite database wrapper.
3
+ * Provides the WasmDb type for use across the codebase.
4
+ * The @sqlite.org/sqlite-wasm oo1 API is used directly - this file only exports types.
5
+ */
6
+ import { createRequire } from 'node:module';
7
+ import { fileURLToPath } from 'node:url';
8
+ import { dirname, join } from 'node:path';
9
+ // Load sqlite3-node.mjs using require to bypass package.json exports restriction
10
+ const __filename = fileURLToPath(import.meta.url);
11
+ const __dirname = dirname(__filename);
12
+ const require = createRequire(import.meta.url);
13
+ // Find node_modules path by resolving the package directory
14
+ // We need to use a file that IS exported (sqlite3.wasm) to find the package root
15
+ const wasmFilePath = require.resolve('@sqlite.org/sqlite-wasm/sqlite3.wasm');
16
+ // wasmFilePath = /node_modules/@sqlite.org/sqlite-wasm/sqlite-wasm/jswasm/sqlite3.wasm
17
+ // Go up from jswasm/ to sqlite-wasm/ to package root (3 levels up)
18
+ const packageDir = dirname(dirname(dirname(wasmFilePath)));
19
+ const sqlite3NodePath = join(packageDir, 'sqlite-wasm', 'jswasm', 'sqlite3-node.mjs');
20
+ // Global WASM module singleton (initialized once per process)
21
+ let wasmModule = null;
22
+ async function initWasmModule() {
23
+ if (!wasmModule) {
24
+ const { default: sqlite3Init } = await import(sqlite3NodePath);
25
+ wasmModule = await sqlite3Init();
26
+ }
27
+ return wasmModule;
28
+ }
29
+ /**
30
+ * Open a WASM SQLite database.
31
+ * @param path Absolute path to the database file
32
+ */
33
+ export async function openDb(path) {
34
+ const sqlite3 = await initWasmModule();
35
+ // 'ct' flags: create if not exists, throw on error
36
+ const db = new sqlite3.oo1.DB(path, 'ct');
37
+ return db;
38
+ }
39
+ //# sourceMappingURL=wasm-db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wasm-db.js","sourceRoot":"","sources":["../src/wasm-db.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,iFAAiF;AACjF,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,4DAA4D;AAC5D,iFAAiF;AACjF,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC;AAC7E,uFAAuF;AACvF,mEAAmE;AACnE,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;AAC3D,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC;AAMtF,8DAA8D;AAC9D,IAAI,UAAU,GAA4C,IAAI,CAAC;AAE/D,KAAK,UAAU,cAAc;IAC3B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAA6B,CAAC;QAC3F,UAAU,GAAG,MAAM,WAAW,EAAE,CAAC;IACnC,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAID;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAY;IACvC,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;IACvC,mDAAmD;IACnD,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1C,OAAO,EAAE,CAAC;AACZ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getplumb/core",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "Plumb memory engine — storage abstraction, types, and local SQLite driver",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -28,14 +28,12 @@
28
28
  "prepublishOnly": "pnpm build"
29
29
  },
30
30
  "devDependencies": {
31
- "@types/better-sqlite3": "^7.6.13",
32
31
  "tsx": "^4.0.0",
33
32
  "typescript": "^5.4.0"
34
33
  },
35
34
  "dependencies": {
36
- "better-sqlite3": "^12.6.2",
37
- "openai": "^4.80.0",
38
- "sqlite-vec": "0.1.7-alpha.2"
35
+ "@sqlite.org/sqlite-wasm": "3.47.2-build1",
36
+ "openai": "^4.80.0"
39
37
  },
40
38
  "optionalDependencies": {
41
39
  "@anthropic-ai/sdk": "^0.78.0",