@timmeck/brain-core 2.25.1 → 2.27.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.
Files changed (62) hide show
  1. package/dist/causal/engine.d.ts +47 -0
  2. package/dist/causal/engine.js +142 -0
  3. package/dist/causal/engine.js.map +1 -1
  4. package/dist/codegen/code-generator.d.ts +17 -0
  5. package/dist/codegen/code-generator.js +61 -0
  6. package/dist/codegen/code-generator.js.map +1 -1
  7. package/dist/codegen/index.d.ts +1 -0
  8. package/dist/codegen/index.js.map +1 -1
  9. package/dist/curiosity/curiosity-engine.d.ts +29 -0
  10. package/dist/curiosity/curiosity-engine.js +147 -0
  11. package/dist/curiosity/curiosity-engine.js.map +1 -1
  12. package/dist/curiosity/index.d.ts +1 -1
  13. package/dist/debate/debate-engine.d.ts +27 -0
  14. package/dist/debate/debate-engine.js +169 -0
  15. package/dist/debate/debate-engine.js.map +1 -1
  16. package/dist/debate/index.d.ts +1 -1
  17. package/dist/dream/dream-engine.d.ts +16 -1
  18. package/dist/dream/dream-engine.js +190 -0
  19. package/dist/dream/dream-engine.js.map +1 -1
  20. package/dist/dream/index.d.ts +1 -1
  21. package/dist/dream/types.d.ts +18 -0
  22. package/dist/emergence/emergence-engine.d.ts +19 -0
  23. package/dist/emergence/emergence-engine.js +118 -0
  24. package/dist/emergence/emergence-engine.js.map +1 -1
  25. package/dist/hypothesis/engine.d.ts +38 -0
  26. package/dist/hypothesis/engine.js +167 -0
  27. package/dist/hypothesis/engine.js.map +1 -1
  28. package/dist/index.d.ts +20 -5
  29. package/dist/index.js +9 -0
  30. package/dist/index.js.map +1 -1
  31. package/dist/metacognition/auto-experiment-engine.d.ts +72 -0
  32. package/dist/metacognition/auto-experiment-engine.js +272 -0
  33. package/dist/metacognition/auto-experiment-engine.js.map +1 -0
  34. package/dist/metacognition/index.d.ts +12 -0
  35. package/dist/metacognition/index.js +7 -0
  36. package/dist/metacognition/index.js.map +1 -0
  37. package/dist/metacognition/meta-cognition-layer.d.ts +112 -0
  38. package/dist/metacognition/meta-cognition-layer.js +402 -0
  39. package/dist/metacognition/meta-cognition-layer.js.map +1 -0
  40. package/dist/metacognition/parameter-registry.d.ts +71 -0
  41. package/dist/metacognition/parameter-registry.js +162 -0
  42. package/dist/metacognition/parameter-registry.js.map +1 -0
  43. package/dist/metacognition/self-test-engine.d.ts +52 -0
  44. package/dist/metacognition/self-test-engine.js +210 -0
  45. package/dist/metacognition/self-test-engine.js.map +1 -0
  46. package/dist/metacognition/simulation-engine.d.ts +71 -0
  47. package/dist/metacognition/simulation-engine.js +267 -0
  48. package/dist/metacognition/simulation-engine.js.map +1 -0
  49. package/dist/metacognition/teach-engine.d.ts +63 -0
  50. package/dist/metacognition/teach-engine.js +185 -0
  51. package/dist/metacognition/teach-engine.js.map +1 -0
  52. package/dist/research/data-scout.d.ts +68 -0
  53. package/dist/research/data-scout.js +254 -0
  54. package/dist/research/data-scout.js.map +1 -0
  55. package/dist/research/research-orchestrator.d.ts +32 -1
  56. package/dist/research/research-orchestrator.js +344 -4
  57. package/dist/research/research-orchestrator.js.map +1 -1
  58. package/dist/transfer/index.d.ts +1 -1
  59. package/dist/transfer/transfer-engine.d.ts +38 -0
  60. package/dist/transfer/transfer-engine.js +138 -0
  61. package/dist/transfer/transfer-engine.js.map +1 -1
  62. package/package.json +1 -1
@@ -0,0 +1,402 @@
1
+ import { getLogger } from '../utils/logger.js';
2
+ // ── Migration ───────────────────────────────────────────
3
+ export function runMetaCognitionMigration(db) {
4
+ db.exec(`
5
+ CREATE TABLE IF NOT EXISTS engine_metrics (
6
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
7
+ engine TEXT NOT NULL,
8
+ cycle INTEGER NOT NULL,
9
+ insights INTEGER NOT NULL DEFAULT 0,
10
+ journal_entries INTEGER NOT NULL DEFAULT 0,
11
+ anomalies INTEGER NOT NULL DEFAULT 0,
12
+ predictions INTEGER NOT NULL DEFAULT 0,
13
+ thoughts INTEGER NOT NULL DEFAULT 0,
14
+ errors INTEGER NOT NULL DEFAULT 0,
15
+ duration_ms INTEGER NOT NULL DEFAULT 0,
16
+ created_at TEXT DEFAULT (datetime('now'))
17
+ );
18
+ CREATE INDEX IF NOT EXISTS idx_engine_metrics_engine ON engine_metrics(engine, cycle);
19
+
20
+ CREATE TABLE IF NOT EXISTS engine_report_cards (
21
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
22
+ engine TEXT NOT NULL,
23
+ grade TEXT NOT NULL,
24
+ health_score REAL NOT NULL,
25
+ value_score REAL NOT NULL,
26
+ signal_to_noise REAL NOT NULL,
27
+ combined_score REAL NOT NULL,
28
+ evaluated_at TEXT DEFAULT (datetime('now'))
29
+ );
30
+ CREATE INDEX IF NOT EXISTS idx_report_cards_engine ON engine_report_cards(engine);
31
+
32
+ CREATE TABLE IF NOT EXISTS cycle_frequency_adjustments (
33
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
34
+ engine TEXT NOT NULL,
35
+ old_frequency INTEGER NOT NULL,
36
+ new_frequency INTEGER NOT NULL,
37
+ reason TEXT NOT NULL,
38
+ created_at TEXT DEFAULT (datetime('now'))
39
+ );
40
+
41
+ CREATE TABLE IF NOT EXISTS meta_trends (
42
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
43
+ cycle INTEGER NOT NULL,
44
+ learning_rate REAL NOT NULL DEFAULT 0,
45
+ discovery_rate REAL NOT NULL DEFAULT 0,
46
+ knowledge_quality REAL NOT NULL DEFAULT 0,
47
+ gap_closure_rate REAL NOT NULL DEFAULT 0,
48
+ total_principles INTEGER NOT NULL DEFAULT 0,
49
+ total_hypotheses INTEGER NOT NULL DEFAULT 0,
50
+ prediction_accuracy REAL NOT NULL DEFAULT 0,
51
+ emergence_count INTEGER NOT NULL DEFAULT 0,
52
+ timestamp TEXT DEFAULT (datetime('now'))
53
+ );
54
+ CREATE INDEX IF NOT EXISTS idx_meta_trends_cycle ON meta_trends(cycle);
55
+ `);
56
+ }
57
+ // ── MetaCognition Layer ─────────────────────────────────
58
+ export class MetaCognitionLayer {
59
+ db;
60
+ log = getLogger();
61
+ /** Current frequency multiplier per engine: 1 = every cycle, 2 = every 2 cycles, etc. */
62
+ engineFrequencies = new Map();
63
+ constructor(db) {
64
+ this.db = db;
65
+ runMetaCognitionMigration(db);
66
+ }
67
+ /** Record metrics for a single engine step in a cycle. */
68
+ recordStep(engine, cycle, metrics) {
69
+ // Upsert: if we already recorded this engine+cycle, add to it
70
+ const existing = this.db.prepare('SELECT id, insights, journal_entries, anomalies, predictions, thoughts, errors, duration_ms FROM engine_metrics WHERE engine = ? AND cycle = ?').get(engine, cycle);
71
+ if (existing) {
72
+ this.db.prepare(`
73
+ UPDATE engine_metrics SET
74
+ insights = insights + ?, journal_entries = journal_entries + ?, anomalies = anomalies + ?,
75
+ predictions = predictions + ?, thoughts = thoughts + ?, errors = errors + ?,
76
+ duration_ms = duration_ms + ?
77
+ WHERE id = ?
78
+ `).run(metrics.insights ?? 0, metrics.journal_entries ?? 0, metrics.anomalies ?? 0, metrics.predictions ?? 0, metrics.thoughts ?? 0, metrics.errors ?? 0, metrics.duration_ms ?? 0, existing.id);
79
+ }
80
+ else {
81
+ this.db.prepare(`
82
+ INSERT INTO engine_metrics (engine, cycle, insights, journal_entries, anomalies, predictions, thoughts, errors, duration_ms)
83
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
84
+ `).run(engine, cycle, metrics.insights ?? 0, metrics.journal_entries ?? 0, metrics.anomalies ?? 0, metrics.predictions ?? 0, metrics.thoughts ?? 0, metrics.errors ?? 0, metrics.duration_ms ?? 0);
85
+ }
86
+ }
87
+ /** Evaluate all engines based on recent metrics. Returns report cards. */
88
+ evaluate(windowCycles = 10) {
89
+ // Get all engines that have metrics in the last windowCycles
90
+ const engines = this.db.prepare(`
91
+ SELECT DISTINCT engine FROM engine_metrics
92
+ WHERE cycle > (SELECT COALESCE(MAX(cycle), 0) FROM engine_metrics) - ?
93
+ `).all(windowCycles);
94
+ const cards = [];
95
+ for (const { engine } of engines) {
96
+ const metrics = this.db.prepare(`
97
+ SELECT insights, journal_entries, anomalies, predictions, thoughts, errors, duration_ms
98
+ FROM engine_metrics WHERE engine = ?
99
+ ORDER BY cycle DESC LIMIT ?
100
+ `).all(engine, windowCycles);
101
+ if (metrics.length === 0)
102
+ continue;
103
+ // Health Score: low errors, reasonable duration
104
+ const avgErrors = metrics.reduce((s, m) => s + m.errors, 0) / metrics.length;
105
+ const avgDuration = metrics.reduce((s, m) => s + m.duration_ms, 0) / metrics.length;
106
+ const healthScore = Math.max(0, Math.min(1, (1 - Math.min(avgErrors / 3, 1)) * 0.6 + // fewer errors = healthier
107
+ (1 - Math.min(avgDuration / 5000, 1)) * 0.4));
108
+ // Value Score: producing useful outputs (insights, journal entries, predictions)
109
+ const avgInsights = metrics.reduce((s, m) => s + m.insights, 0) / metrics.length;
110
+ const avgJournal = metrics.reduce((s, m) => s + m.journal_entries, 0) / metrics.length;
111
+ const avgPredictions = metrics.reduce((s, m) => s + m.predictions, 0) / metrics.length;
112
+ const valueScore = Math.min(1, (avgInsights * 0.4 + avgJournal * 0.3 + avgPredictions * 0.3));
113
+ // Signal-to-Noise: useful outputs / total thoughts
114
+ const avgThoughts = metrics.reduce((s, m) => s + m.thoughts, 0) / metrics.length;
115
+ const signalToNoise = avgThoughts > 0
116
+ ? Math.min(1, (avgInsights + avgJournal + avgPredictions) / avgThoughts)
117
+ : 0;
118
+ // Combined Score
119
+ const combinedScore = healthScore * 0.3 + valueScore * 0.5 + signalToNoise * 0.2;
120
+ // Grade
121
+ const grade = this.scoreToGrade(combinedScore);
122
+ const card = {
123
+ engine, grade, health_score: healthScore, value_score: valueScore,
124
+ signal_to_noise: signalToNoise, combined_score: combinedScore,
125
+ };
126
+ cards.push(card);
127
+ // Persist
128
+ this.db.prepare(`
129
+ INSERT INTO engine_report_cards (engine, grade, health_score, value_score, signal_to_noise, combined_score)
130
+ VALUES (?, ?, ?, ?, ?, ?)
131
+ `).run(engine, grade, healthScore, valueScore, signalToNoise, combinedScore);
132
+ }
133
+ return cards;
134
+ }
135
+ /** Adjust engine frequencies based on report cards. A=more often, D/F=less often. */
136
+ adjustFrequencies(cards) {
137
+ const adjustments = [];
138
+ for (const card of cards) {
139
+ const currentFreq = this.engineFrequencies.get(card.engine) ?? 1;
140
+ let newFreq = currentFreq;
141
+ if (card.grade === 'A' && currentFreq > 1) {
142
+ newFreq = currentFreq - 1; // Run more often
143
+ }
144
+ else if (card.grade === 'D' || card.grade === 'F') {
145
+ newFreq = Math.min(currentFreq + 1, 10); // Run less often, cap at 10
146
+ }
147
+ // B and C: keep current frequency
148
+ if (newFreq !== currentFreq) {
149
+ this.engineFrequencies.set(card.engine, newFreq);
150
+ const adjustment = {
151
+ engine: card.engine,
152
+ old_frequency: currentFreq,
153
+ new_frequency: newFreq,
154
+ reason: `Grade ${card.grade}: combined=${card.combined_score.toFixed(2)}`,
155
+ };
156
+ adjustments.push(adjustment);
157
+ this.db.prepare(`
158
+ INSERT INTO cycle_frequency_adjustments (engine, old_frequency, new_frequency, reason)
159
+ VALUES (?, ?, ?, ?)
160
+ `).run(card.engine, currentFreq, newFreq, adjustment.reason);
161
+ this.log.info(`[metacognition] ${card.engine}: freq ${currentFreq} → ${newFreq} (grade ${card.grade})`);
162
+ }
163
+ }
164
+ return adjustments;
165
+ }
166
+ /** Check if an engine should run this cycle based on its frequency. */
167
+ shouldRun(engine, cycle) {
168
+ const freq = this.engineFrequencies.get(engine) ?? 1;
169
+ return cycle % freq === 0;
170
+ }
171
+ /** Get engine frequency. */
172
+ getFrequency(engine) {
173
+ return this.engineFrequencies.get(engine) ?? 1;
174
+ }
175
+ /** Get report card for a specific engine. */
176
+ getReportCard(engine) {
177
+ const row = this.db.prepare(`
178
+ SELECT engine, grade, health_score, value_score, signal_to_noise, combined_score, evaluated_at
179
+ FROM engine_report_cards WHERE engine = ? ORDER BY id DESC LIMIT 1
180
+ `).get(engine);
181
+ return row;
182
+ }
183
+ /** Get all latest report cards. */
184
+ getLatestReportCards() {
185
+ return this.db.prepare(`
186
+ SELECT r.engine, r.grade, r.health_score, r.value_score, r.signal_to_noise, r.combined_score, r.evaluated_at
187
+ FROM engine_report_cards r
188
+ INNER JOIN (SELECT engine, MAX(id) as max_id FROM engine_report_cards GROUP BY engine) latest
189
+ ON r.id = latest.max_id
190
+ ORDER BY r.combined_score DESC
191
+ `).all();
192
+ }
193
+ /** Get trend for an engine over time. */
194
+ getTrend(engine, limit = 10) {
195
+ return this.db.prepare(`
196
+ SELECT engine, grade, health_score, value_score, signal_to_noise, combined_score, evaluated_at
197
+ FROM engine_report_cards WHERE engine = ? ORDER BY id DESC LIMIT ?
198
+ `).all(engine, limit);
199
+ }
200
+ // ── Meta-Trends ────────────────────────────────────────
201
+ /** Record a trend data point for the current cycle. */
202
+ recordTrend(cycle, stats) {
203
+ const learningRate = cycle > 0 ? stats.newPrinciples / cycle : 0;
204
+ const discoveryRate = cycle > 0 ? stats.newHypotheses / cycle : 0;
205
+ const knowledgeQuality = stats.totalPrinciples > 0
206
+ ? Math.min(1, stats.predictionAccuracy * 0.5 + (stats.totalPrinciples / Math.max(stats.totalHypotheses, 1)) * 0.5)
207
+ : 0;
208
+ const gapClosureRate = cycle > 0 ? stats.closedGaps / cycle : 0;
209
+ this.db.prepare(`
210
+ INSERT INTO meta_trends (cycle, learning_rate, discovery_rate, knowledge_quality, gap_closure_rate,
211
+ total_principles, total_hypotheses, prediction_accuracy, emergence_count)
212
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
213
+ `).run(cycle, learningRate, discoveryRate, knowledgeQuality, gapClosureRate, stats.totalPrinciples, stats.totalHypotheses, stats.predictionAccuracy, stats.emergenceCount);
214
+ this.log.debug(`[metacognition] Recorded trend for cycle ${cycle}: lr=${learningRate.toFixed(4)}, dr=${discoveryRate.toFixed(4)}`);
215
+ }
216
+ /** Get trend data from the last N cycles. */
217
+ getMetaTrend(windowCycles = 20) {
218
+ const rows = this.db.prepare(`
219
+ SELECT cycle, learning_rate, discovery_rate, knowledge_quality, gap_closure_rate,
220
+ total_principles, total_hypotheses, prediction_accuracy, emergence_count, timestamp
221
+ FROM meta_trends ORDER BY cycle DESC LIMIT ?
222
+ `).all(windowCycles);
223
+ return rows.map(r => this.toMetaTrend(r)).reverse(); // Chronological order
224
+ }
225
+ /** Long-term analysis: aggregate over a time period and determine trend direction. */
226
+ getLongTermAnalysis(days = 7) {
227
+ const rows = this.db.prepare(`
228
+ SELECT learning_rate, discovery_rate, knowledge_quality, gap_closure_rate
229
+ FROM meta_trends
230
+ WHERE timestamp >= datetime('now', '-' || ? || ' days')
231
+ ORDER BY cycle ASC
232
+ `).all(days);
233
+ if (rows.length === 0) {
234
+ return {
235
+ days,
236
+ avgLearningRate: 0,
237
+ avgDiscoveryRate: 0,
238
+ avgKnowledgeQuality: 0,
239
+ avgGapClosureRate: 0,
240
+ trendDirection: 'stagnating',
241
+ peakLearningRate: 0,
242
+ peakDiscoveryRate: 0,
243
+ };
244
+ }
245
+ let sumLR = 0, sumDR = 0, sumKQ = 0, sumGCR = 0;
246
+ let peakLR = 0, peakDR = 0;
247
+ for (const r of rows) {
248
+ const lr = r.learning_rate;
249
+ const dr = r.discovery_rate;
250
+ const kq = r.knowledge_quality;
251
+ const gcr = r.gap_closure_rate;
252
+ sumLR += lr;
253
+ sumDR += dr;
254
+ sumKQ += kq;
255
+ sumGCR += gcr;
256
+ peakLR = Math.max(peakLR, lr);
257
+ peakDR = Math.max(peakDR, dr);
258
+ }
259
+ const n = rows.length;
260
+ const avgLR = sumLR / n;
261
+ const avgDR = sumDR / n;
262
+ const avgKQ = sumKQ / n;
263
+ const avgGCR = sumGCR / n;
264
+ // Determine direction by comparing first half vs second half
265
+ const mid = Math.floor(n / 2);
266
+ let trendDirection = 'stagnating';
267
+ if (mid > 0 && n - mid > 0) {
268
+ let firstHalfAvg = 0, secondHalfAvg = 0;
269
+ for (let i = 0; i < mid; i++) {
270
+ firstHalfAvg += rows[i].knowledge_quality;
271
+ }
272
+ firstHalfAvg /= mid;
273
+ for (let i = mid; i < n; i++) {
274
+ secondHalfAvg += rows[i].knowledge_quality;
275
+ }
276
+ secondHalfAvg /= (n - mid);
277
+ const diff = secondHalfAvg - firstHalfAvg;
278
+ if (diff > 0.05)
279
+ trendDirection = 'rising';
280
+ else if (diff < -0.05)
281
+ trendDirection = 'falling';
282
+ else
283
+ trendDirection = 'stagnating';
284
+ }
285
+ return {
286
+ days,
287
+ avgLearningRate: avgLR,
288
+ avgDiscoveryRate: avgDR,
289
+ avgKnowledgeQuality: avgKQ,
290
+ avgGapClosureRate: avgGCR,
291
+ trendDirection,
292
+ peakLearningRate: peakLR,
293
+ peakDiscoveryRate: peakDR,
294
+ };
295
+ }
296
+ /** Detect seasonal patterns: which hours/days produce the best metrics. */
297
+ detectSeasonalPatterns() {
298
+ const patterns = [];
299
+ const metrics = ['learning_rate', 'discovery_rate', 'knowledge_quality', 'gap_closure_rate'];
300
+ for (const metric of metrics) {
301
+ // Peak hour of day
302
+ const hourPeak = this.db.prepare(`
303
+ SELECT CAST(strftime('%H', timestamp) AS INTEGER) as hour, AVG(${metric}) as avg_val
304
+ FROM meta_trends
305
+ GROUP BY hour
306
+ ORDER BY avg_val DESC
307
+ LIMIT 1
308
+ `).get();
309
+ // Peak day of week (0=Sunday, 6=Saturday)
310
+ const dayPeak = this.db.prepare(`
311
+ SELECT CAST(strftime('%w', timestamp) AS INTEGER) as dow, AVG(${metric}) as avg_val
312
+ FROM meta_trends
313
+ GROUP BY dow
314
+ ORDER BY avg_val DESC
315
+ LIMIT 1
316
+ `).get();
317
+ if (hourPeak && dayPeak) {
318
+ patterns.push({
319
+ metric: metric.replace(/_/g, ' '),
320
+ peakHour: hourPeak.hour,
321
+ peakDayOfWeek: dayPeak.dow,
322
+ avgAtPeak: hourPeak.avg_val,
323
+ });
324
+ }
325
+ }
326
+ return patterns;
327
+ }
328
+ // ── Meta-Trend Helpers ─────────────────────────────────
329
+ toMetaTrend(row) {
330
+ return {
331
+ cycle: row.cycle,
332
+ learningRate: row.learning_rate,
333
+ discoveryRate: row.discovery_rate,
334
+ knowledgeQuality: row.knowledge_quality,
335
+ gapClosureRate: row.gap_closure_rate,
336
+ totalPrinciples: row.total_principles,
337
+ totalHypotheses: row.total_hypotheses,
338
+ predictionAccuracy: row.prediction_accuracy,
339
+ emergenceCount: row.emergence_count,
340
+ timestamp: row.timestamp,
341
+ };
342
+ }
343
+ getLatestTrend() {
344
+ const row = this.db.prepare(`
345
+ SELECT cycle, learning_rate, discovery_rate, knowledge_quality, gap_closure_rate,
346
+ total_principles, total_hypotheses, prediction_accuracy, emergence_count, timestamp
347
+ FROM meta_trends ORDER BY cycle DESC LIMIT 1
348
+ `).get();
349
+ return row ? this.toMetaTrend(row) : null;
350
+ }
351
+ getCurrentTrendDirection() {
352
+ const rows = this.db.prepare(`
353
+ SELECT knowledge_quality FROM meta_trends ORDER BY cycle DESC LIMIT 10
354
+ `).all();
355
+ if (rows.length < 4)
356
+ return 'stagnating';
357
+ const mid = Math.floor(rows.length / 2);
358
+ // rows are DESC, so first half = recent, second half = older
359
+ let recentAvg = 0, olderAvg = 0;
360
+ for (let i = 0; i < mid; i++)
361
+ recentAvg += rows[i].knowledge_quality;
362
+ recentAvg /= mid;
363
+ for (let i = mid; i < rows.length; i++)
364
+ olderAvg += rows[i].knowledge_quality;
365
+ olderAvg /= (rows.length - mid);
366
+ const diff = recentAvg - olderAvg;
367
+ if (diff > 0.05)
368
+ return 'rising';
369
+ if (diff < -0.05)
370
+ return 'falling';
371
+ return 'stagnating';
372
+ }
373
+ /** Get status summary. */
374
+ getStatus() {
375
+ const cards = this.getLatestReportCards();
376
+ const recentAdj = this.db.prepare(`
377
+ SELECT engine, old_frequency, new_frequency, reason, created_at
378
+ FROM cycle_frequency_adjustments ORDER BY id DESC LIMIT 10
379
+ `).all();
380
+ const totalMetrics = this.db.prepare('SELECT COUNT(*) as c FROM engine_metrics').get().c;
381
+ return {
382
+ totalEngines: cards.length,
383
+ reportCards: cards,
384
+ recentAdjustments: recentAdj,
385
+ cycleMetrics: totalMetrics,
386
+ latestTrend: this.getLatestTrend(),
387
+ trendDirection: this.getCurrentTrendDirection(),
388
+ };
389
+ }
390
+ scoreToGrade(score) {
391
+ if (score >= 0.8)
392
+ return 'A';
393
+ if (score >= 0.6)
394
+ return 'B';
395
+ if (score >= 0.4)
396
+ return 'C';
397
+ if (score >= 0.2)
398
+ return 'D';
399
+ return 'F';
400
+ }
401
+ }
402
+ //# sourceMappingURL=meta-cognition-layer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-cognition-layer.js","sourceRoot":"","sources":["../../src/metacognition/meta-cognition-layer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import type Database from 'better-sqlite3';
2
+ export interface ParameterDefinition {
3
+ engine: string;
4
+ name: string;
5
+ value: number;
6
+ min: number;
7
+ max: number;
8
+ description: string;
9
+ category?: string;
10
+ }
11
+ export interface ParameterChange {
12
+ id?: number;
13
+ engine: string;
14
+ name: string;
15
+ old_value: number;
16
+ new_value: number;
17
+ changed_by: string;
18
+ reason: string;
19
+ created_at?: string;
20
+ }
21
+ export interface ParameterSnapshot {
22
+ id?: number;
23
+ label: string;
24
+ data_json: string;
25
+ created_at?: string;
26
+ }
27
+ export interface RegisteredParameter {
28
+ engine: string;
29
+ name: string;
30
+ value: number;
31
+ min: number;
32
+ max: number;
33
+ description: string;
34
+ category: string;
35
+ }
36
+ export declare function runParameterRegistryMigration(db: Database.Database): void;
37
+ export declare class ParameterRegistry {
38
+ private db;
39
+ private log;
40
+ constructor(db: Database.Database);
41
+ /** Register a tunable parameter. Inserts if new, does NOT overwrite existing values. */
42
+ register(def: ParameterDefinition): void;
43
+ /** Register multiple parameters at once. */
44
+ registerAll(defs: ParameterDefinition[]): void;
45
+ /** Get current value. Returns undefined if not registered. */
46
+ get(engine: string, name: string): number | undefined;
47
+ /** Get full parameter definition. */
48
+ getDefinition(engine: string, name: string): RegisteredParameter | undefined;
49
+ /** Set a parameter value with bounds validation and change tracking. */
50
+ set(engine: string, name: string, value: number, changedBy: string, reason: string): boolean;
51
+ /** List all parameters, optionally filtered by engine. */
52
+ list(engine?: string): RegisteredParameter[];
53
+ /** Get change history for a parameter. */
54
+ getHistory(engine: string, name: string, limit?: number): ParameterChange[];
55
+ /** Get all recent changes across all parameters. */
56
+ getRecentChanges(limit?: number): ParameterChange[];
57
+ /** Create a snapshot of all current parameter values. */
58
+ snapshot(label: string): number;
59
+ /** Restore parameters from a snapshot. */
60
+ restore(snapshotId: number, changedBy?: string): number;
61
+ /** List all snapshots. */
62
+ listSnapshots(limit?: number): ParameterSnapshot[];
63
+ /** Get summary stats. */
64
+ getStatus(): {
65
+ totalParameters: number;
66
+ totalChanges: number;
67
+ totalSnapshots: number;
68
+ engines: string[];
69
+ recentChanges: ParameterChange[];
70
+ };
71
+ }
@@ -0,0 +1,162 @@
1
+ import { getLogger } from '../utils/logger.js';
2
+ // ── Migration ───────────────────────────────────────────
3
+ export function runParameterRegistryMigration(db) {
4
+ db.exec(`
5
+ CREATE TABLE IF NOT EXISTS parameter_registry (
6
+ engine TEXT NOT NULL,
7
+ name TEXT NOT NULL,
8
+ value REAL NOT NULL,
9
+ min_value REAL NOT NULL,
10
+ max_value REAL NOT NULL,
11
+ description TEXT NOT NULL DEFAULT '',
12
+ category TEXT NOT NULL DEFAULT 'general',
13
+ updated_at TEXT DEFAULT (datetime('now')),
14
+ PRIMARY KEY (engine, name)
15
+ );
16
+
17
+ CREATE TABLE IF NOT EXISTS parameter_changes (
18
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
19
+ engine TEXT NOT NULL,
20
+ name TEXT NOT NULL,
21
+ old_value REAL NOT NULL,
22
+ new_value REAL NOT NULL,
23
+ changed_by TEXT NOT NULL,
24
+ reason TEXT NOT NULL DEFAULT '',
25
+ created_at TEXT DEFAULT (datetime('now'))
26
+ );
27
+ CREATE INDEX IF NOT EXISTS idx_param_changes_engine ON parameter_changes(engine, name);
28
+
29
+ CREATE TABLE IF NOT EXISTS parameter_snapshots (
30
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
31
+ label TEXT NOT NULL,
32
+ data_json TEXT NOT NULL,
33
+ created_at TEXT DEFAULT (datetime('now'))
34
+ );
35
+ `);
36
+ }
37
+ // ── Registry ───────────────────────────────────────────
38
+ export class ParameterRegistry {
39
+ db;
40
+ log = getLogger();
41
+ constructor(db) {
42
+ this.db = db;
43
+ runParameterRegistryMigration(db);
44
+ }
45
+ /** Register a tunable parameter. Inserts if new, does NOT overwrite existing values. */
46
+ register(def) {
47
+ const existing = this.db.prepare('SELECT value FROM parameter_registry WHERE engine = ? AND name = ?').get(def.engine, def.name);
48
+ if (existing)
49
+ return; // Already registered — keep current value
50
+ this.db.prepare(`
51
+ INSERT INTO parameter_registry (engine, name, value, min_value, max_value, description, category)
52
+ VALUES (?, ?, ?, ?, ?, ?, ?)
53
+ `).run(def.engine, def.name, def.value, def.min, def.max, def.description, def.category ?? 'general');
54
+ }
55
+ /** Register multiple parameters at once. */
56
+ registerAll(defs) {
57
+ for (const def of defs)
58
+ this.register(def);
59
+ }
60
+ /** Get current value. Returns undefined if not registered. */
61
+ get(engine, name) {
62
+ const row = this.db.prepare('SELECT value FROM parameter_registry WHERE engine = ? AND name = ?').get(engine, name);
63
+ return row?.value;
64
+ }
65
+ /** Get full parameter definition. */
66
+ getDefinition(engine, name) {
67
+ const row = this.db.prepare('SELECT engine, name, value, min_value, max_value, description, category FROM parameter_registry WHERE engine = ? AND name = ?').get(engine, name);
68
+ if (!row)
69
+ return undefined;
70
+ return { engine: row.engine, name: row.name, value: row.value, min: row.min_value, max: row.max_value, description: row.description, category: row.category };
71
+ }
72
+ /** Set a parameter value with bounds validation and change tracking. */
73
+ set(engine, name, value, changedBy, reason) {
74
+ const current = this.db.prepare('SELECT value, min_value, max_value FROM parameter_registry WHERE engine = ? AND name = ?').get(engine, name);
75
+ if (!current) {
76
+ this.log.warn(`[parameter-registry] Parameter not found: ${engine}.${name}`);
77
+ return false;
78
+ }
79
+ // Clamp to bounds
80
+ const clamped = Math.max(current.min_value, Math.min(current.max_value, value));
81
+ if (clamped === current.value)
82
+ return false; // No change
83
+ // Record change
84
+ this.db.prepare(`
85
+ INSERT INTO parameter_changes (engine, name, old_value, new_value, changed_by, reason)
86
+ VALUES (?, ?, ?, ?, ?, ?)
87
+ `).run(engine, name, current.value, clamped, changedBy, reason);
88
+ // Update value
89
+ this.db.prepare(`
90
+ UPDATE parameter_registry SET value = ?, updated_at = datetime('now') WHERE engine = ? AND name = ?
91
+ `).run(clamped, engine, name);
92
+ this.log.info(`[parameter-registry] ${engine}.${name}: ${current.value} → ${clamped} (by ${changedBy}: ${reason})`);
93
+ return true;
94
+ }
95
+ /** List all parameters, optionally filtered by engine. */
96
+ list(engine) {
97
+ const query = engine
98
+ ? 'SELECT engine, name, value, min_value, max_value, description, category FROM parameter_registry WHERE engine = ? ORDER BY engine, name'
99
+ : 'SELECT engine, name, value, min_value, max_value, description, category FROM parameter_registry ORDER BY engine, name';
100
+ const rows = (engine ? this.db.prepare(query).all(engine) : this.db.prepare(query).all());
101
+ return rows.map(r => ({ engine: r.engine, name: r.name, value: r.value, min: r.min_value, max: r.max_value, description: r.description, category: r.category }));
102
+ }
103
+ /** Get change history for a parameter. */
104
+ getHistory(engine, name, limit = 20) {
105
+ return this.db.prepare(`
106
+ SELECT id, engine, name, old_value, new_value, changed_by, reason, created_at
107
+ FROM parameter_changes WHERE engine = ? AND name = ?
108
+ ORDER BY id DESC LIMIT ?
109
+ `).all(engine, name, limit);
110
+ }
111
+ /** Get all recent changes across all parameters. */
112
+ getRecentChanges(limit = 50) {
113
+ return this.db.prepare(`
114
+ SELECT id, engine, name, old_value, new_value, changed_by, reason, created_at
115
+ FROM parameter_changes ORDER BY id DESC LIMIT ?
116
+ `).all(limit);
117
+ }
118
+ /** Create a snapshot of all current parameter values. */
119
+ snapshot(label) {
120
+ const params = this.list();
121
+ const data = {};
122
+ for (const p of params) {
123
+ if (!data[p.engine])
124
+ data[p.engine] = {};
125
+ data[p.engine][p.name] = p.value;
126
+ }
127
+ const result = this.db.prepare(`
128
+ INSERT INTO parameter_snapshots (label, data_json) VALUES (?, ?)
129
+ `).run(label, JSON.stringify(data));
130
+ return result.lastInsertRowid;
131
+ }
132
+ /** Restore parameters from a snapshot. */
133
+ restore(snapshotId, changedBy = 'snapshot_restore') {
134
+ const row = this.db.prepare('SELECT data_json FROM parameter_snapshots WHERE id = ?').get(snapshotId);
135
+ if (!row)
136
+ return 0;
137
+ const data = JSON.parse(row.data_json);
138
+ let count = 0;
139
+ for (const [engine, params] of Object.entries(data)) {
140
+ for (const [name, value] of Object.entries(params)) {
141
+ if (this.set(engine, name, value, changedBy, `Restored from snapshot #${snapshotId}`)) {
142
+ count++;
143
+ }
144
+ }
145
+ }
146
+ return count;
147
+ }
148
+ /** List all snapshots. */
149
+ listSnapshots(limit = 20) {
150
+ return this.db.prepare('SELECT id, label, data_json, created_at FROM parameter_snapshots ORDER BY id DESC LIMIT ?').all(limit);
151
+ }
152
+ /** Get summary stats. */
153
+ getStatus() {
154
+ const totalParams = this.db.prepare('SELECT COUNT(*) as c FROM parameter_registry').get().c;
155
+ const totalChanges = this.db.prepare('SELECT COUNT(*) as c FROM parameter_changes').get().c;
156
+ const totalSnapshots = this.db.prepare('SELECT COUNT(*) as c FROM parameter_snapshots').get().c;
157
+ const engines = this.db.prepare('SELECT DISTINCT engine FROM parameter_registry ORDER BY engine').all().map(r => r.engine);
158
+ const recentChanges = this.getRecentChanges(10);
159
+ return { totalParameters: totalParams, totalChanges, totalSnapshots, engines, recentChanges };
160
+ }
161
+ }
162
+ //# sourceMappingURL=parameter-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parameter-registry.js","sourceRoot":"","sources":["../../src/metacognition/parameter-registry.ts"],"names":[],"mappings":"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"}