@helix-agent/core 0.4.0 → 0.6.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.
@@ -1,23 +1,5 @@
1
1
  import Database from 'better-sqlite3';
2
- const SCHEMA = `
3
- CREATE TABLE IF NOT EXISTS genes (
4
- id INTEGER PRIMARY KEY AUTOINCREMENT,
5
- failure_code TEXT NOT NULL,
6
- category TEXT NOT NULL,
7
- strategy TEXT NOT NULL,
8
- params TEXT NOT NULL DEFAULT '{}',
9
- success_count INTEGER NOT NULL DEFAULT 1,
10
- avg_repair_ms REAL NOT NULL DEFAULT 0,
11
- platforms TEXT NOT NULL DEFAULT '[]',
12
- q_value REAL NOT NULL DEFAULT 0.5,
13
- last_success_at INTEGER,
14
- last_failed_at INTEGER,
15
- consecutive_failures INTEGER NOT NULL DEFAULT 0,
16
- created_at TEXT NOT NULL DEFAULT (datetime('now')),
17
- last_used_at TEXT NOT NULL DEFAULT (datetime('now')),
18
- UNIQUE(failure_code, category)
19
- );
20
- `;
2
+ import { SEED_GENES } from './seed-genes.js';
21
3
  function parseRow(row) {
22
4
  return {
23
5
  id: row.id,
@@ -34,147 +16,279 @@ function parseRow(row) {
34
16
  lastFailedAt: row.last_failed_at,
35
17
  createdAt: row.created_at,
36
18
  lastUsedAt: row.last_used_at,
19
+ reasoning: row.reasoning,
20
+ failureAnalysis: row.failure_analysis ? JSON.parse(row.failure_analysis) : [],
21
+ successContext: row.success_context ? JSON.parse(row.success_context) : {},
22
+ failureContext: row.failure_context ? JSON.parse(row.failure_context) : {},
37
23
  };
38
24
  }
39
25
  export class GeneMap {
26
+ static SCHEMA_VERSION = 3;
40
27
  db;
41
28
  stmtLookup;
42
29
  stmtUpsert;
43
30
  stmtList;
44
31
  stmtCount;
45
32
  stmtUpdatePlatforms;
33
+ cache = new Map();
34
+ cacheLoadedAt = 0;
35
+ CACHE_TTL_MS = 30_000;
46
36
  constructor(dbPath = ':memory:') {
47
37
  this.db = new Database(dbPath);
48
38
  this.db.pragma('journal_mode = WAL');
49
- this.db.exec(SCHEMA);
50
- this.stmtLookup = this.db.prepare(`
51
- SELECT * FROM genes WHERE failure_code = ? AND category = ? ORDER BY q_value DESC LIMIT 1
52
- `);
53
- this.stmtUpsert = this.db.prepare(`
54
- INSERT INTO genes (failure_code, category, strategy, params, success_count, avg_repair_ms, platforms, q_value, consecutive_failures)
55
- VALUES (@failureCode, @category, @strategy, @params, @successCount, @avgRepairMs, @platforms, @qValue, @consecutiveFailures)
56
- ON CONFLICT(failure_code, category) DO UPDATE SET
57
- strategy = @strategy,
58
- params = @params,
59
- success_count = success_count + 1,
60
- avg_repair_ms = (avg_repair_ms * success_count + @avgRepairMs) / (success_count + 1),
61
- platforms = @platforms,
62
- q_value = @qValue,
63
- consecutive_failures = @consecutiveFailures,
64
- last_used_at = datetime('now')
65
- `);
39
+ this.ensureSchema();
40
+ this.prepareStatements();
41
+ this.seed();
42
+ this.warmCache();
43
+ }
44
+ // ── Schema Versioning (D10) ──
45
+ ensureSchema() {
46
+ this.db.exec(`CREATE TABLE IF NOT EXISTS schema_version (version INTEGER NOT NULL, migrated_at DATETIME DEFAULT (datetime('now')))`);
47
+ const row = this.db.prepare('SELECT version FROM schema_version ORDER BY version DESC LIMIT 1').get();
48
+ const current = row?.version ?? 0;
49
+ if (current < GeneMap.SCHEMA_VERSION)
50
+ this.migrate(current);
51
+ }
52
+ migrate(from) {
53
+ const migrations = {
54
+ 0: () => {
55
+ this.db.exec(`CREATE TABLE IF NOT EXISTS genes (id INTEGER PRIMARY KEY AUTOINCREMENT, failure_code TEXT NOT NULL, category TEXT NOT NULL, strategy TEXT NOT NULL, params TEXT DEFAULT '{}', success_count INTEGER DEFAULT 1, avg_repair_ms REAL DEFAULT 0, platforms TEXT DEFAULT '[]', q_value REAL DEFAULT 0.5, last_success_at INTEGER, last_failed_at INTEGER, consecutive_failures INTEGER DEFAULT 0, reasoning TEXT, failure_analysis TEXT DEFAULT '[]', success_context TEXT DEFAULT '{}', failure_context TEXT DEFAULT '{}', created_at TEXT DEFAULT (datetime('now')), last_used_at TEXT DEFAULT (datetime('now')), UNIQUE(failure_code, category))`);
56
+ this.db.exec(`CREATE TABLE IF NOT EXISTS repair_log (id INTEGER PRIMARY KEY AUTOINCREMENT, repair_id TEXT UNIQUE NOT NULL, failure_code TEXT NOT NULL, category TEXT NOT NULL, strategy TEXT NOT NULL, status TEXT DEFAULT 'pending', tx_hash TEXT, created_at DATETIME DEFAULT (datetime('now')), completed_at DATETIME)`);
57
+ this.db.exec(`CREATE TABLE IF NOT EXISTS repair_attribution (id INTEGER PRIMARY KEY AUTOINCREMENT, repair_id TEXT NOT NULL, agent_id TEXT NOT NULL, step_id TEXT, workflow TEXT, failure_code TEXT NOT NULL, category TEXT NOT NULL, strategy TEXT, success INTEGER DEFAULT 0, created_at DATETIME DEFAULT (datetime('now')))`);
58
+ this.db.exec('CREATE INDEX IF NOT EXISTS idx_attribution_agent ON repair_attribution(agent_id)');
59
+ },
60
+ 1: () => {
61
+ const addCol = (t, c, type, def) => { try {
62
+ this.db.exec(`ALTER TABLE ${t} ADD COLUMN ${c} ${type} DEFAULT ${def}`);
63
+ }
64
+ catch { /* exists */ } };
65
+ addCol('genes', 'reasoning', 'TEXT', 'NULL');
66
+ addCol('genes', 'failure_analysis', 'TEXT', "'[]'");
67
+ addCol('genes', 'success_context', 'TEXT', "'{}'");
68
+ addCol('genes', 'failure_context', 'TEXT', "'{}'");
69
+ this.db.exec(`CREATE TABLE IF NOT EXISTS repair_attribution (id INTEGER PRIMARY KEY AUTOINCREMENT, repair_id TEXT NOT NULL, agent_id TEXT NOT NULL, step_id TEXT, workflow TEXT, failure_code TEXT NOT NULL, category TEXT NOT NULL, strategy TEXT, success INTEGER DEFAULT 0, created_at DATETIME DEFAULT (datetime('now')))`);
70
+ this.db.exec('CREATE INDEX IF NOT EXISTS idx_attribution_agent ON repair_attribution(agent_id)');
71
+ },
72
+ 2: () => {
73
+ this.db.exec(`CREATE TABLE IF NOT EXISTS gene_links (id INTEGER PRIMARY KEY AUTOINCREMENT, gene_a_code TEXT NOT NULL, gene_a_category TEXT NOT NULL, gene_b_code TEXT NOT NULL, gene_b_category TEXT NOT NULL, strength REAL DEFAULT 0.5, co_occurrence_count INTEGER DEFAULT 1, created_at DATETIME DEFAULT (datetime('now')), last_seen_at DATETIME DEFAULT (datetime('now')), UNIQUE(gene_a_code, gene_a_category, gene_b_code, gene_b_category))`);
74
+ },
75
+ };
76
+ this.db.transaction(() => {
77
+ for (let v = from; v < GeneMap.SCHEMA_VERSION; v++) {
78
+ migrations[v]?.();
79
+ this.db.prepare('INSERT INTO schema_version (version) VALUES (?)').run(v + 1);
80
+ }
81
+ })();
82
+ }
83
+ prepareStatements() {
84
+ this.stmtLookup = this.db.prepare(`SELECT * FROM genes WHERE failure_code = ? AND category = ? ORDER BY q_value DESC LIMIT 1`);
85
+ this.stmtUpsert = this.db.prepare(`INSERT INTO genes (failure_code, category, strategy, params, success_count, avg_repair_ms, platforms, q_value, consecutive_failures) VALUES (@failureCode, @category, @strategy, @params, @successCount, @avgRepairMs, @platforms, @qValue, @consecutiveFailures) ON CONFLICT(failure_code, category) DO UPDATE SET strategy = @strategy, params = @params, success_count = success_count + 1, avg_repair_ms = (avg_repair_ms * success_count + @avgRepairMs) / (success_count + 1), platforms = @platforms, q_value = @qValue, consecutive_failures = @consecutiveFailures, last_used_at = datetime('now')`);
66
86
  this.stmtList = this.db.prepare(`SELECT * FROM genes ORDER BY q_value DESC, success_count DESC`);
67
87
  this.stmtCount = this.db.prepare(`SELECT COUNT(*) as count FROM genes`);
68
- this.stmtUpdatePlatforms = this.db.prepare(`
69
- UPDATE genes SET platforms = ?, last_used_at = datetime('now') WHERE failure_code = ? AND category = ?
70
- `);
88
+ this.stmtUpdatePlatforms = this.db.prepare(`UPDATE genes SET platforms = ?, last_used_at = datetime('now') WHERE failure_code = ? AND category = ?`);
71
89
  }
90
+ // ── L1 Cache ──
91
+ cacheKey(code, category) { return `${code}:${category}`; }
92
+ warmCache() { this.cache.clear(); for (const r of this.db.prepare('SELECT * FROM genes').all())
93
+ this.cache.set(this.cacheKey(r.failure_code, r.category), r); this.cacheLoadedAt = Date.now(); }
94
+ isCacheStale() { return Date.now() - this.cacheLoadedAt > this.CACHE_TTL_MS; }
95
+ // ── Core CRUD ──
72
96
  lookup(code, category) {
97
+ const key = this.cacheKey(code, category);
98
+ if (!this.isCacheStale() && this.cache.has(key)) {
99
+ const cached = this.cache.get(key);
100
+ this.db.prepare(`UPDATE genes SET last_used_at = datetime('now'), success_count = success_count + 1 WHERE failure_code = ? AND category = ?`).run(code, category);
101
+ const gene = parseRow(cached);
102
+ gene.successCount += 1;
103
+ return gene;
104
+ }
73
105
  const row = this.stmtLookup.get(code, category);
74
106
  if (!row)
75
107
  return null;
76
- this.db.prepare(`
77
- UPDATE genes SET last_used_at = datetime('now'), success_count = success_count + 1
78
- WHERE failure_code = ? AND category = ?
79
- `).run(code, category);
108
+ this.db.prepare(`UPDATE genes SET last_used_at = datetime('now'), success_count = success_count + 1 WHERE failure_code = ? AND category = ?`).run(code, category);
109
+ this.cache.set(key, row);
80
110
  const gene = parseRow(row);
81
- gene.successCount += 1; // reflect the bump we just did
111
+ gene.successCount += 1;
82
112
  return gene;
83
113
  }
84
114
  addPlatform(code, category, platform) {
85
115
  const row = this.stmtLookup.get(code, category);
86
116
  if (!row)
87
117
  return;
88
- const platforms = JSON.parse(row.platforms);
89
- if (!platforms.includes(platform)) {
90
- platforms.push(platform);
91
- this.stmtUpdatePlatforms.run(JSON.stringify(platforms), code, category);
118
+ const p = JSON.parse(row.platforms);
119
+ if (!p.includes(platform)) {
120
+ p.push(platform);
121
+ this.stmtUpdatePlatforms.run(JSON.stringify(p), code, category);
122
+ this.cache.delete(this.cacheKey(code, category));
92
123
  }
93
124
  }
94
125
  store(gene) {
95
- this.stmtUpsert.run({
96
- failureCode: gene.failureCode,
97
- category: gene.category,
98
- strategy: gene.strategy,
99
- params: JSON.stringify(gene.params, (_k, v) => typeof v === 'bigint' ? v.toString() : v),
100
- successCount: gene.successCount,
101
- avgRepairMs: gene.avgRepairMs,
102
- platforms: JSON.stringify(gene.platforms),
103
- qValue: gene.qValue ?? 0.5,
104
- consecutiveFailures: gene.consecutiveFailures ?? 0,
105
- });
106
- }
107
- /** RL update after successful repair */
126
+ this.stmtUpsert.run({ failureCode: gene.failureCode, category: gene.category, strategy: gene.strategy, params: JSON.stringify(gene.params, (_k, v) => typeof v === 'bigint' ? v.toString() : v), successCount: gene.successCount, avgRepairMs: gene.avgRepairMs, platforms: JSON.stringify(gene.platforms), qValue: gene.qValue ?? 0.5, consecutiveFailures: gene.consecutiveFailures ?? 0 });
127
+ this.cache.delete(this.cacheKey(gene.failureCode, gene.category));
128
+ }
108
129
  recordSuccess(code, category, repairMs) {
109
130
  const row = this.stmtLookup.get(code, category);
110
131
  if (!row)
111
132
  return;
112
- const alpha = 0.1;
113
- const oldQ = row.q_value;
114
- const newQ = oldQ + alpha * (1.0 - oldQ);
115
- this.db.prepare(`
116
- UPDATE genes SET
117
- q_value = ?,
118
- avg_repair_ms = (avg_repair_ms * success_count + ?) / (success_count + 1),
119
- success_count = success_count + 1,
120
- last_success_at = ?,
121
- consecutive_failures = 0,
122
- last_used_at = datetime('now')
123
- WHERE failure_code = ? AND category = ?
124
- `).run(newQ, repairMs, Date.now(), code, category);
125
- }
126
- /** RL update after failed repair */
133
+ const newQ = row.q_value + 0.1 * (1.0 - row.q_value);
134
+ this.db.prepare(`UPDATE genes SET q_value = ?, avg_repair_ms = (avg_repair_ms * success_count + ?) / (success_count + 1), success_count = success_count + 1, last_success_at = ?, consecutive_failures = 0, last_used_at = datetime('now') WHERE failure_code = ? AND category = ?`).run(newQ, repairMs, Date.now(), code, category);
135
+ this.cache.delete(this.cacheKey(code, category));
136
+ }
127
137
  recordFailure(code, category) {
128
138
  const row = this.stmtLookup.get(code, category);
129
139
  if (!row)
130
140
  return;
131
- const alpha = 0.1;
132
- const oldQ = row.q_value;
133
- const newQ = oldQ + alpha * (0.0 - oldQ);
134
- this.db.prepare(`
135
- UPDATE genes SET
136
- q_value = ?,
137
- last_failed_at = ?,
138
- consecutive_failures = consecutive_failures + 1,
139
- last_used_at = datetime('now')
140
- WHERE failure_code = ? AND category = ?
141
- `).run(newQ, Date.now(), code, category);
142
- }
143
- list() {
144
- return this.stmtList.all().map(parseRow);
145
- }
146
- immuneCount() {
147
- return this.stmtCount.get().count;
148
- }
149
- getSuccessRate(failureCode, strategy) {
150
- const row = this.db.prepare(`
151
- SELECT success_count, q_value FROM genes WHERE failure_code = ? AND strategy = ?
152
- `).get(failureCode, strategy);
153
- if (!row || row.success_count < 3)
154
- return 0.5;
155
- return Math.min(0.5 + (row.success_count / 100), 0.95);
156
- }
157
- stats() {
141
+ const newQ = row.q_value + 0.1 * (0.0 - row.q_value);
142
+ this.db.prepare(`UPDATE genes SET q_value = ?, last_failed_at = ?, consecutive_failures = consecutive_failures + 1, last_used_at = datetime('now') WHERE failure_code = ? AND category = ?`).run(newQ, Date.now(), code, category);
143
+ this.cache.delete(this.cacheKey(code, category));
144
+ }
145
+ list() { return this.stmtList.all().map(parseRow); }
146
+ immuneCount() { return this.stmtCount.get().count; }
147
+ getSuccessRate(failureCode, strategy) { const r = this.db.prepare(`SELECT success_count FROM genes WHERE failure_code = ? AND strategy = ?`).get(failureCode, strategy); if (!r || r.success_count < 3)
148
+ return 0.5; return Math.min(0.5 + (r.success_count / 100), 0.95); }
149
+ stats() { const rows = this.stmtList.all(); const allP = new Set(); let qSum = 0; for (const r of rows) {
150
+ qSum += r.q_value;
151
+ for (const p of JSON.parse(r.platforms))
152
+ allP.add(p);
153
+ } return { totalGenes: rows.length, avgQValue: rows.length > 0 ? Math.round((qSum / rows.length) * 100) / 100 : 0, platforms: [...allP], topStrategies: rows.slice(0, 10).map(r => ({ strategy: r.strategy, count: r.success_count })) }; }
154
+ // ── Seed (D9) ──
155
+ seed() {
156
+ const cnt = this.db.prepare('SELECT COUNT(*) as cnt FROM genes').get().cnt;
157
+ if (cnt > 0)
158
+ return { seeded: 0 };
159
+ let seeded = 0;
160
+ const ins = this.db.prepare(`INSERT OR IGNORE INTO genes (failure_code, category, strategy, params, success_count, avg_repair_ms, platforms, q_value, consecutive_failures) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`);
161
+ this.db.transaction(() => { for (const g of SEED_GENES) {
162
+ ins.run(g.failureCode, g.category, g.strategy, JSON.stringify(g.params), g.successCount, g.avgRepairMs, JSON.stringify(g.platforms), g.qValue, g.consecutiveFailures);
163
+ seeded++;
164
+ } })();
165
+ return { seeded };
166
+ }
167
+ // ── Gene Combine (OPT-3) ──
168
+ combine() {
169
+ let merged = 0;
170
+ const groups = this.db.prepare(`SELECT failure_code, category, COUNT(*) as cnt FROM genes GROUP BY failure_code, category HAVING cnt > 1`).all();
171
+ for (const g of groups) {
172
+ const genes = this.db.prepare(`SELECT * FROM genes WHERE failure_code = ? AND category = ? ORDER BY q_value DESC`).all(g.failure_code, g.category);
173
+ if (genes.length <= 1)
174
+ continue;
175
+ const best = genes[0];
176
+ const allP = new Set();
177
+ let totalSC = 0;
178
+ let wMs = 0;
179
+ for (const gn of genes) {
180
+ totalSC += gn.success_count;
181
+ wMs += gn.avg_repair_ms * gn.success_count;
182
+ for (const p of JSON.parse(gn.platforms))
183
+ allP.add(p);
184
+ }
185
+ const maxQ = Math.max(...genes.map(gn => gn.q_value));
186
+ this.db.prepare(`UPDATE genes SET platforms = ?, success_count = ?, avg_repair_ms = ?, q_value = ?, last_used_at = datetime('now') WHERE id = ?`).run(JSON.stringify([...allP]), totalSC, wMs / Math.max(totalSC, 1), maxQ, best.id);
187
+ for (const gn of genes.slice(1)) {
188
+ this.db.prepare('DELETE FROM genes WHERE id = ?').run(gn.id);
189
+ merged++;
190
+ }
191
+ }
192
+ if (merged > 0)
193
+ this.warmCache();
194
+ return { merged };
195
+ }
196
+ gc() {
197
+ const { merged } = this.combine();
198
+ const pruned = this.db.prepare(`DELETE FROM genes WHERE q_value < 0.1 AND consecutive_failures >= 3`).run().changes;
199
+ const archived = this.db.prepare(`SELECT COUNT(*) as cnt FROM genes WHERE last_used_at < datetime('now', '-180 days')`).get().cnt;
200
+ if (pruned > 0)
201
+ this.warmCache();
202
+ return { merged, pruned, archived };
203
+ }
204
+ // ── Reasoning (OPT-4) ──
205
+ recordFailureAnalysis(code, category, analysis) {
206
+ const row = this.stmtLookup.get(code, category);
207
+ if (!row)
208
+ return;
209
+ const existing = row.failure_analysis ? JSON.parse(row.failure_analysis) : [];
210
+ const updated = [...existing, `[${new Date().toISOString().slice(0, 10)}] ${analysis}`].slice(-5);
211
+ this.db.prepare(`UPDATE genes SET failure_analysis = ? WHERE failure_code = ? AND category = ?`).run(JSON.stringify(updated), code, category);
212
+ this.cache.delete(this.cacheKey(code, category));
213
+ }
214
+ updateContext(code, category, success, context) {
215
+ const row = this.stmtLookup.get(code, category);
216
+ if (!row)
217
+ return;
218
+ if (success) {
219
+ const ctx = row.success_context ? JSON.parse(row.success_context) : {};
220
+ if (context.chain && !(ctx.chains ?? []).includes(context.chain))
221
+ ctx.chains = [...(ctx.chains ?? []), context.chain];
222
+ if (context.platform && !(ctx.platforms ?? []).includes(context.platform))
223
+ ctx.platforms = [...(ctx.platforms ?? []), context.platform];
224
+ this.db.prepare('UPDATE genes SET success_context = ? WHERE failure_code = ? AND category = ?').run(JSON.stringify(ctx), code, category);
225
+ }
226
+ else {
227
+ const ctx = row.failure_context ? JSON.parse(row.failure_context) : {};
228
+ if (context.chain && !(ctx.chains ?? []).includes(context.chain))
229
+ ctx.chains = [...(ctx.chains ?? []), context.chain];
230
+ this.db.prepare('UPDATE genes SET failure_context = ? WHERE failure_code = ? AND category = ?').run(JSON.stringify(ctx), code, category);
231
+ }
232
+ this.cache.delete(this.cacheKey(code, category));
233
+ }
234
+ // ── Idempotency (D5) ──
235
+ generateRepairId() { return `repair_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`; }
236
+ checkRepairInProgress(code, category) {
237
+ const r = this.db.prepare(`SELECT repair_id, status, tx_hash FROM repair_log WHERE failure_code = ? AND category = ? AND status IN ('pending','completed') AND created_at > datetime('now','-5 minutes') ORDER BY created_at DESC LIMIT 1`).get(code, category);
238
+ if (!r)
239
+ return { inProgress: false };
240
+ if (r.status === 'pending')
241
+ return { inProgress: true, repairId: r.repair_id };
242
+ if (r.status === 'completed' && r.tx_hash)
243
+ return { inProgress: true, repairId: r.repair_id, txHash: r.tx_hash };
244
+ return { inProgress: false };
245
+ }
246
+ logRepairStart(id, code, category, strategy) { this.db.prepare(`INSERT OR IGNORE INTO repair_log (repair_id, failure_code, category, strategy, status) VALUES (?,?,?,?,'pending')`).run(id, code, category, strategy); }
247
+ logRepairComplete(id, txHash) { this.db.prepare(`UPDATE repair_log SET status='completed', tx_hash=?, completed_at=datetime('now') WHERE repair_id=?`).run(txHash ?? null, id); }
248
+ logRepairFailed(id) { this.db.prepare(`UPDATE repair_log SET status='failed', completed_at=datetime('now') WHERE repair_id=?`).run(id); }
249
+ // ── Attribution (OPT-10) ──
250
+ recordAttribution(data) {
251
+ this.db.prepare(`INSERT INTO repair_attribution (repair_id, agent_id, step_id, workflow, failure_code, category, strategy, success) VALUES (?,?,?,?,?,?,?,?)`).run(data.repairId, data.agentId, data.stepId ?? null, data.workflow ?? null, data.failureCode, data.category, data.strategy ?? null, data.success ? 1 : 0);
252
+ }
253
+ getAgentStats(agentId) {
254
+ const total = this.db.prepare('SELECT COUNT(*) as cnt FROM repair_attribution WHERE agent_id = ?').get(agentId).cnt;
255
+ const cats = this.db.prepare(`SELECT category, COUNT(*) as cnt FROM repair_attribution WHERE agent_id = ? GROUP BY category ORDER BY cnt DESC LIMIT 5`).all(agentId);
256
+ const steps = this.db.prepare(`SELECT step_id, COUNT(*) as cnt FROM repair_attribution WHERE agent_id = ? AND step_id IS NOT NULL GROUP BY step_id ORDER BY cnt DESC LIMIT 5`).all(agentId);
257
+ const ok = this.db.prepare('SELECT COUNT(*) as cnt FROM repair_attribution WHERE agent_id = ? AND success = 1').get(agentId).cnt;
258
+ return { totalFailures: total, topCategories: cats.map(c => ({ category: c.category, count: c.cnt })), topSteps: steps.map(s => ({ stepId: s.step_id, count: s.cnt })), successRate: total > 0 ? ok / total : 0 };
259
+ }
260
+ getGlobalAttributionStats() {
261
+ const total = this.db.prepare('SELECT COUNT(*) as cnt FROM repair_attribution').get().cnt;
262
+ const agents = this.db.prepare(`SELECT agent_id, COUNT(*) as cnt FROM repair_attribution GROUP BY agent_id ORDER BY cnt DESC LIMIT 10`).all();
263
+ const cats = this.db.prepare(`SELECT category, COUNT(*) as cnt FROM repair_attribution GROUP BY category ORDER BY cnt DESC LIMIT 10`).all();
264
+ const ok = this.db.prepare('SELECT COUNT(*) as cnt FROM repair_attribution WHERE success = 1').get().cnt;
265
+ return { totalRepairs: total, topAgents: agents.map(a => ({ agentId: a.agent_id, failures: a.cnt })), topCategories: cats.map(c => ({ category: c.category, count: c.cnt })), overallSuccessRate: total > 0 ? ok / total : 0 };
266
+ }
267
+ // ── Gene Links (OPT-5: A-Mem paper) ──
268
+ recordCoOccurrence(codeA, catA, codeB, catB) {
269
+ const [a, b] = [{ code: codeA, cat: catA }, { code: codeB, cat: catB }].sort((x, y) => `${x.code}:${x.cat}`.localeCompare(`${y.code}:${y.cat}`));
270
+ this.db.prepare(`INSERT INTO gene_links (gene_a_code, gene_a_category, gene_b_code, gene_b_category) VALUES (?,?,?,?) ON CONFLICT(gene_a_code, gene_a_category, gene_b_code, gene_b_category) DO UPDATE SET co_occurrence_count = co_occurrence_count + 1, strength = MIN(1.0, strength + 0.1), last_seen_at = datetime('now')`).run(a.code, a.cat, b.code, b.cat);
271
+ }
272
+ getRelatedFailures(code, category) {
273
+ return this.db.prepare(`SELECT CASE WHEN gene_a_code = ? AND gene_a_category = ? THEN gene_b_code ELSE gene_a_code END as rc, CASE WHEN gene_a_code = ? AND gene_a_category = ? THEN gene_b_category ELSE gene_a_category END as rcat, strength, co_occurrence_count as co FROM gene_links WHERE (gene_a_code = ? AND gene_a_category = ?) OR (gene_b_code = ? AND gene_b_category = ?) ORDER BY strength DESC LIMIT 5`).all(code, category, code, category, code, category, code, category).map(r => ({ code: r.rc, category: r.rcat, strength: r.strength, coOccurrences: r.co }));
274
+ }
275
+ // ── Health (for CLI) ──
276
+ health() {
158
277
  const rows = this.stmtList.all();
159
- const allPlatforms = new Set();
278
+ const allP = new Set();
160
279
  let qSum = 0;
161
280
  for (const r of rows) {
162
281
  qSum += r.q_value;
163
282
  for (const p of JSON.parse(r.platforms))
164
- allPlatforms.add(p);
283
+ allP.add(p);
165
284
  }
166
285
  return {
167
286
  totalGenes: rows.length,
168
- avgQValue: rows.length > 0 ? Math.round((qSum / rows.length) * 100) / 100 : 0,
169
- platforms: [...allPlatforms],
170
- topStrategies: rows.slice(0, 10).map(r => ({
171
- strategy: r.strategy,
172
- count: r.success_count,
173
- })),
287
+ avgQValue: rows.length > 0 ? qSum / rows.length : 0,
288
+ platforms: [...allP],
289
+ topStrategies: rows.slice(0, 10).map(r => ({ strategy: r.strategy, qValue: r.q_value, count: r.success_count })),
174
290
  };
175
291
  }
176
- close() {
177
- this.db.close();
178
- }
292
+ close() { this.db.close(); }
179
293
  }
180
294
  //# sourceMappingURL=gene-map.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gene-map.js","sourceRoot":"","sources":["../../src/engine/gene-map.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gene-map.js","sourceRoot":"","sources":["../../src/engine/gene-map.ts"],"names":[],"mappings":"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"}
@@ -13,8 +13,10 @@ export declare class PcecEngine {
13
13
  };
14
14
  private readonly MAX_CYCLES;
15
15
  private cycleCount;
16
- /** D6: Systematic failure tracker — detect repeated identical failures */
16
+ /** D6: Systematic failure tracker */
17
17
  private failureTracker;
18
+ /** OPT-5: Recent failures for co-occurrence detection */
19
+ private recentFailures;
18
20
  constructor(geneMap: GeneMap, agentId?: string, options?: WrapOptions);
19
21
  private checkSystematic;
20
22
  registerAdapter(adapter: PlatformAdapter): void;
@@ -1 +1 @@
1
- {"version":3,"file":"pcec.d.ts","sourceRoot":"","sources":["../../src/engine/pcec.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAIxC,OAAO,KAAK,EAEV,WAAW,EAEX,eAAe,EAEf,YAAY,EACZ,WAAW,EACZ,MAAM,YAAY,CAAC;AA6BpB,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,OAAO,CAAc;IACtB,KAAK;;;;MAAkD;IAC9D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAM;IACjC,OAAO,CAAC,UAAU,CAAK;IACvB,0EAA0E;IAC1E,OAAO,CAAC,cAAc,CAAkF;gBAE5F,OAAO,EAAE,OAAO,EAAE,OAAO,GAAE,MAAkB,EAAE,OAAO,CAAC,EAAE,WAAW;IAOhF,OAAO,CAAC,eAAe;IAiBvB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAI/C,kFAAkF;IAClF,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,QAAQ;IAkBhB,OAAO,CAAC,mBAAmB;YAWb,MAAM;IAyBd,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IAuOpF,QAAQ;;;;;;;IAQR,UAAU,IAAI,OAAO;CAGtB"}
1
+ {"version":3,"file":"pcec.d.ts","sourceRoot":"","sources":["../../src/engine/pcec.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAIxC,OAAO,KAAK,EAEV,WAAW,EAEX,eAAe,EAEf,YAAY,EACZ,WAAW,EACZ,MAAM,YAAY,CAAC;AA8BpB,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,OAAO,CAAc;IACtB,KAAK;;;;MAAkD;IAC9D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAM;IACjC,OAAO,CAAC,UAAU,CAAK;IACvB,qCAAqC;IACrC,OAAO,CAAC,cAAc,CAAkF;IACxG,yDAAyD;IACzD,OAAO,CAAC,cAAc,CAA+D;gBAEzE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAE,MAAkB,EAAE,OAAO,CAAC,EAAE,WAAW;IAOhF,OAAO,CAAC,eAAe;IAiBvB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAI/C,kFAAkF;IAClF,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,QAAQ;IAsBhB,OAAO,CAAC,mBAAmB;YAWb,MAAM;IAyBd,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IAiRpF,QAAQ;;;;;;;IAQR,UAAU,IAAI,OAAO;CAGtB"}
@@ -2,6 +2,7 @@ import { bus } from './bus.js';
2
2
  import { evaluate } from './evaluate.js';
3
3
  import { HelixProvider } from './provider.js';
4
4
  import { REVENUE_AT_RISK } from './types.js';
5
+ import { getRootCause } from './root-causes.js';
5
6
  // Category C strategies that move funds — require 'full' mode
6
7
  const FUND_MOVEMENT_STRATEGIES = [
7
8
  'swap_currency', 'split_transaction', 'topup_from_reserve',
@@ -35,8 +36,10 @@ export class PcecEngine {
35
36
  stats = { repairs: 0, savedRevenue: 0, immuneHits: 0 };
36
37
  MAX_CYCLES = 50;
37
38
  cycleCount = 0;
38
- /** D6: Systematic failure tracker — detect repeated identical failures */
39
+ /** D6: Systematic failure tracker */
39
40
  failureTracker = new Map();
41
+ /** OPT-5: Recent failures for co-occurrence detection */
42
+ recentFailures = [];
40
43
  constructor(geneMap, agentId = 'default', options) {
41
44
  this.geneMap = geneMap;
42
45
  this.agentId = agentId;
@@ -81,8 +84,12 @@ export class PcecEngine {
81
84
  }
82
85
  for (const adapter of this.adapters) {
83
86
  const result = adapter.perceive(error, context);
84
- if (result)
87
+ if (result) {
88
+ const rc = getRootCause(result.code, result.category);
89
+ if (rc)
90
+ result.rootCauseHint = rc.hint;
85
91
  return result;
92
+ }
86
93
  }
87
94
  return {
88
95
  code: 'unknown', category: 'unknown', severity: 'medium',
@@ -141,6 +148,15 @@ export class PcecEngine {
141
148
  bus.emit('error', this.agentId, { reason: 'SYSTEMATIC', message: systematicWarning });
142
149
  this.options.onSystematic?.(systematicWarning, failure);
143
150
  }
151
+ // ── OPT-5: Co-occurrence tracking for Gene Links ──
152
+ const now = Date.now();
153
+ this.recentFailures = this.recentFailures.filter(f => now - f.timestamp < 60_000);
154
+ for (const recent of this.recentFailures) {
155
+ if (recent.code !== failure.code || recent.category !== failure.category) {
156
+ this.geneMap.recordCoOccurrence(recent.code, recent.category, failure.code, failure.category);
157
+ }
158
+ }
159
+ this.recentFailures.push({ code: failure.code, category: failure.category, timestamp: now });
144
160
  // ── GENE MAP LOOKUP (with Q-value ranking) ──
145
161
  const existingGene = this.geneMap.lookup(failure.code, failure.category);
146
162
  if (existingGene && existingGene.qValue > 0.3) {
@@ -240,9 +256,13 @@ export class PcecEngine {
240
256
  winner: winner.strategy, score: winner.score, platform: winner.platform,
241
257
  allScores: scored.map(c => ({ strategy: c.strategy, score: c.score })),
242
258
  });
243
- // ── BUILD EXPLANATION ──
259
+ // ── BUILD EXPLANATION (with root cause hints OPT-7) ──
260
+ const rootCause = getRootCause(failure.code, failure.category);
244
261
  const explanation = [
245
262
  `Perceived: ${failure.code} → ${failure.category} [${failure.severity}] (${failure.platform})`,
263
+ rootCause ? `Root cause: ${rootCause.likelyCause}` : '',
264
+ rootCause ? `Suggested: ${rootCause.suggestedAction}` : '',
265
+ rootCause?.isLikelySystematic ? '⚠️ Likely systematic — check configuration.' : '',
246
266
  `Candidates: ${scored.map(c => `${c.strategy}(${c.score})`).join(', ')}`,
247
267
  `Selected: ${winner.strategy} (score: ${winner.score})`,
248
268
  skippedStrategies.length > 0 ? `Skipped: ${skippedStrategies.join(', ')}` : '',
@@ -263,7 +283,19 @@ export class PcecEngine {
263
283
  costEstimate: winner.estimatedCostUsd, skippedStrategies,
264
284
  });
265
285
  }
286
+ // ── IDEMPOTENCY CHECK (D5) ──
287
+ const inProgress = this.geneMap.checkRepairInProgress(failure.code, failure.category);
288
+ if (inProgress.inProgress) {
289
+ return makeResult({
290
+ success: !!inProgress.txHash, mode, failure, candidates: scored, winner,
291
+ explanation: explanation + `\nIdempotency: repair already ${inProgress.txHash ? 'completed' : 'in progress'} (${inProgress.repairId})`,
292
+ verified: !!inProgress.txHash,
293
+ costEstimate: winner.estimatedCostUsd, skippedStrategies,
294
+ });
295
+ }
266
296
  // ── COMMIT ──
297
+ const repairId = this.geneMap.generateRepairId();
298
+ this.geneMap.logRepairStart(repairId, failure.code, failure.category, winner.strategy);
267
299
  const commitResult = await this.provider.execute(winner.strategy, failure, context);
268
300
  const totalMs = Date.now() - start;
269
301
  const revenue = REVENUE_AT_RISK[failure.category] ?? 50;
@@ -278,6 +310,8 @@ export class PcecEngine {
278
310
  this.stats.repairs++;
279
311
  this.stats.savedRevenue += revenue;
280
312
  this.cycleCount = 0;
313
+ const txHash = commitResult.overrides.txHash;
314
+ this.geneMap.logRepairComplete(repairId, txHash);
281
315
  const gene = {
282
316
  failureCode: failure.code, category: failure.category,
283
317
  strategy: winner.strategy, params: commitResult.overrides,
@@ -295,6 +329,10 @@ export class PcecEngine {
295
329
  totalRepairs: this.stats.repairs, savedRevenue: this.stats.savedRevenue,
296
330
  immuneHits: this.stats.immuneHits, geneCount: this.geneMap.immuneCount(),
297
331
  });
332
+ // OPT-4: Update context + OPT-10: Attribution
333
+ this.geneMap.updateContext(failure.code, failure.category, true, { chain: context?.chainId?.toString(), platform: failure.platform });
334
+ this.geneMap.recordAttribution({ repairId, agentId: this.agentId, stepId: context?.stepId, workflow: context?.workflow, failureCode: failure.code, category: failure.category, strategy: winner.strategy, success: true });
335
+ const attribution = { agentId: this.agentId, stepId: context?.stepId, workflow: context?.workflow, timestamp: Date.now() };
298
336
  return makeResult({
299
337
  success: true, mode, verified: true,
300
338
  explanation: explanation + '\n✓ Verified',
@@ -302,9 +340,14 @@ export class PcecEngine {
302
340
  gene: this.geneMap.lookup(failure.code, failure.category) ?? gene,
303
341
  totalMs, revenueProtected: revenue,
304
342
  costEstimate: winner.estimatedCostUsd, skippedStrategies,
343
+ attribution,
305
344
  });
306
345
  }
307
346
  // Verify failed
347
+ this.geneMap.logRepairFailed(repairId);
348
+ this.geneMap.updateContext(failure.code, failure.category, false, { chain: context?.chainId?.toString(), platform: failure.platform });
349
+ this.geneMap.recordFailureAnalysis(failure.code, failure.category, `Strategy '${winner.strategy}' failed: ${commitResult.description}`);
350
+ this.geneMap.recordAttribution({ repairId, agentId: this.agentId, stepId: context?.stepId, workflow: context?.workflow, failureCode: failure.code, category: failure.category, strategy: winner.strategy, success: false });
308
351
  if (existingGene) {
309
352
  this.geneMap.recordFailure(failure.code, failure.category);
310
353
  }
@@ -312,6 +355,7 @@ export class PcecEngine {
312
355
  failure, mode, candidates: scored, winner, totalMs,
313
356
  explanation: explanation + '\n✗ Verification failed',
314
357
  costEstimate: winner.estimatedCostUsd, skippedStrategies,
358
+ attribution: { agentId: this.agentId, stepId: context?.stepId, workflow: context?.workflow, timestamp: Date.now() },
315
359
  });
316
360
  }
317
361
  getStats() {