@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.
Files changed (183) hide show
  1. package/README.md +355 -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/agent-firewall.d.ts +7 -0
  19. package/dist/brain/agent-firewall.d.ts.map +1 -0
  20. package/dist/brain/agent-firewall.js +152 -0
  21. package/dist/brain/agent-firewall.js.map +1 -0
  22. package/dist/brain/agent-handoff.d.ts +19 -0
  23. package/dist/brain/agent-handoff.d.ts.map +1 -0
  24. package/dist/brain/agent-handoff.js +127 -0
  25. package/dist/brain/agent-handoff.js.map +1 -0
  26. package/dist/brain/air-gap.d.ts +23 -0
  27. package/dist/brain/air-gap.d.ts.map +1 -0
  28. package/dist/brain/air-gap.js +137 -0
  29. package/dist/brain/air-gap.js.map +1 -0
  30. package/dist/brain/attention-heatmap.d.ts +24 -0
  31. package/dist/brain/attention-heatmap.d.ts.map +1 -0
  32. package/dist/brain/attention-heatmap.js +108 -0
  33. package/dist/brain/attention-heatmap.js.map +1 -0
  34. package/dist/brain/auto-setup.js +19 -14
  35. package/dist/brain/auto-setup.js.map +1 -1
  36. package/dist/brain/auto-update.js +1 -1
  37. package/dist/brain/brain-chat.d.ts +42 -0
  38. package/dist/brain/brain-chat.d.ts.map +1 -0
  39. package/dist/brain/brain-chat.js +162 -0
  40. package/dist/brain/brain-chat.js.map +1 -0
  41. package/dist/brain/brain-encryption.d.ts +14 -0
  42. package/dist/brain/brain-encryption.d.ts.map +1 -0
  43. package/dist/brain/brain-encryption.js +68 -0
  44. package/dist/brain/brain-encryption.js.map +1 -0
  45. package/dist/brain/brain-exchange.d.ts +30 -0
  46. package/dist/brain/brain-exchange.d.ts.map +1 -0
  47. package/dist/brain/brain-exchange.js +106 -0
  48. package/dist/brain/brain-exchange.js.map +1 -0
  49. package/dist/brain/brain-garden.d.ts +18 -0
  50. package/dist/brain/brain-garden.d.ts.map +1 -0
  51. package/dist/brain/brain-garden.js +81 -0
  52. package/dist/brain/brain-garden.js.map +1 -0
  53. package/dist/brain/brain-portability.js +1 -1
  54. package/dist/brain/branch-brain.d.ts +23 -0
  55. package/dist/brain/branch-brain.d.ts.map +1 -0
  56. package/dist/brain/branch-brain.js +159 -0
  57. package/dist/brain/branch-brain.js.map +1 -0
  58. package/dist/brain/calibration-monitor.d.ts +20 -0
  59. package/dist/brain/calibration-monitor.d.ts.map +1 -0
  60. package/dist/brain/calibration-monitor.js +144 -0
  61. package/dist/brain/calibration-monitor.js.map +1 -0
  62. package/dist/brain/causal-chains.d.ts +37 -0
  63. package/dist/brain/causal-chains.d.ts.map +1 -0
  64. package/dist/brain/causal-chains.js +250 -0
  65. package/dist/brain/causal-chains.js.map +1 -0
  66. package/dist/brain/collision-detective.d.ts +32 -0
  67. package/dist/brain/collision-detective.d.ts.map +1 -0
  68. package/dist/brain/collision-detective.js +233 -0
  69. package/dist/brain/collision-detective.js.map +1 -0
  70. package/dist/brain/cost-aware-spawner.d.ts +7 -0
  71. package/dist/brain/cost-aware-spawner.d.ts.map +1 -0
  72. package/dist/brain/cost-aware-spawner.js +77 -0
  73. package/dist/brain/cost-aware-spawner.js.map +1 -0
  74. package/dist/brain/dream-engine.d.ts +35 -0
  75. package/dist/brain/dream-engine.d.ts.map +1 -0
  76. package/dist/brain/dream-engine.js +273 -0
  77. package/dist/brain/dream-engine.js.map +1 -0
  78. package/dist/brain/embeddings.d.ts +27 -0
  79. package/dist/brain/embeddings.d.ts.map +1 -0
  80. package/dist/brain/embeddings.js +175 -0
  81. package/dist/brain/embeddings.js.map +1 -0
  82. package/dist/brain/forgetting-curve.d.ts +21 -0
  83. package/dist/brain/forgetting-curve.d.ts.map +1 -0
  84. package/dist/brain/forgetting-curve.js +174 -0
  85. package/dist/brain/forgetting-curve.js.map +1 -0
  86. package/dist/brain/formal-verification-bridge.d.ts +26 -0
  87. package/dist/brain/formal-verification-bridge.d.ts.map +1 -0
  88. package/dist/brain/formal-verification-bridge.js +219 -0
  89. package/dist/brain/formal-verification-bridge.js.map +1 -0
  90. package/dist/brain/global-brain.d.ts +63 -0
  91. package/dist/brain/global-brain.d.ts.map +1 -0
  92. package/dist/brain/global-brain.js +348 -0
  93. package/dist/brain/global-brain.js.map +1 -0
  94. package/dist/brain/hallucination-quarantine.d.ts +26 -0
  95. package/dist/brain/hallucination-quarantine.d.ts.map +1 -0
  96. package/dist/brain/hallucination-quarantine.js +135 -0
  97. package/dist/brain/hallucination-quarantine.js.map +1 -0
  98. package/dist/brain/hive-accelerator.d.ts +39 -0
  99. package/dist/brain/hive-accelerator.d.ts.map +1 -0
  100. package/dist/brain/hive-accelerator.js +152 -0
  101. package/dist/brain/hive-accelerator.js.map +1 -0
  102. package/dist/brain/json-output.d.ts +26 -0
  103. package/dist/brain/json-output.d.ts.map +1 -0
  104. package/dist/brain/json-output.js +112 -0
  105. package/dist/brain/json-output.js.map +1 -0
  106. package/dist/brain/l0-cache.d.ts +40 -0
  107. package/dist/brain/l0-cache.d.ts.map +1 -0
  108. package/dist/brain/l0-cache.js +176 -0
  109. package/dist/brain/l0-cache.js.map +1 -0
  110. package/dist/brain/local-llm.d.ts +20 -0
  111. package/dist/brain/local-llm.d.ts.map +1 -0
  112. package/dist/brain/local-llm.js +132 -0
  113. package/dist/brain/local-llm.js.map +1 -0
  114. package/dist/brain/mcp-server.d.ts +44 -0
  115. package/dist/brain/mcp-server.d.ts.map +1 -1
  116. package/dist/brain/mcp-server.js +486 -12
  117. package/dist/brain/mcp-server.js.map +1 -1
  118. package/dist/brain/model-registry.d.ts +96 -0
  119. package/dist/brain/model-registry.d.ts.map +1 -0
  120. package/dist/brain/model-registry.js +585 -0
  121. package/dist/brain/model-registry.js.map +1 -0
  122. package/dist/brain/orchestrator.js +1 -1
  123. package/dist/brain/pr-auto-review.d.ts +17 -0
  124. package/dist/brain/pr-auto-review.d.ts.map +1 -0
  125. package/dist/brain/pr-auto-review.js +73 -0
  126. package/dist/brain/pr-auto-review.js.map +1 -0
  127. package/dist/brain/pre-mortem.d.ts +21 -0
  128. package/dist/brain/pre-mortem.d.ts.map +1 -0
  129. package/dist/brain/pre-mortem.js +210 -0
  130. package/dist/brain/pre-mortem.js.map +1 -0
  131. package/dist/brain/prompt-cache.d.ts +54 -0
  132. package/dist/brain/prompt-cache.d.ts.map +1 -0
  133. package/dist/brain/prompt-cache.js +105 -0
  134. package/dist/brain/prompt-cache.js.map +1 -0
  135. package/dist/brain/reputation-ledger.d.ts +42 -0
  136. package/dist/brain/reputation-ledger.d.ts.map +1 -0
  137. package/dist/brain/reputation-ledger.js +326 -0
  138. package/dist/brain/reputation-ledger.js.map +1 -0
  139. package/dist/brain/session-hooks.d.ts +47 -0
  140. package/dist/brain/session-hooks.d.ts.map +1 -0
  141. package/dist/brain/session-hooks.js +706 -0
  142. package/dist/brain/session-hooks.js.map +1 -0
  143. package/dist/brain/subagent-bridge.d.ts +46 -0
  144. package/dist/brain/subagent-bridge.d.ts.map +1 -0
  145. package/dist/brain/subagent-bridge.js +364 -0
  146. package/dist/brain/subagent-bridge.js.map +1 -0
  147. package/dist/brain/subconscious.d.ts +34 -0
  148. package/dist/brain/subconscious.d.ts.map +1 -0
  149. package/dist/brain/subconscious.js +275 -0
  150. package/dist/brain/subconscious.js.map +1 -0
  151. package/dist/brain/swarm-debate.d.ts +22 -0
  152. package/dist/brain/swarm-debate.d.ts.map +1 -0
  153. package/dist/brain/swarm-debate.js +134 -0
  154. package/dist/brain/swarm-debate.js.map +1 -0
  155. package/dist/brain/team-brain-sync.d.ts +22 -0
  156. package/dist/brain/team-brain-sync.d.ts.map +1 -0
  157. package/dist/brain/team-brain-sync.js +132 -0
  158. package/dist/brain/team-brain-sync.js.map +1 -0
  159. package/dist/brain/token-economy.d.ts +25 -0
  160. package/dist/brain/token-economy.d.ts.map +1 -0
  161. package/dist/brain/token-economy.js +216 -0
  162. package/dist/brain/token-economy.js.map +1 -0
  163. package/dist/brain/voice-mode.d.ts +15 -0
  164. package/dist/brain/voice-mode.d.ts.map +1 -0
  165. package/dist/brain/voice-mode.js +97 -0
  166. package/dist/brain/voice-mode.js.map +1 -0
  167. package/dist/cli.js +990 -6
  168. package/dist/cli.js.map +1 -1
  169. package/dist/dashboard/server.d.ts +6 -0
  170. package/dist/dashboard/server.d.ts.map +1 -1
  171. package/dist/dashboard/server.js +1118 -368
  172. package/dist/dashboard/server.js.map +1 -1
  173. package/dist/dashboard/v6-dashboard-html.d.ts +2 -0
  174. package/dist/dashboard/v6-dashboard-html.d.ts.map +1 -0
  175. package/dist/dashboard/v6-dashboard-html.js +2474 -0
  176. package/dist/dashboard/v6-dashboard-html.js.map +1 -0
  177. package/dist/index.d.ts +27 -0
  178. package/dist/index.d.ts.map +1 -1
  179. package/dist/index.js +29 -1
  180. package/dist/index.js.map +1 -1
  181. package/dist/types.d.ts +644 -1
  182. package/dist/types.d.ts.map +1 -1
  183. package/package.json +77 -12
@@ -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
- // v5.0.1 — Infinite Intelligence Edition (Cursor + Claude Code + Kilo Code compatible)
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
- // CORS headers — permissive for Cursor, Claude Code, and other AI tools
45
- res.setHeader('Access-Control-Allow-Origin', '*');
46
- res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, DELETE');
47
- res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, Accept');
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.1',
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.1',
169
- description: 'World\'s #1 AI coding intelligence layer — infinite memory, multi-agent consensus, self-evolving',
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.1',
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.1',
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.1"}\n\n`);
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 = [];