@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.
- package/README.md +225 -1029
- 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 +8 -1
- package/dist/brain/global-brain.d.ts.map +1 -1
- package/dist/brain/global-brain.js +24 -0
- package/dist/brain/global-brain.js.map +1 -1
- 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.js +1 -1
- package/dist/brain/l0-cache.js.map +1 -1
- 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 +40 -0
- package/dist/brain/mcp-server.d.ts.map +1 -1
- package/dist/brain/mcp-server.js +395 -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 +19 -0
- package/dist/brain/session-hooks.d.ts.map +1 -1
- package/dist/brain/session-hooks.js +249 -18
- package/dist/brain/session-hooks.js.map +1 -1
- 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/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 +823 -4
- 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 +518 -2
- package/dist/types.d.ts.map +1 -1
- 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"}
|