@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.
- package/dist/dashboard/research-server.d.ts +11 -0
- package/dist/dashboard/research-server.js +47 -0
- package/dist/dashboard/research-server.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.js +16 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/research/adapters/brain-adapter.d.ts +14 -0
- package/dist/research/adapters/brain-adapter.js +161 -0
- package/dist/research/adapters/brain-adapter.js.map +1 -0
- package/dist/research/adapters/index.d.ts +3 -0
- package/dist/research/adapters/index.js +4 -0
- package/dist/research/adapters/index.js.map +1 -0
- package/dist/research/adapters/marketing-adapter.d.ts +15 -0
- package/dist/research/adapters/marketing-adapter.js +196 -0
- package/dist/research/adapters/marketing-adapter.js.map +1 -0
- package/dist/research/adapters/trading-adapter.d.ts +15 -0
- package/dist/research/adapters/trading-adapter.js +165 -0
- package/dist/research/adapters/trading-adapter.js.map +1 -0
- package/dist/research/data-miner.d.ts +84 -0
- package/dist/research/data-miner.js +174 -0
- package/dist/research/data-miner.js.map +1 -0
- package/dist/research/research-orchestrator.d.ts +72 -0
- package/dist/research/research-orchestrator.js +243 -0
- package/dist/research/research-orchestrator.js.map +1 -0
- package/package.json +1 -1
- package/research-dashboard.html +735 -0
|
@@ -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
|
+
}
|