@getplumb/core 0.1.2 → 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/extraction-queue.d.ts +62 -0
- package/dist/extraction-queue.d.ts.map +1 -0
- package/dist/extraction-queue.js +84 -0
- package/dist/extraction-queue.js.map +1 -0
- 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/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/local-store.d.ts +18 -4
- package/dist/local-store.d.ts.map +1 -1
- package/dist/local-store.js +180 -76
- 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
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { MessageExchange, Fact } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Extraction function signature expected by ExtractionQueue.
|
|
4
|
+
* Takes an exchange and userId, returns extracted facts.
|
|
5
|
+
* LocalStore binds extractFacts with its own store + llmConfig.
|
|
6
|
+
*/
|
|
7
|
+
export type ExtractFn = (exchange: MessageExchange, userId: string) => Promise<Fact[]>;
|
|
8
|
+
export interface ExtractionQueueOptions {
|
|
9
|
+
/** Drain interval in milliseconds. Defaults to PLUMB_EXTRACT_INTERVAL_MS env var or 300000 (5 min). */
|
|
10
|
+
intervalMs?: number;
|
|
11
|
+
/** Max queue size before early flush. Defaults to PLUMB_EXTRACT_BATCH_SIZE env var or 10. */
|
|
12
|
+
batchSize?: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* ExtractionQueue — batched fact extraction queue.
|
|
16
|
+
*
|
|
17
|
+
* Replaces the immediate fire-and-forget extractFacts() call inside ingest() with
|
|
18
|
+
* a deferred queue. Raw exchanges are buffered in memory; a background drain loop
|
|
19
|
+
* flushes the queue periodically (default 5 min) or when batch size is reached (default 10).
|
|
20
|
+
*
|
|
21
|
+
* This is a pure cost optimization: one extractFacts() call per exchange, just deferred.
|
|
22
|
+
*
|
|
23
|
+
* Usage:
|
|
24
|
+
* const queue = new ExtractionQueue(extractFn, { intervalMs: 300_000, batchSize: 10 });
|
|
25
|
+
* queue.start();
|
|
26
|
+
* queue.enqueue(exchange, userId);
|
|
27
|
+
* // ... later
|
|
28
|
+
* await queue.stop(); // flushes remaining items
|
|
29
|
+
*
|
|
30
|
+
* @see T-071
|
|
31
|
+
*/
|
|
32
|
+
export declare class ExtractionQueue {
|
|
33
|
+
private readonly extractFn;
|
|
34
|
+
private queue;
|
|
35
|
+
private timer;
|
|
36
|
+
private readonly intervalMs;
|
|
37
|
+
private readonly batchSize;
|
|
38
|
+
private flushing;
|
|
39
|
+
constructor(extractFn: ExtractFn, opts?: ExtractionQueueOptions);
|
|
40
|
+
/**
|
|
41
|
+
* Enqueue an exchange for fact extraction.
|
|
42
|
+
* Triggers early flush if batch size threshold is reached.
|
|
43
|
+
*/
|
|
44
|
+
enqueue(exchange: MessageExchange, userId: string): void;
|
|
45
|
+
/**
|
|
46
|
+
* Start the background drain loop.
|
|
47
|
+
* Call this once after construction (e.g., in plugin activate()).
|
|
48
|
+
*/
|
|
49
|
+
start(): void;
|
|
50
|
+
/**
|
|
51
|
+
* Stop the background drain loop and flush remaining items.
|
|
52
|
+
* Call this before shutdown (e.g., in plugin session_end or process exit).
|
|
53
|
+
*/
|
|
54
|
+
stop(): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Flush the queue immediately: drain all pending items and call extractFn for each.
|
|
57
|
+
* Uses Promise.allSettled() so one failed extraction doesn't drop others.
|
|
58
|
+
* Safe to call concurrently — only one flush runs at a time.
|
|
59
|
+
*/
|
|
60
|
+
flush(): Promise<void>;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=extraction-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extraction-queue.d.ts","sourceRoot":"","sources":["../src/extraction-queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAExD;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAIvF,MAAM,WAAW,sBAAsB;IACrC,uGAAuG;IACvG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6FAA6F;IAC7F,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,eAAe;IAQxB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAP5B,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAS;gBAGN,SAAS,EAAE,SAAS,EACrC,IAAI,CAAC,EAAE,sBAAsB;IAM/B;;;OAGG;IACH,OAAO,CAAC,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAOxD;;;OAGG;IACH,KAAK,IAAI,IAAI;IAKb;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAkB7B"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ExtractionQueue — batched fact extraction queue.
|
|
3
|
+
*
|
|
4
|
+
* Replaces the immediate fire-and-forget extractFacts() call inside ingest() with
|
|
5
|
+
* a deferred queue. Raw exchanges are buffered in memory; a background drain loop
|
|
6
|
+
* flushes the queue periodically (default 5 min) or when batch size is reached (default 10).
|
|
7
|
+
*
|
|
8
|
+
* This is a pure cost optimization: one extractFacts() call per exchange, just deferred.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* const queue = new ExtractionQueue(extractFn, { intervalMs: 300_000, batchSize: 10 });
|
|
12
|
+
* queue.start();
|
|
13
|
+
* queue.enqueue(exchange, userId);
|
|
14
|
+
* // ... later
|
|
15
|
+
* await queue.stop(); // flushes remaining items
|
|
16
|
+
*
|
|
17
|
+
* @see T-071
|
|
18
|
+
*/
|
|
19
|
+
export class ExtractionQueue {
|
|
20
|
+
extractFn;
|
|
21
|
+
queue = [];
|
|
22
|
+
timer = null;
|
|
23
|
+
intervalMs;
|
|
24
|
+
batchSize;
|
|
25
|
+
flushing = false; // Prevent concurrent flush() calls
|
|
26
|
+
constructor(extractFn, opts) {
|
|
27
|
+
this.extractFn = extractFn;
|
|
28
|
+
this.intervalMs = opts?.intervalMs ?? Number(process.env.PLUMB_EXTRACT_INTERVAL_MS ?? 300_000);
|
|
29
|
+
this.batchSize = opts?.batchSize ?? Number(process.env.PLUMB_EXTRACT_BATCH_SIZE ?? 10);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Enqueue an exchange for fact extraction.
|
|
33
|
+
* Triggers early flush if batch size threshold is reached.
|
|
34
|
+
*/
|
|
35
|
+
enqueue(exchange, userId) {
|
|
36
|
+
this.queue.push({ exchange, userId });
|
|
37
|
+
if (this.queue.length >= this.batchSize) {
|
|
38
|
+
void this.flush();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Start the background drain loop.
|
|
43
|
+
* Call this once after construction (e.g., in plugin activate()).
|
|
44
|
+
*/
|
|
45
|
+
start() {
|
|
46
|
+
if (this.timer !== null)
|
|
47
|
+
return; // Already started
|
|
48
|
+
this.timer = setInterval(() => void this.flush(), this.intervalMs);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Stop the background drain loop and flush remaining items.
|
|
52
|
+
* Call this before shutdown (e.g., in plugin session_end or process exit).
|
|
53
|
+
*/
|
|
54
|
+
async stop() {
|
|
55
|
+
if (this.timer !== null) {
|
|
56
|
+
clearInterval(this.timer);
|
|
57
|
+
this.timer = null;
|
|
58
|
+
}
|
|
59
|
+
await this.flush();
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Flush the queue immediately: drain all pending items and call extractFn for each.
|
|
63
|
+
* Uses Promise.allSettled() so one failed extraction doesn't drop others.
|
|
64
|
+
* Safe to call concurrently — only one flush runs at a time.
|
|
65
|
+
*/
|
|
66
|
+
async flush() {
|
|
67
|
+
// Prevent concurrent flush() calls
|
|
68
|
+
if (this.flushing)
|
|
69
|
+
return;
|
|
70
|
+
this.flushing = true;
|
|
71
|
+
try {
|
|
72
|
+
// Snapshot the queue and clear it atomically
|
|
73
|
+
const batch = this.queue.splice(0);
|
|
74
|
+
if (batch.length === 0)
|
|
75
|
+
return;
|
|
76
|
+
// Extract facts for each item in parallel
|
|
77
|
+
await Promise.allSettled(batch.map(item => this.extractFn(item.exchange, item.userId)));
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
this.flushing = false;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=extraction-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extraction-queue.js","sourceRoot":"","sources":["../src/extraction-queue.ts"],"names":[],"mappings":"AAkBA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,eAAe;IAQP;IAPX,KAAK,GAAgB,EAAE,CAAC;IACxB,KAAK,GAA0C,IAAI,CAAC;IAC3C,UAAU,CAAS;IACnB,SAAS,CAAS;IAC3B,QAAQ,GAAG,KAAK,CAAC,CAAC,mCAAmC;IAE7D,YACmB,SAAoB,EACrC,IAA6B;QADZ,cAAS,GAAT,SAAS,CAAW;QAGrC,IAAI,CAAC,UAAU,GAAG,IAAI,EAAE,UAAU,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,OAAO,CAAC,CAAC;QAC/F,IAAI,CAAC,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;IACzF,CAAC;IAED;;;OAGG;IACH,OAAO,CAAC,QAAyB,EAAE,MAAc;QAC/C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QACtC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACxC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI;YAAE,OAAO,CAAC,kBAAkB;QACnD,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACrE,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK;QACT,mCAAmC;QACnC,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAErB,IAAI,CAAC;YACH,6CAA6C;YAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAE/B,0CAA0C;YAC1C,MAAM,OAAO,CAAC,UAAU,CACtB,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAC9D,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;CACF"}
|
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/index.d.ts
CHANGED
|
@@ -5,6 +5,8 @@ export type { RawLogChunk, ScoreResult } from './scorer.js';
|
|
|
5
5
|
export { computeDecay, scoreFact, scoreRawLog } from './scorer.js';
|
|
6
6
|
export { LocalStore } from './local-store.js';
|
|
7
7
|
export type { LocalStoreOptions, RawLogSearchResult, RawFact, RawLogEntry, ExportData } from './local-store.js';
|
|
8
|
+
export { ExtractionQueue } from './extraction-queue.js';
|
|
9
|
+
export type { ExtractFn, ExtractionQueueOptions } from './extraction-queue.js';
|
|
8
10
|
export { extractFacts } from './extractor.js';
|
|
9
11
|
export { callLLM, callLLMWithConfig, resolveAnthropicKey } from './llm-client.js';
|
|
10
12
|
export type { LLMConfig } from './llm-client.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACjG,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAChH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAClF,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACzF,YAAY,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC1G,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACjG,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAChH,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAClF,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACzF,YAAY,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC1G,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { DecayRate } from './types.js';
|
|
2
2
|
export { computeDecay, scoreFact, scoreRawLog } from './scorer.js';
|
|
3
3
|
export { LocalStore } from './local-store.js';
|
|
4
|
+
export { ExtractionQueue } from './extraction-queue.js';
|
|
4
5
|
export { extractFacts } from './extractor.js';
|
|
5
6
|
export { callLLM, callLLMWithConfig, resolveAnthropicKey } from './llm-client.js';
|
|
6
7
|
export { embed, embedQuery, rerankScores, EMBED_DIM } from './embedder.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAElF,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAEzF,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAElF,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAEzF,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/local-store.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
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';
|
|
5
5
|
import { type RawLogSearchResult } from './raw-log-search.js';
|
|
6
|
+
import { ExtractionQueue } from './extraction-queue.js';
|
|
6
7
|
export type { RawLogSearchResult };
|
|
7
8
|
export interface RawFact {
|
|
8
9
|
readonly id: string;
|
|
@@ -46,15 +47,27 @@ export interface LocalStoreOptions {
|
|
|
46
47
|
* instead of reading from environment variables, avoiding process.env mutation.
|
|
47
48
|
*/
|
|
48
49
|
llmConfig?: LLMConfig;
|
|
50
|
+
/**
|
|
51
|
+
* Extraction queue for batched fact extraction. When provided, ingest() enqueues exchanges
|
|
52
|
+
* instead of immediately calling extractFacts(). Defaults to a new ExtractionQueue instance.
|
|
53
|
+
*/
|
|
54
|
+
extractionQueue?: ExtractionQueue;
|
|
49
55
|
}
|
|
50
56
|
export type { LLMConfig };
|
|
51
57
|
export declare class LocalStore implements MemoryStore {
|
|
52
58
|
#private;
|
|
53
59
|
/** Expose database for plugin use (e.g., NudgeManager) */
|
|
54
|
-
get db():
|
|
60
|
+
get db(): WasmDb;
|
|
55
61
|
/** Expose userId for plugin use */
|
|
56
62
|
get userId(): string;
|
|
57
|
-
|
|
63
|
+
/** Expose extraction queue for lifecycle management (start/stop) */
|
|
64
|
+
get extractionQueue(): ExtractionQueue;
|
|
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>;
|
|
58
71
|
store(fact: Omit<Fact, 'id'>): Promise<string>;
|
|
59
72
|
search(query: string, limit?: number): Promise<readonly SearchResult[]>;
|
|
60
73
|
delete(id: string): Promise<void>;
|
|
@@ -66,8 +79,9 @@ export declare class LocalStore implements MemoryStore {
|
|
|
66
79
|
*/
|
|
67
80
|
searchRawLog(query: string, limit?: number): Promise<readonly RawLogSearchResult[]>;
|
|
68
81
|
/**
|
|
69
|
-
* Wait for all
|
|
82
|
+
* Wait for all queued fact extractions to complete.
|
|
70
83
|
* Call this before close() to ensure all async work is done.
|
|
84
|
+
* Delegates to ExtractionQueue.flush().
|
|
71
85
|
*/
|
|
72
86
|
drain(): Promise<void>;
|
|
73
87
|
/**
|
|
@@ -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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"}
|