@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.
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +126 -0
- package/dist/cli.js.map +1 -0
- package/dist/engine/gene-map.d.ts +87 -2
- package/dist/engine/gene-map.d.ts.map +1 -1
- package/dist/engine/gene-map.js +228 -114
- package/dist/engine/gene-map.js.map +1 -1
- package/dist/engine/pcec.d.ts +3 -1
- package/dist/engine/pcec.d.ts.map +1 -1
- package/dist/engine/pcec.js +47 -3
- package/dist/engine/pcec.js.map +1 -1
- package/dist/engine/root-causes.d.ts +8 -0
- package/dist/engine/root-causes.d.ts.map +1 -0
- package/dist/engine/root-causes.js +19 -0
- package/dist/engine/root-causes.js.map +1 -0
- package/dist/engine/seed-genes.d.ts +3 -0
- package/dist/engine/seed-genes.d.ts.map +1 -0
- package/dist/engine/seed-genes.js +15 -0
- package/dist/engine/seed-genes.js.map +1 -0
- package/dist/engine/strategy-schemas.d.ts +10 -0
- package/dist/engine/strategy-schemas.d.ts.map +1 -0
- package/dist/engine/strategy-schemas.js +21 -0
- package/dist/engine/strategy-schemas.js.map +1 -0
- package/dist/engine/types.d.ts +19 -0
- package/dist/engine/types.d.ts.map +1 -1
- package/dist/engine/types.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/testing.d.ts +24 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +66 -0
- package/dist/testing.js.map +1 -0
- package/package.json +6 -2
package/dist/engine/gene-map.js
CHANGED
|
@@ -1,23 +1,5 @@
|
|
|
1
1
|
import Database from 'better-sqlite3';
|
|
2
|
-
|
|
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.
|
|
50
|
-
this.
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
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;
|
|
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
|
|
89
|
-
if (!
|
|
90
|
-
|
|
91
|
-
this.stmtUpdatePlatforms.run(JSON.stringify(
|
|
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
|
-
|
|
97
|
-
|
|
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
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
const
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
return
|
|
156
|
-
}
|
|
157
|
-
|
|
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
|
|
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
|
-
|
|
283
|
+
allP.add(p);
|
|
165
284
|
}
|
|
166
285
|
return {
|
|
167
286
|
totalGenes: rows.length,
|
|
168
|
-
avgQValue: rows.length > 0 ?
|
|
169
|
-
platforms: [...
|
|
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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"}
|
package/dist/engine/pcec.d.ts
CHANGED
|
@@ -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
|
|
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;
|
|
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"}
|
package/dist/engine/pcec.js
CHANGED
|
@@ -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
|
|
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() {
|