@timmeck/brain-core 2.26.0 → 2.28.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/causal/engine.d.ts +47 -0
- package/dist/causal/engine.js +142 -0
- package/dist/causal/engine.js.map +1 -1
- package/dist/codegen/code-generator.d.ts +17 -0
- package/dist/codegen/code-generator.js +61 -0
- package/dist/codegen/code-generator.js.map +1 -1
- package/dist/codegen/index.d.ts +1 -0
- package/dist/codegen/index.js.map +1 -1
- package/dist/curiosity/curiosity-engine.d.ts +29 -0
- package/dist/curiosity/curiosity-engine.js +147 -0
- package/dist/curiosity/curiosity-engine.js.map +1 -1
- package/dist/curiosity/index.d.ts +1 -1
- package/dist/debate/debate-engine.d.ts +27 -0
- package/dist/debate/debate-engine.js +169 -0
- package/dist/debate/debate-engine.js.map +1 -1
- package/dist/debate/index.d.ts +1 -1
- package/dist/dream/dream-engine.d.ts +16 -1
- package/dist/dream/dream-engine.js +190 -0
- package/dist/dream/dream-engine.js.map +1 -1
- package/dist/dream/index.d.ts +1 -1
- package/dist/dream/types.d.ts +18 -0
- package/dist/emergence/emergence-engine.d.ts +19 -0
- package/dist/emergence/emergence-engine.js +118 -0
- package/dist/emergence/emergence-engine.js.map +1 -1
- package/dist/goals/goal-engine.d.ts +127 -0
- package/dist/goals/goal-engine.js +386 -0
- package/dist/goals/goal-engine.js.map +1 -0
- package/dist/goals/index.d.ts +2 -0
- package/dist/goals/index.js +2 -0
- package/dist/goals/index.js.map +1 -0
- package/dist/hypothesis/engine.d.ts +38 -0
- package/dist/hypothesis/engine.js +167 -0
- package/dist/hypothesis/engine.js.map +1 -1
- package/dist/index.d.ts +19 -6
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/memory-palace/index.d.ts +2 -0
- package/dist/memory-palace/index.js +2 -0
- package/dist/memory-palace/index.js.map +1 -0
- package/dist/memory-palace/memory-palace.d.ts +150 -0
- package/dist/memory-palace/memory-palace.js +479 -0
- package/dist/memory-palace/memory-palace.js.map +1 -0
- package/dist/metacognition/index.d.ts +7 -1
- package/dist/metacognition/index.js +3 -0
- package/dist/metacognition/index.js.map +1 -1
- package/dist/metacognition/meta-cognition-layer.d.ts +50 -0
- package/dist/metacognition/meta-cognition-layer.js +190 -0
- package/dist/metacognition/meta-cognition-layer.js.map +1 -1
- package/dist/metacognition/self-test-engine.d.ts +52 -0
- package/dist/metacognition/self-test-engine.js +210 -0
- package/dist/metacognition/self-test-engine.js.map +1 -0
- package/dist/metacognition/simulation-engine.d.ts +71 -0
- package/dist/metacognition/simulation-engine.js +267 -0
- package/dist/metacognition/simulation-engine.js.map +1 -0
- package/dist/metacognition/teach-engine.d.ts +63 -0
- package/dist/metacognition/teach-engine.js +185 -0
- package/dist/metacognition/teach-engine.js.map +1 -0
- package/dist/research/data-scout.d.ts +68 -0
- package/dist/research/data-scout.js +254 -0
- package/dist/research/data-scout.js.map +1 -0
- package/dist/research/research-orchestrator.d.ts +24 -0
- package/dist/research/research-orchestrator.js +331 -0
- package/dist/research/research-orchestrator.js.map +1 -1
- package/dist/transfer/index.d.ts +1 -1
- package/dist/transfer/transfer-engine.d.ts +38 -0
- package/dist/transfer/transfer-engine.js +138 -0
- package/dist/transfer/transfer-engine.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { getLogger } from '../utils/logger.js';
|
|
2
|
+
// ── Migration ───────────────────────────────────────────
|
|
3
|
+
export function runSimulationMigration(db) {
|
|
4
|
+
db.exec(`
|
|
5
|
+
CREATE TABLE IF NOT EXISTS simulations (
|
|
6
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
7
|
+
scenario TEXT NOT NULL,
|
|
8
|
+
parameters TEXT NOT NULL DEFAULT '{}',
|
|
9
|
+
predicted_outcomes TEXT NOT NULL DEFAULT '[]',
|
|
10
|
+
actual_outcomes TEXT DEFAULT NULL,
|
|
11
|
+
accuracy REAL DEFAULT NULL,
|
|
12
|
+
simulated_at TEXT DEFAULT (datetime('now')),
|
|
13
|
+
validated_at TEXT
|
|
14
|
+
);
|
|
15
|
+
CREATE INDEX IF NOT EXISTS idx_simulations_accuracy ON simulations(accuracy);
|
|
16
|
+
`);
|
|
17
|
+
}
|
|
18
|
+
// ── SimulationEngine ───────────────────────────────────
|
|
19
|
+
export class SimulationEngine {
|
|
20
|
+
db;
|
|
21
|
+
thoughtStream = null;
|
|
22
|
+
predictionEngine = null;
|
|
23
|
+
causalGraph = null;
|
|
24
|
+
metaCognition = null;
|
|
25
|
+
log = getLogger();
|
|
26
|
+
constructor(db) {
|
|
27
|
+
this.db = db;
|
|
28
|
+
runSimulationMigration(db);
|
|
29
|
+
}
|
|
30
|
+
setThoughtStream(stream) {
|
|
31
|
+
this.thoughtStream = stream;
|
|
32
|
+
}
|
|
33
|
+
setPredictionEngine(engine) {
|
|
34
|
+
this.predictionEngine = engine;
|
|
35
|
+
}
|
|
36
|
+
setCausalGraph(graph) {
|
|
37
|
+
this.causalGraph = graph;
|
|
38
|
+
}
|
|
39
|
+
setMetaCognitionLayer(layer) {
|
|
40
|
+
this.metaCognition = layer;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Simulate a scenario: parse key metrics, find downstream causal effects,
|
|
44
|
+
* predict directions and magnitudes, persist and return.
|
|
45
|
+
*/
|
|
46
|
+
simulate(scenario) {
|
|
47
|
+
const parsed = this.parseScenario(scenario);
|
|
48
|
+
const predictedOutcomes = [];
|
|
49
|
+
// Gather baseline from PredictionEngine if available
|
|
50
|
+
const baselineMetrics = {};
|
|
51
|
+
if (this.predictionEngine) {
|
|
52
|
+
try {
|
|
53
|
+
const summary = this.predictionEngine.getSummary();
|
|
54
|
+
if (summary.recent) {
|
|
55
|
+
for (const pred of summary.recent) {
|
|
56
|
+
baselineMetrics[pred.metric] = pred.predicted_value;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// No baseline available
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// For each parsed scenario component, find downstream causal effects
|
|
65
|
+
for (const { metric, multiplier } of parsed) {
|
|
66
|
+
if (this.causalGraph) {
|
|
67
|
+
const effects = this.causalGraph.getEffects(metric);
|
|
68
|
+
for (const edge of effects) {
|
|
69
|
+
// Predict direction based on edge direction and multiplier
|
|
70
|
+
const effectiveDirection = edge.direction * (multiplier >= 1 ? 1 : -1);
|
|
71
|
+
const direction = effectiveDirection > 0 ? 'increase' : effectiveDirection < 0 ? 'decrease' : 'stable';
|
|
72
|
+
// Predict magnitude based on multiplier and edge strength
|
|
73
|
+
const baseline = baselineMetrics[edge.effect] ?? 1;
|
|
74
|
+
const delta = (multiplier - 1) * edge.strength;
|
|
75
|
+
const predicted = baseline * (1 + delta * edge.direction);
|
|
76
|
+
// Confidence is based on edge strength, confidence, and sample size
|
|
77
|
+
const sampleFactor = Math.min(1, edge.sample_size / 20);
|
|
78
|
+
const confidence = edge.strength * edge.confidence * sampleFactor;
|
|
79
|
+
predictedOutcomes.push({
|
|
80
|
+
metric: edge.effect,
|
|
81
|
+
predicted: Math.round(predicted * 1000) / 1000,
|
|
82
|
+
direction,
|
|
83
|
+
confidence: Math.round(confidence * 1000) / 1000,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Also add the direct metric itself
|
|
88
|
+
const baseline = baselineMetrics[metric] ?? 1;
|
|
89
|
+
const predicted = baseline * multiplier;
|
|
90
|
+
predictedOutcomes.push({
|
|
91
|
+
metric,
|
|
92
|
+
predicted: Math.round(predicted * 1000) / 1000,
|
|
93
|
+
direction: multiplier > 1 ? 'increase' : multiplier < 1 ? 'decrease' : 'stable',
|
|
94
|
+
confidence: 0.8, // Direct metric — high confidence
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
// If no causal graph and no parsed metrics, generate a generic outcome
|
|
98
|
+
if (predictedOutcomes.length === 0) {
|
|
99
|
+
predictedOutcomes.push({
|
|
100
|
+
metric: 'unknown',
|
|
101
|
+
predicted: 0,
|
|
102
|
+
direction: 'stable',
|
|
103
|
+
confidence: 0.1,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
const parameters = {
|
|
107
|
+
parsedMetrics: parsed,
|
|
108
|
+
baselineAvailable: Object.keys(baselineMetrics).length > 0,
|
|
109
|
+
causalEdgesUsed: predictedOutcomes.length - parsed.length,
|
|
110
|
+
};
|
|
111
|
+
// Persist
|
|
112
|
+
const result = this.db.prepare(`
|
|
113
|
+
INSERT INTO simulations (scenario, parameters, predicted_outcomes)
|
|
114
|
+
VALUES (?, ?, ?)
|
|
115
|
+
`).run(scenario, JSON.stringify(parameters), JSON.stringify(predictedOutcomes));
|
|
116
|
+
const simulation = {
|
|
117
|
+
id: result.lastInsertRowid,
|
|
118
|
+
scenario,
|
|
119
|
+
parameters,
|
|
120
|
+
predictedOutcomes,
|
|
121
|
+
actualOutcomes: null,
|
|
122
|
+
accuracy: null,
|
|
123
|
+
simulatedAt: new Date().toISOString(),
|
|
124
|
+
validatedAt: null,
|
|
125
|
+
};
|
|
126
|
+
this.log.info(`[simulation] Simulated "${scenario}": ${predictedOutcomes.length} predicted outcomes`);
|
|
127
|
+
this.thoughtStream?.emit('simulation-engine', 'analyzing', `Simulated scenario: "${scenario}" → ${predictedOutcomes.length} outcomes predicted`, predictedOutcomes.length >= 3 ? 'notable' : 'routine', { simulationId: simulation.id, outcomes: predictedOutcomes.length });
|
|
128
|
+
return simulation;
|
|
129
|
+
}
|
|
130
|
+
/** Shortcut: simulate what happens when a metric changes by a multiplier. */
|
|
131
|
+
whatIf(metric, multiplier) {
|
|
132
|
+
const scenario = multiplier >= 1
|
|
133
|
+
? `${metric} increases by ${Math.round((multiplier - 1) * 100)}%`
|
|
134
|
+
: `${metric} decreases by ${Math.round((1 - multiplier) * 100)}%`;
|
|
135
|
+
return this.simulate(scenario);
|
|
136
|
+
}
|
|
137
|
+
/** Validate a simulation against actual outcomes. */
|
|
138
|
+
validateSimulation(id, actualOutcomes) {
|
|
139
|
+
const row = this.db.prepare('SELECT * FROM simulations WHERE id = ?').get(id);
|
|
140
|
+
if (!row)
|
|
141
|
+
return null;
|
|
142
|
+
const sim = this.toSimulation(row);
|
|
143
|
+
const predicted = sim.predictedOutcomes;
|
|
144
|
+
// Compute accuracy: matching directions / total predicted
|
|
145
|
+
let matches = 0;
|
|
146
|
+
let compared = 0;
|
|
147
|
+
for (const pred of predicted) {
|
|
148
|
+
const actual = actualOutcomes.find(a => a.metric === pred.metric);
|
|
149
|
+
if (actual) {
|
|
150
|
+
compared++;
|
|
151
|
+
if (actual.direction === pred.direction) {
|
|
152
|
+
matches++;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
const accuracy = compared > 0 ? matches / compared : 0;
|
|
157
|
+
this.db.prepare(`
|
|
158
|
+
UPDATE simulations SET actual_outcomes = ?, accuracy = ?, validated_at = datetime('now')
|
|
159
|
+
WHERE id = ?
|
|
160
|
+
`).run(JSON.stringify(actualOutcomes), accuracy, id);
|
|
161
|
+
this.log.info(`[simulation] Validated #${id}: accuracy=${(accuracy * 100).toFixed(1)}% (${matches}/${compared} correct)`);
|
|
162
|
+
this.thoughtStream?.emit('simulation-engine', 'analyzing', `Simulation #${id} validated: ${(accuracy * 100).toFixed(1)}% accuracy`, accuracy >= 0.7 ? 'notable' : 'routine', { simulationId: id, accuracy, matches, compared });
|
|
163
|
+
return {
|
|
164
|
+
...sim,
|
|
165
|
+
actualOutcomes,
|
|
166
|
+
accuracy,
|
|
167
|
+
validatedAt: new Date().toISOString(),
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/** List recent simulations. */
|
|
171
|
+
listSimulations(limit = 20) {
|
|
172
|
+
const rows = this.db.prepare('SELECT * FROM simulations ORDER BY id DESC LIMIT ?').all(limit);
|
|
173
|
+
return rows.map(r => this.toSimulation(r));
|
|
174
|
+
}
|
|
175
|
+
/** Get overall accuracy metrics. */
|
|
176
|
+
getAccuracy() {
|
|
177
|
+
const total = this.db.prepare('SELECT COUNT(*) as c FROM simulations').get().c;
|
|
178
|
+
const validated = this.db.prepare('SELECT COUNT(*) as c, AVG(accuracy) as avg FROM simulations WHERE accuracy IS NOT NULL').get();
|
|
179
|
+
return {
|
|
180
|
+
avgAccuracy: validated.avg ?? 0,
|
|
181
|
+
validatedCount: validated.c,
|
|
182
|
+
totalSimulations: total,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
/** Get status summary. */
|
|
186
|
+
getStatus() {
|
|
187
|
+
const accuracy = this.getAccuracy();
|
|
188
|
+
const recent = this.listSimulations(10);
|
|
189
|
+
return {
|
|
190
|
+
totalSimulations: accuracy.totalSimulations,
|
|
191
|
+
validatedCount: accuracy.validatedCount,
|
|
192
|
+
avgAccuracy: accuracy.avgAccuracy,
|
|
193
|
+
recentSimulations: recent,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
// ── Private ──────────────────────────────────────────────
|
|
197
|
+
toSimulation(row) {
|
|
198
|
+
return {
|
|
199
|
+
id: row.id,
|
|
200
|
+
scenario: row.scenario,
|
|
201
|
+
parameters: JSON.parse(row.parameters || '{}'),
|
|
202
|
+
predictedOutcomes: JSON.parse(row.predicted_outcomes || '[]'),
|
|
203
|
+
actualOutcomes: row.actual_outcomes ? JSON.parse(row.actual_outcomes) : null,
|
|
204
|
+
accuracy: row.accuracy,
|
|
205
|
+
simulatedAt: row.simulated_at,
|
|
206
|
+
validatedAt: row.validated_at ?? null,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Parse a scenario string into metric+multiplier pairs.
|
|
211
|
+
* Supports patterns like:
|
|
212
|
+
* "error_rate doubles" → { metric: 'error_rate', multiplier: 2 }
|
|
213
|
+
* "error_rate triples" → { metric: 'error_rate', multiplier: 3 }
|
|
214
|
+
* "error_rate halves" → { metric: 'error_rate', multiplier: 0.5 }
|
|
215
|
+
* "error_rate increases by 50%" → { metric: 'error_rate', multiplier: 1.5 }
|
|
216
|
+
* "error_rate decreases by 30%" → { metric: 'error_rate', multiplier: 0.7 }
|
|
217
|
+
*/
|
|
218
|
+
parseScenario(scenario) {
|
|
219
|
+
const results = [];
|
|
220
|
+
const lower = scenario.toLowerCase();
|
|
221
|
+
// Pattern: "X doubles/triples/halves"
|
|
222
|
+
const simpleMatch = lower.match(/(\w[\w._-]*)\s+(doubles?|triples?|halves?)/g);
|
|
223
|
+
if (simpleMatch) {
|
|
224
|
+
for (const m of simpleMatch) {
|
|
225
|
+
const parts = m.match(/(\w[\w._-]*)\s+(doubles?|triples?|halves?)/);
|
|
226
|
+
if (parts) {
|
|
227
|
+
const metric = parts[1];
|
|
228
|
+
const verb = parts[2];
|
|
229
|
+
let multiplier = 1;
|
|
230
|
+
if (verb.startsWith('double'))
|
|
231
|
+
multiplier = 2;
|
|
232
|
+
else if (verb.startsWith('triple'))
|
|
233
|
+
multiplier = 3;
|
|
234
|
+
else if (verb.startsWith('halv'))
|
|
235
|
+
multiplier = 0.5;
|
|
236
|
+
results.push({ metric, multiplier });
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// Pattern: "X increases/decreases by N%"
|
|
241
|
+
const pctMatch = lower.match(/(\w[\w._-]*)\s+(increases?|decreases?)\s+by\s+(\d+)%/g);
|
|
242
|
+
if (pctMatch) {
|
|
243
|
+
for (const m of pctMatch) {
|
|
244
|
+
const parts = m.match(/(\w[\w._-]*)\s+(increases?|decreases?)\s+by\s+(\d+)%/);
|
|
245
|
+
if (parts) {
|
|
246
|
+
const metric = parts[1];
|
|
247
|
+
const dir = parts[2];
|
|
248
|
+
const pct = parseInt(parts[3], 10);
|
|
249
|
+
const multiplier = dir.startsWith('increase')
|
|
250
|
+
? 1 + pct / 100
|
|
251
|
+
: 1 - pct / 100;
|
|
252
|
+
results.push({ metric, multiplier });
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
// Fallback: treat entire scenario as a single metric with no change
|
|
257
|
+
if (results.length === 0) {
|
|
258
|
+
// Try to extract any word-like metric name
|
|
259
|
+
const words = scenario.replace(/[^a-zA-Z0-9_.-]/g, ' ').split(/\s+/).filter(w => w.length > 2);
|
|
260
|
+
if (words.length > 0) {
|
|
261
|
+
results.push({ metric: words[0], multiplier: 1.5 }); // Default: assume 50% increase
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return results;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=simulation-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simulation-engine.js","sourceRoot":"","sources":["../../src/metacognition/simulation-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { ThoughtStream } from '../consciousness/thought-stream.js';
|
|
3
|
+
import type { KnowledgeDistiller } from '../research/knowledge-distiller.js';
|
|
4
|
+
import type { HypothesisEngine } from '../hypothesis/engine.js';
|
|
5
|
+
import type { ResearchJournal } from '../research/journal.js';
|
|
6
|
+
export interface TeachingPackage {
|
|
7
|
+
id?: number;
|
|
8
|
+
targetBrain: string;
|
|
9
|
+
principles: Array<{
|
|
10
|
+
statement: string;
|
|
11
|
+
confidence: number;
|
|
12
|
+
}>;
|
|
13
|
+
antiPatterns: Array<{
|
|
14
|
+
statement: string;
|
|
15
|
+
confidence: number;
|
|
16
|
+
}>;
|
|
17
|
+
strategies: Array<{
|
|
18
|
+
id: string;
|
|
19
|
+
description: string;
|
|
20
|
+
}>;
|
|
21
|
+
experiments: Array<{
|
|
22
|
+
name: string;
|
|
23
|
+
hypothesis: string;
|
|
24
|
+
conclusion: string;
|
|
25
|
+
}>;
|
|
26
|
+
journalInsights: string[];
|
|
27
|
+
principlesCount: number;
|
|
28
|
+
antipatternsCount: number;
|
|
29
|
+
strategiesCount: number;
|
|
30
|
+
experimentsCount: number;
|
|
31
|
+
createdAt: string;
|
|
32
|
+
effectivenessScore: number | null;
|
|
33
|
+
}
|
|
34
|
+
export interface TeachEngineStatus {
|
|
35
|
+
totalPackages: number;
|
|
36
|
+
avgEffectiveness: number;
|
|
37
|
+
recentPackages: TeachingPackage[];
|
|
38
|
+
}
|
|
39
|
+
export declare function runTeachEngineMigration(db: Database.Database): void;
|
|
40
|
+
export declare class TeachEngine {
|
|
41
|
+
private db;
|
|
42
|
+
private log;
|
|
43
|
+
private thoughtStream;
|
|
44
|
+
private distiller;
|
|
45
|
+
private hypothesisEngine;
|
|
46
|
+
private journal;
|
|
47
|
+
constructor(db: Database.Database);
|
|
48
|
+
setThoughtStream(stream: ThoughtStream): void;
|
|
49
|
+
setKnowledgeDistiller(distiller: KnowledgeDistiller): void;
|
|
50
|
+
setHypothesisEngine(engine: HypothesisEngine): void;
|
|
51
|
+
setJournal(journal: ResearchJournal): void;
|
|
52
|
+
/** Create a teaching package for another brain. */
|
|
53
|
+
createPackage(targetBrain: string): TeachingPackage;
|
|
54
|
+
/** Get a teaching package by id. */
|
|
55
|
+
getPackage(id: number): TeachingPackage | null;
|
|
56
|
+
/** List recent teaching packages. */
|
|
57
|
+
listPackages(limit?: number): TeachingPackage[];
|
|
58
|
+
/** Rate the effectiveness of a teaching package. */
|
|
59
|
+
rateEffectiveness(id: number, score: number): void;
|
|
60
|
+
/** Get status summary. */
|
|
61
|
+
getStatus(): TeachEngineStatus;
|
|
62
|
+
private toTeachingPackage;
|
|
63
|
+
}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { getLogger } from '../utils/logger.js';
|
|
2
|
+
// ── Migration ───────────────────────────────────────────
|
|
3
|
+
export function runTeachEngineMigration(db) {
|
|
4
|
+
db.exec(`
|
|
5
|
+
CREATE TABLE IF NOT EXISTS teaching_packages (
|
|
6
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
7
|
+
target_brain TEXT NOT NULL,
|
|
8
|
+
package_json TEXT NOT NULL DEFAULT '{}',
|
|
9
|
+
principles_count INTEGER NOT NULL DEFAULT 0,
|
|
10
|
+
antipatterns_count INTEGER NOT NULL DEFAULT 0,
|
|
11
|
+
strategies_count INTEGER NOT NULL DEFAULT 0,
|
|
12
|
+
experiments_count INTEGER NOT NULL DEFAULT 0,
|
|
13
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
14
|
+
effectiveness_score REAL DEFAULT NULL
|
|
15
|
+
);
|
|
16
|
+
CREATE INDEX IF NOT EXISTS idx_teaching_packages_target ON teaching_packages(target_brain);
|
|
17
|
+
`);
|
|
18
|
+
}
|
|
19
|
+
// ── Engine ──────────────────────────────────────────────
|
|
20
|
+
export class TeachEngine {
|
|
21
|
+
db;
|
|
22
|
+
log = getLogger();
|
|
23
|
+
thoughtStream = null;
|
|
24
|
+
distiller = null;
|
|
25
|
+
hypothesisEngine = null;
|
|
26
|
+
journal = null;
|
|
27
|
+
constructor(db) {
|
|
28
|
+
this.db = db;
|
|
29
|
+
runTeachEngineMigration(db);
|
|
30
|
+
}
|
|
31
|
+
setThoughtStream(stream) {
|
|
32
|
+
this.thoughtStream = stream;
|
|
33
|
+
}
|
|
34
|
+
setKnowledgeDistiller(distiller) {
|
|
35
|
+
this.distiller = distiller;
|
|
36
|
+
}
|
|
37
|
+
setHypothesisEngine(engine) {
|
|
38
|
+
this.hypothesisEngine = engine;
|
|
39
|
+
}
|
|
40
|
+
setJournal(journal) {
|
|
41
|
+
this.journal = journal;
|
|
42
|
+
}
|
|
43
|
+
/** Create a teaching package for another brain. */
|
|
44
|
+
createPackage(targetBrain) {
|
|
45
|
+
// 1. Top 20 Principles (by confidence) from KnowledgeDistiller
|
|
46
|
+
const principles = [];
|
|
47
|
+
if (this.distiller) {
|
|
48
|
+
const ps = this.distiller.getPrinciples(undefined, 20);
|
|
49
|
+
for (const p of ps) {
|
|
50
|
+
principles.push({ statement: p.statement, confidence: p.confidence });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// 2. Top 10 Anti-Patterns from KnowledgeDistiller
|
|
54
|
+
const antiPatterns = [];
|
|
55
|
+
if (this.distiller) {
|
|
56
|
+
const aps = this.distiller.getAntiPatterns(undefined, 10);
|
|
57
|
+
for (const ap of aps) {
|
|
58
|
+
antiPatterns.push({ statement: ap.statement, confidence: ap.confidence });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// 3. Top 5 Strategies from KnowledgeDistiller (query DB directly)
|
|
62
|
+
const strategies = [];
|
|
63
|
+
try {
|
|
64
|
+
const rows = this.db.prepare(`
|
|
65
|
+
SELECT id, description FROM knowledge_strategies
|
|
66
|
+
ORDER BY effectiveness DESC LIMIT 5
|
|
67
|
+
`).all();
|
|
68
|
+
for (const r of rows) {
|
|
69
|
+
strategies.push({ id: r.id, description: r.description });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch { /* knowledge_strategies table might not exist */ }
|
|
73
|
+
// 4. Top 5 experiment results from HypothesisEngine (confirmed with evidence)
|
|
74
|
+
const experiments = [];
|
|
75
|
+
if (this.hypothesisEngine) {
|
|
76
|
+
try {
|
|
77
|
+
const confirmed = this.hypothesisEngine.list('confirmed', 5);
|
|
78
|
+
for (const h of confirmed) {
|
|
79
|
+
experiments.push({
|
|
80
|
+
name: `Hypothesis #${h.id}`,
|
|
81
|
+
hypothesis: h.statement,
|
|
82
|
+
conclusion: `Confirmed with confidence ${h.confidence.toFixed(2)} (evidence: ${h.evidence_for} for, ${h.evidence_against} against)`,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch { /* hypotheses table might not exist */ }
|
|
87
|
+
}
|
|
88
|
+
// 5. Key Journal insights (search for 'breakthrough' significance entries, take top 5 titles)
|
|
89
|
+
const journalInsights = [];
|
|
90
|
+
if (this.journal) {
|
|
91
|
+
try {
|
|
92
|
+
const entries = this.journal.getEntries(undefined, 100);
|
|
93
|
+
const breakthroughs = entries.filter(e => e.significance === 'breakthrough' || e.significance === 'paradigm_shift');
|
|
94
|
+
for (const e of breakthroughs.slice(0, 5)) {
|
|
95
|
+
journalInsights.push(e.title);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch { /* journal table might not exist */ }
|
|
99
|
+
}
|
|
100
|
+
// 6. Package everything
|
|
101
|
+
const pkg = {
|
|
102
|
+
targetBrain,
|
|
103
|
+
principles,
|
|
104
|
+
antiPatterns,
|
|
105
|
+
strategies,
|
|
106
|
+
experiments,
|
|
107
|
+
journalInsights,
|
|
108
|
+
principlesCount: principles.length,
|
|
109
|
+
antipatternsCount: antiPatterns.length,
|
|
110
|
+
strategiesCount: strategies.length,
|
|
111
|
+
experimentsCount: experiments.length,
|
|
112
|
+
createdAt: new Date().toISOString(),
|
|
113
|
+
effectivenessScore: null,
|
|
114
|
+
};
|
|
115
|
+
const packageJson = JSON.stringify({
|
|
116
|
+
principles: pkg.principles,
|
|
117
|
+
antiPatterns: pkg.antiPatterns,
|
|
118
|
+
strategies: pkg.strategies,
|
|
119
|
+
experiments: pkg.experiments,
|
|
120
|
+
journalInsights: pkg.journalInsights,
|
|
121
|
+
});
|
|
122
|
+
const result = this.db.prepare(`
|
|
123
|
+
INSERT INTO teaching_packages (target_brain, package_json, principles_count, antipatterns_count, strategies_count, experiments_count)
|
|
124
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
125
|
+
`).run(targetBrain, packageJson, pkg.principlesCount, pkg.antipatternsCount, pkg.strategiesCount, pkg.experimentsCount);
|
|
126
|
+
pkg.id = result.lastInsertRowid;
|
|
127
|
+
// 7. Emit thought
|
|
128
|
+
this.thoughtStream?.emit('teach', 'reflecting', `Created teaching package for "${targetBrain}": ${principles.length} principles, ${antiPatterns.length} anti-patterns, ${strategies.length} strategies, ${experiments.length} experiments`, principles.length > 5 ? 'notable' : 'routine');
|
|
129
|
+
this.log.info(`[teach] Created package #${pkg.id} for ${targetBrain}: ${principles.length}P, ${antiPatterns.length}AP, ${strategies.length}S, ${experiments.length}E`);
|
|
130
|
+
return pkg;
|
|
131
|
+
}
|
|
132
|
+
/** Get a teaching package by id. */
|
|
133
|
+
getPackage(id) {
|
|
134
|
+
const row = this.db.prepare('SELECT * FROM teaching_packages WHERE id = ?').get(id);
|
|
135
|
+
if (!row)
|
|
136
|
+
return null;
|
|
137
|
+
return this.toTeachingPackage(row);
|
|
138
|
+
}
|
|
139
|
+
/** List recent teaching packages. */
|
|
140
|
+
listPackages(limit = 20) {
|
|
141
|
+
const rows = this.db.prepare(`
|
|
142
|
+
SELECT * FROM teaching_packages ORDER BY id DESC LIMIT ?
|
|
143
|
+
`).all(limit);
|
|
144
|
+
return rows.map(r => this.toTeachingPackage(r));
|
|
145
|
+
}
|
|
146
|
+
/** Rate the effectiveness of a teaching package. */
|
|
147
|
+
rateEffectiveness(id, score) {
|
|
148
|
+
const clamped = Math.max(0, Math.min(1, score));
|
|
149
|
+
this.db.prepare(`
|
|
150
|
+
UPDATE teaching_packages SET effectiveness_score = ? WHERE id = ?
|
|
151
|
+
`).run(clamped, id);
|
|
152
|
+
this.log.debug(`[teach] Rated package #${id} effectiveness: ${clamped.toFixed(2)}`);
|
|
153
|
+
}
|
|
154
|
+
/** Get status summary. */
|
|
155
|
+
getStatus() {
|
|
156
|
+
const total = this.db.prepare('SELECT COUNT(*) as c FROM teaching_packages').get().c;
|
|
157
|
+
const avgRow = this.db.prepare('SELECT AVG(effectiveness_score) as avg FROM teaching_packages WHERE effectiveness_score IS NOT NULL').get();
|
|
158
|
+
const recentPackages = this.listPackages(5);
|
|
159
|
+
return {
|
|
160
|
+
totalPackages: total,
|
|
161
|
+
avgEffectiveness: avgRow.avg ?? 0,
|
|
162
|
+
recentPackages,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
// ── Private ─────────────────────────────────────────────
|
|
166
|
+
toTeachingPackage(row) {
|
|
167
|
+
const packageData = JSON.parse(row.package_json || '{}');
|
|
168
|
+
return {
|
|
169
|
+
id: row.id,
|
|
170
|
+
targetBrain: row.target_brain,
|
|
171
|
+
principles: packageData.principles ?? [],
|
|
172
|
+
antiPatterns: packageData.antiPatterns ?? [],
|
|
173
|
+
strategies: packageData.strategies ?? [],
|
|
174
|
+
experiments: packageData.experiments ?? [],
|
|
175
|
+
journalInsights: packageData.journalInsights ?? [],
|
|
176
|
+
principlesCount: row.principles_count,
|
|
177
|
+
antipatternsCount: row.antipatterns_count,
|
|
178
|
+
strategiesCount: row.strategies_count,
|
|
179
|
+
experimentsCount: row.experiments_count,
|
|
180
|
+
createdAt: row.created_at,
|
|
181
|
+
effectivenessScore: row.effectiveness_score,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=teach-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"teach-engine.js","sourceRoot":"","sources":["../../src/metacognition/teach-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { ThoughtStream } from '../consciousness/thought-stream.js';
|
|
3
|
+
export interface ScoutDiscovery {
|
|
4
|
+
id?: number;
|
|
5
|
+
source: string;
|
|
6
|
+
title: string;
|
|
7
|
+
url: string;
|
|
8
|
+
description: string;
|
|
9
|
+
relevanceScore: number;
|
|
10
|
+
metadata: Record<string, unknown>;
|
|
11
|
+
discoveredAt: string;
|
|
12
|
+
imported: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface ScoutAdapter {
|
|
15
|
+
name: string;
|
|
16
|
+
scout(): Promise<ScoutDiscovery[]>;
|
|
17
|
+
isEnabled(): boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface DataScoutStatus {
|
|
20
|
+
totalDiscoveries: number;
|
|
21
|
+
importedCount: number;
|
|
22
|
+
bySource: Record<string, number>;
|
|
23
|
+
recentDiscoveries: ScoutDiscovery[];
|
|
24
|
+
}
|
|
25
|
+
export declare function runDataScoutMigration(db: Database.Database): void;
|
|
26
|
+
export declare class DataScout {
|
|
27
|
+
private db;
|
|
28
|
+
private adapters;
|
|
29
|
+
private thoughtStream;
|
|
30
|
+
private log;
|
|
31
|
+
constructor(db: Database.Database, adapters?: ScoutAdapter[]);
|
|
32
|
+
setThoughtStream(stream: ThoughtStream): void;
|
|
33
|
+
addAdapter(adapter: ScoutAdapter): void;
|
|
34
|
+
/** Run all enabled adapters, deduplicate, persist new discoveries. */
|
|
35
|
+
scout(): Promise<ScoutDiscovery[]>;
|
|
36
|
+
/** Get discoveries, optionally filtered by source. */
|
|
37
|
+
getDiscoveries(source?: string, limit?: number): ScoutDiscovery[];
|
|
38
|
+
/** Mark a discovery as imported. */
|
|
39
|
+
markImported(id: number): void;
|
|
40
|
+
/** Get status summary. */
|
|
41
|
+
getStatus(): DataScoutStatus;
|
|
42
|
+
private isDuplicate;
|
|
43
|
+
private toDiscovery;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* GitHubTrendingAdapter — Discovers trending GitHub repositories.
|
|
47
|
+
*/
|
|
48
|
+
export declare class GitHubTrendingAdapter implements ScoutAdapter {
|
|
49
|
+
readonly name = "github-trending";
|
|
50
|
+
isEnabled(): boolean;
|
|
51
|
+
scout(): Promise<ScoutDiscovery[]>;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* NpmStatsAdapter — Discovers trending npm packages.
|
|
55
|
+
*/
|
|
56
|
+
export declare class NpmStatsAdapter implements ScoutAdapter {
|
|
57
|
+
readonly name = "npm-stats";
|
|
58
|
+
isEnabled(): boolean;
|
|
59
|
+
scout(): Promise<ScoutDiscovery[]>;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* HackerNewsAdapter — Discovers top Hacker News stories.
|
|
63
|
+
*/
|
|
64
|
+
export declare class HackerNewsAdapter implements ScoutAdapter {
|
|
65
|
+
readonly name = "hackernews";
|
|
66
|
+
isEnabled(): boolean;
|
|
67
|
+
scout(): Promise<ScoutDiscovery[]>;
|
|
68
|
+
}
|