@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.
- package/README.md +1159 -1095
- package/dist/adapters/copilot.d.ts +14 -0
- package/dist/adapters/copilot.d.ts.map +1 -0
- package/dist/adapters/copilot.js +93 -0
- package/dist/adapters/copilot.js.map +1 -0
- package/dist/adapters/cursor.d.ts +13 -0
- package/dist/adapters/cursor.d.ts.map +1 -0
- package/dist/adapters/cursor.js +96 -0
- package/dist/adapters/cursor.js.map +1 -0
- package/dist/adapters/index.d.ts +4 -1
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +7 -3
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/windsurf.d.ts +14 -0
- package/dist/adapters/windsurf.d.ts.map +1 -0
- package/dist/adapters/windsurf.js +107 -0
- package/dist/adapters/windsurf.js.map +1 -0
- package/dist/brain/global-brain.d.ts +56 -0
- package/dist/brain/global-brain.d.ts.map +1 -0
- package/dist/brain/global-brain.js +324 -0
- package/dist/brain/global-brain.js.map +1 -0
- package/dist/brain/l0-cache.d.ts +40 -0
- package/dist/brain/l0-cache.d.ts.map +1 -0
- package/dist/brain/l0-cache.js +176 -0
- package/dist/brain/l0-cache.js.map +1 -0
- package/dist/brain/mcp-server.d.ts +4 -0
- package/dist/brain/mcp-server.d.ts.map +1 -1
- package/dist/brain/mcp-server.js +91 -0
- package/dist/brain/mcp-server.js.map +1 -1
- package/dist/brain/session-hooks.d.ts +28 -0
- package/dist/brain/session-hooks.d.ts.map +1 -0
- package/dist/brain/session-hooks.js +475 -0
- package/dist/brain/session-hooks.js.map +1 -0
- package/dist/brain/subconscious.d.ts +34 -0
- package/dist/brain/subconscious.d.ts.map +1 -0
- package/dist/brain/subconscious.js +275 -0
- package/dist/brain/subconscious.js.map +1 -0
- package/dist/cli.js +167 -2
- package/dist/cli.js.map +1 -1
- package/dist/types.d.ts +128 -1
- package/dist/types.d.ts.map +1 -1
- 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 {
|
|
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
|