@theihtisham/agent-shadow-brain 5.2.0 → 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 (161) hide show
  1. package/README.md +225 -1029
  2. package/dist/brain/agent-firewall.d.ts +7 -0
  3. package/dist/brain/agent-firewall.d.ts.map +1 -0
  4. package/dist/brain/agent-firewall.js +152 -0
  5. package/dist/brain/agent-firewall.js.map +1 -0
  6. package/dist/brain/agent-handoff.d.ts +19 -0
  7. package/dist/brain/agent-handoff.d.ts.map +1 -0
  8. package/dist/brain/agent-handoff.js +127 -0
  9. package/dist/brain/agent-handoff.js.map +1 -0
  10. package/dist/brain/air-gap.d.ts +23 -0
  11. package/dist/brain/air-gap.d.ts.map +1 -0
  12. package/dist/brain/air-gap.js +137 -0
  13. package/dist/brain/air-gap.js.map +1 -0
  14. package/dist/brain/attention-heatmap.d.ts +24 -0
  15. package/dist/brain/attention-heatmap.d.ts.map +1 -0
  16. package/dist/brain/attention-heatmap.js +108 -0
  17. package/dist/brain/attention-heatmap.js.map +1 -0
  18. package/dist/brain/auto-setup.js +19 -14
  19. package/dist/brain/auto-setup.js.map +1 -1
  20. package/dist/brain/auto-update.js +1 -1
  21. package/dist/brain/brain-chat.d.ts +42 -0
  22. package/dist/brain/brain-chat.d.ts.map +1 -0
  23. package/dist/brain/brain-chat.js +162 -0
  24. package/dist/brain/brain-chat.js.map +1 -0
  25. package/dist/brain/brain-encryption.d.ts +14 -0
  26. package/dist/brain/brain-encryption.d.ts.map +1 -0
  27. package/dist/brain/brain-encryption.js +68 -0
  28. package/dist/brain/brain-encryption.js.map +1 -0
  29. package/dist/brain/brain-exchange.d.ts +30 -0
  30. package/dist/brain/brain-exchange.d.ts.map +1 -0
  31. package/dist/brain/brain-exchange.js +106 -0
  32. package/dist/brain/brain-exchange.js.map +1 -0
  33. package/dist/brain/brain-garden.d.ts +18 -0
  34. package/dist/brain/brain-garden.d.ts.map +1 -0
  35. package/dist/brain/brain-garden.js +81 -0
  36. package/dist/brain/brain-garden.js.map +1 -0
  37. package/dist/brain/brain-portability.js +1 -1
  38. package/dist/brain/branch-brain.d.ts +23 -0
  39. package/dist/brain/branch-brain.d.ts.map +1 -0
  40. package/dist/brain/branch-brain.js +159 -0
  41. package/dist/brain/branch-brain.js.map +1 -0
  42. package/dist/brain/calibration-monitor.d.ts +20 -0
  43. package/dist/brain/calibration-monitor.d.ts.map +1 -0
  44. package/dist/brain/calibration-monitor.js +144 -0
  45. package/dist/brain/calibration-monitor.js.map +1 -0
  46. package/dist/brain/causal-chains.d.ts +37 -0
  47. package/dist/brain/causal-chains.d.ts.map +1 -0
  48. package/dist/brain/causal-chains.js +250 -0
  49. package/dist/brain/causal-chains.js.map +1 -0
  50. package/dist/brain/collision-detective.d.ts +32 -0
  51. package/dist/brain/collision-detective.d.ts.map +1 -0
  52. package/dist/brain/collision-detective.js +233 -0
  53. package/dist/brain/collision-detective.js.map +1 -0
  54. package/dist/brain/cost-aware-spawner.d.ts +7 -0
  55. package/dist/brain/cost-aware-spawner.d.ts.map +1 -0
  56. package/dist/brain/cost-aware-spawner.js +77 -0
  57. package/dist/brain/cost-aware-spawner.js.map +1 -0
  58. package/dist/brain/dream-engine.d.ts +35 -0
  59. package/dist/brain/dream-engine.d.ts.map +1 -0
  60. package/dist/brain/dream-engine.js +273 -0
  61. package/dist/brain/dream-engine.js.map +1 -0
  62. package/dist/brain/embeddings.d.ts +27 -0
  63. package/dist/brain/embeddings.d.ts.map +1 -0
  64. package/dist/brain/embeddings.js +175 -0
  65. package/dist/brain/embeddings.js.map +1 -0
  66. package/dist/brain/forgetting-curve.d.ts +21 -0
  67. package/dist/brain/forgetting-curve.d.ts.map +1 -0
  68. package/dist/brain/forgetting-curve.js +174 -0
  69. package/dist/brain/forgetting-curve.js.map +1 -0
  70. package/dist/brain/formal-verification-bridge.d.ts +26 -0
  71. package/dist/brain/formal-verification-bridge.d.ts.map +1 -0
  72. package/dist/brain/formal-verification-bridge.js +219 -0
  73. package/dist/brain/formal-verification-bridge.js.map +1 -0
  74. package/dist/brain/global-brain.d.ts +8 -1
  75. package/dist/brain/global-brain.d.ts.map +1 -1
  76. package/dist/brain/global-brain.js +24 -0
  77. package/dist/brain/global-brain.js.map +1 -1
  78. package/dist/brain/hallucination-quarantine.d.ts +26 -0
  79. package/dist/brain/hallucination-quarantine.d.ts.map +1 -0
  80. package/dist/brain/hallucination-quarantine.js +135 -0
  81. package/dist/brain/hallucination-quarantine.js.map +1 -0
  82. package/dist/brain/hive-accelerator.d.ts +39 -0
  83. package/dist/brain/hive-accelerator.d.ts.map +1 -0
  84. package/dist/brain/hive-accelerator.js +152 -0
  85. package/dist/brain/hive-accelerator.js.map +1 -0
  86. package/dist/brain/json-output.d.ts +26 -0
  87. package/dist/brain/json-output.d.ts.map +1 -0
  88. package/dist/brain/json-output.js +112 -0
  89. package/dist/brain/json-output.js.map +1 -0
  90. package/dist/brain/l0-cache.js +1 -1
  91. package/dist/brain/l0-cache.js.map +1 -1
  92. package/dist/brain/local-llm.d.ts +20 -0
  93. package/dist/brain/local-llm.d.ts.map +1 -0
  94. package/dist/brain/local-llm.js +132 -0
  95. package/dist/brain/local-llm.js.map +1 -0
  96. package/dist/brain/mcp-server.d.ts +40 -0
  97. package/dist/brain/mcp-server.d.ts.map +1 -1
  98. package/dist/brain/mcp-server.js +395 -12
  99. package/dist/brain/mcp-server.js.map +1 -1
  100. package/dist/brain/model-registry.d.ts +96 -0
  101. package/dist/brain/model-registry.d.ts.map +1 -0
  102. package/dist/brain/model-registry.js +585 -0
  103. package/dist/brain/model-registry.js.map +1 -0
  104. package/dist/brain/orchestrator.js +1 -1
  105. package/dist/brain/pr-auto-review.d.ts +17 -0
  106. package/dist/brain/pr-auto-review.d.ts.map +1 -0
  107. package/dist/brain/pr-auto-review.js +73 -0
  108. package/dist/brain/pr-auto-review.js.map +1 -0
  109. package/dist/brain/pre-mortem.d.ts +21 -0
  110. package/dist/brain/pre-mortem.d.ts.map +1 -0
  111. package/dist/brain/pre-mortem.js +210 -0
  112. package/dist/brain/pre-mortem.js.map +1 -0
  113. package/dist/brain/prompt-cache.d.ts +54 -0
  114. package/dist/brain/prompt-cache.d.ts.map +1 -0
  115. package/dist/brain/prompt-cache.js +105 -0
  116. package/dist/brain/prompt-cache.js.map +1 -0
  117. package/dist/brain/reputation-ledger.d.ts +42 -0
  118. package/dist/brain/reputation-ledger.d.ts.map +1 -0
  119. package/dist/brain/reputation-ledger.js +326 -0
  120. package/dist/brain/reputation-ledger.js.map +1 -0
  121. package/dist/brain/session-hooks.d.ts +19 -0
  122. package/dist/brain/session-hooks.d.ts.map +1 -1
  123. package/dist/brain/session-hooks.js +249 -18
  124. package/dist/brain/session-hooks.js.map +1 -1
  125. package/dist/brain/subagent-bridge.d.ts +46 -0
  126. package/dist/brain/subagent-bridge.d.ts.map +1 -0
  127. package/dist/brain/subagent-bridge.js +364 -0
  128. package/dist/brain/subagent-bridge.js.map +1 -0
  129. package/dist/brain/swarm-debate.d.ts +22 -0
  130. package/dist/brain/swarm-debate.d.ts.map +1 -0
  131. package/dist/brain/swarm-debate.js +134 -0
  132. package/dist/brain/swarm-debate.js.map +1 -0
  133. package/dist/brain/team-brain-sync.d.ts +22 -0
  134. package/dist/brain/team-brain-sync.d.ts.map +1 -0
  135. package/dist/brain/team-brain-sync.js +132 -0
  136. package/dist/brain/team-brain-sync.js.map +1 -0
  137. package/dist/brain/token-economy.d.ts +25 -0
  138. package/dist/brain/token-economy.d.ts.map +1 -0
  139. package/dist/brain/token-economy.js +216 -0
  140. package/dist/brain/token-economy.js.map +1 -0
  141. package/dist/brain/voice-mode.d.ts +15 -0
  142. package/dist/brain/voice-mode.d.ts.map +1 -0
  143. package/dist/brain/voice-mode.js +97 -0
  144. package/dist/brain/voice-mode.js.map +1 -0
  145. package/dist/cli.js +823 -4
  146. package/dist/cli.js.map +1 -1
  147. package/dist/dashboard/server.d.ts +6 -0
  148. package/dist/dashboard/server.d.ts.map +1 -1
  149. package/dist/dashboard/server.js +1118 -368
  150. package/dist/dashboard/server.js.map +1 -1
  151. package/dist/dashboard/v6-dashboard-html.d.ts +2 -0
  152. package/dist/dashboard/v6-dashboard-html.d.ts.map +1 -0
  153. package/dist/dashboard/v6-dashboard-html.js +2474 -0
  154. package/dist/dashboard/v6-dashboard-html.js.map +1 -0
  155. package/dist/index.d.ts +27 -0
  156. package/dist/index.d.ts.map +1 -1
  157. package/dist/index.js +29 -1
  158. package/dist/index.js.map +1 -1
  159. package/dist/types.d.ts +518 -2
  160. package/dist/types.d.ts.map +1 -1
  161. package/package.json +33 -4
@@ -0,0 +1,364 @@
1
+ // src/brain/subagent-bridge.ts — Sub-Agent Brain Bridge (SABB)
2
+ // v6.0.0 — Hive Mind Edition
3
+ //
4
+ // When a parent agent (Claude Code Task, Cursor Composer, CrewAI, LangGraph, AutoGen)
5
+ // spawns a sub-agent, SABB:
6
+ // 1. Detects the spawn (via MCP handshake or CLI call)
7
+ // 2. Computes a context sliver — the 3–5% of the global brain relevant to THIS task
8
+ // 3. Formats it for injection into the sub-agent's spawn prompt
9
+ // 4. Quarantines new memories from the sub-agent until confidence ≥ 0.7
10
+ // 5. Graduates verified memories back into the global brain
11
+ //
12
+ // No other AI tool syncs memory to sub-agents. Every sub-agent framework today
13
+ // (Claude Task tool, CrewAI, LangGraph, AutoGen) starts sub-agents with zero
14
+ // shared memory. SABB is the first cross-framework brain bridge.
15
+ import * as fs from 'fs';
16
+ import * as path from 'path';
17
+ import * as os from 'os';
18
+ import * as crypto from 'crypto';
19
+ import { GlobalBrain, getGlobalBrain } from './global-brain.js';
20
+ const SABB_DIR = path.join(os.homedir(), '.shadow-brain', 'sabb');
21
+ const QUARANTINE_PATH = path.join(SABB_DIR, 'quarantine.json');
22
+ const SPAWN_LOG_PATH = path.join(SABB_DIR, 'spawns.jsonl');
23
+ const DEFAULT_SLIVER_TOKEN_BUDGET = 300;
24
+ const DEFAULT_GRADUATION_THRESHOLD = 0.7;
25
+ function emptyStats() {
26
+ return {
27
+ totalSpawns: 0,
28
+ totalSlivers: 0,
29
+ quarantined: 0,
30
+ graduated: 0,
31
+ rejected: 0,
32
+ avgSliverTokens: 0,
33
+ avgGraduationMs: 0,
34
+ byFramework: {
35
+ 'claude-code-task': 0,
36
+ 'cursor-composer': 0,
37
+ 'cline-substep': 0,
38
+ 'crewai': 0,
39
+ 'langgraph': 0,
40
+ 'autogen': 0,
41
+ 'generic': 0,
42
+ },
43
+ byParent: {},
44
+ };
45
+ }
46
+ export class SubAgentBridge {
47
+ constructor(brain, opts = {}) {
48
+ this.quarantine = new Map();
49
+ this.stats = emptyStats();
50
+ this.initialized = false;
51
+ this.brain = brain ?? getGlobalBrain();
52
+ this.graduationThreshold = opts.graduationThreshold ?? DEFAULT_GRADUATION_THRESHOLD;
53
+ }
54
+ async init() {
55
+ if (this.initialized)
56
+ return;
57
+ fs.mkdirSync(SABB_DIR, { recursive: true });
58
+ await this.brain.init();
59
+ if (fs.existsSync(QUARANTINE_PATH)) {
60
+ try {
61
+ const raw = fs.readFileSync(QUARANTINE_PATH, 'utf-8');
62
+ const parsed = JSON.parse(raw);
63
+ if (Array.isArray(parsed.quarantine)) {
64
+ for (const q of parsed.quarantine) {
65
+ this.quarantine.set(q.id, {
66
+ ...q,
67
+ createdAt: new Date(q.createdAt),
68
+ graduatedAt: q.graduatedAt ? new Date(q.graduatedAt) : null,
69
+ });
70
+ }
71
+ }
72
+ if (parsed.stats)
73
+ this.stats = { ...emptyStats(), ...parsed.stats };
74
+ }
75
+ catch {
76
+ // Corrupt file — start fresh
77
+ }
78
+ }
79
+ this.initialized = true;
80
+ }
81
+ /** Register a sub-agent spawn. Returns a spawn ID used for later memory quarantine. */
82
+ async registerSpawn(req) {
83
+ await this.init();
84
+ const spawn = {
85
+ ...req,
86
+ spawnTime: req.spawnTime ?? new Date(),
87
+ };
88
+ this.stats.totalSpawns++;
89
+ this.stats.byFramework[spawn.framework]++;
90
+ this.stats.byParent[spawn.parentAgent] = (this.stats.byParent[spawn.parentAgent] ?? 0) + 1;
91
+ // Append to spawn log
92
+ try {
93
+ fs.appendFileSync(SPAWN_LOG_PATH, JSON.stringify(spawn) + '\n');
94
+ }
95
+ catch {
96
+ // Log failures are non-fatal
97
+ }
98
+ await this.flush();
99
+ return spawn;
100
+ }
101
+ /**
102
+ * Compute a context sliver for a sub-agent. Returns a concise, task-focused
103
+ * briefing (default budget: 300 tokens) extracted from the global brain.
104
+ */
105
+ async computeSliver(req, opts = {}) {
106
+ await this.init();
107
+ const budget = opts.tokenBudget ?? req.tokenBudget ?? DEFAULT_SLIVER_TOKEN_BUDGET;
108
+ const projectId = GlobalBrain.projectIdFor(req.projectDir);
109
+ const taskTerms = this.extractKeyTerms(req.taskDescription);
110
+ // Pull recent project memories + keyword-match anything with high importance
111
+ const candidates = this.brain.recall({
112
+ projectId,
113
+ keywords: taskTerms,
114
+ limit: 40,
115
+ minImportance: 0.4,
116
+ });
117
+ const scored = candidates
118
+ .map(entry => ({
119
+ entry,
120
+ score: this.scoreRelevance(entry, taskTerms, req.taskDescription),
121
+ }))
122
+ .filter(x => x.score > 0)
123
+ .sort((a, b) => b.score - a.score);
124
+ const selected = [];
125
+ let tokenCount = 0;
126
+ for (const { entry, score } of scored) {
127
+ const tokens = this.estimateTokens(entry.content);
128
+ if (tokenCount + tokens > budget)
129
+ continue;
130
+ selected.push({
131
+ id: entry.id,
132
+ content: entry.content,
133
+ category: entry.category,
134
+ relevance: Math.min(1, score / 10),
135
+ });
136
+ tokenCount += tokens;
137
+ if (selected.length >= 12)
138
+ break;
139
+ }
140
+ const warnings = this.extractWarnings(candidates);
141
+ const markdown = this.formatSliverMarkdown(req, selected, warnings);
142
+ this.stats.totalSlivers++;
143
+ this.stats.avgSliverTokens = this.rollingAvg(this.stats.avgSliverTokens, tokenCount, this.stats.totalSlivers);
144
+ return {
145
+ subAgentId: req.subAgentId,
146
+ parentAgent: req.parentAgent,
147
+ taskDescription: req.taskDescription,
148
+ memories: selected,
149
+ warnings,
150
+ tokenCount,
151
+ markdown,
152
+ generatedAt: new Date(),
153
+ };
154
+ }
155
+ /** Store a memory from a sub-agent in quarantine. */
156
+ async quarantineMemory(subAgentId, parentAgent, content, category, confidence, evidence = []) {
157
+ await this.init();
158
+ const entry = {
159
+ id: `quar-${crypto.randomBytes(6).toString('hex')}`,
160
+ subAgentId,
161
+ parentAgent,
162
+ content,
163
+ category,
164
+ confidence,
165
+ graduatedAt: null,
166
+ verdict: 'pending',
167
+ evidence,
168
+ createdAt: new Date(),
169
+ };
170
+ this.quarantine.set(entry.id, entry);
171
+ this.stats.quarantined++;
172
+ await this.flush();
173
+ // Auto-graduate if confidence already passes threshold
174
+ if (confidence >= this.graduationThreshold) {
175
+ await this.graduate(entry.id);
176
+ }
177
+ return entry;
178
+ }
179
+ /** Graduate a quarantined memory into the global brain. */
180
+ async graduate(memoryId, overrides = {}) {
181
+ await this.init();
182
+ const entry = this.quarantine.get(memoryId);
183
+ if (!entry)
184
+ return false;
185
+ if (entry.verdict !== 'pending')
186
+ return false;
187
+ const start = Date.now();
188
+ const projectMatch = await this.findProjectForSubAgent(entry.subAgentId);
189
+ this.brain.writeSync({
190
+ projectId: projectMatch?.projectId ?? 'unknown-project',
191
+ projectName: projectMatch?.projectName ?? 'unknown',
192
+ agentTool: overrides.agentTool ?? entry.parentAgent,
193
+ category: entry.category,
194
+ content: entry.content,
195
+ importance: Math.min(1, entry.confidence),
196
+ metadata: {
197
+ ...(overrides.metadata ?? {}),
198
+ origin: 'subagent',
199
+ subAgentId: entry.subAgentId,
200
+ parentAgent: entry.parentAgent,
201
+ quarantineId: entry.id,
202
+ },
203
+ });
204
+ entry.verdict = 'graduated';
205
+ entry.graduatedAt = new Date();
206
+ this.stats.graduated++;
207
+ this.stats.quarantined = Math.max(0, this.stats.quarantined - 1);
208
+ this.stats.avgGraduationMs = this.rollingAvg(this.stats.avgGraduationMs, Date.now() - start, this.stats.graduated);
209
+ await this.flush();
210
+ return true;
211
+ }
212
+ /** Reject a quarantined memory (hallucination, low confidence). */
213
+ async reject(memoryId, reason = 'rejected') {
214
+ await this.init();
215
+ const entry = this.quarantine.get(memoryId);
216
+ if (!entry)
217
+ return false;
218
+ entry.verdict = 'rejected';
219
+ entry.evidence = [...entry.evidence, reason];
220
+ this.stats.rejected++;
221
+ this.stats.quarantined = Math.max(0, this.stats.quarantined - 1);
222
+ await this.flush();
223
+ return true;
224
+ }
225
+ /** List pending quarantined memories. */
226
+ listQuarantine(subAgentId) {
227
+ return Array.from(this.quarantine.values())
228
+ .filter(q => q.verdict === 'pending' && (!subAgentId || q.subAgentId === subAgentId))
229
+ .sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());
230
+ }
231
+ getStats() {
232
+ return JSON.parse(JSON.stringify(this.stats));
233
+ }
234
+ /** Parse a spawn log into an array of SubAgentSpawnRequest. Useful for auditing. */
235
+ readSpawnLog(limit = 50) {
236
+ if (!fs.existsSync(SPAWN_LOG_PATH))
237
+ return [];
238
+ try {
239
+ const raw = fs.readFileSync(SPAWN_LOG_PATH, 'utf-8');
240
+ return raw
241
+ .split('\n')
242
+ .filter(Boolean)
243
+ .slice(-limit)
244
+ .map(line => {
245
+ const parsed = JSON.parse(line);
246
+ return { ...parsed, spawnTime: new Date(parsed.spawnTime) };
247
+ });
248
+ }
249
+ catch {
250
+ return [];
251
+ }
252
+ }
253
+ // ── Internals ─────────────────────────────────────────────────────────────
254
+ extractKeyTerms(task) {
255
+ const stopwords = new Set(['the', 'a', 'an', 'and', 'or', 'of', 'to', 'for', 'in', 'on', 'is', 'it', 'this', 'that', 'with', 'as', 'from', 'by', 'be', 'do', 'can', 'will', 'should', 'would', 'could', 'i', 'you', 'we', 'they', 'my', 'your']);
256
+ return task
257
+ .toLowerCase()
258
+ .replace(/[^a-z0-9\s-]/g, ' ')
259
+ .split(/\s+/)
260
+ .filter(w => w.length > 2 && !stopwords.has(w))
261
+ .slice(0, 12);
262
+ }
263
+ scoreRelevance(entry, terms, task) {
264
+ let score = 0;
265
+ const content = entry.content.toLowerCase();
266
+ for (const term of terms) {
267
+ if (content.includes(term))
268
+ score += 2;
269
+ }
270
+ // Recency boost: newer entries up-ranked slightly
271
+ const ageDays = (Date.now() - new Date(entry.createdAt).getTime()) / (1000 * 60 * 60 * 24);
272
+ score += Math.max(0, 2 - ageDays / 30);
273
+ // Importance
274
+ score += entry.importance * 3;
275
+ // Category match boost
276
+ const taskLower = task.toLowerCase();
277
+ if (taskLower.includes(entry.category.toLowerCase()))
278
+ score += 2;
279
+ return score;
280
+ }
281
+ extractWarnings(entries) {
282
+ const warningCategories = new Set(['warning', 'pitfall', 'security', 'bug', 'incident', 'failure']);
283
+ const warnings = [];
284
+ for (const e of entries) {
285
+ if (warningCategories.has(e.category.toLowerCase())) {
286
+ warnings.push(`[${e.category}] ${e.content.slice(0, 140)}`);
287
+ }
288
+ if (warnings.length >= 5)
289
+ break;
290
+ }
291
+ return warnings;
292
+ }
293
+ estimateTokens(text) {
294
+ // Rough tokens-per-char heuristic for English: ~4 chars per token
295
+ return Math.ceil(text.length / 4);
296
+ }
297
+ formatSliverMarkdown(req, memories, warnings) {
298
+ const lines = [
299
+ `## Shadow Brain Context Sliver`,
300
+ ``,
301
+ `**Parent:** ${req.parentAgent} · **Framework:** ${req.framework}`,
302
+ `**Task:** ${req.taskDescription}`,
303
+ ``,
304
+ `### What you should know before starting`,
305
+ ];
306
+ if (memories.length === 0) {
307
+ lines.push('_No relevant project memories found. Proceed with general best practices._');
308
+ }
309
+ else {
310
+ for (const m of memories) {
311
+ lines.push(`- **[${m.category}]** ${m.content.slice(0, 220)}${m.content.length > 220 ? '…' : ''}`);
312
+ }
313
+ }
314
+ if (warnings.length) {
315
+ lines.push('', `### Warnings from past work`);
316
+ for (const w of warnings)
317
+ lines.push(`- ${w}`);
318
+ }
319
+ lines.push('', `### Rules for this sub-agent`, '- Use project-specific memory over generic assumptions.', '- Any new learning will be quarantined until confidence ≥ 0.7.', '- Do not access secrets or run destructive commands without explicit approval.', '');
320
+ return lines.join('\n');
321
+ }
322
+ async findProjectForSubAgent(_subAgentId) {
323
+ // Derive project from most recent spawn record for this sub-agent
324
+ const spawns = this.readSpawnLog(200).reverse();
325
+ const match = spawns.find(s => s.subAgentId === _subAgentId);
326
+ if (!match)
327
+ return null;
328
+ return {
329
+ projectId: GlobalBrain.projectIdFor(match.projectDir),
330
+ projectName: path.basename(match.projectDir),
331
+ };
332
+ }
333
+ rollingAvg(currentAvg, newValue, count) {
334
+ if (count <= 1)
335
+ return newValue;
336
+ return currentAvg + (newValue - currentAvg) / count;
337
+ }
338
+ async flush() {
339
+ try {
340
+ const payload = {
341
+ schemaVersion: 1,
342
+ quarantine: Array.from(this.quarantine.values()),
343
+ stats: this.stats,
344
+ };
345
+ const tmp = QUARANTINE_PATH + '.tmp';
346
+ fs.writeFileSync(tmp, JSON.stringify(payload, null, 2));
347
+ fs.renameSync(tmp, QUARANTINE_PATH);
348
+ }
349
+ catch {
350
+ // Persistence failures are non-fatal in v6.0; quarantine lives in-memory
351
+ }
352
+ }
353
+ }
354
+ // Singleton helper — consistent with other v5.2 brain modules
355
+ let _instance = null;
356
+ export function getSubAgentBridge() {
357
+ if (!_instance)
358
+ _instance = new SubAgentBridge();
359
+ return _instance;
360
+ }
361
+ export function resetSubAgentBridgeForTests() {
362
+ _instance = null;
363
+ }
364
+ //# sourceMappingURL=subagent-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-bridge.js","sourceRoot":"","sources":["../../src/brain/subagent-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { DebateTranscript } from '../types.js';
2
+ export declare class SwarmDebate {
3
+ private llm;
4
+ private debates;
5
+ private initialized;
6
+ constructor();
7
+ init(): Promise<void>;
8
+ /** Run a debate. Returns a transcript with verdict. */
9
+ debate(question: string, context: string, opts?: {
10
+ turns?: number;
11
+ proLabel?: string;
12
+ conLabel?: string;
13
+ }): Promise<DebateTranscript>;
14
+ listDebates(limit?: number): DebateTranscript[];
15
+ private generateTurn;
16
+ private generateArbiter;
17
+ private fallbackStatement;
18
+ private persist;
19
+ }
20
+ export declare function getSwarmDebate(): SwarmDebate;
21
+ export declare function resetSwarmDebateForTests(): void;
22
+ //# sourceMappingURL=swarm-debate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swarm-debate.d.ts","sourceRoot":"","sources":["../../src/brain/swarm-debate.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,gBAAgB,EAAc,MAAM,aAAa,CAAC;AAU3D,qBAAa,WAAW;IACtB,OAAO,CAAC,GAAG,CAAW;IACtB,OAAO,CAAC,OAAO,CAA4C;IAC3D,OAAO,CAAC,WAAW,CAAS;;IAMtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB3B,uDAAuD;IACjD,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAsC/I,WAAW,CAAC,KAAK,SAAK,GAAG,gBAAgB,EAAE;YAQ7B,YAAY;YAeZ,eAAe;IAgB7B,OAAO,CAAC,iBAAiB;YAMX,OAAO;CAUtB;AAID,wBAAgB,cAAc,IAAI,WAAW,CAG5C;AAED,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C"}
@@ -0,0 +1,134 @@
1
+ // src/brain/swarm-debate.ts — Swarm Debate Protocol
2
+ // v6.0.0 — Hive Mind Edition
3
+ //
4
+ // For critical decisions, spawn 2–N sub-agents that DEBATE a question.
5
+ // An arbiter agent reads the transcript and picks a winner with reasoning.
6
+ // Uses Local LLM (Ollama) by default; remote providers opt-in.
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ import * as os from 'os';
10
+ import * as crypto from 'crypto';
11
+ import { getLocalLLM } from './local-llm.js';
12
+ const DEBATE_PATH = path.join(os.homedir(), '.shadow-brain', 'debates.json');
13
+ export class SwarmDebate {
14
+ constructor() {
15
+ this.debates = new Map();
16
+ this.initialized = false;
17
+ this.llm = getLocalLLM();
18
+ }
19
+ async init() {
20
+ if (this.initialized)
21
+ return;
22
+ fs.mkdirSync(path.dirname(DEBATE_PATH), { recursive: true });
23
+ if (fs.existsSync(DEBATE_PATH)) {
24
+ try {
25
+ const parsed = JSON.parse(fs.readFileSync(DEBATE_PATH, 'utf-8'));
26
+ for (const d of parsed.debates ?? []) {
27
+ this.debates.set(d.id, {
28
+ ...d,
29
+ createdAt: new Date(d.createdAt),
30
+ turns: d.turns.map(t => ({ ...t, timestamp: new Date(t.timestamp) })),
31
+ });
32
+ }
33
+ }
34
+ catch {
35
+ /* skip */
36
+ }
37
+ }
38
+ this.initialized = true;
39
+ }
40
+ /** Run a debate. Returns a transcript with verdict. */
41
+ async debate(question, context, opts = {}) {
42
+ await this.init();
43
+ const turnCount = opts.turns ?? 2;
44
+ const proLabel = opts.proLabel ?? 'pro';
45
+ const conLabel = opts.conLabel ?? 'con';
46
+ const start = Date.now();
47
+ const turns = [];
48
+ let turnId = 1;
49
+ // Alternate pro/con turns
50
+ for (let i = 0; i < turnCount; i++) {
51
+ const proTurn = await this.generateTurn(turnId++, proLabel, 'pro', question, context, turns);
52
+ turns.push(proTurn);
53
+ const conTurn = await this.generateTurn(turnId++, conLabel, 'con', question, context, turns);
54
+ turns.push(conTurn);
55
+ }
56
+ // Arbiter
57
+ const arbiter = await this.generateArbiter(turnId, question, context, turns);
58
+ turns.push(arbiter);
59
+ const transcript = {
60
+ id: `deb-${crypto.randomBytes(6).toString('hex')}`,
61
+ question,
62
+ context,
63
+ turns,
64
+ verdict: arbiter.statement,
65
+ arbiterConfidence: arbiter.confidence,
66
+ durationMs: Date.now() - start,
67
+ createdAt: new Date(),
68
+ };
69
+ this.debates.set(transcript.id, transcript);
70
+ await this.persist();
71
+ return transcript;
72
+ }
73
+ listDebates(limit = 20) {
74
+ return Array.from(this.debates.values())
75
+ .sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime())
76
+ .slice(0, limit);
77
+ }
78
+ // ── Internals ─────────────────────────────────────────────────────────────
79
+ async generateTurn(turnId, agentLabel, position, question, context, prior) {
80
+ const transcript = prior.map(t => `${t.agentLabel} (${t.position}): ${t.statement}`).join('\n');
81
+ const prompt = `Question: ${question}\nContext: ${context}\n\nPrior turns:\n${transcript || '(no prior turns)'}\n\nYou are arguing ${position}. Respond in 2 short sentences max.`;
82
+ const res = await this.llm.generate(prompt, `You are a terse debater taking the ${position} position.`);
83
+ const statement = res.text.trim() || this.fallbackStatement(position, question);
84
+ return {
85
+ turnId,
86
+ agentLabel,
87
+ position,
88
+ statement: statement.slice(0, 340),
89
+ confidence: res.provider === 'none' ? 0.5 : 0.7,
90
+ timestamp: new Date(),
91
+ };
92
+ }
93
+ async generateArbiter(turnId, question, context, turns) {
94
+ const transcript = turns.map(t => `${t.agentLabel} (${t.position}): ${t.statement}`).join('\n');
95
+ const prompt = `You are an arbiter reading this debate. Pick the stronger side and give a one-sentence verdict.\n\nQuestion: ${question}\nContext: ${context}\n\nTranscript:\n${transcript}\n\nReply: "Winner: <pro|con>. Reason: <one sentence>."`;
96
+ const res = await this.llm.generate(prompt, 'You are a fair, terse arbiter.');
97
+ const text = res.text.trim() || 'Winner: pro. Reason: no clear evidence presented by con side.';
98
+ const confidence = res.provider === 'none' ? 0.5 : 0.75;
99
+ return {
100
+ turnId,
101
+ agentLabel: 'arbiter',
102
+ position: 'arbiter',
103
+ statement: text.slice(0, 340),
104
+ confidence,
105
+ timestamp: new Date(),
106
+ };
107
+ }
108
+ fallbackStatement(position, question) {
109
+ return position === 'pro'
110
+ ? `Proceeding with the proposal for "${question.slice(0, 60)}" is the safer default given existing conventions.`
111
+ : `There is no evidence base for "${question.slice(0, 60)}" — defaulting to the status quo is safer.`;
112
+ }
113
+ async persist() {
114
+ try {
115
+ const payload = { schemaVersion: 1, debates: Array.from(this.debates.values()) };
116
+ const tmp = DEBATE_PATH + '.tmp';
117
+ fs.writeFileSync(tmp, JSON.stringify(payload, null, 2));
118
+ fs.renameSync(tmp, DEBATE_PATH);
119
+ }
120
+ catch {
121
+ /* non-fatal */
122
+ }
123
+ }
124
+ }
125
+ let _instance = null;
126
+ export function getSwarmDebate() {
127
+ if (!_instance)
128
+ _instance = new SwarmDebate();
129
+ return _instance;
130
+ }
131
+ export function resetSwarmDebateForTests() {
132
+ _instance = null;
133
+ }
134
+ //# sourceMappingURL=swarm-debate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swarm-debate.js","sourceRoot":"","sources":["../../src/brain/swarm-debate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { TeamPeerInfo, TeamSyncMessage, AgentTool } from '../types.js';
2
+ export declare class TeamBrainSync {
3
+ private peerId;
4
+ private displayName;
5
+ private peers;
6
+ private outbox;
7
+ private initialized;
8
+ constructor();
9
+ init(): Promise<void>;
10
+ setDisplayName(name: string): void;
11
+ selfInfo(): TeamPeerInfo;
12
+ registerPeer(peer: Omit<TeamPeerInfo, 'connectedAt' | 'lastSeenAt'>): Promise<TeamPeerInfo>;
13
+ heartbeat(peerId: string, agentTools?: AgentTool[]): Promise<boolean>;
14
+ enqueue(message: Omit<TeamSyncMessage, 'timestamp'>): Promise<TeamSyncMessage>;
15
+ drainOutbox(): TeamSyncMessage[];
16
+ listPeers(): TeamPeerInfo[];
17
+ getPeerId(): string;
18
+ private persist;
19
+ }
20
+ export declare function getTeamBrainSync(): TeamBrainSync;
21
+ export declare function resetTeamBrainSyncForTests(): void;
22
+ //# sourceMappingURL=team-brain-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-brain-sync.d.ts","sourceRoot":"","sources":["../../src/brain/team-brain-sync.ts"],"names":[],"mappings":"AAgBA,OAAO,EACL,YAAY,EACZ,eAAe,EACf,SAAS,EACV,MAAM,aAAa,CAAC;AAYrB,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAwC;IACrD,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,WAAW,CAAS;;IAOtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB3B,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIlC,QAAQ,IAAI,YAAY;IAWlB,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,aAAa,GAAG,YAAY,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IAY3F,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAUrE,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;IASpF,WAAW,IAAI,eAAe,EAAE;IAOhC,SAAS,IAAI,YAAY,EAAE;IAI3B,SAAS,IAAI,MAAM;YAIL,OAAO;CAgBtB;AAID,wBAAgB,gBAAgB,IAAI,aAAa,CAGhD;AAED,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD"}