@timmeck/brain-core 2.6.0 → 2.8.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,165 @@
1
+ /**
2
+ * DataMiner adapter for Trading Brain.
3
+ * Mines: trades (win/loss, profit, regime, pair), rules (confidence, win-rate),
4
+ * chains (streak patterns), calibration.
5
+ */
6
+ export class TradingDataMinerAdapter {
7
+ name = 'trading-brain';
8
+ mineObservations(db, since) {
9
+ const observations = [];
10
+ // Trade outcomes by pair
11
+ const trades = safeAll(db, `SELECT pair, COUNT(*) as cnt, SUM(CASE WHEN win = 1 THEN 1 ELSE 0 END) as wins,
12
+ SUM(COALESCE(profit, 0)) as total_profit
13
+ FROM trades WHERE created_at > ? GROUP BY pair`, [isoFromTs(since)]);
14
+ for (const t of trades) {
15
+ observations.push({
16
+ category: 'tool_usage',
17
+ event_type: 'trade:pair_stats',
18
+ metrics: { pair: t.pair, count: t.cnt, wins: t.wins, win_rate: t.cnt > 0 ? t.wins / t.cnt : 0, total_profit: t.total_profit },
19
+ });
20
+ }
21
+ // Trade outcomes by regime
22
+ const regimes = safeAll(db, `SELECT COALESCE(regime, 'unknown') as regime, COUNT(*) as cnt,
23
+ SUM(CASE WHEN win = 1 THEN 1 ELSE 0 END) as wins
24
+ FROM trades WHERE created_at > ? GROUP BY regime`, [isoFromTs(since)]);
25
+ for (const r of regimes) {
26
+ observations.push({
27
+ category: 'tool_usage',
28
+ event_type: 'trade:regime_stats',
29
+ metrics: { regime: r.regime, count: r.cnt, wins: r.wins, win_rate: r.cnt > 0 ? r.wins / r.cnt : 0 },
30
+ });
31
+ }
32
+ // Rule confidence distribution
33
+ const rules = safeAll(db, `SELECT id, pattern, confidence, COALESCE(win_rate, 0) as win_rate FROM rules WHERE updated_at > ?`, [isoFromTs(since)]);
34
+ for (const r of rules) {
35
+ observations.push({
36
+ category: 'query_quality',
37
+ event_type: 'rule:confidence',
38
+ metrics: { rule_id: r.id, pattern: r.pattern, confidence: r.confidence, win_rate: r.win_rate },
39
+ });
40
+ }
41
+ // Chain/streak patterns
42
+ const chains = safeAll(db, `SELECT pair, type, length FROM chains WHERE created_at > ?`, [isoFromTs(since)]);
43
+ for (const c of chains) {
44
+ observations.push({
45
+ category: 'tool_usage',
46
+ event_type: 'chain:streak',
47
+ metrics: { pair: c.pair, type: c.type, length: c.length },
48
+ });
49
+ }
50
+ return observations;
51
+ }
52
+ mineCausalEvents(db, since) {
53
+ const events = [];
54
+ // Individual trades as causal events
55
+ const trades = safeAll(db, `SELECT id, pair, win, COALESCE(profit, 0) as profit, COALESCE(regime, 'unknown') as regime, fingerprint
56
+ FROM trades WHERE created_at > ? ORDER BY created_at LIMIT 500`, [isoFromTs(since)]);
57
+ for (const t of trades) {
58
+ events.push({
59
+ source: 'trading-brain',
60
+ type: t.win ? 'trade:win' : 'trade:loss',
61
+ data: { tradeId: t.id, pair: t.pair, profit: t.profit, regime: t.regime, fingerprint: t.fingerprint },
62
+ });
63
+ }
64
+ // Rule learning events
65
+ const rules = safeAll(db, `SELECT id, pattern, confidence FROM rules WHERE created_at > ?`, [isoFromTs(since)]);
66
+ for (const r of rules) {
67
+ events.push({
68
+ source: 'trading-brain',
69
+ type: 'rule:learned',
70
+ data: { ruleId: r.id, pattern: r.pattern, confidence: r.confidence },
71
+ });
72
+ }
73
+ return events;
74
+ }
75
+ mineMetrics(db, since) {
76
+ const metrics = [];
77
+ // Overall win rate
78
+ const winRate = safeGet(db, `SELECT COUNT(*) as total, SUM(CASE WHEN win = 1 THEN 1 ELSE 0 END) as wins FROM trades WHERE created_at > ?`, [isoFromTs(since)]);
79
+ if (winRate && winRate.total > 0) {
80
+ metrics.push({ name: 'win_rate', value: winRate.wins / winRate.total });
81
+ metrics.push({ name: 'trade_count', value: winRate.total });
82
+ }
83
+ // Average profit per trade
84
+ const profit = safeGet(db, `SELECT AVG(COALESCE(profit, 0)) as avg_profit FROM trades WHERE created_at > ?`, [isoFromTs(since)]);
85
+ if (profit?.avg_profit != null) {
86
+ metrics.push({ name: 'avg_profit', value: profit.avg_profit });
87
+ }
88
+ // Average rule confidence
89
+ const ruleConf = safeGet(db, `SELECT AVG(confidence) as avg_confidence FROM rules WHERE confidence IS NOT NULL AND updated_at > ?`, [isoFromTs(since)]);
90
+ if (ruleConf?.avg_confidence != null) {
91
+ metrics.push({ name: 'avg_rule_confidence', value: ruleConf.avg_confidence });
92
+ }
93
+ // Max streak length
94
+ const maxStreak = safeGet(db, `SELECT MAX(length) as max_length FROM chains WHERE created_at > ?`, [isoFromTs(since)]);
95
+ if (maxStreak?.max_length != null) {
96
+ metrics.push({ name: 'max_streak_length', value: maxStreak.max_length });
97
+ }
98
+ // Calibration score
99
+ const calibration = safeGet(db, `SELECT overall_accuracy FROM calibration ORDER BY updated_at DESC LIMIT 1`, []);
100
+ if (calibration?.overall_accuracy != null) {
101
+ metrics.push({ name: 'calibration_accuracy', value: calibration.overall_accuracy });
102
+ }
103
+ return metrics;
104
+ }
105
+ mineHypothesisObservations(db, since) {
106
+ const observations = [];
107
+ // Trade wins/losses per pair
108
+ const trades = safeAll(db, `SELECT pair, win, COUNT(*) as cnt FROM trades WHERE created_at > ? GROUP BY pair, win`, [isoFromTs(since)]);
109
+ for (const t of trades) {
110
+ observations.push({
111
+ source: 'trading-brain',
112
+ type: t.win ? 'trade:win' : 'trade:loss',
113
+ value: t.cnt,
114
+ metadata: { pair: t.pair },
115
+ });
116
+ }
117
+ // Chain detections
118
+ const chains = safeAll(db, `SELECT pair, type, length FROM chains WHERE created_at > ?`, [isoFromTs(since)]);
119
+ for (const c of chains) {
120
+ observations.push({
121
+ source: 'trading-brain',
122
+ type: 'chain:detected',
123
+ value: c.length,
124
+ metadata: { pair: c.pair, streakType: c.type },
125
+ });
126
+ }
127
+ return observations;
128
+ }
129
+ mineCrossDomainEvents(db, since) {
130
+ const events = [];
131
+ // Trade batch summary for cross-domain
132
+ const summary = safeGet(db, `SELECT COUNT(*) as total, SUM(CASE WHEN win = 1 THEN 1 ELSE 0 END) as wins,
133
+ SUM(COALESCE(profit, 0)) as total_profit
134
+ FROM trades WHERE created_at > ?`, [isoFromTs(since)]);
135
+ if (summary && summary.total > 0) {
136
+ events.push({
137
+ brain: 'trading-brain',
138
+ eventType: 'trade:batch',
139
+ data: { count: summary.total, wins: summary.wins, win_rate: summary.wins / summary.total, total_profit: summary.total_profit },
140
+ });
141
+ }
142
+ return events;
143
+ }
144
+ }
145
+ // ── Helpers ─────────────────────────────────────────────
146
+ function isoFromTs(ts) {
147
+ return ts > 0 ? new Date(ts).toISOString() : '1970-01-01T00:00:00.000Z';
148
+ }
149
+ function safeAll(db, sql, params) {
150
+ try {
151
+ return db.prepare(sql).all(...params);
152
+ }
153
+ catch {
154
+ return [];
155
+ }
156
+ }
157
+ function safeGet(db, sql, params) {
158
+ try {
159
+ return db.prepare(sql).get(...params);
160
+ }
161
+ catch {
162
+ return undefined;
163
+ }
164
+ }
165
+ //# sourceMappingURL=trading-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trading-adapter.js","sourceRoot":"","sources":["../../../src/research/adapters/trading-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ import type Database from 'better-sqlite3';
2
+ import type { SelfObserver } from './self-observer.js';
3
+ import type { AnomalyDetective } from './anomaly-detective.js';
4
+ import type { CrossDomainEngine } from './cross-domain-engine.js';
5
+ import type { CausalGraph } from '../causal/engine.js';
6
+ import type { HypothesisEngine } from '../hypothesis/engine.js';
7
+ export interface MinedObservation {
8
+ category: 'tool_usage' | 'query_quality' | 'resolution_rate' | 'latency' | 'cross_brain';
9
+ event_type: string;
10
+ metrics: Record<string, unknown>;
11
+ }
12
+ export interface MinedCausalEvent {
13
+ source: string;
14
+ type: string;
15
+ data?: unknown;
16
+ }
17
+ export interface MinedMetric {
18
+ name: string;
19
+ value: number;
20
+ }
21
+ export interface MinedHypothesisObservation {
22
+ source: string;
23
+ type: string;
24
+ value: number;
25
+ metadata?: Record<string, unknown>;
26
+ }
27
+ export interface MinedCrossDomainEvent {
28
+ brain: string;
29
+ eventType: string;
30
+ data?: Record<string, unknown>;
31
+ }
32
+ export interface MineResult {
33
+ observations: MinedObservation[];
34
+ causalEvents: MinedCausalEvent[];
35
+ metrics: MinedMetric[];
36
+ hypothesisObservations: MinedHypothesisObservation[];
37
+ crossDomainEvents: MinedCrossDomainEvent[];
38
+ }
39
+ export interface DataMinerAdapter {
40
+ /** Human-readable name for logging. */
41
+ readonly name: string;
42
+ /** Mine observations for SelfObserver from domain tables. */
43
+ mineObservations(db: Database.Database, since: number): MinedObservation[];
44
+ /** Mine causal events for CausalGraph from domain tables. */
45
+ mineCausalEvents(db: Database.Database, since: number): MinedCausalEvent[];
46
+ /** Mine metric values for AnomalyDetective from domain tables. */
47
+ mineMetrics(db: Database.Database, since: number): MinedMetric[];
48
+ /** Mine observations for HypothesisEngine from domain tables. */
49
+ mineHypothesisObservations(db: Database.Database, since: number): MinedHypothesisObservation[];
50
+ /** Mine cross-domain events for CrossDomainEngine from domain tables. */
51
+ mineCrossDomainEvents(db: Database.Database, since: number): MinedCrossDomainEvent[];
52
+ }
53
+ export interface DataMinerEngines {
54
+ selfObserver: SelfObserver;
55
+ anomalyDetective: AnomalyDetective;
56
+ crossDomain: CrossDomainEngine;
57
+ causalGraph?: CausalGraph;
58
+ hypothesisEngine?: HypothesisEngine;
59
+ }
60
+ export interface DataMinerState {
61
+ last_mined_at: number;
62
+ bootstrap_complete: boolean;
63
+ total_observations_mined: number;
64
+ total_causal_events_mined: number;
65
+ total_metrics_mined: number;
66
+ }
67
+ export declare function runDataMinerMigration(db: Database.Database): void;
68
+ export declare class DataMiner {
69
+ private db;
70
+ private adapter;
71
+ private engines;
72
+ private log;
73
+ private state;
74
+ constructor(db: Database.Database, adapter: DataMinerAdapter, engines: DataMinerEngines);
75
+ /** Bootstrap: scan ALL historical data and feed into engines. Only runs once. */
76
+ bootstrap(): void;
77
+ /** Incremental mine: fetch new data since last run and feed into engines. */
78
+ mine(): void;
79
+ /** Get current miner state. */
80
+ getState(): DataMinerState;
81
+ private mineFrom;
82
+ private loadState;
83
+ private saveState;
84
+ }
@@ -0,0 +1,174 @@
1
+ import { getLogger } from '../utils/logger.js';
2
+ // ── Migration ───────────────────────────────────────────
3
+ export function runDataMinerMigration(db) {
4
+ db.exec(`
5
+ CREATE TABLE IF NOT EXISTS data_miner_state (
6
+ id INTEGER PRIMARY KEY CHECK (id = 1),
7
+ last_mined_at INTEGER NOT NULL DEFAULT 0,
8
+ bootstrap_complete INTEGER NOT NULL DEFAULT 0,
9
+ total_observations_mined INTEGER NOT NULL DEFAULT 0,
10
+ total_causal_events_mined INTEGER NOT NULL DEFAULT 0,
11
+ total_metrics_mined INTEGER NOT NULL DEFAULT 0,
12
+ updated_at TEXT DEFAULT (datetime('now'))
13
+ );
14
+ INSERT OR IGNORE INTO data_miner_state (id) VALUES (1);
15
+ `);
16
+ }
17
+ // ── DataMiner ───────────────────────────────────────────
18
+ export class DataMiner {
19
+ db;
20
+ adapter;
21
+ engines;
22
+ log = getLogger();
23
+ state;
24
+ constructor(db, adapter, engines) {
25
+ this.db = db;
26
+ this.adapter = adapter;
27
+ this.engines = engines;
28
+ runDataMinerMigration(db);
29
+ this.state = this.loadState();
30
+ }
31
+ /** Bootstrap: scan ALL historical data and feed into engines. Only runs once. */
32
+ bootstrap() {
33
+ if (this.state.bootstrap_complete) {
34
+ this.log.info(`[data-miner] Bootstrap already complete for ${this.adapter.name}`);
35
+ return;
36
+ }
37
+ this.log.info(`[data-miner] Bootstrapping ${this.adapter.name} — scanning all historical data...`);
38
+ const start = Date.now();
39
+ // Mine everything from epoch
40
+ const result = this.mineFrom(0);
41
+ this.state.bootstrap_complete = true;
42
+ this.state.last_mined_at = Date.now();
43
+ this.saveState();
44
+ const duration = Date.now() - start;
45
+ this.log.info(`[data-miner] Bootstrap complete for ${this.adapter.name} in ${duration}ms — ` +
46
+ `${result.observations} observations, ${result.causalEvents} causal events, ` +
47
+ `${result.metrics} metrics, ${result.hypothesisObs} hypothesis observations, ` +
48
+ `${result.crossDomain} cross-domain events`);
49
+ }
50
+ /** Incremental mine: fetch new data since last run and feed into engines. */
51
+ mine() {
52
+ const since = this.state.last_mined_at;
53
+ const now = Date.now();
54
+ const result = this.mineFrom(since);
55
+ this.state.last_mined_at = now;
56
+ this.saveState();
57
+ if (result.total > 0) {
58
+ this.log.info(`[data-miner] Mined ${result.total} items from ${this.adapter.name} ` +
59
+ `(obs: ${result.observations}, causal: ${result.causalEvents}, ` +
60
+ `metrics: ${result.metrics}, hypo: ${result.hypothesisObs}, cross: ${result.crossDomain})`);
61
+ }
62
+ }
63
+ /** Get current miner state. */
64
+ getState() {
65
+ return { ...this.state };
66
+ }
67
+ // ── Internal ─────────────────────────────────────────
68
+ mineFrom(since) {
69
+ let observations = 0;
70
+ let causalEvents = 0;
71
+ let metrics = 0;
72
+ let hypothesisObs = 0;
73
+ let crossDomain = 0;
74
+ // 1. Mine observations → SelfObserver
75
+ try {
76
+ const obs = this.adapter.mineObservations(this.db, since);
77
+ for (const o of obs) {
78
+ this.engines.selfObserver.record({
79
+ category: o.category,
80
+ event_type: o.event_type,
81
+ metrics: o.metrics,
82
+ });
83
+ }
84
+ observations = obs.length;
85
+ this.state.total_observations_mined += observations;
86
+ }
87
+ catch (err) {
88
+ this.log.error(`[data-miner] Error mining observations: ${err.message}`);
89
+ }
90
+ // 2. Mine causal events → CausalGraph
91
+ try {
92
+ const events = this.adapter.mineCausalEvents(this.db, since);
93
+ if (this.engines.causalGraph) {
94
+ for (const e of events) {
95
+ this.engines.causalGraph.recordEvent(e.source, e.type, e.data);
96
+ }
97
+ }
98
+ causalEvents = events.length;
99
+ this.state.total_causal_events_mined += causalEvents;
100
+ }
101
+ catch (err) {
102
+ this.log.error(`[data-miner] Error mining causal events: ${err.message}`);
103
+ }
104
+ // 3. Mine metrics → AnomalyDetective
105
+ try {
106
+ const m = this.adapter.mineMetrics(this.db, since);
107
+ for (const metric of m) {
108
+ this.engines.anomalyDetective.recordMetric(metric.name, metric.value);
109
+ }
110
+ metrics = m.length;
111
+ }
112
+ catch (err) {
113
+ this.log.error(`[data-miner] Error mining metrics: ${err.message}`);
114
+ }
115
+ // 4. Mine hypothesis observations → HypothesisEngine
116
+ try {
117
+ const hypo = this.adapter.mineHypothesisObservations(this.db, since);
118
+ if (this.engines.hypothesisEngine) {
119
+ for (const h of hypo) {
120
+ this.engines.hypothesisEngine.observe({
121
+ source: h.source,
122
+ type: h.type,
123
+ value: h.value,
124
+ timestamp: Date.now(),
125
+ metadata: h.metadata,
126
+ });
127
+ }
128
+ }
129
+ hypothesisObs = hypo.length;
130
+ }
131
+ catch (err) {
132
+ this.log.error(`[data-miner] Error mining hypothesis observations: ${err.message}`);
133
+ }
134
+ // 5. Mine cross-domain events → CrossDomainEngine
135
+ try {
136
+ const cd = this.adapter.mineCrossDomainEvents(this.db, since);
137
+ for (const c of cd) {
138
+ this.engines.crossDomain.recordEvent(c.brain, c.eventType, c.data);
139
+ }
140
+ crossDomain = cd.length;
141
+ }
142
+ catch (err) {
143
+ this.log.error(`[data-miner] Error mining cross-domain events: ${err.message}`);
144
+ }
145
+ const total = observations + causalEvents + metrics + hypothesisObs + crossDomain;
146
+ return { observations, causalEvents, metrics, hypothesisObs, crossDomain, total };
147
+ }
148
+ loadState() {
149
+ const row = this.db.prepare('SELECT * FROM data_miner_state WHERE id = 1').get();
150
+ if (!row) {
151
+ return { last_mined_at: 0, bootstrap_complete: false, total_observations_mined: 0, total_causal_events_mined: 0, total_metrics_mined: 0 };
152
+ }
153
+ return {
154
+ last_mined_at: row.last_mined_at,
155
+ bootstrap_complete: row.bootstrap_complete === 1,
156
+ total_observations_mined: row.total_observations_mined,
157
+ total_causal_events_mined: row.total_causal_events_mined,
158
+ total_metrics_mined: row.total_metrics_mined,
159
+ };
160
+ }
161
+ saveState() {
162
+ this.db.prepare(`
163
+ UPDATE data_miner_state SET
164
+ last_mined_at = ?,
165
+ bootstrap_complete = ?,
166
+ total_observations_mined = ?,
167
+ total_causal_events_mined = ?,
168
+ total_metrics_mined = ?,
169
+ updated_at = datetime('now')
170
+ WHERE id = 1
171
+ `).run(this.state.last_mined_at, this.state.bootstrap_complete ? 1 : 0, this.state.total_observations_mined, this.state.total_causal_events_mined, this.state.total_metrics_mined);
172
+ }
173
+ }
174
+ //# sourceMappingURL=data-miner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-miner.js","sourceRoot":"","sources":["../../src/research/data-miner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import type Database from 'better-sqlite3';
2
+ import { SelfObserver } from './self-observer.js';
3
+ import { AdaptiveStrategyEngine } from './adaptive-strategy.js';
4
+ import { ExperimentEngine } from './experiment-engine.js';
5
+ import { CrossDomainEngine } from './cross-domain-engine.js';
6
+ import { CounterfactualEngine } from './counterfactual-engine.js';
7
+ import { KnowledgeDistiller } from './knowledge-distiller.js';
8
+ import { ResearchAgendaEngine } from './agenda-engine.js';
9
+ import { AnomalyDetective } from './anomaly-detective.js';
10
+ import { ResearchJournal } from './journal.js';
11
+ import type { CausalGraph } from '../causal/engine.js';
12
+ import type { ResearchCycleReport } from './autonomous-scheduler.js';
13
+ import type { DataMiner } from './data-miner.js';
14
+ export interface ResearchOrchestratorConfig {
15
+ brainName: string;
16
+ /** Feedback loop interval in ms. Default: 300_000 (5 min) */
17
+ feedbackIntervalMs?: number;
18
+ /** Knowledge distillation every N cycles. Default: 5 */
19
+ distillEvery?: number;
20
+ /** Research agenda regeneration every N cycles. Default: 3 */
21
+ agendaEvery?: number;
22
+ /** Journal reflection every N cycles. Default: 10 */
23
+ reflectEvery?: number;
24
+ }
25
+ export declare class ResearchOrchestrator {
26
+ readonly selfObserver: SelfObserver;
27
+ readonly adaptiveStrategy: AdaptiveStrategyEngine;
28
+ readonly experimentEngine: ExperimentEngine;
29
+ readonly crossDomain: CrossDomainEngine;
30
+ readonly counterfactual: CounterfactualEngine;
31
+ readonly knowledgeDistiller: KnowledgeDistiller;
32
+ readonly researchAgenda: ResearchAgendaEngine;
33
+ readonly anomalyDetective: AnomalyDetective;
34
+ readonly journal: ResearchJournal;
35
+ private dataMiner;
36
+ private brainName;
37
+ private feedbackTimer;
38
+ private cycleCount;
39
+ private distillEvery;
40
+ private agendaEvery;
41
+ private reflectEvery;
42
+ private log;
43
+ constructor(db: Database.Database, config: ResearchOrchestratorConfig, causalGraph?: CausalGraph);
44
+ /** Set the DataMiner instance for DB-driven engine feeding. */
45
+ setDataMiner(miner: DataMiner): void;
46
+ /** Start the autonomous feedback loop timer. */
47
+ start(intervalMs?: number): void;
48
+ /** Stop the feedback loop. */
49
+ stop(): void;
50
+ /**
51
+ * Feed a domain event from the brain's EventBus.
52
+ * Routes to: SelfObserver, AnomalyDetective, CrossDomain.
53
+ */
54
+ onEvent(eventType: string, data?: Record<string, unknown>): void;
55
+ /**
56
+ * Feed a cross-brain event from CrossBrainSubscription.
57
+ * Routes to: CrossDomainEngine, AnomalyDetective.
58
+ */
59
+ onCrossBrainEvent(sourceBrain: string, eventType: string, data?: Record<string, unknown>): void;
60
+ /**
61
+ * Hook into AutonomousResearchScheduler cycle completion.
62
+ * Records discoveries in journal and feeds metrics to anomaly detection.
63
+ */
64
+ onResearchCycleComplete(report: ResearchCycleReport): void;
65
+ /**
66
+ * Run one autonomous feedback cycle.
67
+ * This is where the engines talk to each other.
68
+ */
69
+ runFeedbackCycle(): void;
70
+ /** Get a comprehensive research summary for dashboards/API. */
71
+ getSummary(): Record<string, unknown>;
72
+ }