@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.
- package/dist/codegen/code-generator.d.ts +42 -0
- package/dist/codegen/code-generator.js +225 -0
- package/dist/codegen/code-generator.js.map +1 -0
- package/dist/codegen/code-miner.d.ts +45 -0
- package/dist/codegen/code-miner.js +243 -0
- package/dist/codegen/code-miner.js.map +1 -0
- package/dist/codegen/context-builder.d.ts +15 -0
- package/dist/codegen/context-builder.js +137 -0
- package/dist/codegen/context-builder.js.map +1 -0
- package/dist/codegen/index.d.ts +5 -0
- package/dist/codegen/index.js +5 -0
- package/dist/codegen/index.js.map +1 -0
- package/dist/codegen/pattern-extractor.d.ts +25 -0
- package/dist/codegen/pattern-extractor.js +222 -0
- package/dist/codegen/pattern-extractor.js.map +1 -0
- package/dist/codegen/types.d.ts +127 -0
- package/dist/codegen/types.js +3 -0
- package/dist/codegen/types.js.map +1 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/prediction/types.d.ts +1 -1
- package/dist/research/adapters/index.d.ts +1 -0
- package/dist/research/adapters/index.js +1 -0
- package/dist/research/adapters/index.js.map +1 -1
- package/dist/research/adapters/scanner-adapter.d.ts +14 -0
- package/dist/research/adapters/scanner-adapter.js +209 -0
- package/dist/research/adapters/scanner-adapter.js.map +1 -0
- package/dist/research/data-miner.d.ts +3 -1
- package/dist/research/data-miner.js +79 -69
- package/dist/research/data-miner.js.map +1 -1
- package/dist/research/research-orchestrator.d.ts +9 -1
- package/dist/research/research-orchestrator.js +41 -2
- package/dist/research/research-orchestrator.js.map +1 -1
- 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":"AAGA;;;GAGG;AACH,MAAM,OAAO,uBAAuB;IACzB,IAAI,GAAG,SAAS,CAAC;IAE1B,gBAAgB,CAAC,EAAqB,EAAE,KAAa;QACnD,MAAM,YAAY,GAAuB,EAAE,CAAC;QAE5C,wBAAwB;QACxB,MAAM,SAAS,GAAG,OAAO,CACvB,EAAE,EACF;+FACyF,EACzF,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CACnB,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1B,YAAY,CAAC,IAAI,CAAC;gBAChB,QAAQ,EAAE,YAAY;gBACtB,UAAU,EAAE,qBAAqB;gBACjC,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE;aAChG,CAAC,CAAC;QACL,CAAC;QAED,4BAA4B;QAC5B,MAAM,MAAM,GAAG,OAAO,CACpB,EAAE,EACF;0EACoE,EACpE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CACnB,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,YAAY,CAAC,IAAI,CAAC;gBAChB,QAAQ,EAAE,iBAAiB;gBAC3B,UAAU,EAAE,kBAAkB;gBAC9B,OAAO,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE;aAChF,CAAC,CAAC;QACL,CAAC;QAED,qBAAqB;QACrB,MAAM,MAAM,GAAG,OAAO,CACpB,EAAE,EACF;mEAC6D,EAC7D,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CACnB,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,YAAY,CAAC,IAAI,CAAC;gBAChB,QAAQ,EAAE,YAAY;gBACtB,UAAU,EAAE,kBAAkB;gBAC9B,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE;aAClE,CAAC,CAAC;QACL,CAAC;QAED,sBAAsB;QACtB,MAAM,MAAM,GAAG,OAAO,CACpB,EAAE,EACF;;;oDAG8C,EAC9C,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CACnB,CAAC;QACF,IAAI,MAAM,IAAI,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;YAC7B,YAAY,CAAC,IAAI,CAAC;gBAChB,QAAQ,EAAE,aAAa;gBACvB,UAAU,EAAE,qBAAqB;gBACjC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,gBAAgB,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE;aACrG,CAAC,CAAC;QACL,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,gBAAgB,CAAC,EAAqB,EAAE,KAAa;QACnD,MAAM,MAAM,GAAuB,EAAE,CAAC;QAEtC,sDAAsD;QACtD,MAAM,cAAc,GAAG,OAAO,CAC5B,EAAE,EACF;yFACmF,EACnF,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CACnB,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,SAAS;gBACjB,IAAI,EAAE,qBAAqB;gBAC3B,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE;aACpG,CAAC,CAAC;QACL,CAAC;QAED,wCAAwC;QACxC,MAAM,SAAS,GAAG,OAAO,CACvB,EAAE,EACF;qFAC+E,EAC/E,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CACnB,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,SAAS;gBACjB,IAAI,EAAE,iBAAiB;gBACvB,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE;aAC5F,CAAC,CAAC;QACL,CAAC;QAED,kDAAkD;QAClD,MAAM,UAAU,GAAG,OAAO,CACxB,EAAE,EACF;6FACuF,EACvF,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CACnB,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,SAAS;gBACjB,IAAI,EAAE,mBAAmB;gBACzB,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,gBAAgB,EAAE;aAC5F,CAAC,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,WAAW,CAAC,EAAqB,EAAE,KAAa;QAC9C,MAAM,OAAO,GAAkB,EAAE,CAAC;QAElC,MAAM,MAAM,GAAG,OAAO,CACpB,EAAE,EACF;;;;;oDAK8C,EAC9C,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CACnB,CAAC;QACF,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACnE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC,CAAC;YAC/E,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3E,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC,CAAC;YAC1E,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,MAAM,CAAC,YAAY,IAAI,CAAC,EAAE,CAAC,CAAC;QAClF,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CACvB,EAAE,EACF,yFAAyF,EACzF,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CACnB,CAAC;QACF,IAAI,SAAS,EAAE,UAAU,IAAI,IAAI,EAAE,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,2BAA2B,EAAE,KAAK,EAAE,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC;QACnF,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,0BAA0B,CAAC,EAAqB,EAAE,KAAa;QAC7D,MAAM,YAAY,GAAiC,EAAE,CAAC;QAEtD,oBAAoB;QACpB,MAAM,UAAU,GAAG,OAAO,CACxB,EAAE,EACF;+FACyF,EACzF,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CACnB,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,YAAY,CAAC,IAAI,CAAC;gBAChB,MAAM,EAAE,SAAS;gBACjB,IAAI,EAAE,kBAAkB;gBACxB,KAAK,EAAE,CAAC,CAAC,GAAG;gBACZ,QAAQ,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE;aAC3D,CAAC,CAAC;QACL,CAAC;QAED,iBAAiB;QACjB,MAAM,OAAO,GAAG,OAAO,CACrB,EAAE,EACF;mEAC6D,EAC7D,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CACnB,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC;gBAChB,MAAM,EAAE,SAAS;gBACjB,IAAI,EAAE,eAAe;gBACrB,KAAK,EAAE,CAAC,CAAC,GAAG;gBACZ,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE;aACrD,CAAC,CAAC;QACL,CAAC;QAED,yBAAyB;QACzB,MAAM,OAAO,GAAG,OAAO,CACrB,EAAE,EACF;0EACoE,EACpE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CACnB,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC;gBAChB,MAAM,EAAE,SAAS;gBACjB,IAAI,EAAE,iBAAiB;gBACvB,KAAK,EAAE,CAAC,CAAC,GAAG;gBACZ,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE;aACpC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,qBAAqB,CAAC,EAAqB,EAAE,KAAa;QACxD,MAAM,MAAM,GAA4B,EAAE,CAAC;QAE3C,qBAAqB;QACrB,MAAM,SAAS,GAAG,OAAO,CACvB,EAAE,EACF;;;;;oDAK8C,EAC9C,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CACnB,CAAC;QACF,IAAI,SAAS,IAAI,SAAS,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,OAAO,CACrB,EAAE,EACF;0DACkD,EAClD,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CACnB,CAAC;YACF,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,SAAS;gBAChB,SAAS,EAAE,oBAAoB;gBAC/B,IAAI,EAAE;oBACJ,KAAK,EAAE,SAAS,CAAC,KAAK;oBACtB,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,CAAC;oBACnC,OAAO,EAAE,SAAS,CAAC,OAAO,IAAI,CAAC;oBAC/B,OAAO,EAAE,SAAS,CAAC,OAAO,IAAI,CAAC;oBAC/B,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,CAAC;oBACnC,YAAY,EAAE,OAAO,EAAE,QAAQ,IAAI,SAAS;iBAC7C;aACF,CAAC,CAAC;QACL,CAAC;QAED,uBAAuB;QACvB,MAAM,WAAW,GAAG,OAAO,CACzB,EAAE,EACF;;;oDAG8C,EAC9C,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CACnB,CAAC;QACF,IAAI,WAAW,IAAI,WAAW,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,SAAS;gBAChB,SAAS,EAAE,sBAAsB;gBACjC,IAAI,EAAE;oBACJ,KAAK,EAAE,WAAW,CAAC,KAAK;oBACxB,cAAc,EAAE,WAAW,CAAC,cAAc,IAAI,CAAC;oBAC/C,YAAY,EAAE,WAAW,CAAC,YAAY,IAAI,CAAC;iBAC5C;aACF,CAAC,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,2DAA2D;AAE3D,SAAS,SAAS,CAAC,EAAU;IAC3B,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,0BAA0B,CAAC;AAC1E,CAAC;AAED,SAAS,OAAO,CAAI,EAAqB,EAAE,GAAW,EAAE,MAAiB;IACvE,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAQ,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAI,EAAqB,EAAE,GAAW,EAAE,MAAiB;IACvE,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAkB,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -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
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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 ${
|
|
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.
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
|
|
99
|
-
|
|
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
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
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":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AA8E/C,2DAA2D;AAE3D,MAAM,UAAU,qBAAqB,CAAC,EAAqB;IACzD,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;GAWP,CAAC,CAAC;AACL,CAAC;AAED,2DAA2D;AAE3D,MAAM,OAAO,SAAS;IACZ,EAAE,CAAoB;IACtB,
|
|
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
|
}
|