@getplumb/core 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/embedder.d.ts +9 -4
  2. package/dist/embedder.d.ts.map +1 -1
  3. package/dist/embedder.js +14 -21
  4. package/dist/embedder.js.map +1 -1
  5. package/dist/raw-log-search.d.ts.map +1 -1
  6. package/dist/raw-log-search.js +10 -1
  7. package/dist/raw-log-search.js.map +1 -1
  8. package/package.json +1 -1
  9. package/dist/extraction-queue.d.ts +0 -72
  10. package/dist/extraction-queue.d.ts.map +0 -1
  11. package/dist/extraction-queue.js +0 -101
  12. package/dist/extraction-queue.js.map +0 -1
  13. package/dist/extractor.d.ts +0 -22
  14. package/dist/extractor.d.ts.map +0 -1
  15. package/dist/extractor.js +0 -188
  16. package/dist/extractor.js.map +0 -1
  17. package/dist/extractor.test.d.ts +0 -2
  18. package/dist/extractor.test.d.ts.map +0 -1
  19. package/dist/extractor.test.js +0 -158
  20. package/dist/extractor.test.js.map +0 -1
  21. package/dist/fact-search.d.ts +0 -32
  22. package/dist/fact-search.d.ts.map +0 -1
  23. package/dist/fact-search.js +0 -174
  24. package/dist/fact-search.js.map +0 -1
  25. package/dist/fact-search.test.d.ts +0 -12
  26. package/dist/fact-search.test.d.ts.map +0 -1
  27. package/dist/fact-search.test.js +0 -117
  28. package/dist/fact-search.test.js.map +0 -1
  29. package/dist/llm-client.d.ts +0 -59
  30. package/dist/llm-client.d.ts.map +0 -1
  31. package/dist/llm-client.js +0 -227
  32. package/dist/llm-client.js.map +0 -1
  33. package/dist/local-store.test.d.ts +0 -2
  34. package/dist/local-store.test.d.ts.map +0 -1
  35. package/dist/local-store.test.js +0 -146
  36. package/dist/local-store.test.js.map +0 -1
  37. package/dist/raw-log-search.test.d.ts +0 -12
  38. package/dist/raw-log-search.test.d.ts.map +0 -1
  39. package/dist/raw-log-search.test.js +0 -124
  40. package/dist/raw-log-search.test.js.map +0 -1
  41. package/dist/read-path.test.d.ts +0 -15
  42. package/dist/read-path.test.d.ts.map +0 -1
  43. package/dist/read-path.test.js +0 -393
  44. package/dist/read-path.test.js.map +0 -1
  45. package/dist/scorer.test.d.ts +0 -10
  46. package/dist/scorer.test.d.ts.map +0 -1
  47. package/dist/scorer.test.js +0 -169
  48. package/dist/scorer.test.js.map +0 -1
@@ -31,6 +31,13 @@ export declare function embedQuery(query: string): Promise<Float32Array>;
31
31
  * Returns raw logits (higher = more relevant).
32
32
  * Falls back to zeros if the reranker model is unavailable — callers
33
33
  * should detect all-zero arrays and fall back to RRF order.
34
+ *
35
+ * NOTE: Xenova/ms-marco-MiniLM-L-6-v2 via @xenova/transformers has a known
36
+ * issue where it returns identical score=1 for all inputs regardless of
37
+ * relevance (the pipeline treats the single relevance logit as a binary
38
+ * classification and saturates via sigmoid). Until this is resolved with a
39
+ * different model or library, we return all-zeros to trigger the RRF fallback,
40
+ * which provides correct ranking via BM25+cosine fusion.
34
41
  */
35
42
  export declare function rerankScores(query: string, passages: string[]): Promise<number[]>;
36
43
  /**
@@ -41,10 +48,8 @@ export declare function rerankScores(query: string, passages: string[]): Promise
41
48
  export declare function warmEmbedder(): Promise<void>;
42
49
  /**
43
50
  * Warm the reranker pipeline at initialization time.
44
- * Loads and JIT-compiles the cross-encoder model (~80MB) to eliminate first-query cold-start latency.
45
- * Adds ~200ms to startup and increases memory footprint, but ensures consistent <250ms query performance
46
- * from the first query onward (without warming, first query sees ~360ms, subsequent queries ~210ms).
47
- * No-op if @xenova/transformers is unavailable.
51
+ * Currently a no-op: reranker disabled due to Xenova ms-marco compatibility issue.
52
+ * See rerankScores() comment for details.
48
53
  */
49
54
  export declare function warmReranker(): Promise<void>;
50
55
  //# sourceMappingURL=embedder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"embedder.d.ts","sourceRoot":"","sources":["../src/embedder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,sDAAsD;AACtD,eAAO,MAAM,SAAS,MAAM,CAAC;AA2B7B;;;;GAIG;AACH,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAO/D;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAKrE;AA+BD;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAiBvF;AAED;;;;GAIG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAElD;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAElD"}
1
+ {"version":3,"file":"embedder.d.ts","sourceRoot":"","sources":["../src/embedder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,sDAAsD;AACtD,eAAO,MAAM,SAAS,MAAM,CAAC;AA2B7B;;;;GAIG;AACH,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAO/D;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAKrE;AA+BD;;;;;;;;;;;;GAYG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAKvF;AAED;;;;GAIG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAElD;AAED;;;;GAIG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAElD"}
package/dist/embedder.js CHANGED
@@ -86,24 +86,19 @@ async function getRerankPipeline() {
86
86
  * Returns raw logits (higher = more relevant).
87
87
  * Falls back to zeros if the reranker model is unavailable — callers
88
88
  * should detect all-zero arrays and fall back to RRF order.
89
+ *
90
+ * NOTE: Xenova/ms-marco-MiniLM-L-6-v2 via @xenova/transformers has a known
91
+ * issue where it returns identical score=1 for all inputs regardless of
92
+ * relevance (the pipeline treats the single relevance logit as a binary
93
+ * classification and saturates via sigmoid). Until this is resolved with a
94
+ * different model or library, we return all-zeros to trigger the RRF fallback,
95
+ * which provides correct ranking via BM25+cosine fusion.
89
96
  */
90
97
  export async function rerankScores(query, passages) {
91
- const pipe = await getRerankPipeline();
92
- if (pipe === null || passages.length === 0) {
93
- return passages.map(() => 0);
94
- }
95
- const scores = [];
96
- for (const passage of passages) {
97
- try {
98
- const result = await pipe([query, passage], { function_to_apply: 'none' });
99
- const raw = (Array.isArray(result) ? result[0] : result);
100
- scores.push(raw?.score ?? 0);
101
- }
102
- catch {
103
- scores.push(0);
104
- }
105
- }
106
- return scores;
98
+ // Disabled: reranker produces degenerate scores (all 1.0) due to Xenova
99
+ // pipeline compatibility issue with ms-marco cross-encoders.
100
+ // RRF×recency (BM25 + cosine) fallback is used instead.
101
+ return passages.map(() => 0);
107
102
  }
108
103
  /**
109
104
  * Warm the embedder pipeline at initialization time.
@@ -115,12 +110,10 @@ export async function warmEmbedder() {
115
110
  }
116
111
  /**
117
112
  * Warm the reranker pipeline at initialization time.
118
- * Loads and JIT-compiles the cross-encoder model (~80MB) to eliminate first-query cold-start latency.
119
- * Adds ~200ms to startup and increases memory footprint, but ensures consistent <250ms query performance
120
- * from the first query onward (without warming, first query sees ~360ms, subsequent queries ~210ms).
121
- * No-op if @xenova/transformers is unavailable.
113
+ * Currently a no-op: reranker disabled due to Xenova ms-marco compatibility issue.
114
+ * See rerankScores() comment for details.
122
115
  */
123
116
  export async function warmReranker() {
124
- await getRerankPipeline();
117
+ // No-op: reranker disabled
125
118
  }
126
119
  //# sourceMappingURL=embedder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"embedder.js","sourceRoot":"","sources":["../src/embedder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"embedder.js","sourceRoot":"","sources":["../src/embedder.ts"],"names":[],"mappings":"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"}
@@ -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,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;AAkDD;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAChC,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,KAAK,SAAK,EACV,eAAe,CAAC,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,YAAY,CAAA;CAAE,CAAC,GAClE,OAAO,CAAC,SAAS,kBAAkB,EAAE,CAAC,CA4LxC"}
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;AAkDD;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAChC,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,KAAK,SAAK,EACV,eAAe,CAAC,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,YAAY,CAAA;CAAE,CAAC,GAClE,OAAO,CAAC,SAAS,kBAAkB,EAAE,CAAC,CAqMxC"}
@@ -144,7 +144,16 @@ export async function searchRawLog(db, userId, query, limit = 10, preloadedCorpu
144
144
  // ── 6. Take top candidates for reranking ────────────────────────────────
145
145
  const candidates = decayedScores.slice(0, Math.max(RERANK_TOP_K, limit));
146
146
  // ── 7. Cross-encoder reranking ──────────────────────────────────────────
147
- const passages = candidates.map(([id]) => idToRow.get(id)?.chunk_text ?? '');
147
+ // Truncate passages to 512 chars before reranking — the cross-encoder
148
+ // (ms-marco-MiniLM-L-6-v2) has a 512-token limit and silently truncates
149
+ // longer inputs. Passing multi-kilobyte chunks causes 2–3s latency per
150
+ // call and saturates scores to 1.000 (all signal lost). Truncating to
151
+ // ~512 chars keeps inference fast (~6ms/passage) and restores score variance.
152
+ const RERANKER_MAX_CHARS = 512;
153
+ const passages = candidates.map(([id]) => {
154
+ const text = idToRow.get(id)?.chunk_text ?? '';
155
+ return text.length > RERANKER_MAX_CHARS ? text.slice(0, RERANKER_MAX_CHARS) : text;
156
+ });
148
157
  const rerankerScores = await rerankScores(query, passages);
149
158
  // Detect all-zero fallback (reranker unavailable) → keep RRF×decay order.
150
159
  const hasRerankerSignal = rerankerScores.some((s) => s !== 0);
@@ -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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getplumb/core",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "description": "Plumb memory engine — storage abstraction, types, and local SQLite driver",
5
5
  "license": "MIT",
6
6
  "author": "Clay Waters <hello@plumb.run>",
@@ -1,72 +0,0 @@
1
- import type { MessageExchange, Fact } from './types.js';
2
- /**
3
- * Extraction function signature expected by ExtractionQueue.
4
- * Takes an exchange, userId, and sourceChunkId, returns extracted facts.
5
- * LocalStore binds extractFacts with its own store + llmConfig.
6
- * T-079: Added sourceChunkId to link extracted facts back to raw_log chunk.
7
- */
8
- export type ExtractFn = (exchange: MessageExchange, userId: string, sourceChunkId: string) => Promise<Fact[]>;
9
- export interface ExtractionQueueOptions {
10
- /** Drain interval in milliseconds. Defaults to PLUMB_EXTRACT_INTERVAL_MS env var or 300000 (5 min). */
11
- intervalMs?: number;
12
- /** Max queue size before early flush. Defaults to PLUMB_EXTRACT_BATCH_SIZE env var or 10. */
13
- batchSize?: number;
14
- /**
15
- * Delay between individual extraction calls within a flush batch (ms).
16
- * Defaults to PLUMB_EXTRACT_ITEM_DELAY_MS env var or 6500ms.
17
- * Set to pace requests within LLM provider rate limits (e.g. Gemini free tier: 10 RPM = 1 req/6s).
18
- */
19
- itemDelayMs?: number;
20
- }
21
- /**
22
- * ExtractionQueue — batched fact extraction queue.
23
- *
24
- * Replaces the immediate fire-and-forget extractFacts() call inside ingest() with
25
- * a deferred queue. Raw exchanges are buffered in memory; a background drain loop
26
- * flushes the queue periodically (default 5 min) or when batch size is reached (default 10).
27
- *
28
- * This is a pure cost optimization: one extractFacts() call per exchange, just deferred.
29
- *
30
- * Usage:
31
- * const queue = new ExtractionQueue(extractFn, { intervalMs: 300_000, batchSize: 10 });
32
- * queue.start();
33
- * queue.enqueue(exchange, userId);
34
- * // ... later
35
- * await queue.stop(); // flushes remaining items
36
- *
37
- * @see T-071
38
- */
39
- export declare class ExtractionQueue {
40
- private readonly extractFn;
41
- private queue;
42
- private timer;
43
- private readonly intervalMs;
44
- private readonly batchSize;
45
- private readonly itemDelayMs;
46
- private flushing;
47
- constructor(extractFn: ExtractFn, opts?: ExtractionQueueOptions);
48
- /**
49
- * Enqueue an exchange for fact extraction.
50
- * Triggers early flush if batch size threshold is reached.
51
- * T-079: Added sourceChunkId parameter to link extracted facts back to raw_log chunk.
52
- */
53
- enqueue(exchange: MessageExchange, userId: string, sourceChunkId: string): void;
54
- /**
55
- * Start the background drain loop.
56
- * Call this once after construction (e.g., in plugin activate()).
57
- */
58
- start(): void;
59
- /**
60
- * Stop the background drain loop and flush remaining items.
61
- * Call this before shutdown (e.g., in plugin session_end or process exit).
62
- */
63
- stop(): Promise<void>;
64
- /**
65
- * Flush the queue immediately: drain all pending items and call extractFn for each.
66
- * Uses Promise.allSettled() so one failed extraction doesn't drop others.
67
- * Safe to call concurrently — only one flush runs at a time.
68
- * T-079: Pass sourceChunkId to extractFn for processing state machine.
69
- */
70
- flush(): Promise<void>;
71
- }
72
- //# sourceMappingURL=extraction-queue.d.ts.map
@@ -1 +0,0 @@
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;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,CACtB,QAAQ,EAAE,eAAe,EACzB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,KAClB,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAQrB,MAAM,WAAW,sBAAsB;IACrC,uGAAuG;IACvG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6FAA6F;IAC7F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,eAAe;IASxB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAR5B,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,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAS;gBAGN,SAAS,EAAE,SAAS,EACrC,IAAI,CAAC,EAAE,sBAAsB;IAO/B;;;;OAIG;IACH,OAAO,CAAC,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAO/E;;;OAGG;IACH,KAAK,IAAI,IAAI;IAKb;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B;;;;;OAKG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CA4B7B"}
@@ -1,101 +0,0 @@
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
- itemDelayMs;
26
- flushing = false; // Prevent concurrent flush() calls
27
- constructor(extractFn, opts) {
28
- this.extractFn = extractFn;
29
- this.intervalMs = opts?.intervalMs ?? Number(process.env.PLUMB_EXTRACT_INTERVAL_MS ?? 300_000);
30
- this.batchSize = opts?.batchSize ?? Number(process.env.PLUMB_EXTRACT_BATCH_SIZE ?? 10);
31
- this.itemDelayMs = opts?.itemDelayMs ?? Number(process.env.PLUMB_EXTRACT_ITEM_DELAY_MS ?? 6_500);
32
- }
33
- /**
34
- * Enqueue an exchange for fact extraction.
35
- * Triggers early flush if batch size threshold is reached.
36
- * T-079: Added sourceChunkId parameter to link extracted facts back to raw_log chunk.
37
- */
38
- enqueue(exchange, userId, sourceChunkId) {
39
- this.queue.push({ exchange, userId, sourceChunkId });
40
- if (this.queue.length >= this.batchSize) {
41
- void this.flush();
42
- }
43
- }
44
- /**
45
- * Start the background drain loop.
46
- * Call this once after construction (e.g., in plugin activate()).
47
- */
48
- start() {
49
- if (this.timer !== null)
50
- return; // Already started
51
- this.timer = setInterval(() => void this.flush(), this.intervalMs);
52
- }
53
- /**
54
- * Stop the background drain loop and flush remaining items.
55
- * Call this before shutdown (e.g., in plugin session_end or process exit).
56
- */
57
- async stop() {
58
- if (this.timer !== null) {
59
- clearInterval(this.timer);
60
- this.timer = null;
61
- }
62
- await this.flush();
63
- }
64
- /**
65
- * Flush the queue immediately: drain all pending items and call extractFn for each.
66
- * Uses Promise.allSettled() so one failed extraction doesn't drop others.
67
- * Safe to call concurrently — only one flush runs at a time.
68
- * T-079: Pass sourceChunkId to extractFn for processing state machine.
69
- */
70
- async flush() {
71
- // Prevent concurrent flush() calls
72
- if (this.flushing)
73
- return;
74
- this.flushing = true;
75
- try {
76
- // Snapshot the queue and clear it atomically
77
- const batch = this.queue.splice(0);
78
- if (batch.length === 0)
79
- return;
80
- // Extract facts sequentially with per-item delay to respect LLM provider rate limits.
81
- // (Gemini free tier: 10 RPM → 1 req/6s; default itemDelayMs=6500 gives safe headroom.)
82
- // T-095: Previously used Promise.allSettled() (parallel); switched to sequential to avoid 429s.
83
- for (const item of batch) {
84
- try {
85
- await this.extractFn(item.exchange, item.userId, item.sourceChunkId);
86
- }
87
- catch (err) {
88
- // Log but don't abort the batch — match original Promise.allSettled() behavior
89
- console.error('[plumb/extraction-queue] extractFn error:', err);
90
- }
91
- if (this.itemDelayMs > 0) {
92
- await new Promise(r => setTimeout(r, this.itemDelayMs));
93
- }
94
- }
95
- }
96
- finally {
97
- this.flushing = false;
98
- }
99
- }
100
- }
101
- //# sourceMappingURL=extraction-queue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extraction-queue.js","sourceRoot":"","sources":["../src/extraction-queue.ts"],"names":[],"mappings":"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"}
@@ -1,22 +0,0 @@
1
- import type { MemoryStore } from './store.js';
2
- import { type Fact, type MessageExchange } from './types.js';
3
- /**
4
- * Extract facts from a conversation exchange via an LLM call.
5
- *
6
- * Makes one LLM call, parses the JSON array response, persists each fact via
7
- * the provided store, and returns the stored Fact[].
8
- *
9
- * Dedup strategy: always insert as a new entry — never update an existing fact
10
- * with the same subject+predicate. Decay scoring (T-006) handles ranking.
11
- *
12
- * @param exchange - The conversation exchange to extract facts from.
13
- * @param userId - The user ID to scope facts to (passed to store.store()).
14
- * NOTE: LocalStore captures userId at construction time, so
15
- * this param is accepted here for documentation/future use
16
- * but the store itself enforces the scope.
17
- * @param store - The MemoryStore instance to persist facts into.
18
- * @param llmFn - Optional LLM function to use (injectable for testing).
19
- * @param sourceChunkId - Optional raw_log chunk ID (T-079 processing state machine).
20
- */
21
- export declare function extractFacts(exchange: MessageExchange, _userId: string, store: MemoryStore, llmFn?: (prompt: string) => Promise<string>, sourceChunkId?: string): Promise<Fact[]>;
22
- //# sourceMappingURL=extractor.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../src/extractor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAa,KAAK,IAAI,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AA0JxE;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,WAAW,EAClB,KAAK,GAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAW,EACpD,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,EAAE,CAAC,CAwCjB"}
package/dist/extractor.js DELETED
@@ -1,188 +0,0 @@
1
- import { callLLM } from './llm-client.js';
2
- import { DecayRate } from './types.js';
3
- /** Build the extraction prompt from a conversation exchange. */
4
- function buildExtractionPrompt(exchange) {
5
- return (`Extract facts from this conversation exchange worth recalling in a future session.\n\n` +
6
- `Apply the 30-day recall test: "If I had no memory of this conversation and someone asked me about this user in 30 days, would knowing this fact help me serve them better?"\n\n` +
7
- `User: ${exchange.userMessage}\n` +
8
- `Agent: ${exchange.agentResponse}\n\n` +
9
- `Extraction tiers (prioritize stable, durable facts):\n` +
10
- `Tier 1 (always extract): identity, bio, stable preferences, permanent decisions, named relationships, skills/knowledge\n` +
11
- `Tier 2 (extract if confident): project architecture decisions, tool choices, recurring workflows\n` +
12
- `Tier 3 (skip unless explicitly significant): events, status updates, transient state, anything already tracked in a task or code\n\n` +
13
- `Concrete examples:\n` +
14
- `BAD (skip): "There are 2,162 pending raw_log chunks" — transient state, stale immediately\n` +
15
- `BAD (skip): "Claude Code ran T-018 independently" — event, already in git history\n` +
16
- `BAD (skip): "User registered plumb.run" — event, now complete\n` +
17
- `GOOD (keep): "Clay prefers bullet lists over markdown tables" — stable preference\n` +
18
- `GOOD (keep): "Plumb uses SQLite + WASM for local storage" — durable decision\n` +
19
- `GOOD (keep): "Clay's address is 332 Casper Drive, Lafayette, CO 80026" — identity/bio\n\n` +
20
- `Rules:\n` +
21
- `- Output ONLY a valid JSON array. No prose, no explanation, no markdown fences.\n` +
22
- `- Each item: {"subject": string, "predicate": string, "object": string, "context": string, "confidence": number 0-1, "decay_rate": "slow"|"medium"|"fast"}\n` +
23
- `- decay_rate: slow=identity/stable prefs/decisions, medium=project context/tool choices, fast=transient state\n` +
24
- `- confidence (calibrated — 0.95 is RARE, reserved for permanent facts):\n` +
25
- ` * 0.95: Stable biographical/identity facts, verified permanent data\n` +
26
- ` Example: "Clay lives at 332 Casper Drive, Lafayette, CO 80026" (permanent address)\n` +
27
- ` * 0.85-0.90: Strong stated preferences, confirmed architectural decisions, recurring behavioral patterns\n` +
28
- ` Example: "Clay prefers bullet lists over markdown tables" (stated preference, stable)\n` +
29
- ` * 0.70-0.84: Inferred preferences, situational context, likely-but-not-certain facts\n` +
30
- ` Example: "Clay seems to prefer morning standup calls" (inferred from behavior)\n` +
31
- ` * 0.50-0.69: Speculative observations, one-time mentions, might-be-outdated\n` +
32
- ` Example: "Clay might be considering switching to a new job" (speculative)\n` +
33
- ` * Below 0.50: Do NOT extract — output [] instead (not worth storing)\n` +
34
- `- Output [] liberally — it is better to extract nothing than to extract low-value facts that will pollute future retrieval.\n` +
35
- `- Skip: pleasantries, small talk, transient questions, tool outputs, error messages, current date/time statements, agent operating instructions (what the agent should do/read/reply), session identifiers, heartbeat/cron state, facts about the agent itself (unless the agent has a permanent attribute like a name or email), events already recorded elsewhere (git commits, kanban tasks, emails), transient project state\n` +
36
- `- Extract: identity/bio, stable preferences, permanent decisions, named relationships, skills/knowledge, project architecture (if durable), tool choices (if durable), recurring workflows\n\n` +
37
- `JSON array:`);
38
- }
39
- /**
40
- * Parse a JSON array from LLM output, tolerating markdown code fences and leading prose.
41
- * Returns empty array on any parse failure.
42
- */
43
- function parseJsonArray(text) {
44
- // Find the first '[' and last ']' — extract just that substring
45
- const start = text.indexOf('[');
46
- const end = text.lastIndexOf(']');
47
- if (start === -1 || end === -1 || end < start)
48
- return [];
49
- const jsonSlice = text.slice(start, end + 1).trim();
50
- const parsed = JSON.parse(jsonSlice);
51
- if (!Array.isArray(parsed))
52
- return [];
53
- return parsed;
54
- }
55
- function toDecayRate(raw) {
56
- if (raw === 'slow')
57
- return DecayRate.slow;
58
- if (raw === 'fast')
59
- return DecayRate.fast;
60
- return DecayRate.medium;
61
- }
62
- /**
63
- * Filter out ephemeral and agent-instruction facts that should not be stored.
64
- *
65
- * Blocks noise patterns:
66
- * - Current time/date statements (e.g., 'Current time is Friday...')
67
- * - Session identifiers (e.g., 'Current session is identified by...')
68
- * - Agent operating instructions (e.g., 'Agent should reply HEARTBEAT_OK')
69
- * - Heartbeat/cron state facts
70
- *
71
- * Does NOT block valid facts like:
72
- * - 'Agent is named Terra' (permanent attribute)
73
- * - 'Clay prefers agent to draft emails' (user preference)
74
- */
75
- function isNoiseFact(fact) {
76
- const subjectLower = fact.subject.toLowerCase();
77
- const predicateLower = fact.predicate.toLowerCase();
78
- const objectLower = fact.object.toLowerCase();
79
- // Block ephemeral timestamp subjects
80
- const blockedSubjects = [
81
- 'current time',
82
- 'current date',
83
- 'current session',
84
- 'today',
85
- "today's date",
86
- ];
87
- if (blockedSubjects.some(blocked => subjectLower.includes(blocked))) {
88
- return true;
89
- }
90
- // Block agent imperative predicates (instructions to the agent)
91
- const blockedPredicates = [
92
- 'should reply',
93
- 'must reply',
94
- 'should read',
95
- 'must read',
96
- 'should not infer',
97
- 'must not repeat',
98
- 'should not repeat',
99
- 'must not',
100
- 'should not',
101
- ];
102
- if (blockedPredicates.some(blocked => predicateLower.includes(blocked))) {
103
- return true;
104
- }
105
- // Block Agent + imperative (should/must) combinations
106
- // BUT allow 'Agent is named X' or 'Agent has email X' (permanent attributes)
107
- if (subjectLower === 'agent') {
108
- // If predicate is a permanent attribute verb, allow it
109
- const permanentPredicates = ['is named', 'has email', 'is called', 'name is', 'email is'];
110
- const isPermanentAttribute = permanentPredicates.some(perm => predicateLower.includes(perm));
111
- if (!isPermanentAttribute) {
112
- // Block agent operating instructions
113
- if (predicateLower.includes('should') || predicateLower.includes('must') ||
114
- predicateLower.includes('needs to') || predicateLower.includes('will')) {
115
- return true;
116
- }
117
- }
118
- }
119
- // Block date/time patterns in object field (e.g., '2026-03-06', 'Friday, March 6th, 2026')
120
- const dateTimePattern = /\d{4}-\d{2}-\d{2}|(monday|tuesday|wednesday|thursday|friday|saturday|sunday).*\d{4}|\d{1,2}:\d{2}\s*(am|pm)/i;
121
- if (predicateLower === 'is' && dateTimePattern.test(objectLower)) {
122
- return true;
123
- }
124
- // Block session identifier patterns
125
- if (objectLower.includes('openclaw session') || objectLower.includes('session 0x')) {
126
- return true;
127
- }
128
- // Block heartbeat-related facts
129
- if (subjectLower.includes('heartbeat') || objectLower.includes('heartbeat')) {
130
- return true;
131
- }
132
- return false;
133
- }
134
- /**
135
- * Extract facts from a conversation exchange via an LLM call.
136
- *
137
- * Makes one LLM call, parses the JSON array response, persists each fact via
138
- * the provided store, and returns the stored Fact[].
139
- *
140
- * Dedup strategy: always insert as a new entry — never update an existing fact
141
- * with the same subject+predicate. Decay scoring (T-006) handles ranking.
142
- *
143
- * @param exchange - The conversation exchange to extract facts from.
144
- * @param userId - The user ID to scope facts to (passed to store.store()).
145
- * NOTE: LocalStore captures userId at construction time, so
146
- * this param is accepted here for documentation/future use
147
- * but the store itself enforces the scope.
148
- * @param store - The MemoryStore instance to persist facts into.
149
- * @param llmFn - Optional LLM function to use (injectable for testing).
150
- * @param sourceChunkId - Optional raw_log chunk ID (T-079 processing state machine).
151
- */
152
- export async function extractFacts(exchange, _userId, store, llmFn = callLLM, sourceChunkId) {
153
- const prompt = buildExtractionPrompt(exchange);
154
- const response = await llmFn(prompt);
155
- let rawFacts;
156
- try {
157
- rawFacts = parseJsonArray(response);
158
- }
159
- catch {
160
- console.error('[plumb/extractor] Failed to parse LLM response as JSON array:', response);
161
- return [];
162
- }
163
- const facts = [];
164
- for (const raw of rawFacts) {
165
- // Post-extraction noise filter: discard ephemeral facts before storing
166
- if (isNoiseFact(raw)) {
167
- continue;
168
- }
169
- const factInput = {
170
- subject: String(raw.subject),
171
- predicate: String(raw.predicate),
172
- object: String(raw.object),
173
- confidence: Math.max(0, Math.min(1, Number(raw.confidence))),
174
- decayRate: toDecayRate(String(raw.decay_rate)),
175
- timestamp: new Date(),
176
- sourceSessionId: exchange.sessionId,
177
- ...(exchange.sessionLabel !== undefined ? { sourceSessionLabel: exchange.sessionLabel } : {}),
178
- ...(raw.context !== undefined ? { context: String(raw.context) } : {}),
179
- };
180
- // Dedup: always insert as a new entry (do not update existing same subject+predicate).
181
- // The store always inserts; decay scoring handles which entry wins at retrieval time.
182
- // T-079: Pass sourceChunkId to link fact back to raw_log chunk.
183
- const id = await store.store(factInput, sourceChunkId);
184
- facts.push({ id, ...factInput });
185
- }
186
- return facts;
187
- }
188
- //# sourceMappingURL=extractor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extractor.js","sourceRoot":"","sources":["../src/extractor.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=extractor.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extractor.test.d.ts","sourceRoot":"","sources":["../src/extractor.test.ts"],"names":[],"mappings":""}