@helix-agent/core 0.1.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/README.md +22 -0
- package/dist/engine/bus.d.ts +12 -0
- package/dist/engine/bus.d.ts.map +1 -0
- package/dist/engine/bus.js +39 -0
- package/dist/engine/bus.js.map +1 -0
- package/dist/engine/evaluate.d.ts +3 -0
- package/dist/engine/evaluate.d.ts.map +1 -0
- package/dist/engine/evaluate.js +22 -0
- package/dist/engine/evaluate.js.map +1 -0
- package/dist/engine/gene-map.d.ts +19 -0
- package/dist/engine/gene-map.d.ts.map +1 -0
- package/dist/engine/gene-map.js +130 -0
- package/dist/engine/gene-map.js.map +1 -0
- package/dist/engine/pcec.d.ts +35 -0
- package/dist/engine/pcec.d.ts.map +1 -0
- package/dist/engine/pcec.js +253 -0
- package/dist/engine/pcec.js.map +1 -0
- package/dist/engine/types.d.ts +83 -0
- package/dist/engine/types.d.ts.map +1 -0
- package/dist/engine/types.js +33 -0
- package/dist/engine/types.js.map +1 -0
- package/dist/engine/wrap.d.ts +6 -0
- package/dist/engine/wrap.d.ts.map +1 -0
- package/dist/engine/wrap.js +74 -0
- package/dist/engine/wrap.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/platforms/generic/index.d.ts +3 -0
- package/dist/platforms/generic/index.d.ts.map +1 -0
- package/dist/platforms/generic/index.js +3 -0
- package/dist/platforms/generic/index.js.map +1 -0
- package/dist/platforms/generic/perceive.d.ts +3 -0
- package/dist/platforms/generic/perceive.d.ts.map +1 -0
- package/dist/platforms/generic/perceive.js +20 -0
- package/dist/platforms/generic/perceive.js.map +1 -0
- package/dist/platforms/generic/strategies.d.ts +3 -0
- package/dist/platforms/generic/strategies.d.ts.map +1 -0
- package/dist/platforms/generic/strategies.js +16 -0
- package/dist/platforms/generic/strategies.js.map +1 -0
- package/dist/platforms/index.d.ts +7 -0
- package/dist/platforms/index.d.ts.map +1 -0
- package/dist/platforms/index.js +36 -0
- package/dist/platforms/index.js.map +1 -0
- package/dist/platforms/privy/index.d.ts +3 -0
- package/dist/platforms/privy/index.d.ts.map +1 -0
- package/dist/platforms/privy/index.js +3 -0
- package/dist/platforms/privy/index.js.map +1 -0
- package/dist/platforms/privy/perceive.d.ts +3 -0
- package/dist/platforms/privy/perceive.d.ts.map +1 -0
- package/dist/platforms/privy/perceive.js +28 -0
- package/dist/platforms/privy/perceive.js.map +1 -0
- package/dist/platforms/privy/strategies.d.ts +3 -0
- package/dist/platforms/privy/strategies.d.ts.map +1 -0
- package/dist/platforms/privy/strategies.js +39 -0
- package/dist/platforms/privy/strategies.js.map +1 -0
- package/dist/platforms/stripe/index.d.ts +3 -0
- package/dist/platforms/stripe/index.d.ts.map +1 -0
- package/dist/platforms/stripe/index.js +3 -0
- package/dist/platforms/stripe/index.js.map +1 -0
- package/dist/platforms/stripe/perceive.d.ts +3 -0
- package/dist/platforms/stripe/perceive.d.ts.map +1 -0
- package/dist/platforms/stripe/perceive.js +14 -0
- package/dist/platforms/stripe/perceive.js.map +1 -0
- package/dist/platforms/stripe/strategies.d.ts +3 -0
- package/dist/platforms/stripe/strategies.d.ts.map +1 -0
- package/dist/platforms/stripe/strategies.js +6 -0
- package/dist/platforms/stripe/strategies.js.map +1 -0
- package/dist/platforms/tempo/index.d.ts +3 -0
- package/dist/platforms/tempo/index.d.ts.map +1 -0
- package/dist/platforms/tempo/index.js +3 -0
- package/dist/platforms/tempo/index.js.map +1 -0
- package/dist/platforms/tempo/perceive.d.ts +3 -0
- package/dist/platforms/tempo/perceive.d.ts.map +1 -0
- package/dist/platforms/tempo/perceive.js +35 -0
- package/dist/platforms/tempo/perceive.js.map +1 -0
- package/dist/platforms/tempo/strategies.d.ts +3 -0
- package/dist/platforms/tempo/strategies.d.ts.map +1 -0
- package/dist/platforms/tempo/strategies.js +68 -0
- package/dist/platforms/tempo/strategies.js.map +1 -0
- package/package.json +50 -0
package/README.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# @helix-agent/core
|
|
2
|
+
|
|
3
|
+
Self-healing infrastructure for AI agent payments.
|
|
4
|
+
|
|
5
|
+
See the [root README](../../README.md) for full documentation.
|
|
6
|
+
|
|
7
|
+
## Quick Start
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @helix-agent/core
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { wrap } from '@helix-agent/core';
|
|
15
|
+
|
|
16
|
+
const resilientPay = wrap(myPaymentFunction);
|
|
17
|
+
const result = await resilientPay(invoice);
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## License
|
|
21
|
+
|
|
22
|
+
MIT
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SseEvent, SseEventType } from './types.js';
|
|
2
|
+
export type EventListener = (event: SseEvent) => void;
|
|
3
|
+
export declare class EventBus {
|
|
4
|
+
private listeners;
|
|
5
|
+
private history;
|
|
6
|
+
emit(type: SseEventType, agentId: string, data: Record<string, unknown>): void;
|
|
7
|
+
subscribe(fn: EventListener): () => void;
|
|
8
|
+
getHistory(): SseEvent[];
|
|
9
|
+
clear(): void;
|
|
10
|
+
}
|
|
11
|
+
export declare const bus: EventBus;
|
|
12
|
+
//# sourceMappingURL=bus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bus.d.ts","sourceRoot":"","sources":["../../src/engine/bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEzD,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;AAItD,qBAAa,QAAQ;IACnB,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,OAAO,CAAkB;IAEjC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAoB9E,SAAS,CAAC,EAAE,EAAE,aAAa,GAAG,MAAM,IAAI;IAOxC,UAAU,IAAI,QAAQ,EAAE;IAIxB,KAAK,IAAI,IAAI;CAGd;AAED,eAAO,MAAM,GAAG,UAAiB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
const MAX_HISTORY = 500;
|
|
2
|
+
export class EventBus {
|
|
3
|
+
listeners = new Set();
|
|
4
|
+
history = [];
|
|
5
|
+
emit(type, agentId, data) {
|
|
6
|
+
const event = {
|
|
7
|
+
type,
|
|
8
|
+
agentId,
|
|
9
|
+
timestamp: Date.now(),
|
|
10
|
+
data,
|
|
11
|
+
};
|
|
12
|
+
this.history.push(event);
|
|
13
|
+
if (this.history.length > MAX_HISTORY) {
|
|
14
|
+
this.history.shift();
|
|
15
|
+
}
|
|
16
|
+
for (const listener of this.listeners) {
|
|
17
|
+
try {
|
|
18
|
+
listener(event);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
// listener errors should not break the bus
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
subscribe(fn) {
|
|
26
|
+
this.listeners.add(fn);
|
|
27
|
+
return () => {
|
|
28
|
+
this.listeners.delete(fn);
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
getHistory() {
|
|
32
|
+
return [...this.history];
|
|
33
|
+
}
|
|
34
|
+
clear() {
|
|
35
|
+
this.history = [];
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export const bus = new EventBus();
|
|
39
|
+
//# sourceMappingURL=bus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bus.js","sourceRoot":"","sources":["../../src/engine/bus.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,GAAG,GAAG,CAAC;AAExB,MAAM,OAAO,QAAQ;IACX,SAAS,GAAuB,IAAI,GAAG,EAAE,CAAC;IAC1C,OAAO,GAAe,EAAE,CAAC;IAEjC,IAAI,CAAC,IAAkB,EAAE,OAAe,EAAE,IAA6B;QACrE,MAAM,KAAK,GAAa;YACtB,IAAI;YACJ,OAAO;YACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,IAAI;SACL,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;QACD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;YAAC,MAAM,CAAC;gBACP,2CAA2C;YAC7C,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS,CAAC,EAAiB;QACzB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvB,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC,CAAC;IACJ,CAAC;IAED,UAAU;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACpB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../src/engine/evaluate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAY,MAAM,YAAY,CAAC;AAEnF,wBAAgB,QAAQ,CAAC,UAAU,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,qBAAqB,GAAG,eAAe,EAAE,CAsBzG"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export function evaluate(candidates, failure) {
|
|
2
|
+
const maxSpeed = Math.max(...candidates.map((c) => c.estimatedSpeedMs), 1);
|
|
3
|
+
const maxCost = Math.max(...candidates.map((c) => c.estimatedCostUsd), 0.01);
|
|
4
|
+
const severityBonus = {
|
|
5
|
+
low: 0,
|
|
6
|
+
medium: 5,
|
|
7
|
+
high: 10,
|
|
8
|
+
critical: 20,
|
|
9
|
+
};
|
|
10
|
+
return candidates
|
|
11
|
+
.map((c) => {
|
|
12
|
+
const speedScore = 25 * (1 - c.estimatedSpeedMs / maxSpeed);
|
|
13
|
+
const costScore = 25 * (1 - c.estimatedCostUsd / maxCost);
|
|
14
|
+
const reqScore = 15 * (1 - c.requirements.length / 3);
|
|
15
|
+
const probScore = 25 * (c.successProbability ?? 0.5);
|
|
16
|
+
const sevBonus = severityBonus[failure.severity];
|
|
17
|
+
const score = Math.min(100, Math.round(speedScore + costScore + reqScore + probScore + sevBonus));
|
|
18
|
+
return { ...c, score };
|
|
19
|
+
})
|
|
20
|
+
.sort((a, b) => b.score - a.score);
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=evaluate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../src/engine/evaluate.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,QAAQ,CAAC,UAA6B,EAAE,OAA8B;IACpF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3E,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,EAAE,IAAI,CAAC,CAAC;IAE7E,MAAM,aAAa,GAA6B;QAC9C,GAAG,EAAE,CAAC;QACN,MAAM,EAAE,CAAC;QACT,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,EAAE;KACb,CAAC;IAEF,OAAO,UAAU;SACd,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,UAAU,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,gBAAgB,GAAG,QAAQ,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,gBAAgB,GAAG,OAAO,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,kBAAkB,IAAI,GAAG,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC;QAClG,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;IACzB,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ErrorCode, FailureCategory, GeneCapsule, Platform } from './types.js';
|
|
2
|
+
export declare class GeneMap {
|
|
3
|
+
private db;
|
|
4
|
+
private stmtLookup;
|
|
5
|
+
private stmtUpsert;
|
|
6
|
+
private stmtList;
|
|
7
|
+
private stmtCount;
|
|
8
|
+
private stmtUpdatePlatforms;
|
|
9
|
+
constructor(dbPath?: string);
|
|
10
|
+
lookup(code: ErrorCode, category: FailureCategory): GeneCapsule | null;
|
|
11
|
+
/** Add a platform to an existing gene if not already present */
|
|
12
|
+
addPlatform(code: ErrorCode, category: FailureCategory, platform: Platform): void;
|
|
13
|
+
store(gene: GeneCapsule): void;
|
|
14
|
+
list(): GeneCapsule[];
|
|
15
|
+
immuneCount(): number;
|
|
16
|
+
getSuccessRate(failureCode: string, strategy: string): number;
|
|
17
|
+
close(): void;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=gene-map.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gene-map.d.ts","sourceRoot":"","sources":["../../src/engine/gene-map.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAkBpF,qBAAa,OAAO;IAClB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,mBAAmB,CAAqB;gBAEpC,MAAM,GAAE,MAAmB;IAmCvC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,GAAG,WAAW,GAAG,IAAI;IAwBtE,gEAAgE;IAChE,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAUjF,KAAK,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAY9B,IAAI,IAAI,WAAW,EAAE;IAgBrB,WAAW,IAAI,MAAM;IAKrB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAW7D,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,130 @@
|
|
|
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
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
13
|
+
last_used_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
14
|
+
UNIQUE(failure_code, category)
|
|
15
|
+
);
|
|
16
|
+
`;
|
|
17
|
+
export class GeneMap {
|
|
18
|
+
db;
|
|
19
|
+
stmtLookup;
|
|
20
|
+
stmtUpsert;
|
|
21
|
+
stmtList;
|
|
22
|
+
stmtCount;
|
|
23
|
+
stmtUpdatePlatforms;
|
|
24
|
+
constructor(dbPath = ':memory:') {
|
|
25
|
+
this.db = new Database(dbPath);
|
|
26
|
+
this.db.pragma('journal_mode = WAL');
|
|
27
|
+
this.db.exec(SCHEMA);
|
|
28
|
+
this.stmtLookup = this.db.prepare(`
|
|
29
|
+
SELECT * FROM genes WHERE failure_code = ? AND category = ?
|
|
30
|
+
`);
|
|
31
|
+
this.stmtUpsert = this.db.prepare(`
|
|
32
|
+
INSERT INTO genes (failure_code, category, strategy, params, success_count, avg_repair_ms, platforms)
|
|
33
|
+
VALUES (@failureCode, @category, @strategy, @params, @successCount, @avgRepairMs, @platforms)
|
|
34
|
+
ON CONFLICT(failure_code, category) DO UPDATE SET
|
|
35
|
+
strategy = @strategy,
|
|
36
|
+
params = @params,
|
|
37
|
+
success_count = success_count + 1,
|
|
38
|
+
avg_repair_ms = (avg_repair_ms * success_count + @avgRepairMs) / (success_count + 1),
|
|
39
|
+
platforms = @platforms,
|
|
40
|
+
last_used_at = datetime('now')
|
|
41
|
+
`);
|
|
42
|
+
this.stmtList = this.db.prepare(`
|
|
43
|
+
SELECT * FROM genes ORDER BY success_count DESC
|
|
44
|
+
`);
|
|
45
|
+
this.stmtCount = this.db.prepare(`
|
|
46
|
+
SELECT COUNT(*) as count FROM genes
|
|
47
|
+
`);
|
|
48
|
+
this.stmtUpdatePlatforms = this.db.prepare(`
|
|
49
|
+
UPDATE genes SET platforms = ?, last_used_at = datetime('now')
|
|
50
|
+
WHERE failure_code = ? AND category = ?
|
|
51
|
+
`);
|
|
52
|
+
}
|
|
53
|
+
lookup(code, category) {
|
|
54
|
+
const row = this.stmtLookup.get(code, category);
|
|
55
|
+
if (!row)
|
|
56
|
+
return null;
|
|
57
|
+
// Update last_used_at and increment success_count on hit
|
|
58
|
+
this.db.prepare(`
|
|
59
|
+
UPDATE genes SET last_used_at = datetime('now'), success_count = success_count + 1
|
|
60
|
+
WHERE failure_code = ? AND category = ?
|
|
61
|
+
`).run(code, category);
|
|
62
|
+
return {
|
|
63
|
+
id: row.id,
|
|
64
|
+
failureCode: row.failure_code,
|
|
65
|
+
category: row.category,
|
|
66
|
+
strategy: row.strategy,
|
|
67
|
+
params: JSON.parse(row.params),
|
|
68
|
+
successCount: row.success_count + 1,
|
|
69
|
+
avgRepairMs: row.avg_repair_ms,
|
|
70
|
+
platforms: JSON.parse(row.platforms),
|
|
71
|
+
createdAt: row.created_at,
|
|
72
|
+
lastUsedAt: row.last_used_at,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/** Add a platform to an existing gene if not already present */
|
|
76
|
+
addPlatform(code, category, platform) {
|
|
77
|
+
const row = this.stmtLookup.get(code, category);
|
|
78
|
+
if (!row)
|
|
79
|
+
return;
|
|
80
|
+
const platforms = JSON.parse(row.platforms);
|
|
81
|
+
if (!platforms.includes(platform)) {
|
|
82
|
+
platforms.push(platform);
|
|
83
|
+
this.stmtUpdatePlatforms.run(JSON.stringify(platforms), code, category);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
store(gene) {
|
|
87
|
+
this.stmtUpsert.run({
|
|
88
|
+
failureCode: gene.failureCode,
|
|
89
|
+
category: gene.category,
|
|
90
|
+
strategy: gene.strategy,
|
|
91
|
+
params: JSON.stringify(gene.params),
|
|
92
|
+
successCount: gene.successCount,
|
|
93
|
+
avgRepairMs: gene.avgRepairMs,
|
|
94
|
+
platforms: JSON.stringify(gene.platforms),
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
list() {
|
|
98
|
+
const rows = this.stmtList.all();
|
|
99
|
+
return rows.map((row) => ({
|
|
100
|
+
id: row.id,
|
|
101
|
+
failureCode: row.failure_code,
|
|
102
|
+
category: row.category,
|
|
103
|
+
strategy: row.strategy,
|
|
104
|
+
params: JSON.parse(row.params),
|
|
105
|
+
successCount: row.success_count,
|
|
106
|
+
avgRepairMs: row.avg_repair_ms,
|
|
107
|
+
platforms: JSON.parse(row.platforms),
|
|
108
|
+
createdAt: row.created_at,
|
|
109
|
+
lastUsedAt: row.last_used_at,
|
|
110
|
+
}));
|
|
111
|
+
}
|
|
112
|
+
immuneCount() {
|
|
113
|
+
const row = this.stmtCount.get();
|
|
114
|
+
return row.count;
|
|
115
|
+
}
|
|
116
|
+
getSuccessRate(failureCode, strategy) {
|
|
117
|
+
const row = this.db.prepare(`
|
|
118
|
+
SELECT success_count FROM genes
|
|
119
|
+
WHERE failure_code = ? AND strategy = ?
|
|
120
|
+
`).get(failureCode, strategy);
|
|
121
|
+
if (!row || row.success_count < 3)
|
|
122
|
+
return 0.5; // too few samples, return neutral
|
|
123
|
+
// More successes → higher probability, capped at 0.95
|
|
124
|
+
return Math.min(0.5 + (row.success_count / 100), 0.95);
|
|
125
|
+
}
|
|
126
|
+
close() {
|
|
127
|
+
this.db.close();
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=gene-map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gene-map.js","sourceRoot":"","sources":["../../src/engine/gene-map.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { GeneMap } from './gene-map.js';
|
|
2
|
+
import type { FailureClassification, GeneCapsule, PlatformAdapter, RepairCandidate, RepairResult } from './types.js';
|
|
3
|
+
export declare function commit(winner: RepairCandidate, _failure: FailureClassification): Promise<{
|
|
4
|
+
success: boolean;
|
|
5
|
+
result: string;
|
|
6
|
+
}>;
|
|
7
|
+
export declare class PcecEngine {
|
|
8
|
+
private adapters;
|
|
9
|
+
private geneMap;
|
|
10
|
+
private agentId;
|
|
11
|
+
stats: {
|
|
12
|
+
repairs: number;
|
|
13
|
+
savedRevenue: number;
|
|
14
|
+
immuneHits: number;
|
|
15
|
+
};
|
|
16
|
+
private readonly MAX_CYCLES;
|
|
17
|
+
private cycleCount;
|
|
18
|
+
constructor(geneMap: GeneMap, agentId?: string);
|
|
19
|
+
/** Register platform adapters (order matters — first match wins for perceive) */
|
|
20
|
+
registerAdapter(adapter: PlatformAdapter): void;
|
|
21
|
+
/** Perceive chains through adapters until one matches */
|
|
22
|
+
private perceive;
|
|
23
|
+
/** Construct collects candidates from ALL adapters */
|
|
24
|
+
private construct;
|
|
25
|
+
/** Full P→C→E→K repair flow */
|
|
26
|
+
repair(error: Error, context?: Record<string, unknown>): Promise<RepairResult>;
|
|
27
|
+
getStats(): {
|
|
28
|
+
geneCount: number;
|
|
29
|
+
genes: GeneCapsule[];
|
|
30
|
+
repairs: number;
|
|
31
|
+
savedRevenue: number;
|
|
32
|
+
immuneHits: number;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=pcec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pcec.d.ts","sourceRoot":"","sources":["../../src/engine/pcec.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,EACV,qBAAqB,EACrB,WAAW,EACX,eAAe,EACf,eAAe,EACf,YAAY,EACb,MAAM,YAAY,CAAC;AAKpB,wBAAsB,MAAM,CAC1B,MAAM,EAAE,eAAe,EACvB,QAAQ,EAAE,qBAAqB,GAC9B,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAU/C;AAID,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,OAAO,CAAS;IACjB,KAAK;;;;MAAkD;IAC9D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAM;IACjC,OAAO,CAAC,UAAU,CAAK;gBAEX,OAAO,EAAE,OAAO,EAAE,OAAO,GAAE,MAAkB;IAKzD,iFAAiF;IACjF,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAI/C,yDAAyD;IACzD,OAAO,CAAC,QAAQ;IAgBhB,sDAAsD;IACtD,OAAO,CAAC,SAAS;IAYjB,+BAA+B;IACzB,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IA6MpF,QAAQ;;;;;;;CAOT"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import { bus } from './bus.js';
|
|
2
|
+
import { evaluate } from './evaluate.js';
|
|
3
|
+
import { REVENUE_AT_RISK } from './types.js';
|
|
4
|
+
// ── Commit (simulated) ─────────────────────────────────────────────
|
|
5
|
+
export async function commit(winner, _failure) {
|
|
6
|
+
// Simulate execution with realistic delay
|
|
7
|
+
const jitter = Math.random() * 200;
|
|
8
|
+
await new Promise((r) => setTimeout(r, Math.min(winner.estimatedSpeedMs * 0.3 + jitter, 800)));
|
|
9
|
+
// In production: call platform SDK, execute DEX swap, renew session, etc.
|
|
10
|
+
return {
|
|
11
|
+
success: true,
|
|
12
|
+
result: `Executed ${winner.strategy}: ${winner.description}`,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
// ── PCEC Engine ─────────────────────────────────────────────────────
|
|
16
|
+
export class PcecEngine {
|
|
17
|
+
adapters = [];
|
|
18
|
+
geneMap;
|
|
19
|
+
agentId;
|
|
20
|
+
stats = { repairs: 0, savedRevenue: 0, immuneHits: 0 };
|
|
21
|
+
MAX_CYCLES = 50;
|
|
22
|
+
cycleCount = 0;
|
|
23
|
+
constructor(geneMap, agentId = 'default') {
|
|
24
|
+
this.geneMap = geneMap;
|
|
25
|
+
this.agentId = agentId;
|
|
26
|
+
}
|
|
27
|
+
/** Register platform adapters (order matters — first match wins for perceive) */
|
|
28
|
+
registerAdapter(adapter) {
|
|
29
|
+
this.adapters.push(adapter);
|
|
30
|
+
}
|
|
31
|
+
/** Perceive chains through adapters until one matches */
|
|
32
|
+
perceive(error, context) {
|
|
33
|
+
for (const adapter of this.adapters) {
|
|
34
|
+
const result = adapter.perceive(error, context);
|
|
35
|
+
if (result)
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
38
|
+
// Fallback: unknown
|
|
39
|
+
return {
|
|
40
|
+
code: 'unknown',
|
|
41
|
+
category: 'unknown',
|
|
42
|
+
severity: 'medium',
|
|
43
|
+
platform: 'unknown',
|
|
44
|
+
details: error.message,
|
|
45
|
+
timestamp: Date.now(),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/** Construct collects candidates from ALL adapters */
|
|
49
|
+
construct(failure) {
|
|
50
|
+
const candidates = [];
|
|
51
|
+
for (const adapter of this.adapters) {
|
|
52
|
+
candidates.push(...adapter.construct(failure));
|
|
53
|
+
}
|
|
54
|
+
// Enrich with Gene Map success rates
|
|
55
|
+
return candidates.map((c) => ({
|
|
56
|
+
...c,
|
|
57
|
+
successProbability: this.geneMap.getSuccessRate(failure.code, c.strategy),
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
/** Full P→C→E→K repair flow */
|
|
61
|
+
async repair(error, context) {
|
|
62
|
+
const start = Date.now();
|
|
63
|
+
// Safety check: prevent infinite repair cycles
|
|
64
|
+
this.cycleCount++;
|
|
65
|
+
if (this.cycleCount > this.MAX_CYCLES) {
|
|
66
|
+
this.cycleCount = 0;
|
|
67
|
+
bus.emit('error', this.agentId, {
|
|
68
|
+
reason: 'MAX_CYCLES_EXCEEDED',
|
|
69
|
+
cycles: this.MAX_CYCLES,
|
|
70
|
+
message: `PCEC halted after ${this.MAX_CYCLES} cycles to prevent runaway repair`,
|
|
71
|
+
});
|
|
72
|
+
return {
|
|
73
|
+
success: false,
|
|
74
|
+
failure: this.perceive(error, context),
|
|
75
|
+
candidates: [],
|
|
76
|
+
winner: null,
|
|
77
|
+
gene: null,
|
|
78
|
+
immune: false,
|
|
79
|
+
totalMs: 0,
|
|
80
|
+
revenueProtected: 0,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
// ── PERCEIVE ──
|
|
84
|
+
const failure = this.perceive(error, context);
|
|
85
|
+
bus.emit('perceive', this.agentId, {
|
|
86
|
+
code: failure.code,
|
|
87
|
+
category: failure.category,
|
|
88
|
+
severity: failure.severity,
|
|
89
|
+
platform: failure.platform,
|
|
90
|
+
details: failure.details,
|
|
91
|
+
actualBalance: failure.actualBalance,
|
|
92
|
+
requiredAmount: failure.requiredAmount,
|
|
93
|
+
});
|
|
94
|
+
// ── Check Gene Map for immunity (by code+category, NOT platform) ──
|
|
95
|
+
const existingGene = this.geneMap.lookup(failure.code, failure.category);
|
|
96
|
+
if (existingGene) {
|
|
97
|
+
this.stats.immuneHits++;
|
|
98
|
+
this.stats.repairs++;
|
|
99
|
+
const revenue = REVENUE_AT_RISK[failure.category] ?? 50;
|
|
100
|
+
this.stats.savedRevenue += revenue;
|
|
101
|
+
// Add this platform to the gene if it's a new one
|
|
102
|
+
if (!existingGene.platforms.includes(failure.platform)) {
|
|
103
|
+
existingGene.platforms.push(failure.platform);
|
|
104
|
+
this.geneMap.addPlatform(failure.code, failure.category, failure.platform);
|
|
105
|
+
}
|
|
106
|
+
bus.emit('immune', this.agentId, {
|
|
107
|
+
code: failure.code,
|
|
108
|
+
category: failure.category,
|
|
109
|
+
strategy: existingGene.strategy,
|
|
110
|
+
successCount: existingGene.successCount,
|
|
111
|
+
avgRepairMs: existingGene.avgRepairMs,
|
|
112
|
+
platforms: existingGene.platforms,
|
|
113
|
+
crossPlatform: existingGene.platforms.length > 1,
|
|
114
|
+
});
|
|
115
|
+
// Execute known fix instantly
|
|
116
|
+
const immuneStart = Date.now();
|
|
117
|
+
await new Promise((r) => setTimeout(r, 50 + Math.random() * 50)); // near-instant
|
|
118
|
+
const immuneMs = Date.now() - immuneStart;
|
|
119
|
+
// Update gene with new timing
|
|
120
|
+
this.geneMap.store({
|
|
121
|
+
...existingGene,
|
|
122
|
+
avgRepairMs: immuneMs,
|
|
123
|
+
});
|
|
124
|
+
return {
|
|
125
|
+
success: true,
|
|
126
|
+
failure,
|
|
127
|
+
candidates: [],
|
|
128
|
+
winner: {
|
|
129
|
+
id: existingGene.strategy,
|
|
130
|
+
strategy: existingGene.strategy,
|
|
131
|
+
description: `Immune: ${existingGene.strategy} (${existingGene.successCount} prior fixes, platforms: ${existingGene.platforms.join(', ')})`,
|
|
132
|
+
estimatedCostUsd: 0,
|
|
133
|
+
estimatedSpeedMs: immuneMs,
|
|
134
|
+
requirements: [],
|
|
135
|
+
score: 100,
|
|
136
|
+
successProbability: 0.99,
|
|
137
|
+
platform: failure.platform,
|
|
138
|
+
},
|
|
139
|
+
gene: existingGene,
|
|
140
|
+
immune: true,
|
|
141
|
+
totalMs: Date.now() - start,
|
|
142
|
+
revenueProtected: revenue,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
// ── CONSTRUCT (collects from ALL adapters) ──
|
|
146
|
+
const candidates = this.construct(failure);
|
|
147
|
+
if (candidates.length === 0) {
|
|
148
|
+
bus.emit('error', this.agentId, {
|
|
149
|
+
reason: 'NO_CANDIDATES',
|
|
150
|
+
code: failure.code,
|
|
151
|
+
category: failure.category,
|
|
152
|
+
});
|
|
153
|
+
return {
|
|
154
|
+
success: false,
|
|
155
|
+
failure,
|
|
156
|
+
candidates: [],
|
|
157
|
+
winner: null,
|
|
158
|
+
gene: null,
|
|
159
|
+
immune: false,
|
|
160
|
+
totalMs: Date.now() - start,
|
|
161
|
+
revenueProtected: 0,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
bus.emit('construct', this.agentId, {
|
|
165
|
+
category: failure.category,
|
|
166
|
+
candidateCount: candidates.length,
|
|
167
|
+
candidates: candidates.map((c) => ({ id: c.id, strategy: c.strategy, description: c.description, platform: c.platform })),
|
|
168
|
+
});
|
|
169
|
+
// ── EVALUATE ──
|
|
170
|
+
const scored = evaluate(candidates, failure);
|
|
171
|
+
const winner = scored[0];
|
|
172
|
+
bus.emit('evaluate', this.agentId, {
|
|
173
|
+
winner: winner.strategy,
|
|
174
|
+
score: winner.score,
|
|
175
|
+
platform: winner.platform,
|
|
176
|
+
allScores: scored.map((c) => ({ strategy: c.strategy, score: c.score, platform: c.platform })),
|
|
177
|
+
});
|
|
178
|
+
// ── COMMIT ──
|
|
179
|
+
const result = await commit(winner, failure);
|
|
180
|
+
const totalMs = Date.now() - start;
|
|
181
|
+
const revenue = REVENUE_AT_RISK[failure.category] ?? 50;
|
|
182
|
+
if (result.success) {
|
|
183
|
+
this.stats.repairs++;
|
|
184
|
+
this.stats.savedRevenue += revenue;
|
|
185
|
+
// Store Gene Capsule (keyed by code+category, platform-agnostic)
|
|
186
|
+
const gene = {
|
|
187
|
+
failureCode: failure.code,
|
|
188
|
+
category: failure.category,
|
|
189
|
+
strategy: winner.strategy,
|
|
190
|
+
params: { description: winner.description },
|
|
191
|
+
successCount: 1,
|
|
192
|
+
avgRepairMs: totalMs,
|
|
193
|
+
platforms: [failure.platform],
|
|
194
|
+
};
|
|
195
|
+
this.geneMap.store(gene);
|
|
196
|
+
this.cycleCount = 0;
|
|
197
|
+
bus.emit('commit', this.agentId, {
|
|
198
|
+
success: true,
|
|
199
|
+
strategy: winner.strategy,
|
|
200
|
+
platform: winner.platform,
|
|
201
|
+
result: result.result,
|
|
202
|
+
totalMs,
|
|
203
|
+
});
|
|
204
|
+
bus.emit('gene', this.agentId, {
|
|
205
|
+
code: failure.code,
|
|
206
|
+
category: failure.category,
|
|
207
|
+
strategy: winner.strategy,
|
|
208
|
+
platform: failure.platform,
|
|
209
|
+
totalMs,
|
|
210
|
+
});
|
|
211
|
+
bus.emit('stats', this.agentId, {
|
|
212
|
+
totalRepairs: this.stats.repairs,
|
|
213
|
+
savedRevenue: this.stats.savedRevenue,
|
|
214
|
+
immuneHits: this.stats.immuneHits,
|
|
215
|
+
geneCount: this.geneMap.immuneCount(),
|
|
216
|
+
});
|
|
217
|
+
return {
|
|
218
|
+
success: true,
|
|
219
|
+
failure,
|
|
220
|
+
candidates: scored,
|
|
221
|
+
winner,
|
|
222
|
+
gene,
|
|
223
|
+
immune: false,
|
|
224
|
+
totalMs,
|
|
225
|
+
revenueProtected: revenue,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
bus.emit('commit', this.agentId, {
|
|
229
|
+
success: false,
|
|
230
|
+
strategy: winner.strategy,
|
|
231
|
+
error: result.result,
|
|
232
|
+
totalMs,
|
|
233
|
+
});
|
|
234
|
+
return {
|
|
235
|
+
success: false,
|
|
236
|
+
failure,
|
|
237
|
+
candidates: scored,
|
|
238
|
+
winner,
|
|
239
|
+
gene: null,
|
|
240
|
+
immune: false,
|
|
241
|
+
totalMs,
|
|
242
|
+
revenueProtected: 0,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
getStats() {
|
|
246
|
+
return {
|
|
247
|
+
...this.stats,
|
|
248
|
+
geneCount: this.geneMap.immuneCount(),
|
|
249
|
+
genes: this.geneMap.list(),
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=pcec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pcec.js","sourceRoot":"","sources":["../../src/engine/pcec.ts"],"names":[],"mappings":"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"}
|