@theihtisham/agent-shadow-brain 6.0.0 → 6.0.3

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 (191) hide show
  1. package/CHANGELOG.md +372 -0
  2. package/README.md +366 -355
  3. package/dist/brain/auto-update.js +1 -1
  4. package/dist/brain/brain-3d.d.ts +79 -0
  5. package/dist/brain/brain-3d.d.ts.map +1 -0
  6. package/dist/brain/brain-3d.js +468 -0
  7. package/dist/brain/brain-3d.js.map +1 -0
  8. package/dist/brain/brain-active-learner.d.ts +74 -0
  9. package/dist/brain/brain-active-learner.d.ts.map +1 -0
  10. package/dist/brain/brain-active-learner.js +425 -0
  11. package/dist/brain/brain-active-learner.js.map +1 -0
  12. package/dist/brain/brain-ascii.d.ts +32 -0
  13. package/dist/brain/brain-ascii.d.ts.map +1 -0
  14. package/dist/brain/brain-ascii.js +402 -0
  15. package/dist/brain/brain-ascii.js.map +1 -0
  16. package/dist/brain/brain-cinema.d.ts +45 -0
  17. package/dist/brain/brain-cinema.d.ts.map +1 -0
  18. package/dist/brain/brain-cinema.js +393 -0
  19. package/dist/brain/brain-cinema.js.map +1 -0
  20. package/dist/brain/brain-coach.d.ts +45 -0
  21. package/dist/brain/brain-coach.d.ts.map +1 -0
  22. package/dist/brain/brain-coach.js +383 -0
  23. package/dist/brain/brain-coach.js.map +1 -0
  24. package/dist/brain/brain-consolidator.d.ts +56 -0
  25. package/dist/brain/brain-consolidator.d.ts.map +1 -0
  26. package/dist/brain/brain-consolidator.js +386 -0
  27. package/dist/brain/brain-consolidator.js.map +1 -0
  28. package/dist/brain/brain-contradictions.d.ts +57 -0
  29. package/dist/brain/brain-contradictions.d.ts.map +1 -0
  30. package/dist/brain/brain-contradictions.js +443 -0
  31. package/dist/brain/brain-contradictions.js.map +1 -0
  32. package/dist/brain/brain-diff.d.ts +61 -0
  33. package/dist/brain/brain-diff.d.ts.map +1 -0
  34. package/dist/brain/brain-diff.js +439 -0
  35. package/dist/brain/brain-diff.js.map +1 -0
  36. package/dist/brain/brain-dna.d.ts +59 -0
  37. package/dist/brain/brain-dna.d.ts.map +1 -0
  38. package/dist/brain/brain-dna.js +336 -0
  39. package/dist/brain/brain-dna.js.map +1 -0
  40. package/dist/brain/brain-doppelganger.d.ts +32 -0
  41. package/dist/brain/brain-doppelganger.d.ts.map +1 -0
  42. package/dist/brain/brain-doppelganger.js +417 -0
  43. package/dist/brain/brain-doppelganger.js.map +1 -0
  44. package/dist/brain/brain-graph-walker.d.ts +54 -0
  45. package/dist/brain/brain-graph-walker.d.ts.map +1 -0
  46. package/dist/brain/brain-graph-walker.js +412 -0
  47. package/dist/brain/brain-graph-walker.js.map +1 -0
  48. package/dist/brain/brain-holiday-card.d.ts +50 -0
  49. package/dist/brain/brain-holiday-card.d.ts.map +1 -0
  50. package/dist/brain/brain-holiday-card.js +432 -0
  51. package/dist/brain/brain-holiday-card.js.map +1 -0
  52. package/dist/brain/brain-memes.d.ts +44 -0
  53. package/dist/brain/brain-memes.d.ts.map +1 -0
  54. package/dist/brain/brain-memes.js +438 -0
  55. package/dist/brain/brain-memes.js.map +1 -0
  56. package/dist/brain/brain-memory-tiers.d.ts +67 -0
  57. package/dist/brain/brain-memory-tiers.d.ts.map +1 -0
  58. package/dist/brain/brain-memory-tiers.js +292 -0
  59. package/dist/brain/brain-memory-tiers.js.map +1 -0
  60. package/dist/brain/brain-notebook.d.ts +68 -0
  61. package/dist/brain/brain-notebook.d.ts.map +1 -0
  62. package/dist/brain/brain-notebook.js +379 -0
  63. package/dist/brain/brain-notebook.js.map +1 -0
  64. package/dist/brain/brain-portability.js +3 -3
  65. package/dist/brain/brain-portability.js.map +1 -1
  66. package/dist/brain/brain-quantize.d.ts +62 -0
  67. package/dist/brain/brain-quantize.d.ts.map +1 -0
  68. package/dist/brain/brain-quantize.js +346 -0
  69. package/dist/brain/brain-quantize.js.map +1 -0
  70. package/dist/brain/brain-query-expander.d.ts +31 -0
  71. package/dist/brain/brain-query-expander.d.ts.map +1 -0
  72. package/dist/brain/brain-query-expander.js +417 -0
  73. package/dist/brain/brain-query-expander.js.map +1 -0
  74. package/dist/brain/brain-quest.d.ts +58 -0
  75. package/dist/brain/brain-quest.d.ts.map +1 -0
  76. package/dist/brain/brain-quest.js +541 -0
  77. package/dist/brain/brain-quest.js.map +1 -0
  78. package/dist/brain/brain-recall-cache.d.ts +73 -0
  79. package/dist/brain/brain-recall-cache.d.ts.map +1 -0
  80. package/dist/brain/brain-recall-cache.js +444 -0
  81. package/dist/brain/brain-recall-cache.js.map +1 -0
  82. package/dist/brain/brain-reflex.d.ts +55 -0
  83. package/dist/brain/brain-reflex.d.ts.map +1 -0
  84. package/dist/brain/brain-reflex.js +364 -0
  85. package/dist/brain/brain-reflex.js.map +1 -0
  86. package/dist/brain/brain-replay.d.ts +74 -0
  87. package/dist/brain/brain-replay.d.ts.map +1 -0
  88. package/dist/brain/brain-replay.js +336 -0
  89. package/dist/brain/brain-replay.js.map +1 -0
  90. package/dist/brain/brain-rerank.d.ts +39 -0
  91. package/dist/brain/brain-rerank.d.ts.map +1 -0
  92. package/dist/brain/brain-rerank.js +216 -0
  93. package/dist/brain/brain-rerank.js.map +1 -0
  94. package/dist/brain/brain-roast.d.ts +44 -0
  95. package/dist/brain/brain-roast.d.ts.map +1 -0
  96. package/dist/brain/brain-roast.js +566 -0
  97. package/dist/brain/brain-roast.js.map +1 -0
  98. package/dist/brain/brain-sonification.d.ts +57 -0
  99. package/dist/brain/brain-sonification.d.ts.map +1 -0
  100. package/dist/brain/brain-sonification.js +286 -0
  101. package/dist/brain/brain-sonification.js.map +1 -0
  102. package/dist/brain/brain-tarot.d.ts +49 -0
  103. package/dist/brain/brain-tarot.d.ts.map +1 -0
  104. package/dist/brain/brain-tarot.js +634 -0
  105. package/dist/brain/brain-tarot.js.map +1 -0
  106. package/dist/brain/brain-time-capsule.d.ts +80 -0
  107. package/dist/brain/brain-time-capsule.d.ts.map +1 -0
  108. package/dist/brain/brain-time-capsule.js +289 -0
  109. package/dist/brain/brain-time-capsule.js.map +1 -0
  110. package/dist/brain/brain-trophies.d.ts +60 -0
  111. package/dist/brain/brain-trophies.d.ts.map +1 -0
  112. package/dist/brain/brain-trophies.js +431 -0
  113. package/dist/brain/brain-trophies.js.map +1 -0
  114. package/dist/brain/brain-working-memory.d.ts +78 -0
  115. package/dist/brain/brain-working-memory.d.ts.map +1 -0
  116. package/dist/brain/brain-working-memory.js +367 -0
  117. package/dist/brain/brain-working-memory.js.map +1 -0
  118. package/dist/brain/confidence-gate.d.ts +69 -0
  119. package/dist/brain/confidence-gate.d.ts.map +1 -0
  120. package/dist/brain/confidence-gate.js +244 -0
  121. package/dist/brain/confidence-gate.js.map +1 -0
  122. package/dist/brain/constitution.d.ts +59 -0
  123. package/dist/brain/constitution.d.ts.map +1 -0
  124. package/dist/brain/constitution.js +315 -0
  125. package/dist/brain/constitution.js.map +1 -0
  126. package/dist/brain/context-continuity.d.ts +78 -0
  127. package/dist/brain/context-continuity.d.ts.map +1 -0
  128. package/dist/brain/context-continuity.js +341 -0
  129. package/dist/brain/context-continuity.js.map +1 -0
  130. package/dist/brain/embeddings-v2.d.ts +58 -0
  131. package/dist/brain/embeddings-v2.d.ts.map +1 -0
  132. package/dist/brain/embeddings-v2.js +344 -0
  133. package/dist/brain/embeddings-v2.js.map +1 -0
  134. package/dist/brain/global-brain.d.ts.map +1 -1
  135. package/dist/brain/global-brain.js +35 -9
  136. package/dist/brain/global-brain.js.map +1 -1
  137. package/dist/brain/hive-voice.d.ts +71 -0
  138. package/dist/brain/hive-voice.d.ts.map +1 -0
  139. package/dist/brain/hive-voice.js +352 -0
  140. package/dist/brain/hive-voice.js.map +1 -0
  141. package/dist/brain/live-brain.d.ts +119 -0
  142. package/dist/brain/live-brain.d.ts.map +1 -0
  143. package/dist/brain/live-brain.js +405 -0
  144. package/dist/brain/live-brain.js.map +1 -0
  145. package/dist/brain/markdown-export.d.ts +48 -0
  146. package/dist/brain/markdown-export.d.ts.map +1 -0
  147. package/dist/brain/markdown-export.js +382 -0
  148. package/dist/brain/markdown-export.js.map +1 -0
  149. package/dist/brain/mcp-server.d.ts +4 -0
  150. package/dist/brain/mcp-server.d.ts.map +1 -1
  151. package/dist/brain/mcp-server.js +81 -5
  152. package/dist/brain/mcp-server.js.map +1 -1
  153. package/dist/brain/memory-seeder.d.ts +78 -0
  154. package/dist/brain/memory-seeder.d.ts.map +1 -0
  155. package/dist/brain/memory-seeder.js +326 -0
  156. package/dist/brain/memory-seeder.js.map +1 -0
  157. package/dist/brain/multimodal-vision.d.ts +38 -0
  158. package/dist/brain/multimodal-vision.d.ts.map +1 -0
  159. package/dist/brain/multimodal-vision.js +257 -0
  160. package/dist/brain/multimodal-vision.js.map +1 -0
  161. package/dist/brain/orchestrator.js +1 -1
  162. package/dist/brain/otel-lite.d.ts +71 -0
  163. package/dist/brain/otel-lite.d.ts.map +1 -0
  164. package/dist/brain/otel-lite.js +232 -0
  165. package/dist/brain/otel-lite.js.map +1 -0
  166. package/dist/brain/token-economy.d.ts +2 -0
  167. package/dist/brain/token-economy.d.ts.map +1 -1
  168. package/dist/brain/token-economy.js +80 -24
  169. package/dist/brain/token-economy.js.map +1 -1
  170. package/dist/cli.js +1120 -32
  171. package/dist/cli.js.map +1 -1
  172. package/dist/dashboard/server.d.ts +5 -0
  173. package/dist/dashboard/server.d.ts.map +1 -1
  174. package/dist/dashboard/server.js +355 -2
  175. package/dist/dashboard/server.js.map +1 -1
  176. package/dist/dashboard/v6-dashboard-html.d.ts +1 -1
  177. package/dist/dashboard/v6-dashboard-html.d.ts.map +1 -1
  178. package/dist/dashboard/v6-dashboard-html.js +755 -85
  179. package/dist/dashboard/v6-dashboard-html.js.map +1 -1
  180. package/dist/index.d.ts +4 -0
  181. package/dist/index.d.ts.map +1 -1
  182. package/dist/index.js +4 -0
  183. package/dist/index.js.map +1 -1
  184. package/dist/types.d.ts +17 -12
  185. package/dist/types.d.ts.map +1 -1
  186. package/docs/launch/README.md +61 -0
  187. package/docs/launch/RELEASE_CHECKLIST_v6.0.3.md +102 -0
  188. package/docs/launch/RELEASE_NOTES_v6.0.3.md +111 -0
  189. package/package.json +25 -13
  190. package/tools/export-resume-pack.mjs +56 -0
  191. package/tools/record-global-memory.mjs +72 -0
@@ -0,0 +1,444 @@
1
+ // src/brain/brain-recall-cache.ts — Bloom-prefiltered, context-aware recall cache
2
+ // v6.0.2 — Hive Mind Edition
3
+ //
4
+ // General-purpose cache for ANY brain query (working-memory is the "in-context"
5
+ // fast tier; this is the broader cache). Architecture:
6
+ //
7
+ // 1. Bloom filter (65536 bits, 4 hash strategies: FNV-1a, djb2, sdbm, xor-roll)
8
+ // → instantly rejects obvious misses before paying the ANN cost.
9
+ // 2. LRU map (2048 entries, doubly-linked-list + Map for O(1) ops)
10
+ // keyed by hash(query) + contextHash. Bumping contextHash invalidates a
11
+ // whole brain-version generation.
12
+ // 3. Smart invalidation on writes: reverse index memoryId → cachedKeys.
13
+ // When `observeWrite(memId)` fires, only the affected entries are pruned.
14
+ //
15
+ // Stats (not contents) are persisted to ~/.shadow-brain/recall-cache.stats.json
16
+ // so reset-on-restart doesn't lose long-running hit-rate observability.
17
+ //
18
+ // Exposed: BrainRecallCache, getBrainRecallCache(),
19
+ // resetBrainRecallCacheForTests().
20
+ import * as fs from 'fs';
21
+ import * as path from 'path';
22
+ import * as os from 'os';
23
+ const STATS_DIR = path.join(os.homedir(), '.shadow-brain');
24
+ const STATS_PATH = path.join(STATS_DIR, 'recall-cache.stats.json');
25
+ const CONFIG_PATH = path.join(STATS_DIR, 'config.json');
26
+ const DEFAULT_LRU_CAPACITY = 2048;
27
+ const MAX_LRU_CAPACITY = 16384;
28
+ const BLOOM_BITS = 65536; // 8 KB
29
+ const BLOOM_HASH_FUNCTIONS = 4;
30
+ const DEFAULT_TTL_MS = 30 * 60 * 1000; // 30m
31
+ const STATS_PERSIST_EVERY = 50;
32
+ // ── Bloom filter ─────────────────────────────────────────────────────────────
33
+ class BloomFilter {
34
+ constructor(numBits = BLOOM_BITS, k = BLOOM_HASH_FUNCTIONS) {
35
+ this.inserted = 0;
36
+ this.numBits = numBits;
37
+ this.k = k;
38
+ this.bits = new Uint8Array(numBits >>> 3);
39
+ }
40
+ add(key) {
41
+ for (const idx of this.indices(key))
42
+ this.setBit(idx);
43
+ this.inserted++;
44
+ }
45
+ /** True if the key *might* be present. False = definitely not. */
46
+ has(key) {
47
+ for (const idx of this.indices(key))
48
+ if (!this.getBit(idx))
49
+ return false;
50
+ return true;
51
+ }
52
+ clear() {
53
+ this.bits.fill(0);
54
+ this.inserted = 0;
55
+ }
56
+ /** Approximate false-positive probability given current load. */
57
+ fpRate() {
58
+ if (this.inserted === 0)
59
+ return 0;
60
+ // (1 - e^(-k*n/m))^k
61
+ const ratio = (this.k * this.inserted) / this.numBits;
62
+ const p = Math.pow(1 - Math.exp(-ratio), this.k);
63
+ return +p.toFixed(5);
64
+ }
65
+ indices(key) {
66
+ // 4 independent hashes — strategies are intentionally different so
67
+ // correlated keys spread out.
68
+ const h1 = hashFnv1a(key) % this.numBits;
69
+ const h2 = hashDjb2(key) % this.numBits;
70
+ const h3 = hashSdbm(key) % this.numBits;
71
+ const h4 = hashXorRoll(key) % this.numBits;
72
+ return [h1, h2, h3, h4].slice(0, this.k);
73
+ }
74
+ setBit(idx) {
75
+ const byte = idx >>> 3;
76
+ const bit = idx & 7;
77
+ this.bits[byte] |= (1 << bit);
78
+ }
79
+ getBit(idx) {
80
+ const byte = idx >>> 3;
81
+ const bit = idx & 7;
82
+ return (this.bits[byte] & (1 << bit)) !== 0;
83
+ }
84
+ }
85
+ // ── Cache ────────────────────────────────────────────────────────────────────
86
+ export class BrainRecallCache {
87
+ constructor() {
88
+ this.capacity = DEFAULT_LRU_CAPACITY;
89
+ this.map = new Map();
90
+ this.head = null; // most recent
91
+ this.tail = null; // least recent
92
+ this.bloom = new BloomFilter();
93
+ /** memoryId → set of cache keys that referenced it. */
94
+ this.memToKeys = new Map();
95
+ /** project → set of cache keys (for project-scoped invalidation). */
96
+ this.projectToKeys = new Map();
97
+ this.hits = 0;
98
+ this.misses = 0;
99
+ this.bloomNegatives = 0;
100
+ /** Count where bloom said "maybe" but LRU said "no" → false positive. */
101
+ this.bloomFalsePositives = 0;
102
+ this.evictions = 0;
103
+ this.writesSincePersist = 0;
104
+ this.initialized = false;
105
+ }
106
+ init() {
107
+ if (this.initialized)
108
+ return;
109
+ try {
110
+ fs.mkdirSync(STATS_DIR, { recursive: true });
111
+ }
112
+ catch { /* non-fatal */ }
113
+ this.loadConfig();
114
+ this.loadStats();
115
+ this.initialized = true;
116
+ }
117
+ /** Look up a cached entry. contextHash filters by brain state version. */
118
+ lookup(key, contextHash) {
119
+ this.init();
120
+ const ck = composeKey(key, contextHash);
121
+ if (!this.bloom.has(ck)) {
122
+ this.misses++;
123
+ this.bloomNegatives++;
124
+ return null;
125
+ }
126
+ const node = this.map.get(ck);
127
+ if (!node) {
128
+ // Bloom said maybe, LRU said no — counted as a bloom FP.
129
+ this.misses++;
130
+ this.bloomFalsePositives++;
131
+ return null;
132
+ }
133
+ // TTL check.
134
+ const v = node.value;
135
+ if (v.ttlMs > 0 && Date.now() - v.storedAt > v.ttlMs) {
136
+ this.removeNode(node);
137
+ this.map.delete(ck);
138
+ this.untrackKey(ck, v);
139
+ this.misses++;
140
+ return null;
141
+ }
142
+ // ContextHash mismatch is impossible by construction (it's in the key),
143
+ // but double-check for safety.
144
+ if (contextHash !== undefined && v.contextHash !== contextHash) {
145
+ this.misses++;
146
+ return null;
147
+ }
148
+ this.touch(node);
149
+ this.hits++;
150
+ return v;
151
+ }
152
+ put(key, contextHash, result, ttlMs, opts) {
153
+ this.init();
154
+ const ck = composeKey(key, contextHash);
155
+ const value = {
156
+ result,
157
+ storedAt: Date.now(),
158
+ ttlMs: ttlMs ?? DEFAULT_TTL_MS,
159
+ contextHash,
160
+ memoryIds: opts?.memoryIds ? Array.from(new Set(opts.memoryIds)) : [],
161
+ project: opts?.project,
162
+ };
163
+ const existing = this.map.get(ck);
164
+ if (existing) {
165
+ this.untrackKey(ck, existing.value);
166
+ existing.value = value;
167
+ this.touch(existing);
168
+ }
169
+ else {
170
+ const node = { key: ck, value, prev: null, next: null };
171
+ this.map.set(ck, node);
172
+ this.addToFront(node);
173
+ this.bloom.add(ck);
174
+ while (this.map.size > this.capacity)
175
+ this.evictLru();
176
+ }
177
+ this.trackKey(ck, value);
178
+ this.writesSincePersist++;
179
+ if (this.writesSincePersist >= STATS_PERSIST_EVERY) {
180
+ this.writesSincePersist = 0;
181
+ this.persistStats().catch(() => { });
182
+ }
183
+ }
184
+ invalidate(opts) {
185
+ this.init();
186
+ let count = 0;
187
+ const drop = (k) => {
188
+ const n = this.map.get(k);
189
+ if (!n)
190
+ return;
191
+ this.removeNode(n);
192
+ this.map.delete(k);
193
+ this.untrackKey(k, n.value);
194
+ count++;
195
+ };
196
+ if (opts.key !== undefined && opts.contextHash !== undefined) {
197
+ drop(composeKey(opts.key, opts.contextHash));
198
+ }
199
+ else if (opts.key !== undefined) {
200
+ // Drop all entries whose raw key matches, across any contextHash.
201
+ for (const k of Array.from(this.map.keys())) {
202
+ if (k.startsWith(opts.key + '|'))
203
+ drop(k);
204
+ }
205
+ }
206
+ else if (opts.contextHash !== undefined) {
207
+ for (const k of Array.from(this.map.keys())) {
208
+ if (k.endsWith('|' + opts.contextHash))
209
+ drop(k);
210
+ }
211
+ }
212
+ else if (opts.project !== undefined) {
213
+ const keys = this.projectToKeys.get(opts.project);
214
+ if (keys)
215
+ for (const k of Array.from(keys))
216
+ drop(k);
217
+ }
218
+ else if (opts.before !== undefined) {
219
+ for (const k of Array.from(this.map.keys())) {
220
+ const n = this.map.get(k);
221
+ if (n && n.value.storedAt < opts.before)
222
+ drop(k);
223
+ }
224
+ }
225
+ // If we cleared a meaningful chunk, rebuild bloom from remaining keys.
226
+ if (count > 0 && (count > 8 || this.map.size === 0))
227
+ this.rebuildBloom();
228
+ return { invalidated: count };
229
+ }
230
+ /** Call when a brain memory is added/updated → prune any cached top-N that referenced it. */
231
+ observeWrite(memoryId) {
232
+ this.init();
233
+ const keys = this.memToKeys.get(memoryId);
234
+ if (!keys || keys.size === 0)
235
+ return;
236
+ let removed = 0;
237
+ for (const k of Array.from(keys)) {
238
+ const n = this.map.get(k);
239
+ if (!n)
240
+ continue;
241
+ this.removeNode(n);
242
+ this.map.delete(k);
243
+ this.untrackKey(k, n.value);
244
+ removed++;
245
+ }
246
+ this.memToKeys.delete(memoryId);
247
+ if (removed > 8)
248
+ this.rebuildBloom();
249
+ }
250
+ stats() {
251
+ this.init();
252
+ const total = this.hits + this.misses;
253
+ const hitRate = total > 0 ? +(this.hits / total).toFixed(4) : 0;
254
+ return {
255
+ hits: this.hits,
256
+ misses: this.misses,
257
+ hitRate,
258
+ bloomFP: this.bloom.fpRate(),
259
+ evictions: this.evictions,
260
+ size: this.map.size,
261
+ };
262
+ }
263
+ /** Wipe contents and metrics. Stats file is removed. */
264
+ reset() {
265
+ this.map.clear();
266
+ this.memToKeys.clear();
267
+ this.projectToKeys.clear();
268
+ this.bloom.clear();
269
+ this.head = null;
270
+ this.tail = null;
271
+ this.hits = 0;
272
+ this.misses = 0;
273
+ this.bloomNegatives = 0;
274
+ this.bloomFalsePositives = 0;
275
+ this.evictions = 0;
276
+ this.writesSincePersist = 0;
277
+ try {
278
+ if (fs.existsSync(STATS_PATH))
279
+ fs.unlinkSync(STATS_PATH);
280
+ }
281
+ catch { /* non-fatal */ }
282
+ }
283
+ // ── Internals ─────────────────────────────────────────────────────────
284
+ trackKey(ck, value) {
285
+ for (const mid of value.memoryIds) {
286
+ let set = this.memToKeys.get(mid);
287
+ if (!set) {
288
+ set = new Set();
289
+ this.memToKeys.set(mid, set);
290
+ }
291
+ set.add(ck);
292
+ }
293
+ if (value.project) {
294
+ let set = this.projectToKeys.get(value.project);
295
+ if (!set) {
296
+ set = new Set();
297
+ this.projectToKeys.set(value.project, set);
298
+ }
299
+ set.add(ck);
300
+ }
301
+ }
302
+ untrackKey(ck, value) {
303
+ for (const mid of value.memoryIds) {
304
+ const set = this.memToKeys.get(mid);
305
+ if (set) {
306
+ set.delete(ck);
307
+ if (set.size === 0)
308
+ this.memToKeys.delete(mid);
309
+ }
310
+ }
311
+ if (value.project) {
312
+ const set = this.projectToKeys.get(value.project);
313
+ if (set) {
314
+ set.delete(ck);
315
+ if (set.size === 0)
316
+ this.projectToKeys.delete(value.project);
317
+ }
318
+ }
319
+ }
320
+ evictLru() {
321
+ const lru = this.tail;
322
+ if (!lru)
323
+ return;
324
+ this.removeNode(lru);
325
+ this.map.delete(lru.key);
326
+ this.untrackKey(lru.key, lru.value);
327
+ this.evictions++;
328
+ }
329
+ touch(node) {
330
+ if (node === this.head)
331
+ return;
332
+ this.removeNode(node);
333
+ this.addToFront(node);
334
+ }
335
+ addToFront(node) {
336
+ node.prev = null;
337
+ node.next = this.head;
338
+ if (this.head)
339
+ this.head.prev = node;
340
+ this.head = node;
341
+ if (!this.tail)
342
+ this.tail = node;
343
+ }
344
+ removeNode(node) {
345
+ if (node.prev)
346
+ node.prev.next = node.next;
347
+ else
348
+ this.head = node.next;
349
+ if (node.next)
350
+ node.next.prev = node.prev;
351
+ else
352
+ this.tail = node.prev;
353
+ node.prev = null;
354
+ node.next = null;
355
+ }
356
+ rebuildBloom() {
357
+ this.bloom.clear();
358
+ for (const k of this.map.keys())
359
+ this.bloom.add(k);
360
+ }
361
+ loadConfig() {
362
+ try {
363
+ if (!fs.existsSync(CONFIG_PATH))
364
+ return;
365
+ const raw = JSON.parse(fs.readFileSync(CONFIG_PATH, 'utf-8'));
366
+ const cap = raw.recallCache?.capacity;
367
+ if (typeof cap === 'number' && cap > 0 && cap <= MAX_LRU_CAPACITY)
368
+ this.capacity = Math.floor(cap);
369
+ }
370
+ catch { /* defaults */ }
371
+ }
372
+ loadStats() {
373
+ try {
374
+ if (!fs.existsSync(STATS_PATH))
375
+ return;
376
+ const raw = JSON.parse(fs.readFileSync(STATS_PATH, 'utf-8'));
377
+ this.hits = raw.hits ?? 0;
378
+ this.misses = raw.misses ?? 0;
379
+ this.evictions = raw.evictions ?? 0;
380
+ this.bloomNegatives = raw.bloomNegatives ?? 0;
381
+ this.bloomFalsePositives = raw.bloomFalsePositives ?? 0;
382
+ }
383
+ catch { /* skip */ }
384
+ }
385
+ async persistStats() {
386
+ try {
387
+ const total = this.hits + this.misses;
388
+ const payload = {
389
+ hits: this.hits,
390
+ misses: this.misses,
391
+ hitRate: total > 0 ? +(this.hits / total).toFixed(4) : 0,
392
+ bloomFP: this.bloom.fpRate(),
393
+ bloomNegatives: this.bloomNegatives,
394
+ bloomFalsePositives: this.bloomFalsePositives,
395
+ evictions: this.evictions,
396
+ size: this.map.size,
397
+ savedAt: Date.now(),
398
+ };
399
+ const tmp = STATS_PATH + '.tmp';
400
+ fs.writeFileSync(tmp, JSON.stringify(payload, null, 2));
401
+ fs.renameSync(tmp, STATS_PATH);
402
+ }
403
+ catch { /* non-fatal */ }
404
+ }
405
+ }
406
+ // ── Key + Hashes ────────────────────────────────────────────────────────────
407
+ function composeKey(key, contextHash) {
408
+ const ch = (contextHash ?? '').trim();
409
+ return key + '|' + ch;
410
+ }
411
+ function hashFnv1a(s) {
412
+ let h = 2166136261;
413
+ for (let i = 0; i < s.length; i++)
414
+ h = Math.imul(h ^ s.charCodeAt(i), 16777619);
415
+ return h >>> 0;
416
+ }
417
+ function hashDjb2(s) {
418
+ let h = 5381;
419
+ for (let i = 0; i < s.length; i++)
420
+ h = (Math.imul(h, 33) + s.charCodeAt(i)) | 0;
421
+ return h >>> 0;
422
+ }
423
+ function hashSdbm(s) {
424
+ let h = 0;
425
+ for (let i = 0; i < s.length; i++)
426
+ h = (s.charCodeAt(i) + (h << 6) + (h << 16) - h) | 0;
427
+ return h >>> 0;
428
+ }
429
+ function hashXorRoll(s) {
430
+ let h = 0x811c9dc5;
431
+ for (let i = 0; i < s.length; i++) {
432
+ h = ((h << 5) | (h >>> 27)) ^ s.charCodeAt(i);
433
+ h = Math.imul(h, 0x01000193);
434
+ }
435
+ return h >>> 0;
436
+ }
437
+ let _instance = null;
438
+ export function getBrainRecallCache() {
439
+ if (!_instance)
440
+ _instance = new BrainRecallCache();
441
+ return _instance;
442
+ }
443
+ export function resetBrainRecallCacheForTests() { _instance = null; }
444
+ //# sourceMappingURL=brain-recall-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-recall-cache.js","sourceRoot":"","sources":["../../src/brain/brain-recall-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ export interface CompletionContext {
2
+ prefix: string;
3
+ language?: string;
4
+ fileName?: string;
5
+ project?: string;
6
+ }
7
+ export interface CompletionOpts {
8
+ maxTokens?: number;
9
+ useOllama?: boolean;
10
+ }
11
+ export interface CompletionResult {
12
+ completion: string;
13
+ source: 'ollama' | 'brain' | 'hybrid';
14
+ latencyMs: number;
15
+ citations: string[];
16
+ }
17
+ export declare class BrainReflex {
18
+ private ollamaUrl;
19
+ private ollamaModel;
20
+ private probed;
21
+ private precachedMemories;
22
+ private cacheHits;
23
+ private cacheMisses;
24
+ /** One-shot completion. */
25
+ complete(context: CompletionContext, opts?: CompletionOpts): Promise<CompletionResult>;
26
+ /** Streaming completion. Yields tokens as they arrive. */
27
+ streamComplete(context: CompletionContext, opts?: CompletionOpts): AsyncIterable<{
28
+ delta: string;
29
+ done: boolean;
30
+ }>;
31
+ /** Warm up the brain's relevant memories before a session starts. */
32
+ precache(project: string, files: string[]): Promise<{
33
+ cached: number;
34
+ durationMs: number;
35
+ }>;
36
+ /** Stats accessor — for telemetry. */
37
+ getStats(): {
38
+ cacheHits: number;
39
+ cacheMisses: number;
40
+ precachedCount: number;
41
+ ollamaModel: string | null;
42
+ };
43
+ private fetchMemories;
44
+ private recallFromBrain;
45
+ private candidatePool;
46
+ private buildPrompt;
47
+ private probeOllama;
48
+ private callOllama;
49
+ private streamOllama;
50
+ private brainOnlyCompletion;
51
+ private logStat;
52
+ }
53
+ export declare function getBrainReflex(): BrainReflex;
54
+ export declare function resetBrainReflexForTests(): void;
55
+ //# sourceMappingURL=brain-reflex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-reflex.d.ts","sourceRoot":"","sources":["../../src/brain/brain-reflex.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAQD,qBAAa,WAAW;IACtB,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,WAAW,CAAK;IAExB,2BAA2B;IACrB,QAAQ,CAAC,OAAO,EAAE,iBAAiB,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAuChG,0DAA0D;IACnD,cAAc,CAAC,OAAO,EAAE,iBAAiB,EAAE,IAAI,GAAE,cAAmB,GAAG,aAAa,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC;IA0B7H,qEAAqE;IAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IA0BjG,sCAAsC;IACtC,QAAQ,IAAI;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE;YAW5F,aAAa;YASb,eAAe;YA6Cf,aAAa;IAgB3B,OAAO,CAAC,WAAW;YAiBL,WAAW;YAwBX,UAAU;YAmBT,YAAY;IAmC3B,OAAO,CAAC,mBAAmB;YAUb,OAAO;CAqBtB;AAuBD,wBAAgB,cAAc,IAAI,WAAW,CAG5C;AACD,wBAAgB,wBAAwB,IAAI,IAAI,CAAsB"}