@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.
Files changed (35) hide show
  1. package/dist/index.d.ts +20 -0
  2. package/dist/index.js +20 -0
  3. package/dist/index.js.map +1 -1
  4. package/dist/research/adaptive-strategy.d.ts +56 -0
  5. package/dist/research/adaptive-strategy.js +236 -0
  6. package/dist/research/adaptive-strategy.js.map +1 -0
  7. package/dist/research/agenda-engine.d.ts +46 -0
  8. package/dist/research/agenda-engine.js +264 -0
  9. package/dist/research/agenda-engine.js.map +1 -0
  10. package/dist/research/anomaly-detective.d.ts +62 -0
  11. package/dist/research/anomaly-detective.js +318 -0
  12. package/dist/research/anomaly-detective.js.map +1 -0
  13. package/dist/research/autonomous-scheduler.d.ts +124 -0
  14. package/dist/research/autonomous-scheduler.js +411 -0
  15. package/dist/research/autonomous-scheduler.js.map +1 -0
  16. package/dist/research/counterfactual-engine.d.ts +63 -0
  17. package/dist/research/counterfactual-engine.js +263 -0
  18. package/dist/research/counterfactual-engine.js.map +1 -0
  19. package/dist/research/cross-domain-engine.d.ts +52 -0
  20. package/dist/research/cross-domain-engine.js +283 -0
  21. package/dist/research/cross-domain-engine.js.map +1 -0
  22. package/dist/research/experiment-engine.d.ts +77 -0
  23. package/dist/research/experiment-engine.js +328 -0
  24. package/dist/research/experiment-engine.js.map +1 -0
  25. package/dist/research/journal.d.ts +62 -0
  26. package/dist/research/journal.js +262 -0
  27. package/dist/research/journal.js.map +1 -0
  28. package/dist/research/knowledge-distiller.d.ts +95 -0
  29. package/dist/research/knowledge-distiller.js +426 -0
  30. package/dist/research/knowledge-distiller.js.map +1 -0
  31. package/dist/research/self-observer.d.ts +55 -0
  32. package/dist/research/self-observer.js +268 -0
  33. package/dist/research/self-observer.js.map +1 -0
  34. package/package.json +2 -1
  35. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,263 @@
1
+ import { getLogger } from '../utils/logger.js';
2
+ // ── Migration ───────────────────────────────────────────
3
+ export function runCounterfactualMigration(db) {
4
+ db.exec(`
5
+ CREATE TABLE IF NOT EXISTS counterfactual_queries (
6
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
7
+ query TEXT NOT NULL,
8
+ actual_outcome REAL NOT NULL,
9
+ counterfactual_outcome REAL NOT NULL,
10
+ difference REAL NOT NULL,
11
+ confidence_interval TEXT NOT NULL,
12
+ confidence_level REAL NOT NULL,
13
+ causal_path TEXT NOT NULL,
14
+ narrative TEXT NOT NULL,
15
+ timestamp INTEGER NOT NULL,
16
+ created_at TEXT DEFAULT (datetime('now'))
17
+ );
18
+ CREATE INDEX IF NOT EXISTS idx_cf_timestamp ON counterfactual_queries(timestamp);
19
+ `);
20
+ }
21
+ // ── Engine ──────────────────────────────────────────────
22
+ export class CounterfactualEngine {
23
+ db;
24
+ causalGraph;
25
+ config;
26
+ log = getLogger();
27
+ constructor(db, causalGraph, config) {
28
+ this.db = db;
29
+ this.causalGraph = causalGraph;
30
+ this.config = {
31
+ defaultConfidence: config?.defaultConfidence ?? 0.8,
32
+ maxPathDepth: config?.maxPathDepth ?? 5,
33
+ };
34
+ runCounterfactualMigration(db);
35
+ }
36
+ /** Answer a "what if" question using causal graph and historical data. */
37
+ whatIf(query) {
38
+ const timestamp = Date.now();
39
+ // 1. Find causal path from intervention variable to outcome
40
+ const causalPath = this.findCausalPath(query.intervention.variable, query.outcome_variable);
41
+ // 2. Get actual outcome from historical data
42
+ const actualOutcome = this.getActualOutcome(query.outcome_variable, query.time_range);
43
+ // 3. Estimate counterfactual outcome using causal model
44
+ const { estimate, confidence, interval } = this.estimateCounterfactual(query, causalPath, actualOutcome);
45
+ // 4. Generate narrative
46
+ const narrative = this.generateNarrative(query, actualOutcome, estimate, causalPath);
47
+ const result = {
48
+ query,
49
+ actual_outcome: actualOutcome,
50
+ counterfactual_outcome: estimate,
51
+ difference: estimate - actualOutcome,
52
+ confidence_interval: interval,
53
+ confidence_level: confidence,
54
+ causal_path: causalPath,
55
+ narrative,
56
+ timestamp,
57
+ };
58
+ // Persist
59
+ this.db.prepare(`
60
+ INSERT INTO counterfactual_queries
61
+ (query, actual_outcome, counterfactual_outcome, difference, confidence_interval,
62
+ confidence_level, causal_path, narrative, timestamp)
63
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
64
+ `).run(JSON.stringify(query), result.actual_outcome, result.counterfactual_outcome, result.difference, JSON.stringify(result.confidence_interval), result.confidence_level, JSON.stringify(result.causal_path), result.narrative, timestamp);
65
+ return result;
66
+ }
67
+ /** Get history of past counterfactual queries. */
68
+ getHistory(limit = 10) {
69
+ return this.db.prepare(`
70
+ SELECT * FROM counterfactual_queries ORDER BY timestamp DESC LIMIT ?
71
+ `).all(limit).map(row => ({
72
+ id: row.id,
73
+ query: JSON.parse(row.query),
74
+ actual_outcome: row.actual_outcome,
75
+ counterfactual_outcome: row.counterfactual_outcome,
76
+ difference: row.difference,
77
+ confidence_interval: JSON.parse(row.confidence_interval),
78
+ confidence_level: row.confidence_level,
79
+ causal_path: JSON.parse(row.causal_path),
80
+ narrative: row.narrative,
81
+ timestamp: row.timestamp,
82
+ }));
83
+ }
84
+ /** Estimate the impact of a proposed intervention before making it. */
85
+ estimateIntervention(variable, proposedValue, currentValue) {
86
+ if (!this.causalGraph) {
87
+ return {
88
+ variable,
89
+ proposed_value: proposedValue,
90
+ current_value: currentValue,
91
+ affected_outcomes: [],
92
+ total_impact_score: 0,
93
+ recommendation: 'Cannot estimate — causal graph not available.',
94
+ };
95
+ }
96
+ // Find all downstream effects
97
+ const effects = this.causalGraph.getEffects(variable);
98
+ const affectedOutcomes = [];
99
+ for (const edge of effects) {
100
+ // Estimate change propagation
101
+ const valueDiff = typeof proposedValue === 'number' && typeof currentValue === 'number'
102
+ ? (proposedValue - currentValue) / Math.max(Math.abs(currentValue), 1e-10)
103
+ : 0;
104
+ const expectedChange = valueDiff * edge.strength * edge.direction;
105
+ affectedOutcomes.push({
106
+ outcome: edge.effect,
107
+ expected_change: expectedChange,
108
+ confidence: edge.confidence,
109
+ causal_distance: 1,
110
+ });
111
+ // Check second-order effects
112
+ const secondOrder = this.causalGraph.getEffects(edge.effect);
113
+ for (const e2 of secondOrder) {
114
+ if (e2.effect === variable)
115
+ continue; // Skip cycles
116
+ affectedOutcomes.push({
117
+ outcome: e2.effect,
118
+ expected_change: expectedChange * e2.strength * e2.direction,
119
+ confidence: edge.confidence * e2.confidence,
120
+ causal_distance: 2,
121
+ });
122
+ }
123
+ }
124
+ const totalImpact = affectedOutcomes.reduce((sum, o) => sum + Math.abs(o.expected_change) * o.confidence, 0);
125
+ let recommendation;
126
+ if (affectedOutcomes.length === 0) {
127
+ recommendation = 'No known causal effects. Safe to change but impact unknown.';
128
+ }
129
+ else if (affectedOutcomes.every(o => o.expected_change >= 0)) {
130
+ recommendation = 'All known effects are positive. Recommended to proceed.';
131
+ }
132
+ else if (affectedOutcomes.every(o => o.expected_change <= 0)) {
133
+ recommendation = 'All known effects are negative. Not recommended.';
134
+ }
135
+ else {
136
+ const posImpact = affectedOutcomes.filter(o => o.expected_change > 0).reduce((s, o) => s + o.expected_change * o.confidence, 0);
137
+ const negImpact = affectedOutcomes.filter(o => o.expected_change < 0).reduce((s, o) => s + Math.abs(o.expected_change) * o.confidence, 0);
138
+ recommendation = posImpact > negImpact
139
+ ? `Mixed effects but net positive (${(posImpact - negImpact).toFixed(2)}). Consider proceeding with monitoring.`
140
+ : `Mixed effects with net negative impact (${(negImpact - posImpact).toFixed(2)}). Caution advised.`;
141
+ }
142
+ return {
143
+ variable,
144
+ proposed_value: proposedValue,
145
+ current_value: currentValue,
146
+ affected_outcomes: affectedOutcomes.sort((a, b) => Math.abs(b.expected_change) - Math.abs(a.expected_change)),
147
+ total_impact_score: totalImpact,
148
+ recommendation,
149
+ };
150
+ }
151
+ findCausalPath(from, to) {
152
+ if (!this.causalGraph)
153
+ return [from, to];
154
+ // BFS through causal graph
155
+ const visited = new Set();
156
+ const queue = [{ node: from, path: [from] }];
157
+ visited.add(from);
158
+ while (queue.length > 0) {
159
+ const current = queue.shift();
160
+ if (current.node === to)
161
+ return current.path;
162
+ if (current.path.length >= this.config.maxPathDepth)
163
+ continue;
164
+ const effects = this.causalGraph.getEffects(current.node);
165
+ for (const edge of effects) {
166
+ if (!visited.has(edge.effect)) {
167
+ visited.add(edge.effect);
168
+ queue.push({ node: edge.effect, path: [...current.path, edge.effect] });
169
+ }
170
+ }
171
+ }
172
+ return [from, to]; // No path found, assume direct
173
+ }
174
+ getActualOutcome(variable, timeRange) {
175
+ // Try to get from causal events
176
+ let sql = `
177
+ SELECT AVG(CAST(json_extract(data, '$.value') AS REAL)) as avg_val,
178
+ COUNT(*) as count
179
+ FROM causal_events WHERE type = ?
180
+ `;
181
+ const params = [variable];
182
+ if (timeRange) {
183
+ sql += ` AND timestamp BETWEEN ? AND ?`;
184
+ params.push(timeRange.start, timeRange.end);
185
+ }
186
+ try {
187
+ const row = this.db.prepare(sql).get(...params);
188
+ if (row.avg_val !== null)
189
+ return row.avg_val;
190
+ }
191
+ catch {
192
+ // Table might not exist
193
+ }
194
+ // Fallback: count events as a proxy
195
+ try {
196
+ let countSql = `SELECT COUNT(*) as c FROM causal_events WHERE type = ?`;
197
+ const countParams = [variable];
198
+ if (timeRange) {
199
+ countSql += ` AND timestamp BETWEEN ? AND ?`;
200
+ countParams.push(timeRange.start, timeRange.end);
201
+ }
202
+ const count = this.db.prepare(countSql).get(...countParams);
203
+ return count.c;
204
+ }
205
+ catch {
206
+ return 0;
207
+ }
208
+ }
209
+ estimateCounterfactual(query, causalPath, actualOutcome) {
210
+ if (!this.causalGraph || causalPath.length < 2) {
211
+ // No causal model — assume linear relationship
212
+ const ratio = typeof query.intervention.counterfactual_value === 'number' &&
213
+ typeof query.intervention.actual_value === 'number' &&
214
+ query.intervention.actual_value !== 0
215
+ ? query.intervention.counterfactual_value / query.intervention.actual_value
216
+ : 1;
217
+ const estimate = actualOutcome * ratio;
218
+ const spread = Math.abs(estimate - actualOutcome) * 0.5;
219
+ return {
220
+ estimate,
221
+ confidence: 0.3,
222
+ interval: [estimate - spread, estimate + spread],
223
+ };
224
+ }
225
+ // Use causal path to estimate propagation
226
+ let cumulativeEffect = 1;
227
+ let cumulativeConfidence = 1;
228
+ for (let i = 0; i < causalPath.length - 1; i++) {
229
+ const edges = this.causalGraph.getEffects(causalPath[i])
230
+ .filter(e => e.effect === causalPath[i + 1]);
231
+ if (edges.length > 0) {
232
+ const edge = edges[0];
233
+ cumulativeEffect *= edge.strength * edge.direction;
234
+ cumulativeConfidence *= edge.confidence;
235
+ }
236
+ else {
237
+ cumulativeEffect *= 0.5; // Unknown link — assume weak
238
+ cumulativeConfidence *= 0.3;
239
+ }
240
+ }
241
+ // Compute value difference
242
+ const valueDiff = typeof query.intervention.counterfactual_value === 'number' &&
243
+ typeof query.intervention.actual_value === 'number'
244
+ ? query.intervention.counterfactual_value - query.intervention.actual_value
245
+ : 0;
246
+ const estimate = actualOutcome + valueDiff * cumulativeEffect;
247
+ const spread = Math.abs(estimate - actualOutcome) * (1 - cumulativeConfidence);
248
+ return {
249
+ estimate,
250
+ confidence: cumulativeConfidence,
251
+ interval: [estimate - spread, estimate + spread],
252
+ };
253
+ }
254
+ generateNarrative(query, actual, counterfactual, path) {
255
+ const diff = counterfactual - actual;
256
+ const pctDiff = actual !== 0 ? ((diff / actual) * 100).toFixed(1) : 'N/A';
257
+ const direction = diff > 0 ? 'higher' : diff < 0 ? 'lower' : 'the same';
258
+ const pathStr = path.length > 2 ? ` via ${path.slice(1, -1).join(' → ')}` : '';
259
+ return `If ${query.intervention.variable} had been ${query.intervention.counterfactual_value} instead of ${query.intervention.actual_value}, ` +
260
+ `${query.outcome_variable} would have been ${direction} at ${counterfactual.toFixed(2)} (actual: ${actual.toFixed(2)}, ${pctDiff}% change)${pathStr}.`;
261
+ }
262
+ }
263
+ //# sourceMappingURL=counterfactual-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"counterfactual-engine.js","sourceRoot":"","sources":["../../src/research/counterfactual-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import type Database from 'better-sqlite3';
2
+ export interface CrossDomainCorrelation {
3
+ id?: number;
4
+ timestamp: number;
5
+ source_brain: string;
6
+ source_event: string;
7
+ target_brain: string;
8
+ target_event: string;
9
+ correlation: number;
10
+ lag_seconds: number;
11
+ p_value: number;
12
+ effect_size: number;
13
+ direction: 'positive' | 'negative';
14
+ narrative: string;
15
+ sample_size: number;
16
+ confirmed: boolean;
17
+ }
18
+ export interface CrossDomainEvent {
19
+ brain: string;
20
+ event_type: string;
21
+ timestamp: number;
22
+ data?: Record<string, unknown>;
23
+ }
24
+ export interface CrossDomainConfig {
25
+ /** Time window for correlation analysis (ms). Default: 7_200_000 (2h) */
26
+ windowMs?: number;
27
+ /** Minimum correlation strength. Default: 0.3 */
28
+ minCorrelation?: number;
29
+ /** Significance level. Default: 0.05 */
30
+ alpha?: number;
31
+ /** Maximum events to keep. Default: 10000 */
32
+ maxEvents?: number;
33
+ }
34
+ export declare function runCrossDomainMigration(db: Database.Database): void;
35
+ export declare class CrossDomainEngine {
36
+ private db;
37
+ private config;
38
+ private log;
39
+ constructor(db: Database.Database, config?: CrossDomainConfig);
40
+ /** Record an event from a brain. */
41
+ recordEvent(brain: string, eventType: string, data?: Record<string, unknown>): void;
42
+ /** Run cross-domain correlation analysis. */
43
+ analyze(): CrossDomainCorrelation[];
44
+ /** Get all found correlations. */
45
+ getCorrelations(limit?: number): CrossDomainCorrelation[];
46
+ /** Generate a narrative summary of the most important cross-domain findings. */
47
+ getNarrative(): string;
48
+ private computeCorrelation;
49
+ private generateNarrative;
50
+ private persistCorrelation;
51
+ private rowToCorrelation;
52
+ }
@@ -0,0 +1,283 @@
1
+ import { getLogger } from '../utils/logger.js';
2
+ // ── Migration ───────────────────────────────────────────
3
+ export function runCrossDomainMigration(db) {
4
+ db.exec(`
5
+ CREATE TABLE IF NOT EXISTS cross_domain_events (
6
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
7
+ brain TEXT NOT NULL,
8
+ event_type TEXT NOT NULL,
9
+ timestamp INTEGER NOT NULL,
10
+ data TEXT,
11
+ created_at TEXT DEFAULT (datetime('now'))
12
+ );
13
+ CREATE INDEX IF NOT EXISTS idx_xd_events_brain ON cross_domain_events(brain);
14
+ CREATE INDEX IF NOT EXISTS idx_xd_events_ts ON cross_domain_events(timestamp);
15
+
16
+ CREATE TABLE IF NOT EXISTS cross_domain_correlations (
17
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
18
+ timestamp INTEGER NOT NULL,
19
+ source_brain TEXT NOT NULL,
20
+ source_event TEXT NOT NULL,
21
+ target_brain TEXT NOT NULL,
22
+ target_event TEXT NOT NULL,
23
+ correlation REAL NOT NULL,
24
+ lag_seconds INTEGER NOT NULL,
25
+ p_value REAL NOT NULL,
26
+ effect_size REAL NOT NULL,
27
+ direction TEXT NOT NULL,
28
+ narrative TEXT NOT NULL,
29
+ sample_size INTEGER NOT NULL,
30
+ confirmed INTEGER DEFAULT 0,
31
+ created_at TEXT DEFAULT (datetime('now'))
32
+ );
33
+ CREATE INDEX IF NOT EXISTS idx_xd_corr_brains ON cross_domain_correlations(source_brain, target_brain);
34
+ `);
35
+ }
36
+ // ── Engine ──────────────────────────────────────────────
37
+ export class CrossDomainEngine {
38
+ db;
39
+ config;
40
+ log = getLogger();
41
+ constructor(db, config) {
42
+ this.db = db;
43
+ this.config = {
44
+ windowMs: config?.windowMs ?? 7_200_000,
45
+ minCorrelation: config?.minCorrelation ?? 0.3,
46
+ alpha: config?.alpha ?? 0.05,
47
+ maxEvents: config?.maxEvents ?? 10_000,
48
+ };
49
+ runCrossDomainMigration(db);
50
+ }
51
+ /** Record an event from a brain. */
52
+ recordEvent(brain, eventType, data) {
53
+ this.db.prepare(`
54
+ INSERT INTO cross_domain_events (brain, event_type, timestamp, data)
55
+ VALUES (?, ?, ?, ?)
56
+ `).run(brain, eventType, Date.now(), data ? JSON.stringify(data) : null);
57
+ // Cleanup old events
58
+ const count = this.db.prepare(`SELECT COUNT(*) as c FROM cross_domain_events`).get().c;
59
+ if (count > this.config.maxEvents) {
60
+ this.db.prepare(`
61
+ DELETE FROM cross_domain_events WHERE id IN (
62
+ SELECT id FROM cross_domain_events ORDER BY timestamp ASC LIMIT ?
63
+ )
64
+ `).run(count - this.config.maxEvents);
65
+ }
66
+ }
67
+ /** Run cross-domain correlation analysis. */
68
+ analyze() {
69
+ const brains = this.db.prepare(`
70
+ SELECT DISTINCT brain FROM cross_domain_events
71
+ `).all();
72
+ if (brains.length < 2)
73
+ return [];
74
+ const cutoff = Date.now() - this.config.windowMs * 10; // Analyze 10 windows of data
75
+ const discoveries = [];
76
+ // Get all event types per brain
77
+ const brainEvents = new Map();
78
+ for (const { brain } of brains) {
79
+ const types = this.db.prepare(`
80
+ SELECT DISTINCT event_type FROM cross_domain_events
81
+ WHERE brain = ? AND timestamp > ?
82
+ `).all(brain, cutoff);
83
+ brainEvents.set(brain, types.map(t => t.event_type));
84
+ }
85
+ // Cross-correlate every pair from different brains
86
+ const brainList = [...brainEvents.keys()];
87
+ for (let i = 0; i < brainList.length; i++) {
88
+ for (let j = i + 1; j < brainList.length; j++) {
89
+ const brainA = brainList[i];
90
+ const brainB = brainList[j];
91
+ const typesA = brainEvents.get(brainA) ?? [];
92
+ const typesB = brainEvents.get(brainB) ?? [];
93
+ for (const typeA of typesA) {
94
+ for (const typeB of typesB) {
95
+ const corr = this.computeCorrelation(brainA, typeA, brainB, typeB, cutoff);
96
+ if (corr && Math.abs(corr.correlation) >= this.config.minCorrelation && corr.p_value < this.config.alpha) {
97
+ discoveries.push(corr);
98
+ }
99
+ }
100
+ }
101
+ }
102
+ }
103
+ // Persist new discoveries
104
+ for (const d of discoveries) {
105
+ this.persistCorrelation(d);
106
+ }
107
+ return discoveries;
108
+ }
109
+ /** Get all found correlations. */
110
+ getCorrelations(limit = 20) {
111
+ return this.db.prepare(`
112
+ SELECT * FROM cross_domain_correlations
113
+ ORDER BY ABS(correlation) DESC LIMIT ?
114
+ `).all(limit).map(r => this.rowToCorrelation(r));
115
+ }
116
+ /** Generate a narrative summary of the most important cross-domain findings. */
117
+ getNarrative() {
118
+ const correlations = this.getCorrelations(10);
119
+ if (correlations.length === 0)
120
+ return 'No cross-domain correlations discovered yet.';
121
+ const lines = ['Cross-Domain Research Narrative:\n'];
122
+ for (const c of correlations) {
123
+ lines.push(`- ${c.narrative}`);
124
+ lines.push(` (r=${c.correlation.toFixed(2)}, p=${c.p_value.toFixed(3)}, d=${c.effect_size.toFixed(2)}, lag=${c.lag_seconds}s, n=${c.sample_size})`);
125
+ lines.push('');
126
+ }
127
+ return lines.join('\n');
128
+ }
129
+ computeCorrelation(brainA, typeA, brainB, typeB, since) {
130
+ // Get event timestamps for both
131
+ const eventsA = this.db.prepare(`
132
+ SELECT timestamp FROM cross_domain_events
133
+ WHERE brain = ? AND event_type = ? AND timestamp > ?
134
+ ORDER BY timestamp
135
+ `).all(brainA, typeA, since);
136
+ const eventsB = this.db.prepare(`
137
+ SELECT timestamp FROM cross_domain_events
138
+ WHERE brain = ? AND event_type = ? AND timestamp > ?
139
+ ORDER BY timestamp
140
+ `).all(brainB, typeB, since);
141
+ if (eventsA.length < 3 || eventsB.length < 3)
142
+ return null;
143
+ // Compute temporal cross-correlation with varying lag
144
+ // Bin events into time windows
145
+ const binSize = this.config.windowMs;
146
+ const minTs = Math.min(eventsA[0].timestamp, eventsB[0].timestamp);
147
+ const maxTs = Math.max(eventsA[eventsA.length - 1].timestamp, eventsB[eventsB.length - 1].timestamp);
148
+ const numBins = Math.ceil((maxTs - minTs) / binSize);
149
+ if (numBins < 3)
150
+ return null;
151
+ const binsA = new Array(numBins).fill(0);
152
+ const binsB = new Array(numBins).fill(0);
153
+ for (const e of eventsA) {
154
+ const bin = Math.min(numBins - 1, Math.floor((e.timestamp - minTs) / binSize));
155
+ binsA[bin]++;
156
+ }
157
+ for (const e of eventsB) {
158
+ const bin = Math.min(numBins - 1, Math.floor((e.timestamp - minTs) / binSize));
159
+ binsB[bin]++;
160
+ }
161
+ // Pearson correlation at different lags (-2 to +2 bins)
162
+ let bestCorr = 0;
163
+ let bestLag = 0;
164
+ for (let lag = -2; lag <= 2; lag++) {
165
+ const r = pearsonCorrelation(binsA, binsB, lag);
166
+ if (Math.abs(r) > Math.abs(bestCorr)) {
167
+ bestCorr = r;
168
+ bestLag = lag;
169
+ }
170
+ }
171
+ if (Math.abs(bestCorr) < this.config.minCorrelation)
172
+ return null;
173
+ // Approximate p-value for Pearson correlation
174
+ const n = Math.min(binsA.length, binsB.length) - Math.abs(bestLag);
175
+ const t = bestCorr * Math.sqrt((n - 2) / (1 - bestCorr * bestCorr));
176
+ const pValue = n > 2 ? approxPValue(Math.abs(t), n - 2) : 1;
177
+ const narrative = this.generateNarrative(brainA, typeA, brainB, typeB, bestCorr, bestLag * binSize / 1000);
178
+ return {
179
+ timestamp: Date.now(),
180
+ source_brain: brainA,
181
+ source_event: typeA,
182
+ target_brain: brainB,
183
+ target_event: typeB,
184
+ correlation: bestCorr,
185
+ lag_seconds: Math.round(bestLag * binSize / 1000),
186
+ p_value: pValue,
187
+ effect_size: Math.abs(bestCorr), // r as effect size
188
+ direction: bestCorr > 0 ? 'positive' : 'negative',
189
+ narrative,
190
+ sample_size: eventsA.length + eventsB.length,
191
+ confirmed: false,
192
+ };
193
+ }
194
+ generateNarrative(brainA, typeA, brainB, typeB, correlation, lagSeconds) {
195
+ const direction = correlation > 0 ? 'increases' : 'decreases';
196
+ const strength = Math.abs(correlation) > 0.7 ? 'strongly' : Math.abs(correlation) > 0.5 ? 'moderately' : 'weakly';
197
+ const lagStr = lagSeconds === 0 ? 'simultaneously' :
198
+ lagSeconds > 0 ? `${lagSeconds}s later` : `${Math.abs(lagSeconds)}s before`;
199
+ return `When ${brainA} reports "${typeA}", ${brainB}'s "${typeB}" ${strength} ${direction} (${lagStr}).`;
200
+ }
201
+ persistCorrelation(corr) {
202
+ // Upsert: update if same pair exists
203
+ const existing = this.db.prepare(`
204
+ SELECT id FROM cross_domain_correlations
205
+ WHERE source_brain = ? AND source_event = ? AND target_brain = ? AND target_event = ?
206
+ `).get(corr.source_brain, corr.source_event, corr.target_brain, corr.target_event);
207
+ if (existing) {
208
+ this.db.prepare(`
209
+ UPDATE cross_domain_correlations
210
+ SET correlation = ?, lag_seconds = ?, p_value = ?, effect_size = ?,
211
+ direction = ?, narrative = ?, sample_size = ?, timestamp = ?
212
+ WHERE source_brain = ? AND source_event = ? AND target_brain = ? AND target_event = ?
213
+ `).run(corr.correlation, corr.lag_seconds, corr.p_value, corr.effect_size, corr.direction, corr.narrative, corr.sample_size, corr.timestamp, corr.source_brain, corr.source_event, corr.target_brain, corr.target_event);
214
+ }
215
+ else {
216
+ this.db.prepare(`
217
+ INSERT INTO cross_domain_correlations
218
+ (timestamp, source_brain, source_event, target_brain, target_event,
219
+ correlation, lag_seconds, p_value, effect_size, direction, narrative, sample_size)
220
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
221
+ `).run(corr.timestamp, corr.source_brain, corr.source_event, corr.target_brain, corr.target_event, corr.correlation, corr.lag_seconds, corr.p_value, corr.effect_size, corr.direction, corr.narrative, corr.sample_size);
222
+ }
223
+ }
224
+ rowToCorrelation(row) {
225
+ return {
226
+ id: row.id,
227
+ timestamp: row.timestamp,
228
+ source_brain: row.source_brain,
229
+ source_event: row.source_event,
230
+ target_brain: row.target_brain,
231
+ target_event: row.target_event,
232
+ correlation: row.correlation,
233
+ lag_seconds: row.lag_seconds,
234
+ p_value: row.p_value,
235
+ effect_size: row.effect_size,
236
+ direction: row.direction,
237
+ narrative: row.narrative,
238
+ sample_size: row.sample_size,
239
+ confirmed: row.confirmed === 1,
240
+ };
241
+ }
242
+ }
243
+ // ── Helper Functions ────────────────────────────────────
244
+ function pearsonCorrelation(a, b, lag = 0) {
245
+ const n = Math.min(a.length, b.length) - Math.abs(lag);
246
+ if (n < 3)
247
+ return 0;
248
+ let sumA = 0, sumB = 0;
249
+ const offsetA = lag > 0 ? lag : 0;
250
+ const offsetB = lag < 0 ? -lag : 0;
251
+ for (let i = 0; i < n; i++) {
252
+ sumA += a[i + offsetA];
253
+ sumB += b[i + offsetB];
254
+ }
255
+ const meanA = sumA / n;
256
+ const meanB = sumB / n;
257
+ let cov = 0, varA = 0, varB = 0;
258
+ for (let i = 0; i < n; i++) {
259
+ const dA = a[i + offsetA] - meanA;
260
+ const dB = b[i + offsetB] - meanB;
261
+ cov += dA * dB;
262
+ varA += dA * dA;
263
+ varB += dB * dB;
264
+ }
265
+ const denom = Math.sqrt(varA * varB);
266
+ return denom === 0 ? 0 : cov / denom;
267
+ }
268
+ function approxPValue(t, df) {
269
+ if (df <= 0)
270
+ return 1;
271
+ // Normal approximation for large df
272
+ const z = t * (1 - 1 / (4 * df)) / Math.sqrt(1 + t * t / (2 * df));
273
+ return 2 * (1 - normalCDF(z));
274
+ }
275
+ function normalCDF(x) {
276
+ const a1 = 0.254829592, a2 = -0.284496736, a3 = 1.421413741, a4 = -1.453152027, a5 = 1.061405429;
277
+ const p = 0.3275911;
278
+ const sign = x < 0 ? -1 : 1;
279
+ const t = 1.0 / (1.0 + p * Math.abs(x));
280
+ const y = 1.0 - ((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t * Math.exp(-x * x / 2);
281
+ return 0.5 * (1.0 + sign * y);
282
+ }
283
+ //# sourceMappingURL=cross-domain-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-domain-engine.js","sourceRoot":"","sources":["../../src/research/cross-domain-engine.ts"],"names":[],"mappings":"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"}