@timmeck/brain-core 2.2.0 → 2.4.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.
@@ -0,0 +1,118 @@
1
+ import { getLogger } from '../utils/logger.js';
2
+ // ── Service ─────────────────────────────────────────────
3
+ export class ExportService {
4
+ db;
5
+ logger = getLogger();
6
+ constructor(db) {
7
+ this.db = db;
8
+ }
9
+ /** Get list of all tables in the database. */
10
+ listTables() {
11
+ const rows = this.db.prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name`).all();
12
+ return rows.map(r => r.name);
13
+ }
14
+ /** Get column info for a table. */
15
+ getColumns(table) {
16
+ this.validateTableName(table);
17
+ const rows = this.db.prepare(`PRAGMA table_info("${table}")`).all();
18
+ return rows.map(r => ({ name: r.name, type: r.type }));
19
+ }
20
+ /** Export data from a table. */
21
+ export(options) {
22
+ this.validateTableName(options.table);
23
+ const columns = options.columns?.length
24
+ ? options.columns.map(c => `"${c.replace(/"/g, '""')}"`).join(', ')
25
+ : '*';
26
+ const conditions = [];
27
+ const params = [];
28
+ if (options.where) {
29
+ conditions.push(`(${options.where})`);
30
+ }
31
+ if (options.dateColumn && options.dateFrom) {
32
+ this.validateColumnName(options.dateColumn);
33
+ conditions.push(`"${options.dateColumn}" >= ?`);
34
+ params.push(options.dateFrom);
35
+ }
36
+ if (options.dateColumn && options.dateTo) {
37
+ this.validateColumnName(options.dateColumn);
38
+ conditions.push(`"${options.dateColumn}" <= ?`);
39
+ params.push(options.dateTo);
40
+ }
41
+ let sql = `SELECT ${columns} FROM "${options.table}"`;
42
+ if (conditions.length > 0) {
43
+ sql += ` WHERE ${conditions.join(' AND ')}`;
44
+ }
45
+ if (options.orderBy) {
46
+ sql += ` ORDER BY ${options.orderBy}`;
47
+ }
48
+ if (options.limit) {
49
+ sql += ` LIMIT ?`;
50
+ params.push(options.limit);
51
+ }
52
+ const rows = this.db.prepare(sql).all(...params);
53
+ const data = options.format === 'csv'
54
+ ? this.toCsv(rows)
55
+ : JSON.stringify(rows, null, 2);
56
+ this.logger.info(`Exported ${rows.length} rows from ${options.table} as ${options.format}`);
57
+ return {
58
+ table: options.table,
59
+ format: options.format,
60
+ rowCount: rows.length,
61
+ data,
62
+ };
63
+ }
64
+ /** Export multiple tables at once (JSON only). */
65
+ exportAll(tables, format = 'json') {
66
+ const tableNames = tables ?? this.listTables();
67
+ const results = {};
68
+ for (const table of tableNames) {
69
+ results[table] = this.export({ table, format });
70
+ }
71
+ return results;
72
+ }
73
+ /** Get row counts for all tables. */
74
+ getStats() {
75
+ const tables = this.listTables();
76
+ const stats = {};
77
+ for (const table of tables) {
78
+ const row = this.db.prepare(`SELECT COUNT(*) as count FROM "${table}"`).get();
79
+ stats[table] = row.count;
80
+ }
81
+ return stats;
82
+ }
83
+ /** Convert array of objects to CSV string. */
84
+ toCsv(rows) {
85
+ if (rows.length === 0)
86
+ return '';
87
+ const headers = Object.keys(rows[0]);
88
+ const lines = [headers.join(',')];
89
+ for (const row of rows) {
90
+ const values = headers.map(h => {
91
+ const val = row[h];
92
+ if (val == null)
93
+ return '';
94
+ const str = String(val);
95
+ // Escape CSV: quote if contains comma, quote, or newline
96
+ if (str.includes(',') || str.includes('"') || str.includes('\n')) {
97
+ return `"${str.replace(/"/g, '""')}"`;
98
+ }
99
+ return str;
100
+ });
101
+ lines.push(values.join(','));
102
+ }
103
+ return lines.join('\n');
104
+ }
105
+ /** Validate table name to prevent SQL injection. */
106
+ validateTableName(name) {
107
+ if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {
108
+ throw new Error(`Invalid table name: ${name}`);
109
+ }
110
+ }
111
+ /** Validate column name. */
112
+ validateColumnName(name) {
113
+ if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {
114
+ throw new Error(`Invalid column name: ${name}`);
115
+ }
116
+ }
117
+ }
118
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/export/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ import type Database from 'better-sqlite3';
2
+ export type HypothesisStatus = 'proposed' | 'testing' | 'confirmed' | 'rejected' | 'inconclusive';
3
+ export interface Hypothesis {
4
+ id?: number;
5
+ statement: string;
6
+ type: string;
7
+ source: string;
8
+ variables: string[];
9
+ condition: HypothesisCondition;
10
+ status: HypothesisStatus;
11
+ evidence_for: number;
12
+ evidence_against: number;
13
+ confidence: number;
14
+ p_value: number;
15
+ created_at?: string;
16
+ tested_at?: string;
17
+ }
18
+ export interface HypothesisCondition {
19
+ type: 'temporal' | 'correlation' | 'threshold' | 'frequency';
20
+ params: Record<string, unknown>;
21
+ }
22
+ export interface HypothesisTestResult {
23
+ hypothesisId: number;
24
+ passed: boolean;
25
+ evidenceFor: number;
26
+ evidenceAgainst: number;
27
+ pValue: number;
28
+ confidence: number;
29
+ newStatus: HypothesisStatus;
30
+ }
31
+ export interface Observation {
32
+ source: string;
33
+ type: string;
34
+ value: number;
35
+ timestamp: number;
36
+ metadata?: Record<string, unknown>;
37
+ }
38
+ export declare function runHypothesisMigration(db: Database.Database): void;
39
+ /**
40
+ * Hypothesis Engine: generates and tests hypotheses autonomously.
41
+ *
42
+ * Research approach: The scientific method, automated.
43
+ *
44
+ * 1. OBSERVE: Collect observations from all brains
45
+ * 2. HYPOTHESIZE: Generate hypotheses from patterns in observations
46
+ * - Temporal: "Event A occurs more often during time window X"
47
+ * - Correlation: "When metric A increases, metric B also increases"
48
+ * - Threshold: "Performance degrades when metric A exceeds value X"
49
+ * - Frequency: "Event A happens with period P"
50
+ * 3. TEST: Evaluate hypotheses against historical data using statistical tests
51
+ * 4. CONCLUDE: Accept or reject based on evidence
52
+ */
53
+ export declare class HypothesisEngine {
54
+ private db;
55
+ private logger;
56
+ private minEvidence;
57
+ private confirmThreshold;
58
+ private rejectThreshold;
59
+ constructor(db: Database.Database, config?: {
60
+ minEvidence?: number;
61
+ confirmThreshold?: number;
62
+ rejectThreshold?: number;
63
+ });
64
+ /** Record an observation for hypothesis generation and testing. */
65
+ observe(observation: Observation): void;
66
+ /** Propose a hypothesis manually or from automated detection. */
67
+ propose(hypothesis: Omit<Hypothesis, 'id' | 'status' | 'evidence_for' | 'evidence_against' | 'confidence' | 'p_value' | 'created_at' | 'tested_at'>): Hypothesis;
68
+ /**
69
+ * Auto-generate hypotheses from observation patterns.
70
+ * This is the creative part — the system forms its own theories.
71
+ */
72
+ generate(): Hypothesis[];
73
+ /**
74
+ * Test a hypothesis against available data.
75
+ * Returns the test result with updated status.
76
+ */
77
+ test(hypothesisId: number): HypothesisTestResult | null;
78
+ /** Test all proposed/testing hypotheses. */
79
+ testAll(): HypothesisTestResult[];
80
+ /** Get a hypothesis by ID. */
81
+ get(id: number): Hypothesis | null;
82
+ /** List hypotheses by status. */
83
+ list(status?: HypothesisStatus, limit?: number): Hypothesis[];
84
+ /** Get summary statistics. */
85
+ getSummary(): {
86
+ total: number;
87
+ proposed: number;
88
+ testing: number;
89
+ confirmed: number;
90
+ rejected: number;
91
+ inconclusive: number;
92
+ totalObservations: number;
93
+ topConfirmed: Hypothesis[];
94
+ };
95
+ private generateTemporalHypotheses;
96
+ private generateCorrelationHypotheses;
97
+ private generateThresholdHypotheses;
98
+ private testTemporalHypothesis;
99
+ private testCorrelationHypothesis;
100
+ private testThresholdHypothesis;
101
+ private testFrequencyHypothesis;
102
+ private getObservationTypes;
103
+ private getObservationTimeRange;
104
+ }
@@ -0,0 +1,386 @@
1
+ import { getLogger } from '../utils/logger.js';
2
+ // ── Migration ───────────────────────────────────────────
3
+ export function runHypothesisMigration(db) {
4
+ db.exec(`
5
+ CREATE TABLE IF NOT EXISTS hypotheses (
6
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
7
+ statement TEXT NOT NULL,
8
+ type TEXT NOT NULL,
9
+ source TEXT NOT NULL,
10
+ variables TEXT NOT NULL,
11
+ condition TEXT NOT NULL,
12
+ status TEXT NOT NULL DEFAULT 'proposed',
13
+ evidence_for INTEGER NOT NULL DEFAULT 0,
14
+ evidence_against INTEGER NOT NULL DEFAULT 0,
15
+ confidence REAL NOT NULL DEFAULT 0,
16
+ p_value REAL NOT NULL DEFAULT 1,
17
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
18
+ tested_at TEXT
19
+ );
20
+
21
+ CREATE TABLE IF NOT EXISTS observations (
22
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
23
+ source TEXT NOT NULL,
24
+ type TEXT NOT NULL,
25
+ value REAL NOT NULL,
26
+ timestamp INTEGER NOT NULL,
27
+ metadata TEXT,
28
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
29
+ );
30
+
31
+ CREATE INDEX IF NOT EXISTS idx_hypotheses_status ON hypotheses(status);
32
+ CREATE INDEX IF NOT EXISTS idx_hypotheses_confidence ON hypotheses(confidence DESC);
33
+ CREATE INDEX IF NOT EXISTS idx_observations_type ON observations(type);
34
+ CREATE INDEX IF NOT EXISTS idx_observations_timestamp ON observations(timestamp);
35
+ `);
36
+ }
37
+ // ── Engine ───────────────────────────────────────────────
38
+ /**
39
+ * Hypothesis Engine: generates and tests hypotheses autonomously.
40
+ *
41
+ * Research approach: The scientific method, automated.
42
+ *
43
+ * 1. OBSERVE: Collect observations from all brains
44
+ * 2. HYPOTHESIZE: Generate hypotheses from patterns in observations
45
+ * - Temporal: "Event A occurs more often during time window X"
46
+ * - Correlation: "When metric A increases, metric B also increases"
47
+ * - Threshold: "Performance degrades when metric A exceeds value X"
48
+ * - Frequency: "Event A happens with period P"
49
+ * 3. TEST: Evaluate hypotheses against historical data using statistical tests
50
+ * 4. CONCLUDE: Accept or reject based on evidence
51
+ */
52
+ export class HypothesisEngine {
53
+ db;
54
+ logger = getLogger();
55
+ minEvidence;
56
+ confirmThreshold; // p-value below this → confirmed
57
+ rejectThreshold; // p-value above this → rejected
58
+ constructor(db, config) {
59
+ this.db = db;
60
+ runHypothesisMigration(db);
61
+ this.minEvidence = config?.minEvidence ?? 10;
62
+ this.confirmThreshold = config?.confirmThreshold ?? 0.05;
63
+ this.rejectThreshold = config?.rejectThreshold ?? 0.5;
64
+ }
65
+ /** Record an observation for hypothesis generation and testing. */
66
+ observe(observation) {
67
+ this.db.prepare(`
68
+ INSERT INTO observations (source, type, value, timestamp, metadata)
69
+ VALUES (?, ?, ?, ?, ?)
70
+ `).run(observation.source, observation.type, observation.value, observation.timestamp, observation.metadata ? JSON.stringify(observation.metadata) : null);
71
+ }
72
+ /** Propose a hypothesis manually or from automated detection. */
73
+ propose(hypothesis) {
74
+ const stmt = this.db.prepare(`
75
+ INSERT INTO hypotheses (statement, type, source, variables, condition, status)
76
+ VALUES (?, ?, ?, ?, ?, 'proposed')
77
+ `);
78
+ const info = stmt.run(hypothesis.statement, hypothesis.type, hypothesis.source, JSON.stringify(hypothesis.variables), JSON.stringify(hypothesis.condition));
79
+ this.logger.info(`Hypothesis proposed: "${hypothesis.statement}"`);
80
+ return this.get(Number(info.lastInsertRowid));
81
+ }
82
+ /**
83
+ * Auto-generate hypotheses from observation patterns.
84
+ * This is the creative part — the system forms its own theories.
85
+ */
86
+ generate() {
87
+ const generated = [];
88
+ // Strategy 1: Temporal patterns — "Event X happens more on certain hours"
89
+ const temporalHypotheses = this.generateTemporalHypotheses();
90
+ generated.push(...temporalHypotheses);
91
+ // Strategy 2: Correlation — "When metric A is high, metric B is also high"
92
+ const correlationHypotheses = this.generateCorrelationHypotheses();
93
+ generated.push(...correlationHypotheses);
94
+ // Strategy 3: Threshold — "Performance drops when metric exceeds X"
95
+ const thresholdHypotheses = this.generateThresholdHypotheses();
96
+ generated.push(...thresholdHypotheses);
97
+ this.logger.info(`Generated ${generated.length} hypotheses`);
98
+ return generated;
99
+ }
100
+ /**
101
+ * Test a hypothesis against available data.
102
+ * Returns the test result with updated status.
103
+ */
104
+ test(hypothesisId) {
105
+ const hyp = this.get(hypothesisId);
106
+ if (!hyp)
107
+ return null;
108
+ const condition = typeof hyp.condition === 'string'
109
+ ? JSON.parse(hyp.condition)
110
+ : hyp.condition;
111
+ let result;
112
+ switch (condition.type) {
113
+ case 'temporal':
114
+ result = this.testTemporalHypothesis(hyp, condition);
115
+ break;
116
+ case 'correlation':
117
+ result = this.testCorrelationHypothesis(hyp, condition);
118
+ break;
119
+ case 'threshold':
120
+ result = this.testThresholdHypothesis(hyp, condition);
121
+ break;
122
+ case 'frequency':
123
+ result = this.testFrequencyHypothesis(hyp, condition);
124
+ break;
125
+ default:
126
+ return null;
127
+ }
128
+ const totalEvidence = result.evidenceFor + result.evidenceAgainst;
129
+ const confidence = totalEvidence > 0 ? result.evidenceFor / totalEvidence : 0;
130
+ let newStatus = 'testing';
131
+ if (totalEvidence >= this.minEvidence) {
132
+ if (result.pValue < this.confirmThreshold) {
133
+ newStatus = 'confirmed';
134
+ }
135
+ else if (result.pValue > this.rejectThreshold) {
136
+ newStatus = 'rejected';
137
+ }
138
+ else {
139
+ newStatus = 'inconclusive';
140
+ }
141
+ }
142
+ // Update in DB
143
+ this.db.prepare(`
144
+ UPDATE hypotheses SET
145
+ evidence_for = ?, evidence_against = ?,
146
+ confidence = ?, p_value = ?, status = ?,
147
+ tested_at = datetime('now')
148
+ WHERE id = ?
149
+ `).run(result.evidenceFor, result.evidenceAgainst, confidence, result.pValue, newStatus, hypothesisId);
150
+ this.logger.info(`Hypothesis #${hypothesisId} tested: ${newStatus} (p=${result.pValue.toFixed(4)}, confidence=${confidence.toFixed(3)})`);
151
+ return {
152
+ hypothesisId,
153
+ passed: newStatus === 'confirmed',
154
+ evidenceFor: result.evidenceFor,
155
+ evidenceAgainst: result.evidenceAgainst,
156
+ pValue: result.pValue,
157
+ confidence,
158
+ newStatus,
159
+ };
160
+ }
161
+ /** Test all proposed/testing hypotheses. */
162
+ testAll() {
163
+ const hypotheses = this.db.prepare(`SELECT id FROM hypotheses WHERE status IN ('proposed', 'testing')`).all();
164
+ return hypotheses
165
+ .map(h => this.test(h.id))
166
+ .filter((r) => r !== null);
167
+ }
168
+ /** Get a hypothesis by ID. */
169
+ get(id) {
170
+ const row = this.db.prepare('SELECT * FROM hypotheses WHERE id = ?').get(id);
171
+ if (!row)
172
+ return null;
173
+ return {
174
+ ...row,
175
+ variables: JSON.parse(row.variables),
176
+ condition: JSON.parse(row.condition),
177
+ };
178
+ }
179
+ /** List hypotheses by status. */
180
+ list(status, limit = 50) {
181
+ let rows;
182
+ if (status) {
183
+ rows = this.db.prepare('SELECT * FROM hypotheses WHERE status = ? ORDER BY confidence DESC LIMIT ?').all(status, limit);
184
+ }
185
+ else {
186
+ rows = this.db.prepare('SELECT * FROM hypotheses ORDER BY confidence DESC LIMIT ?').all(limit);
187
+ }
188
+ return rows.map(r => ({
189
+ ...r,
190
+ variables: JSON.parse(r.variables),
191
+ condition: JSON.parse(r.condition),
192
+ }));
193
+ }
194
+ /** Get summary statistics. */
195
+ getSummary() {
196
+ const counts = this.db.prepare(`
197
+ SELECT status, COUNT(*) as count FROM hypotheses GROUP BY status
198
+ `).all();
199
+ const statusMap = {};
200
+ let total = 0;
201
+ for (const { status, count } of counts) {
202
+ statusMap[status] = count;
203
+ total += count;
204
+ }
205
+ const obsCount = this.db.prepare('SELECT COUNT(*) as c FROM observations').get().c;
206
+ const topConfirmed = this.list('confirmed', 5);
207
+ return {
208
+ total,
209
+ proposed: statusMap['proposed'] ?? 0,
210
+ testing: statusMap['testing'] ?? 0,
211
+ confirmed: statusMap['confirmed'] ?? 0,
212
+ rejected: statusMap['rejected'] ?? 0,
213
+ inconclusive: statusMap['inconclusive'] ?? 0,
214
+ totalObservations: obsCount,
215
+ topConfirmed,
216
+ };
217
+ }
218
+ // ── Hypothesis Generation Strategies ──────────────
219
+ generateTemporalHypotheses() {
220
+ const results = [];
221
+ const types = this.getObservationTypes();
222
+ for (const type of types) {
223
+ // Check if there's a time-of-day pattern
224
+ const hourCounts = this.db.prepare(`
225
+ SELECT (timestamp / 3600000) % 24 as hour, COUNT(*) as count
226
+ FROM observations WHERE type = ?
227
+ GROUP BY hour HAVING count >= 3
228
+ ORDER BY count DESC LIMIT 1
229
+ `).get(type);
230
+ if (!hourCounts)
231
+ continue;
232
+ const totalCount = this.db.prepare('SELECT COUNT(*) as c FROM observations WHERE type = ?').get(type).c;
233
+ // If peak hour has > 2x average, propose a hypothesis
234
+ const avgPerHour = totalCount / 24;
235
+ if (hourCounts.count > avgPerHour * 2) {
236
+ const existing = this.db.prepare(`SELECT id FROM hypotheses WHERE type = 'temporal' AND variables LIKE ? AND status != 'rejected'`).get(`%"${type}"%`);
237
+ if (!existing) {
238
+ results.push(this.propose({
239
+ statement: `"${type}" events occur disproportionately around hour ${hourCounts.hour}:00 UTC`,
240
+ type: 'temporal',
241
+ source: 'hypothesis-engine',
242
+ variables: [type],
243
+ condition: {
244
+ type: 'temporal',
245
+ params: { eventType: type, peakHour: hourCounts.hour, expectedRatio: hourCounts.count / avgPerHour },
246
+ },
247
+ }));
248
+ }
249
+ }
250
+ }
251
+ return results;
252
+ }
253
+ generateCorrelationHypotheses() {
254
+ const results = [];
255
+ const types = this.getObservationTypes();
256
+ // Check pairwise correlations between observation types
257
+ for (let i = 0; i < types.length; i++) {
258
+ for (let j = i + 1; j < types.length; j++) {
259
+ const typeA = types[i];
260
+ const typeB = types[j];
261
+ // Simple correlation: count co-occurrences within 1 minute windows
262
+ const coOccurrences = this.db.prepare(`
263
+ SELECT COUNT(*) as count FROM observations a
264
+ INNER JOIN observations b ON b.type = ? AND ABS(a.timestamp - b.timestamp) < 60000
265
+ WHERE a.type = ?
266
+ `).get(typeB, typeA).count;
267
+ const countA = this.db.prepare('SELECT COUNT(*) as c FROM observations WHERE type = ?').get(typeA).c;
268
+ if (countA > 0 && coOccurrences / countA > 0.3) {
269
+ const existing = this.db.prepare(`SELECT id FROM hypotheses WHERE type = 'correlation' AND variables LIKE ? AND variables LIKE ? AND status != 'rejected'`).get(`%"${typeA}"%`, `%"${typeB}"%`);
270
+ if (!existing) {
271
+ results.push(this.propose({
272
+ statement: `"${typeA}" and "${typeB}" events tend to occur together (co-occurrence rate: ${(coOccurrences / countA * 100).toFixed(0)}%)`,
273
+ type: 'correlation',
274
+ source: 'hypothesis-engine',
275
+ variables: [typeA, typeB],
276
+ condition: {
277
+ type: 'correlation',
278
+ params: { typeA, typeB, windowMs: 60_000, observedRate: coOccurrences / countA },
279
+ },
280
+ }));
281
+ }
282
+ }
283
+ }
284
+ }
285
+ return results;
286
+ }
287
+ generateThresholdHypotheses() {
288
+ const results = [];
289
+ const types = this.getObservationTypes();
290
+ for (const type of types) {
291
+ // Look for value distributions with clear thresholds
292
+ const stats = this.db.prepare(`
293
+ SELECT AVG(value) as avg, MAX(value) as max, MIN(value) as min,
294
+ COUNT(*) as count
295
+ FROM observations WHERE type = ?
296
+ `).get(type);
297
+ if (stats.count < 10)
298
+ continue;
299
+ // Check if high values correlate with other events
300
+ const threshold = stats.avg + (stats.max - stats.avg) * 0.5;
301
+ const highCount = this.db.prepare('SELECT COUNT(*) as c FROM observations WHERE type = ? AND value > ?').get(type, threshold).c;
302
+ if (highCount >= 3 && highCount < stats.count * 0.3) {
303
+ const existing = this.db.prepare(`SELECT id FROM hypotheses WHERE type = 'threshold' AND variables LIKE ? AND status != 'rejected'`).get(`%"${type}"%`);
304
+ if (!existing) {
305
+ results.push(this.propose({
306
+ statement: `"${type}" shows anomalous behavior when value exceeds ${threshold.toFixed(2)} (affects ${(highCount / stats.count * 100).toFixed(0)}% of observations)`,
307
+ type: 'threshold',
308
+ source: 'hypothesis-engine',
309
+ variables: [type],
310
+ condition: {
311
+ type: 'threshold',
312
+ params: { eventType: type, threshold, aboveCount: highCount, totalCount: stats.count },
313
+ },
314
+ }));
315
+ }
316
+ }
317
+ }
318
+ return results;
319
+ }
320
+ // ── Hypothesis Testing ────────────────────────────
321
+ testTemporalHypothesis(hyp, condition) {
322
+ const { eventType, peakHour } = condition.params;
323
+ const total = this.db.prepare('SELECT COUNT(*) as c FROM observations WHERE type = ?').get(eventType).c;
324
+ const inPeak = this.db.prepare('SELECT COUNT(*) as c FROM observations WHERE type = ? AND (timestamp / 3600000) % 24 = ?').get(eventType, peakHour).c;
325
+ const expected = total / 24;
326
+ const evidenceFor = inPeak;
327
+ const evidenceAgainst = Math.max(0, Math.round(expected) - inPeak);
328
+ // Chi-squared test approximation (1 degree of freedom)
329
+ const chiSq = expected > 0 ? Math.pow(inPeak - expected, 2) / expected : 0;
330
+ const pValue = Math.exp(-chiSq / 2); // rough p-value approximation
331
+ return { evidenceFor, evidenceAgainst, pValue };
332
+ }
333
+ testCorrelationHypothesis(hyp, condition) {
334
+ const { typeA, typeB, windowMs } = condition.params;
335
+ const coOccurrences = this.db.prepare(`
336
+ SELECT COUNT(*) as count FROM observations a
337
+ INNER JOIN observations b ON b.type = ? AND ABS(a.timestamp - b.timestamp) < ?
338
+ WHERE a.type = ?
339
+ `).get(typeB, windowMs, typeA).count;
340
+ const countA = this.db.prepare('SELECT COUNT(*) as c FROM observations WHERE type = ?').get(typeA).c;
341
+ const countB = this.db.prepare('SELECT COUNT(*) as c FROM observations WHERE type = ?').get(typeB).c;
342
+ if (countA === 0 || countB === 0)
343
+ return { evidenceFor: 0, evidenceAgainst: 0, pValue: 1 };
344
+ const observedRate = coOccurrences / countA;
345
+ // Expected rate under independence
346
+ const timeRange = this.getObservationTimeRange();
347
+ const expectedRate = timeRange > 0 ? Math.min(1, (countB / timeRange) * windowMs * 2) : 0;
348
+ const evidenceFor = coOccurrences;
349
+ const evidenceAgainst = Math.max(0, countA - coOccurrences);
350
+ // Simplified z-test for proportions
351
+ if (expectedRate <= 0 || expectedRate >= 1)
352
+ return { evidenceFor, evidenceAgainst, pValue: 1 };
353
+ const z = (observedRate - expectedRate) / Math.sqrt(expectedRate * (1 - expectedRate) / countA);
354
+ const pValue = Math.exp(-0.5 * z * z); // rough p-value
355
+ return { evidenceFor, evidenceAgainst, pValue: Math.min(1, pValue) };
356
+ }
357
+ testThresholdHypothesis(hyp, condition) {
358
+ const { eventType, threshold } = condition.params;
359
+ const above = this.db.prepare('SELECT COUNT(*) as c FROM observations WHERE type = ? AND value > ?').get(eventType, threshold).c;
360
+ const total = this.db.prepare('SELECT COUNT(*) as c FROM observations WHERE type = ?').get(eventType).c;
361
+ const below = total - above;
362
+ // Test: is the proportion above threshold significantly different from random?
363
+ const proportion = total > 0 ? above / total : 0;
364
+ // Under null hypothesis, threshold splits data randomly
365
+ const expectedProportion = 0.5;
366
+ const z = total > 0
367
+ ? (proportion - expectedProportion) / Math.sqrt(expectedProportion * (1 - expectedProportion) / total)
368
+ : 0;
369
+ // We care about the threshold being meaningful, so evidence is relative
370
+ const pValue = Math.exp(-0.5 * z * z);
371
+ return { evidenceFor: above, evidenceAgainst: below, pValue: Math.min(1, pValue) };
372
+ }
373
+ testFrequencyHypothesis(_hyp, _condition) {
374
+ // Placeholder for frequency/periodicity testing
375
+ return { evidenceFor: 0, evidenceAgainst: 0, pValue: 1 };
376
+ }
377
+ // ── Helpers ───────────────────────────────────────
378
+ getObservationTypes() {
379
+ return this.db.prepare('SELECT DISTINCT type FROM observations').all().map(r => r.type);
380
+ }
381
+ getObservationTimeRange() {
382
+ const row = this.db.prepare('SELECT MIN(timestamp) as min_ts, MAX(timestamp) as max_ts FROM observations').get();
383
+ return (row.max_ts ?? 0) - (row.min_ts ?? 0);
384
+ }
385
+ }
386
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/hypothesis/engine.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -53,3 +53,15 @@ export { CrossBrainCorrelator } from './cross-brain/correlator.js';
53
53
  export type { CorrelatorEvent, Correlation, EcosystemHealth, CorrelatorConfig } from './cross-brain/correlator.js';
54
54
  export { EcosystemService } from './ecosystem/service.js';
55
55
  export type { BrainStatus, EcosystemStatus, AggregatedAnalytics } from './ecosystem/service.js';
56
+ export { WebhookService, runWebhookMigration } from './webhooks/service.js';
57
+ export type { WebhookConfig, WebhookRecord, DeliveryRecord, WebhookDeliveryResult } from './webhooks/service.js';
58
+ export { ExportService } from './export/service.js';
59
+ export type { ExportOptions, ExportResult } from './export/service.js';
60
+ export { BackupService } from './backup/service.js';
61
+ export type { BackupConfig, BackupRecord, RestoreResult } from './backup/service.js';
62
+ export { MetaLearningEngine, runMetaLearningMigration } from './meta-learning/engine.js';
63
+ export type { HyperParameter, LearningSnapshot, ParameterRecommendation, MetaLearningStatus } from './meta-learning/engine.js';
64
+ export { CausalGraph, runCausalMigration } from './causal/engine.js';
65
+ export type { CausalEvent, CausalEdge, CausalPath, CausalAnalysis } from './causal/engine.js';
66
+ export { HypothesisEngine, runHypothesisMigration } from './hypothesis/engine.js';
67
+ export type { Hypothesis, HypothesisStatus, HypothesisCondition, HypothesisTestResult, Observation } from './hypothesis/engine.js';