@theihtisham/agent-shadow-brain 5.1.1 → 5.2.0

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 (42) hide show
  1. package/README.md +1159 -1095
  2. package/dist/adapters/copilot.d.ts +14 -0
  3. package/dist/adapters/copilot.d.ts.map +1 -0
  4. package/dist/adapters/copilot.js +93 -0
  5. package/dist/adapters/copilot.js.map +1 -0
  6. package/dist/adapters/cursor.d.ts +13 -0
  7. package/dist/adapters/cursor.d.ts.map +1 -0
  8. package/dist/adapters/cursor.js +96 -0
  9. package/dist/adapters/cursor.js.map +1 -0
  10. package/dist/adapters/index.d.ts +4 -1
  11. package/dist/adapters/index.d.ts.map +1 -1
  12. package/dist/adapters/index.js +7 -3
  13. package/dist/adapters/index.js.map +1 -1
  14. package/dist/adapters/windsurf.d.ts +14 -0
  15. package/dist/adapters/windsurf.d.ts.map +1 -0
  16. package/dist/adapters/windsurf.js +107 -0
  17. package/dist/adapters/windsurf.js.map +1 -0
  18. package/dist/brain/global-brain.d.ts +56 -0
  19. package/dist/brain/global-brain.d.ts.map +1 -0
  20. package/dist/brain/global-brain.js +324 -0
  21. package/dist/brain/global-brain.js.map +1 -0
  22. package/dist/brain/l0-cache.d.ts +40 -0
  23. package/dist/brain/l0-cache.d.ts.map +1 -0
  24. package/dist/brain/l0-cache.js +176 -0
  25. package/dist/brain/l0-cache.js.map +1 -0
  26. package/dist/brain/mcp-server.d.ts +4 -0
  27. package/dist/brain/mcp-server.d.ts.map +1 -1
  28. package/dist/brain/mcp-server.js +91 -0
  29. package/dist/brain/mcp-server.js.map +1 -1
  30. package/dist/brain/session-hooks.d.ts +28 -0
  31. package/dist/brain/session-hooks.d.ts.map +1 -0
  32. package/dist/brain/session-hooks.js +475 -0
  33. package/dist/brain/session-hooks.js.map +1 -0
  34. package/dist/brain/subconscious.d.ts +34 -0
  35. package/dist/brain/subconscious.d.ts.map +1 -0
  36. package/dist/brain/subconscious.js +275 -0
  37. package/dist/brain/subconscious.js.map +1 -0
  38. package/dist/cli.js +167 -2
  39. package/dist/cli.js.map +1 -1
  40. package/dist/types.d.ts +128 -1
  41. package/dist/types.d.ts.map +1 -1
  42. package/package.json +46 -10
@@ -0,0 +1,324 @@
1
+ // src/brain/global-brain.ts — Singleton Global Brain (v5.2.0)
2
+ //
3
+ // One brain. Every project. Every agent. Every machine.
4
+ //
5
+ // The Global Brain is a singleton store at ~/.shadow-brain/global.json that
6
+ // every Shadow Brain instance reads from and writes to. Insights from project
7
+ // A using Cursor are immediately available to project B using Claude Code.
8
+ //
9
+ // Storage: append-friendly JSON store (no native deps), persisted on every
10
+ // flush. Combined with l0-cache.ts, hot recalls return in <1ms.
11
+ //
12
+ // Concurrency: write queue + atomic file replace prevents conflicts when
13
+ // multiple agents write simultaneously.
14
+ import * as fs from 'fs';
15
+ import * as path from 'path';
16
+ import * as os from 'os';
17
+ import * as crypto from 'crypto';
18
+ const DEFAULT_DIR = path.join(os.homedir(), '.shadow-brain');
19
+ const DEFAULT_DB_PATH = path.join(DEFAULT_DIR, 'global.json');
20
+ const DEFAULT_CONFIG = {
21
+ dbPath: DEFAULT_DB_PATH,
22
+ walMode: true,
23
+ writeQueueSize: 1000,
24
+ autoVacuumMB: 500,
25
+ autoPruneMB: 1000,
26
+ syncIntervalMs: 5000,
27
+ };
28
+ /**
29
+ * Singleton Global Brain — the source of truth for all projects + agents.
30
+ *
31
+ * Storage: JSON file at ~/.shadow-brain/global.json (zero new deps).
32
+ * In-memory Map keyed by entry.id for O(1) ID lookups.
33
+ */
34
+ export class GlobalBrain {
35
+ constructor(config = {}) {
36
+ this.entries = new Map();
37
+ this.projects = new Map();
38
+ this.agents = new Map();
39
+ this.writeQueue = [];
40
+ this.syncTimer = null;
41
+ this.initialized = false;
42
+ this.dirty = false;
43
+ this.config = { ...DEFAULT_CONFIG, ...config };
44
+ this.startedAt = Date.now();
45
+ this.stats = {
46
+ totalProjects: 0,
47
+ totalAgents: 0,
48
+ totalEntries: 0,
49
+ totalSizeMB: 0,
50
+ pendingWrites: 0,
51
+ hits: 0,
52
+ misses: 0,
53
+ hitRate: 0,
54
+ lastSync: new Date(),
55
+ lastVacuum: null,
56
+ lastPrune: null,
57
+ uptime: 0,
58
+ };
59
+ }
60
+ static getInstance(config) {
61
+ if (!GlobalBrain.instance) {
62
+ GlobalBrain.instance = new GlobalBrain(config);
63
+ }
64
+ return GlobalBrain.instance;
65
+ }
66
+ async init() {
67
+ if (this.initialized)
68
+ return;
69
+ fs.mkdirSync(path.dirname(this.config.dbPath), { recursive: true });
70
+ if (fs.existsSync(this.config.dbPath)) {
71
+ try {
72
+ const raw = fs.readFileSync(this.config.dbPath, 'utf-8');
73
+ const parsed = JSON.parse(raw);
74
+ for (const e of parsed.entries ?? []) {
75
+ // Re-hydrate Date instances
76
+ this.entries.set(e.id, {
77
+ ...e,
78
+ createdAt: new Date(e.createdAt),
79
+ lastAccessed: new Date(e.lastAccessed),
80
+ });
81
+ }
82
+ for (const p of parsed.projects ?? [])
83
+ this.projects.set(p.id, p);
84
+ for (const a of parsed.agents ?? [])
85
+ this.agents.set(a.tool, a);
86
+ }
87
+ catch {
88
+ // Corrupted file → start fresh, back up the bad one
89
+ try {
90
+ fs.renameSync(this.config.dbPath, this.config.dbPath + '.corrupt-' + Date.now());
91
+ }
92
+ catch { /* ignore */ }
93
+ }
94
+ }
95
+ this.startSyncLoop();
96
+ this.refreshStats();
97
+ this.initialized = true;
98
+ }
99
+ /** Generate a stable project ID from absolute path */
100
+ static projectIdFor(rootDir) {
101
+ const abs = path.resolve(rootDir);
102
+ return crypto.createHash('sha1').update(abs).digest('hex').slice(0, 16);
103
+ }
104
+ registerProject(rootDir, name) {
105
+ if (!this.initialized)
106
+ throw new Error('GlobalBrain not initialized — call init() first');
107
+ const id = GlobalBrain.projectIdFor(rootDir);
108
+ const projectName = name || path.basename(rootDir);
109
+ const now = Date.now();
110
+ const existing = this.projects.get(id);
111
+ this.projects.set(id, {
112
+ id,
113
+ name: projectName,
114
+ rootDir: path.resolve(rootDir),
115
+ firstSeen: existing?.firstSeen ?? now,
116
+ lastSeen: now,
117
+ });
118
+ this.dirty = true;
119
+ return id;
120
+ }
121
+ registerAgent(agent) {
122
+ if (!this.initialized)
123
+ return;
124
+ const now = Date.now();
125
+ const existing = this.agents.get(agent);
126
+ this.agents.set(agent, {
127
+ tool: agent,
128
+ firstSeen: existing?.firstSeen ?? now,
129
+ lastSeen: now,
130
+ sessionCount: (existing?.sessionCount ?? 0) + 1,
131
+ });
132
+ this.dirty = true;
133
+ }
134
+ /** Queue a write — resolves true on success */
135
+ async write(entry) {
136
+ if (!this.initialized)
137
+ await this.init();
138
+ const fullEntry = {
139
+ ...entry,
140
+ id: crypto.randomUUID(),
141
+ createdAt: new Date(),
142
+ lastAccessed: new Date(),
143
+ accessCount: 0,
144
+ };
145
+ if (this.writeQueue.length >= this.config.writeQueueSize) {
146
+ return false;
147
+ }
148
+ return new Promise((resolve) => {
149
+ this.writeQueue.push({ entry: fullEntry, resolve });
150
+ });
151
+ }
152
+ /** Direct synchronous write — bypasses queue */
153
+ writeSync(entry) {
154
+ if (!this.initialized)
155
+ throw new Error('GlobalBrain not initialized');
156
+ const id = crypto.randomUUID();
157
+ const fullEntry = {
158
+ ...entry,
159
+ id,
160
+ createdAt: new Date(),
161
+ lastAccessed: new Date(),
162
+ accessCount: 0,
163
+ };
164
+ this.entries.set(id, fullEntry);
165
+ this.dirty = true;
166
+ this.stats.totalEntries = this.entries.size;
167
+ return id;
168
+ }
169
+ /** Recall entries — cross-project + cross-agent */
170
+ recall(opts = {}) {
171
+ if (!this.initialized)
172
+ return [];
173
+ const limit = opts.limit ?? 20;
174
+ const minImp = opts.minImportance ?? 0;
175
+ const kwLower = opts.keywords?.map(k => k.toLowerCase()) ?? null;
176
+ const matches = [];
177
+ for (const e of this.entries.values()) {
178
+ if (opts.projectId && e.projectId !== opts.projectId)
179
+ continue;
180
+ if (opts.agentTool && e.agentTool !== opts.agentTool)
181
+ continue;
182
+ if (opts.category && e.category !== opts.category)
183
+ continue;
184
+ if (e.importance < minImp)
185
+ continue;
186
+ if (kwLower) {
187
+ const hay = e.content.toLowerCase();
188
+ if (!kwLower.some(k => hay.includes(k)))
189
+ continue;
190
+ }
191
+ matches.push(e);
192
+ }
193
+ matches.sort((a, b) => {
194
+ if (b.importance !== a.importance)
195
+ return b.importance - a.importance;
196
+ return b.lastAccessed.getTime() - a.lastAccessed.getTime();
197
+ });
198
+ const result = matches.slice(0, limit);
199
+ if (result.length)
200
+ this.stats.hits++;
201
+ else
202
+ this.stats.misses++;
203
+ return result;
204
+ }
205
+ /** Bump access count for an entry */
206
+ touch(id) {
207
+ const entry = this.entries.get(id);
208
+ if (!entry)
209
+ return;
210
+ entry.accessCount++;
211
+ entry.lastAccessed = new Date();
212
+ this.dirty = true;
213
+ }
214
+ recallByIds(ids) {
215
+ const out = [];
216
+ for (const id of ids) {
217
+ const e = this.entries.get(id);
218
+ if (e)
219
+ out.push(e);
220
+ }
221
+ return out;
222
+ }
223
+ getStats() {
224
+ this.refreshStats();
225
+ return { ...this.stats };
226
+ }
227
+ /** Force a sync of pending writes to disk */
228
+ async sync() {
229
+ if (!this.initialized)
230
+ return;
231
+ if (this.writeQueue.length > 0) {
232
+ const pending = this.writeQueue.splice(0, this.writeQueue.length);
233
+ for (const { entry, resolve } of pending) {
234
+ try {
235
+ this.entries.set(entry.id, entry);
236
+ resolve(true);
237
+ }
238
+ catch {
239
+ resolve(false);
240
+ }
241
+ }
242
+ this.dirty = true;
243
+ }
244
+ if (this.dirty) {
245
+ this.persist();
246
+ this.stats.lastSync = new Date();
247
+ this.dirty = false;
248
+ }
249
+ this.maybeAutoMaintenance();
250
+ }
251
+ maybeAutoMaintenance() {
252
+ const sizeMB = this.estimateSizeMB();
253
+ this.stats.totalSizeMB = sizeMB;
254
+ if (sizeMB > this.config.autoPruneMB)
255
+ this.prune();
256
+ }
257
+ /** Auto-prune: drop low-importance, rarely-accessed entries when over threshold */
258
+ prune() {
259
+ const cutoff = Date.now() - 90 * 24 * 60 * 60 * 1000; // 90 days
260
+ const toDelete = [];
261
+ for (const [id, e] of this.entries) {
262
+ if (e.importance < 0.3 && e.accessCount < 2 && e.lastAccessed.getTime() < cutoff) {
263
+ toDelete.push(id);
264
+ }
265
+ }
266
+ for (const id of toDelete)
267
+ this.entries.delete(id);
268
+ if (toDelete.length) {
269
+ this.dirty = true;
270
+ this.stats.lastPrune = new Date();
271
+ }
272
+ }
273
+ persist() {
274
+ const shape = {
275
+ schemaVersion: 1,
276
+ entries: Array.from(this.entries.values()),
277
+ projects: Array.from(this.projects.values()),
278
+ agents: Array.from(this.agents.values()),
279
+ };
280
+ // Atomic write — write to .tmp then rename
281
+ const tmp = this.config.dbPath + '.tmp';
282
+ fs.writeFileSync(tmp, JSON.stringify(shape));
283
+ fs.renameSync(tmp, this.config.dbPath);
284
+ }
285
+ startSyncLoop() {
286
+ if (this.syncTimer)
287
+ clearInterval(this.syncTimer);
288
+ this.syncTimer = setInterval(() => {
289
+ this.sync().catch(() => { });
290
+ }, this.config.syncIntervalMs);
291
+ }
292
+ refreshStats() {
293
+ if (!this.initialized)
294
+ return;
295
+ this.stats.totalProjects = this.projects.size;
296
+ this.stats.totalAgents = this.agents.size;
297
+ this.stats.totalEntries = this.entries.size;
298
+ this.stats.pendingWrites = this.writeQueue.length;
299
+ const totalChecks = this.stats.hits + this.stats.misses;
300
+ this.stats.hitRate = totalChecks > 0 ? this.stats.hits / totalChecks : 0;
301
+ this.stats.uptime = Date.now() - this.startedAt;
302
+ }
303
+ estimateSizeMB() {
304
+ try {
305
+ const stat = fs.statSync(this.config.dbPath);
306
+ return stat.size / (1024 * 1024);
307
+ }
308
+ catch {
309
+ return 0;
310
+ }
311
+ }
312
+ async shutdown() {
313
+ if (this.syncTimer)
314
+ clearInterval(this.syncTimer);
315
+ await this.sync();
316
+ this.initialized = false;
317
+ GlobalBrain.instance = null;
318
+ }
319
+ }
320
+ GlobalBrain.instance = null;
321
+ export function getGlobalBrain(config) {
322
+ return GlobalBrain.getInstance(config);
323
+ }
324
+ //# sourceMappingURL=global-brain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-brain.js","sourceRoot":"","sources":["../../src/brain/global-brain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { L0CacheEntry, L0CacheStats } from '../types.js';
2
+ export interface L0CacheOptions {
3
+ bytesLimit?: number;
4
+ /** Estimate bytes for a value when computing budget */
5
+ byteEstimator?: (value: unknown) => number;
6
+ }
7
+ /** Generic L0 cache. Construct one per logical namespace (recall, vectors, etc.) */
8
+ export declare class L0Cache<T = unknown> {
9
+ private map;
10
+ private bytesUsed;
11
+ private bytesLimit;
12
+ private byteEstimator;
13
+ private hits;
14
+ private misses;
15
+ private evictions;
16
+ private accessTimingsNs;
17
+ constructor(opts?: L0CacheOptions);
18
+ /** Get a value from the cache — sub-microsecond on hit */
19
+ get(key: string): T | undefined;
20
+ /** Set a value — evicts LRU entries if over budget */
21
+ set(key: string, value: T): void;
22
+ /** Check existence without touching LRU */
23
+ has(key: string): boolean;
24
+ /** Remove a single entry */
25
+ delete(key: string): boolean;
26
+ /** Clear all entries */
27
+ clear(): void;
28
+ /** Get cache stats */
29
+ getStats(): L0CacheStats;
30
+ /** Iterate entries (for warm-restart persistence) */
31
+ entries(): IterableIterator<[string, L0CacheEntry<T>]>;
32
+ /** Resize the byte budget — evicts if shrinking */
33
+ resize(newBytesLimit: number): void;
34
+ private evictOldest;
35
+ private recordTiming;
36
+ }
37
+ export declare function getCache<T = unknown>(namespace: string, opts?: L0CacheOptions): L0Cache<T>;
38
+ export declare function getAllCacheStats(): Record<string, L0CacheStats>;
39
+ export declare function clearAllCaches(): void;
40
+ //# sourceMappingURL=l0-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"l0-cache.d.ts","sourceRoot":"","sources":["../../src/brain/l0-cache.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIzD,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;CAC5C;AAgBD,oFAAoF;AACpF,qBAAa,OAAO,CAAC,CAAC,GAAG,OAAO;IAC9B,OAAO,CAAC,GAAG,CAA2C;IACtD,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAA6B;IAElD,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,eAAe,CAAgB;gBAE3B,IAAI,GAAE,cAAmB;IAKrC,0DAA0D;IAC1D,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAqB/B,sDAAsD;IACtD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IA4BhC,2CAA2C;IAC3C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB,4BAA4B;IAC5B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAO5B,wBAAwB;IACxB,KAAK,IAAI,IAAI;IAKb,sBAAsB;IACtB,QAAQ,IAAI,YAAY;IAyBxB,qDAAqD;IACrD,OAAO,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAItD,mDAAmD;IACnD,MAAM,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI;IAOnC,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,YAAY;CAOrB;AAKD,wBAAgB,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,CAO1F;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAM/D;AAED,wBAAgB,cAAc,IAAI,IAAI,CAErC"}
@@ -0,0 +1,176 @@
1
+ // src/brain/l0-cache.ts — L0 In-Memory Hot Tier (v5.2.0)
2
+ //
3
+ // Sub-millisecond recall for the hottest brain entries. Sits in front of the
4
+ // global SQLite brain. Map-based, LRU-evicted, byte-budget-bounded.
5
+ //
6
+ // Design:
7
+ // - Pure JavaScript Map (insertion-ordered → easy LRU)
8
+ // - Byte budget (default 64MB) prevents memory bloat
9
+ // - Tracks hit/miss for adaptive prefetch decisions
10
+ // - Auto-evict least-recently-accessed when budget exceeded
11
+ const DEFAULT_BYTES_LIMIT = 64 * 1024 * 1024; // 64MB
12
+ /** Default byte estimator — works for strings, objects, arrays */
13
+ function defaultByteEstimator(value) {
14
+ if (value == null)
15
+ return 8;
16
+ if (typeof value === 'string')
17
+ return value.length * 2;
18
+ if (typeof value === 'number')
19
+ return 8;
20
+ if (typeof value === 'boolean')
21
+ return 4;
22
+ if (value instanceof Uint8Array)
23
+ return value.byteLength;
24
+ try {
25
+ return JSON.stringify(value).length * 2;
26
+ }
27
+ catch {
28
+ return 64;
29
+ }
30
+ }
31
+ /** Generic L0 cache. Construct one per logical namespace (recall, vectors, etc.) */
32
+ export class L0Cache {
33
+ constructor(opts = {}) {
34
+ this.map = new Map();
35
+ this.bytesUsed = 0;
36
+ this.hits = 0;
37
+ this.misses = 0;
38
+ this.evictions = 0;
39
+ this.accessTimingsNs = [];
40
+ this.bytesLimit = opts.bytesLimit ?? DEFAULT_BYTES_LIMIT;
41
+ this.byteEstimator = opts.byteEstimator ?? defaultByteEstimator;
42
+ }
43
+ /** Get a value from the cache — sub-microsecond on hit */
44
+ get(key) {
45
+ const start = process.hrtime.bigint();
46
+ const entry = this.map.get(key);
47
+ if (!entry) {
48
+ this.misses++;
49
+ this.recordTiming(start);
50
+ return undefined;
51
+ }
52
+ // LRU touch — re-insert at end of map
53
+ this.map.delete(key);
54
+ entry.hits++;
55
+ entry.lastAccessed = Date.now();
56
+ this.map.set(key, entry);
57
+ this.hits++;
58
+ this.recordTiming(start);
59
+ return entry.value;
60
+ }
61
+ /** Set a value — evicts LRU entries if over budget */
62
+ set(key, value) {
63
+ const bytes = this.byteEstimator(value);
64
+ // If key already exists, subtract its bytes first
65
+ const existing = this.map.get(key);
66
+ if (existing) {
67
+ this.bytesUsed -= existing.bytes;
68
+ this.map.delete(key);
69
+ }
70
+ // Make room
71
+ while (this.bytesUsed + bytes > this.bytesLimit && this.map.size > 0) {
72
+ this.evictOldest();
73
+ }
74
+ const entry = {
75
+ key,
76
+ value,
77
+ hits: 0,
78
+ insertedAt: Date.now(),
79
+ lastAccessed: Date.now(),
80
+ bytes,
81
+ };
82
+ this.map.set(key, entry);
83
+ this.bytesUsed += bytes;
84
+ }
85
+ /** Check existence without touching LRU */
86
+ has(key) {
87
+ return this.map.has(key);
88
+ }
89
+ /** Remove a single entry */
90
+ delete(key) {
91
+ const entry = this.map.get(key);
92
+ if (!entry)
93
+ return false;
94
+ this.bytesUsed -= entry.bytes;
95
+ return this.map.delete(key);
96
+ }
97
+ /** Clear all entries */
98
+ clear() {
99
+ this.map.clear();
100
+ this.bytesUsed = 0;
101
+ }
102
+ /** Get cache stats */
103
+ getStats() {
104
+ const total = this.hits + this.misses;
105
+ const avgAccessNs = this.accessTimingsNs.length
106
+ ? this.accessTimingsNs.reduce((a, b) => a + b, 0) / this.accessTimingsNs.length
107
+ : 0;
108
+ // Top 10 most-hit keys
109
+ const topKeys = Array.from(this.map.values())
110
+ .sort((a, b) => b.hits - a.hits)
111
+ .slice(0, 10)
112
+ .map(e => ({ key: e.key, hits: e.hits }));
113
+ return {
114
+ entries: this.map.size,
115
+ bytesUsed: this.bytesUsed,
116
+ bytesLimit: this.bytesLimit,
117
+ hits: this.hits,
118
+ misses: this.misses,
119
+ hitRate: total ? this.hits / total : 0,
120
+ evictions: this.evictions,
121
+ avgAccessNs,
122
+ topKeys,
123
+ };
124
+ }
125
+ /** Iterate entries (for warm-restart persistence) */
126
+ entries() {
127
+ return this.map.entries();
128
+ }
129
+ /** Resize the byte budget — evicts if shrinking */
130
+ resize(newBytesLimit) {
131
+ this.bytesLimit = newBytesLimit;
132
+ while (this.bytesUsed > this.bytesLimit && this.map.size > 0) {
133
+ this.evictOldest();
134
+ }
135
+ }
136
+ evictOldest() {
137
+ // First entry in Map = oldest by insertion (and we re-insert on touch → LRU)
138
+ const oldest = this.map.keys().next().value;
139
+ if (oldest === undefined)
140
+ return;
141
+ const entry = this.map.get(oldest);
142
+ if (entry)
143
+ this.bytesUsed -= entry.bytes;
144
+ this.map.delete(oldest);
145
+ this.evictions++;
146
+ }
147
+ recordTiming(startNs) {
148
+ const elapsedNs = Number(process.hrtime.bigint() - startNs);
149
+ this.accessTimingsNs.push(elapsedNs);
150
+ if (this.accessTimingsNs.length > 1000) {
151
+ this.accessTimingsNs.shift();
152
+ }
153
+ }
154
+ }
155
+ /** Process-wide singleton caches — one per logical namespace */
156
+ const caches = new Map();
157
+ export function getCache(namespace, opts) {
158
+ let cache = caches.get(namespace);
159
+ if (!cache) {
160
+ cache = new L0Cache(opts);
161
+ caches.set(namespace, cache);
162
+ }
163
+ return cache;
164
+ }
165
+ export function getAllCacheStats() {
166
+ const out = {};
167
+ for (const [name, cache] of caches.entries()) {
168
+ out[name] = cache.getStats();
169
+ }
170
+ return out;
171
+ }
172
+ export function clearAllCaches() {
173
+ for (const cache of caches.values())
174
+ cache.clear();
175
+ }
176
+ //# sourceMappingURL=l0-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"l0-cache.js","sourceRoot":"","sources":["../../src/brain/l0-cache.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,10 @@ export declare class MCPServer {
7
7
  private lastHealthScore;
8
8
  private toolHandlers;
9
9
  constructor(orchestrator: any, options?: MCPServerOptions);
10
+ private handleSubconsciousInject;
11
+ private handleGlobalRecall;
12
+ private handleGlobalStats;
13
+ private handleAttachStatus;
10
14
  start(): Promise<void>;
11
15
  stop(): Promise<void>;
12
16
  handleRequest(request: MCPRequest): Promise<MCPResponse>;
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/brain/mcp-server.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAW,gBAAgB,EAAc,MAAM,aAAa,CAAC;AAO7F,qBAAa,SAAS;IACpB,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,UAAU,CAAqC;IACvD,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,YAAY,CAAwE;gBAEhF,YAAY,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,gBAAgB;IA8BnD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA2DtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBrB,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAoD9D,OAAO,CAAC,gBAAgB;YAiBV,aAAa;YAgBb,YAAY;YAwBZ,WAAW;YAgBX,aAAa;YAeb,cAAc;YAmBd,UAAU;YAeV,WAAW;YAWX,YAAY;YAkCZ,YAAY;YAsBZ,eAAe;YAyBf,WAAW;YAkBX,WAAW;YAkBX,eAAe;YAkBf,oBAAoB;YAkBpB,aAAa;YAUb,SAAS;YAuCT,YAAY;YAQZ,aAAa;YAgCb,gBAAgB;IAqB9B,OAAO,CAAC,kBAAkB;YA4KZ,oBAAoB;IA2BlC,OAAO,CAAC,mBAAmB;IAoB3B,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,eAAe;IAwBvB,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,SAAS;CAGlB"}
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/brain/mcp-server.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAW,gBAAgB,EAAc,MAAM,aAAa,CAAC;AAO7F,qBAAa,SAAS;IACpB,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,UAAU,CAAqC;IACvD,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,YAAY,CAAwE;gBAEhF,YAAY,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,gBAAgB;YAoC3C,wBAAwB;YAcxB,kBAAkB;YAclB,iBAAiB;YAWjB,kBAAkB;IAO1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA2DtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBrB,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAoD9D,OAAO,CAAC,gBAAgB;YAiBV,aAAa;YAgBb,YAAY;YAwBZ,WAAW;YAgBX,aAAa;YAeb,cAAc;YAmBd,UAAU;YAeV,WAAW;YAWX,YAAY;YAkCZ,YAAY;YAsBZ,eAAe;YAyBf,WAAW;YAkBX,WAAW;YAkBX,eAAe;YAkBf,oBAAoB;YAkBpB,aAAa;YAUb,SAAS;YAuCT,YAAY;YAQZ,aAAa;YAgCb,gBAAgB;IAqB9B,OAAO,CAAC,kBAAkB;YAuNZ,oBAAoB;IA2BlC,OAAO,CAAC,mBAAmB;IAoB3B,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,eAAe;IAwBvB,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,SAAS;CAGlB"}