@agent-vm/agent-vm 0.0.92 → 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.
Files changed (129) hide show
  1. package/dist/build/managed-image-dockerfile.d.ts +2 -1
  2. package/dist/build/managed-image-dockerfile.d.ts.map +1 -1
  3. package/dist/build/managed-image-dockerfile.js +51 -27
  4. package/dist/build/managed-image-dockerfile.js.map +1 -1
  5. package/dist/cli/commands/controller-definition.d.ts +42 -42
  6. package/dist/cli/commands/create-app.d.ts +42 -42
  7. package/dist/cli/manual-templates.d.ts.map +1 -1
  8. package/dist/cli/manual-templates.js +11 -2
  9. package/dist/cli/manual-templates.js.map +1 -1
  10. package/dist/config/system-config.d.ts +7 -0
  11. package/dist/config/system-config.d.ts.map +1 -1
  12. package/dist/config/system-config.js +35 -0
  13. package/dist/config/system-config.js.map +1 -1
  14. package/dist/controller/controller-runtime-operations.d.ts +1 -0
  15. package/dist/controller/controller-runtime-operations.d.ts.map +1 -1
  16. package/dist/controller/controller-runtime-operations.js +2 -0
  17. package/dist/controller/controller-runtime-operations.js.map +1 -1
  18. package/dist/controller/controller-runtime-types.d.ts +3 -0
  19. package/dist/controller/controller-runtime-types.d.ts.map +1 -1
  20. package/dist/controller/controller-runtime.d.ts +1 -1
  21. package/dist/controller/controller-runtime.d.ts.map +1 -1
  22. package/dist/controller/controller-runtime.js +207 -116
  23. package/dist/controller/controller-runtime.js.map +1 -1
  24. package/dist/controller/health/channel-provider-recovery-observation.d.ts +23 -0
  25. package/dist/controller/health/channel-provider-recovery-observation.d.ts.map +1 -0
  26. package/dist/controller/health/channel-provider-recovery-observation.js +69 -0
  27. package/dist/controller/health/channel-provider-recovery-observation.js.map +1 -0
  28. package/dist/controller/health/durable-health-event-log.d.ts +24 -0
  29. package/dist/controller/health/durable-health-event-log.d.ts.map +1 -0
  30. package/dist/controller/health/durable-health-event-log.js +89 -0
  31. package/dist/controller/health/durable-health-event-log.js.map +1 -0
  32. package/dist/controller/health/gateway-recovery-actions.d.ts +27 -0
  33. package/dist/controller/health/gateway-recovery-actions.d.ts.map +1 -0
  34. package/dist/controller/health/gateway-recovery-actions.js +71 -0
  35. package/dist/controller/health/gateway-recovery-actions.js.map +1 -0
  36. package/dist/controller/health/gateway-service-health-monitor.d.ts +41 -3
  37. package/dist/controller/health/gateway-service-health-monitor.d.ts.map +1 -1
  38. package/dist/controller/health/gateway-service-health-monitor.js +231 -57
  39. package/dist/controller/health/gateway-service-health-monitor.js.map +1 -1
  40. package/dist/controller/health/gateway-vm-recovery-policy.d.ts +20 -0
  41. package/dist/controller/health/gateway-vm-recovery-policy.d.ts.map +1 -1
  42. package/dist/controller/health/gateway-vm-recovery-policy.js +85 -21
  43. package/dist/controller/health/gateway-vm-recovery-policy.js.map +1 -1
  44. package/dist/controller/health/gateway-vm-recovery-runner.d.ts +39 -0
  45. package/dist/controller/health/gateway-vm-recovery-runner.d.ts.map +1 -0
  46. package/dist/controller/health/gateway-vm-recovery-runner.js +251 -0
  47. package/dist/controller/health/gateway-vm-recovery-runner.js.map +1 -0
  48. package/dist/controller/health/health-event-store.d.ts +4 -0
  49. package/dist/controller/health/health-event-store.d.ts.map +1 -1
  50. package/dist/controller/health/health-event-store.js +19 -0
  51. package/dist/controller/health/health-event-store.js.map +1 -1
  52. package/dist/controller/http/controller-health-event-routes.d.ts +6 -0
  53. package/dist/controller/http/controller-health-event-routes.d.ts.map +1 -1
  54. package/dist/controller/http/controller-health-event-routes.js +49 -0
  55. package/dist/controller/http/controller-health-event-routes.js.map +1 -1
  56. package/dist/controller/http/controller-http-routes.d.ts.map +1 -1
  57. package/dist/controller/http/controller-http-routes.js +6 -0
  58. package/dist/controller/http/controller-http-routes.js.map +1 -1
  59. package/dist/controller/leases/lease-manager.d.ts.map +1 -1
  60. package/dist/controller/leases/lease-manager.js +37 -16
  61. package/dist/controller/leases/lease-manager.js.map +1 -1
  62. package/dist/controller/leases/tool-vm-lease-lifecycle.d.ts +44 -0
  63. package/dist/controller/leases/tool-vm-lease-lifecycle.d.ts.map +1 -0
  64. package/dist/controller/leases/tool-vm-lease-lifecycle.js +28 -0
  65. package/dist/controller/leases/tool-vm-lease-lifecycle.js.map +1 -0
  66. package/dist/controller/zone-runtimes/gateway-lifecycle-operation-record.d.ts +37 -0
  67. package/dist/controller/zone-runtimes/gateway-lifecycle-operation-record.d.ts.map +1 -0
  68. package/dist/controller/zone-runtimes/gateway-lifecycle-operation-record.js +133 -0
  69. package/dist/controller/zone-runtimes/gateway-lifecycle-operation-record.js.map +1 -0
  70. package/dist/controller/zone-runtimes/gateway-zone-state-machine.d.ts +101 -0
  71. package/dist/controller/zone-runtimes/gateway-zone-state-machine.d.ts.map +1 -0
  72. package/dist/controller/zone-runtimes/gateway-zone-state-machine.js +143 -0
  73. package/dist/controller/zone-runtimes/gateway-zone-state-machine.js.map +1 -0
  74. package/dist/controller/zone-runtimes/openclaw-zone-runtime.d.ts +8 -1
  75. package/dist/controller/zone-runtimes/openclaw-zone-runtime.d.ts.map +1 -1
  76. package/dist/controller/zone-runtimes/openclaw-zone-runtime.js +621 -65
  77. package/dist/controller/zone-runtimes/openclaw-zone-runtime.js.map +1 -1
  78. package/dist/controller/zone-runtimes/zone-runtime-errors.d.ts +7 -1
  79. package/dist/controller/zone-runtimes/zone-runtime-errors.d.ts.map +1 -1
  80. package/dist/controller/zone-runtimes/zone-runtime-errors.js +5 -1
  81. package/dist/controller/zone-runtimes/zone-runtime-errors.js.map +1 -1
  82. package/dist/controller/zone-runtimes/zone-runtime-registry.d.ts +2 -0
  83. package/dist/controller/zone-runtimes/zone-runtime-registry.d.ts.map +1 -1
  84. package/dist/controller/zone-runtimes/zone-runtime-registry.js +23 -0
  85. package/dist/controller/zone-runtimes/zone-runtime-registry.js.map +1 -1
  86. package/dist/controller/zone-runtimes/zone-runtime-types.d.ts +7 -0
  87. package/dist/controller/zone-runtimes/zone-runtime-types.d.ts.map +1 -1
  88. package/dist/gateway/gateway-ownership-evidence.d.ts +35 -0
  89. package/dist/gateway/gateway-ownership-evidence.d.ts.map +1 -0
  90. package/dist/gateway/gateway-ownership-evidence.js +10 -0
  91. package/dist/gateway/gateway-ownership-evidence.js.map +1 -0
  92. package/dist/gateway/gateway-recovery.d.ts +16 -0
  93. package/dist/gateway/gateway-recovery.d.ts.map +1 -1
  94. package/dist/gateway/gateway-recovery.js +105 -9
  95. package/dist/gateway/gateway-recovery.js.map +1 -1
  96. package/dist/gateway/gateway-zone-orchestrator.d.ts.map +1 -1
  97. package/dist/gateway/gateway-zone-orchestrator.js +50 -39
  98. package/dist/gateway/gateway-zone-orchestrator.js.map +1 -1
  99. package/dist/integration-tests/{smoke-harness.d.ts → e2e-harness.d.ts} +45 -37
  100. package/dist/integration-tests/e2e-harness.d.ts.map +1 -0
  101. package/dist/integration-tests/{smoke-harness.js → e2e-harness.js} +112 -94
  102. package/dist/integration-tests/e2e-harness.js.map +1 -0
  103. package/dist/integration-tests/e2e-workspace-build-global-setup.d.ts +16 -0
  104. package/dist/integration-tests/e2e-workspace-build-global-setup.d.ts.map +1 -0
  105. package/dist/integration-tests/e2e-workspace-build-global-setup.js +27 -0
  106. package/dist/integration-tests/e2e-workspace-build-global-setup.js.map +1 -0
  107. package/dist/integration-tests/live-agent-model-roundtrip-deployment.d.ts +11 -0
  108. package/dist/integration-tests/live-agent-model-roundtrip-deployment.d.ts.map +1 -0
  109. package/dist/integration-tests/live-agent-model-roundtrip-deployment.js +48 -0
  110. package/dist/integration-tests/live-agent-model-roundtrip-deployment.js.map +1 -0
  111. package/dist/integration-tests/live-agent-model-roundtrip-gates.d.ts +11 -0
  112. package/dist/integration-tests/live-agent-model-roundtrip-gates.d.ts.map +1 -0
  113. package/dist/integration-tests/live-agent-model-roundtrip-gates.js +21 -0
  114. package/dist/integration-tests/live-agent-model-roundtrip-gates.js.map +1 -0
  115. package/dist/integration-tests/live-vm-e2e-gates.d.ts +2 -0
  116. package/dist/integration-tests/live-vm-e2e-gates.d.ts.map +1 -0
  117. package/dist/integration-tests/live-vm-e2e-gates.js +4 -0
  118. package/dist/integration-tests/live-vm-e2e-gates.js.map +1 -0
  119. package/dist/operations/controller-status.d.ts +5 -0
  120. package/dist/operations/controller-status.d.ts.map +1 -1
  121. package/dist/operations/controller-status.js +42 -0
  122. package/dist/operations/controller-status.js.map +1 -1
  123. package/package.json +11 -11
  124. package/dist/integration-tests/live-integration-gates.d.ts +0 -2
  125. package/dist/integration-tests/live-integration-gates.d.ts.map +0 -1
  126. package/dist/integration-tests/live-integration-gates.js +0 -4
  127. package/dist/integration-tests/live-integration-gates.js.map +0 -1
  128. package/dist/integration-tests/smoke-harness.d.ts.map +0 -1
  129. 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,4 +1,5 @@
1
- import { type GatewayVmAutoRecoveryPolicy, type GatewayVmRecoveryReason } from './gateway-vm-recovery-policy.js';
1
+ import type { GatewayRecoveryTimeoutErrorCode } from '@agent-vm/gateway-interface';
2
+ import { type GatewayVmAutoRecoveryPolicy, type GatewayVmRecoveryBudgetClass, type GatewayVmRecoveryReason } from './gateway-vm-recovery-policy.js';
2
3
  import type { HealthEventStore } from './health-event-store.js';
3
4
  export interface GatewayServiceHealthProbeResult {
4
5
  readonly ok: boolean;
@@ -17,7 +18,13 @@ export interface GatewayVmRecoveryRequest {
17
18
  readonly reason: GatewayVmRecoveryReason;
18
19
  readonly zoneId: string;
19
20
  }
21
+ export interface ClassifyRecoveryBudgetClassRequest {
22
+ readonly consecutiveFailures: number;
23
+ readonly reason: GatewayVmRecoveryReason;
24
+ readonly zoneId: string;
25
+ }
20
26
  export type GatewayVmRecoveryResult = {
27
+ readonly action?: 'gateway-vm-restart' | undefined;
21
28
  readonly elapsedMs: number;
22
29
  readonly leaseReleaseFailureCount: number;
23
30
  readonly newBootedAt: string;
@@ -26,19 +33,51 @@ export type GatewayVmRecoveryResult = {
26
33
  readonly oldBootedAt: string;
27
34
  readonly oldHostPid: number;
28
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;
29
46
  readonly result: 'ok';
30
47
  } | {
48
+ readonly action: 'gateway-vm-restart';
31
49
  readonly elapsedMs: number;
32
50
  readonly errorCode: string;
33
51
  readonly leaseReleaseFailureCount?: number | undefined;
34
52
  readonly oldBootedAt?: string | undefined;
35
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;
36
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;
37
76
  readonly result: 'failed';
38
77
  };
39
78
  export interface CreateGatewayServiceHealthMonitorOptions {
40
79
  readonly clearIntervalImpl?: ((timer: NodeJS.Timeout) => void) | undefined;
41
- readonly clearTimeoutImpl?: ((timer: NodeJS.Timeout) => void) | undefined;
80
+ readonly classifyRecoveryBudgetClass?: ((request: ClassifyRecoveryBudgetClassRequest) => GatewayVmRecoveryBudgetClass) | undefined;
42
81
  readonly gatewayServiceAutoRestart: GatewayVmAutoRecoveryPolicy;
43
82
  readonly healthEventStore: HealthEventStore;
44
83
  readonly intervalMs: number;
@@ -46,7 +85,6 @@ export interface CreateGatewayServiceHealthMonitorOptions {
46
85
  readonly probeZoneHealth: (zoneId: string) => Promise<GatewayServiceHealthProbeResult>;
47
86
  readonly recoverGatewayVm?: ((request: GatewayVmRecoveryRequest) => Promise<GatewayVmRecoveryResult>) | undefined;
48
87
  readonly setIntervalImpl?: ((callback: () => void | Promise<void>, delayMs: number) => NodeJS.Timeout) | undefined;
49
- readonly setTimeoutImpl?: ((callback: () => void, delayMs: number) => NodeJS.Timeout) | undefined;
50
88
  readonly staleAfterMs: number;
51
89
  readonly zoneIds: readonly string[];
52
90
  }
@@ -1 +1 @@
1
- {"version":3,"file":"gateway-service-health-monitor.d.ts","sourceRoot":"","sources":["../../../src/controller/health/gateway-service-health-monitor.ts"],"names":[],"mappings":"AAEA,OAAO,EAEN,KAAK,2BAA2B,EAEhC,KAAK,uBAAuB,EAC5B,MAAM,iCAAiC,CAAC;AACzC,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,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,uBAAuB,GAChC;IACA,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;CACrB,GACD;IACA,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,wBAAwB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;CACzB,CAAC;AAEL,MAAM,WAAW,wCAAwC;IACxD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC3E,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC1E,QAAQ,CAAC,yBAAyB,EAAE,2BAA2B,CAAC;IAChE,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAC5C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC;IAC3B,QAAQ,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,+BAA+B,CAAC,CAAC;IACvF,QAAQ,CAAC,gBAAgB,CAAC,EACvB,CAAC,CAAC,OAAO,EAAE,wBAAwB,KAAK,OAAO,CAAC,uBAAuB,CAAC,CAAC,GACzE,SAAS,CAAC;IACb,QAAQ,CAAC,eAAe,CAAC,EACtB,CAAC,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,OAAO,CAAC,GAC3E,SAAS,CAAC;IACb,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;IAClG,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAWD,wBAAgB,iCAAiC,CAChD,OAAO,EAAE,wCAAwC,GAC/C,2BAA2B,CAyS7B"}
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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"}