@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,275 @@
1
+ // src/brain/subconscious.ts — Subconscious Engine (v5.2.0)
2
+ //
3
+ // On every new agent session, the Subconscious proactively injects a tight
4
+ // briefing of relevant context — recent decisions, similar past work, project
5
+ // state, cross-agent insights — so the agent doesn't have to ask.
6
+ //
7
+ // "Subconscious" because the agent doesn't actively retrieve this — the brain
8
+ // makes it available implicitly. Like human intuition: the relevant memory
9
+ // surfaces before you consciously look for it.
10
+ //
11
+ // Token budget: hard-capped (default 2000) to never bloat the agent's context.
12
+ // Relevance ranked: each section competes for budget by importance × recency.
13
+ import { getGlobalBrain, GlobalBrain } from './global-brain.js';
14
+ import { getCache } from './l0-cache.js';
15
+ import * as crypto from 'crypto';
16
+ const DEFAULT_CONFIG = {
17
+ enabled: true,
18
+ tokenBudget: 2000,
19
+ lookbackHours: 24,
20
+ relevanceThreshold: 0.3,
21
+ alwaysInclude: ['decision', 'pattern', 'warning'],
22
+ enabledAgents: [],
23
+ };
24
+ /** ~4 chars per token (rough English heuristic) */
25
+ function estimateTokens(text) {
26
+ return Math.ceil(text.length / 4);
27
+ }
28
+ export class SubconsciousEngine {
29
+ constructor(config = {}, brain) {
30
+ this.config = { ...DEFAULT_CONFIG, ...config };
31
+ this.brain = brain ?? getGlobalBrain();
32
+ this.stats = {
33
+ totalBriefings: 0,
34
+ avgTokenCount: 0,
35
+ avgGenerationMs: 0,
36
+ acceptedRate: 1,
37
+ byAgent: {},
38
+ lastBriefing: null,
39
+ };
40
+ }
41
+ /** Generate a session-start briefing for the agent — proactive context injection */
42
+ async generateBriefing(opts) {
43
+ const start = Date.now();
44
+ const sessionId = crypto.randomUUID();
45
+ const projectId = opts.projectId ?? GlobalBrain.projectIdFor(opts.projectDir);
46
+ const projectName = opts.projectName ?? opts.projectDir.split(/[/\\]/).pop() ?? 'unknown';
47
+ // L0 cache check — if we briefed this agent for this project recently, reuse
48
+ const cacheKey = `subconscious:${opts.agentTool}:${projectId}`;
49
+ const cache = getCache('subconscious');
50
+ const cached = cache.get(cacheKey);
51
+ if (cached && Date.now() - cached.generatedAt.getTime() < 60000) {
52
+ return cached;
53
+ }
54
+ // Skip if disabled or agent not in enabled list
55
+ if (!this.config.enabled || (this.config.enabledAgents.length > 0 && !this.config.enabledAgents.includes(opts.agentTool))) {
56
+ return this.emptyBriefing(opts.agentTool, opts.projectDir, sessionId);
57
+ }
58
+ if (!('init' in this.brain)) {
59
+ return this.emptyBriefing(opts.agentTool, opts.projectDir, sessionId);
60
+ }
61
+ try {
62
+ await this.brain.init();
63
+ }
64
+ catch { /* already initialized */ }
65
+ // Build sections within budget
66
+ const lookbackMs = this.config.lookbackHours * 60 * 60 * 1000;
67
+ const cutoff = Date.now() - lookbackMs;
68
+ const recentDecisions = this.fetchSection(projectId, ['decision'], cutoff, 5);
69
+ const activeTasks = this.fetchSection(projectId, ['task', 'todo'], cutoff, 5);
70
+ const projectState = this.fetchProjectStateSummary(projectId);
71
+ const crossAgentInsights = this.fetchCrossAgentInsights(projectId, opts.agentTool, cutoff, 5);
72
+ const warnings = this.fetchSection(projectId, ['warning', 'critical', 'security'], cutoff, 3);
73
+ const similarPastWork = opts.currentTask
74
+ ? this.fetchSimilarWork(opts.currentTask, opts.agentTool, 3)
75
+ : this.fetchTopPatterns(projectId, 3);
76
+ const briefing = {
77
+ agentTool: opts.agentTool,
78
+ projectDir: opts.projectDir,
79
+ sessionId,
80
+ generatedAt: new Date(),
81
+ tokenCount: 0,
82
+ sections: {
83
+ recentDecisions: recentDecisions.map(e => this.formatEntry(e)),
84
+ activeTasks: activeTasks.map(e => this.formatEntry(e)),
85
+ similarPastWork: similarPastWork.map(e => this.formatEntry(e)),
86
+ projectState,
87
+ crossAgentInsights: crossAgentInsights.map(e => `[${e.agentTool}] ${this.formatEntry(e)}`),
88
+ warnings: warnings.map(e => this.formatEntry(e)),
89
+ },
90
+ fullText: '',
91
+ };
92
+ briefing.fullText = this.assembleBriefing(briefing, projectName);
93
+ briefing.tokenCount = estimateTokens(briefing.fullText);
94
+ // Trim if over budget — drop lowest-priority sections first
95
+ if (briefing.tokenCount > this.config.tokenBudget) {
96
+ briefing.fullText = this.trimToBudget(briefing, projectName);
97
+ briefing.tokenCount = estimateTokens(briefing.fullText);
98
+ }
99
+ // Cache it
100
+ cache.set(cacheKey, briefing);
101
+ // Update stats
102
+ this.stats.totalBriefings++;
103
+ this.stats.avgTokenCount = this.runningAvg(this.stats.avgTokenCount, briefing.tokenCount, this.stats.totalBriefings);
104
+ this.stats.avgGenerationMs = this.runningAvg(this.stats.avgGenerationMs, Date.now() - start, this.stats.totalBriefings);
105
+ this.stats.byAgent[opts.agentTool] = (this.stats.byAgent[opts.agentTool] ?? 0) + 1;
106
+ this.stats.lastBriefing = new Date();
107
+ return briefing;
108
+ }
109
+ /** Get current stats */
110
+ getStats() {
111
+ return { ...this.stats };
112
+ }
113
+ /** Update config at runtime */
114
+ configure(patch) {
115
+ this.config = { ...this.config, ...patch };
116
+ }
117
+ getConfig() {
118
+ return { ...this.config };
119
+ }
120
+ // ─── Private helpers ────────────────────────────────────────────────────────
121
+ fetchSection(projectId, categories, cutoffMs, limit) {
122
+ const results = [];
123
+ for (const category of categories) {
124
+ const entries = this.brain.recall({
125
+ projectId,
126
+ category,
127
+ limit,
128
+ minImportance: this.config.relevanceThreshold,
129
+ });
130
+ for (const e of entries) {
131
+ if (e.lastAccessed.getTime() >= cutoffMs || e.createdAt.getTime() >= cutoffMs) {
132
+ results.push(e);
133
+ }
134
+ }
135
+ }
136
+ return results
137
+ .sort((a, b) => b.importance - a.importance)
138
+ .slice(0, limit);
139
+ }
140
+ fetchCrossAgentInsights(projectId, currentAgent, cutoffMs, limit) {
141
+ const all = this.brain.recall({
142
+ projectId,
143
+ limit: limit * 3,
144
+ minImportance: this.config.relevanceThreshold,
145
+ });
146
+ return all
147
+ .filter(e => e.agentTool !== currentAgent && (e.lastAccessed.getTime() >= cutoffMs || e.createdAt.getTime() >= cutoffMs))
148
+ .slice(0, limit);
149
+ }
150
+ fetchProjectStateSummary(projectId) {
151
+ const recent = this.brain.recall({ projectId, category: 'state', limit: 1 });
152
+ if (recent.length)
153
+ return recent[0].content.slice(0, 300);
154
+ const top = this.brain.recall({ projectId, limit: 3 });
155
+ if (!top.length)
156
+ return '';
157
+ return top.map(e => `${e.category}: ${e.content.slice(0, 80)}`).join('; ');
158
+ }
159
+ fetchSimilarWork(taskHint, agentTool, limit) {
160
+ const keywords = this.extractKeywords(taskHint);
161
+ if (!keywords.length)
162
+ return [];
163
+ return this.brain.recall({
164
+ keywords,
165
+ limit,
166
+ minImportance: this.config.relevanceThreshold,
167
+ });
168
+ }
169
+ fetchTopPatterns(projectId, limit) {
170
+ return this.brain.recall({ projectId, category: 'pattern', limit });
171
+ }
172
+ extractKeywords(text) {
173
+ const stop = new Set(['the', 'and', 'or', 'a', 'an', 'is', 'are', 'was', 'were', 'in', 'on', 'at', 'to', 'for', 'of', 'with', 'by', 'this', 'that']);
174
+ return text
175
+ .toLowerCase()
176
+ .split(/\W+/)
177
+ .filter(w => w.length > 3 && !stop.has(w))
178
+ .slice(0, 5);
179
+ }
180
+ formatEntry(entry) {
181
+ const content = entry.content.length > 200 ? entry.content.slice(0, 197) + '...' : entry.content;
182
+ return content;
183
+ }
184
+ assembleBriefing(briefing, projectName) {
185
+ const parts = [];
186
+ parts.push(`# 🧠 Shadow Brain — Subconscious Briefing`);
187
+ parts.push(`_Project: ${projectName} | Agent: ${briefing.agentTool} | Auto-generated by Shadow Brain v5.2.0_`);
188
+ parts.push('');
189
+ if (briefing.sections.warnings.length) {
190
+ parts.push(`## ⚠️ Warnings`);
191
+ for (const w of briefing.sections.warnings)
192
+ parts.push(`- ${w}`);
193
+ parts.push('');
194
+ }
195
+ if (briefing.sections.recentDecisions.length) {
196
+ parts.push(`## Recent Decisions`);
197
+ for (const d of briefing.sections.recentDecisions)
198
+ parts.push(`- ${d}`);
199
+ parts.push('');
200
+ }
201
+ if (briefing.sections.activeTasks.length) {
202
+ parts.push(`## Active Tasks`);
203
+ for (const t of briefing.sections.activeTasks)
204
+ parts.push(`- ${t}`);
205
+ parts.push('');
206
+ }
207
+ if (briefing.sections.projectState) {
208
+ parts.push(`## Project State`);
209
+ parts.push(briefing.sections.projectState);
210
+ parts.push('');
211
+ }
212
+ if (briefing.sections.crossAgentInsights.length) {
213
+ parts.push(`## Cross-Agent Insights`);
214
+ for (const i of briefing.sections.crossAgentInsights)
215
+ parts.push(`- ${i}`);
216
+ parts.push('');
217
+ }
218
+ if (briefing.sections.similarPastWork.length) {
219
+ parts.push(`## Similar Past Work`);
220
+ for (const s of briefing.sections.similarPastWork)
221
+ parts.push(`- ${s}`);
222
+ parts.push('');
223
+ }
224
+ return parts.join('\n').trim();
225
+ }
226
+ trimToBudget(briefing, projectName) {
227
+ // Drop sections in this priority order until under budget:
228
+ // similarPastWork → crossAgentInsights → activeTasks → recentDecisions → warnings (warnings last)
229
+ const trimmedSections = { ...briefing.sections };
230
+ const dropOrder = ['similarPastWork', 'crossAgentInsights', 'activeTasks', 'recentDecisions'];
231
+ for (const key of dropOrder) {
232
+ let text = this.assembleBriefing({ ...briefing, sections: trimmedSections }, projectName);
233
+ if (estimateTokens(text) <= this.config.tokenBudget)
234
+ return text;
235
+ const arr = trimmedSections[key];
236
+ if (Array.isArray(arr)) {
237
+ trimmedSections[key] = [];
238
+ }
239
+ else {
240
+ trimmedSections[key] = '';
241
+ }
242
+ }
243
+ return this.assembleBriefing({ ...briefing, sections: trimmedSections }, projectName);
244
+ }
245
+ emptyBriefing(agentTool, projectDir, sessionId) {
246
+ return {
247
+ agentTool,
248
+ projectDir,
249
+ sessionId,
250
+ generatedAt: new Date(),
251
+ tokenCount: 0,
252
+ sections: {
253
+ recentDecisions: [],
254
+ activeTasks: [],
255
+ similarPastWork: [],
256
+ projectState: '',
257
+ crossAgentInsights: [],
258
+ warnings: [],
259
+ },
260
+ fullText: '',
261
+ };
262
+ }
263
+ runningAvg(prev, next, n) {
264
+ return prev + (next - prev) / n;
265
+ }
266
+ }
267
+ let defaultEngine = null;
268
+ export function getSubconscious(config) {
269
+ if (!defaultEngine)
270
+ defaultEngine = new SubconsciousEngine(config);
271
+ else if (config)
272
+ defaultEngine.configure(config);
273
+ return defaultEngine;
274
+ }
275
+ //# sourceMappingURL=subconscious.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subconscious.js","sourceRoot":"","sources":["../../src/brain/subconscious.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -2495,8 +2495,7 @@ const offCmd = new Command('off')
2495
2495
  .action(async () => {
2496
2496
  console.log(chalk.magenta.bold('\n SHADOW BRAIN v' + VERSION + ' — Shutting down'));
2497
2497
  try {
2498
- const { default: execaDefault } = await import('execa');
2499
- const exec = execaDefault;
2498
+ const { execa: exec } = await import('execa');
2500
2499
  try {
2501
2500
  if (process.platform === 'win32') {
2502
2501
  await exec('taskkill', ['/F', '/IM', 'node.exe', '/FI', 'WINDOWTITLE eq shadow-brain*'], { reject: false });
@@ -2929,5 +2928,171 @@ program.addCommand(cacheCmd);
2929
2928
  program.addCommand(intentCmd);
2930
2929
  program.addCommand(dnaCmd);
2931
2930
  program.addCommand(temporalCmd);
2931
+ // ─── v5.2.0 — SUBCONSCIOUS SINGULARITY ──────────────────────────────────────
2932
+ const attachCmd = new Command('attach-all')
2933
+ .description('Auto-detect every installed AI agent and install Shadow Brain hooks (v5.2.0)')
2934
+ .argument('[project-dir]', 'Project directory', process.cwd())
2935
+ .option('--dry-run', 'Show what would be attached without installing')
2936
+ .action(async (projectDir, opts) => {
2937
+ console.log(chalk.magenta.bold(`\n SHADOW BRAIN v${VERSION} — Universal Bootstrap`));
2938
+ const { getHookInstaller } = await import('./brain/session-hooks.js');
2939
+ const installer = getHookInstaller();
2940
+ if (opts.dryRun) {
2941
+ const detected = await installer.detectInstalled(projectDir);
2942
+ console.log(chalk.cyan(` Detected agents: ${detected.length}`));
2943
+ for (const agent of detected) {
2944
+ console.log(` ${chalk.green('✓')} ${agent}`);
2945
+ }
2946
+ console.log(chalk.dim('\n Run without --dry-run to install hooks.'));
2947
+ return;
2948
+ }
2949
+ const report = await installer.attachAll(projectDir);
2950
+ console.log(chalk.cyan(` Detected: ${report.detected.length} agents (${report.durationMs}ms)`));
2951
+ for (const agent of report.attached) {
2952
+ console.log(` ${chalk.green('✓')} ${agent} attached`);
2953
+ }
2954
+ for (const fail of report.failed) {
2955
+ console.log(` ${chalk.red('✗')} ${fail.agent}: ${fail.reason}`);
2956
+ }
2957
+ console.log(chalk.dim(`\n ${report.hooks.length} hook(s) installed across ${report.attached.length} agent(s).`));
2958
+ console.log(chalk.dim(' Every agent will now call Shadow Brain on session start.'));
2959
+ });
2960
+ const subconsciousCmd = new Command('subconscious')
2961
+ .description('Manage the Subconscious Engine — proactive context injection')
2962
+ .addCommand(new Command('inject')
2963
+ .description('Generate + emit a session-start briefing for the current agent')
2964
+ .option('--agent <agent>', 'Agent tool name (auto-detected if omitted)')
2965
+ .option('--task <hint>', 'Current task hint for similarity search')
2966
+ .option('--json', 'Output JSON instead of formatted text')
2967
+ .action(async (opts) => {
2968
+ const { getSubconscious } = await import('./brain/subconscious.js');
2969
+ const { GlobalBrain } = await import('./brain/global-brain.js');
2970
+ const projectDir = process.cwd();
2971
+ const projectId = GlobalBrain.projectIdFor(projectDir);
2972
+ let agentTool = opts.agent;
2973
+ if (!agentTool) {
2974
+ const detected = await detectRunningAgents(projectDir);
2975
+ agentTool = detected[0]?.name || 'claude-code';
2976
+ }
2977
+ const sub = getSubconscious();
2978
+ const briefing = await sub.generateBriefing({
2979
+ agentTool,
2980
+ projectDir,
2981
+ projectId,
2982
+ currentTask: opts.task,
2983
+ });
2984
+ if (opts.json) {
2985
+ console.log(JSON.stringify(briefing, null, 2));
2986
+ }
2987
+ else {
2988
+ console.log(briefing.fullText || chalk.dim('(no relevant context yet — brain is empty)'));
2989
+ }
2990
+ }))
2991
+ .addCommand(new Command('status')
2992
+ .description('Show subconscious engine stats')
2993
+ .action(async () => {
2994
+ const { getSubconscious } = await import('./brain/subconscious.js');
2995
+ const stats = getSubconscious().getStats();
2996
+ console.log(chalk.magenta.bold(`\n SHADOW BRAIN v${VERSION} — Subconscious Stats`));
2997
+ console.log(` Total briefings: ${chalk.cyan(stats.totalBriefings)}`);
2998
+ console.log(` Avg tokens: ${chalk.cyan(stats.avgTokenCount.toFixed(0))}`);
2999
+ console.log(` Avg generation: ${chalk.cyan(stats.avgGenerationMs.toFixed(1) + 'ms')}`);
3000
+ console.log(` By agent:`);
3001
+ for (const [agent, count] of Object.entries(stats.byAgent)) {
3002
+ console.log(` ${chalk.dim('•')} ${agent}: ${count}`);
3003
+ }
3004
+ }))
3005
+ .addCommand(new Command('configure')
3006
+ .description('Update subconscious config')
3007
+ .option('--budget <tokens>', 'Token budget (default 2000)')
3008
+ .option('--lookback <hours>', 'Lookback hours (default 24)')
3009
+ .option('--threshold <score>', 'Relevance threshold 0-1')
3010
+ .option('--enable', 'Enable subconscious')
3011
+ .option('--disable', 'Disable subconscious')
3012
+ .action(async (opts) => {
3013
+ const { getSubconscious } = await import('./brain/subconscious.js');
3014
+ const sub = getSubconscious();
3015
+ const patch = {};
3016
+ if (opts.budget)
3017
+ patch.tokenBudget = parseInt(opts.budget, 10);
3018
+ if (opts.lookback)
3019
+ patch.lookbackHours = parseFloat(opts.lookback);
3020
+ if (opts.threshold)
3021
+ patch.relevanceThreshold = parseFloat(opts.threshold);
3022
+ if (opts.enable)
3023
+ patch.enabled = true;
3024
+ if (opts.disable)
3025
+ patch.enabled = false;
3026
+ sub.configure(patch);
3027
+ console.log(chalk.green(' ✓ Subconscious config updated.'));
3028
+ console.log(JSON.stringify(sub.getConfig(), null, 2));
3029
+ }));
3030
+ const globalBrainCmd = new Command('global')
3031
+ .description('Manage the Singleton Global Brain — one brain, all projects, all agents')
3032
+ .addCommand(new Command('stats')
3033
+ .description('Show global brain stats')
3034
+ .action(async () => {
3035
+ const { getGlobalBrain } = await import('./brain/global-brain.js');
3036
+ const brain = getGlobalBrain();
3037
+ await brain.init();
3038
+ const s = brain.getStats();
3039
+ console.log(chalk.magenta.bold(`\n SHADOW BRAIN v${VERSION} — Global Brain`));
3040
+ console.log(` Projects: ${chalk.cyan(s.totalProjects)}`);
3041
+ console.log(` Agents: ${chalk.cyan(s.totalAgents)}`);
3042
+ console.log(` Entries: ${chalk.cyan(s.totalEntries)}`);
3043
+ console.log(` Size: ${chalk.cyan(s.totalSizeMB.toFixed(2) + ' MB')}`);
3044
+ console.log(` Hit rate: ${chalk.cyan((s.hitRate * 100).toFixed(1) + '%')} (${s.hits}/${s.hits + s.misses})`);
3045
+ console.log(` Pending: ${chalk.cyan(s.pendingWrites)}`);
3046
+ console.log(` Uptime: ${chalk.cyan(Math.round(s.uptime / 1000) + 's')}`);
3047
+ console.log(` Last sync: ${chalk.dim(s.lastSync.toISOString())}`);
3048
+ }))
3049
+ .addCommand(new Command('recall')
3050
+ .description('Recall entries from the global brain — works across projects + agents')
3051
+ .option('-q, --query <text>', 'Keyword search')
3052
+ .option('--agent <agent>', 'Filter by agent tool')
3053
+ .option('--category <cat>', 'Filter by category')
3054
+ .option('--limit <n>', 'Max results', '20')
3055
+ .option('--json', 'Output JSON')
3056
+ .action(async (opts) => {
3057
+ const { getGlobalBrain } = await import('./brain/global-brain.js');
3058
+ const brain = getGlobalBrain();
3059
+ await brain.init();
3060
+ const results = brain.recall({
3061
+ keywords: opts.query ? opts.query.split(/\s+/) : undefined,
3062
+ agentTool: opts.agent,
3063
+ category: opts.category,
3064
+ limit: parseInt(opts.limit, 10),
3065
+ });
3066
+ if (opts.json) {
3067
+ console.log(JSON.stringify(results, null, 2));
3068
+ return;
3069
+ }
3070
+ console.log(chalk.magenta.bold(`\n SHADOW BRAIN v${VERSION} — Global Recall (${results.length})`));
3071
+ for (const r of results) {
3072
+ console.log(` ${chalk.cyan('[' + r.agentTool + ']')} ${chalk.dim(r.category)} ${chalk.white(r.content.slice(0, 100))}`);
3073
+ }
3074
+ }))
3075
+ .addCommand(new Command('cache')
3076
+ .description('Show L0 in-memory cache stats')
3077
+ .action(async () => {
3078
+ const { getAllCacheStats } = await import('./brain/l0-cache.js');
3079
+ const all = getAllCacheStats();
3080
+ console.log(chalk.magenta.bold(`\n SHADOW BRAIN v${VERSION} — L0 Cache`));
3081
+ for (const [name, s] of Object.entries(all)) {
3082
+ console.log(` ${chalk.cyan(name)}: ${s.entries} entries, ${(s.bytesUsed / 1024).toFixed(1)} KB / ${(s.bytesLimit / 1024 / 1024).toFixed(0)} MB, ${(s.hitRate * 100).toFixed(1)}% hits, ${s.avgAccessNs.toFixed(0)}ns avg`);
3083
+ }
3084
+ }))
3085
+ .addCommand(new Command('sync')
3086
+ .description('Force flush of pending writes to disk')
3087
+ .action(async () => {
3088
+ const { getGlobalBrain } = await import('./brain/global-brain.js');
3089
+ const brain = getGlobalBrain();
3090
+ await brain.init();
3091
+ await brain.sync();
3092
+ console.log(chalk.green(' ✓ Synced to disk.'));
3093
+ }));
3094
+ program.addCommand(attachCmd);
3095
+ program.addCommand(subconsciousCmd);
3096
+ program.addCommand(globalBrainCmd);
2932
3097
  program.parse();
2933
3098
  //# sourceMappingURL=cli.js.map