@timmeck/brain-core 2.19.0 → 2.21.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/dist/index.d.ts +4 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/research/research-orchestrator.d.ts +4 -0
- package/dist/research/research-orchestrator.js +31 -5
- package/dist/research/research-orchestrator.js.map +1 -1
- package/dist/transfer/index.d.ts +2 -0
- package/dist/transfer/index.js +2 -0
- package/dist/transfer/index.js.map +1 -0
- package/dist/transfer/transfer-engine.d.ts +126 -0
- package/dist/transfer/transfer-engine.js +567 -0
- package/dist/transfer/transfer-engine.js.map +1 -0
- package/dist/unified/index.d.ts +2 -0
- package/dist/unified/index.js +2 -0
- package/dist/unified/index.js.map +1 -0
- package/dist/unified/unified-server.d.ts +25 -0
- package/dist/unified/unified-server.js +176 -0
- package/dist/unified/unified-server.js.map +1 -0
- package/package.json +1 -1
- package/unified-dashboard.html +1085 -0
|
@@ -0,0 +1,567 @@
|
|
|
1
|
+
import { getLogger } from '../utils/logger.js';
|
|
2
|
+
// ── Engine ──────────────────────────────────────────────
|
|
3
|
+
export class TransferEngine {
|
|
4
|
+
db;
|
|
5
|
+
brainName;
|
|
6
|
+
thoughtStream = null;
|
|
7
|
+
log = getLogger();
|
|
8
|
+
// Knowledge sources from peer brains
|
|
9
|
+
peerDistillers = new Map();
|
|
10
|
+
// Config
|
|
11
|
+
minSimilarity;
|
|
12
|
+
minTransferConfidence;
|
|
13
|
+
constructor(db, config) {
|
|
14
|
+
this.db = db;
|
|
15
|
+
this.brainName = config.brainName;
|
|
16
|
+
this.minSimilarity = config.minSimilarity ?? 0.35;
|
|
17
|
+
this.minTransferConfidence = config.minTransferConfidence ?? 0.6;
|
|
18
|
+
this.runMigration();
|
|
19
|
+
}
|
|
20
|
+
// ── Setup ─────────────────────────────────────────────
|
|
21
|
+
setThoughtStream(stream) {
|
|
22
|
+
this.thoughtStream = stream;
|
|
23
|
+
}
|
|
24
|
+
/** Register a peer brain's KnowledgeDistiller for cross-domain analysis. */
|
|
25
|
+
registerPeerDistiller(brainName, distiller) {
|
|
26
|
+
this.peerDistillers.set(brainName, distiller);
|
|
27
|
+
}
|
|
28
|
+
// ── Analogy Finding ───────────────────────────────────
|
|
29
|
+
/** Find analogies between this brain's knowledge and peer brains' knowledge. */
|
|
30
|
+
findAnalogies() {
|
|
31
|
+
const ts = this.thoughtStream;
|
|
32
|
+
ts?.emit('transfer', 'correlating', 'Scanning for cross-domain analogies...');
|
|
33
|
+
const discovered = [];
|
|
34
|
+
for (const [peerName, peerDistiller] of this.peerDistillers) {
|
|
35
|
+
// Get knowledge from both sides
|
|
36
|
+
const myPrinciples = this.getLocalPrinciples();
|
|
37
|
+
const peerPrinciples = peerDistiller.getPrinciples(undefined, 50);
|
|
38
|
+
const myAntiPatterns = this.getLocalAntiPatterns();
|
|
39
|
+
const peerAntiPatterns = peerDistiller.getAntiPatterns(undefined, 50);
|
|
40
|
+
// Compare principles across domains
|
|
41
|
+
for (const mine of myPrinciples) {
|
|
42
|
+
for (const theirs of peerPrinciples) {
|
|
43
|
+
const sim = this.textSimilarity(mine.statement, theirs.statement);
|
|
44
|
+
if (sim >= this.minSimilarity) {
|
|
45
|
+
const analogy = {
|
|
46
|
+
source_brain: this.brainName,
|
|
47
|
+
source_type: 'principle',
|
|
48
|
+
source_id: mine.id,
|
|
49
|
+
source_statement: mine.statement,
|
|
50
|
+
target_brain: peerName,
|
|
51
|
+
target_type: 'principle',
|
|
52
|
+
target_id: theirs.id,
|
|
53
|
+
target_statement: theirs.statement,
|
|
54
|
+
similarity: sim,
|
|
55
|
+
narrative: `"${mine.statement.substring(0, 60)}" ≈ "${theirs.statement.substring(0, 60)}" (${(sim * 100).toFixed(0)}%)`,
|
|
56
|
+
discovered_at: Date.now(),
|
|
57
|
+
};
|
|
58
|
+
this.persistAnalogy(analogy);
|
|
59
|
+
discovered.push(analogy);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Compare anti-patterns
|
|
64
|
+
for (const mine of myAntiPatterns) {
|
|
65
|
+
for (const theirs of peerAntiPatterns) {
|
|
66
|
+
const sim = this.textSimilarity(mine.statement, theirs.statement);
|
|
67
|
+
if (sim >= this.minSimilarity) {
|
|
68
|
+
const analogy = {
|
|
69
|
+
source_brain: this.brainName,
|
|
70
|
+
source_type: 'anti_pattern',
|
|
71
|
+
source_id: mine.id,
|
|
72
|
+
source_statement: mine.statement,
|
|
73
|
+
target_brain: peerName,
|
|
74
|
+
target_type: 'anti_pattern',
|
|
75
|
+
target_id: theirs.id,
|
|
76
|
+
target_statement: theirs.statement,
|
|
77
|
+
similarity: sim,
|
|
78
|
+
narrative: `Anti-pattern match: "${mine.statement.substring(0, 50)}" ≈ "${theirs.statement.substring(0, 50)}"`,
|
|
79
|
+
discovered_at: Date.now(),
|
|
80
|
+
};
|
|
81
|
+
this.persistAnalogy(analogy);
|
|
82
|
+
discovered.push(analogy);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (discovered.length > 0) {
|
|
88
|
+
ts?.emit('transfer', 'discovering', `Found ${discovered.length} cross-domain analogies`, discovered.length >= 3 ? 'notable' : 'routine');
|
|
89
|
+
}
|
|
90
|
+
return discovered;
|
|
91
|
+
}
|
|
92
|
+
// ── Transfer Proposals ────────────────────────────────
|
|
93
|
+
/** Propose knowledge transfers from peers to this brain. */
|
|
94
|
+
proposeTransfers() {
|
|
95
|
+
const ts = this.thoughtStream;
|
|
96
|
+
const proposals = [];
|
|
97
|
+
for (const [peerName, peerDistiller] of this.peerDistillers) {
|
|
98
|
+
const peerPrinciples = peerDistiller.getPrinciples(undefined, 30);
|
|
99
|
+
const myPrinciples = this.getLocalPrinciples();
|
|
100
|
+
const myStatements = new Set(myPrinciples.map(p => p.statement.toLowerCase()));
|
|
101
|
+
for (const principle of peerPrinciples) {
|
|
102
|
+
// Skip if we already have this principle (exact match)
|
|
103
|
+
if (myStatements.has(principle.statement.toLowerCase()))
|
|
104
|
+
continue;
|
|
105
|
+
// Skip if already transferred
|
|
106
|
+
if (this.isAlreadyTransferred(principle.id, peerName))
|
|
107
|
+
continue;
|
|
108
|
+
// Compute transfer confidence based on peer confidence + relevance
|
|
109
|
+
const relevance = this.estimateRelevance(principle.statement);
|
|
110
|
+
const confidence = principle.confidence * 0.6 + relevance * 0.4;
|
|
111
|
+
if (confidence >= this.minTransferConfidence) {
|
|
112
|
+
const record = {
|
|
113
|
+
source_brain: peerName,
|
|
114
|
+
target_brain: this.brainName,
|
|
115
|
+
knowledge_type: 'principle',
|
|
116
|
+
knowledge_id: principle.id,
|
|
117
|
+
statement: principle.statement,
|
|
118
|
+
transfer_confidence: confidence,
|
|
119
|
+
status: 'pending',
|
|
120
|
+
effectiveness: null,
|
|
121
|
+
created_at: Date.now(),
|
|
122
|
+
resolved_at: null,
|
|
123
|
+
};
|
|
124
|
+
this.persistTransfer(record);
|
|
125
|
+
proposals.push(record);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Also propose anti-patterns
|
|
129
|
+
const peerAntiPatterns = peerDistiller.getAntiPatterns(undefined, 20);
|
|
130
|
+
const myAPStatements = new Set(this.getLocalAntiPatterns().map(a => a.statement.toLowerCase()));
|
|
131
|
+
for (const ap of peerAntiPatterns) {
|
|
132
|
+
if (myAPStatements.has(ap.statement.toLowerCase()))
|
|
133
|
+
continue;
|
|
134
|
+
if (this.isAlreadyTransferred(ap.id, peerName))
|
|
135
|
+
continue;
|
|
136
|
+
const relevance = this.estimateRelevance(ap.statement);
|
|
137
|
+
const confidence = ap.confidence * 0.6 + relevance * 0.4;
|
|
138
|
+
if (confidence >= this.minTransferConfidence) {
|
|
139
|
+
const record = {
|
|
140
|
+
source_brain: peerName,
|
|
141
|
+
target_brain: this.brainName,
|
|
142
|
+
knowledge_type: 'anti_pattern',
|
|
143
|
+
knowledge_id: ap.id,
|
|
144
|
+
statement: ap.statement,
|
|
145
|
+
transfer_confidence: confidence,
|
|
146
|
+
status: 'pending',
|
|
147
|
+
effectiveness: null,
|
|
148
|
+
created_at: Date.now(),
|
|
149
|
+
resolved_at: null,
|
|
150
|
+
};
|
|
151
|
+
this.persistTransfer(record);
|
|
152
|
+
proposals.push(record);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (proposals.length > 0) {
|
|
157
|
+
ts?.emit('transfer', 'discovering', `Proposed ${proposals.length} knowledge transfers from peers`, 'notable');
|
|
158
|
+
}
|
|
159
|
+
return proposals;
|
|
160
|
+
}
|
|
161
|
+
// ── Cross-Domain Rules ────────────────────────────────
|
|
162
|
+
/** Add a cross-domain rule. */
|
|
163
|
+
addRule(rule) {
|
|
164
|
+
const full = {
|
|
165
|
+
...rule,
|
|
166
|
+
fire_count: 0,
|
|
167
|
+
last_fired: null,
|
|
168
|
+
created_at: Date.now(),
|
|
169
|
+
};
|
|
170
|
+
const result = this.db.prepare(`
|
|
171
|
+
INSERT INTO transfer_rules (name, source_brain, source_event, target_brain, action, condition, cooldown_ms, enabled, fire_count, last_fired, created_at)
|
|
172
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, 0, NULL, ?)
|
|
173
|
+
`).run(full.name, full.source_brain, full.source_event, full.target_brain, full.action, full.condition, full.cooldown_ms, full.enabled ? 1 : 0, full.created_at);
|
|
174
|
+
full.id = Number(result.lastInsertRowid);
|
|
175
|
+
this.log.info(`[transfer] Rule added: "${full.name}" (${full.source_brain}:${full.source_event} → ${full.target_brain}:${full.action})`);
|
|
176
|
+
return full;
|
|
177
|
+
}
|
|
178
|
+
/** Evaluate rules against an incoming event. Returns fired rule names. */
|
|
179
|
+
evaluateRules(sourceBrain, eventType, data) {
|
|
180
|
+
const now = Date.now();
|
|
181
|
+
const rules = this.db.prepare('SELECT * FROM transfer_rules WHERE source_brain = ? AND source_event = ? AND enabled = 1').all(sourceBrain, eventType);
|
|
182
|
+
const fired = [];
|
|
183
|
+
for (const row of rules) {
|
|
184
|
+
const lastFired = row.last_fired;
|
|
185
|
+
const cooldown = row.cooldown_ms;
|
|
186
|
+
// Cooldown check
|
|
187
|
+
if (lastFired && now - lastFired < cooldown)
|
|
188
|
+
continue;
|
|
189
|
+
// Evaluate condition (simple JSON-based conditions)
|
|
190
|
+
if (this.evaluateCondition(row.condition, data)) {
|
|
191
|
+
// Fire the rule
|
|
192
|
+
this.db.prepare('UPDATE transfer_rules SET fire_count = fire_count + 1, last_fired = ? WHERE id = ?').run(now, row.id);
|
|
193
|
+
fired.push(row.name);
|
|
194
|
+
this.thoughtStream?.emit('transfer', 'responding', `Rule fired: "${row.name}" (${sourceBrain}:${eventType} → ${row.target_brain}:${row.action})`, 'notable');
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return fired;
|
|
198
|
+
}
|
|
199
|
+
/** Get all rules. */
|
|
200
|
+
getRules() {
|
|
201
|
+
return this.db.prepare('SELECT * FROM transfer_rules ORDER BY fire_count DESC').all().map(this.rowToRule);
|
|
202
|
+
}
|
|
203
|
+
/** Enable/disable a rule. */
|
|
204
|
+
setRuleEnabled(ruleId, enabled) {
|
|
205
|
+
this.db.prepare('UPDATE transfer_rules SET enabled = ? WHERE id = ?').run(enabled ? 1 : 0, ruleId);
|
|
206
|
+
}
|
|
207
|
+
// ── Transfer Resolution ───────────────────────────────
|
|
208
|
+
/** Mark a transfer as applied. */
|
|
209
|
+
applyTransfer(transferId) {
|
|
210
|
+
this.db.prepare('UPDATE knowledge_transfers SET status = ?, resolved_at = ? WHERE id = ?').run('applied', Date.now(), transferId);
|
|
211
|
+
}
|
|
212
|
+
/** Validate a transfer (measure effectiveness). */
|
|
213
|
+
validateTransfer(transferId, effectiveness) {
|
|
214
|
+
const status = effectiveness >= 0.5 ? 'validated' : 'rejected';
|
|
215
|
+
this.db.prepare('UPDATE knowledge_transfers SET status = ?, effectiveness = ?, resolved_at = ? WHERE id = ?').run(status, effectiveness, Date.now(), transferId);
|
|
216
|
+
}
|
|
217
|
+
// ── Analysis ──────────────────────────────────────────
|
|
218
|
+
/** Run full transfer analysis cycle: analogies + proposals. */
|
|
219
|
+
analyze() {
|
|
220
|
+
const analogies = this.findAnalogies();
|
|
221
|
+
const proposals = this.proposeTransfers();
|
|
222
|
+
return { analogies, proposals };
|
|
223
|
+
}
|
|
224
|
+
/** Compute overall transfer effectiveness score. */
|
|
225
|
+
getTransferScore() {
|
|
226
|
+
const row = this.db.prepare(`
|
|
227
|
+
SELECT
|
|
228
|
+
COUNT(*) as total,
|
|
229
|
+
SUM(CASE WHEN status = 'validated' THEN 1 ELSE 0 END) as validated,
|
|
230
|
+
AVG(CASE WHEN effectiveness IS NOT NULL THEN effectiveness ELSE NULL END) as avg_eff
|
|
231
|
+
FROM knowledge_transfers WHERE target_brain = ?
|
|
232
|
+
`).get(this.brainName);
|
|
233
|
+
const avgEff = row.avg_eff ?? 0;
|
|
234
|
+
const score = row.total > 0 ? (row.validated / row.total) * avgEff : 0;
|
|
235
|
+
return {
|
|
236
|
+
score,
|
|
237
|
+
validated: row.validated,
|
|
238
|
+
total: row.total,
|
|
239
|
+
avgEffectiveness: avgEff,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
// ── Query Methods ─────────────────────────────────────
|
|
243
|
+
getStatus() {
|
|
244
|
+
const analogyCount = this.db.prepare('SELECT COUNT(*) as c FROM transfer_analogies').get().c;
|
|
245
|
+
const transfers = this.db.prepare('SELECT * FROM knowledge_transfers WHERE target_brain = ? ORDER BY created_at DESC LIMIT 50').all(this.brainName);
|
|
246
|
+
const rules = this.getRules();
|
|
247
|
+
const pending = transfers.filter(t => t.status === 'pending').length;
|
|
248
|
+
const applied = transfers.filter(t => t.status === 'applied').length;
|
|
249
|
+
const validated = transfers.filter(t => t.status === 'validated').length;
|
|
250
|
+
const rejected = transfers.filter(t => t.status === 'rejected').length;
|
|
251
|
+
const effValues = transfers.filter(t => t.effectiveness !== null).map(t => t.effectiveness);
|
|
252
|
+
const avgEff = effValues.length > 0 ? effValues.reduce((a, b) => a + b, 0) / effValues.length : 0;
|
|
253
|
+
const recentAnalogies = this.db.prepare('SELECT * FROM transfer_analogies ORDER BY discovered_at DESC LIMIT 10').all().map(this.rowToAnalogy);
|
|
254
|
+
const recentTransfers = transfers.slice(0, 10).map(this.rowToTransfer);
|
|
255
|
+
return {
|
|
256
|
+
totalAnalogies: analogyCount,
|
|
257
|
+
totalTransfers: transfers.length,
|
|
258
|
+
pendingTransfers: pending,
|
|
259
|
+
appliedTransfers: applied,
|
|
260
|
+
validatedTransfers: validated,
|
|
261
|
+
rejectedTransfers: rejected,
|
|
262
|
+
avgEffectiveness: avgEff,
|
|
263
|
+
totalRules: rules.length,
|
|
264
|
+
activeRules: rules.filter(r => r.enabled).length,
|
|
265
|
+
recentAnalogies,
|
|
266
|
+
recentTransfers,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
getAnalogies(limit = 20) {
|
|
270
|
+
return this.db.prepare('SELECT * FROM transfer_analogies ORDER BY similarity DESC LIMIT ?').all(limit).map(this.rowToAnalogy);
|
|
271
|
+
}
|
|
272
|
+
getTransferHistory(limit = 50) {
|
|
273
|
+
return this.db.prepare('SELECT * FROM knowledge_transfers WHERE target_brain = ? ORDER BY created_at DESC LIMIT ?').all(this.brainName, limit).map(this.rowToTransfer);
|
|
274
|
+
}
|
|
275
|
+
getPendingTransfers() {
|
|
276
|
+
return this.db.prepare("SELECT * FROM knowledge_transfers WHERE target_brain = ? AND status = 'pending' ORDER BY transfer_confidence DESC").all(this.brainName).map(this.rowToTransfer);
|
|
277
|
+
}
|
|
278
|
+
// ── Text Similarity ───────────────────────────────────
|
|
279
|
+
/** Simple word-overlap similarity (Jaccard + keyword boost). Fast, no embeddings needed. */
|
|
280
|
+
textSimilarity(a, b) {
|
|
281
|
+
const tokenize = (s) => {
|
|
282
|
+
const words = s.toLowerCase()
|
|
283
|
+
.replace(/[^a-z0-9\s]/g, '')
|
|
284
|
+
.split(/\s+/)
|
|
285
|
+
.filter(w => w.length > 2);
|
|
286
|
+
// Add bigrams for better matching
|
|
287
|
+
const bigrams = [];
|
|
288
|
+
for (let i = 0; i < words.length - 1; i++) {
|
|
289
|
+
bigrams.push(`${words[i]}_${words[i + 1]}`);
|
|
290
|
+
}
|
|
291
|
+
return new Set([...words, ...bigrams]);
|
|
292
|
+
};
|
|
293
|
+
const setA = tokenize(a);
|
|
294
|
+
const setB = tokenize(b);
|
|
295
|
+
if (setA.size === 0 || setB.size === 0)
|
|
296
|
+
return 0;
|
|
297
|
+
let intersection = 0;
|
|
298
|
+
for (const token of setA) {
|
|
299
|
+
if (setB.has(token))
|
|
300
|
+
intersection++;
|
|
301
|
+
}
|
|
302
|
+
const union = new Set([...setA, ...setB]).size;
|
|
303
|
+
return union > 0 ? intersection / union : 0;
|
|
304
|
+
}
|
|
305
|
+
/** Estimate how relevant a statement is to this brain's domain. */
|
|
306
|
+
estimateRelevance(statement) {
|
|
307
|
+
const lower = statement.toLowerCase();
|
|
308
|
+
// Domain keyword maps
|
|
309
|
+
const domainKeywords = {
|
|
310
|
+
brain: ['error', 'bug', 'fix', 'code', 'module', 'function', 'test', 'debug', 'log', 'crash', 'exception'],
|
|
311
|
+
'trading-brain': ['trade', 'signal', 'backtest', 'kelly', 'risk', 'position', 'profit', 'loss', 'equity', 'drawdown'],
|
|
312
|
+
'marketing-brain': ['post', 'publish', 'engagement', 'campaign', 'schedule', 'hashtag', 'competitor', 'content', 'audience'],
|
|
313
|
+
};
|
|
314
|
+
const myKeywords = domainKeywords[this.brainName] ?? [];
|
|
315
|
+
const otherKeywords = Object.entries(domainKeywords)
|
|
316
|
+
.filter(([name]) => name !== this.brainName)
|
|
317
|
+
.flatMap(([, kw]) => kw);
|
|
318
|
+
let myHits = 0;
|
|
319
|
+
let otherHits = 0;
|
|
320
|
+
for (const kw of myKeywords) {
|
|
321
|
+
if (lower.includes(kw))
|
|
322
|
+
myHits++;
|
|
323
|
+
}
|
|
324
|
+
for (const kw of otherKeywords) {
|
|
325
|
+
if (lower.includes(kw))
|
|
326
|
+
otherHits++;
|
|
327
|
+
}
|
|
328
|
+
// Higher relevance if it matches MY domain keywords
|
|
329
|
+
// Lower if it only matches other domains
|
|
330
|
+
if (myHits > 0)
|
|
331
|
+
return Math.min(1.0, 0.5 + myHits * 0.15);
|
|
332
|
+
if (otherHits === 0)
|
|
333
|
+
return 0.4; // Generic statement — moderate relevance
|
|
334
|
+
return 0.2; // Specific to other domain — low relevance
|
|
335
|
+
}
|
|
336
|
+
// ── Condition Evaluation ──────────────────────────────
|
|
337
|
+
/** Evaluate a simple condition string against event data. */
|
|
338
|
+
evaluateCondition(condition, data) {
|
|
339
|
+
if (!condition || condition === 'true' || condition === '*')
|
|
340
|
+
return true;
|
|
341
|
+
try {
|
|
342
|
+
// Simple key=value conditions separated by " AND "
|
|
343
|
+
const parts = condition.split(' AND ').map(s => s.trim());
|
|
344
|
+
const obj = data;
|
|
345
|
+
for (const part of parts) {
|
|
346
|
+
// count>=3
|
|
347
|
+
const matchGte = part.match(/^(\w+)\s*>=\s*(.+)$/);
|
|
348
|
+
if (matchGte) {
|
|
349
|
+
const val = Number(obj[matchGte[1]]);
|
|
350
|
+
if (isNaN(val) || val < Number(matchGte[2]))
|
|
351
|
+
return false;
|
|
352
|
+
continue;
|
|
353
|
+
}
|
|
354
|
+
// count>3
|
|
355
|
+
const matchGt = part.match(/^(\w+)\s*>\s*(.+)$/);
|
|
356
|
+
if (matchGt) {
|
|
357
|
+
const val = Number(obj[matchGt[1]]);
|
|
358
|
+
if (isNaN(val) || val <= Number(matchGt[2]))
|
|
359
|
+
return false;
|
|
360
|
+
continue;
|
|
361
|
+
}
|
|
362
|
+
// status=active
|
|
363
|
+
const matchEq = part.match(/^(\w+)\s*=\s*(.+)$/);
|
|
364
|
+
if (matchEq) {
|
|
365
|
+
if (String(obj[matchEq[1]]) !== matchEq[2].trim())
|
|
366
|
+
return false;
|
|
367
|
+
continue;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
return true;
|
|
371
|
+
}
|
|
372
|
+
catch {
|
|
373
|
+
return false;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
// ── Helpers ───────────────────────────────────────────
|
|
377
|
+
getLocalPrinciples() {
|
|
378
|
+
return this.db.prepare('SELECT * FROM knowledge_principles ORDER BY confidence DESC LIMIT 50').all();
|
|
379
|
+
}
|
|
380
|
+
getLocalAntiPatterns() {
|
|
381
|
+
return this.db.prepare('SELECT * FROM knowledge_anti_patterns ORDER BY confidence DESC LIMIT 50').all();
|
|
382
|
+
}
|
|
383
|
+
isAlreadyTransferred(knowledgeId, sourceBrain) {
|
|
384
|
+
const row = this.db.prepare('SELECT 1 FROM knowledge_transfers WHERE knowledge_id = ? AND source_brain = ? AND target_brain = ?').get(knowledgeId, sourceBrain, this.brainName);
|
|
385
|
+
return !!row;
|
|
386
|
+
}
|
|
387
|
+
rowToAnalogy = (row) => {
|
|
388
|
+
const r = row;
|
|
389
|
+
return {
|
|
390
|
+
id: r.id,
|
|
391
|
+
source_brain: r.source_brain,
|
|
392
|
+
source_type: r.source_type,
|
|
393
|
+
source_id: r.source_id,
|
|
394
|
+
source_statement: r.source_statement,
|
|
395
|
+
target_brain: r.target_brain,
|
|
396
|
+
target_type: r.target_type,
|
|
397
|
+
target_id: r.target_id,
|
|
398
|
+
target_statement: r.target_statement,
|
|
399
|
+
similarity: r.similarity,
|
|
400
|
+
narrative: r.narrative,
|
|
401
|
+
discovered_at: r.discovered_at,
|
|
402
|
+
};
|
|
403
|
+
};
|
|
404
|
+
rowToTransfer = (row) => {
|
|
405
|
+
const r = row;
|
|
406
|
+
return {
|
|
407
|
+
id: r.id,
|
|
408
|
+
source_brain: r.source_brain,
|
|
409
|
+
target_brain: r.target_brain,
|
|
410
|
+
knowledge_type: r.knowledge_type,
|
|
411
|
+
knowledge_id: r.knowledge_id,
|
|
412
|
+
statement: r.statement,
|
|
413
|
+
transfer_confidence: r.transfer_confidence,
|
|
414
|
+
status: r.status,
|
|
415
|
+
effectiveness: r.effectiveness,
|
|
416
|
+
created_at: r.created_at,
|
|
417
|
+
resolved_at: r.resolved_at,
|
|
418
|
+
};
|
|
419
|
+
};
|
|
420
|
+
rowToRule = (row) => {
|
|
421
|
+
const r = row;
|
|
422
|
+
return {
|
|
423
|
+
id: r.id,
|
|
424
|
+
name: r.name,
|
|
425
|
+
source_brain: r.source_brain,
|
|
426
|
+
source_event: r.source_event,
|
|
427
|
+
target_brain: r.target_brain,
|
|
428
|
+
action: r.action,
|
|
429
|
+
condition: r.condition,
|
|
430
|
+
cooldown_ms: r.cooldown_ms,
|
|
431
|
+
enabled: !!r.enabled,
|
|
432
|
+
fire_count: r.fire_count,
|
|
433
|
+
last_fired: r.last_fired,
|
|
434
|
+
created_at: r.created_at,
|
|
435
|
+
};
|
|
436
|
+
};
|
|
437
|
+
// ── Persistence ───────────────────────────────────────
|
|
438
|
+
persistAnalogy(analogy) {
|
|
439
|
+
this.db.prepare(`
|
|
440
|
+
INSERT OR REPLACE INTO transfer_analogies
|
|
441
|
+
(source_brain, source_type, source_id, source_statement, target_brain, target_type, target_id, target_statement, similarity, narrative, discovered_at)
|
|
442
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
443
|
+
`).run(analogy.source_brain, analogy.source_type, analogy.source_id, analogy.source_statement, analogy.target_brain, analogy.target_type, analogy.target_id, analogy.target_statement, analogy.similarity, analogy.narrative, analogy.discovered_at);
|
|
444
|
+
}
|
|
445
|
+
persistTransfer(record) {
|
|
446
|
+
this.db.prepare(`
|
|
447
|
+
INSERT INTO knowledge_transfers
|
|
448
|
+
(source_brain, target_brain, knowledge_type, knowledge_id, statement, transfer_confidence, status, effectiveness, created_at, resolved_at)
|
|
449
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
450
|
+
`).run(record.source_brain, record.target_brain, record.knowledge_type, record.knowledge_id, record.statement, record.transfer_confidence, record.status, record.effectiveness, record.created_at, record.resolved_at);
|
|
451
|
+
}
|
|
452
|
+
runMigration() {
|
|
453
|
+
this.db.exec(`
|
|
454
|
+
CREATE TABLE IF NOT EXISTS transfer_analogies (
|
|
455
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
456
|
+
source_brain TEXT NOT NULL,
|
|
457
|
+
source_type TEXT NOT NULL,
|
|
458
|
+
source_id TEXT NOT NULL,
|
|
459
|
+
source_statement TEXT NOT NULL,
|
|
460
|
+
target_brain TEXT NOT NULL,
|
|
461
|
+
target_type TEXT NOT NULL,
|
|
462
|
+
target_id TEXT NOT NULL,
|
|
463
|
+
target_statement TEXT NOT NULL,
|
|
464
|
+
similarity REAL NOT NULL,
|
|
465
|
+
narrative TEXT NOT NULL,
|
|
466
|
+
discovered_at INTEGER NOT NULL,
|
|
467
|
+
UNIQUE(source_brain, source_id, target_brain, target_id)
|
|
468
|
+
);
|
|
469
|
+
CREATE INDEX IF NOT EXISTS idx_ta_sim ON transfer_analogies(similarity);
|
|
470
|
+
|
|
471
|
+
CREATE TABLE IF NOT EXISTS knowledge_transfers (
|
|
472
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
473
|
+
source_brain TEXT NOT NULL,
|
|
474
|
+
target_brain TEXT NOT NULL,
|
|
475
|
+
knowledge_type TEXT NOT NULL,
|
|
476
|
+
knowledge_id TEXT NOT NULL,
|
|
477
|
+
statement TEXT NOT NULL,
|
|
478
|
+
transfer_confidence REAL NOT NULL,
|
|
479
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
480
|
+
effectiveness REAL,
|
|
481
|
+
created_at INTEGER NOT NULL,
|
|
482
|
+
resolved_at INTEGER
|
|
483
|
+
);
|
|
484
|
+
CREATE INDEX IF NOT EXISTS idx_kt_target ON knowledge_transfers(target_brain, status);
|
|
485
|
+
|
|
486
|
+
CREATE TABLE IF NOT EXISTS transfer_rules (
|
|
487
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
488
|
+
name TEXT NOT NULL UNIQUE,
|
|
489
|
+
source_brain TEXT NOT NULL,
|
|
490
|
+
source_event TEXT NOT NULL,
|
|
491
|
+
target_brain TEXT NOT NULL,
|
|
492
|
+
action TEXT NOT NULL,
|
|
493
|
+
condition TEXT NOT NULL DEFAULT 'true',
|
|
494
|
+
cooldown_ms INTEGER NOT NULL DEFAULT 300000,
|
|
495
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
496
|
+
fire_count INTEGER NOT NULL DEFAULT 0,
|
|
497
|
+
last_fired INTEGER,
|
|
498
|
+
created_at INTEGER NOT NULL
|
|
499
|
+
);
|
|
500
|
+
CREATE INDEX IF NOT EXISTS idx_tr_source ON transfer_rules(source_brain, source_event);
|
|
501
|
+
`);
|
|
502
|
+
}
|
|
503
|
+
// ── Default Rules ─────────────────────────────────────
|
|
504
|
+
/** Seed default cross-domain rules if none exist. */
|
|
505
|
+
seedDefaultRules() {
|
|
506
|
+
const count = this.db.prepare('SELECT COUNT(*) as c FROM transfer_rules').get().c;
|
|
507
|
+
if (count > 0)
|
|
508
|
+
return;
|
|
509
|
+
const defaults = [
|
|
510
|
+
{
|
|
511
|
+
name: 'error-burst-warn-trading',
|
|
512
|
+
source_brain: 'brain',
|
|
513
|
+
source_event: 'error:reported',
|
|
514
|
+
target_brain: 'trading-brain',
|
|
515
|
+
action: 'warn:system-instability',
|
|
516
|
+
condition: 'count>=3',
|
|
517
|
+
cooldown_ms: 300_000,
|
|
518
|
+
enabled: true,
|
|
519
|
+
},
|
|
520
|
+
{
|
|
521
|
+
name: 'error-burst-pause-marketing',
|
|
522
|
+
source_brain: 'brain',
|
|
523
|
+
source_event: 'error:reported',
|
|
524
|
+
target_brain: 'marketing-brain',
|
|
525
|
+
action: 'pause:non-urgent-posts',
|
|
526
|
+
condition: 'count>=5',
|
|
527
|
+
cooldown_ms: 600_000,
|
|
528
|
+
enabled: true,
|
|
529
|
+
},
|
|
530
|
+
{
|
|
531
|
+
name: 'trade-loss-streak-notify-brain',
|
|
532
|
+
source_brain: 'trading-brain',
|
|
533
|
+
source_event: 'trade:outcome',
|
|
534
|
+
target_brain: 'brain',
|
|
535
|
+
action: 'alert:trading-losses',
|
|
536
|
+
condition: 'consecutive_losses>=3',
|
|
537
|
+
cooldown_ms: 600_000,
|
|
538
|
+
enabled: true,
|
|
539
|
+
},
|
|
540
|
+
{
|
|
541
|
+
name: 'engagement-spike-trading-hint',
|
|
542
|
+
source_brain: 'marketing-brain',
|
|
543
|
+
source_event: 'engagement:spike',
|
|
544
|
+
target_brain: 'trading-brain',
|
|
545
|
+
action: 'hint:high-activity-period',
|
|
546
|
+
condition: 'true',
|
|
547
|
+
cooldown_ms: 3_600_000,
|
|
548
|
+
enabled: true,
|
|
549
|
+
},
|
|
550
|
+
{
|
|
551
|
+
name: 'insight-share-all',
|
|
552
|
+
source_brain: '*',
|
|
553
|
+
source_event: 'insight:created',
|
|
554
|
+
target_brain: '*',
|
|
555
|
+
action: 'share:insight',
|
|
556
|
+
condition: 'true',
|
|
557
|
+
cooldown_ms: 60_000,
|
|
558
|
+
enabled: true,
|
|
559
|
+
},
|
|
560
|
+
];
|
|
561
|
+
for (const rule of defaults) {
|
|
562
|
+
this.addRule(rule);
|
|
563
|
+
}
|
|
564
|
+
this.log.info(`[transfer] Seeded ${defaults.length} default cross-domain rules`);
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
//# sourceMappingURL=transfer-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer-engine.js","sourceRoot":"","sources":["../../src/transfer/transfer-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/unified/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ThoughtStream } from '../consciousness/thought-stream.js';
|
|
2
|
+
export interface UnifiedDashboardOptions {
|
|
3
|
+
port: number;
|
|
4
|
+
thoughtStream: ThoughtStream;
|
|
5
|
+
getOverview: () => unknown;
|
|
6
|
+
getTransferStatus: () => unknown;
|
|
7
|
+
getAttentionStatus: () => unknown;
|
|
8
|
+
getNotifications: () => unknown[];
|
|
9
|
+
onTriggerFeedback?: () => void;
|
|
10
|
+
}
|
|
11
|
+
export declare class UnifiedDashboardServer {
|
|
12
|
+
private options;
|
|
13
|
+
private server;
|
|
14
|
+
private clients;
|
|
15
|
+
private unsubscribe;
|
|
16
|
+
private heartbeatTimer;
|
|
17
|
+
private statusTimer;
|
|
18
|
+
private dashboardHtml;
|
|
19
|
+
private logger;
|
|
20
|
+
constructor(options: UnifiedDashboardOptions);
|
|
21
|
+
start(): void;
|
|
22
|
+
stop(): void;
|
|
23
|
+
getClientCount(): number;
|
|
24
|
+
private broadcast;
|
|
25
|
+
}
|