agentic-qe 3.4.2 → 3.4.4
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/.claude/skills/README.md +126 -35
- package/package.json +1 -1
- package/v3/CHANGELOG.md +50 -0
- package/v3/README.md +18 -24
- package/v3/dist/cli/bundle.js +10693 -10285
- package/v3/dist/cli/commands/init.d.ts.map +1 -1
- package/v3/dist/cli/commands/init.js +5 -2
- package/v3/dist/cli/commands/init.js.map +1 -1
- package/v3/dist/cli/handlers/init-handler.d.ts +1 -0
- package/v3/dist/cli/handlers/init-handler.d.ts.map +1 -1
- package/v3/dist/cli/handlers/init-handler.js +10 -1
- package/v3/dist/cli/handlers/init-handler.js.map +1 -1
- package/v3/dist/init/agents-installer.d.ts.map +1 -1
- package/v3/dist/init/agents-installer.js +20 -16
- package/v3/dist/init/agents-installer.js.map +1 -1
- package/v3/dist/init/orchestrator.d.ts.map +1 -1
- package/v3/dist/init/orchestrator.js +1 -0
- package/v3/dist/init/orchestrator.js.map +1 -1
- package/v3/dist/init/phases/04-database.d.ts +14 -2
- package/v3/dist/init/phases/04-database.d.ts.map +1 -1
- package/v3/dist/init/phases/04-database.js +50 -48
- package/v3/dist/init/phases/04-database.js.map +1 -1
- package/v3/dist/init/phases/08-mcp.d.ts +6 -1
- package/v3/dist/init/phases/08-mcp.d.ts.map +1 -1
- package/v3/dist/init/phases/08-mcp.js +54 -28
- package/v3/dist/init/phases/08-mcp.js.map +1 -1
- package/v3/dist/init/phases/09-assets.d.ts.map +1 -1
- package/v3/dist/init/phases/09-assets.js +8 -3
- package/v3/dist/init/phases/09-assets.js.map +1 -1
- package/v3/dist/init/phases/10-workers.d.ts +11 -0
- package/v3/dist/init/phases/10-workers.d.ts.map +1 -1
- package/v3/dist/init/phases/10-workers.js +246 -11
- package/v3/dist/init/phases/10-workers.js.map +1 -1
- package/v3/dist/init/phases/phase-interface.d.ts +2 -0
- package/v3/dist/init/phases/phase-interface.d.ts.map +1 -1
- package/v3/dist/init/phases/phase-interface.js.map +1 -1
- package/v3/dist/init/skills-installer.d.ts +5 -0
- package/v3/dist/init/skills-installer.d.ts.map +1 -1
- package/v3/dist/init/skills-installer.js +77 -26
- package/v3/dist/init/skills-installer.js.map +1 -1
- package/v3/dist/integrations/agent-booster-wasm/index.d.ts +36 -19
- package/v3/dist/integrations/agent-booster-wasm/index.d.ts.map +1 -1
- package/v3/dist/integrations/agent-booster-wasm/index.js +32 -21
- package/v3/dist/integrations/agent-booster-wasm/index.js.map +1 -1
- package/v3/dist/integrations/agentic-flow/agent-booster/adapter.d.ts.map +1 -1
- package/v3/dist/integrations/agentic-flow/agent-booster/adapter.js +57 -4
- package/v3/dist/integrations/agentic-flow/agent-booster/adapter.js.map +1 -1
- package/v3/dist/mcp/bundle.js +143 -28
- package/v3/dist/strange-loop/healing-controller.d.ts.map +1 -1
- package/v3/dist/strange-loop/healing-controller.js +54 -2
- package/v3/dist/strange-loop/healing-controller.js.map +1 -1
- package/v3/dist/strange-loop/index.d.ts +2 -1
- package/v3/dist/strange-loop/index.d.ts.map +1 -1
- package/v3/dist/strange-loop/index.js +3 -1
- package/v3/dist/strange-loop/index.js.map +1 -1
- package/v3/dist/strange-loop/infra-healing/composite-action-executor.d.ts +39 -0
- package/v3/dist/strange-loop/infra-healing/composite-action-executor.d.ts.map +1 -0
- package/v3/dist/strange-loop/infra-healing/composite-action-executor.js +82 -0
- package/v3/dist/strange-loop/infra-healing/composite-action-executor.js.map +1 -0
- package/v3/dist/strange-loop/infra-healing/coordination-lock.d.ts +54 -0
- package/v3/dist/strange-loop/infra-healing/coordination-lock.d.ts.map +1 -0
- package/v3/dist/strange-loop/infra-healing/coordination-lock.js +104 -0
- package/v3/dist/strange-loop/infra-healing/coordination-lock.js.map +1 -0
- package/v3/dist/strange-loop/infra-healing/index.d.ts +20 -0
- package/v3/dist/strange-loop/infra-healing/index.d.ts.map +1 -0
- package/v3/dist/strange-loop/infra-healing/index.js +26 -0
- package/v3/dist/strange-loop/infra-healing/index.js.map +1 -0
- package/v3/dist/strange-loop/infra-healing/infra-action-executor.d.ts +70 -0
- package/v3/dist/strange-loop/infra-healing/infra-action-executor.d.ts.map +1 -0
- package/v3/dist/strange-loop/infra-healing/infra-action-executor.js +260 -0
- package/v3/dist/strange-loop/infra-healing/infra-action-executor.js.map +1 -0
- package/v3/dist/strange-loop/infra-healing/infra-aware-agent-provider.d.ts +56 -0
- package/v3/dist/strange-loop/infra-healing/infra-aware-agent-provider.d.ts.map +1 -0
- package/v3/dist/strange-loop/infra-healing/infra-aware-agent-provider.js +108 -0
- package/v3/dist/strange-loop/infra-healing/infra-aware-agent-provider.js.map +1 -0
- package/v3/dist/strange-loop/infra-healing/infra-healing-orchestrator.d.ts +102 -0
- package/v3/dist/strange-loop/infra-healing/infra-healing-orchestrator.d.ts.map +1 -0
- package/v3/dist/strange-loop/infra-healing/infra-healing-orchestrator.js +201 -0
- package/v3/dist/strange-loop/infra-healing/infra-healing-orchestrator.js.map +1 -0
- package/v3/dist/strange-loop/infra-healing/recovery-playbook.d.ts +74 -0
- package/v3/dist/strange-loop/infra-healing/recovery-playbook.d.ts.map +1 -0
- package/v3/dist/strange-loop/infra-healing/recovery-playbook.js +153 -0
- package/v3/dist/strange-loop/infra-healing/recovery-playbook.js.map +1 -0
- package/v3/dist/strange-loop/infra-healing/test-output-observer.d.ts +61 -0
- package/v3/dist/strange-loop/infra-healing/test-output-observer.d.ts.map +1 -0
- package/v3/dist/strange-loop/infra-healing/test-output-observer.js +339 -0
- package/v3/dist/strange-loop/infra-healing/test-output-observer.js.map +1 -0
- package/v3/dist/strange-loop/infra-healing/types.d.ts +253 -0
- package/v3/dist/strange-loop/infra-healing/types.d.ts.map +1 -0
- package/v3/dist/strange-loop/infra-healing/types.js +33 -0
- package/v3/dist/strange-loop/infra-healing/types.js.map +1 -0
- package/v3/dist/strange-loop/strange-loop.d.ts +63 -0
- package/v3/dist/strange-loop/strange-loop.d.ts.map +1 -1
- package/v3/dist/strange-loop/strange-loop.js +62 -0
- package/v3/dist/strange-loop/strange-loop.js.map +1 -1
- package/v3/dist/strange-loop/types.d.ts +2 -2
- package/v3/dist/strange-loop/types.d.ts.map +1 -1
- package/v3/dist/strange-loop/types.js.map +1 -1
- package/v3/dist/sync/embeddings/index.d.ts +9 -0
- package/v3/dist/sync/embeddings/index.d.ts.map +1 -0
- package/v3/dist/sync/embeddings/index.js +9 -0
- package/v3/dist/sync/embeddings/index.js.map +1 -0
- package/v3/dist/sync/embeddings/sync-embedding-generator.d.ts +101 -0
- package/v3/dist/sync/embeddings/sync-embedding-generator.d.ts.map +1 -0
- package/v3/dist/sync/embeddings/sync-embedding-generator.js +264 -0
- package/v3/dist/sync/embeddings/sync-embedding-generator.js.map +1 -0
- package/v3/dist/sync/index.d.ts +1 -0
- package/v3/dist/sync/index.d.ts.map +1 -1
- package/v3/dist/sync/index.js +2 -0
- package/v3/dist/sync/index.js.map +1 -1
- package/v3/dist/workers/workers/cloud-sync.d.ts +19 -0
- package/v3/dist/workers/workers/cloud-sync.d.ts.map +1 -0
- package/v3/dist/workers/workers/cloud-sync.js +177 -0
- package/v3/dist/workers/workers/cloud-sync.js.map +1 -0
- package/v3/dist/workers/workers/index.d.ts +12 -11
- package/v3/dist/workers/workers/index.d.ts.map +1 -1
- package/v3/dist/workers/workers/index.js +12 -11
- package/v3/dist/workers/workers/index.js.map +1 -1
- package/v3/package.json +8 -4
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coordination Lock
|
|
3
|
+
* ADR-057: Infrastructure Self-Healing Extension
|
|
4
|
+
*
|
|
5
|
+
* In-process async mutex keyed by service name.
|
|
6
|
+
* Prevents duplicate recovery attempts for the same infrastructure service.
|
|
7
|
+
* Includes TTL auto-expiry to prevent stale locks from blocking recovery.
|
|
8
|
+
*/
|
|
9
|
+
import type { CoordinationLockEntry, LockAcquireResult } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Async mutex for coordinating infrastructure recovery operations.
|
|
12
|
+
* Keyed by service name — only one recovery can run per service at a time.
|
|
13
|
+
*/
|
|
14
|
+
export declare class CoordinationLock {
|
|
15
|
+
private locks;
|
|
16
|
+
private readonly defaultTtlMs;
|
|
17
|
+
constructor(defaultTtlMs?: number);
|
|
18
|
+
/**
|
|
19
|
+
* Attempt to acquire the lock for a service.
|
|
20
|
+
* Returns immediately — does not block.
|
|
21
|
+
*/
|
|
22
|
+
acquire(serviceName: string, holderId: string, ttlMs?: number): LockAcquireResult;
|
|
23
|
+
/**
|
|
24
|
+
* Release the lock for a service.
|
|
25
|
+
* Only the holder can release it.
|
|
26
|
+
* Returns true if the lock was released, false if not held or wrong holder.
|
|
27
|
+
*/
|
|
28
|
+
release(serviceName: string, holderId: string): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Check if a service is currently locked.
|
|
31
|
+
*/
|
|
32
|
+
isLocked(serviceName: string): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Get the lock entry for a service (if any).
|
|
35
|
+
*/
|
|
36
|
+
getLock(serviceName: string): CoordinationLockEntry | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Get all active (non-expired) locks.
|
|
39
|
+
*/
|
|
40
|
+
getActiveLocks(): readonly CoordinationLockEntry[];
|
|
41
|
+
/**
|
|
42
|
+
* Force-release all locks (for shutdown/reset).
|
|
43
|
+
*/
|
|
44
|
+
releaseAll(): void;
|
|
45
|
+
/**
|
|
46
|
+
* Evict expired locks based on TTL.
|
|
47
|
+
*/
|
|
48
|
+
private evictExpired;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Factory function for creating a CoordinationLock.
|
|
52
|
+
*/
|
|
53
|
+
export declare function createCoordinationLock(defaultTtlMs?: number): CoordinationLock;
|
|
54
|
+
//# sourceMappingURL=coordination-lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordination-lock.d.ts","sourceRoot":"","sources":["../../../src/strange-loop/infra-healing/coordination-lock.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAM3E;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAiD;IAC9D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,YAAY,GAAE,MAAgB;IAI1C;;;OAGG;IACH,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,iBAAiB;IAuBjF;;;;OAIG;IACH,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IASvD;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAKtC;;OAEG;IACH,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS;IAK/D;;OAEG;IACH,cAAc,IAAI,SAAS,qBAAqB,EAAE;IAKlD;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,OAAO,CAAC,YAAY;CAQrB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAE9E"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coordination Lock
|
|
3
|
+
* ADR-057: Infrastructure Self-Healing Extension
|
|
4
|
+
*
|
|
5
|
+
* In-process async mutex keyed by service name.
|
|
6
|
+
* Prevents duplicate recovery attempts for the same infrastructure service.
|
|
7
|
+
* Includes TTL auto-expiry to prevent stale locks from blocking recovery.
|
|
8
|
+
*/
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Coordination Lock
|
|
11
|
+
// ============================================================================
|
|
12
|
+
/**
|
|
13
|
+
* Async mutex for coordinating infrastructure recovery operations.
|
|
14
|
+
* Keyed by service name — only one recovery can run per service at a time.
|
|
15
|
+
*/
|
|
16
|
+
export class CoordinationLock {
|
|
17
|
+
locks = new Map();
|
|
18
|
+
defaultTtlMs;
|
|
19
|
+
constructor(defaultTtlMs = 120_000) {
|
|
20
|
+
this.defaultTtlMs = defaultTtlMs;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Attempt to acquire the lock for a service.
|
|
24
|
+
* Returns immediately — does not block.
|
|
25
|
+
*/
|
|
26
|
+
acquire(serviceName, holderId, ttlMs) {
|
|
27
|
+
this.evictExpired();
|
|
28
|
+
const existing = this.locks.get(serviceName);
|
|
29
|
+
if (existing) {
|
|
30
|
+
return {
|
|
31
|
+
acquired: false,
|
|
32
|
+
currentHolder: existing.holderId,
|
|
33
|
+
expiresAt: existing.acquiredAt + existing.ttlMs,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
const entry = {
|
|
37
|
+
serviceName,
|
|
38
|
+
holderId,
|
|
39
|
+
acquiredAt: Date.now(),
|
|
40
|
+
ttlMs: ttlMs ?? this.defaultTtlMs,
|
|
41
|
+
};
|
|
42
|
+
this.locks.set(serviceName, entry);
|
|
43
|
+
return { acquired: true };
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Release the lock for a service.
|
|
47
|
+
* Only the holder can release it.
|
|
48
|
+
* Returns true if the lock was released, false if not held or wrong holder.
|
|
49
|
+
*/
|
|
50
|
+
release(serviceName, holderId) {
|
|
51
|
+
const existing = this.locks.get(serviceName);
|
|
52
|
+
if (!existing)
|
|
53
|
+
return false;
|
|
54
|
+
if (existing.holderId !== holderId)
|
|
55
|
+
return false;
|
|
56
|
+
this.locks.delete(serviceName);
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Check if a service is currently locked.
|
|
61
|
+
*/
|
|
62
|
+
isLocked(serviceName) {
|
|
63
|
+
this.evictExpired();
|
|
64
|
+
return this.locks.has(serviceName);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get the lock entry for a service (if any).
|
|
68
|
+
*/
|
|
69
|
+
getLock(serviceName) {
|
|
70
|
+
this.evictExpired();
|
|
71
|
+
return this.locks.get(serviceName);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get all active (non-expired) locks.
|
|
75
|
+
*/
|
|
76
|
+
getActiveLocks() {
|
|
77
|
+
this.evictExpired();
|
|
78
|
+
return Array.from(this.locks.values());
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Force-release all locks (for shutdown/reset).
|
|
82
|
+
*/
|
|
83
|
+
releaseAll() {
|
|
84
|
+
this.locks.clear();
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Evict expired locks based on TTL.
|
|
88
|
+
*/
|
|
89
|
+
evictExpired() {
|
|
90
|
+
const now = Date.now();
|
|
91
|
+
for (const [serviceName, entry] of this.locks) {
|
|
92
|
+
if (now >= entry.acquiredAt + entry.ttlMs) {
|
|
93
|
+
this.locks.delete(serviceName);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Factory function for creating a CoordinationLock.
|
|
100
|
+
*/
|
|
101
|
+
export function createCoordinationLock(defaultTtlMs) {
|
|
102
|
+
return new CoordinationLock(defaultTtlMs);
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=coordination-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordination-lock.js","sourceRoot":"","sources":["../../../src/strange-loop/infra-healing/coordination-lock.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IACnB,KAAK,GAAuC,IAAI,GAAG,EAAE,CAAC;IAC7C,YAAY,CAAS;IAEtC,YAAY,eAAuB,OAAO;QACxC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAED;;;OAGG;IACH,OAAO,CAAC,WAAmB,EAAE,QAAgB,EAAE,KAAc;QAC3D,IAAI,CAAC,YAAY,EAAE,CAAC;QAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC7C,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO;gBACL,QAAQ,EAAE,KAAK;gBACf,aAAa,EAAE,QAAQ,CAAC,QAAQ;gBAChC,SAAS,EAAE,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,KAAK;aAChD,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAA0B;YACnC,WAAW;YACX,QAAQ;YACR,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;YACtB,KAAK,EAAE,KAAK,IAAI,IAAI,CAAC,YAAY;SAClC,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACnC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,WAAmB,EAAE,QAAgB;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC7C,IAAI,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC5B,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAEjD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,WAAmB;QAC1B,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,WAAmB;QACzB,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED;;OAEG;IACK,YAAY;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9C,IAAI,GAAG,IAAI,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC1C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,YAAqB;IAC1D,OAAO,IAAI,gBAAgB,CAAC,YAAY,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Infrastructure Self-Healing Module
|
|
3
|
+
* ADR-057: Infrastructure Self-Healing Extension for Strange Loop
|
|
4
|
+
*
|
|
5
|
+
* Extends the Strange Loop self-awareness system to detect and recover from
|
|
6
|
+
* infrastructure failures during test execution. Framework-agnostic via
|
|
7
|
+
* YAML-driven recovery playbooks.
|
|
8
|
+
*
|
|
9
|
+
* @module strange-loop/infra-healing
|
|
10
|
+
*/
|
|
11
|
+
export type { TestOutputClassification, InfraErrorSignature, ClassifiedError, TestOutputObservation, CommandRunner, CommandResult, RecoveryCommand, ServiceRecoveryPlan, RecoveryPlaybookConfig, CoordinationLockEntry, LockAcquireResult, RecoveryAttemptResult, ServiceRecoveryResult, InfraHealingConfig, InfraHealingStats, } from './types.js';
|
|
12
|
+
export { DEFAULT_INFRA_HEALING_CONFIG, createEmptyStats } from './types.js';
|
|
13
|
+
export { TestOutputObserver, createTestOutputObserver, DEFAULT_ERROR_SIGNATURES, } from './test-output-observer.js';
|
|
14
|
+
export { RecoveryPlaybook, createRecoveryPlaybook, } from './recovery-playbook.js';
|
|
15
|
+
export { CoordinationLock, createCoordinationLock, } from './coordination-lock.js';
|
|
16
|
+
export { InfraActionExecutor, createInfraActionExecutor, NoOpCommandRunner, ShellCommandRunner, } from './infra-action-executor.js';
|
|
17
|
+
export { CompositeActionExecutor, createCompositeActionExecutor, } from './composite-action-executor.js';
|
|
18
|
+
export { InfraAwareAgentProvider, createInfraAwareAgentProvider, } from './infra-aware-agent-provider.js';
|
|
19
|
+
export { InfraHealingOrchestrator, createInfraHealingOrchestrator, createInfraHealingOrchestratorSync, type InfraHealingOrchestratorOptions, } from './infra-healing-orchestrator.js';
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/strange-loop/infra-healing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,YAAY,EACV,wBAAwB,EACxB,mBAAmB,EACnB,eAAe,EACf,qBAAqB,EACrB,aAAa,EACb,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,4BAA4B,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG5E,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EACL,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EACL,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EACL,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,iCAAiC,CAAC;AAGzC,OAAO,EACL,wBAAwB,EACxB,8BAA8B,EAC9B,kCAAkC,EAClC,KAAK,+BAA+B,GACrC,MAAM,iCAAiC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Infrastructure Self-Healing Module
|
|
3
|
+
* ADR-057: Infrastructure Self-Healing Extension for Strange Loop
|
|
4
|
+
*
|
|
5
|
+
* Extends the Strange Loop self-awareness system to detect and recover from
|
|
6
|
+
* infrastructure failures during test execution. Framework-agnostic via
|
|
7
|
+
* YAML-driven recovery playbooks.
|
|
8
|
+
*
|
|
9
|
+
* @module strange-loop/infra-healing
|
|
10
|
+
*/
|
|
11
|
+
export { DEFAULT_INFRA_HEALING_CONFIG, createEmptyStats } from './types.js';
|
|
12
|
+
// Test Output Observer
|
|
13
|
+
export { TestOutputObserver, createTestOutputObserver, DEFAULT_ERROR_SIGNATURES, } from './test-output-observer.js';
|
|
14
|
+
// Recovery Playbook
|
|
15
|
+
export { RecoveryPlaybook, createRecoveryPlaybook, } from './recovery-playbook.js';
|
|
16
|
+
// Coordination Lock
|
|
17
|
+
export { CoordinationLock, createCoordinationLock, } from './coordination-lock.js';
|
|
18
|
+
// Infrastructure Action Executor
|
|
19
|
+
export { InfraActionExecutor, createInfraActionExecutor, NoOpCommandRunner, ShellCommandRunner, } from './infra-action-executor.js';
|
|
20
|
+
// Composite Action Executor
|
|
21
|
+
export { CompositeActionExecutor, createCompositeActionExecutor, } from './composite-action-executor.js';
|
|
22
|
+
// Infrastructure-Aware Agent Provider
|
|
23
|
+
export { InfraAwareAgentProvider, createInfraAwareAgentProvider, } from './infra-aware-agent-provider.js';
|
|
24
|
+
// Orchestrator
|
|
25
|
+
export { InfraHealingOrchestrator, createInfraHealingOrchestrator, createInfraHealingOrchestratorSync, } from './infra-healing-orchestrator.js';
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/strange-loop/infra-healing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAqBH,OAAO,EAAE,4BAA4B,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE5E,uBAAuB;AACvB,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,2BAA2B,CAAC;AAEnC,oBAAoB;AACpB,OAAO,EACL,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAEhC,oBAAoB;AACpB,OAAO,EACL,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAEhC,iCAAiC;AACjC,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,4BAA4B,CAAC;AAEpC,4BAA4B;AAC5B,OAAO,EACL,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,gCAAgC,CAAC;AAExC,sCAAsC;AACtC,OAAO,EACL,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,iCAAiC,CAAC;AAEzC,eAAe;AACf,OAAO,EACL,wBAAwB,EACxB,8BAA8B,EAC9B,kCAAkC,GAEnC,MAAM,iCAAiC,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Infrastructure Action Executor
|
|
3
|
+
* ADR-057: Infrastructure Self-Healing Extension
|
|
4
|
+
*
|
|
5
|
+
* Executes infrastructure recovery using a health-check → recover → backoff → verify
|
|
6
|
+
* cycle. Uses CommandRunner (DI) for shell execution so tests can inject NoOpCommandRunner.
|
|
7
|
+
*
|
|
8
|
+
* This is NOT an ActionExecutor implementation — it's the recovery engine that
|
|
9
|
+
* CompositeActionExecutor delegates to for infrastructure-specific actions.
|
|
10
|
+
*/
|
|
11
|
+
import type { CommandRunner, CommandResult, ServiceRecoveryResult, InfraHealingStats } from './types.js';
|
|
12
|
+
import type { RecoveryPlaybook } from './recovery-playbook.js';
|
|
13
|
+
import type { CoordinationLock } from './coordination-lock.js';
|
|
14
|
+
/**
|
|
15
|
+
* NoOp command runner for testing — follows existing NoOpActionExecutor pattern.
|
|
16
|
+
* Returns configurable results per command.
|
|
17
|
+
*/
|
|
18
|
+
export declare class NoOpCommandRunner implements CommandRunner {
|
|
19
|
+
private responses;
|
|
20
|
+
private callLog;
|
|
21
|
+
run(command: string, timeoutMs: number): Promise<CommandResult>;
|
|
22
|
+
/** Configure a response for a specific command */
|
|
23
|
+
setResponse(command: string, result: Partial<CommandResult>): void;
|
|
24
|
+
/** Get the call log for assertions */
|
|
25
|
+
getCalls(): ReadonlyArray<{
|
|
26
|
+
command: string;
|
|
27
|
+
timeoutMs: number;
|
|
28
|
+
}>;
|
|
29
|
+
/** Clear call log and responses */
|
|
30
|
+
reset(): void;
|
|
31
|
+
private findPrefixMatch;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Real command runner using child_process.execFile for security.
|
|
35
|
+
* Wraps commands in sh -c for shell interpretation.
|
|
36
|
+
*/
|
|
37
|
+
export declare class ShellCommandRunner implements CommandRunner {
|
|
38
|
+
run(command: string, timeoutMs: number): Promise<CommandResult>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Executes infrastructure recovery for a specific service using:
|
|
42
|
+
* 1. Health check — confirm service is actually down
|
|
43
|
+
* 2. Recovery commands — run in order
|
|
44
|
+
* 3. Exponential backoff — wait between retries
|
|
45
|
+
* 4. Verification — confirm service is back up
|
|
46
|
+
*/
|
|
47
|
+
export declare class InfraActionExecutor {
|
|
48
|
+
private readonly runner;
|
|
49
|
+
private readonly playbook;
|
|
50
|
+
private readonly lock;
|
|
51
|
+
private readonly stats;
|
|
52
|
+
constructor(runner: CommandRunner, playbook: RecoveryPlaybook, lock: CoordinationLock);
|
|
53
|
+
/**
|
|
54
|
+
* Attempt to recover a service using its playbook entry.
|
|
55
|
+
* Acquires a coordination lock to prevent duplicate recovery.
|
|
56
|
+
*/
|
|
57
|
+
recoverService(serviceName: string, actionId: string): Promise<ServiceRecoveryResult>;
|
|
58
|
+
/**
|
|
59
|
+
* Get recovery statistics.
|
|
60
|
+
*/
|
|
61
|
+
getStats(): Readonly<InfraHealingStats>;
|
|
62
|
+
private executeRecoveryAttempt;
|
|
63
|
+
private updateServiceStats;
|
|
64
|
+
private sleep;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Factory function for creating an InfraActionExecutor.
|
|
68
|
+
*/
|
|
69
|
+
export declare function createInfraActionExecutor(runner: CommandRunner, playbook: RecoveryPlaybook, lock: CoordinationLock): InfraActionExecutor;
|
|
70
|
+
//# sourceMappingURL=infra-action-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"infra-action-executor.d.ts","sourceRoot":"","sources":["../../../src/strange-loop/infra-healing/infra-action-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EAGb,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAM/D;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,aAAa;IACrD,OAAO,CAAC,SAAS,CAAyC;IAC1D,OAAO,CAAC,OAAO,CAAqD;IAE9D,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAWrE,kDAAkD;IAClD,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI;IAWlE,sCAAsC;IACtC,QAAQ,IAAI,aAAa,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAIjE,mCAAmC;IACnC,KAAK,IAAI,IAAI;IAKb,OAAO,CAAC,eAAe;CAMxB;AAMD;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,aAAa;IAChD,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;CAsCtE;AAMD;;;;;;GAMG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmB;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;gBAGxC,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,gBAAgB,EAC1B,IAAI,EAAE,gBAAgB;IAQxB;;;OAGG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAsE3F;;OAEG;IACH,QAAQ,IAAI,QAAQ,CAAC,iBAAiB,CAAC;YAQzB,sBAAsB;IAkEpC,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,KAAK;CAGd;AAMD;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,gBAAgB,EAC1B,IAAI,EAAE,gBAAgB,GACrB,mBAAmB,CAErB"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Infrastructure Action Executor
|
|
3
|
+
* ADR-057: Infrastructure Self-Healing Extension
|
|
4
|
+
*
|
|
5
|
+
* Executes infrastructure recovery using a health-check → recover → backoff → verify
|
|
6
|
+
* cycle. Uses CommandRunner (DI) for shell execution so tests can inject NoOpCommandRunner.
|
|
7
|
+
*
|
|
8
|
+
* This is NOT an ActionExecutor implementation — it's the recovery engine that
|
|
9
|
+
* CompositeActionExecutor delegates to for infrastructure-specific actions.
|
|
10
|
+
*/
|
|
11
|
+
import { createEmptyStats } from './types.js';
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// NoOp Command Runner (for testing)
|
|
14
|
+
// ============================================================================
|
|
15
|
+
/**
|
|
16
|
+
* NoOp command runner for testing — follows existing NoOpActionExecutor pattern.
|
|
17
|
+
* Returns configurable results per command.
|
|
18
|
+
*/
|
|
19
|
+
export class NoOpCommandRunner {
|
|
20
|
+
responses = new Map();
|
|
21
|
+
callLog = [];
|
|
22
|
+
async run(command, timeoutMs) {
|
|
23
|
+
this.callLog.push({ command, timeoutMs });
|
|
24
|
+
const result = this.responses.get(command) ??
|
|
25
|
+
this.findPrefixMatch(command) ??
|
|
26
|
+
{ exitCode: 0, stdout: '', stderr: '', durationMs: 10, timedOut: false };
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
/** Configure a response for a specific command */
|
|
30
|
+
setResponse(command, result) {
|
|
31
|
+
this.responses.set(command, {
|
|
32
|
+
exitCode: 0,
|
|
33
|
+
stdout: '',
|
|
34
|
+
stderr: '',
|
|
35
|
+
durationMs: 10,
|
|
36
|
+
timedOut: false,
|
|
37
|
+
...result,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/** Get the call log for assertions */
|
|
41
|
+
getCalls() {
|
|
42
|
+
return this.callLog;
|
|
43
|
+
}
|
|
44
|
+
/** Clear call log and responses */
|
|
45
|
+
reset() {
|
|
46
|
+
this.callLog = [];
|
|
47
|
+
this.responses.clear();
|
|
48
|
+
}
|
|
49
|
+
findPrefixMatch(command) {
|
|
50
|
+
for (const [key, value] of this.responses) {
|
|
51
|
+
if (command.startsWith(key))
|
|
52
|
+
return value;
|
|
53
|
+
}
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// ============================================================================
|
|
58
|
+
// Shell Command Runner (real implementation)
|
|
59
|
+
// ============================================================================
|
|
60
|
+
/**
|
|
61
|
+
* Real command runner using child_process.execFile for security.
|
|
62
|
+
* Wraps commands in sh -c for shell interpretation.
|
|
63
|
+
*/
|
|
64
|
+
export class ShellCommandRunner {
|
|
65
|
+
async run(command, timeoutMs) {
|
|
66
|
+
const { execFile } = await import('node:child_process');
|
|
67
|
+
const startTime = Date.now();
|
|
68
|
+
return new Promise((resolve) => {
|
|
69
|
+
const child = execFile('/bin/sh', ['-c', command], { timeout: timeoutMs, maxBuffer: 1024 * 1024 }, (error, stdout, stderr) => {
|
|
70
|
+
const durationMs = Date.now() - startTime;
|
|
71
|
+
const timedOut = (error?.message?.includes('TIMEOUT') ||
|
|
72
|
+
error?.code === 'ERR_CHILD_PROCESS_STDIO_MAXBUFFER') ?? false;
|
|
73
|
+
const errWithCode = error;
|
|
74
|
+
const exitCode = error ? (typeof errWithCode?.code === 'number' ? errWithCode.code : 1) : 0;
|
|
75
|
+
resolve({
|
|
76
|
+
exitCode,
|
|
77
|
+
stdout: stdout ?? '',
|
|
78
|
+
stderr: stderr ?? '',
|
|
79
|
+
durationMs,
|
|
80
|
+
timedOut,
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
// Handle kill timeout
|
|
84
|
+
child.on('error', () => {
|
|
85
|
+
resolve({
|
|
86
|
+
exitCode: 1,
|
|
87
|
+
stdout: '',
|
|
88
|
+
stderr: 'Process execution error',
|
|
89
|
+
durationMs: Date.now() - startTime,
|
|
90
|
+
timedOut: false,
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// ============================================================================
|
|
97
|
+
// Infrastructure Action Executor
|
|
98
|
+
// ============================================================================
|
|
99
|
+
/**
|
|
100
|
+
* Executes infrastructure recovery for a specific service using:
|
|
101
|
+
* 1. Health check — confirm service is actually down
|
|
102
|
+
* 2. Recovery commands — run in order
|
|
103
|
+
* 3. Exponential backoff — wait between retries
|
|
104
|
+
* 4. Verification — confirm service is back up
|
|
105
|
+
*/
|
|
106
|
+
export class InfraActionExecutor {
|
|
107
|
+
runner;
|
|
108
|
+
playbook;
|
|
109
|
+
lock;
|
|
110
|
+
stats;
|
|
111
|
+
constructor(runner, playbook, lock) {
|
|
112
|
+
this.runner = runner;
|
|
113
|
+
this.playbook = playbook;
|
|
114
|
+
this.lock = lock;
|
|
115
|
+
this.stats = createEmptyStats();
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Attempt to recover a service using its playbook entry.
|
|
119
|
+
* Acquires a coordination lock to prevent duplicate recovery.
|
|
120
|
+
*/
|
|
121
|
+
async recoverService(serviceName, actionId) {
|
|
122
|
+
const plan = this.playbook.getRecoveryPlan(serviceName);
|
|
123
|
+
if (!plan) {
|
|
124
|
+
return {
|
|
125
|
+
serviceName,
|
|
126
|
+
recovered: false,
|
|
127
|
+
totalAttempts: 0,
|
|
128
|
+
attempts: [],
|
|
129
|
+
totalDurationMs: 0,
|
|
130
|
+
escalated: true,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
// Acquire lock
|
|
134
|
+
const lockResult = this.lock.acquire(serviceName, actionId);
|
|
135
|
+
if (!lockResult.acquired) {
|
|
136
|
+
this.stats.lockContentionEvents++;
|
|
137
|
+
return {
|
|
138
|
+
serviceName,
|
|
139
|
+
recovered: false,
|
|
140
|
+
totalAttempts: 0,
|
|
141
|
+
attempts: [],
|
|
142
|
+
totalDurationMs: 0,
|
|
143
|
+
escalated: false,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
const startTime = Date.now();
|
|
147
|
+
const attempts = [];
|
|
148
|
+
let recovered = false;
|
|
149
|
+
try {
|
|
150
|
+
this.stats.recoveriesAttempted++;
|
|
151
|
+
this.updateServiceStats(serviceName, 'recoveries');
|
|
152
|
+
for (let attempt = 1; attempt <= plan.maxRetries; attempt++) {
|
|
153
|
+
const result = await this.executeRecoveryAttempt(plan, attempt);
|
|
154
|
+
attempts.push(result);
|
|
155
|
+
if (result.success) {
|
|
156
|
+
recovered = true;
|
|
157
|
+
this.stats.recoveriesSucceeded++;
|
|
158
|
+
this.updateServiceStats(serviceName, 'successes');
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
// Backoff before next attempt (unless last attempt)
|
|
162
|
+
if (attempt < plan.maxRetries) {
|
|
163
|
+
const backoffMs = plan.backoffMs[attempt - 1] ?? plan.backoffMs[plan.backoffMs.length - 1] ?? 2000;
|
|
164
|
+
await this.sleep(backoffMs);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if (!recovered) {
|
|
168
|
+
this.stats.recoveriesFailed++;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
finally {
|
|
172
|
+
this.lock.release(serviceName, actionId);
|
|
173
|
+
}
|
|
174
|
+
return {
|
|
175
|
+
serviceName,
|
|
176
|
+
recovered,
|
|
177
|
+
totalAttempts: attempts.length,
|
|
178
|
+
attempts,
|
|
179
|
+
totalDurationMs: Date.now() - startTime,
|
|
180
|
+
escalated: !recovered,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Get recovery statistics.
|
|
185
|
+
*/
|
|
186
|
+
getStats() {
|
|
187
|
+
return this.stats;
|
|
188
|
+
}
|
|
189
|
+
// ============================================================================
|
|
190
|
+
// Private Methods
|
|
191
|
+
// ============================================================================
|
|
192
|
+
async executeRecoveryAttempt(plan, attempt) {
|
|
193
|
+
const startTime = Date.now();
|
|
194
|
+
// 1. Health check — confirm service is actually down
|
|
195
|
+
const healthCheckResult = await this.runner.run(plan.healthCheck.command, plan.healthCheck.timeoutMs);
|
|
196
|
+
// If health check passes, service is already up
|
|
197
|
+
if (healthCheckResult.exitCode === 0) {
|
|
198
|
+
return {
|
|
199
|
+
serviceName: plan.serviceName,
|
|
200
|
+
success: true,
|
|
201
|
+
attempt,
|
|
202
|
+
healthCheckResult,
|
|
203
|
+
recoveryResults: [],
|
|
204
|
+
durationMs: Date.now() - startTime,
|
|
205
|
+
attemptedAt: startTime,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
// 2. Execute recovery commands in order
|
|
209
|
+
const recoveryResults = [];
|
|
210
|
+
for (const cmd of plan.recover) {
|
|
211
|
+
const result = await this.runner.run(cmd.command, cmd.timeoutMs);
|
|
212
|
+
recoveryResults.push(result);
|
|
213
|
+
if (result.exitCode !== 0 && cmd.required) {
|
|
214
|
+
return {
|
|
215
|
+
serviceName: plan.serviceName,
|
|
216
|
+
success: false,
|
|
217
|
+
attempt,
|
|
218
|
+
healthCheckResult,
|
|
219
|
+
recoveryResults,
|
|
220
|
+
durationMs: Date.now() - startTime,
|
|
221
|
+
error: `Required recovery command failed: ${cmd.command}`,
|
|
222
|
+
attemptedAt: startTime,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
// 3. Verify recovery
|
|
227
|
+
const verifyResult = await this.runner.run(plan.verify.command, plan.verify.timeoutMs);
|
|
228
|
+
const success = verifyResult.exitCode === 0;
|
|
229
|
+
return {
|
|
230
|
+
serviceName: plan.serviceName,
|
|
231
|
+
success,
|
|
232
|
+
attempt,
|
|
233
|
+
healthCheckResult,
|
|
234
|
+
recoveryResults,
|
|
235
|
+
verifyResult,
|
|
236
|
+
durationMs: Date.now() - startTime,
|
|
237
|
+
error: success ? undefined : 'Verification failed after recovery',
|
|
238
|
+
attemptedAt: startTime,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
updateServiceStats(serviceName, field) {
|
|
242
|
+
if (!this.stats.byService[serviceName]) {
|
|
243
|
+
this.stats.byService[serviceName] = { failures: 0, recoveries: 0, successes: 0 };
|
|
244
|
+
}
|
|
245
|
+
this.stats.byService[serviceName][field]++;
|
|
246
|
+
}
|
|
247
|
+
sleep(ms) {
|
|
248
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
// ============================================================================
|
|
252
|
+
// Factory
|
|
253
|
+
// ============================================================================
|
|
254
|
+
/**
|
|
255
|
+
* Factory function for creating an InfraActionExecutor.
|
|
256
|
+
*/
|
|
257
|
+
export function createInfraActionExecutor(runner, playbook, lock) {
|
|
258
|
+
return new InfraActionExecutor(runner, playbook, lock);
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=infra-action-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"infra-action-executor.js","sourceRoot":"","sources":["../../../src/strange-loop/infra-healing/infra-action-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Infrastructure-Aware Agent Provider
|
|
3
|
+
* ADR-057: Infrastructure Self-Healing Extension
|
|
4
|
+
*
|
|
5
|
+
* Wraps an existing AgentProvider and enriches it with synthetic "agents"
|
|
6
|
+
* representing infrastructure services. When a service is down (detected by
|
|
7
|
+
* TestOutputObserver), the synthetic agent's health metrics reflect the failure,
|
|
8
|
+
* causing the existing Strange Loop to detect it as a vulnerability and trigger
|
|
9
|
+
* healing actions.
|
|
10
|
+
*/
|
|
11
|
+
import type { AgentNode, AgentHealthMetrics, CommunicationEdge } from '../types.js';
|
|
12
|
+
import type { AgentProvider } from '../swarm-observer.js';
|
|
13
|
+
import type { TestOutputObserver } from './test-output-observer.js';
|
|
14
|
+
import type { RecoveryPlaybook } from './recovery-playbook.js';
|
|
15
|
+
/**
|
|
16
|
+
* Wraps an AgentProvider and adds synthetic infrastructure agents.
|
|
17
|
+
* Each service in the recovery playbook becomes a synthetic agent.
|
|
18
|
+
* Health metrics are derived from the TestOutputObserver's last observation.
|
|
19
|
+
*/
|
|
20
|
+
export declare class InfraAwareAgentProvider implements AgentProvider {
|
|
21
|
+
private readonly delegate;
|
|
22
|
+
private readonly observer;
|
|
23
|
+
private readonly playbook;
|
|
24
|
+
private readonly prefix;
|
|
25
|
+
constructor(delegate: AgentProvider, observer: TestOutputObserver, playbook: RecoveryPlaybook, infraAgentPrefix?: string);
|
|
26
|
+
/**
|
|
27
|
+
* Get all agents: real swarm agents + synthetic infra agents.
|
|
28
|
+
*/
|
|
29
|
+
getAgents(): Promise<AgentNode[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Get communication edges: real edges only (infra agents don't communicate).
|
|
32
|
+
*/
|
|
33
|
+
getEdges(): Promise<CommunicationEdge[]>;
|
|
34
|
+
/**
|
|
35
|
+
* Get agent health. For infra agents, derive from observer state.
|
|
36
|
+
*/
|
|
37
|
+
getAgentHealth(agentId: string): Promise<AgentHealthMetrics>;
|
|
38
|
+
/**
|
|
39
|
+
* Get observer ID (delegates to wrapped provider).
|
|
40
|
+
*/
|
|
41
|
+
getObserverId(): string;
|
|
42
|
+
/**
|
|
43
|
+
* Create synthetic AgentNode for each service in the playbook.
|
|
44
|
+
*/
|
|
45
|
+
private createInfraAgents;
|
|
46
|
+
/**
|
|
47
|
+
* Get health metrics for a synthetic infra agent.
|
|
48
|
+
* Failing services get responsiveness=0, healthy services get 1.0.
|
|
49
|
+
*/
|
|
50
|
+
private getInfraAgentHealth;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Factory function for creating an InfraAwareAgentProvider.
|
|
54
|
+
*/
|
|
55
|
+
export declare function createInfraAwareAgentProvider(delegate: AgentProvider, observer: TestOutputObserver, playbook: RecoveryPlaybook, infraAgentPrefix?: string): InfraAwareAgentProvider;
|
|
56
|
+
//# sourceMappingURL=infra-aware-agent-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"infra-aware-agent-provider.d.ts","sourceRoot":"","sources":["../../../src/strange-loop/infra-healing/infra-aware-agent-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAM/D;;;;GAIG;AACH,qBAAa,uBAAwB,YAAW,aAAa;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAG9B,QAAQ,EAAE,aAAa,EACvB,QAAQ,EAAE,kBAAkB,EAC5B,QAAQ,EAAE,gBAAgB,EAC1B,gBAAgB,GAAE,MAAiB;IAQrC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAMvC;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAI9C;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAOlE;;OAEG;IACH,aAAa,IAAI,MAAM;IAQvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAczB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;CAkB5B;AAMD;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,aAAa,EACvB,QAAQ,EAAE,kBAAkB,EAC5B,QAAQ,EAAE,gBAAgB,EAC1B,gBAAgB,CAAC,EAAE,MAAM,GACxB,uBAAuB,CAEzB"}
|