@timmeck/brain-core 2.4.0 → 2.6.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 +20 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -1
- package/dist/research/adaptive-strategy.d.ts +56 -0
- package/dist/research/adaptive-strategy.js +236 -0
- package/dist/research/adaptive-strategy.js.map +1 -0
- package/dist/research/agenda-engine.d.ts +46 -0
- package/dist/research/agenda-engine.js +264 -0
- package/dist/research/agenda-engine.js.map +1 -0
- package/dist/research/anomaly-detective.d.ts +62 -0
- package/dist/research/anomaly-detective.js +318 -0
- package/dist/research/anomaly-detective.js.map +1 -0
- package/dist/research/autonomous-scheduler.d.ts +124 -0
- package/dist/research/autonomous-scheduler.js +411 -0
- package/dist/research/autonomous-scheduler.js.map +1 -0
- package/dist/research/counterfactual-engine.d.ts +63 -0
- package/dist/research/counterfactual-engine.js +263 -0
- package/dist/research/counterfactual-engine.js.map +1 -0
- package/dist/research/cross-domain-engine.d.ts +52 -0
- package/dist/research/cross-domain-engine.js +283 -0
- package/dist/research/cross-domain-engine.js.map +1 -0
- package/dist/research/experiment-engine.d.ts +77 -0
- package/dist/research/experiment-engine.js +328 -0
- package/dist/research/experiment-engine.js.map +1 -0
- package/dist/research/journal.d.ts +62 -0
- package/dist/research/journal.js +262 -0
- package/dist/research/journal.js.map +1 -0
- package/dist/research/knowledge-distiller.d.ts +95 -0
- package/dist/research/knowledge-distiller.js +426 -0
- package/dist/research/knowledge-distiller.js.map +1 -0
- package/dist/research/self-observer.d.ts +55 -0
- package/dist/research/self-observer.js +268 -0
- package/dist/research/self-observer.js.map +1 -0
- package/package.json +2 -1
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
import { getLogger } from '../utils/logger.js';
|
|
2
|
+
// ── Migration ───────────────────────────────────────────
|
|
3
|
+
export function runKnowledgeDistillerMigration(db) {
|
|
4
|
+
db.exec(`
|
|
5
|
+
CREATE TABLE IF NOT EXISTS knowledge_principles (
|
|
6
|
+
id TEXT PRIMARY KEY,
|
|
7
|
+
domain TEXT NOT NULL,
|
|
8
|
+
statement TEXT NOT NULL,
|
|
9
|
+
success_rate REAL NOT NULL,
|
|
10
|
+
sample_size INTEGER NOT NULL,
|
|
11
|
+
confidence REAL NOT NULL,
|
|
12
|
+
source TEXT NOT NULL,
|
|
13
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
14
|
+
updated_at TEXT DEFAULT (datetime('now'))
|
|
15
|
+
);
|
|
16
|
+
CREATE INDEX IF NOT EXISTS idx_kp_domain ON knowledge_principles(domain);
|
|
17
|
+
|
|
18
|
+
CREATE TABLE IF NOT EXISTS knowledge_anti_patterns (
|
|
19
|
+
id TEXT PRIMARY KEY,
|
|
20
|
+
domain TEXT NOT NULL,
|
|
21
|
+
statement TEXT NOT NULL,
|
|
22
|
+
failure_rate REAL NOT NULL,
|
|
23
|
+
sample_size INTEGER NOT NULL,
|
|
24
|
+
confidence REAL NOT NULL,
|
|
25
|
+
alternative TEXT NOT NULL,
|
|
26
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
27
|
+
updated_at TEXT DEFAULT (datetime('now'))
|
|
28
|
+
);
|
|
29
|
+
CREATE INDEX IF NOT EXISTS idx_kap_domain ON knowledge_anti_patterns(domain);
|
|
30
|
+
|
|
31
|
+
CREATE TABLE IF NOT EXISTS knowledge_strategies (
|
|
32
|
+
id TEXT PRIMARY KEY,
|
|
33
|
+
domain TEXT NOT NULL,
|
|
34
|
+
description TEXT NOT NULL,
|
|
35
|
+
conditions TEXT NOT NULL,
|
|
36
|
+
effectiveness REAL NOT NULL,
|
|
37
|
+
evidence_count INTEGER NOT NULL,
|
|
38
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
39
|
+
updated_at TEXT DEFAULT (datetime('now'))
|
|
40
|
+
);
|
|
41
|
+
CREATE INDEX IF NOT EXISTS idx_ks_domain ON knowledge_strategies(domain);
|
|
42
|
+
|
|
43
|
+
CREATE TABLE IF NOT EXISTS knowledge_snapshots (
|
|
44
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
45
|
+
timestamp INTEGER NOT NULL,
|
|
46
|
+
domain TEXT NOT NULL,
|
|
47
|
+
principles_count INTEGER NOT NULL,
|
|
48
|
+
anti_patterns_count INTEGER NOT NULL,
|
|
49
|
+
strategies_count INTEGER NOT NULL,
|
|
50
|
+
avg_confidence REAL NOT NULL,
|
|
51
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
52
|
+
);
|
|
53
|
+
`);
|
|
54
|
+
}
|
|
55
|
+
// ── Engine ──────────────────────────────────────────────
|
|
56
|
+
export class KnowledgeDistiller {
|
|
57
|
+
db;
|
|
58
|
+
config;
|
|
59
|
+
log = getLogger();
|
|
60
|
+
constructor(db, config) {
|
|
61
|
+
this.db = db;
|
|
62
|
+
this.config = {
|
|
63
|
+
brainName: config.brainName,
|
|
64
|
+
minEvidence: config.minEvidence ?? 5,
|
|
65
|
+
minSuccessRate: config.minSuccessRate ?? 0.7,
|
|
66
|
+
minFailureRate: config.minFailureRate ?? 0.6,
|
|
67
|
+
};
|
|
68
|
+
runKnowledgeDistillerMigration(db);
|
|
69
|
+
}
|
|
70
|
+
/** Distill knowledge from confirmed hypotheses, research discoveries, and strategy adaptations. */
|
|
71
|
+
distill() {
|
|
72
|
+
const principles = this.extractPrinciples();
|
|
73
|
+
const antiPatterns = this.extractAntiPatterns();
|
|
74
|
+
const strategies = this.extractStrategies();
|
|
75
|
+
// Take snapshot for evolution tracking
|
|
76
|
+
this.db.prepare(`
|
|
77
|
+
INSERT INTO knowledge_snapshots (timestamp, domain, principles_count, anti_patterns_count, strategies_count, avg_confidence)
|
|
78
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
79
|
+
`).run(Date.now(), this.config.brainName, principles.length, antiPatterns.length, strategies.length, principles.length > 0 ? principles.reduce((s, p) => s + p.confidence, 0) / principles.length : 0);
|
|
80
|
+
return { principles, antiPatterns, strategies };
|
|
81
|
+
}
|
|
82
|
+
/** Get summary of all distilled knowledge. */
|
|
83
|
+
getSummary() {
|
|
84
|
+
const pCount = this.db.prepare(`SELECT COUNT(*) as c FROM knowledge_principles`).get().c;
|
|
85
|
+
const apCount = this.db.prepare(`SELECT COUNT(*) as c FROM knowledge_anti_patterns`).get().c;
|
|
86
|
+
const sCount = this.db.prepare(`SELECT COUNT(*) as c FROM knowledge_strategies`).get().c;
|
|
87
|
+
const topPrinciples = this.getPrinciples(undefined, 5);
|
|
88
|
+
const avgConf = topPrinciples.length > 0 ? topPrinciples.reduce((s, p) => s + p.confidence, 0) / topPrinciples.length : 0;
|
|
89
|
+
return {
|
|
90
|
+
principles: pCount,
|
|
91
|
+
antiPatterns: apCount,
|
|
92
|
+
strategies: sCount,
|
|
93
|
+
topPrinciples,
|
|
94
|
+
avgConfidence: avgConf,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/** Get principles, optionally filtered by domain. */
|
|
98
|
+
getPrinciples(domain, limit = 20) {
|
|
99
|
+
let sql = `SELECT * FROM knowledge_principles`;
|
|
100
|
+
const params = [];
|
|
101
|
+
if (domain) {
|
|
102
|
+
sql += ` WHERE domain = ?`;
|
|
103
|
+
params.push(domain);
|
|
104
|
+
}
|
|
105
|
+
sql += ` ORDER BY confidence DESC, success_rate DESC LIMIT ?`;
|
|
106
|
+
params.push(limit);
|
|
107
|
+
return this.db.prepare(sql).all(...params).map(r => ({
|
|
108
|
+
id: r.id,
|
|
109
|
+
domain: r.domain,
|
|
110
|
+
statement: r.statement,
|
|
111
|
+
success_rate: r.success_rate,
|
|
112
|
+
sample_size: r.sample_size,
|
|
113
|
+
confidence: r.confidence,
|
|
114
|
+
source: r.source,
|
|
115
|
+
}));
|
|
116
|
+
}
|
|
117
|
+
/** Get anti-patterns. */
|
|
118
|
+
getAntiPatterns(domain, limit = 20) {
|
|
119
|
+
let sql = `SELECT * FROM knowledge_anti_patterns`;
|
|
120
|
+
const params = [];
|
|
121
|
+
if (domain) {
|
|
122
|
+
sql += ` WHERE domain = ?`;
|
|
123
|
+
params.push(domain);
|
|
124
|
+
}
|
|
125
|
+
sql += ` ORDER BY failure_rate DESC LIMIT ?`;
|
|
126
|
+
params.push(limit);
|
|
127
|
+
return this.db.prepare(sql).all(...params).map(r => ({
|
|
128
|
+
id: r.id,
|
|
129
|
+
domain: r.domain,
|
|
130
|
+
statement: r.statement,
|
|
131
|
+
failure_rate: r.failure_rate,
|
|
132
|
+
sample_size: r.sample_size,
|
|
133
|
+
confidence: r.confidence,
|
|
134
|
+
alternative: r.alternative,
|
|
135
|
+
}));
|
|
136
|
+
}
|
|
137
|
+
/** Build a transferable knowledge package for a domain. */
|
|
138
|
+
getPackage(domain) {
|
|
139
|
+
const principles = this.getPrinciples(domain, 15);
|
|
140
|
+
const antiPatterns = this.getAntiPatterns(domain, 10);
|
|
141
|
+
const strategies = this.db.prepare(`
|
|
142
|
+
SELECT * FROM knowledge_strategies WHERE domain = ? ORDER BY effectiveness DESC LIMIT 10
|
|
143
|
+
`).all(domain).map(r => ({
|
|
144
|
+
id: r.id,
|
|
145
|
+
domain: r.domain,
|
|
146
|
+
description: r.description,
|
|
147
|
+
conditions: JSON.parse(r.conditions),
|
|
148
|
+
effectiveness: r.effectiveness,
|
|
149
|
+
evidence_count: r.evidence_count,
|
|
150
|
+
}));
|
|
151
|
+
const allConf = [...principles.map(p => p.confidence), ...antiPatterns.map(a => a.confidence)];
|
|
152
|
+
const avgConf = allConf.length > 0 ? allConf.reduce((a, b) => a + b, 0) / allConf.length : 0;
|
|
153
|
+
return {
|
|
154
|
+
id: `${domain}-${Date.now()}`,
|
|
155
|
+
created: Date.now(),
|
|
156
|
+
domain,
|
|
157
|
+
principles,
|
|
158
|
+
anti_patterns: antiPatterns,
|
|
159
|
+
strategies,
|
|
160
|
+
confidence: avgConf,
|
|
161
|
+
evidence_summary: `${principles.length} principles, ${antiPatterns.length} anti-patterns, ${strategies.length} strategies from ${this.config.brainName}`,
|
|
162
|
+
applicable_when: [`Working with ${domain} tasks`, `Debugging ${domain} issues`],
|
|
163
|
+
transferable_to: this.suggestTransferDomains(domain),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
/** Track how knowledge has evolved over time. */
|
|
167
|
+
getEvolution(domain, periods = 5) {
|
|
168
|
+
const snapshots = this.db.prepare(`
|
|
169
|
+
SELECT * FROM knowledge_snapshots
|
|
170
|
+
${domain ? 'WHERE domain = ?' : ''}
|
|
171
|
+
ORDER BY timestamp DESC LIMIT ?
|
|
172
|
+
`).all(...(domain ? [domain, periods * 2] : [periods * 2]));
|
|
173
|
+
if (snapshots.length < 2)
|
|
174
|
+
return [];
|
|
175
|
+
const evolutions = [];
|
|
176
|
+
for (let i = 0; i < snapshots.length - 1; i++) {
|
|
177
|
+
const current = snapshots[i];
|
|
178
|
+
const previous = snapshots[i + 1];
|
|
179
|
+
const principlesDelta = current.principles_count - previous.principles_count;
|
|
180
|
+
const antiPatternsDelta = current.anti_patterns_count - previous.anti_patterns_count;
|
|
181
|
+
const strategyDelta = current.strategies_count - previous.strategies_count;
|
|
182
|
+
const confCurrent = current.avg_confidence;
|
|
183
|
+
const confPrev = previous.avg_confidence;
|
|
184
|
+
const confTrend = confCurrent > confPrev + 0.02 ? 'rising' :
|
|
185
|
+
confCurrent < confPrev - 0.02 ? 'falling' : 'stable';
|
|
186
|
+
const highlights = [];
|
|
187
|
+
if (principlesDelta > 0)
|
|
188
|
+
highlights.push(`+${principlesDelta} new principles`);
|
|
189
|
+
if (principlesDelta < 0)
|
|
190
|
+
highlights.push(`${principlesDelta} principles removed (outdated)`);
|
|
191
|
+
if (antiPatternsDelta > 0)
|
|
192
|
+
highlights.push(`+${antiPatternsDelta} anti-patterns discovered`);
|
|
193
|
+
if (strategyDelta !== 0)
|
|
194
|
+
highlights.push(`${strategyDelta > 0 ? '+' : ''}${strategyDelta} strategy changes`);
|
|
195
|
+
evolutions.push({
|
|
196
|
+
domain: current.domain,
|
|
197
|
+
period: new Date(current.timestamp).toLocaleDateString(),
|
|
198
|
+
principles_added: Math.max(0, principlesDelta),
|
|
199
|
+
principles_removed: Math.abs(Math.min(0, principlesDelta)),
|
|
200
|
+
anti_patterns_discovered: Math.max(0, antiPatternsDelta),
|
|
201
|
+
strategies_changed: Math.abs(strategyDelta),
|
|
202
|
+
confidence_trend: confTrend,
|
|
203
|
+
highlights,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
return evolutions;
|
|
207
|
+
}
|
|
208
|
+
extractPrinciples() {
|
|
209
|
+
const principles = [];
|
|
210
|
+
// Extract from confirmed hypotheses
|
|
211
|
+
try {
|
|
212
|
+
const confirmed = this.db.prepare(`
|
|
213
|
+
SELECT statement, type, variables, confidence, evidence_for, evidence_against
|
|
214
|
+
FROM hypotheses
|
|
215
|
+
WHERE status = 'confirmed' AND evidence_for >= ?
|
|
216
|
+
ORDER BY confidence DESC
|
|
217
|
+
`).all(this.config.minEvidence);
|
|
218
|
+
for (const h of confirmed) {
|
|
219
|
+
const total = h.evidence_for + h.evidence_against;
|
|
220
|
+
const successRate = h.evidence_for / Math.max(total, 1);
|
|
221
|
+
if (successRate < this.config.minSuccessRate)
|
|
222
|
+
continue;
|
|
223
|
+
const id = `hyp-${this.hashString(h.statement)}`;
|
|
224
|
+
const principle = {
|
|
225
|
+
id,
|
|
226
|
+
domain: h.type || this.config.brainName,
|
|
227
|
+
statement: h.statement,
|
|
228
|
+
success_rate: successRate,
|
|
229
|
+
sample_size: total,
|
|
230
|
+
confidence: h.confidence,
|
|
231
|
+
source: 'confirmed_hypothesis',
|
|
232
|
+
};
|
|
233
|
+
this.upsertPrinciple(principle);
|
|
234
|
+
principles.push(principle);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
catch { /* hypotheses table might not exist */ }
|
|
238
|
+
// Extract from research discoveries
|
|
239
|
+
try {
|
|
240
|
+
const discoveries = this.db.prepare(`
|
|
241
|
+
SELECT title, description, confidence, type, data
|
|
242
|
+
FROM research_discoveries
|
|
243
|
+
WHERE confidence >= 0.6 AND type IN ('confirmed_hypothesis', 'causal_chain')
|
|
244
|
+
ORDER BY confidence DESC LIMIT 20
|
|
245
|
+
`).all();
|
|
246
|
+
for (const d of discoveries) {
|
|
247
|
+
const id = `disc-${this.hashString(d.title)}`;
|
|
248
|
+
const principle = {
|
|
249
|
+
id,
|
|
250
|
+
domain: this.config.brainName,
|
|
251
|
+
statement: d.title,
|
|
252
|
+
success_rate: d.confidence,
|
|
253
|
+
sample_size: 1,
|
|
254
|
+
confidence: d.confidence,
|
|
255
|
+
source: `research_discovery:${d.type}`,
|
|
256
|
+
};
|
|
257
|
+
this.upsertPrinciple(principle);
|
|
258
|
+
principles.push(principle);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
catch { /* research_discoveries table might not exist */ }
|
|
262
|
+
return principles;
|
|
263
|
+
}
|
|
264
|
+
extractAntiPatterns() {
|
|
265
|
+
const antiPatterns = [];
|
|
266
|
+
// Extract from rejected hypotheses (things that don't work)
|
|
267
|
+
try {
|
|
268
|
+
const rejected = this.db.prepare(`
|
|
269
|
+
SELECT statement, type, evidence_for, evidence_against, confidence
|
|
270
|
+
FROM hypotheses
|
|
271
|
+
WHERE status = 'rejected' AND evidence_against >= ?
|
|
272
|
+
ORDER BY evidence_against DESC
|
|
273
|
+
`).all(this.config.minEvidence);
|
|
274
|
+
for (const h of rejected) {
|
|
275
|
+
const total = h.evidence_for + h.evidence_against;
|
|
276
|
+
const failureRate = h.evidence_against / Math.max(total, 1);
|
|
277
|
+
if (failureRate < this.config.minFailureRate)
|
|
278
|
+
continue;
|
|
279
|
+
const id = `anti-${this.hashString(h.statement)}`;
|
|
280
|
+
const anti = {
|
|
281
|
+
id,
|
|
282
|
+
domain: h.type || this.config.brainName,
|
|
283
|
+
statement: `NOT: ${h.statement}`,
|
|
284
|
+
failure_rate: failureRate,
|
|
285
|
+
sample_size: total,
|
|
286
|
+
confidence: h.confidence,
|
|
287
|
+
alternative: 'See confirmed principles for what works instead.',
|
|
288
|
+
};
|
|
289
|
+
this.upsertAntiPattern(anti);
|
|
290
|
+
antiPatterns.push(anti);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
catch { /* hypotheses table might not exist */ }
|
|
294
|
+
// Extract from reverted strategy adaptations
|
|
295
|
+
try {
|
|
296
|
+
const reverted = this.db.prepare(`
|
|
297
|
+
SELECT strategy, parameter, old_value, new_value, reason, revert_reason
|
|
298
|
+
FROM strategy_adaptations
|
|
299
|
+
WHERE reverted = 1
|
|
300
|
+
ORDER BY timestamp DESC LIMIT 20
|
|
301
|
+
`).all();
|
|
302
|
+
for (const r of reverted) {
|
|
303
|
+
const id = `revert-${r.strategy}-${r.parameter}`;
|
|
304
|
+
const anti = {
|
|
305
|
+
id,
|
|
306
|
+
domain: r.strategy,
|
|
307
|
+
statement: `Changing ${r.parameter} from ${r.old_value} to ${r.new_value} degrades performance`,
|
|
308
|
+
failure_rate: 1.0,
|
|
309
|
+
sample_size: 1,
|
|
310
|
+
confidence: 0.7,
|
|
311
|
+
alternative: `Keep ${r.parameter} at ${r.old_value}. Reason: ${r.revert_reason ?? r.reason}`,
|
|
312
|
+
};
|
|
313
|
+
this.upsertAntiPattern(anti);
|
|
314
|
+
antiPatterns.push(anti);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
catch { /* strategy_adaptations table might not exist */ }
|
|
318
|
+
return antiPatterns;
|
|
319
|
+
}
|
|
320
|
+
extractStrategies() {
|
|
321
|
+
const strategies = [];
|
|
322
|
+
// Extract from successful strategy adaptations
|
|
323
|
+
try {
|
|
324
|
+
const successful = this.db.prepare(`
|
|
325
|
+
SELECT strategy, parameter, old_value, new_value, reason, evidence,
|
|
326
|
+
performance_before, performance_after
|
|
327
|
+
FROM strategy_adaptations
|
|
328
|
+
WHERE reverted = 0 AND performance_after IS NOT NULL
|
|
329
|
+
AND performance_after > performance_before
|
|
330
|
+
ORDER BY (performance_after - performance_before) DESC LIMIT 20
|
|
331
|
+
`).all();
|
|
332
|
+
for (const s of successful) {
|
|
333
|
+
const improvement = s.performance_after - s.performance_before;
|
|
334
|
+
const id = `strat-${s.strategy}-${s.parameter}-${Date.now()}`;
|
|
335
|
+
const strategy = {
|
|
336
|
+
id,
|
|
337
|
+
domain: s.strategy,
|
|
338
|
+
description: `Set ${s.parameter} to ${s.new_value} (from ${s.old_value}) for ${(improvement * 100).toFixed(1)}% improvement`,
|
|
339
|
+
conditions: [s.reason],
|
|
340
|
+
effectiveness: improvement,
|
|
341
|
+
evidence_count: 1,
|
|
342
|
+
};
|
|
343
|
+
this.upsertStrategy(strategy);
|
|
344
|
+
strategies.push(strategy);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
catch { /* strategy_adaptations table might not exist */ }
|
|
348
|
+
// Extract from meta-learning optimizations
|
|
349
|
+
try {
|
|
350
|
+
const optimizations = this.db.prepare(`
|
|
351
|
+
SELECT param_name, old_value, new_value, reason, improvement
|
|
352
|
+
FROM meta_learning_optimizations
|
|
353
|
+
WHERE improvement > 0
|
|
354
|
+
ORDER BY improvement DESC LIMIT 10
|
|
355
|
+
`).all();
|
|
356
|
+
for (const o of optimizations) {
|
|
357
|
+
const id = `meta-${o.param_name}`;
|
|
358
|
+
const strategy = {
|
|
359
|
+
id,
|
|
360
|
+
domain: 'meta_learning',
|
|
361
|
+
description: `Optimize ${o.param_name} to ${o.new_value} for ${(o.improvement * 100).toFixed(1)}% gain`,
|
|
362
|
+
conditions: [o.reason],
|
|
363
|
+
effectiveness: o.improvement,
|
|
364
|
+
evidence_count: 1,
|
|
365
|
+
};
|
|
366
|
+
this.upsertStrategy(strategy);
|
|
367
|
+
strategies.push(strategy);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
catch { /* meta_learning_optimizations table might not exist */ }
|
|
371
|
+
return strategies;
|
|
372
|
+
}
|
|
373
|
+
suggestTransferDomains(domain) {
|
|
374
|
+
const allDomains = new Set();
|
|
375
|
+
try {
|
|
376
|
+
const rows = this.db.prepare(`SELECT DISTINCT domain FROM knowledge_principles`).all();
|
|
377
|
+
for (const r of rows)
|
|
378
|
+
allDomains.add(r.domain);
|
|
379
|
+
}
|
|
380
|
+
catch { /* ignore */ }
|
|
381
|
+
allDomains.delete(domain);
|
|
382
|
+
return [...allDomains].slice(0, 5);
|
|
383
|
+
}
|
|
384
|
+
upsertPrinciple(p) {
|
|
385
|
+
this.db.prepare(`
|
|
386
|
+
INSERT INTO knowledge_principles (id, domain, statement, success_rate, sample_size, confidence, source)
|
|
387
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
388
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
389
|
+
success_rate = excluded.success_rate,
|
|
390
|
+
sample_size = excluded.sample_size,
|
|
391
|
+
confidence = excluded.confidence,
|
|
392
|
+
updated_at = datetime('now')
|
|
393
|
+
`).run(p.id, p.domain, p.statement, p.success_rate, p.sample_size, p.confidence, p.source);
|
|
394
|
+
}
|
|
395
|
+
upsertAntiPattern(a) {
|
|
396
|
+
this.db.prepare(`
|
|
397
|
+
INSERT INTO knowledge_anti_patterns (id, domain, statement, failure_rate, sample_size, confidence, alternative)
|
|
398
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
399
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
400
|
+
failure_rate = excluded.failure_rate,
|
|
401
|
+
sample_size = excluded.sample_size,
|
|
402
|
+
confidence = excluded.confidence,
|
|
403
|
+
updated_at = datetime('now')
|
|
404
|
+
`).run(a.id, a.domain, a.statement, a.failure_rate, a.sample_size, a.confidence, a.alternative);
|
|
405
|
+
}
|
|
406
|
+
upsertStrategy(s) {
|
|
407
|
+
this.db.prepare(`
|
|
408
|
+
INSERT INTO knowledge_strategies (id, domain, description, conditions, effectiveness, evidence_count)
|
|
409
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
410
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
411
|
+
effectiveness = excluded.effectiveness,
|
|
412
|
+
evidence_count = knowledge_strategies.evidence_count + 1,
|
|
413
|
+
updated_at = datetime('now')
|
|
414
|
+
`).run(s.id, s.domain, s.description, JSON.stringify(s.conditions), s.effectiveness, s.evidence_count);
|
|
415
|
+
}
|
|
416
|
+
hashString(s) {
|
|
417
|
+
let hash = 0;
|
|
418
|
+
for (let i = 0; i < s.length; i++) {
|
|
419
|
+
const char = s.charCodeAt(i);
|
|
420
|
+
hash = ((hash << 5) - hash) + char;
|
|
421
|
+
hash = hash & hash;
|
|
422
|
+
}
|
|
423
|
+
return Math.abs(hash).toString(36);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
//# sourceMappingURL=knowledge-distiller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge-distiller.js","sourceRoot":"","sources":["../../src/research/knowledge-distiller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
export type ObservationCategory = 'tool_usage' | 'query_quality' | 'resolution_rate' | 'latency' | 'cross_brain';
|
|
3
|
+
export type InsightType = 'usage_pattern' | 'quality_issue' | 'optimization_opportunity' | 'anomaly';
|
|
4
|
+
export interface SelfObservation {
|
|
5
|
+
id?: number;
|
|
6
|
+
timestamp: number;
|
|
7
|
+
category: ObservationCategory;
|
|
8
|
+
event_type: string;
|
|
9
|
+
metrics: Record<string, unknown>;
|
|
10
|
+
context?: Record<string, unknown>;
|
|
11
|
+
}
|
|
12
|
+
export interface SelfInsight {
|
|
13
|
+
id?: number;
|
|
14
|
+
timestamp: number;
|
|
15
|
+
type: InsightType;
|
|
16
|
+
title: string;
|
|
17
|
+
description: string;
|
|
18
|
+
evidence: Record<string, unknown>;
|
|
19
|
+
confidence: number;
|
|
20
|
+
actionable: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface ImprovementSuggestion {
|
|
23
|
+
area: string;
|
|
24
|
+
problem: string;
|
|
25
|
+
suggestion: string;
|
|
26
|
+
evidence: Record<string, unknown>;
|
|
27
|
+
priority: number;
|
|
28
|
+
estimated_impact: string;
|
|
29
|
+
}
|
|
30
|
+
export interface SelfObserverConfig {
|
|
31
|
+
brainName: string;
|
|
32
|
+
/** Minimum observations before generating insights. Default: 10 */
|
|
33
|
+
minObservationsForInsight?: number;
|
|
34
|
+
/** How many recent observations to analyze. Default: 500 */
|
|
35
|
+
analysisWindow?: number;
|
|
36
|
+
}
|
|
37
|
+
export declare function runSelfObserverMigration(db: Database.Database): void;
|
|
38
|
+
export declare class SelfObserver {
|
|
39
|
+
private db;
|
|
40
|
+
private config;
|
|
41
|
+
private log;
|
|
42
|
+
constructor(db: Database.Database, config: SelfObserverConfig);
|
|
43
|
+
/** Record a self-observation about tool usage, query quality, etc. */
|
|
44
|
+
record(obs: Omit<SelfObservation, 'id' | 'timestamp'>): void;
|
|
45
|
+
/** Get observation statistics grouped by category and event type. */
|
|
46
|
+
getStats(): Record<string, unknown>;
|
|
47
|
+
/** Analyze observations and generate insights. */
|
|
48
|
+
analyze(): SelfInsight[];
|
|
49
|
+
/** Get all insights, optionally filtered by type. */
|
|
50
|
+
getInsights(type?: InsightType, limit?: number): SelfInsight[];
|
|
51
|
+
/** Generate an improvement plan based on insights. */
|
|
52
|
+
getImprovementPlan(): ImprovementSuggestion[];
|
|
53
|
+
private createInsight;
|
|
54
|
+
private persistInsight;
|
|
55
|
+
}
|