@theihtisham/agent-shadow-brain 4.0.3 → 5.0.1
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 +515 -305
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +1 -0
- package/dist/adapters/index.js.map +1 -1
- package/dist/brain/auto-setup.d.ts +54 -0
- package/dist/brain/auto-setup.d.ts.map +1 -0
- package/dist/brain/auto-setup.js +660 -0
- package/dist/brain/auto-setup.js.map +1 -0
- package/dist/brain/brain-portability.d.ts +81 -0
- package/dist/brain/brain-portability.d.ts.map +1 -0
- package/dist/brain/brain-portability.js +329 -0
- package/dist/brain/brain-portability.js.map +1 -0
- package/dist/brain/collective-learning.d.ts +54 -0
- package/dist/brain/collective-learning.d.ts.map +1 -0
- package/dist/brain/collective-learning.js +357 -0
- package/dist/brain/collective-learning.js.map +1 -0
- package/dist/brain/consensus-engine.d.ts +65 -0
- package/dist/brain/consensus-engine.d.ts.map +1 -0
- package/dist/brain/consensus-engine.js +385 -0
- package/dist/brain/consensus-engine.js.map +1 -0
- package/dist/brain/context-recall.d.ts +49 -0
- package/dist/brain/context-recall.d.ts.map +1 -0
- package/dist/brain/context-recall.js +502 -0
- package/dist/brain/context-recall.js.map +1 -0
- package/dist/brain/hierarchical-memory.d.ts +49 -0
- package/dist/brain/hierarchical-memory.d.ts.map +1 -0
- package/dist/brain/hierarchical-memory.js +451 -0
- package/dist/brain/hierarchical-memory.js.map +1 -0
- package/dist/brain/mcp-server.d.ts +12 -0
- package/dist/brain/mcp-server.d.ts.map +1 -1
- package/dist/brain/mcp-server.js +396 -37
- package/dist/brain/mcp-server.js.map +1 -1
- package/dist/brain/orchestrator.d.ts +34 -0
- package/dist/brain/orchestrator.d.ts.map +1 -1
- package/dist/brain/orchestrator.js +83 -1
- package/dist/brain/orchestrator.js.map +1 -1
- package/dist/brain/plugin-system.d.ts +97 -0
- package/dist/brain/plugin-system.d.ts.map +1 -0
- package/dist/brain/plugin-system.js +404 -0
- package/dist/brain/plugin-system.js.map +1 -0
- package/dist/cli.js +429 -3
- package/dist/cli.js.map +1 -1
- package/dist/dashboard/server.d.ts +4 -0
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +453 -330
- package/dist/dashboard/server.js.map +1 -1
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +201 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +32 -4
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
// src/brain/consensus-engine.ts — Multi-Agent Consensus Protocol
|
|
2
|
+
// Voting, trust scoring, conflict resolution for shared intelligence
|
|
3
|
+
// v5.0.0 — Infinite Intelligence Edition
|
|
4
|
+
import * as fs from 'fs';
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
import * as crypto from 'crypto';
|
|
7
|
+
const STORE_DIR = path.join(process.env.HOME || process.env.USERPROFILE || '~', '.shadow-brain', 'consensus');
|
|
8
|
+
const VOTE_TIMEOUT_MS = 60000; // 1 minute to vote on a proposal
|
|
9
|
+
const MIN_VOTES_FOR_CONSENSUS = 2;
|
|
10
|
+
const CONSENSUS_THRESHOLD = 0.6; // 60% agreement required
|
|
11
|
+
/**
|
|
12
|
+
* ConsensusEngine — multi-agent agreement protocol.
|
|
13
|
+
*
|
|
14
|
+
* When multiple AI agents observe the same codebase, they may produce
|
|
15
|
+
* conflicting insights. This engine:
|
|
16
|
+
*
|
|
17
|
+
* 1. Collects proposals from agents
|
|
18
|
+
* 2. Opens voting windows where agents vote accept/reject with confidence
|
|
19
|
+
* 3. Computes agreement scores and confidence intervals
|
|
20
|
+
* 4. Resolves conflicts via weighted trust scores
|
|
21
|
+
* 5. Tracks long-term trust for each agent based on proposal accuracy
|
|
22
|
+
*/
|
|
23
|
+
export class ConsensusEngine {
|
|
24
|
+
constructor(agentId, customDir) {
|
|
25
|
+
this.proposals = new Map();
|
|
26
|
+
this.votes = new Map();
|
|
27
|
+
this.results = new Map();
|
|
28
|
+
this.trustScores = new Map();
|
|
29
|
+
this.pendingTimers = new Map();
|
|
30
|
+
this.agentId = agentId || `agent-${crypto.randomUUID().slice(0, 8)}`;
|
|
31
|
+
this.storeDir = customDir || STORE_DIR;
|
|
32
|
+
this.loadFromDisk();
|
|
33
|
+
}
|
|
34
|
+
// ── Proposal Management ──────────────────────────────────────────────────────
|
|
35
|
+
/** Submit a new proposal for consensus */
|
|
36
|
+
propose(content, category, confidence, evidence = []) {
|
|
37
|
+
const id = crypto.randomUUID();
|
|
38
|
+
const proposal = {
|
|
39
|
+
id,
|
|
40
|
+
proposer: this.agentId,
|
|
41
|
+
content,
|
|
42
|
+
category,
|
|
43
|
+
confidence,
|
|
44
|
+
evidence,
|
|
45
|
+
timestamp: new Date(),
|
|
46
|
+
};
|
|
47
|
+
this.proposals.set(id, proposal);
|
|
48
|
+
this.votes.set(id, []);
|
|
49
|
+
// Auto-vote agree for own proposal
|
|
50
|
+
this.vote(id, 'agree', confidence, 'Self-proposal with initial confidence');
|
|
51
|
+
// Set timeout for consensus resolution
|
|
52
|
+
const timer = setTimeout(() => {
|
|
53
|
+
this.resolveProposal(id);
|
|
54
|
+
this.pendingTimers.delete(id);
|
|
55
|
+
}, VOTE_TIMEOUT_MS);
|
|
56
|
+
this.pendingTimers.set(id, timer);
|
|
57
|
+
return id;
|
|
58
|
+
}
|
|
59
|
+
/** Vote on a proposal */
|
|
60
|
+
vote(proposalId, vote, confidence, reasoning) {
|
|
61
|
+
const proposal = this.proposals.get(proposalId);
|
|
62
|
+
if (!proposal)
|
|
63
|
+
return false;
|
|
64
|
+
const existingVotes = this.votes.get(proposalId) || [];
|
|
65
|
+
// Check if agent already voted
|
|
66
|
+
if (existingVotes.some(v => v.voter === this.agentId)) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
const consensusVote = {
|
|
70
|
+
voter: this.agentId,
|
|
71
|
+
proposalId,
|
|
72
|
+
vote,
|
|
73
|
+
confidence,
|
|
74
|
+
reasoning,
|
|
75
|
+
timestamp: new Date(),
|
|
76
|
+
};
|
|
77
|
+
existingVotes.push(consensusVote);
|
|
78
|
+
this.votes.set(proposalId, existingVotes);
|
|
79
|
+
// Auto-resolve if enough votes
|
|
80
|
+
if (existingVotes.length >= MIN_VOTES_FOR_CONSENSUS) {
|
|
81
|
+
this.resolveProposal(proposalId);
|
|
82
|
+
}
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
/** Process an incoming vote from a remote agent */
|
|
86
|
+
receiveVote(vote) {
|
|
87
|
+
const proposal = this.proposals.get(vote.proposalId);
|
|
88
|
+
if (!proposal)
|
|
89
|
+
return false;
|
|
90
|
+
const existingVotes = this.votes.get(vote.proposalId) || [];
|
|
91
|
+
// Check if voter already voted
|
|
92
|
+
if (existingVotes.some(v => v.voter === vote.voter)) {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
existingVotes.push(vote);
|
|
96
|
+
this.votes.set(vote.proposalId, existingVotes);
|
|
97
|
+
// Auto-resolve if enough votes
|
|
98
|
+
if (existingVotes.length >= MIN_VOTES_FOR_CONSENSUS) {
|
|
99
|
+
this.resolveProposal(vote.proposalId);
|
|
100
|
+
}
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
/** Resolve a proposal by computing consensus */
|
|
104
|
+
resolveProposal(proposalId) {
|
|
105
|
+
const proposal = this.proposals.get(proposalId);
|
|
106
|
+
if (!proposal)
|
|
107
|
+
return null;
|
|
108
|
+
const votes = this.votes.get(proposalId) || [];
|
|
109
|
+
if (votes.length === 0)
|
|
110
|
+
return null;
|
|
111
|
+
// Clear pending timer if exists
|
|
112
|
+
const timer = this.pendingTimers.get(proposalId);
|
|
113
|
+
if (timer) {
|
|
114
|
+
clearTimeout(timer);
|
|
115
|
+
this.pendingTimers.delete(proposalId);
|
|
116
|
+
}
|
|
117
|
+
// Weighted vote counting — trust-weighted
|
|
118
|
+
let acceptWeight = 0;
|
|
119
|
+
let rejectWeight = 0;
|
|
120
|
+
let totalWeight = 0;
|
|
121
|
+
for (const v of votes) {
|
|
122
|
+
const trust = this.getTrustScore(v.voter);
|
|
123
|
+
const weight = trust * v.confidence;
|
|
124
|
+
if (v.vote === 'agree') {
|
|
125
|
+
acceptWeight += weight;
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
rejectWeight += weight;
|
|
129
|
+
}
|
|
130
|
+
totalWeight += weight;
|
|
131
|
+
}
|
|
132
|
+
const agreementScore = totalWeight > 0 ? acceptWeight / totalWeight : 0;
|
|
133
|
+
// Compute confidence interval
|
|
134
|
+
const confidences = votes.map(v => v.confidence);
|
|
135
|
+
const avgConfidence = confidences.reduce((s, c) => s + c, 0) / confidences.length;
|
|
136
|
+
const confidenceStdDev = Math.sqrt(confidences.reduce((s, c) => s + Math.pow(c - avgConfidence, 2), 0) / confidences.length);
|
|
137
|
+
const confidenceInterval = [
|
|
138
|
+
Math.max(0, avgConfidence - 1.96 * confidenceStdDev),
|
|
139
|
+
Math.min(1, avgConfidence + 1.96 * confidenceStdDev),
|
|
140
|
+
];
|
|
141
|
+
// Determine verdict
|
|
142
|
+
let verdict;
|
|
143
|
+
let conflictResolution;
|
|
144
|
+
if (agreementScore >= CONSENSUS_THRESHOLD) {
|
|
145
|
+
verdict = 'accepted';
|
|
146
|
+
}
|
|
147
|
+
else if (agreementScore <= 1 - CONSENSUS_THRESHOLD) {
|
|
148
|
+
verdict = 'rejected';
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
// Conflict — resolve by trust-weighted proposer confidence
|
|
152
|
+
verdict = proposal.confidence > 0.7 ? 'accepted' : 'rejected';
|
|
153
|
+
conflictResolution = `Split vote (${(agreementScore * 100).toFixed(0)}% accept). Resolved by proposer confidence: ${(proposal.confidence * 100).toFixed(0)}%.`;
|
|
154
|
+
}
|
|
155
|
+
const result = {
|
|
156
|
+
proposal,
|
|
157
|
+
votes,
|
|
158
|
+
verdict,
|
|
159
|
+
agreementScore,
|
|
160
|
+
confidenceInterval,
|
|
161
|
+
resolvedAt: new Date(),
|
|
162
|
+
conflictResolution,
|
|
163
|
+
};
|
|
164
|
+
this.results.set(proposalId, result);
|
|
165
|
+
// Update trust scores based on outcome
|
|
166
|
+
this.updateTrustFromResult(result);
|
|
167
|
+
// Persist
|
|
168
|
+
this.persistToDisk();
|
|
169
|
+
return result;
|
|
170
|
+
}
|
|
171
|
+
// ── Trust Score Management ───────────────────────────────────────────────────
|
|
172
|
+
getTrustScore(agentId) {
|
|
173
|
+
const trust = this.trustScores.get(agentId);
|
|
174
|
+
if (!trust)
|
|
175
|
+
return 0.5; // Default trust for unknown agents
|
|
176
|
+
return trust.score;
|
|
177
|
+
}
|
|
178
|
+
getTrustScores() {
|
|
179
|
+
return Array.from(this.trustScores.values());
|
|
180
|
+
}
|
|
181
|
+
updateTrustFromResult(result) {
|
|
182
|
+
const accepted = result.verdict === 'accepted';
|
|
183
|
+
for (const vote of result.votes) {
|
|
184
|
+
const trust = this.trustScores.get(vote.voter) || {
|
|
185
|
+
agent: vote.voter,
|
|
186
|
+
score: 0.5,
|
|
187
|
+
totalProposals: 0,
|
|
188
|
+
acceptedProposals: 0,
|
|
189
|
+
rejectedProposals: 0,
|
|
190
|
+
accuracyHistory: [],
|
|
191
|
+
lastUpdated: new Date(),
|
|
192
|
+
};
|
|
193
|
+
trust.totalProposals++;
|
|
194
|
+
const agreedWithOutcome = (vote.vote === 'agree') === accepted;
|
|
195
|
+
if (agreedWithOutcome) {
|
|
196
|
+
trust.acceptedProposals++;
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
trust.rejectedProposals++;
|
|
200
|
+
}
|
|
201
|
+
// Update accuracy history (keep last 100)
|
|
202
|
+
trust.accuracyHistory.push(agreedWithOutcome ? 1 : 0);
|
|
203
|
+
if (trust.accuracyHistory.length > 100) {
|
|
204
|
+
trust.accuracyHistory = trust.accuracyHistory.slice(-100);
|
|
205
|
+
}
|
|
206
|
+
// Recalculate trust score
|
|
207
|
+
const accuracy = trust.accuracyHistory.reduce((s, v) => s + v, 0) / trust.accuracyHistory.length;
|
|
208
|
+
const participationBonus = Math.min(0.1, trust.totalProposals * 0.005);
|
|
209
|
+
trust.score = Math.min(1, accuracy * 0.9 + participationBonus + 0.1);
|
|
210
|
+
trust.lastUpdated = new Date();
|
|
211
|
+
this.trustScores.set(vote.voter, trust);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/** Manually adjust trust for an agent (e.g., human override) */
|
|
215
|
+
setTrust(agentId, score) {
|
|
216
|
+
const trust = this.trustScores.get(agentId) || {
|
|
217
|
+
agent: agentId,
|
|
218
|
+
score: 0.5,
|
|
219
|
+
totalProposals: 0,
|
|
220
|
+
acceptedProposals: 0,
|
|
221
|
+
rejectedProposals: 0,
|
|
222
|
+
accuracyHistory: [],
|
|
223
|
+
lastUpdated: new Date(),
|
|
224
|
+
};
|
|
225
|
+
trust.score = Math.max(0, Math.min(1, score));
|
|
226
|
+
trust.lastUpdated = new Date();
|
|
227
|
+
this.trustScores.set(agentId, trust);
|
|
228
|
+
}
|
|
229
|
+
// ── Query Operations ─────────────────────────────────────────────────────────
|
|
230
|
+
/** Get result for a specific proposal */
|
|
231
|
+
getResult(proposalId) {
|
|
232
|
+
return this.results.get(proposalId);
|
|
233
|
+
}
|
|
234
|
+
/** Get all proposals with a specific verdict */
|
|
235
|
+
getByVerdict(verdict) {
|
|
236
|
+
return Array.from(this.results.values())
|
|
237
|
+
.filter(r => r.verdict === verdict);
|
|
238
|
+
}
|
|
239
|
+
/** Get proposals by category */
|
|
240
|
+
getByCategory(category) {
|
|
241
|
+
return Array.from(this.proposals.values())
|
|
242
|
+
.filter(p => p.category === category);
|
|
243
|
+
}
|
|
244
|
+
/** Get pending proposals (not yet resolved) */
|
|
245
|
+
getPending() {
|
|
246
|
+
return Array.from(this.proposals.keys())
|
|
247
|
+
.filter(id => !this.results.has(id))
|
|
248
|
+
.map(id => this.proposals.get(id))
|
|
249
|
+
.filter(Boolean);
|
|
250
|
+
}
|
|
251
|
+
// ── Statistics ────────────────────────────────────────────────────────────────
|
|
252
|
+
getStats() {
|
|
253
|
+
let accepted = 0;
|
|
254
|
+
let rejected = 0;
|
|
255
|
+
let conflict = 0;
|
|
256
|
+
let totalAgreement = 0;
|
|
257
|
+
for (const result of this.results.values()) {
|
|
258
|
+
if (result.verdict === 'accepted')
|
|
259
|
+
accepted++;
|
|
260
|
+
else if (result.verdict === 'rejected')
|
|
261
|
+
rejected++;
|
|
262
|
+
else
|
|
263
|
+
conflict++;
|
|
264
|
+
totalAgreement += result.agreementScore;
|
|
265
|
+
}
|
|
266
|
+
const topTrusted = Array.from(this.trustScores.values())
|
|
267
|
+
.sort((a, b) => b.score - a.score)
|
|
268
|
+
.slice(0, 10)
|
|
269
|
+
.map(t => ({
|
|
270
|
+
agent: t.agent,
|
|
271
|
+
score: t.score,
|
|
272
|
+
accuracy: t.accuracyHistory.length > 0
|
|
273
|
+
? t.accuracyHistory.reduce((s, v) => s + v, 0) / t.accuracyHistory.length
|
|
274
|
+
: 0,
|
|
275
|
+
}));
|
|
276
|
+
return {
|
|
277
|
+
totalProposals: this.proposals.size,
|
|
278
|
+
acceptedCount: accepted,
|
|
279
|
+
rejectedCount: rejected,
|
|
280
|
+
conflictCount: conflict,
|
|
281
|
+
pendingCount: this.proposals.size - this.results.size,
|
|
282
|
+
averageAgreement: this.results.size > 0 ? totalAgreement / this.results.size : 0,
|
|
283
|
+
agentCount: this.trustScores.size,
|
|
284
|
+
topTrustedAgents: topTrusted,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
// ── Persistence ──────────────────────────────────────────────────────────────
|
|
288
|
+
async persistToDisk() {
|
|
289
|
+
try {
|
|
290
|
+
if (!fs.existsSync(this.storeDir)) {
|
|
291
|
+
fs.mkdirSync(this.storeDir, { recursive: true });
|
|
292
|
+
}
|
|
293
|
+
const serialize = (obj) => {
|
|
294
|
+
const result = { ...obj };
|
|
295
|
+
for (const key of Object.keys(result)) {
|
|
296
|
+
const val = result[key];
|
|
297
|
+
if (val instanceof Date) {
|
|
298
|
+
result[key] = val.toISOString();
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
return result;
|
|
302
|
+
};
|
|
303
|
+
const data = {
|
|
304
|
+
proposals: Array.from(this.proposals.entries()).map(([id, p]) => [id, serialize(p)]),
|
|
305
|
+
votes: Array.from(this.votes.entries()).map(([id, vs]) => [
|
|
306
|
+
id,
|
|
307
|
+
vs.map(v => serialize(v)),
|
|
308
|
+
]),
|
|
309
|
+
results: Array.from(this.results.entries()).map(([id, r]) => [
|
|
310
|
+
id,
|
|
311
|
+
{
|
|
312
|
+
...serialize(r),
|
|
313
|
+
votes: r.votes.map(v => serialize(v)),
|
|
314
|
+
proposal: serialize(r.proposal),
|
|
315
|
+
},
|
|
316
|
+
]),
|
|
317
|
+
trustScores: Array.from(this.trustScores.entries()).map(([id, t]) => [id, serialize(t)]),
|
|
318
|
+
version: '5.0.0',
|
|
319
|
+
};
|
|
320
|
+
fs.writeFileSync(path.join(this.storeDir, 'consensus-state.json'), JSON.stringify(data));
|
|
321
|
+
}
|
|
322
|
+
catch {
|
|
323
|
+
// Non-blocking
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
loadFromDisk() {
|
|
327
|
+
try {
|
|
328
|
+
const file = path.join(this.storeDir, 'consensus-state.json');
|
|
329
|
+
if (!fs.existsSync(file))
|
|
330
|
+
return;
|
|
331
|
+
const data = JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
332
|
+
const revivify = (obj) => {
|
|
333
|
+
const result = { ...obj };
|
|
334
|
+
for (const key of Object.keys(result)) {
|
|
335
|
+
const val = result[key];
|
|
336
|
+
if (typeof val === 'string' && key.endsWith('At') || key === 'timestamp' || key === 'lastUpdated') {
|
|
337
|
+
try {
|
|
338
|
+
result[key] = new Date(val);
|
|
339
|
+
}
|
|
340
|
+
catch { /* keep as string */ }
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
return result;
|
|
344
|
+
};
|
|
345
|
+
if (data.proposals) {
|
|
346
|
+
for (const [id, p] of data.proposals) {
|
|
347
|
+
this.proposals.set(id, revivify(p));
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
if (data.votes) {
|
|
351
|
+
for (const [id, vs] of data.votes) {
|
|
352
|
+
this.votes.set(id, vs.map(v => revivify(v)));
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
if (data.results) {
|
|
356
|
+
for (const [id, r] of data.results) {
|
|
357
|
+
const result = revivify(r);
|
|
358
|
+
if (result.proposal && typeof result.proposal === 'object') {
|
|
359
|
+
result.proposal = revivify(result.proposal);
|
|
360
|
+
}
|
|
361
|
+
if (Array.isArray(result.votes)) {
|
|
362
|
+
result.votes = result.votes.map(v => revivify(v));
|
|
363
|
+
}
|
|
364
|
+
this.results.set(id, result);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
if (data.trustScores) {
|
|
368
|
+
for (const [id, t] of data.trustScores) {
|
|
369
|
+
this.trustScores.set(id, revivify(t));
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
catch {
|
|
374
|
+
// Fresh start
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
/** Clean up timers */
|
|
378
|
+
dispose() {
|
|
379
|
+
for (const timer of this.pendingTimers.values()) {
|
|
380
|
+
clearTimeout(timer);
|
|
381
|
+
}
|
|
382
|
+
this.pendingTimers.clear();
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
//# sourceMappingURL=consensus-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consensus-engine.js","sourceRoot":"","sources":["../../src/brain/consensus-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { RecallResult, RecallContext } from '../types.js';
|
|
2
|
+
import { HierarchicalMemory } from './hierarchical-memory.js';
|
|
3
|
+
/**
|
|
4
|
+
* ContextRecall — associative memory activation engine.
|
|
5
|
+
*
|
|
6
|
+
* Instead of requiring explicit search queries, this engine monitors the
|
|
7
|
+
* current work context (file being edited, keywords, project type, time)
|
|
8
|
+
* and automatically activates relevant memories.
|
|
9
|
+
*
|
|
10
|
+
* Activation triggers:
|
|
11
|
+
* 1. File path pattern matching (e.g., editing auth/*.ts triggers security memories)
|
|
12
|
+
* 2. Keyword detection (e.g., "database" triggers SQL/pattern memories)
|
|
13
|
+
* 3. Category association (e.g., "bug-fix" context loads past fix patterns)
|
|
14
|
+
* 4. Temporal patterns (time-of-day, day-of-week work habits)
|
|
15
|
+
* 5. Co-occurrence (memories frequently activated together strengthen their link)
|
|
16
|
+
*/
|
|
17
|
+
export declare class ContextRecall {
|
|
18
|
+
private hierarchicalMemory;
|
|
19
|
+
private triggers;
|
|
20
|
+
private activationLinks;
|
|
21
|
+
private recentActivations;
|
|
22
|
+
private storeDir;
|
|
23
|
+
constructor(hierarchicalMemory: HierarchicalMemory, customDir?: string);
|
|
24
|
+
/** Activate memories based on current work context */
|
|
25
|
+
recall(context: RecallContext, topK?: number): RecallResult[];
|
|
26
|
+
/** Get a summary of what the brain "knows" about the current context */
|
|
27
|
+
getContextSummary(context: RecallContext): string;
|
|
28
|
+
private matchTriggers;
|
|
29
|
+
private triggerMatchesContext;
|
|
30
|
+
private learnTriggers;
|
|
31
|
+
private extractFilePaths;
|
|
32
|
+
private updateCoOccurrence;
|
|
33
|
+
private strengthenLink;
|
|
34
|
+
private buildActivationPath;
|
|
35
|
+
private getAllEntries;
|
|
36
|
+
getStats(): {
|
|
37
|
+
triggerCount: number;
|
|
38
|
+
linkCount: number;
|
|
39
|
+
recentActivationCount: number;
|
|
40
|
+
topTriggers: Array<{
|
|
41
|
+
pattern: string;
|
|
42
|
+
strength: number;
|
|
43
|
+
matches: number;
|
|
44
|
+
}>;
|
|
45
|
+
};
|
|
46
|
+
persist(): Promise<void>;
|
|
47
|
+
private loadFromDisk;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=context-recall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-recall.d.ts","sourceRoot":"","sources":["../../src/brain/context-recall.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,YAAY,EACZ,aAAa,EAEd,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAwB9D;;;;;;;;;;;;;GAaG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAA0C;IAC1D,OAAO,CAAC,eAAe,CAA4C;IACnE,OAAO,CAAC,iBAAiB,CAA2E;IACpG,OAAO,CAAC,QAAQ,CAAS;gBAEb,kBAAkB,EAAE,kBAAkB,EAAE,SAAS,CAAC,EAAE,MAAM;IAQtE,sDAAsD;IACtD,MAAM,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,GAAE,MAAW,GAAG,YAAY,EAAE;IAoGjE,wEAAwE;IACxE,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM;IA6BjD,OAAO,CAAC,aAAa;IAiJrB,OAAO,CAAC,qBAAqB;IAS7B,OAAO,CAAC,aAAa;IAiDrB,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,cAAc;IA0BtB,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,aAAa;IAwCrB,QAAQ,IAAI;QACV,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,qBAAqB,EAAE,MAAM,CAAC;QAC9B,WAAW,EAAE,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC5E;IAqBK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAoC9B,OAAO,CAAC,YAAY;CAoCrB"}
|