@agent-vm/agent-vm 0.0.91 → 0.0.93
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/build/gondolin-image-builder.d.ts +1 -0
- package/dist/build/gondolin-image-builder.d.ts.map +1 -1
- package/dist/build/gondolin-image-builder.js +11 -1
- package/dist/build/gondolin-image-builder.js.map +1 -1
- package/dist/build/managed-image-dockerfile.d.ts +2 -1
- package/dist/build/managed-image-dockerfile.d.ts.map +1 -1
- package/dist/build/managed-image-dockerfile.js +51 -27
- package/dist/build/managed-image-dockerfile.js.map +1 -1
- package/dist/cli/commands/controller-definition.d.ts +42 -42
- package/dist/cli/commands/create-app.d.ts +60 -60
- package/dist/cli/manual-templates.d.ts.map +1 -1
- package/dist/cli/manual-templates.js +14 -1
- package/dist/cli/manual-templates.js.map +1 -1
- package/dist/config/system-config.d.ts +15 -0
- package/dist/config/system-config.d.ts.map +1 -1
- package/dist/config/system-config.js +74 -0
- package/dist/config/system-config.js.map +1 -1
- package/dist/controller/controller-runtime-operations.d.ts +1 -0
- package/dist/controller/controller-runtime-operations.d.ts.map +1 -1
- package/dist/controller/controller-runtime-operations.js +2 -0
- package/dist/controller/controller-runtime-operations.js.map +1 -1
- package/dist/controller/controller-runtime-types.d.ts +5 -0
- package/dist/controller/controller-runtime-types.d.ts.map +1 -1
- package/dist/controller/controller-runtime.d.ts +1 -0
- package/dist/controller/controller-runtime.d.ts.map +1 -1
- package/dist/controller/controller-runtime.js +220 -3
- package/dist/controller/controller-runtime.js.map +1 -1
- package/dist/controller/health/channel-provider-recovery-observation.d.ts +23 -0
- package/dist/controller/health/channel-provider-recovery-observation.d.ts.map +1 -0
- package/dist/controller/health/channel-provider-recovery-observation.js +69 -0
- package/dist/controller/health/channel-provider-recovery-observation.js.map +1 -0
- package/dist/controller/health/durable-health-event-log.d.ts +24 -0
- package/dist/controller/health/durable-health-event-log.d.ts.map +1 -0
- package/dist/controller/health/durable-health-event-log.js +89 -0
- package/dist/controller/health/durable-health-event-log.js.map +1 -0
- package/dist/controller/health/gateway-recovery-actions.d.ts +27 -0
- package/dist/controller/health/gateway-recovery-actions.d.ts.map +1 -0
- package/dist/controller/health/gateway-recovery-actions.js +71 -0
- package/dist/controller/health/gateway-recovery-actions.js.map +1 -0
- package/dist/controller/health/gateway-service-health-monitor.d.ts +71 -3
- package/dist/controller/health/gateway-service-health-monitor.d.ts.map +1 -1
- package/dist/controller/health/gateway-service-health-monitor.js +383 -10
- package/dist/controller/health/gateway-service-health-monitor.js.map +1 -1
- package/dist/controller/health/gateway-vm-recovery-policy.d.ts +68 -0
- package/dist/controller/health/gateway-vm-recovery-policy.d.ts.map +1 -0
- package/dist/controller/health/gateway-vm-recovery-policy.js +199 -0
- package/dist/controller/health/gateway-vm-recovery-policy.js.map +1 -0
- package/dist/controller/health/gateway-vm-recovery-runner.d.ts +39 -0
- package/dist/controller/health/gateway-vm-recovery-runner.d.ts.map +1 -0
- package/dist/controller/health/gateway-vm-recovery-runner.js +251 -0
- package/dist/controller/health/gateway-vm-recovery-runner.js.map +1 -0
- package/dist/controller/health/health-event-store.d.ts +4 -0
- package/dist/controller/health/health-event-store.d.ts.map +1 -1
- package/dist/controller/health/health-event-store.js +19 -0
- package/dist/controller/health/health-event-store.js.map +1 -1
- package/dist/controller/http/controller-health-event-routes.d.ts +6 -0
- package/dist/controller/http/controller-health-event-routes.d.ts.map +1 -1
- package/dist/controller/http/controller-health-event-routes.js +49 -0
- package/dist/controller/http/controller-health-event-routes.js.map +1 -1
- package/dist/controller/http/controller-http-routes.d.ts.map +1 -1
- package/dist/controller/http/controller-http-routes.js +6 -0
- package/dist/controller/http/controller-http-routes.js.map +1 -1
- package/dist/controller/leases/lease-manager.d.ts.map +1 -1
- package/dist/controller/leases/lease-manager.js +37 -16
- package/dist/controller/leases/lease-manager.js.map +1 -1
- package/dist/controller/leases/tool-vm-lease-lifecycle.d.ts +44 -0
- package/dist/controller/leases/tool-vm-lease-lifecycle.d.ts.map +1 -0
- package/dist/controller/leases/tool-vm-lease-lifecycle.js +28 -0
- package/dist/controller/leases/tool-vm-lease-lifecycle.js.map +1 -0
- package/dist/controller/zone-runtimes/gateway-lifecycle-operation-record.d.ts +37 -0
- package/dist/controller/zone-runtimes/gateway-lifecycle-operation-record.d.ts.map +1 -0
- package/dist/controller/zone-runtimes/gateway-lifecycle-operation-record.js +133 -0
- package/dist/controller/zone-runtimes/gateway-lifecycle-operation-record.js.map +1 -0
- package/dist/controller/zone-runtimes/gateway-zone-state-machine.d.ts +101 -0
- package/dist/controller/zone-runtimes/gateway-zone-state-machine.d.ts.map +1 -0
- package/dist/controller/zone-runtimes/gateway-zone-state-machine.js +143 -0
- package/dist/controller/zone-runtimes/gateway-zone-state-machine.js.map +1 -0
- package/dist/controller/zone-runtimes/openclaw-zone-runtime.d.ts +16 -1
- package/dist/controller/zone-runtimes/openclaw-zone-runtime.d.ts.map +1 -1
- package/dist/controller/zone-runtimes/openclaw-zone-runtime.js +700 -40
- package/dist/controller/zone-runtimes/openclaw-zone-runtime.js.map +1 -1
- package/dist/controller/zone-runtimes/zone-runtime-errors.d.ts +7 -1
- package/dist/controller/zone-runtimes/zone-runtime-errors.d.ts.map +1 -1
- package/dist/controller/zone-runtimes/zone-runtime-errors.js +5 -1
- package/dist/controller/zone-runtimes/zone-runtime-errors.js.map +1 -1
- package/dist/controller/zone-runtimes/zone-runtime-registry.d.ts +2 -0
- package/dist/controller/zone-runtimes/zone-runtime-registry.d.ts.map +1 -1
- package/dist/controller/zone-runtimes/zone-runtime-registry.js +23 -0
- package/dist/controller/zone-runtimes/zone-runtime-registry.js.map +1 -1
- package/dist/controller/zone-runtimes/zone-runtime-types.d.ts +14 -1
- package/dist/controller/zone-runtimes/zone-runtime-types.d.ts.map +1 -1
- package/dist/gateway/gateway-ownership-evidence.d.ts +35 -0
- package/dist/gateway/gateway-ownership-evidence.d.ts.map +1 -0
- package/dist/gateway/gateway-ownership-evidence.js +10 -0
- package/dist/gateway/gateway-ownership-evidence.js.map +1 -0
- package/dist/gateway/gateway-recovery.d.ts +16 -0
- package/dist/gateway/gateway-recovery.d.ts.map +1 -1
- package/dist/gateway/gateway-recovery.js +105 -9
- package/dist/gateway/gateway-recovery.js.map +1 -1
- package/dist/gateway/gateway-zone-orchestrator.d.ts.map +1 -1
- package/dist/gateway/gateway-zone-orchestrator.js +50 -39
- package/dist/gateway/gateway-zone-orchestrator.js.map +1 -1
- package/dist/integration-tests/{smoke-harness.d.ts → e2e-harness.d.ts} +45 -37
- package/dist/integration-tests/e2e-harness.d.ts.map +1 -0
- package/dist/integration-tests/{smoke-harness.js → e2e-harness.js} +134 -108
- package/dist/integration-tests/e2e-harness.js.map +1 -0
- package/dist/integration-tests/e2e-workspace-build-global-setup.d.ts +16 -0
- package/dist/integration-tests/e2e-workspace-build-global-setup.d.ts.map +1 -0
- package/dist/integration-tests/e2e-workspace-build-global-setup.js +27 -0
- package/dist/integration-tests/e2e-workspace-build-global-setup.js.map +1 -0
- package/dist/integration-tests/live-agent-model-roundtrip-deployment.d.ts +11 -0
- package/dist/integration-tests/live-agent-model-roundtrip-deployment.d.ts.map +1 -0
- package/dist/integration-tests/live-agent-model-roundtrip-deployment.js +48 -0
- package/dist/integration-tests/live-agent-model-roundtrip-deployment.js.map +1 -0
- package/dist/integration-tests/live-agent-model-roundtrip-gates.d.ts +11 -0
- package/dist/integration-tests/live-agent-model-roundtrip-gates.d.ts.map +1 -0
- package/dist/integration-tests/live-agent-model-roundtrip-gates.js +21 -0
- package/dist/integration-tests/live-agent-model-roundtrip-gates.js.map +1 -0
- package/dist/integration-tests/live-vm-e2e-gates.d.ts +2 -0
- package/dist/integration-tests/live-vm-e2e-gates.d.ts.map +1 -0
- package/dist/integration-tests/live-vm-e2e-gates.js +4 -0
- package/dist/integration-tests/live-vm-e2e-gates.js.map +1 -0
- package/dist/operations/controller-status.d.ts +5 -0
- package/dist/operations/controller-status.d.ts.map +1 -1
- package/dist/operations/controller-status.js +42 -0
- package/dist/operations/controller-status.js.map +1 -1
- package/package.json +11 -11
- package/dist/integration-tests/live-integration-gates.d.ts +0 -2
- package/dist/integration-tests/live-integration-gates.d.ts.map +0 -1
- package/dist/integration-tests/live-integration-gates.js +0 -4
- package/dist/integration-tests/live-integration-gates.js.map +0 -1
- package/dist/integration-tests/smoke-harness.d.ts.map +0 -1
- package/dist/integration-tests/smoke-harness.js.map +0 -1
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { appendFile, mkdir, readFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { isAgentVmHealthEvent } from '@agent-vm/gateway-interface';
|
|
4
|
+
export function controllerHealthEventLogPath(runtimeDir) {
|
|
5
|
+
return path.join(runtimeDir, 'controller-health', 'events.jsonl');
|
|
6
|
+
}
|
|
7
|
+
export async function appendDurableHealthEvent(options) {
|
|
8
|
+
const logPath = controllerHealthEventLogPath(options.runtimeDir);
|
|
9
|
+
await mkdir(path.dirname(logPath), { recursive: true });
|
|
10
|
+
const operationId = options.operationId ?? operationIdForHealthEvent(options.event);
|
|
11
|
+
const record = {
|
|
12
|
+
body: options.event,
|
|
13
|
+
controllerPid: options.controllerPid,
|
|
14
|
+
controllerPort: options.controllerPort,
|
|
15
|
+
eventKind: options.event.kind,
|
|
16
|
+
observedAtMs: options.event.observedAtMs,
|
|
17
|
+
...(operationId === undefined ? {} : { operationId }),
|
|
18
|
+
zoneId: options.event.zoneId,
|
|
19
|
+
};
|
|
20
|
+
await appendFile(logPath, `${JSON.stringify(record)}\n`, 'utf8');
|
|
21
|
+
}
|
|
22
|
+
export async function readDurableHealthEvents(options) {
|
|
23
|
+
const logPath = controllerHealthEventLogPath(options.runtimeDir);
|
|
24
|
+
let logText;
|
|
25
|
+
try {
|
|
26
|
+
logText = await readFile(logPath, 'utf8');
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
if (isNodeFileSystemError(error) && error.code === 'ENOENT') {
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
throw error;
|
|
33
|
+
}
|
|
34
|
+
return logText
|
|
35
|
+
.split('\n')
|
|
36
|
+
.filter((line) => line.trim().length > 0)
|
|
37
|
+
.map((line) => parseDurableHealthEventRecord(line));
|
|
38
|
+
}
|
|
39
|
+
function parseDurableHealthEventRecord(line) {
|
|
40
|
+
const parsedRecord = JSON.parse(line);
|
|
41
|
+
if (!isDurableHealthEventRecord(parsedRecord)) {
|
|
42
|
+
throw new Error('Durable health event record does not match expected schema.');
|
|
43
|
+
}
|
|
44
|
+
return parsedRecord;
|
|
45
|
+
}
|
|
46
|
+
function isDurableHealthEventRecord(value) {
|
|
47
|
+
if (!isUnknownRecord(value)) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
return (isAgentVmHealthEvent(value.body) &&
|
|
51
|
+
typeof value.controllerPid === 'number' &&
|
|
52
|
+
Number.isInteger(value.controllerPid) &&
|
|
53
|
+
value.controllerPid > 0 &&
|
|
54
|
+
typeof value.controllerPort === 'number' &&
|
|
55
|
+
Number.isInteger(value.controllerPort) &&
|
|
56
|
+
value.controllerPort > 0 &&
|
|
57
|
+
value.eventKind === value.body.kind &&
|
|
58
|
+
typeof value.observedAtMs === 'number' &&
|
|
59
|
+
value.observedAtMs === value.body.observedAtMs &&
|
|
60
|
+
(value.operationId === undefined || typeof value.operationId === 'string') &&
|
|
61
|
+
value.zoneId === value.body.zoneId);
|
|
62
|
+
}
|
|
63
|
+
function isUnknownRecord(value) {
|
|
64
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
65
|
+
}
|
|
66
|
+
function isNodeFileSystemError(value) {
|
|
67
|
+
return (typeof value === 'object' && value !== null && 'code' in value && typeof value.code === 'string');
|
|
68
|
+
}
|
|
69
|
+
function operationIdForHealthEvent(event) {
|
|
70
|
+
switch (event.kind) {
|
|
71
|
+
case 'gateway-recovery':
|
|
72
|
+
case 'gateway-recovery-suspended':
|
|
73
|
+
return event.operationId;
|
|
74
|
+
case 'controller-request':
|
|
75
|
+
case 'gateway-control-link':
|
|
76
|
+
case 'gateway-plugin-health':
|
|
77
|
+
case 'gateway-service-health':
|
|
78
|
+
case 'lease-heartbeat':
|
|
79
|
+
case 'lease-renew':
|
|
80
|
+
case 'agent-channel-provider-health':
|
|
81
|
+
case 'tool-vm-ssh':
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
return assertNeverHealthEvent(event);
|
|
85
|
+
}
|
|
86
|
+
function assertNeverHealthEvent(event) {
|
|
87
|
+
throw new Error(`Unhandled health event kind for operation join key: ${JSON.stringify(event)}`);
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=durable-health-event-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"durable-health-event-log.js","sourceRoot":"","sources":["../../../src/controller/health/durable-health-event-log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { GatewayZoneLifecycleState } from '../zone-runtimes/gateway-zone-state-machine.js';
|
|
2
|
+
import type { GatewayVmRecoveryDecision, GatewayVmRecoveryReason } from './gateway-vm-recovery-policy.js';
|
|
3
|
+
export type GatewayRecoveryDecisionAction = {
|
|
4
|
+
readonly kind: 'restart-running-gateway';
|
|
5
|
+
readonly reason: GatewayVmRecoveryReason;
|
|
6
|
+
} | {
|
|
7
|
+
readonly kind: 'cold-start-gateway';
|
|
8
|
+
readonly reason: GatewayVmRecoveryReason;
|
|
9
|
+
} | {
|
|
10
|
+
readonly kind: 'refresh-secret-resolver';
|
|
11
|
+
readonly reason: 'secret-resolution-failed';
|
|
12
|
+
} | {
|
|
13
|
+
readonly errorCode: 'max-failed-recoveries';
|
|
14
|
+
readonly kind: 'suspend-recovery';
|
|
15
|
+
} | {
|
|
16
|
+
readonly kind: 'operator-required';
|
|
17
|
+
readonly reason: 'ambiguous-runtime-state' | 'owner-unsafe';
|
|
18
|
+
} | {
|
|
19
|
+
readonly kind: 'observe-only';
|
|
20
|
+
readonly reason: 'recovery-disabled' | 'recovery-in-flight' | 'recovery-unobserved' | 'channel-provider-unrecoverable' | 'cooldown-active';
|
|
21
|
+
};
|
|
22
|
+
export interface ClassifyGatewayRecoveryActionOptions {
|
|
23
|
+
readonly lifecycleState: GatewayZoneLifecycleState;
|
|
24
|
+
readonly recoveryDecision: GatewayVmRecoveryDecision;
|
|
25
|
+
}
|
|
26
|
+
export declare function classifyGatewayRecoveryAction(options: ClassifyGatewayRecoveryActionOptions): GatewayRecoveryDecisionAction;
|
|
27
|
+
//# sourceMappingURL=gateway-recovery-actions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-recovery-actions.d.ts","sourceRoot":"","sources":["../../../src/controller/health/gateway-recovery-actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEX,yBAAyB,EACzB,MAAM,gDAAgD,CAAC;AACxD,OAAO,KAAK,EACX,yBAAyB,EACzB,uBAAuB,EACvB,MAAM,iCAAiC,CAAC;AAEzC,MAAM,MAAM,6BAA6B,GACtC;IAAE,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAA;CAAE,GACtF;IAAE,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAA;CAAE,GACjF;IAAE,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,0BAA0B,CAAA;CAAE,GACzF;IAAE,QAAQ,CAAC,SAAS,EAAE,uBAAuB,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAA;CAAE,GAClF;IACA,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,yBAAyB,GAAG,cAAc,CAAC;CAC3D,GACD;IACA,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,MAAM,EACZ,mBAAmB,GACnB,oBAAoB,GACpB,qBAAqB,GACrB,gCAAgC,GAChC,iBAAiB,CAAC;CACpB,CAAC;AAEL,MAAM,WAAW,oCAAoC;IACpD,QAAQ,CAAC,cAAc,EAAE,yBAAyB,CAAC;IACnD,QAAQ,CAAC,gBAAgB,EAAE,yBAAyB,CAAC;CACrD;AAED,wBAAgB,6BAA6B,CAC5C,OAAO,EAAE,oCAAoC,GAC3C,6BAA6B,CA+B/B"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export function classifyGatewayRecoveryAction(options) {
|
|
2
|
+
if (options.recoveryDecision.kind === 'suspended') {
|
|
3
|
+
return {
|
|
4
|
+
errorCode: options.recoveryDecision.reason,
|
|
5
|
+
kind: 'suspend-recovery',
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
if (options.recoveryDecision.kind === 'none') {
|
|
9
|
+
return {
|
|
10
|
+
kind: 'observe-only',
|
|
11
|
+
reason: classifyNoRecoveryReason(options.recoveryDecision.reason),
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
const recoveryReason = options.recoveryDecision.reason;
|
|
15
|
+
switch (options.lifecycleState.kind) {
|
|
16
|
+
case 'running':
|
|
17
|
+
case 'running-degraded':
|
|
18
|
+
return { kind: 'restart-running-gateway', reason: recoveryReason };
|
|
19
|
+
case 'stopped':
|
|
20
|
+
return { kind: 'cold-start-gateway', reason: recoveryReason };
|
|
21
|
+
case 'failed':
|
|
22
|
+
return classifyFailedGatewayRecoveryAction(options.lifecycleState, recoveryReason);
|
|
23
|
+
case 'owner-unsafe':
|
|
24
|
+
return { kind: 'operator-required', reason: 'owner-unsafe' };
|
|
25
|
+
case 'restarting':
|
|
26
|
+
case 'starting':
|
|
27
|
+
case 'stopping':
|
|
28
|
+
return { kind: 'observe-only', reason: 'recovery-in-flight' };
|
|
29
|
+
}
|
|
30
|
+
return assertNeverGatewayZoneLifecycleState(options.lifecycleState);
|
|
31
|
+
}
|
|
32
|
+
function classifyFailedGatewayRecoveryAction(state, recoveryReason) {
|
|
33
|
+
if (state.error.code === 'secret-resolution-failed') {
|
|
34
|
+
return { kind: 'refresh-secret-resolver', reason: state.error.code };
|
|
35
|
+
}
|
|
36
|
+
if (state.error.code === 'owner-unsafe') {
|
|
37
|
+
return { kind: 'operator-required', reason: 'owner-unsafe' };
|
|
38
|
+
}
|
|
39
|
+
if (state.coldStartEligible) {
|
|
40
|
+
return { kind: 'cold-start-gateway', reason: recoveryReason };
|
|
41
|
+
}
|
|
42
|
+
if (isUnrecoverableFailure(state.error.code)) {
|
|
43
|
+
return { kind: 'observe-only', reason: 'channel-provider-unrecoverable' };
|
|
44
|
+
}
|
|
45
|
+
return { kind: 'operator-required', reason: 'ambiguous-runtime-state' };
|
|
46
|
+
}
|
|
47
|
+
function isUnrecoverableFailure(errorCode) {
|
|
48
|
+
return errorCode === 'agent-channel-provider-unhealthy';
|
|
49
|
+
}
|
|
50
|
+
function classifyNoRecoveryReason(reason) {
|
|
51
|
+
switch (reason) {
|
|
52
|
+
case 'cooldown':
|
|
53
|
+
return 'cooldown-active';
|
|
54
|
+
case 'disabled':
|
|
55
|
+
return 'recovery-disabled';
|
|
56
|
+
case 'in-flight':
|
|
57
|
+
return 'recovery-in-flight';
|
|
58
|
+
case 'unobserved':
|
|
59
|
+
return 'recovery-unobserved';
|
|
60
|
+
case undefined:
|
|
61
|
+
return 'recovery-unobserved';
|
|
62
|
+
}
|
|
63
|
+
return assertNeverNoRecoveryReason(reason);
|
|
64
|
+
}
|
|
65
|
+
function assertNeverGatewayZoneLifecycleState(state) {
|
|
66
|
+
throw new Error(`Unhandled gateway zone lifecycle state: ${JSON.stringify(state)}`);
|
|
67
|
+
}
|
|
68
|
+
function assertNeverNoRecoveryReason(reason) {
|
|
69
|
+
throw new Error(`Unhandled gateway recovery none reason: ${String(reason)}`);
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=gateway-recovery-actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-recovery-actions.js","sourceRoot":"","sources":["../../../src/controller/health/gateway-recovery-actions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { GatewayRecoveryTimeoutErrorCode } from '@agent-vm/gateway-interface';
|
|
2
|
+
import { type GatewayVmAutoRecoveryPolicy, type GatewayVmRecoveryBudgetClass, type GatewayVmRecoveryReason } from './gateway-vm-recovery-policy.js';
|
|
1
3
|
import type { HealthEventStore } from './health-event-store.js';
|
|
2
4
|
export interface GatewayServiceHealthProbeResult {
|
|
3
5
|
readonly ok: boolean;
|
|
@@ -8,16 +10,82 @@ export interface GatewayServiceHealthProbeResult {
|
|
|
8
10
|
}
|
|
9
11
|
export interface GatewayServiceHealthMonitor {
|
|
10
12
|
start(): void;
|
|
11
|
-
stop(): void
|
|
13
|
+
stop(): Promise<void>;
|
|
12
14
|
tick(): Promise<void>;
|
|
13
15
|
}
|
|
16
|
+
export interface GatewayVmRecoveryRequest {
|
|
17
|
+
readonly consecutiveFailures: number;
|
|
18
|
+
readonly reason: GatewayVmRecoveryReason;
|
|
19
|
+
readonly zoneId: string;
|
|
20
|
+
}
|
|
21
|
+
export interface ClassifyRecoveryBudgetClassRequest {
|
|
22
|
+
readonly consecutiveFailures: number;
|
|
23
|
+
readonly reason: GatewayVmRecoveryReason;
|
|
24
|
+
readonly zoneId: string;
|
|
25
|
+
}
|
|
26
|
+
export type GatewayVmRecoveryResult = {
|
|
27
|
+
readonly action?: 'gateway-vm-restart' | undefined;
|
|
28
|
+
readonly elapsedMs: number;
|
|
29
|
+
readonly leaseReleaseFailureCount: number;
|
|
30
|
+
readonly newBootedAt: string;
|
|
31
|
+
readonly newHostPid: number;
|
|
32
|
+
readonly newVmId: string;
|
|
33
|
+
readonly oldBootedAt: string;
|
|
34
|
+
readonly oldHostPid: number;
|
|
35
|
+
readonly oldVmId: string;
|
|
36
|
+
readonly operationId?: string | undefined;
|
|
37
|
+
readonly result: 'ok';
|
|
38
|
+
} | {
|
|
39
|
+
readonly action: 'gateway-vm-cold-start';
|
|
40
|
+
readonly elapsedMs: number;
|
|
41
|
+
readonly leaseReleaseFailureCount: number;
|
|
42
|
+
readonly newBootedAt: string;
|
|
43
|
+
readonly newHostPid: number;
|
|
44
|
+
readonly newVmId: string;
|
|
45
|
+
readonly operationId?: string | undefined;
|
|
46
|
+
readonly result: 'ok';
|
|
47
|
+
} | {
|
|
48
|
+
readonly action: 'gateway-vm-restart';
|
|
49
|
+
readonly elapsedMs: number;
|
|
50
|
+
readonly errorCode: string;
|
|
51
|
+
readonly leaseReleaseFailureCount?: number | undefined;
|
|
52
|
+
readonly oldBootedAt?: string | undefined;
|
|
53
|
+
readonly oldHostPid?: number | undefined;
|
|
54
|
+
readonly oldVmId: string;
|
|
55
|
+
readonly operationId?: string | undefined;
|
|
56
|
+
readonly result: 'failed';
|
|
57
|
+
} | {
|
|
58
|
+
readonly action: 'gateway-vm-restart';
|
|
59
|
+
readonly elapsedMs: number;
|
|
60
|
+
readonly errorCode: GatewayRecoveryTimeoutErrorCode;
|
|
61
|
+
readonly leaseReleaseFailureCount?: number | undefined;
|
|
62
|
+
readonly oldBootedAt?: string | undefined;
|
|
63
|
+
readonly oldHostPid?: number | undefined;
|
|
64
|
+
readonly oldVmId?: string | undefined;
|
|
65
|
+
readonly operationId?: string | undefined;
|
|
66
|
+
readonly result: 'failed';
|
|
67
|
+
} | {
|
|
68
|
+
readonly action: 'gateway-vm-cold-start' | 'observe-only' | 'operator-required';
|
|
69
|
+
readonly elapsedMs: number;
|
|
70
|
+
readonly errorCode: string;
|
|
71
|
+
readonly leaseReleaseFailureCount?: number | undefined;
|
|
72
|
+
readonly oldBootedAt?: undefined;
|
|
73
|
+
readonly oldHostPid?: undefined;
|
|
74
|
+
readonly oldVmId?: undefined;
|
|
75
|
+
readonly operationId?: string | undefined;
|
|
76
|
+
readonly result: 'failed';
|
|
77
|
+
};
|
|
14
78
|
export interface CreateGatewayServiceHealthMonitorOptions {
|
|
15
|
-
readonly clearIntervalImpl?: (timer: NodeJS.Timeout) => void;
|
|
79
|
+
readonly clearIntervalImpl?: ((timer: NodeJS.Timeout) => void) | undefined;
|
|
80
|
+
readonly classifyRecoveryBudgetClass?: ((request: ClassifyRecoveryBudgetClassRequest) => GatewayVmRecoveryBudgetClass) | undefined;
|
|
81
|
+
readonly gatewayServiceAutoRestart: GatewayVmAutoRecoveryPolicy;
|
|
16
82
|
readonly healthEventStore: HealthEventStore;
|
|
17
83
|
readonly intervalMs: number;
|
|
18
84
|
readonly now: () => number;
|
|
19
85
|
readonly probeZoneHealth: (zoneId: string) => Promise<GatewayServiceHealthProbeResult>;
|
|
20
|
-
readonly
|
|
86
|
+
readonly recoverGatewayVm?: ((request: GatewayVmRecoveryRequest) => Promise<GatewayVmRecoveryResult>) | undefined;
|
|
87
|
+
readonly setIntervalImpl?: ((callback: () => void | Promise<void>, delayMs: number) => NodeJS.Timeout) | undefined;
|
|
88
|
+
readonly staleAfterMs: number;
|
|
21
89
|
readonly zoneIds: readonly string[];
|
|
22
90
|
}
|
|
23
91
|
export declare function createGatewayServiceHealthMonitor(options: CreateGatewayServiceHealthMonitorOptions): GatewayServiceHealthMonitor;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway-service-health-monitor.d.ts","sourceRoot":"","sources":["../../../src/controller/health/gateway-service-health-monitor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,WAAW,+BAA+B;IAC/C,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,2BAA2B;IAC3C,KAAK,IAAI,IAAI,CAAC;IACd,IAAI,IAAI,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"gateway-service-health-monitor.d.ts","sourceRoot":"","sources":["../../../src/controller/health/gateway-service-health-monitor.ts"],"names":[],"mappings":"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"}
|