@timmeck/brain-core 2.16.0 → 2.17.1

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/codegen/code-generator.d.ts +42 -0
  2. package/dist/codegen/code-generator.js +225 -0
  3. package/dist/codegen/code-generator.js.map +1 -0
  4. package/dist/codegen/code-miner.d.ts +45 -0
  5. package/dist/codegen/code-miner.js +243 -0
  6. package/dist/codegen/code-miner.js.map +1 -0
  7. package/dist/codegen/context-builder.d.ts +15 -0
  8. package/dist/codegen/context-builder.js +137 -0
  9. package/dist/codegen/context-builder.js.map +1 -0
  10. package/dist/codegen/index.d.ts +5 -0
  11. package/dist/codegen/index.js +5 -0
  12. package/dist/codegen/index.js.map +1 -0
  13. package/dist/codegen/pattern-extractor.d.ts +25 -0
  14. package/dist/codegen/pattern-extractor.js +222 -0
  15. package/dist/codegen/pattern-extractor.js.map +1 -0
  16. package/dist/codegen/types.d.ts +127 -0
  17. package/dist/codegen/types.js +3 -0
  18. package/dist/codegen/types.js.map +1 -0
  19. package/dist/index.d.ts +6 -1
  20. package/dist/index.js +6 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/prediction/types.d.ts +1 -1
  23. package/dist/research/adapters/index.d.ts +1 -0
  24. package/dist/research/adapters/index.js +1 -0
  25. package/dist/research/adapters/index.js.map +1 -1
  26. package/dist/research/adapters/scanner-adapter.d.ts +14 -0
  27. package/dist/research/adapters/scanner-adapter.js +209 -0
  28. package/dist/research/adapters/scanner-adapter.js.map +1 -0
  29. package/dist/research/data-miner.d.ts +3 -1
  30. package/dist/research/data-miner.js +79 -69
  31. package/dist/research/data-miner.js.map +1 -1
  32. package/dist/research/research-orchestrator.d.ts +9 -1
  33. package/dist/research/research-orchestrator.js +41 -2
  34. package/dist/research/research-orchestrator.js.map +1 -1
  35. package/package.json +1 -1
@@ -1,4 +1,5 @@
1
1
  export { BrainDataMinerAdapter } from './brain-adapter.js';
2
2
  export { TradingDataMinerAdapter } from './trading-adapter.js';
3
3
  export { MarketingDataMinerAdapter } from './marketing-adapter.js';
4
+ export { ScannerDataMinerAdapter } from './scanner-adapter.js';
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/research/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/research/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type Database from 'better-sqlite3';
2
+ import type { DataMinerAdapter, MinedObservation, MinedCausalEvent, MinedMetric, MinedHypothesisObservation, MinedCrossDomainEvent } from '../data-miner.js';
3
+ /**
4
+ * DataMiner adapter for the Signal Scanner.
5
+ * Mines: scanned_repos, crypto_tokens.
6
+ */
7
+ export declare class ScannerDataMinerAdapter implements DataMinerAdapter {
8
+ readonly name = "scanner";
9
+ mineObservations(db: Database.Database, since: number): MinedObservation[];
10
+ mineCausalEvents(db: Database.Database, since: number): MinedCausalEvent[];
11
+ mineMetrics(db: Database.Database, since: number): MinedMetric[];
12
+ mineHypothesisObservations(db: Database.Database, since: number): MinedHypothesisObservation[];
13
+ mineCrossDomainEvents(db: Database.Database, since: number): MinedCrossDomainEvent[];
14
+ }
@@ -0,0 +1,209 @@
1
+ /**
2
+ * DataMiner adapter for the Signal Scanner.
3
+ * Mines: scanned_repos, crypto_tokens.
4
+ */
5
+ export class ScannerDataMinerAdapter {
6
+ name = 'scanner';
7
+ mineObservations(db, since) {
8
+ const observations = [];
9
+ // Language distribution
10
+ const languages = safeAll(db, `SELECT language, COUNT(*) as cnt, AVG(signal_score) as avg_score, AVG(current_stars) as avg_stars
11
+ FROM scanned_repos WHERE last_scanned_at > ? AND language IS NOT NULL GROUP BY language`, [isoFromTs(since)]);
12
+ for (const l of languages) {
13
+ observations.push({
14
+ category: 'tool_usage',
15
+ event_type: 'repo:language_stats',
16
+ metrics: { language: l.language, count: l.cnt, avg_score: l.avg_score, avg_stars: l.avg_stars },
17
+ });
18
+ }
19
+ // Signal level distribution
20
+ const levels = safeAll(db, `SELECT signal_level, COUNT(*) as cnt, AVG(signal_score) as avg_score
21
+ FROM scanned_repos WHERE last_scanned_at > ? GROUP BY signal_level`, [isoFromTs(since)]);
22
+ for (const l of levels) {
23
+ observations.push({
24
+ category: 'resolution_rate',
25
+ event_type: 'repo:level_stats',
26
+ metrics: { signal_level: l.signal_level, count: l.cnt, avg_score: l.avg_score },
27
+ });
28
+ }
29
+ // Phase distribution
30
+ const phases = safeAll(db, `SELECT phase, COUNT(*) as cnt, AVG(current_stars) as avg_stars
31
+ FROM scanned_repos WHERE last_scanned_at > ? GROUP BY phase`, [isoFromTs(since)]);
32
+ for (const p of phases) {
33
+ observations.push({
34
+ category: 'tool_usage',
35
+ event_type: 'repo:phase_stats',
36
+ metrics: { phase: p.phase, count: p.cnt, avg_stars: p.avg_stars },
37
+ });
38
+ }
39
+ // Crypto market stats
40
+ const crypto = safeGet(db, `SELECT COUNT(*) as cnt,
41
+ AVG(price_change_24h) as avg_change,
42
+ SUM(CASE WHEN ABS(price_change_24h) > 10 THEN 1 ELSE 0 END) as movers
43
+ FROM crypto_tokens WHERE last_scanned_at > ?`, [isoFromTs(since)]);
44
+ if (crypto && crypto.cnt > 0) {
45
+ observations.push({
46
+ category: 'cross_brain',
47
+ event_type: 'crypto:market_stats',
48
+ metrics: { count: crypto.cnt, avg_price_change: crypto.avg_change ?? 0, movers: crypto.movers ?? 0 },
49
+ });
50
+ }
51
+ return observations;
52
+ }
53
+ mineCausalEvents(db, since) {
54
+ const events = [];
55
+ // Velocity spikes — repos with star_velocity_24h > 50
56
+ const velocitySpikes = safeAll(db, `SELECT id, full_name, star_velocity_24h, signal_score
57
+ FROM scanned_repos WHERE last_scanned_at > ? AND star_velocity_24h > 50 LIMIT 200`, [isoFromTs(since)]);
58
+ for (const r of velocitySpikes) {
59
+ events.push({
60
+ source: 'scanner',
61
+ type: 'repo:velocity_spike',
62
+ data: { repoId: r.id, fullName: r.full_name, velocity: r.star_velocity_24h, score: r.signal_score },
63
+ });
64
+ }
65
+ // High score repos — signal_score >= 55
66
+ const highScore = safeAll(db, `SELECT id, full_name, signal_score, signal_level
67
+ FROM scanned_repos WHERE last_scanned_at > ? AND signal_score >= 55 LIMIT 200`, [isoFromTs(since)]);
68
+ for (const r of highScore) {
69
+ events.push({
70
+ source: 'scanner',
71
+ type: 'repo:high_score',
72
+ data: { repoId: r.id, fullName: r.full_name, score: r.signal_score, level: r.signal_level },
73
+ });
74
+ }
75
+ // Crypto price moves — ABS(price_change_24h) > 10
76
+ const priceMoves = safeAll(db, `SELECT id, symbol, name, price_change_24h
77
+ FROM crypto_tokens WHERE last_scanned_at > ? AND ABS(price_change_24h) > 10 LIMIT 100`, [isoFromTs(since)]);
78
+ for (const c of priceMoves) {
79
+ events.push({
80
+ source: 'scanner',
81
+ type: 'crypto:price_move',
82
+ data: { tokenId: c.id, symbol: c.symbol, name: c.name, priceChange24h: c.price_change_24h },
83
+ });
84
+ }
85
+ return events;
86
+ }
87
+ mineMetrics(db, since) {
88
+ const metrics = [];
89
+ const totals = safeGet(db, `SELECT COUNT(*) as total,
90
+ SUM(CASE WHEN signal_level = 'breakout' THEN 1 ELSE 0 END) as breakouts,
91
+ SUM(CASE WHEN signal_level = 'signal' THEN 1 ELSE 0 END) as signals,
92
+ AVG(signal_score) as avg_score,
93
+ AVG(star_velocity_24h) as avg_velocity
94
+ FROM scanned_repos WHERE last_scanned_at > ?`, [isoFromTs(since)]);
95
+ if (totals) {
96
+ metrics.push({ name: 'scanner_total_repos', value: totals.total });
97
+ metrics.push({ name: 'scanner_breakout_count', value: totals.breakouts ?? 0 });
98
+ metrics.push({ name: 'scanner_signal_count', value: totals.signals ?? 0 });
99
+ metrics.push({ name: 'scanner_avg_score', value: totals.avg_score ?? 0 });
100
+ metrics.push({ name: 'scanner_avg_velocity', value: totals.avg_velocity ?? 0 });
101
+ }
102
+ const cryptoAvg = safeGet(db, `SELECT AVG(price_change_24h) as avg_change FROM crypto_tokens WHERE last_scanned_at > ?`, [isoFromTs(since)]);
103
+ if (cryptoAvg?.avg_change != null) {
104
+ metrics.push({ name: 'scanner_crypto_avg_change', value: cryptoAvg.avg_change });
105
+ }
106
+ return metrics;
107
+ }
108
+ mineHypothesisObservations(db, since) {
109
+ const observations = [];
110
+ // Repos by language
111
+ const byLanguage = safeAll(db, `SELECT language, COUNT(*) as cnt, AVG(signal_score) as avg_score
112
+ FROM scanned_repos WHERE last_scanned_at > ? AND language IS NOT NULL GROUP BY language`, [isoFromTs(since)]);
113
+ for (const l of byLanguage) {
114
+ observations.push({
115
+ source: 'scanner',
116
+ type: 'repo:by_language',
117
+ value: l.cnt,
118
+ metadata: { language: l.language, avg_score: l.avg_score },
119
+ });
120
+ }
121
+ // Repos by phase
122
+ const byPhase = safeAll(db, `SELECT phase, COUNT(*) as cnt, AVG(current_stars) as avg_stars
123
+ FROM scanned_repos WHERE last_scanned_at > ? GROUP BY phase`, [isoFromTs(since)]);
124
+ for (const p of byPhase) {
125
+ observations.push({
126
+ source: 'scanner',
127
+ type: 'repo:by_phase',
128
+ value: p.cnt,
129
+ metadata: { phase: p.phase, avg_stars: p.avg_stars },
130
+ });
131
+ }
132
+ // Crypto by signal level
133
+ const byLevel = safeAll(db, `SELECT signal_level, COUNT(*) as cnt
134
+ FROM crypto_tokens WHERE last_scanned_at > ? GROUP BY signal_level`, [isoFromTs(since)]);
135
+ for (const l of byLevel) {
136
+ observations.push({
137
+ source: 'scanner',
138
+ type: 'crypto:by_level',
139
+ value: l.cnt,
140
+ metadata: { level: l.signal_level },
141
+ });
142
+ }
143
+ return observations;
144
+ }
145
+ mineCrossDomainEvents(db, since) {
146
+ const events = [];
147
+ // Repo batch summary
148
+ const repoBatch = safeGet(db, `SELECT COUNT(*) as total,
149
+ SUM(CASE WHEN signal_level = 'breakout' THEN 1 ELSE 0 END) as breakouts,
150
+ SUM(CASE WHEN signal_level = 'signal' THEN 1 ELSE 0 END) as signals,
151
+ SUM(CASE WHEN signal_level = 'watch' THEN 1 ELSE 0 END) as watches,
152
+ AVG(signal_score) as avg_score
153
+ FROM scanned_repos WHERE last_scanned_at > ?`, [isoFromTs(since)]);
154
+ if (repoBatch && repoBatch.total > 0) {
155
+ const topLang = safeGet(db, `SELECT language FROM scanned_repos WHERE last_scanned_at > ? AND language IS NOT NULL
156
+ GROUP BY language ORDER BY COUNT(*) DESC LIMIT 1`, [isoFromTs(since)]);
157
+ events.push({
158
+ brain: 'scanner',
159
+ eventType: 'scanner:repo_batch',
160
+ data: {
161
+ total: repoBatch.total,
162
+ breakouts: repoBatch.breakouts ?? 0,
163
+ signals: repoBatch.signals ?? 0,
164
+ watches: repoBatch.watches ?? 0,
165
+ avg_score: repoBatch.avg_score ?? 0,
166
+ top_language: topLang?.language ?? 'unknown',
167
+ },
168
+ });
169
+ }
170
+ // Crypto batch summary
171
+ const cryptoBatch = safeGet(db, `SELECT COUNT(*) as total,
172
+ AVG(price_change_24h) as avg_change_24h,
173
+ SUM(CASE WHEN ABS(price_change_24h) > 10 THEN 1 ELSE 0 END) as movers_count
174
+ FROM crypto_tokens WHERE last_scanned_at > ?`, [isoFromTs(since)]);
175
+ if (cryptoBatch && cryptoBatch.total > 0) {
176
+ events.push({
177
+ brain: 'scanner',
178
+ eventType: 'scanner:crypto_batch',
179
+ data: {
180
+ total: cryptoBatch.total,
181
+ avg_change_24h: cryptoBatch.avg_change_24h ?? 0,
182
+ movers_count: cryptoBatch.movers_count ?? 0,
183
+ },
184
+ });
185
+ }
186
+ return events;
187
+ }
188
+ }
189
+ // ── Helpers ─────────────────────────────────────────────
190
+ function isoFromTs(ts) {
191
+ return ts > 0 ? new Date(ts).toISOString() : '1970-01-01T00:00:00.000Z';
192
+ }
193
+ function safeAll(db, sql, params) {
194
+ try {
195
+ return db.prepare(sql).all(...params);
196
+ }
197
+ catch {
198
+ return [];
199
+ }
200
+ }
201
+ function safeGet(db, sql, params) {
202
+ try {
203
+ return db.prepare(sql).get(...params);
204
+ }
205
+ catch {
206
+ return undefined;
207
+ }
208
+ }
209
+ //# sourceMappingURL=scanner-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner-adapter.js","sourceRoot":"","sources":["../../../src/research/adapters/scanner-adapter.ts"],"names":[],"mappings":"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"}
@@ -67,11 +67,13 @@ export interface DataMinerState {
67
67
  export declare function runDataMinerMigration(db: Database.Database): void;
68
68
  export declare class DataMiner {
69
69
  private db;
70
- private adapter;
70
+ private adapters;
71
71
  private engines;
72
72
  private log;
73
73
  private state;
74
74
  constructor(db: Database.Database, adapter: DataMinerAdapter, engines: DataMinerEngines);
75
+ /** Register an additional adapter for mining. */
76
+ addAdapter(adapter: DataMinerAdapter): void;
75
77
  /** Bootstrap: scan ALL historical data and feed into engines. Only runs once. */
76
78
  bootstrap(): void;
77
79
  /** Incremental mine: fetch new data since last run and feed into engines. */
@@ -17,24 +17,31 @@ export function runDataMinerMigration(db) {
17
17
  // ── DataMiner ───────────────────────────────────────────
18
18
  export class DataMiner {
19
19
  db;
20
- adapter;
20
+ adapters;
21
21
  engines;
22
22
  log = getLogger();
23
23
  state;
24
24
  constructor(db, adapter, engines) {
25
25
  this.db = db;
26
- this.adapter = adapter;
26
+ this.adapters = [adapter];
27
27
  this.engines = engines;
28
28
  runDataMinerMigration(db);
29
29
  this.state = this.loadState();
30
30
  }
31
+ /** Register an additional adapter for mining. */
32
+ addAdapter(adapter) {
33
+ this.adapters.push(adapter);
34
+ this.log.info(`[data-miner] Added adapter: ${adapter.name}`);
35
+ }
31
36
  /** Bootstrap: scan ALL historical data and feed into engines. Only runs once. */
32
37
  bootstrap() {
33
38
  if (this.state.bootstrap_complete) {
34
- this.log.info(`[data-miner] Bootstrap already complete for ${this.adapter.name}`);
39
+ const names = this.adapters.map(a => a.name).join(', ');
40
+ this.log.info(`[data-miner] Bootstrap already complete for ${names}`);
35
41
  return;
36
42
  }
37
- this.log.info(`[data-miner] Bootstrapping ${this.adapter.name} — scanning all historical data...`);
43
+ const names = this.adapters.map(a => a.name).join(', ');
44
+ this.log.info(`[data-miner] Bootstrapping ${names} — scanning all historical data...`);
38
45
  const start = Date.now();
39
46
  // Mine everything from epoch
40
47
  const result = this.mineFrom(0);
@@ -42,7 +49,7 @@ export class DataMiner {
42
49
  this.state.last_mined_at = Date.now();
43
50
  this.saveState();
44
51
  const duration = Date.now() - start;
45
- this.log.info(`[data-miner] Bootstrap complete for ${this.adapter.name} in ${duration}ms — ` +
52
+ this.log.info(`[data-miner] Bootstrap complete for ${names} in ${duration}ms — ` +
46
53
  `${result.observations} observations, ${result.causalEvents} causal events, ` +
47
54
  `${result.metrics} metrics, ${result.hypothesisObs} hypothesis observations, ` +
48
55
  `${result.crossDomain} cross-domain events`);
@@ -55,7 +62,8 @@ export class DataMiner {
55
62
  this.state.last_mined_at = now;
56
63
  this.saveState();
57
64
  if (result.total > 0) {
58
- this.log.info(`[data-miner] Mined ${result.total} items from ${this.adapter.name} ` +
65
+ const names = this.adapters.map(a => a.name).join(', ');
66
+ this.log.info(`[data-miner] Mined ${result.total} items from ${names} ` +
59
67
  `(obs: ${result.observations}, causal: ${result.causalEvents}, ` +
60
68
  `metrics: ${result.metrics}, hypo: ${result.hypothesisObs}, cross: ${result.crossDomain})`);
61
69
  }
@@ -71,76 +79,78 @@ export class DataMiner {
71
79
  let metrics = 0;
72
80
  let hypothesisObs = 0;
73
81
  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
- });
82
+ for (const adapter of this.adapters) {
83
+ // 1. Mine observations → SelfObserver
84
+ try {
85
+ const obs = adapter.mineObservations(this.db, since);
86
+ for (const o of obs) {
87
+ this.engines.selfObserver.record({
88
+ category: o.category,
89
+ event_type: o.event_type,
90
+ metrics: o.metrics,
91
+ });
92
+ }
93
+ observations += obs.length;
94
+ this.state.total_observations_mined += obs.length;
83
95
  }
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
+ catch (err) {
97
+ this.log.error(`[data-miner] Error mining observations from ${adapter.name}: ${err.message}`);
98
+ }
99
+ // 2. Mine causal events → CausalGraph
100
+ try {
101
+ const events = adapter.mineCausalEvents(this.db, since);
102
+ if (this.engines.causalGraph) {
103
+ for (const e of events) {
104
+ this.engines.causalGraph.recordEvent(e.source, e.type, e.data);
105
+ }
96
106
  }
107
+ causalEvents += events.length;
108
+ this.state.total_causal_events_mined += events.length;
97
109
  }
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);
110
+ catch (err) {
111
+ this.log.error(`[data-miner] Error mining causal events from ${adapter.name}: ${err.message}`);
109
112
  }
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
- });
113
+ // 3. Mine metrics AnomalyDetective
114
+ try {
115
+ const m = adapter.mineMetrics(this.db, since);
116
+ for (const metric of m) {
117
+ this.engines.anomalyDetective.recordMetric(metric.name, metric.value);
127
118
  }
119
+ metrics += m.length;
128
120
  }
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);
121
+ catch (err) {
122
+ this.log.error(`[data-miner] Error mining metrics from ${adapter.name}: ${err.message}`);
123
+ }
124
+ // 4. Mine hypothesis observations → HypothesisEngine
125
+ try {
126
+ const hypo = adapter.mineHypothesisObservations(this.db, since);
127
+ if (this.engines.hypothesisEngine) {
128
+ for (const h of hypo) {
129
+ this.engines.hypothesisEngine.observe({
130
+ source: h.source,
131
+ type: h.type,
132
+ value: h.value,
133
+ timestamp: Date.now(),
134
+ metadata: h.metadata,
135
+ });
136
+ }
137
+ }
138
+ hypothesisObs += hypo.length;
139
+ }
140
+ catch (err) {
141
+ this.log.error(`[data-miner] Error mining hypothesis observations from ${adapter.name}: ${err.message}`);
142
+ }
143
+ // 5. Mine cross-domain events → CrossDomainEngine
144
+ try {
145
+ const cd = adapter.mineCrossDomainEvents(this.db, since);
146
+ for (const c of cd) {
147
+ this.engines.crossDomain.recordEvent(c.brain, c.eventType, c.data);
148
+ }
149
+ crossDomain += cd.length;
150
+ }
151
+ catch (err) {
152
+ this.log.error(`[data-miner] Error mining cross-domain events from ${adapter.name}: ${err.message}`);
139
153
  }
140
- crossDomain = cd.length;
141
- }
142
- catch (err) {
143
- this.log.error(`[data-miner] Error mining cross-domain events: ${err.message}`);
144
154
  }
145
155
  const total = observations + causalEvents + metrics + hypothesisObs + crossDomain;
146
156
  return { observations, causalEvents, metrics, hypothesisObs, crossDomain, total };
@@ -1 +1 @@
1
- {"version":3,"file":"data-miner.js","sourceRoot":"","sources":["../../src/research/data-miner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data-miner.js","sourceRoot":"","sources":["../../src/research/data-miner.ts"],"names":[],"mappings":"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"}
@@ -16,6 +16,8 @@ import type { DreamEngine } from '../dream/dream-engine.js';
16
16
  import type { ThoughtStream } from '../consciousness/thought-stream.js';
17
17
  import type { PredictionEngine } from '../prediction/prediction-engine.js';
18
18
  import type { SignalScanner } from '../scanner/signal-scanner.js';
19
+ import type { CodeGenerator } from '../codegen/code-generator.js';
20
+ import type { CodeMiner } from '../codegen/code-miner.js';
19
21
  import { AutoResponder } from './auto-responder.js';
20
22
  export interface ResearchOrchestratorConfig {
21
23
  brainName: string;
@@ -45,6 +47,8 @@ export declare class ResearchOrchestrator {
45
47
  private thoughtStream;
46
48
  private predictionEngine;
47
49
  private signalScanner;
50
+ private codeGenerator;
51
+ private codeMiner;
48
52
  private brainName;
49
53
  private feedbackTimer;
50
54
  private cycleCount;
@@ -65,6 +69,10 @@ export declare class ResearchOrchestrator {
65
69
  setThoughtStream(stream: ThoughtStream): void;
66
70
  /** Set the SignalScanner — feeds scan results into journal/predictions. */
67
71
  setSignalScanner(scanner: SignalScanner): void;
72
+ /** Set the CodeGenerator — autonomous code generation from brain knowledge. */
73
+ setCodeGenerator(generator: CodeGenerator): void;
74
+ /** Set the CodeMiner — mines repo contents from GitHub for pattern analysis. */
75
+ setCodeMiner(miner: CodeMiner): void;
68
76
  /** Set the PredictionEngine — wires journal into it. */
69
77
  setPredictionEngine(engine: PredictionEngine): void;
70
78
  /** Start the autonomous feedback loop timer. */
@@ -90,7 +98,7 @@ export declare class ResearchOrchestrator {
90
98
  * Run one autonomous feedback cycle.
91
99
  * This is where the engines talk to each other.
92
100
  */
93
- runFeedbackCycle(): void;
101
+ runFeedbackCycle(): Promise<void>;
94
102
  /** Analyze Brain's own state and generate concrete improvement suggestions.
95
103
  * Tracks suggestion history — if a suggestion repeats 3+ times without resolution,
96
104
  * Brain tries alternative strategies instead of repeating itself. */
@@ -31,6 +31,8 @@ export class ResearchOrchestrator {
31
31
  thoughtStream = null;
32
32
  predictionEngine = null;
33
33
  signalScanner = null;
34
+ codeGenerator = null;
35
+ codeMiner = null;
34
36
  brainName;
35
37
  feedbackTimer = null;
36
38
  cycleCount = 0;
@@ -80,6 +82,16 @@ export class ResearchOrchestrator {
80
82
  setSignalScanner(scanner) {
81
83
  this.signalScanner = scanner;
82
84
  }
85
+ /** Set the CodeGenerator — autonomous code generation from brain knowledge. */
86
+ setCodeGenerator(generator) {
87
+ this.codeGenerator = generator;
88
+ generator.setJournal(this.journal);
89
+ generator.setKnowledgeDistiller(this.knowledgeDistiller);
90
+ }
91
+ /** Set the CodeMiner — mines repo contents from GitHub for pattern analysis. */
92
+ setCodeMiner(miner) {
93
+ this.codeMiner = miner;
94
+ }
83
95
  /** Set the PredictionEngine — wires journal into it. */
84
96
  setPredictionEngine(engine) {
85
97
  this.predictionEngine = engine;
@@ -91,7 +103,7 @@ export class ResearchOrchestrator {
91
103
  return;
92
104
  this.feedbackTimer = setInterval(() => {
93
105
  try {
94
- this.runFeedbackCycle();
106
+ void this.runFeedbackCycle();
95
107
  }
96
108
  catch (err) {
97
109
  this.log.error('[orchestrator] Feedback cycle error', { error: err.message });
@@ -160,7 +172,7 @@ export class ResearchOrchestrator {
160
172
  * Run one autonomous feedback cycle.
161
173
  * This is where the engines talk to each other.
162
174
  */
163
- runFeedbackCycle() {
175
+ async runFeedbackCycle() {
164
176
  this.cycleCount++;
165
177
  const start = Date.now();
166
178
  const ts = this.thoughtStream;
@@ -445,6 +457,31 @@ export class ResearchOrchestrator {
445
457
  this.log.error(`[orchestrator] Scanner integration error: ${err.message}`);
446
458
  }
447
459
  }
460
+ // 15. CodeMiner: mine new repo contents (every 10 cycles)
461
+ if (this.codeMiner && this.cycleCount % 10 === 0) {
462
+ ts?.emit('code_miner', 'perceiving', 'Mining new repo contents...');
463
+ try {
464
+ const mineResult = await this.codeMiner.mine();
465
+ if (mineResult.mined > 0) {
466
+ ts?.emit('code_miner', 'discovering', `Mined ${mineResult.mined} new repos`, 'notable');
467
+ }
468
+ }
469
+ catch (err) {
470
+ this.log.error(`[orchestrator] CodeMiner error: ${err.message}`);
471
+ }
472
+ }
473
+ // 16. CodeGenerator: feed generation metrics into HypothesisEngine
474
+ if (this.codeGenerator) {
475
+ const codegenSummary = this.codeGenerator.getSummary();
476
+ if (codegenSummary.total_generations > 0) {
477
+ this.hypothesisEngine.observe({ source: this.brainName, type: 'codegen_total', value: codegenSummary.total_generations, timestamp: now });
478
+ this.hypothesisEngine.observe({ source: this.brainName, type: 'codegen_approval_rate', value: codegenSummary.approval_rate, timestamp: now });
479
+ if (this.predictionEngine) {
480
+ this.predictionEngine.recordMetric('codegen_generations', codegenSummary.total_generations, 'codegen');
481
+ this.predictionEngine.recordMetric('codegen_tokens', codegenSummary.total_tokens_used, 'codegen');
482
+ }
483
+ }
484
+ }
448
485
  const duration = Date.now() - start;
449
486
  ts?.emit('orchestrator', 'reflecting', `Feedback Cycle #${this.cycleCount} complete (${duration}ms)`);
450
487
  this.log.info(`[orchestrator] ─── Feedback Cycle #${this.cycleCount} complete (${duration}ms) ───`);
@@ -751,6 +788,8 @@ export class ResearchOrchestrator {
751
788
  autoResponder: this.autoResponder.getStatus(),
752
789
  hypotheses: this.hypothesisEngine.getSummary(),
753
790
  scanner: this.signalScanner?.getStatus() ?? null,
791
+ codeGenerator: this.codeGenerator?.getSummary() ?? null,
792
+ codeMiner: this.codeMiner?.getSummary() ?? null,
754
793
  };
755
794
  }
756
795
  }