@nxuss/lemma 0.9.3 → 1.0.1

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 (93) hide show
  1. package/README.md +35 -4
  2. package/bin/cli.js +97 -0
  3. package/bin/init.js +307 -0
  4. package/cache-proxy.js +191 -0
  5. package/dist/cjs/autopilot/AutopilotWatcher.d.ts +3 -2
  6. package/dist/cjs/autopilot/AutopilotWatcher.d.ts.map +1 -1
  7. package/dist/cjs/autopilot/AutopilotWatcher.js +48 -54
  8. package/dist/cjs/autopilot/AutopilotWatcher.js.map +1 -1
  9. package/dist/cjs/autopilot/Notifier.d.ts +5 -0
  10. package/dist/cjs/autopilot/Notifier.d.ts.map +1 -0
  11. package/dist/cjs/autopilot/Notifier.js +59 -0
  12. package/dist/cjs/autopilot/Notifier.js.map +1 -0
  13. package/dist/cjs/autopilot/PatchStore.d.ts +26 -0
  14. package/dist/cjs/autopilot/PatchStore.d.ts.map +1 -0
  15. package/dist/cjs/autopilot/PatchStore.js +88 -0
  16. package/dist/cjs/autopilot/PatchStore.js.map +1 -0
  17. package/dist/cjs/cli/lemma-proxy.d.ts.map +1 -1
  18. package/dist/cjs/cli/lemma-proxy.js +123 -4
  19. package/dist/cjs/cli/lemma-proxy.js.map +1 -1
  20. package/dist/cjs/mcp/index.js +1 -1
  21. package/dist/cjs/mcp/tools.d.ts.map +1 -1
  22. package/dist/cjs/mcp/tools.js +303 -77
  23. package/dist/cjs/mcp/tools.js.map +1 -1
  24. package/dist/cjs/subconscious/TheBrainV2.d.ts +102 -0
  25. package/dist/cjs/subconscious/TheBrainV2.d.ts.map +1 -0
  26. package/dist/cjs/subconscious/TheBrainV2.js +444 -0
  27. package/dist/cjs/subconscious/TheBrainV2.js.map +1 -0
  28. package/dist/cjs/utils/ContextCollapser.d.ts +21 -0
  29. package/dist/cjs/utils/ContextCollapser.d.ts.map +1 -0
  30. package/dist/cjs/utils/ContextCollapser.js +132 -0
  31. package/dist/cjs/utils/ContextCollapser.js.map +1 -0
  32. package/dist/cjs/utils/ExecutiveReport.d.ts +29 -0
  33. package/dist/cjs/utils/ExecutiveReport.d.ts.map +1 -0
  34. package/dist/cjs/utils/ExecutiveReport.js +111 -0
  35. package/dist/cjs/utils/ExecutiveReport.js.map +1 -0
  36. package/dist/cjs/utils/SurgicalASTInsert.d.ts +21 -0
  37. package/dist/cjs/utils/SurgicalASTInsert.d.ts.map +1 -0
  38. package/dist/cjs/utils/SurgicalASTInsert.js +173 -0
  39. package/dist/cjs/utils/SurgicalASTInsert.js.map +1 -0
  40. package/dist/cjs/utils/SymbolSurgicalContext.d.ts +25 -0
  41. package/dist/cjs/utils/SymbolSurgicalContext.d.ts.map +1 -0
  42. package/dist/cjs/utils/SymbolSurgicalContext.js +265 -0
  43. package/dist/cjs/utils/SymbolSurgicalContext.js.map +1 -0
  44. package/dist/cjs/utils/WormholeCompressor.d.ts +22 -0
  45. package/dist/cjs/utils/WormholeCompressor.d.ts.map +1 -0
  46. package/dist/cjs/utils/WormholeCompressor.js +152 -0
  47. package/dist/cjs/utils/WormholeCompressor.js.map +1 -0
  48. package/dist/esm/autopilot/AutopilotWatcher.d.ts +3 -2
  49. package/dist/esm/autopilot/AutopilotWatcher.d.ts.map +1 -1
  50. package/dist/esm/autopilot/AutopilotWatcher.js +48 -54
  51. package/dist/esm/autopilot/AutopilotWatcher.js.map +1 -1
  52. package/dist/esm/autopilot/Notifier.d.ts +5 -0
  53. package/dist/esm/autopilot/Notifier.d.ts.map +1 -0
  54. package/dist/esm/autopilot/Notifier.js +51 -0
  55. package/dist/esm/autopilot/Notifier.js.map +1 -0
  56. package/dist/esm/autopilot/PatchStore.d.ts +26 -0
  57. package/dist/esm/autopilot/PatchStore.d.ts.map +1 -0
  58. package/dist/esm/autopilot/PatchStore.js +77 -0
  59. package/dist/esm/autopilot/PatchStore.js.map +1 -0
  60. package/dist/esm/cli/lemma-proxy.d.ts.map +1 -1
  61. package/dist/esm/cli/lemma-proxy.js +123 -4
  62. package/dist/esm/cli/lemma-proxy.js.map +1 -1
  63. package/dist/esm/mcp/index.js +1 -1
  64. package/dist/esm/mcp/tools.d.ts.map +1 -1
  65. package/dist/esm/mcp/tools.js +303 -77
  66. package/dist/esm/mcp/tools.js.map +1 -1
  67. package/dist/esm/subconscious/TheBrainV2.d.ts +102 -0
  68. package/dist/esm/subconscious/TheBrainV2.d.ts.map +1 -0
  69. package/dist/esm/subconscious/TheBrainV2.js +431 -0
  70. package/dist/esm/subconscious/TheBrainV2.js.map +1 -0
  71. package/dist/esm/utils/ContextCollapser.d.ts +21 -0
  72. package/dist/esm/utils/ContextCollapser.d.ts.map +1 -0
  73. package/dist/esm/utils/ContextCollapser.js +128 -0
  74. package/dist/esm/utils/ContextCollapser.js.map +1 -0
  75. package/dist/esm/utils/ExecutiveReport.d.ts +29 -0
  76. package/dist/esm/utils/ExecutiveReport.d.ts.map +1 -0
  77. package/dist/esm/utils/ExecutiveReport.js +105 -0
  78. package/dist/esm/utils/ExecutiveReport.js.map +1 -0
  79. package/dist/esm/utils/SurgicalASTInsert.d.ts +21 -0
  80. package/dist/esm/utils/SurgicalASTInsert.d.ts.map +1 -0
  81. package/dist/esm/utils/SurgicalASTInsert.js +134 -0
  82. package/dist/esm/utils/SurgicalASTInsert.js.map +1 -0
  83. package/dist/esm/utils/SymbolSurgicalContext.d.ts +25 -0
  84. package/dist/esm/utils/SymbolSurgicalContext.d.ts.map +1 -0
  85. package/dist/esm/utils/SymbolSurgicalContext.js +226 -0
  86. package/dist/esm/utils/SymbolSurgicalContext.js.map +1 -0
  87. package/dist/esm/utils/WormholeCompressor.d.ts +22 -0
  88. package/dist/esm/utils/WormholeCompressor.d.ts.map +1 -0
  89. package/dist/esm/utils/WormholeCompressor.js +148 -0
  90. package/dist/esm/utils/WormholeCompressor.js.map +1 -0
  91. package/lemma-proxy.cjs +31 -14
  92. package/mcp-server.js +220 -0
  93. package/package.json +7 -2
@@ -0,0 +1,102 @@
1
+ /**
2
+ * TheBrainV2 — Zero-dependency semantic memory engine for Lemma.
3
+ *
4
+ * Replaces: Ollama (embeddings) + ChromaDB (vector store)
5
+ * Algorithm: BM25 (Okapi) + Inverted Index + Bloom Filter + Jaccard re-rank
6
+ * Storage: ~/.lemma-cache/brain/ (NDJSON, no external DB)
7
+ * Latency: <10ms per query (vs ~200ms with Ollama)
8
+ *
9
+ * Compatible with: Claude CLI, Codex, OpenCode, Cursor, Windsurf, Kiro,
10
+ * Cline, VS Code Copilot — any MCP client.
11
+ */
12
+ export interface BrainEntry {
13
+ id: string;
14
+ query: string;
15
+ response: string;
16
+ terms: string[];
17
+ termFreq: Record<string, number>;
18
+ provider: string;
19
+ timestamp: string;
20
+ hits: number;
21
+ charCount: number;
22
+ }
23
+ export interface BrainSearchResult {
24
+ id: string;
25
+ query: string;
26
+ response: string;
27
+ similarity: number;
28
+ provider: string;
29
+ timestamp: string;
30
+ }
31
+ export interface BrainStats {
32
+ totalEntries: number;
33
+ totalTerms: number;
34
+ avgDocLength: number;
35
+ bloomFilterSize: number;
36
+ cacheHits: number;
37
+ cacheMisses: number;
38
+ }
39
+ /**
40
+ * Tokenize text into stemmed, filtered terms.
41
+ * Handles: camelCase splitting, snake_case, stop-word removal, n-grams.
42
+ */
43
+ export declare function tokenize(text: string): string[];
44
+ /**
45
+ * Compute term frequencies for a token list.
46
+ */
47
+ export declare function termFrequencies(terms: string[]): Record<string, number>;
48
+ export declare class BloomFilter {
49
+ private bits;
50
+ constructor(serialized?: string);
51
+ add(item: string): void;
52
+ has(item: string): boolean;
53
+ serialize(): string;
54
+ }
55
+ export declare function bm25Score(queryTerms: string[], docTermFreq: Record<string, number>, docLength: number, avgDocLength: number, idf: Record<string, number>): number;
56
+ /**
57
+ * Jaccard similarity between two term sets.
58
+ */
59
+ export declare function jaccardSimilarity(setA: Set<string>, setB: Set<string>): number;
60
+ export declare class TheBrainV2 {
61
+ private entries;
62
+ private invertedIndex;
63
+ private bloom;
64
+ private avgDocLength;
65
+ private sessionHits;
66
+ private sessionMisses;
67
+ private dirty;
68
+ private flushTimer;
69
+ constructor();
70
+ private ensureDir;
71
+ private load;
72
+ private recalcAvgDocLength;
73
+ private scheduleSave;
74
+ private save;
75
+ /**
76
+ * Store a query+response pair in the brain.
77
+ * Returns false if detected as duplicate (>= dupThreshold similarity).
78
+ */
79
+ store(query: string, response: string, provider?: string, dupThreshold?: number): {
80
+ stored: boolean;
81
+ reason: string;
82
+ duplicate?: BrainSearchResult;
83
+ };
84
+ /**
85
+ * Search brain using BM25 + Jaccard re-ranking.
86
+ * Returns results with similarity scores normalized to 0-1.
87
+ */
88
+ search(query: string, limit?: number, minSimilarity?: number): BrainSearchResult[];
89
+ /**
90
+ * Check if a query is likely a duplicate before storing.
91
+ * Uses bloom filter for O(1) fast-path.
92
+ */
93
+ checkDuplicate(query: string, response: string, threshold?: number): {
94
+ isDuplicate: boolean;
95
+ similarity: number;
96
+ existing?: BrainSearchResult;
97
+ };
98
+ getStats(): BrainStats;
99
+ clear(): void;
100
+ }
101
+ export declare function getBrain(): TheBrainV2;
102
+ //# sourceMappingURL=TheBrainV2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TheBrainV2.d.ts","sourceRoot":"","sources":["../../../src/subconscious/TheBrainV2.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,431 @@
1
+ /**
2
+ * TheBrainV2 — Zero-dependency semantic memory engine for Lemma.
3
+ *
4
+ * Replaces: Ollama (embeddings) + ChromaDB (vector store)
5
+ * Algorithm: BM25 (Okapi) + Inverted Index + Bloom Filter + Jaccard re-rank
6
+ * Storage: ~/.lemma-cache/brain/ (NDJSON, no external DB)
7
+ * Latency: <10ms per query (vs ~200ms with Ollama)
8
+ *
9
+ * Compatible with: Claude CLI, Codex, OpenCode, Cursor, Windsurf, Kiro,
10
+ * Cline, VS Code Copilot — any MCP client.
11
+ */
12
+ import fs from 'fs';
13
+ import path from 'path';
14
+ import os from 'os';
15
+ import crypto from 'crypto';
16
+ // ─── BM25 Constants ───────────────────────────────────────────────────────────
17
+ const BM25_K1 = 1.5; // Term saturation (1.2-2.0)
18
+ const BM25_B = 0.75; // Length normalization (0-1)
19
+ // ─── Storage Paths ────────────────────────────────────────────────────────────
20
+ const BRAIN_DIR = path.join(os.homedir(), '.lemma-cache', 'brain');
21
+ const ENTRIES_FILE = path.join(BRAIN_DIR, 'entries.ndjson');
22
+ const INDEX_FILE = path.join(BRAIN_DIR, 'index.json');
23
+ const META_FILE = path.join(BRAIN_DIR, 'meta.json');
24
+ // ─── Tokenizer ────────────────────────────────────────────────────────────────
25
+ /**
26
+ * Tokenize text into stemmed, filtered terms.
27
+ * Handles: camelCase splitting, snake_case, stop-word removal, n-grams.
28
+ */
29
+ export function tokenize(text) {
30
+ // 1. Split camelCase and PascalCase → "AuthService" → "auth service"
31
+ let normalized = text.replace(/([a-z])([A-Z])/g, '$1 $2');
32
+ // 2. Split snake_case and kebab-case
33
+ normalized = normalized.replace(/[_\-]/g, ' ');
34
+ // 3. Remove punctuation, keep alphanumerics
35
+ normalized = normalized.replace(/[^\w\s]/g, ' ');
36
+ // 4. Lowercase
37
+ normalized = normalized.toLowerCase();
38
+ const STOP_WORDS = new Set([
39
+ 'the', 'a', 'an', 'is', 'in', 'it', 'of', 'to', 'and', 'or', 'for', 'with',
40
+ 'this', 'that', 'these', 'those', 'are', 'was', 'were', 'be', 'been', 'being',
41
+ 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could', 'should',
42
+ 'may', 'might', 'shall', 'can', 'need', 'must', 'from', 'by', 'at', 'on', 'up',
43
+ 'if', 'as', 'so', 'but', 'not', 'no', 'nor', 'yet', 'both', 'either', 'neither',
44
+ 'than', 'then', 'when', 'where', 'which', 'who', 'how', 'what', 'why', 'all',
45
+ 'any', 'each', 'few', 'more', 'most', 'other', 'some', 'such', 'into', 'onto',
46
+ 'off', 'out', 'over', 'under', 'again', 'further', 'once', 'here', 'there',
47
+ ]);
48
+ const terms = normalized
49
+ .split(/\s+/)
50
+ .filter(t => t.length >= 2 && !STOP_WORDS.has(t));
51
+ // 5. Add bigrams for better phrase matching
52
+ const bigrams = [];
53
+ for (let i = 0; i < terms.length - 1; i++) {
54
+ bigrams.push(`${terms[i]}_${terms[i + 1]}`);
55
+ }
56
+ return [...new Set([...terms, ...bigrams])];
57
+ }
58
+ /**
59
+ * Compute term frequencies for a token list.
60
+ */
61
+ export function termFrequencies(terms) {
62
+ const freq = {};
63
+ for (const t of terms) {
64
+ freq[t] = (freq[t] || 0) + 1;
65
+ }
66
+ return freq;
67
+ }
68
+ // ─── Bloom Filter (pure bit-array, no deps) ──────────────────────────────────
69
+ const BLOOM_SIZE = 1 << 18; // 256K bits = 32KB
70
+ const BLOOM_HASHES = 5;
71
+ function bloomHash(item, seed) {
72
+ let h = seed ^ 0xdeadbeef;
73
+ for (let i = 0; i < item.length; i++) {
74
+ h = Math.imul(h ^ item.charCodeAt(i), 0x9e3779b9);
75
+ h ^= h >>> 16;
76
+ }
77
+ return (h >>> 0) % BLOOM_SIZE;
78
+ }
79
+ export class BloomFilter {
80
+ constructor(serialized) {
81
+ this.bits = new Uint8Array(BLOOM_SIZE >> 3);
82
+ if (serialized) {
83
+ const buf = Buffer.from(serialized, 'base64');
84
+ this.bits.set(buf);
85
+ }
86
+ }
87
+ add(item) {
88
+ for (let i = 0; i < BLOOM_HASHES; i++) {
89
+ const pos = bloomHash(item, i * 0x5f3759df);
90
+ this.bits[pos >> 3] |= (1 << (pos & 7));
91
+ }
92
+ }
93
+ has(item) {
94
+ for (let i = 0; i < BLOOM_HASHES; i++) {
95
+ const pos = bloomHash(item, i * 0x5f3759df);
96
+ if (!(this.bits[pos >> 3] & (1 << (pos & 7))))
97
+ return false;
98
+ }
99
+ return true;
100
+ }
101
+ serialize() {
102
+ return Buffer.from(this.bits).toString('base64');
103
+ }
104
+ }
105
+ // ─── BM25 Scorer ─────────────────────────────────────────────────────────────
106
+ export function bm25Score(queryTerms, docTermFreq, docLength, avgDocLength, idf) {
107
+ let score = 0;
108
+ for (const term of queryTerms) {
109
+ if (!(term in docTermFreq))
110
+ continue;
111
+ const tf = docTermFreq[term];
112
+ const termIdf = idf[term] || 0;
113
+ const numerator = tf * (BM25_K1 + 1);
114
+ const denominator = tf + BM25_K1 * (1 - BM25_B + BM25_B * (docLength / avgDocLength));
115
+ score += termIdf * (numerator / denominator);
116
+ }
117
+ return score;
118
+ }
119
+ /**
120
+ * Jaccard similarity between two term sets.
121
+ */
122
+ export function jaccardSimilarity(setA, setB) {
123
+ if (setA.size === 0 && setB.size === 0)
124
+ return 1;
125
+ let intersection = 0;
126
+ for (const t of setA) {
127
+ if (setB.has(t))
128
+ intersection++;
129
+ }
130
+ return intersection / (setA.size + setB.size - intersection);
131
+ }
132
+ // ─── TheBrainV2 ──────────────────────────────────────────────────────────────
133
+ export class TheBrainV2 {
134
+ // ─── Initialization ───────────────────────────────────────────────────────
135
+ constructor() {
136
+ this.entries = new Map();
137
+ this.invertedIndex = new Map(); // term → entry IDs
138
+ this.bloom = new BloomFilter();
139
+ this.avgDocLength = 0;
140
+ this.sessionHits = 0;
141
+ this.sessionMisses = 0;
142
+ this.dirty = false;
143
+ this.flushTimer = null;
144
+ this.ensureDir();
145
+ this.load();
146
+ }
147
+ ensureDir() {
148
+ if (!fs.existsSync(BRAIN_DIR)) {
149
+ fs.mkdirSync(BRAIN_DIR, { recursive: true });
150
+ }
151
+ }
152
+ load() {
153
+ try {
154
+ // Load entries from NDJSON
155
+ if (fs.existsSync(ENTRIES_FILE)) {
156
+ const lines = fs.readFileSync(ENTRIES_FILE, 'utf8').split('\n').filter(Boolean);
157
+ for (const line of lines) {
158
+ try {
159
+ const entry = JSON.parse(line);
160
+ this.entries.set(entry.id, entry);
161
+ }
162
+ catch { /* skip corrupt lines */ }
163
+ }
164
+ }
165
+ // Load inverted index
166
+ if (fs.existsSync(INDEX_FILE)) {
167
+ const raw = JSON.parse(fs.readFileSync(INDEX_FILE, 'utf8'));
168
+ for (const [term, ids] of Object.entries(raw)) {
169
+ this.invertedIndex.set(term, new Set(ids));
170
+ }
171
+ }
172
+ // Load bloom filter and meta
173
+ if (fs.existsSync(META_FILE)) {
174
+ const meta = JSON.parse(fs.readFileSync(META_FILE, 'utf8'));
175
+ if (meta.bloom) {
176
+ this.bloom = new BloomFilter(meta.bloom);
177
+ }
178
+ this.avgDocLength = meta.avgDocLength || 0;
179
+ }
180
+ this.recalcAvgDocLength();
181
+ }
182
+ catch (err) {
183
+ // Brain is empty or corrupt — start fresh
184
+ this.entries.clear();
185
+ this.invertedIndex.clear();
186
+ this.bloom = new BloomFilter();
187
+ }
188
+ }
189
+ recalcAvgDocLength() {
190
+ if (this.entries.size === 0) {
191
+ this.avgDocLength = 0;
192
+ return;
193
+ }
194
+ const total = Array.from(this.entries.values()).reduce((s, e) => s + e.terms.length, 0);
195
+ this.avgDocLength = total / this.entries.size;
196
+ }
197
+ scheduleSave() {
198
+ this.dirty = true;
199
+ if (this.flushTimer)
200
+ return;
201
+ this.flushTimer = setTimeout(() => {
202
+ this.flushTimer = null;
203
+ if (this.dirty)
204
+ this.save();
205
+ }, 500);
206
+ }
207
+ save() {
208
+ try {
209
+ this.ensureDir();
210
+ // Write NDJSON entries
211
+ const ndjson = Array.from(this.entries.values())
212
+ .map(e => JSON.stringify(e))
213
+ .join('\n');
214
+ fs.writeFileSync(ENTRIES_FILE, ndjson, 'utf8');
215
+ // Write inverted index
216
+ const indexObj = {};
217
+ for (const [term, ids] of this.invertedIndex) {
218
+ indexObj[term] = Array.from(ids);
219
+ }
220
+ fs.writeFileSync(INDEX_FILE, JSON.stringify(indexObj), 'utf8');
221
+ // Write meta
222
+ fs.writeFileSync(META_FILE, JSON.stringify({
223
+ bloom: this.bloom.serialize(),
224
+ avgDocLength: this.avgDocLength,
225
+ totalEntries: this.entries.size,
226
+ savedAt: new Date().toISOString(),
227
+ }), 'utf8');
228
+ this.dirty = false;
229
+ }
230
+ catch { /* fail silently */ }
231
+ }
232
+ // ─── Store ────────────────────────────────────────────────────────────────
233
+ /**
234
+ * Store a query+response pair in the brain.
235
+ * Returns false if detected as duplicate (>= dupThreshold similarity).
236
+ */
237
+ store(query, response, provider = 'generic', dupThreshold = 0.92) {
238
+ // Quick bloom check
239
+ const queryKey = query.trim().toLowerCase().substring(0, 200);
240
+ if (this.bloom.has(queryKey)) {
241
+ // Possible duplicate — run full search
242
+ const existing = this.search(query, 1, dupThreshold);
243
+ if (existing.length > 0 && existing[0].similarity >= dupThreshold) {
244
+ return {
245
+ stored: false,
246
+ reason: `Duplicate detected (${(existing[0].similarity * 100).toFixed(1)}% similar)`,
247
+ duplicate: existing[0],
248
+ };
249
+ }
250
+ }
251
+ const terms = tokenize(query + ' ' + response);
252
+ const termFreq = termFrequencies(terms);
253
+ const id = crypto
254
+ .createHash('sha1')
255
+ .update(queryKey + Date.now())
256
+ .digest('hex')
257
+ .substring(0, 12);
258
+ const entry = {
259
+ id,
260
+ query: query.trim(),
261
+ response: response.trim(),
262
+ terms: [...new Set(terms)],
263
+ termFreq,
264
+ provider,
265
+ timestamp: new Date().toISOString(),
266
+ hits: 0,
267
+ charCount: query.length + response.length,
268
+ };
269
+ this.entries.set(id, entry);
270
+ // Update inverted index
271
+ for (const term of entry.terms) {
272
+ if (!this.invertedIndex.has(term)) {
273
+ this.invertedIndex.set(term, new Set());
274
+ }
275
+ this.invertedIndex.get(term).add(id);
276
+ }
277
+ // Update bloom
278
+ this.bloom.add(queryKey);
279
+ this.recalcAvgDocLength();
280
+ this.scheduleSave();
281
+ return { stored: true, reason: 'Stored successfully' };
282
+ }
283
+ // ─── Search ───────────────────────────────────────────────────────────────
284
+ /**
285
+ * Search brain using BM25 + Jaccard re-ranking.
286
+ * Returns results with similarity scores normalized to 0-1.
287
+ */
288
+ search(query, limit = 5, minSimilarity = 0) {
289
+ if (this.entries.size === 0) {
290
+ this.sessionMisses++;
291
+ return [];
292
+ }
293
+ const queryTerms = tokenize(query);
294
+ const queryTermSet = new Set(queryTerms);
295
+ if (queryTerms.length === 0) {
296
+ this.sessionMisses++;
297
+ return [];
298
+ }
299
+ // 1. Compute IDF for query terms
300
+ const N = this.entries.size;
301
+ const idf = {};
302
+ for (const term of queryTerms) {
303
+ const df = this.invertedIndex.get(term)?.size ?? 0;
304
+ idf[term] = df > 0 ? Math.log((N - df + 0.5) / (df + 0.5) + 1) : 0;
305
+ }
306
+ // 2. Candidate retrieval via inverted index (only docs containing at least 1 query term)
307
+ const candidateIds = new Set();
308
+ for (const term of queryTerms) {
309
+ const ids = this.invertedIndex.get(term);
310
+ if (ids) {
311
+ for (const id of ids)
312
+ candidateIds.add(id);
313
+ }
314
+ }
315
+ if (candidateIds.size === 0) {
316
+ this.sessionMisses++;
317
+ return [];
318
+ }
319
+ // 3. Score candidates with BM25
320
+ const scored = [];
321
+ for (const id of candidateIds) {
322
+ const entry = this.entries.get(id);
323
+ if (!entry)
324
+ continue;
325
+ const bm25 = bm25Score(queryTerms, entry.termFreq, entry.terms.length, this.avgDocLength || 10, idf);
326
+ const docTermSet = new Set(entry.terms);
327
+ const jaccard = jaccardSimilarity(queryTermSet, docTermSet);
328
+ scored.push({ entry, bm25, jaccard });
329
+ }
330
+ if (scored.length === 0) {
331
+ this.sessionMisses++;
332
+ return [];
333
+ }
334
+ // 4. Normalize BM25 to 0-1 range
335
+ const maxBm25 = Math.max(...scored.map(s => s.bm25), 1);
336
+ // 5. Combined score: 70% BM25 + 30% Jaccard
337
+ const combined = scored.map(s => ({
338
+ entry: s.entry,
339
+ similarity: (s.bm25 / maxBm25) * 0.7 + s.jaccard * 0.3,
340
+ }));
341
+ // 6. Sort and filter
342
+ combined.sort((a, b) => b.similarity - a.similarity);
343
+ const results = combined
344
+ .filter(r => r.similarity >= minSimilarity)
345
+ .slice(0, limit)
346
+ .map(r => ({
347
+ id: r.entry.id,
348
+ query: r.entry.query,
349
+ response: r.entry.response,
350
+ similarity: Math.min(r.similarity, 1),
351
+ provider: r.entry.provider,
352
+ timestamp: r.entry.timestamp,
353
+ }));
354
+ // 7. Update hit counters
355
+ if (results.length > 0) {
356
+ this.sessionHits++;
357
+ // Increment hit counter on top result (LRU-style freshness)
358
+ const topEntry = this.entries.get(results[0].id);
359
+ if (topEntry) {
360
+ topEntry.hits++;
361
+ this.scheduleSave();
362
+ }
363
+ }
364
+ else {
365
+ this.sessionMisses++;
366
+ }
367
+ return results;
368
+ }
369
+ // ─── Dedup Check ─────────────────────────────────────────────────────────
370
+ /**
371
+ * Check if a query is likely a duplicate before storing.
372
+ * Uses bloom filter for O(1) fast-path.
373
+ */
374
+ checkDuplicate(query, response, threshold = 0.92) {
375
+ const queryKey = query.trim().toLowerCase().substring(0, 200);
376
+ // Fast path: bloom filter says no → definitely not a duplicate
377
+ if (!this.bloom.has(queryKey)) {
378
+ return { isDuplicate: false, similarity: 0 };
379
+ }
380
+ // Slow path: full BM25 search to confirm
381
+ const results = this.search(query, 1, 0);
382
+ if (results.length === 0) {
383
+ return { isDuplicate: false, similarity: 0 };
384
+ }
385
+ const top = results[0];
386
+ let sim = top.similarity;
387
+ if (top.query.trim().toLowerCase() === query.trim().toLowerCase()) {
388
+ sim = 1.0;
389
+ }
390
+ if (sim >= threshold) {
391
+ return { isDuplicate: true, similarity: sim, existing: top };
392
+ }
393
+ return { isDuplicate: false, similarity: sim };
394
+ }
395
+ // ─── Stats ────────────────────────────────────────────────────────────────
396
+ getStats() {
397
+ return {
398
+ totalEntries: this.entries.size,
399
+ totalTerms: this.invertedIndex.size,
400
+ avgDocLength: Math.round(this.avgDocLength),
401
+ bloomFilterSize: BLOOM_SIZE,
402
+ cacheHits: this.sessionHits,
403
+ cacheMisses: this.sessionMisses,
404
+ };
405
+ }
406
+ clear() {
407
+ this.entries.clear();
408
+ this.invertedIndex.clear();
409
+ this.bloom = new BloomFilter();
410
+ this.avgDocLength = 0;
411
+ this.sessionHits = 0;
412
+ this.sessionMisses = 0;
413
+ try {
414
+ if (fs.existsSync(ENTRIES_FILE))
415
+ fs.unlinkSync(ENTRIES_FILE);
416
+ if (fs.existsSync(INDEX_FILE))
417
+ fs.unlinkSync(INDEX_FILE);
418
+ if (fs.existsSync(META_FILE))
419
+ fs.unlinkSync(META_FILE);
420
+ }
421
+ catch { /* ignore */ }
422
+ }
423
+ }
424
+ // ─── Global singleton ────────────────────────────────────────────────────────
425
+ let _brain = null;
426
+ export function getBrain() {
427
+ if (!_brain)
428
+ _brain = new TheBrainV2();
429
+ return _brain;
430
+ }
431
+ //# sourceMappingURL=TheBrainV2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TheBrainV2.js","sourceRoot":"","sources":["../../../src/subconscious/TheBrainV2.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * ContextCollapser — Zero-dependency extraction summarizer for technical logs & history.
3
+ *
4
+ * Replaces: Ollama for summarize_long_text and compress_context.
5
+ * Algorithm: Query-Focused TF-IDF Centroid sentence extraction + Jaccard dedup.
6
+ * Latency: <15ms for 100k characters.
7
+ */
8
+ export interface CollapseOptions {
9
+ maxLength?: number;
10
+ query?: string;
11
+ ratio?: number;
12
+ }
13
+ /**
14
+ * Split text into logical blocks (sentences or log chunks).
15
+ */
16
+ export declare function splitIntoSentences(text: string): string[];
17
+ /**
18
+ * Summarize long text locally by selecting the most semantically dense sentences.
19
+ */
20
+ export declare function collapseContext(text: string, options?: CollapseOptions): string;
21
+ //# sourceMappingURL=ContextCollapser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContextCollapser.d.ts","sourceRoot":"","sources":["../../../src/utils/ContextCollapser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAoBzD;AAcD;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,MAAM,CAyFnF"}