@getplumb/core 0.1.3 → 0.1.4
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 +6 -5
- package/dist/fact-search.d.ts +4 -4
- package/dist/fact-search.d.ts.map +1 -1
- package/dist/fact-search.js +33 -23
- package/dist/fact-search.js.map +1 -1
- package/dist/local-store.d.ts +8 -3
- package/dist/local-store.d.ts.map +1 -1
- package/dist/local-store.js +165 -63
- package/dist/local-store.js.map +1 -1
- package/dist/raw-log-search.d.ts +4 -4
- package/dist/raw-log-search.d.ts.map +1 -1
- package/dist/raw-log-search.js +31 -25
- package/dist/raw-log-search.js.map +1 -1
- package/dist/schema.d.ts +7 -8
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +25 -12
- package/dist/schema.js.map +1 -1
- package/dist/vector-search.d.ts +38 -0
- package/dist/vector-search.d.ts.map +1 -0
- package/dist/vector-search.js +59 -0
- package/dist/vector-search.js.map +1 -0
- package/dist/wasm-db.d.ts +14 -0
- package/dist/wasm-db.d.ts.map +1 -0
- package/dist/wasm-db.js +40 -0
- package/dist/wasm-db.js.map +1 -0
- package/package.json +10 -13
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
|
|
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
|
-
|
|
26
|
-
await
|
|
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
|
-
|
|
32
|
+
agentResponse: 'Noted! TypeScript it is.',
|
|
33
|
+
timestamp: new Date(),
|
|
34
|
+
source: 'openclaw'
|
|
34
35
|
});
|
|
35
36
|
|
|
36
37
|
// Retrieve relevant memory
|
package/dist/fact-search.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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:
|
|
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,
|
|
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"}
|
package/dist/fact-search.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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
|
|
107
|
+
// ── 3. Vector search via JS cosine similarity ───────────────────────────
|
|
103
108
|
const queryVec = await embedQuery(query);
|
|
104
|
-
|
|
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
|
|
107
|
-
|
|
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
|
|
114
|
-
const factRow =
|
|
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 -
|
|
128
|
+
vecRanked.push([factRow.id, 1 - vecResult.distance]);
|
|
119
129
|
}
|
|
120
130
|
}
|
|
121
131
|
// ── 4. RRF merge ────────────────────────────────────────────────────────
|
package/dist/fact-search.js.map
CHANGED
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"fact-search.js","sourceRoot":"","sources":["../src/fact-search.ts"],"names":[],"mappings":"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"}
|
package/dist/local-store.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
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():
|
|
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(
|
|
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":"
|
|
1
|
+
{"version":3,"file":"local-store.d.ts","sourceRoot":"","sources":["../src/local-store.ts"],"names":[],"mappings":"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"}
|
package/dist/local-store.js
CHANGED
|
@@ -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(
|
|
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
|
-
|
|
35
|
-
|
|
44
|
+
const userId = options.userId ?? 'default';
|
|
45
|
+
const llmConfig = options.llmConfig;
|
|
36
46
|
mkdirSync(dirname(dbPath), { recursive: true });
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
//
|
|
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
|
-
|
|
47
|
-
|
|
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,
|
|
61
|
+
return extractFacts(exchange, userId, storeRef, llmFn);
|
|
50
62
|
};
|
|
51
|
-
|
|
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
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
`)
|
|
67
|
-
|
|
68
|
-
|
|
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 = ?`)
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
`)
|
|
127
|
+
`);
|
|
128
|
+
stmt.bind([new Date().toISOString(), id, this.#userId]);
|
|
129
|
+
stmt.step();
|
|
130
|
+
stmt.finalize();
|
|
83
131
|
}
|
|
84
132
|
async status() {
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
const
|
|
89
|
-
|
|
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:
|
|
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
|
|
162
|
+
// Embed before opening the DB transaction.
|
|
103
163
|
const embedding = await embed(chunkText);
|
|
104
|
-
const
|
|
105
|
-
//
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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
|
-
`)
|
|
115
|
-
|
|
116
|
-
|
|
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 = ?`)
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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 &&
|
|
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
|
-
|
|
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
|
-
`)
|
|
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;
|
|
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
|
-
|
|
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
|
-
`)
|
|
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
|
|
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
|
-
`)
|
|
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
|
|
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
|
-
`)
|
|
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). */
|
package/dist/local-store.js.map
CHANGED
|
@@ -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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"}
|
package/dist/raw-log-search.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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:
|
|
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,
|
|
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"}
|
package/dist/raw-log-search.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
|
83
|
+
// ── 3. Vector search via JS cosine similarity ───────────────────────────
|
|
79
84
|
const queryVec = await embedQuery(query);
|
|
80
|
-
|
|
81
|
-
|
|
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
|
-
|
|
84
|
-
|
|
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
|
|
92
|
-
const logRow =
|
|
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
|
-
|
|
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":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"raw-log-search.js","sourceRoot":"","sources":["../src/raw-log-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAErE,oEAAoE;AACpE,MAAM,KAAK,GAAG,EAAE,CAAC;AAEjB,oEAAoE;AACpE,MAAM,cAAc,GAAG,KAAK,CAAC;AAE7B,oDAAoD;AACpD,MAAM,YAAY,GAAG,EAAE,CAAC;AAuBxB,iFAAiF;AAEjF,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;IACrC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,cAAc,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED;;;;GAIG;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,YAAY,CAChC,EAAU,EACV,MAAc,EACd,KAAa,EACb,KAAK,GAAG,EAAE;IAEV,4EAA4E;IAC5E,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB;;;6BAGyB,CAC1B,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAEpB,MAAM,OAAO,GAAoD,EAAE,CAAC;IACpE,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAQ,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,CAAC,QAAQ,EAAE,CAAC;IAEhB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAoB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1E,4EAA4E;IAC5E,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAChD,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;IAEzC,wCAAwC;IACxC,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC;IACpE,MAAM,SAAS,GAAmD,EAAE,CAAC;IACrE,OAAO,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAsC,CAAC;QACjE,SAAS,CAAC,IAAI,CAAC;YACb,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,SAAS,EAAE,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC;SAC/C,CAAC,CAAC;IACL,CAAC;IACD,OAAO,CAAC,QAAQ,EAAE,CAAC;IAEnB,qBAAqB;IACrB,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;IAC1F,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;IAEjE,0CAA0C;IAC1C,MAAM,SAAS,GAA4B,EAAE,CAAC;IAC9C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,EAAE,CAAC,CAAC;QACjE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtD,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,CAAC,CAAC;QAC1C,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,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC;IAC7E,MAAM,cAAc,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAE3D,0EAA0E;IAC1E,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,OAAO;YACL,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,WAAW,EAAE,UAAU;SACxB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
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
|
-
*
|
|
19
|
-
*
|
|
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
|
|
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
|
-
*
|
|
25
|
-
*
|
|
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
|
|
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('
|
|
32
|
+
export declare function applySchema(db: import('./wasm-db.js').WasmDb): void;
|
|
34
33
|
//# sourceMappingURL=schema.d.ts.map
|
package/dist/schema.d.ts.map
CHANGED
|
@@ -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
|
|
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
|
-
*
|
|
59
|
-
*
|
|
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
|
|
64
|
-
|
|
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
|
-
*
|
|
69
|
-
*
|
|
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
|
|
73
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
}
|
package/dist/schema.js.map
CHANGED
|
@@ -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
|
|
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,14 @@
|
|
|
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
|
+
declare const sqlite3InitModule: typeof import("@sqlite.org/sqlite-wasm").default;
|
|
7
|
+
export type WasmDb = InstanceType<Awaited<ReturnType<typeof sqlite3InitModule>>['oo1']['DB']>;
|
|
8
|
+
/**
|
|
9
|
+
* Open a WASM SQLite database.
|
|
10
|
+
* @param path Absolute path to the database file
|
|
11
|
+
*/
|
|
12
|
+
export declare function openDb(path: string): Promise<WasmDb>;
|
|
13
|
+
export {};
|
|
14
|
+
//# 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,QAAA,MAAM,iBAAiB,EAA8C,cAAc,yBAAyB,EAAE,OAAO,CAAC;AAYtH,MAAM,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAE9F;;;GAGG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK1D"}
|
package/dist/wasm-db.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
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
|
+
// Dynamic import the Node.js-specific WASM module
|
|
21
|
+
const sqlite3InitModule = (await import(sqlite3NodePath)).default;
|
|
22
|
+
// Global WASM module singleton (initialized once per process)
|
|
23
|
+
let wasmModule = null;
|
|
24
|
+
async function initWasmModule() {
|
|
25
|
+
if (!wasmModule) {
|
|
26
|
+
wasmModule = await sqlite3InitModule();
|
|
27
|
+
}
|
|
28
|
+
return wasmModule;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Open a WASM SQLite database.
|
|
32
|
+
* @param path Absolute path to the database file
|
|
33
|
+
*/
|
|
34
|
+
export async function openDb(path) {
|
|
35
|
+
const sqlite3 = await initWasmModule();
|
|
36
|
+
// 'ct' flags: create if not exists, throw on error
|
|
37
|
+
const db = new sqlite3.oo1.DB(path, 'ct');
|
|
38
|
+
return db;
|
|
39
|
+
}
|
|
40
|
+
//# 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;AAEtF,kDAAkD;AAClD,MAAM,iBAAiB,GAAG,CAAC,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,OAA2D,CAAC;AAEtH,8DAA8D;AAC9D,IAAI,UAAU,GAAyD,IAAI,CAAC;AAE5E,KAAK,UAAU,cAAc;IAC3B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,UAAU,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACzC,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
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "Plumb memory engine — storage abstraction, types, and local SQLite driver",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -20,25 +20,22 @@
|
|
|
20
20
|
"types": "./dist/index.d.ts"
|
|
21
21
|
}
|
|
22
22
|
},
|
|
23
|
-
"scripts": {
|
|
24
|
-
"build": "tsc",
|
|
25
|
-
"test": "node --import tsx/esm --test src/**/*.test.ts",
|
|
26
|
-
"lint": "echo \"No lint yet\" && exit 0",
|
|
27
|
-
"clean": "rm -rf dist *.tsbuildinfo",
|
|
28
|
-
"prepublishOnly": "pnpm build"
|
|
29
|
-
},
|
|
30
23
|
"devDependencies": {
|
|
31
|
-
"@types/better-sqlite3": "^7.6.13",
|
|
32
24
|
"tsx": "^4.0.0",
|
|
33
25
|
"typescript": "^5.4.0"
|
|
34
26
|
},
|
|
35
27
|
"dependencies": {
|
|
36
|
-
"
|
|
37
|
-
"openai": "^4.80.0"
|
|
38
|
-
"sqlite-vec": "0.1.7-alpha.2"
|
|
28
|
+
"@sqlite.org/sqlite-wasm": "3.47.2-build1",
|
|
29
|
+
"openai": "^4.80.0"
|
|
39
30
|
},
|
|
40
31
|
"optionalDependencies": {
|
|
41
32
|
"@anthropic-ai/sdk": "^0.78.0",
|
|
42
33
|
"@xenova/transformers": "^2.17.2"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsc",
|
|
37
|
+
"test": "node --import tsx/esm --test src/**/*.test.ts",
|
|
38
|
+
"lint": "echo \"No lint yet\" && exit 0",
|
|
39
|
+
"clean": "rm -rf dist *.tsbuildinfo"
|
|
43
40
|
}
|
|
44
|
-
}
|
|
41
|
+
}
|