@theihtisham/agent-shadow-brain 5.1.1 → 6.0.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 +355 -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/agent-firewall.d.ts +7 -0
- package/dist/brain/agent-firewall.d.ts.map +1 -0
- package/dist/brain/agent-firewall.js +152 -0
- package/dist/brain/agent-firewall.js.map +1 -0
- package/dist/brain/agent-handoff.d.ts +19 -0
- package/dist/brain/agent-handoff.d.ts.map +1 -0
- package/dist/brain/agent-handoff.js +127 -0
- package/dist/brain/agent-handoff.js.map +1 -0
- package/dist/brain/air-gap.d.ts +23 -0
- package/dist/brain/air-gap.d.ts.map +1 -0
- package/dist/brain/air-gap.js +137 -0
- package/dist/brain/air-gap.js.map +1 -0
- package/dist/brain/attention-heatmap.d.ts +24 -0
- package/dist/brain/attention-heatmap.d.ts.map +1 -0
- package/dist/brain/attention-heatmap.js +108 -0
- package/dist/brain/attention-heatmap.js.map +1 -0
- package/dist/brain/auto-setup.js +19 -14
- package/dist/brain/auto-setup.js.map +1 -1
- package/dist/brain/auto-update.js +1 -1
- package/dist/brain/brain-chat.d.ts +42 -0
- package/dist/brain/brain-chat.d.ts.map +1 -0
- package/dist/brain/brain-chat.js +162 -0
- package/dist/brain/brain-chat.js.map +1 -0
- package/dist/brain/brain-encryption.d.ts +14 -0
- package/dist/brain/brain-encryption.d.ts.map +1 -0
- package/dist/brain/brain-encryption.js +68 -0
- package/dist/brain/brain-encryption.js.map +1 -0
- package/dist/brain/brain-exchange.d.ts +30 -0
- package/dist/brain/brain-exchange.d.ts.map +1 -0
- package/dist/brain/brain-exchange.js +106 -0
- package/dist/brain/brain-exchange.js.map +1 -0
- package/dist/brain/brain-garden.d.ts +18 -0
- package/dist/brain/brain-garden.d.ts.map +1 -0
- package/dist/brain/brain-garden.js +81 -0
- package/dist/brain/brain-garden.js.map +1 -0
- package/dist/brain/brain-portability.js +1 -1
- package/dist/brain/branch-brain.d.ts +23 -0
- package/dist/brain/branch-brain.d.ts.map +1 -0
- package/dist/brain/branch-brain.js +159 -0
- package/dist/brain/branch-brain.js.map +1 -0
- package/dist/brain/calibration-monitor.d.ts +20 -0
- package/dist/brain/calibration-monitor.d.ts.map +1 -0
- package/dist/brain/calibration-monitor.js +144 -0
- package/dist/brain/calibration-monitor.js.map +1 -0
- package/dist/brain/causal-chains.d.ts +37 -0
- package/dist/brain/causal-chains.d.ts.map +1 -0
- package/dist/brain/causal-chains.js +250 -0
- package/dist/brain/causal-chains.js.map +1 -0
- package/dist/brain/collision-detective.d.ts +32 -0
- package/dist/brain/collision-detective.d.ts.map +1 -0
- package/dist/brain/collision-detective.js +233 -0
- package/dist/brain/collision-detective.js.map +1 -0
- package/dist/brain/cost-aware-spawner.d.ts +7 -0
- package/dist/brain/cost-aware-spawner.d.ts.map +1 -0
- package/dist/brain/cost-aware-spawner.js +77 -0
- package/dist/brain/cost-aware-spawner.js.map +1 -0
- package/dist/brain/dream-engine.d.ts +35 -0
- package/dist/brain/dream-engine.d.ts.map +1 -0
- package/dist/brain/dream-engine.js +273 -0
- package/dist/brain/dream-engine.js.map +1 -0
- package/dist/brain/embeddings.d.ts +27 -0
- package/dist/brain/embeddings.d.ts.map +1 -0
- package/dist/brain/embeddings.js +175 -0
- package/dist/brain/embeddings.js.map +1 -0
- package/dist/brain/forgetting-curve.d.ts +21 -0
- package/dist/brain/forgetting-curve.d.ts.map +1 -0
- package/dist/brain/forgetting-curve.js +174 -0
- package/dist/brain/forgetting-curve.js.map +1 -0
- package/dist/brain/formal-verification-bridge.d.ts +26 -0
- package/dist/brain/formal-verification-bridge.d.ts.map +1 -0
- package/dist/brain/formal-verification-bridge.js +219 -0
- package/dist/brain/formal-verification-bridge.js.map +1 -0
- package/dist/brain/global-brain.d.ts +63 -0
- package/dist/brain/global-brain.d.ts.map +1 -0
- package/dist/brain/global-brain.js +348 -0
- package/dist/brain/global-brain.js.map +1 -0
- package/dist/brain/hallucination-quarantine.d.ts +26 -0
- package/dist/brain/hallucination-quarantine.d.ts.map +1 -0
- package/dist/brain/hallucination-quarantine.js +135 -0
- package/dist/brain/hallucination-quarantine.js.map +1 -0
- package/dist/brain/hive-accelerator.d.ts +39 -0
- package/dist/brain/hive-accelerator.d.ts.map +1 -0
- package/dist/brain/hive-accelerator.js +152 -0
- package/dist/brain/hive-accelerator.js.map +1 -0
- package/dist/brain/json-output.d.ts +26 -0
- package/dist/brain/json-output.d.ts.map +1 -0
- package/dist/brain/json-output.js +112 -0
- package/dist/brain/json-output.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/local-llm.d.ts +20 -0
- package/dist/brain/local-llm.d.ts.map +1 -0
- package/dist/brain/local-llm.js +132 -0
- package/dist/brain/local-llm.js.map +1 -0
- package/dist/brain/mcp-server.d.ts +44 -0
- package/dist/brain/mcp-server.d.ts.map +1 -1
- package/dist/brain/mcp-server.js +486 -12
- package/dist/brain/mcp-server.js.map +1 -1
- package/dist/brain/model-registry.d.ts +96 -0
- package/dist/brain/model-registry.d.ts.map +1 -0
- package/dist/brain/model-registry.js +585 -0
- package/dist/brain/model-registry.js.map +1 -0
- package/dist/brain/orchestrator.js +1 -1
- package/dist/brain/pr-auto-review.d.ts +17 -0
- package/dist/brain/pr-auto-review.d.ts.map +1 -0
- package/dist/brain/pr-auto-review.js +73 -0
- package/dist/brain/pr-auto-review.js.map +1 -0
- package/dist/brain/pre-mortem.d.ts +21 -0
- package/dist/brain/pre-mortem.d.ts.map +1 -0
- package/dist/brain/pre-mortem.js +210 -0
- package/dist/brain/pre-mortem.js.map +1 -0
- package/dist/brain/prompt-cache.d.ts +54 -0
- package/dist/brain/prompt-cache.d.ts.map +1 -0
- package/dist/brain/prompt-cache.js +105 -0
- package/dist/brain/prompt-cache.js.map +1 -0
- package/dist/brain/reputation-ledger.d.ts +42 -0
- package/dist/brain/reputation-ledger.d.ts.map +1 -0
- package/dist/brain/reputation-ledger.js +326 -0
- package/dist/brain/reputation-ledger.js.map +1 -0
- package/dist/brain/session-hooks.d.ts +47 -0
- package/dist/brain/session-hooks.d.ts.map +1 -0
- package/dist/brain/session-hooks.js +706 -0
- package/dist/brain/session-hooks.js.map +1 -0
- package/dist/brain/subagent-bridge.d.ts +46 -0
- package/dist/brain/subagent-bridge.d.ts.map +1 -0
- package/dist/brain/subagent-bridge.js +364 -0
- package/dist/brain/subagent-bridge.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/brain/swarm-debate.d.ts +22 -0
- package/dist/brain/swarm-debate.d.ts.map +1 -0
- package/dist/brain/swarm-debate.js +134 -0
- package/dist/brain/swarm-debate.js.map +1 -0
- package/dist/brain/team-brain-sync.d.ts +22 -0
- package/dist/brain/team-brain-sync.d.ts.map +1 -0
- package/dist/brain/team-brain-sync.js +132 -0
- package/dist/brain/team-brain-sync.js.map +1 -0
- package/dist/brain/token-economy.d.ts +25 -0
- package/dist/brain/token-economy.d.ts.map +1 -0
- package/dist/brain/token-economy.js +216 -0
- package/dist/brain/token-economy.js.map +1 -0
- package/dist/brain/voice-mode.d.ts +15 -0
- package/dist/brain/voice-mode.d.ts.map +1 -0
- package/dist/brain/voice-mode.js +97 -0
- package/dist/brain/voice-mode.js.map +1 -0
- package/dist/cli.js +990 -6
- package/dist/cli.js.map +1 -1
- package/dist/dashboard/server.d.ts +6 -0
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +1118 -368
- package/dist/dashboard/server.js.map +1 -1
- package/dist/dashboard/v6-dashboard-html.d.ts +2 -0
- package/dist/dashboard/v6-dashboard-html.d.ts.map +1 -0
- package/dist/dashboard/v6-dashboard-html.js +2474 -0
- package/dist/dashboard/v6-dashboard-html.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +644 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +77 -12
package/dist/brain/mcp-server.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// src/brain/mcp-server.ts — JSON-RPC 2.0 MCP server over HTTP
|
|
2
2
|
// Exposes analysis tools via Model Context Protocol
|
|
3
|
-
//
|
|
3
|
+
// v6.0.0 — Hive Mind Edition (Cursor + Claude Code + Codex + Copilot + sub-agent frameworks)
|
|
4
4
|
import * as http from 'http';
|
|
5
5
|
export class MCPServer {
|
|
6
6
|
constructor(orchestrator, options) {
|
|
@@ -11,6 +11,8 @@ export class MCPServer {
|
|
|
11
11
|
this.options = {
|
|
12
12
|
port: options?.port ?? 7342,
|
|
13
13
|
host: options?.host ?? 'localhost',
|
|
14
|
+
authToken: options?.authToken ?? process.env.SHADOW_BRAIN_MCP_TOKEN ?? '',
|
|
15
|
+
corsOrigin: options?.corsOrigin ?? `http://${options?.host ?? 'localhost'}:${options?.port ?? 7342}`,
|
|
14
16
|
};
|
|
15
17
|
this.toolHandlers = {
|
|
16
18
|
analyze: this.handleAnalyze.bind(this),
|
|
@@ -32,8 +34,375 @@ export class MCPServer {
|
|
|
32
34
|
status: this.handleStatus.bind(this),
|
|
33
35
|
modules: this.handleModules.bind(this),
|
|
34
36
|
auto_config: this.handleAutoConfig.bind(this),
|
|
37
|
+
// v5.2.0 — Subconscious Singularity
|
|
38
|
+
subconscious_inject: this.handleSubconsciousInject.bind(this),
|
|
39
|
+
global_recall: this.handleGlobalRecall.bind(this),
|
|
40
|
+
global_stats: this.handleGlobalStats.bind(this),
|
|
41
|
+
attach_status: this.handleAttachStatus.bind(this),
|
|
42
|
+
global_timeline: this.handleGlobalTimeline.bind(this),
|
|
43
|
+
firewall_check: this.handleFirewallCheck.bind(this),
|
|
44
|
+
agent_handoff: this.handleAgentHandoff.bind(this),
|
|
45
|
+
// v6.0.0 — Hive Mind tools
|
|
46
|
+
subagent_sliver: this.handleSubagentSliver.bind(this),
|
|
47
|
+
subagent_quarantine_list: this.handleSubagentQuarantineList.bind(this),
|
|
48
|
+
subagent_graduate: this.handleSubagentGraduate.bind(this),
|
|
49
|
+
subagent_reject: this.handleSubagentReject.bind(this),
|
|
50
|
+
causal_link: this.handleCausalLink.bind(this),
|
|
51
|
+
causal_trace: this.handleCausalTrace.bind(this),
|
|
52
|
+
causal_influence: this.handleCausalInfluence.bind(this),
|
|
53
|
+
collision_declare: this.handleCollisionDeclare.bind(this),
|
|
54
|
+
collision_list: this.handleCollisionList.bind(this),
|
|
55
|
+
dream_run: this.handleDreamRun.bind(this),
|
|
56
|
+
dream_list: this.handleDreamList.bind(this),
|
|
57
|
+
reputation_sign: this.handleReputationSign.bind(this),
|
|
58
|
+
reputation_score: this.handleReputationScore.bind(this),
|
|
59
|
+
reputation_badge: this.handleReputationBadge.bind(this),
|
|
60
|
+
debate_run: this.handleDebateRun.bind(this),
|
|
61
|
+
premortem_run: this.handlePremortemRun.bind(this),
|
|
62
|
+
branch_state: this.handleBranchState.bind(this),
|
|
63
|
+
attention_heatmap: this.handleAttentionHeatmap.bind(this),
|
|
64
|
+
tokens_record: this.handleTokensRecord.bind(this),
|
|
65
|
+
tokens_report: this.handleTokensReport.bind(this),
|
|
66
|
+
forget_consolidate: this.handleForgetConsolidate.bind(this),
|
|
67
|
+
formal_generate: this.handleFormalGenerate.bind(this),
|
|
68
|
+
calibration_record: this.handleCalibrationRecord.bind(this),
|
|
69
|
+
calibration_scores: this.handleCalibrationScores.bind(this),
|
|
70
|
+
airgap_status: this.handleAirGapStatus.bind(this),
|
|
71
|
+
airgap_enable: this.handleAirGapEnable.bind(this),
|
|
72
|
+
airgap_disable: this.handleAirGapDisable.bind(this),
|
|
73
|
+
quarantine_list: this.handleQuarantineList.bind(this),
|
|
74
|
+
quarantine_promote: this.handleQuarantinePromote.bind(this),
|
|
75
|
+
voice_process: this.handleVoiceProcess.bind(this),
|
|
76
|
+
garden_snapshot: this.handleGardenSnapshot.bind(this),
|
|
77
|
+
pr_review_generate: this.handlePRReviewGenerate.bind(this),
|
|
78
|
+
exchange_export: this.handleExchangeExport.bind(this),
|
|
79
|
+
exchange_import: this.handleExchangeImport.bind(this),
|
|
80
|
+
exchange_list: this.handleExchangeList.bind(this),
|
|
81
|
+
hive_status: this.handleHiveStatus.bind(this),
|
|
35
82
|
};
|
|
36
83
|
}
|
|
84
|
+
// ── v6.0 Hive Mind handlers ────────────────────────────────────────────────
|
|
85
|
+
async handleSubagentSliver(params) {
|
|
86
|
+
const { getSubAgentBridge } = await import('./subagent-bridge.js');
|
|
87
|
+
const b = getSubAgentBridge();
|
|
88
|
+
const req = await b.registerSpawn({
|
|
89
|
+
parentAgent: params.parentAgent ?? 'claude-code',
|
|
90
|
+
subAgentId: params.subAgentId ?? `sub-${Date.now()}`,
|
|
91
|
+
framework: params.framework ?? 'claude-code-task',
|
|
92
|
+
taskDescription: params.taskDescription ?? '',
|
|
93
|
+
projectDir: params.projectDir ?? process.cwd(),
|
|
94
|
+
tokenBudget: params.tokenBudget,
|
|
95
|
+
});
|
|
96
|
+
return b.computeSliver(req);
|
|
97
|
+
}
|
|
98
|
+
async handleSubagentQuarantineList(_params) {
|
|
99
|
+
const { getSubAgentBridge } = await import('./subagent-bridge.js');
|
|
100
|
+
const b = getSubAgentBridge();
|
|
101
|
+
await b.init();
|
|
102
|
+
return b.listQuarantine();
|
|
103
|
+
}
|
|
104
|
+
async handleSubagentGraduate(params) {
|
|
105
|
+
const { getSubAgentBridge } = await import('./subagent-bridge.js');
|
|
106
|
+
return { ok: await getSubAgentBridge().graduate(params.memoryId) };
|
|
107
|
+
}
|
|
108
|
+
async handleSubagentReject(params) {
|
|
109
|
+
const { getSubAgentBridge } = await import('./subagent-bridge.js');
|
|
110
|
+
return { ok: await getSubAgentBridge().reject(params.memoryId, params.reason) };
|
|
111
|
+
}
|
|
112
|
+
async handleCausalLink(params) {
|
|
113
|
+
const { getCausalChains } = await import('./causal-chains.js');
|
|
114
|
+
return getCausalChains().link(params.effectId, params.causeId, params.rationale, params.strength ?? 1.0);
|
|
115
|
+
}
|
|
116
|
+
async handleCausalTrace(params) {
|
|
117
|
+
const { getCausalChains } = await import('./causal-chains.js');
|
|
118
|
+
return getCausalChains().trace(params.memoryId, { maxDepth: params.maxDepth ?? 8 });
|
|
119
|
+
}
|
|
120
|
+
async handleCausalInfluence(params) {
|
|
121
|
+
const { getCausalChains } = await import('./causal-chains.js');
|
|
122
|
+
return getCausalChains().influence(params.memoryId, { maxDepth: params.maxDepth ?? 6 });
|
|
123
|
+
}
|
|
124
|
+
async handleCollisionDeclare(params) {
|
|
125
|
+
const { getCollisionDetective } = await import('./collision-detective.js');
|
|
126
|
+
return getCollisionDetective().declareIntent(params.agentTool, params.sessionId, params.filePath, params.startLine, params.endLine, params.intent, params.ttlMs);
|
|
127
|
+
}
|
|
128
|
+
async handleCollisionList(_params) {
|
|
129
|
+
const { getCollisionDetective } = await import('./collision-detective.js');
|
|
130
|
+
const d = getCollisionDetective();
|
|
131
|
+
await d.init();
|
|
132
|
+
return { intents: d.activeIntents(), alerts: d.activeAlerts(), stats: d.getStats() };
|
|
133
|
+
}
|
|
134
|
+
async handleDreamRun(_params) {
|
|
135
|
+
const { getDreamEngine } = await import('./dream-engine.js');
|
|
136
|
+
return getDreamEngine().dreamOnce();
|
|
137
|
+
}
|
|
138
|
+
async handleDreamList(params) {
|
|
139
|
+
const { getDreamEngine } = await import('./dream-engine.js');
|
|
140
|
+
const d = getDreamEngine();
|
|
141
|
+
await d.init();
|
|
142
|
+
return d.listDreams({ unacknowledgedOnly: params.unacknowledgedOnly, limit: params.limit });
|
|
143
|
+
}
|
|
144
|
+
async handleReputationSign(params) {
|
|
145
|
+
const { getReputationLedger } = await import('./reputation-ledger.js');
|
|
146
|
+
return getReputationLedger().sign({
|
|
147
|
+
agentTool: params.agentTool,
|
|
148
|
+
agentVersion: params.agentVersion,
|
|
149
|
+
projectId: params.projectId,
|
|
150
|
+
decision: params.decision,
|
|
151
|
+
category: params.category,
|
|
152
|
+
confidence: params.confidence ?? 0.8,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
async handleReputationScore(params) {
|
|
156
|
+
const { getReputationLedger } = await import('./reputation-ledger.js');
|
|
157
|
+
const l = getReputationLedger();
|
|
158
|
+
await l.init();
|
|
159
|
+
return l.getScore(params.agentTool, params.agentVersion);
|
|
160
|
+
}
|
|
161
|
+
async handleReputationBadge(params) {
|
|
162
|
+
const { getReputationLedger } = await import('./reputation-ledger.js');
|
|
163
|
+
const l = getReputationLedger();
|
|
164
|
+
await l.init();
|
|
165
|
+
return { badge: l.badge(params.agentTool, params.agentVersion) };
|
|
166
|
+
}
|
|
167
|
+
async handleDebateRun(params) {
|
|
168
|
+
const { getSwarmDebate } = await import('./swarm-debate.js');
|
|
169
|
+
return getSwarmDebate().debate(params.question, params.context ?? '', { turns: params.turns ?? 2 });
|
|
170
|
+
}
|
|
171
|
+
async handlePremortemRun(params) {
|
|
172
|
+
const { getPreMortem } = await import('./pre-mortem.js');
|
|
173
|
+
return getPreMortem().run(params.taskDescription, params.projectDir ?? process.cwd());
|
|
174
|
+
}
|
|
175
|
+
async handleBranchState(params) {
|
|
176
|
+
const { getBranchBrain } = await import('./branch-brain.js');
|
|
177
|
+
return getBranchBrain().getState(params.projectDir ?? process.cwd());
|
|
178
|
+
}
|
|
179
|
+
async handleAttentionHeatmap(params) {
|
|
180
|
+
const { getAttentionHeatmap } = await import('./attention-heatmap.js');
|
|
181
|
+
return getAttentionHeatmap().compute({
|
|
182
|
+
decisionText: params.decisionText,
|
|
183
|
+
candidateMemoryIds: params.candidateMemoryIds ?? [],
|
|
184
|
+
agentTool: params.agentTool ?? 'claude-code',
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
async handleTokensRecord(params) {
|
|
188
|
+
const { getTokenEconomy } = await import('./token-economy.js');
|
|
189
|
+
return getTokenEconomy().record({
|
|
190
|
+
agentTool: params.agentTool,
|
|
191
|
+
model: params.model,
|
|
192
|
+
inputTokens: params.inputTokens,
|
|
193
|
+
outputTokens: params.outputTokens,
|
|
194
|
+
taskCategory: params.taskCategory,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
async handleTokensReport(_params) {
|
|
198
|
+
const { getTokenEconomy } = await import('./token-economy.js');
|
|
199
|
+
return getTokenEconomy().report();
|
|
200
|
+
}
|
|
201
|
+
async handleForgetConsolidate(_params) {
|
|
202
|
+
const { getForgettingCurve } = await import('./forgetting-curve.js');
|
|
203
|
+
return getForgettingCurve().runConsolidation();
|
|
204
|
+
}
|
|
205
|
+
async handleFormalGenerate(params) {
|
|
206
|
+
const { getFormalBridge } = await import('./formal-verification-bridge.js');
|
|
207
|
+
return getFormalBridge().generateFromText(params.text, params.sourceId);
|
|
208
|
+
}
|
|
209
|
+
async handleCalibrationRecord(params) {
|
|
210
|
+
const { getCalibrationMonitor } = await import('./calibration-monitor.js');
|
|
211
|
+
return getCalibrationMonitor().record({
|
|
212
|
+
agentTool: params.agentTool,
|
|
213
|
+
category: params.category,
|
|
214
|
+
claim: params.claim,
|
|
215
|
+
claimedConfidence: params.claimedConfidence,
|
|
216
|
+
actualOutcome: params.actualOutcome,
|
|
217
|
+
outcomeAt: new Date(),
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
async handleCalibrationScores(_params) {
|
|
221
|
+
const { getCalibrationMonitor } = await import('./calibration-monitor.js');
|
|
222
|
+
const m = getCalibrationMonitor();
|
|
223
|
+
await m.init();
|
|
224
|
+
return m.listScores();
|
|
225
|
+
}
|
|
226
|
+
async handleAirGapStatus(_params) {
|
|
227
|
+
const { getAirGapMode } = await import('./air-gap.js');
|
|
228
|
+
const a = getAirGapMode();
|
|
229
|
+
await a.init();
|
|
230
|
+
return a.status();
|
|
231
|
+
}
|
|
232
|
+
async handleAirGapEnable(params) {
|
|
233
|
+
const { getAirGapMode } = await import('./air-gap.js');
|
|
234
|
+
await getAirGapMode().enable(params.policy ?? 'strict');
|
|
235
|
+
return { ok: true };
|
|
236
|
+
}
|
|
237
|
+
async handleAirGapDisable(_params) {
|
|
238
|
+
const { getAirGapMode } = await import('./air-gap.js');
|
|
239
|
+
await getAirGapMode().disable();
|
|
240
|
+
return { ok: true };
|
|
241
|
+
}
|
|
242
|
+
async handleQuarantineList(params) {
|
|
243
|
+
const { getHallucinationQuarantine } = await import('./hallucination-quarantine.js');
|
|
244
|
+
const q = getHallucinationQuarantine();
|
|
245
|
+
await q.init();
|
|
246
|
+
return q.list({ pendingOnly: params.pendingOnly });
|
|
247
|
+
}
|
|
248
|
+
async handleQuarantinePromote(params) {
|
|
249
|
+
const { getHallucinationQuarantine } = await import('./hallucination-quarantine.js');
|
|
250
|
+
return { ok: await getHallucinationQuarantine().promote(params.id, params.projectId, params.agentTool ?? 'claude-code') };
|
|
251
|
+
}
|
|
252
|
+
async handleVoiceProcess(params) {
|
|
253
|
+
const { getVoiceMode } = await import('./voice-mode.js');
|
|
254
|
+
return getVoiceMode().process({ transcript: params.transcript, confidence: params.confidence, projectDir: params.projectDir });
|
|
255
|
+
}
|
|
256
|
+
async handleGardenSnapshot(params) {
|
|
257
|
+
const { getBrainGarden } = await import('./brain-garden.js');
|
|
258
|
+
return getBrainGarden().snapshot(params.limit ?? 100);
|
|
259
|
+
}
|
|
260
|
+
async handlePRReviewGenerate(params) {
|
|
261
|
+
const { getPRAutoReview } = await import('./pr-auto-review.js');
|
|
262
|
+
return getPRAutoReview().generate({
|
|
263
|
+
repo: params.repo,
|
|
264
|
+
prNumber: params.prNumber,
|
|
265
|
+
projectDir: params.projectDir ?? process.cwd(),
|
|
266
|
+
diffSummary: params.diffSummary,
|
|
267
|
+
changedFiles: params.changedFiles ?? [],
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
async handleExchangeExport(params) {
|
|
271
|
+
const { getBrainExchange } = await import('./brain-exchange.js');
|
|
272
|
+
return getBrainExchange().export({
|
|
273
|
+
name: params.name,
|
|
274
|
+
description: params.description ?? '',
|
|
275
|
+
author: params.author ?? 'anonymous',
|
|
276
|
+
categories: params.categories,
|
|
277
|
+
tags: params.tags,
|
|
278
|
+
limit: params.limit,
|
|
279
|
+
minImportance: params.minImportance,
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
async handleExchangeImport(params) {
|
|
283
|
+
const { getBrainExchange } = await import('./brain-exchange.js');
|
|
284
|
+
return getBrainExchange().import(params.filePath, { projectDir: params.projectDir ?? process.cwd(), agentTool: params.agentTool });
|
|
285
|
+
}
|
|
286
|
+
async handleExchangeList(_params) {
|
|
287
|
+
const { getBrainExchange } = await import('./brain-exchange.js');
|
|
288
|
+
return getBrainExchange().listLocal();
|
|
289
|
+
}
|
|
290
|
+
async handleHiveStatus(_params) {
|
|
291
|
+
const [{ getSubAgentBridge }, { getCausalChains }, { getCollisionDetective }, { getDreamEngine }, { getReputationLedger }, { getTokenEconomy }, { getFormalBridge }, { getAirGapMode }, { getGlobalBrain },] = await Promise.all([
|
|
292
|
+
import('./subagent-bridge.js'),
|
|
293
|
+
import('./causal-chains.js'),
|
|
294
|
+
import('./collision-detective.js'),
|
|
295
|
+
import('./dream-engine.js'),
|
|
296
|
+
import('./reputation-ledger.js'),
|
|
297
|
+
import('./token-economy.js'),
|
|
298
|
+
import('./formal-verification-bridge.js'),
|
|
299
|
+
import('./air-gap.js'),
|
|
300
|
+
import('./global-brain.js'),
|
|
301
|
+
]);
|
|
302
|
+
const sabb = getSubAgentBridge();
|
|
303
|
+
const causal = getCausalChains();
|
|
304
|
+
const collisions = getCollisionDetective();
|
|
305
|
+
const dream = getDreamEngine();
|
|
306
|
+
const rep = getReputationLedger();
|
|
307
|
+
const tokens = getTokenEconomy();
|
|
308
|
+
const formal = getFormalBridge();
|
|
309
|
+
const airgap = getAirGapMode();
|
|
310
|
+
const brain = getGlobalBrain();
|
|
311
|
+
await Promise.all([sabb.init(), causal.init(), collisions.init(), dream.init(), rep.init(), tokens.init(), formal.init(), airgap.init(), brain.init()]);
|
|
312
|
+
return {
|
|
313
|
+
version: '6.0.0',
|
|
314
|
+
modules: {
|
|
315
|
+
sabb: sabb.getStats(),
|
|
316
|
+
causal: causal.stats(),
|
|
317
|
+
collision: collisions.getStats(),
|
|
318
|
+
dream: dream.getStats(),
|
|
319
|
+
reputation: rep.stats(),
|
|
320
|
+
tokenEconomy: await tokens.report(),
|
|
321
|
+
formalBridge: formal.stats(),
|
|
322
|
+
airGap: airgap.status(),
|
|
323
|
+
},
|
|
324
|
+
localFirst: true,
|
|
325
|
+
totalAgentsConnected: brain.getStats().totalAgents,
|
|
326
|
+
totalMemoriesStored: brain.getStats().totalEntries,
|
|
327
|
+
generatedAt: new Date(),
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
// v5.2.0 handlers
|
|
331
|
+
async handleSubconsciousInject(params) {
|
|
332
|
+
const { getSubconscious } = await import('./subconscious.js');
|
|
333
|
+
const { GlobalBrain } = await import('./global-brain.js');
|
|
334
|
+
const projectDir = params.projectDir || process.cwd();
|
|
335
|
+
const agentTool = params.agentTool || 'claude-code';
|
|
336
|
+
const briefing = await getSubconscious().generateBriefing({
|
|
337
|
+
agentTool,
|
|
338
|
+
projectDir,
|
|
339
|
+
projectId: GlobalBrain.projectIdFor(projectDir),
|
|
340
|
+
currentTask: params.currentTask,
|
|
341
|
+
});
|
|
342
|
+
return briefing;
|
|
343
|
+
}
|
|
344
|
+
async handleGlobalRecall(params) {
|
|
345
|
+
const { getGlobalBrain } = await import('./global-brain.js');
|
|
346
|
+
const brain = getGlobalBrain();
|
|
347
|
+
await brain.init();
|
|
348
|
+
return brain.recall({
|
|
349
|
+
projectId: params.projectId,
|
|
350
|
+
agentTool: params.agentTool,
|
|
351
|
+
category: params.category,
|
|
352
|
+
keywords: params.keywords,
|
|
353
|
+
limit: params.limit ?? 20,
|
|
354
|
+
minImportance: params.minImportance,
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
async handleGlobalStats(_params) {
|
|
358
|
+
const { getGlobalBrain } = await import('./global-brain.js');
|
|
359
|
+
const { getAllCacheStats } = await import('./l0-cache.js');
|
|
360
|
+
const brain = getGlobalBrain();
|
|
361
|
+
await brain.init();
|
|
362
|
+
return {
|
|
363
|
+
brain: brain.getStats(),
|
|
364
|
+
caches: getAllCacheStats(),
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
async handleAttachStatus(params) {
|
|
368
|
+
const { getHookInstaller } = await import('./session-hooks.js');
|
|
369
|
+
const projectDir = params.projectDir || process.cwd();
|
|
370
|
+
const detected = await getHookInstaller().detectInstalled(projectDir);
|
|
371
|
+
return { detected, projectDir };
|
|
372
|
+
}
|
|
373
|
+
async handleGlobalTimeline(params) {
|
|
374
|
+
const { getGlobalBrain, GlobalBrain } = await import('./global-brain.js');
|
|
375
|
+
const projectDir = params.projectDir;
|
|
376
|
+
const brain = getGlobalBrain();
|
|
377
|
+
await brain.init();
|
|
378
|
+
return brain.timeline({
|
|
379
|
+
projectId: projectDir ? GlobalBrain.projectIdFor(projectDir) : params.projectId,
|
|
380
|
+
agentTool: params.agentTool,
|
|
381
|
+
category: params.category,
|
|
382
|
+
limit: params.limit ?? 30,
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
async handleFirewallCheck(params) {
|
|
386
|
+
const { AgentFirewall } = await import('./agent-firewall.js');
|
|
387
|
+
return new AgentFirewall().check({
|
|
388
|
+
command: params.command,
|
|
389
|
+
filePath: params.filePath,
|
|
390
|
+
url: params.url,
|
|
391
|
+
content: params.content,
|
|
392
|
+
toolName: params.toolName,
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
async handleAgentHandoff(params) {
|
|
396
|
+
const { AgentHandoff } = await import('./agent-handoff.js');
|
|
397
|
+
const projectDir = params.projectDir || process.cwd();
|
|
398
|
+
return new AgentHandoff().generate({
|
|
399
|
+
fromAgent: params.fromAgent || 'cursor',
|
|
400
|
+
toAgent: params.toAgent || 'codex',
|
|
401
|
+
projectDir,
|
|
402
|
+
task: params.task,
|
|
403
|
+
limit: params.limit ?? 12,
|
|
404
|
+
});
|
|
405
|
+
}
|
|
37
406
|
async start() {
|
|
38
407
|
this.server = http.createServer(async (req, res) => {
|
|
39
408
|
if (!req.url) {
|
|
@@ -41,16 +410,27 @@ export class MCPServer {
|
|
|
41
410
|
return;
|
|
42
411
|
}
|
|
43
412
|
const url = new URL(req.url, `http://${req.headers.host}`);
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
413
|
+
const origin = req.headers.origin;
|
|
414
|
+
const allowedOrigin = this.options.corsOrigin;
|
|
415
|
+
if (!origin || allowedOrigin === origin || allowedOrigin === '*') {
|
|
416
|
+
res.setHeader('Access-Control-Allow-Origin', origin || allowedOrigin);
|
|
417
|
+
}
|
|
418
|
+
res.setHeader('Vary', 'Origin');
|
|
419
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
|
|
420
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, Accept, X-Shadow-Brain-Token');
|
|
48
421
|
res.setHeader('Access-Control-Max-Age', '86400');
|
|
49
422
|
if (req.method === 'OPTIONS') {
|
|
50
423
|
res.writeHead(204);
|
|
51
424
|
res.end();
|
|
52
425
|
return;
|
|
53
426
|
}
|
|
427
|
+
if (!this.isAuthorized(req)) {
|
|
428
|
+
this.sendJSON(res, 401, {
|
|
429
|
+
error: 'Unauthorized',
|
|
430
|
+
message: 'Set SHADOW_BRAIN_MCP_TOKEN or pass --auth-token, then send Bearer or X-Shadow-Brain-Token.',
|
|
431
|
+
});
|
|
432
|
+
return;
|
|
433
|
+
}
|
|
54
434
|
if (req.method === 'POST' && (url.pathname === '/mcp' || url.pathname === '/')) {
|
|
55
435
|
await this.handleHTTPMCPRequest(req, res);
|
|
56
436
|
}
|
|
@@ -61,7 +441,7 @@ export class MCPServer {
|
|
|
61
441
|
// Lightweight health endpoint for tool connectivity checks
|
|
62
442
|
this.sendJSON(res, 200, {
|
|
63
443
|
status: 'ok',
|
|
64
|
-
version: '5.0
|
|
444
|
+
version: '5.2.0',
|
|
65
445
|
uptime: process.uptime(),
|
|
66
446
|
tools: Object.keys(this.toolHandlers).length,
|
|
67
447
|
});
|
|
@@ -165,8 +545,8 @@ export class MCPServer {
|
|
|
165
545
|
},
|
|
166
546
|
serverInfo: {
|
|
167
547
|
name: 'agent-shadow-brain',
|
|
168
|
-
version: '5.0
|
|
169
|
-
description: '
|
|
548
|
+
version: '5.2.0',
|
|
549
|
+
description: 'Cross-agent memory and safety layer for AI coding agents',
|
|
170
550
|
},
|
|
171
551
|
};
|
|
172
552
|
}
|
|
@@ -454,7 +834,7 @@ export class MCPServer {
|
|
|
454
834
|
async handleStatus(params) {
|
|
455
835
|
const status = this.orchestrator.getStatus?.() || {};
|
|
456
836
|
return {
|
|
457
|
-
version: '5.0
|
|
837
|
+
version: '5.2.0',
|
|
458
838
|
...status,
|
|
459
839
|
};
|
|
460
840
|
}
|
|
@@ -480,7 +860,7 @@ export class MCPServer {
|
|
|
480
860
|
const instance = this.orchestrator[mod.key];
|
|
481
861
|
modules.push({
|
|
482
862
|
name: mod.name,
|
|
483
|
-
version: '5.0
|
|
863
|
+
version: '5.2.0',
|
|
484
864
|
status: instance ? 'active' : 'idle',
|
|
485
865
|
});
|
|
486
866
|
}
|
|
@@ -673,6 +1053,91 @@ export class MCPServer {
|
|
|
673
1053
|
description: 'Auto-detect project configuration — languages, frameworks, AI tools',
|
|
674
1054
|
inputSchema: { type: 'object', properties: {} },
|
|
675
1055
|
},
|
|
1056
|
+
// v5.2.0 — Subconscious Singularity
|
|
1057
|
+
{
|
|
1058
|
+
name: 'subconscious_inject',
|
|
1059
|
+
description: 'Generate a session-start briefing — proactive context injection for the agent (v5.2.0)',
|
|
1060
|
+
inputSchema: {
|
|
1061
|
+
type: 'object',
|
|
1062
|
+
properties: {
|
|
1063
|
+
projectDir: { type: 'string', description: 'Project directory (defaults to cwd)' },
|
|
1064
|
+
agentTool: { type: 'string', description: 'Agent tool name (claude-code, cursor, cline, etc.)' },
|
|
1065
|
+
currentTask: { type: 'string', description: 'Optional task hint for similarity search' },
|
|
1066
|
+
},
|
|
1067
|
+
},
|
|
1068
|
+
},
|
|
1069
|
+
{
|
|
1070
|
+
name: 'global_recall',
|
|
1071
|
+
description: 'Recall from the singleton global brain — works across all projects + all agents (v5.2.0)',
|
|
1072
|
+
inputSchema: {
|
|
1073
|
+
type: 'object',
|
|
1074
|
+
properties: {
|
|
1075
|
+
projectId: { type: 'string' },
|
|
1076
|
+
agentTool: { type: 'string' },
|
|
1077
|
+
category: { type: 'string' },
|
|
1078
|
+
keywords: { type: 'array', items: { type: 'string' } },
|
|
1079
|
+
limit: { type: 'number' },
|
|
1080
|
+
minImportance: { type: 'number' },
|
|
1081
|
+
},
|
|
1082
|
+
},
|
|
1083
|
+
},
|
|
1084
|
+
{
|
|
1085
|
+
name: 'global_stats',
|
|
1086
|
+
description: 'Get global brain + L0 cache stats (v5.2.0)',
|
|
1087
|
+
inputSchema: { type: 'object', properties: {} },
|
|
1088
|
+
},
|
|
1089
|
+
{
|
|
1090
|
+
name: 'attach_status',
|
|
1091
|
+
description: 'Detect which AI agents are installed on this machine (v5.2.0)',
|
|
1092
|
+
inputSchema: {
|
|
1093
|
+
type: 'object',
|
|
1094
|
+
properties: {
|
|
1095
|
+
projectDir: { type: 'string' },
|
|
1096
|
+
},
|
|
1097
|
+
},
|
|
1098
|
+
},
|
|
1099
|
+
{
|
|
1100
|
+
name: 'global_timeline',
|
|
1101
|
+
description: 'Show the proof timeline of what agents learned and when (v5.2.0)',
|
|
1102
|
+
inputSchema: {
|
|
1103
|
+
type: 'object',
|
|
1104
|
+
properties: {
|
|
1105
|
+
projectDir: { type: 'string' },
|
|
1106
|
+
projectId: { type: 'string' },
|
|
1107
|
+
agentTool: { type: 'string' },
|
|
1108
|
+
category: { type: 'string' },
|
|
1109
|
+
limit: { type: 'number' },
|
|
1110
|
+
},
|
|
1111
|
+
},
|
|
1112
|
+
},
|
|
1113
|
+
{
|
|
1114
|
+
name: 'firewall_check',
|
|
1115
|
+
description: 'Agent Safety Firewall — check a command, file path, URL, or prompt before the agent acts',
|
|
1116
|
+
inputSchema: {
|
|
1117
|
+
type: 'object',
|
|
1118
|
+
properties: {
|
|
1119
|
+
command: { type: 'string' },
|
|
1120
|
+
filePath: { type: 'string' },
|
|
1121
|
+
url: { type: 'string' },
|
|
1122
|
+
content: { type: 'string' },
|
|
1123
|
+
toolName: { type: 'string' },
|
|
1124
|
+
},
|
|
1125
|
+
},
|
|
1126
|
+
},
|
|
1127
|
+
{
|
|
1128
|
+
name: 'agent_handoff',
|
|
1129
|
+
description: 'Create a cross-agent continuation packet from one AI coding agent to another',
|
|
1130
|
+
inputSchema: {
|
|
1131
|
+
type: 'object',
|
|
1132
|
+
properties: {
|
|
1133
|
+
fromAgent: { type: 'string' },
|
|
1134
|
+
toAgent: { type: 'string' },
|
|
1135
|
+
projectDir: { type: 'string' },
|
|
1136
|
+
task: { type: 'string' },
|
|
1137
|
+
limit: { type: 'number' },
|
|
1138
|
+
},
|
|
1139
|
+
},
|
|
1140
|
+
},
|
|
676
1141
|
];
|
|
677
1142
|
}
|
|
678
1143
|
// ── HTTP Handling ──────────────────────────────────────────────────────
|
|
@@ -704,15 +1169,24 @@ export class MCPServer {
|
|
|
704
1169
|
'Content-Type': 'text/event-stream',
|
|
705
1170
|
'Cache-Control': 'no-cache',
|
|
706
1171
|
Connection: 'keep-alive',
|
|
707
|
-
'Access-Control-Allow-Origin':
|
|
1172
|
+
'Access-Control-Allow-Origin': this.options.corsOrigin,
|
|
708
1173
|
});
|
|
709
|
-
res.write(`event: connected\ndata: {"clientId":"${clientId}","version":"5.0
|
|
1174
|
+
res.write(`event: connected\ndata: {"clientId":"${clientId}","version":"5.2.0"}\n\n`);
|
|
710
1175
|
const client = { res, id: clientId };
|
|
711
1176
|
this.sseClients.set(clientId, client);
|
|
712
1177
|
req.on('close', () => {
|
|
713
1178
|
this.sseClients.delete(clientId);
|
|
714
1179
|
});
|
|
715
1180
|
}
|
|
1181
|
+
isAuthorized(req) {
|
|
1182
|
+
if (!this.options.authToken)
|
|
1183
|
+
return true;
|
|
1184
|
+
const auth = req.headers.authorization || '';
|
|
1185
|
+
const tokenHeader = req.headers['x-shadow-brain-token'];
|
|
1186
|
+
const bearer = auth.startsWith('Bearer ') ? auth.slice('Bearer '.length) : '';
|
|
1187
|
+
const token = Array.isArray(tokenHeader) ? tokenHeader[0] : tokenHeader;
|
|
1188
|
+
return bearer === this.options.authToken || token === this.options.authToken;
|
|
1189
|
+
}
|
|
716
1190
|
broadcastSSE(event, data) {
|
|
717
1191
|
const payload = `event: ${event}\ndata: ${JSON.stringify(data)}\n\n`;
|
|
718
1192
|
const deadClients = [];
|