@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.
Files changed (133) hide show
  1. package/dist/build/gondolin-image-builder.d.ts +1 -0
  2. package/dist/build/gondolin-image-builder.d.ts.map +1 -1
  3. package/dist/build/gondolin-image-builder.js +11 -1
  4. package/dist/build/gondolin-image-builder.js.map +1 -1
  5. package/dist/build/managed-image-dockerfile.d.ts +2 -1
  6. package/dist/build/managed-image-dockerfile.d.ts.map +1 -1
  7. package/dist/build/managed-image-dockerfile.js +51 -27
  8. package/dist/build/managed-image-dockerfile.js.map +1 -1
  9. package/dist/cli/commands/controller-definition.d.ts +42 -42
  10. package/dist/cli/commands/create-app.d.ts +60 -60
  11. package/dist/cli/manual-templates.d.ts.map +1 -1
  12. package/dist/cli/manual-templates.js +14 -1
  13. package/dist/cli/manual-templates.js.map +1 -1
  14. package/dist/config/system-config.d.ts +15 -0
  15. package/dist/config/system-config.d.ts.map +1 -1
  16. package/dist/config/system-config.js +74 -0
  17. package/dist/config/system-config.js.map +1 -1
  18. package/dist/controller/controller-runtime-operations.d.ts +1 -0
  19. package/dist/controller/controller-runtime-operations.d.ts.map +1 -1
  20. package/dist/controller/controller-runtime-operations.js +2 -0
  21. package/dist/controller/controller-runtime-operations.js.map +1 -1
  22. package/dist/controller/controller-runtime-types.d.ts +5 -0
  23. package/dist/controller/controller-runtime-types.d.ts.map +1 -1
  24. package/dist/controller/controller-runtime.d.ts +1 -0
  25. package/dist/controller/controller-runtime.d.ts.map +1 -1
  26. package/dist/controller/controller-runtime.js +220 -3
  27. package/dist/controller/controller-runtime.js.map +1 -1
  28. package/dist/controller/health/channel-provider-recovery-observation.d.ts +23 -0
  29. package/dist/controller/health/channel-provider-recovery-observation.d.ts.map +1 -0
  30. package/dist/controller/health/channel-provider-recovery-observation.js +69 -0
  31. package/dist/controller/health/channel-provider-recovery-observation.js.map +1 -0
  32. package/dist/controller/health/durable-health-event-log.d.ts +24 -0
  33. package/dist/controller/health/durable-health-event-log.d.ts.map +1 -0
  34. package/dist/controller/health/durable-health-event-log.js +89 -0
  35. package/dist/controller/health/durable-health-event-log.js.map +1 -0
  36. package/dist/controller/health/gateway-recovery-actions.d.ts +27 -0
  37. package/dist/controller/health/gateway-recovery-actions.d.ts.map +1 -0
  38. package/dist/controller/health/gateway-recovery-actions.js +71 -0
  39. package/dist/controller/health/gateway-recovery-actions.js.map +1 -0
  40. package/dist/controller/health/gateway-service-health-monitor.d.ts +71 -3
  41. package/dist/controller/health/gateway-service-health-monitor.d.ts.map +1 -1
  42. package/dist/controller/health/gateway-service-health-monitor.js +383 -10
  43. package/dist/controller/health/gateway-service-health-monitor.js.map +1 -1
  44. package/dist/controller/health/gateway-vm-recovery-policy.d.ts +68 -0
  45. package/dist/controller/health/gateway-vm-recovery-policy.d.ts.map +1 -0
  46. package/dist/controller/health/gateway-vm-recovery-policy.js +199 -0
  47. package/dist/controller/health/gateway-vm-recovery-policy.js.map +1 -0
  48. package/dist/controller/health/gateway-vm-recovery-runner.d.ts +39 -0
  49. package/dist/controller/health/gateway-vm-recovery-runner.d.ts.map +1 -0
  50. package/dist/controller/health/gateway-vm-recovery-runner.js +251 -0
  51. package/dist/controller/health/gateway-vm-recovery-runner.js.map +1 -0
  52. package/dist/controller/health/health-event-store.d.ts +4 -0
  53. package/dist/controller/health/health-event-store.d.ts.map +1 -1
  54. package/dist/controller/health/health-event-store.js +19 -0
  55. package/dist/controller/health/health-event-store.js.map +1 -1
  56. package/dist/controller/http/controller-health-event-routes.d.ts +6 -0
  57. package/dist/controller/http/controller-health-event-routes.d.ts.map +1 -1
  58. package/dist/controller/http/controller-health-event-routes.js +49 -0
  59. package/dist/controller/http/controller-health-event-routes.js.map +1 -1
  60. package/dist/controller/http/controller-http-routes.d.ts.map +1 -1
  61. package/dist/controller/http/controller-http-routes.js +6 -0
  62. package/dist/controller/http/controller-http-routes.js.map +1 -1
  63. package/dist/controller/leases/lease-manager.d.ts.map +1 -1
  64. package/dist/controller/leases/lease-manager.js +37 -16
  65. package/dist/controller/leases/lease-manager.js.map +1 -1
  66. package/dist/controller/leases/tool-vm-lease-lifecycle.d.ts +44 -0
  67. package/dist/controller/leases/tool-vm-lease-lifecycle.d.ts.map +1 -0
  68. package/dist/controller/leases/tool-vm-lease-lifecycle.js +28 -0
  69. package/dist/controller/leases/tool-vm-lease-lifecycle.js.map +1 -0
  70. package/dist/controller/zone-runtimes/gateway-lifecycle-operation-record.d.ts +37 -0
  71. package/dist/controller/zone-runtimes/gateway-lifecycle-operation-record.d.ts.map +1 -0
  72. package/dist/controller/zone-runtimes/gateway-lifecycle-operation-record.js +133 -0
  73. package/dist/controller/zone-runtimes/gateway-lifecycle-operation-record.js.map +1 -0
  74. package/dist/controller/zone-runtimes/gateway-zone-state-machine.d.ts +101 -0
  75. package/dist/controller/zone-runtimes/gateway-zone-state-machine.d.ts.map +1 -0
  76. package/dist/controller/zone-runtimes/gateway-zone-state-machine.js +143 -0
  77. package/dist/controller/zone-runtimes/gateway-zone-state-machine.js.map +1 -0
  78. package/dist/controller/zone-runtimes/openclaw-zone-runtime.d.ts +16 -1
  79. package/dist/controller/zone-runtimes/openclaw-zone-runtime.d.ts.map +1 -1
  80. package/dist/controller/zone-runtimes/openclaw-zone-runtime.js +700 -40
  81. package/dist/controller/zone-runtimes/openclaw-zone-runtime.js.map +1 -1
  82. package/dist/controller/zone-runtimes/zone-runtime-errors.d.ts +7 -1
  83. package/dist/controller/zone-runtimes/zone-runtime-errors.d.ts.map +1 -1
  84. package/dist/controller/zone-runtimes/zone-runtime-errors.js +5 -1
  85. package/dist/controller/zone-runtimes/zone-runtime-errors.js.map +1 -1
  86. package/dist/controller/zone-runtimes/zone-runtime-registry.d.ts +2 -0
  87. package/dist/controller/zone-runtimes/zone-runtime-registry.d.ts.map +1 -1
  88. package/dist/controller/zone-runtimes/zone-runtime-registry.js +23 -0
  89. package/dist/controller/zone-runtimes/zone-runtime-registry.js.map +1 -1
  90. package/dist/controller/zone-runtimes/zone-runtime-types.d.ts +14 -1
  91. package/dist/controller/zone-runtimes/zone-runtime-types.d.ts.map +1 -1
  92. package/dist/gateway/gateway-ownership-evidence.d.ts +35 -0
  93. package/dist/gateway/gateway-ownership-evidence.d.ts.map +1 -0
  94. package/dist/gateway/gateway-ownership-evidence.js +10 -0
  95. package/dist/gateway/gateway-ownership-evidence.js.map +1 -0
  96. package/dist/gateway/gateway-recovery.d.ts +16 -0
  97. package/dist/gateway/gateway-recovery.d.ts.map +1 -1
  98. package/dist/gateway/gateway-recovery.js +105 -9
  99. package/dist/gateway/gateway-recovery.js.map +1 -1
  100. package/dist/gateway/gateway-zone-orchestrator.d.ts.map +1 -1
  101. package/dist/gateway/gateway-zone-orchestrator.js +50 -39
  102. package/dist/gateway/gateway-zone-orchestrator.js.map +1 -1
  103. package/dist/integration-tests/{smoke-harness.d.ts → e2e-harness.d.ts} +45 -37
  104. package/dist/integration-tests/e2e-harness.d.ts.map +1 -0
  105. package/dist/integration-tests/{smoke-harness.js → e2e-harness.js} +134 -108
  106. package/dist/integration-tests/e2e-harness.js.map +1 -0
  107. package/dist/integration-tests/e2e-workspace-build-global-setup.d.ts +16 -0
  108. package/dist/integration-tests/e2e-workspace-build-global-setup.d.ts.map +1 -0
  109. package/dist/integration-tests/e2e-workspace-build-global-setup.js +27 -0
  110. package/dist/integration-tests/e2e-workspace-build-global-setup.js.map +1 -0
  111. package/dist/integration-tests/live-agent-model-roundtrip-deployment.d.ts +11 -0
  112. package/dist/integration-tests/live-agent-model-roundtrip-deployment.d.ts.map +1 -0
  113. package/dist/integration-tests/live-agent-model-roundtrip-deployment.js +48 -0
  114. package/dist/integration-tests/live-agent-model-roundtrip-deployment.js.map +1 -0
  115. package/dist/integration-tests/live-agent-model-roundtrip-gates.d.ts +11 -0
  116. package/dist/integration-tests/live-agent-model-roundtrip-gates.d.ts.map +1 -0
  117. package/dist/integration-tests/live-agent-model-roundtrip-gates.js +21 -0
  118. package/dist/integration-tests/live-agent-model-roundtrip-gates.js.map +1 -0
  119. package/dist/integration-tests/live-vm-e2e-gates.d.ts +2 -0
  120. package/dist/integration-tests/live-vm-e2e-gates.d.ts.map +1 -0
  121. package/dist/integration-tests/live-vm-e2e-gates.js +4 -0
  122. package/dist/integration-tests/live-vm-e2e-gates.js.map +1 -0
  123. package/dist/operations/controller-status.d.ts +5 -0
  124. package/dist/operations/controller-status.d.ts.map +1 -1
  125. package/dist/operations/controller-status.js +42 -0
  126. package/dist/operations/controller-status.js.map +1 -1
  127. package/package.json +11 -11
  128. package/dist/integration-tests/live-integration-gates.d.ts +0 -2
  129. package/dist/integration-tests/live-integration-gates.d.ts.map +0 -1
  130. package/dist/integration-tests/live-integration-gates.js +0 -4
  131. package/dist/integration-tests/live-integration-gates.js.map +0 -1
  132. package/dist/integration-tests/smoke-harness.d.ts.map +0 -1
  133. package/dist/integration-tests/smoke-harness.js.map +0 -1
@@ -0,0 +1,133 @@
1
+ import { appendFile, mkdir, readFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ export const gatewayLifecycleOperationRecordKinds = [
4
+ 'start-requested',
5
+ 'restart-requested',
6
+ 'cold-start-requested',
7
+ 'credentials-refresh-requested',
8
+ 'stop-requested',
9
+ 'vm-close-started',
10
+ 'vm-close-finished',
11
+ 'runtime-record-written',
12
+ 'runtime-record-deleted',
13
+ 'operation-failed',
14
+ 'operation-finished',
15
+ ];
16
+ export const gatewayLifecycleOperationTriggers = [
17
+ 'controller-start',
18
+ 'operator-start',
19
+ 'operator-stop',
20
+ 'operator-restart',
21
+ 'credentials-refresh',
22
+ 'auto-recovery',
23
+ 'upgrade',
24
+ ];
25
+ export function resolveGatewayLifecycleOperationLogPath(options) {
26
+ return path.join(options.runtimeDir, 'zones', options.zoneId, 'gateway-lifecycle', 'events.jsonl');
27
+ }
28
+ export async function appendGatewayLifecycleOperationRecord(options) {
29
+ const logPath = resolveGatewayLifecycleOperationLogPath(options);
30
+ await mkdir(path.dirname(logPath), { recursive: true, mode: 0o700 });
31
+ await appendFile(logPath, `${JSON.stringify(options.record)}\n`, 'utf8');
32
+ }
33
+ export async function readGatewayLifecycleOperationRecords(options) {
34
+ const logPath = resolveGatewayLifecycleOperationLogPath(options);
35
+ const contents = await readOptionalUtf8File(logPath);
36
+ if (contents === null) {
37
+ return [];
38
+ }
39
+ const lines = contents.split('\n').filter((line) => line.trim().length > 0);
40
+ const records = [];
41
+ for (let lineIndex = 0; lineIndex < lines.length; lineIndex += 1) {
42
+ const line = lines[lineIndex];
43
+ if (line === undefined) {
44
+ continue;
45
+ }
46
+ const isLatestLine = lineIndex === lines.length - 1;
47
+ try {
48
+ const parsedRecord = JSON.parse(line);
49
+ if (!isGatewayLifecycleOperationRecord(parsedRecord)) {
50
+ throw new Error('record does not match gateway lifecycle operation schema');
51
+ }
52
+ records.push(parsedRecord);
53
+ }
54
+ catch (error) {
55
+ if (isLatestLine) {
56
+ continue;
57
+ }
58
+ throw new Error(`Corrupt gateway lifecycle operation record at line ${String(lineIndex + 1)} in ${logPath}: ${getErrorMessage(error)}`, { cause: error });
59
+ }
60
+ }
61
+ return records;
62
+ }
63
+ export async function readLatestGatewayLifecycleOperationRecord(options) {
64
+ const records = await readGatewayLifecycleOperationRecords(options);
65
+ return records.at(-1) ?? null;
66
+ }
67
+ function isGatewayLifecycleOperationRecord(value) {
68
+ if (!isRecord(value)) {
69
+ return false;
70
+ }
71
+ return (typeof value.controllerPid === 'number' &&
72
+ Number.isInteger(value.controllerPid) &&
73
+ value.controllerPid > 0 &&
74
+ optionalString(value.controllerStartedAt) &&
75
+ optionalGatewayIdentity(value.currentGateway) &&
76
+ optionalString(value.errorCode) &&
77
+ optionalString(value.errorMessage) &&
78
+ isGatewayType(value.gatewayType) &&
79
+ isOneOf(gatewayLifecycleOperationRecordKinds, value.kind) &&
80
+ typeof value.observedAtMs === 'number' &&
81
+ Number.isFinite(value.observedAtMs) &&
82
+ typeof value.operationId === 'string' &&
83
+ value.operationId.length > 0 &&
84
+ isOneOf(gatewayLifecycleOperationTriggers, value.operationTrigger) &&
85
+ optionalGatewayIdentity(value.previousGateway) &&
86
+ typeof value.zoneId === 'string' &&
87
+ value.zoneId.length > 0);
88
+ }
89
+ function optionalGatewayIdentity(value) {
90
+ if (value === undefined) {
91
+ return true;
92
+ }
93
+ if (!isRecord(value)) {
94
+ return false;
95
+ }
96
+ return (optionalString(value.bootedAt) &&
97
+ (value.hostPid === undefined ||
98
+ (typeof value.hostPid === 'number' &&
99
+ Number.isInteger(value.hostPid) &&
100
+ value.hostPid > 0)) &&
101
+ typeof value.vmId === 'string' &&
102
+ value.vmId.length > 0);
103
+ }
104
+ function isGatewayType(value) {
105
+ return value === 'openclaw' || value === 'worker';
106
+ }
107
+ function isOneOf(values, value) {
108
+ return typeof value === 'string' && values.some((candidateValue) => candidateValue === value);
109
+ }
110
+ function optionalString(value) {
111
+ return value === undefined || typeof value === 'string';
112
+ }
113
+ function isRecord(value) {
114
+ return typeof value === 'object' && value !== null;
115
+ }
116
+ async function readOptionalUtf8File(filePath) {
117
+ try {
118
+ return await readFile(filePath, 'utf8');
119
+ }
120
+ catch (error) {
121
+ if (isNodeErrorWithCode(error, 'ENOENT')) {
122
+ return null;
123
+ }
124
+ throw error;
125
+ }
126
+ }
127
+ function isNodeErrorWithCode(error, code) {
128
+ return isRecord(error) && error.code === code;
129
+ }
130
+ function getErrorMessage(error) {
131
+ return error instanceof Error ? error.message : String(error);
132
+ }
133
+ //# sourceMappingURL=gateway-lifecycle-operation-record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-lifecycle-operation-record.js","sourceRoot":"","sources":["../../../src/controller/zone-runtimes/gateway-lifecycle-operation-record.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ import type { AgentVmHealthEventKind } from '@agent-vm/gateway-interface';
2
+ import type { GatewayOwnershipEvidence } from '../../gateway/gateway-ownership-evidence.js';
3
+ import type { ControllerZoneLifecycleState } from '../../operations/controller-status.js';
4
+ import type { GatewayVmRecoveryReason } from '../health/gateway-vm-recovery-policy.js';
5
+ import type { GatewayZoneRuntimeHandle } from './zone-runtime-types.js';
6
+ export type GatewayLifecycleErrorCode = 'secret-resolution-failed' | 'image-build-failed' | 'vm-create-failed' | 'vm-start-failed' | 'readiness-failed' | 'record-write-failed' | 'old-gateway-not-running' | 'vm-process-missing' | 'gateway-control-link-unhealthy' | 'gateway-service-unhealthy' | 'agent-channel-provider-unhealthy' | 'owner-unsafe' | 'recovery-timeout' | 'stale-generation-closed';
7
+ export type GatewayRecoveryErrorCode = Extract<GatewayLifecycleErrorCode, GatewayVmRecoveryReason>;
8
+ export interface GatewayLifecycleErrorSnapshot {
9
+ readonly code: GatewayLifecycleErrorCode;
10
+ readonly message: string;
11
+ }
12
+ export type GatewayZoneLifecycleState = {
13
+ readonly kind: 'stopped';
14
+ } | {
15
+ readonly kind: 'starting';
16
+ readonly operationId: string;
17
+ readonly startedAtMs: number;
18
+ } | {
19
+ readonly kind: 'running';
20
+ readonly gateway: GatewayZoneRuntimeHandle;
21
+ } | {
22
+ readonly gateway: GatewayZoneRuntimeHandle;
23
+ readonly kind: 'running-degraded';
24
+ readonly reason: GatewayVmRecoveryReason;
25
+ } | {
26
+ readonly kind: 'stopping';
27
+ readonly next: 'stopped' | 'starting';
28
+ readonly operationId: string;
29
+ readonly previousGateway: GatewayZoneRuntimeHandle | undefined;
30
+ } | {
31
+ readonly kind: 'restarting';
32
+ readonly operationId: string;
33
+ readonly previousGateway: GatewayZoneRuntimeHandle;
34
+ } | {
35
+ readonly coldStartEligible: boolean;
36
+ readonly error: GatewayLifecycleErrorSnapshot;
37
+ readonly kind: 'failed';
38
+ } | {
39
+ readonly evidence: GatewayOwnershipEvidence;
40
+ readonly kind: 'owner-unsafe';
41
+ };
42
+ export type GatewaySelectedZoneReadiness = 'running' | 'degraded' | 'failed' | 'owner-unsafe';
43
+ export type GatewayChannelProviderPlane = 'ok' | 'transitioning' | 'degraded' | 'failed' | 'unknown';
44
+ export type GatewayToolVmPlane = 'ok' | 'degraded' | 'failed' | 'unknown';
45
+ export type GatewayLifecycleOperation = 'start' | 'stop' | 'restart' | 'cold-start' | 'credentials-refresh' | 'none';
46
+ export type GatewayOutageEvidenceEventKind = AgentVmHealthEventKind | 'gateway-lifecycle-operation';
47
+ export interface GatewayDiagnosisSnapshot {
48
+ readonly channelProviderPlane: GatewayChannelProviderPlane;
49
+ readonly controllerLiveness: 'ok' | 'failed';
50
+ readonly currentRecoveryBlocker: GatewayLifecycleErrorCode | 'none';
51
+ readonly gatewayInfrastructure: GatewayZoneLifecycleState['kind'];
52
+ readonly lastOperation: GatewayLifecycleOperation;
53
+ readonly originalOutageCause: {
54
+ readonly kind: 'unknown';
55
+ } | {
56
+ readonly errorCode?: GatewayLifecycleErrorCode;
57
+ readonly eventKind: GatewayOutageEvidenceEventKind;
58
+ readonly kind: 'proven';
59
+ };
60
+ readonly selectedZoneReadiness: GatewaySelectedZoneReadiness;
61
+ readonly toolVmPlane: GatewayToolVmPlane;
62
+ }
63
+ export interface DeriveGatewayDiagnosisSnapshotInput {
64
+ readonly channelProviderPlane: GatewayChannelProviderPlane;
65
+ readonly controllerLiveness: 'ok' | 'failed';
66
+ readonly lastOperation?: GatewayLifecycleOperation | undefined;
67
+ readonly originalOutageCause?: GatewayDiagnosisSnapshot['originalOutageCause'] | undefined;
68
+ readonly state: GatewayZoneLifecycleState;
69
+ readonly toolVmPlane: GatewayToolVmPlane;
70
+ }
71
+ export type GatewayZoneLifecycleEvent = {
72
+ readonly kind: 'start-requested';
73
+ readonly operationId: string;
74
+ readonly startedAtMs: number;
75
+ } | {
76
+ readonly kind: 'gateway-started';
77
+ readonly gateway: GatewayZoneRuntimeHandle;
78
+ } | {
79
+ readonly coldStartEligible: boolean;
80
+ readonly error: GatewayLifecycleErrorSnapshot;
81
+ readonly kind: 'start-failed';
82
+ } | {
83
+ readonly kind: 'stop-requested';
84
+ readonly operationId: string;
85
+ } | {
86
+ readonly kind: 'stopped';
87
+ } | {
88
+ readonly evidence: GatewayOwnershipEvidence;
89
+ readonly kind: 'owner-unsafe';
90
+ };
91
+ export declare function projectGatewayZoneLifecycleStateForStatus(state: GatewayZoneLifecycleState): ControllerZoneLifecycleState;
92
+ export declare function transitionGatewayZoneState(state: GatewayZoneLifecycleState, event: GatewayZoneLifecycleEvent): GatewayZoneLifecycleState;
93
+ export declare function classifyGatewayStartError(error: unknown): GatewayLifecycleErrorSnapshot;
94
+ export declare function classifyGatewayRecoveryPrecondition(state: GatewayZoneLifecycleState, ownership: {
95
+ readonly kind: 'clear';
96
+ } | {
97
+ readonly evidence: GatewayOwnershipEvidence;
98
+ readonly kind: 'blocked';
99
+ }): GatewayLifecycleErrorSnapshot | null;
100
+ export declare function deriveGatewayDiagnosisSnapshot(input: DeriveGatewayDiagnosisSnapshotInput): GatewayDiagnosisSnapshot;
101
+ //# sourceMappingURL=gateway-zone-state-machine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-zone-state-machine.d.ts","sourceRoot":"","sources":["../../../src/controller/zone-runtimes/gateway-zone-state-machine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,143 @@
1
+ export function projectGatewayZoneLifecycleStateForStatus(state) {
2
+ switch (state.kind) {
3
+ case 'running':
4
+ case 'running-degraded':
5
+ return 'running';
6
+ case 'failed':
7
+ case 'owner-unsafe':
8
+ return 'failed';
9
+ case 'restarting':
10
+ case 'starting':
11
+ case 'stopped':
12
+ case 'stopping':
13
+ return 'stopped';
14
+ }
15
+ return assertNeverGatewayZoneLifecycleState(state);
16
+ }
17
+ export function transitionGatewayZoneState(state, event) {
18
+ switch (event.kind) {
19
+ case 'start-requested':
20
+ return {
21
+ kind: 'starting',
22
+ operationId: event.operationId,
23
+ startedAtMs: event.startedAtMs,
24
+ };
25
+ case 'gateway-started':
26
+ return { gateway: event.gateway, kind: 'running' };
27
+ case 'start-failed':
28
+ return {
29
+ coldStartEligible: event.coldStartEligible,
30
+ error: event.error,
31
+ kind: 'failed',
32
+ };
33
+ case 'stop-requested':
34
+ return {
35
+ kind: 'stopping',
36
+ next: 'stopped',
37
+ operationId: event.operationId,
38
+ previousGateway: state.kind === 'running' || state.kind === 'running-degraded' ? state.gateway : undefined,
39
+ };
40
+ case 'stopped':
41
+ return { kind: 'stopped' };
42
+ case 'owner-unsafe':
43
+ return { evidence: event.evidence, kind: 'owner-unsafe' };
44
+ }
45
+ return assertNeverGatewayZoneLifecycleEvent(event);
46
+ }
47
+ export function classifyGatewayStartError(error) {
48
+ const message = getErrorMessage(error);
49
+ const normalizedMessage = message.toLowerCase();
50
+ if (normalizedMessage.includes('secret') ||
51
+ normalizedMessage.includes('resolveall') ||
52
+ normalizedMessage.includes('op://') ||
53
+ normalizedMessage.includes('1password')) {
54
+ return { code: 'secret-resolution-failed', message };
55
+ }
56
+ if (normalizedMessage.includes('image') || normalizedMessage.includes('build')) {
57
+ return { code: 'image-build-failed', message };
58
+ }
59
+ if (normalizedMessage.includes('readyz') || normalizedMessage.includes('readiness')) {
60
+ return { code: 'readiness-failed', message };
61
+ }
62
+ return { code: 'vm-start-failed', message };
63
+ }
64
+ export function classifyGatewayRecoveryPrecondition(state, ownership) {
65
+ if (ownership.kind === 'blocked') {
66
+ return {
67
+ code: 'owner-unsafe',
68
+ message: `Gateway recovery is blocked by unsafe ownership evidence: ${ownership.evidence.kind}.`,
69
+ };
70
+ }
71
+ if (state.kind === 'running' || state.kind === 'running-degraded') {
72
+ return null;
73
+ }
74
+ if (state.kind === 'failed') {
75
+ return state.error;
76
+ }
77
+ return {
78
+ code: 'old-gateway-not-running',
79
+ message: `Gateway recovery cannot restart a gateway in '${state.kind}' state without cold-start.`,
80
+ };
81
+ }
82
+ export function deriveGatewayDiagnosisSnapshot(input) {
83
+ return {
84
+ channelProviderPlane: input.channelProviderPlane,
85
+ controllerLiveness: input.controllerLiveness,
86
+ currentRecoveryBlocker: currentRecoveryBlockerForState(input.state),
87
+ gatewayInfrastructure: input.state.kind,
88
+ lastOperation: input.lastOperation ?? 'none',
89
+ originalOutageCause: input.originalOutageCause ?? { kind: 'unknown' },
90
+ selectedZoneReadiness: selectedZoneReadinessForState(input.state),
91
+ toolVmPlane: input.toolVmPlane,
92
+ };
93
+ }
94
+ function currentRecoveryBlockerForState(state) {
95
+ switch (state.kind) {
96
+ case 'failed':
97
+ return state.error.code;
98
+ case 'owner-unsafe':
99
+ return 'owner-unsafe';
100
+ case 'running-degraded':
101
+ return state.reason;
102
+ case 'restarting':
103
+ case 'running':
104
+ case 'starting':
105
+ case 'stopped':
106
+ case 'stopping':
107
+ return 'none';
108
+ }
109
+ return assertNeverGatewayZoneLifecycleState(state);
110
+ }
111
+ function selectedZoneReadinessForState(state) {
112
+ switch (state.kind) {
113
+ case 'running':
114
+ return 'running';
115
+ case 'restarting':
116
+ case 'running-degraded':
117
+ case 'starting':
118
+ case 'stopping':
119
+ return 'degraded';
120
+ case 'failed':
121
+ case 'stopped':
122
+ return 'failed';
123
+ case 'owner-unsafe':
124
+ return 'owner-unsafe';
125
+ }
126
+ return assertNeverGatewayZoneLifecycleState(state);
127
+ }
128
+ function assertNeverGatewayZoneLifecycleState(state) {
129
+ throw new Error(`Unhandled gateway zone lifecycle state: ${JSON.stringify(state)}`);
130
+ }
131
+ function assertNeverGatewayZoneLifecycleEvent(event) {
132
+ throw new Error(`Unhandled gateway zone lifecycle event: ${JSON.stringify(event)}`);
133
+ }
134
+ function getErrorMessage(error) {
135
+ if (error instanceof Error && error.message.length > 0) {
136
+ return error.message;
137
+ }
138
+ if (typeof error === 'string' && error.length > 0) {
139
+ return error;
140
+ }
141
+ return 'Unknown gateway start failure.';
142
+ }
143
+ //# sourceMappingURL=gateway-zone-state-machine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-zone-state-machine.js","sourceRoot":"","sources":["../../../src/controller/zone-runtimes/gateway-zone-state-machine.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ import { runControllerDestroy as runControllerDestroyDefault } from '../../opera
6
6
  import { runControllerUpgrade as runControllerUpgradeDefault } from '../../operations/upgrade-zone.js';
7
7
  import { runControllerLogs as runControllerLogsDefault } from '../../operations/zone-logs.js';
8
8
  import type { LeaseManager } from '../leases/lease-manager.js';
9
+ import { type GatewayLifecycleOperationRecord } from './gateway-lifecycle-operation-record.js';
9
10
  import type { ControllerZoneConfig, OpenClawZoneRuntime } from './zone-runtime-types.js';
10
11
  type OpenClawZoneConfig = ControllerZoneConfig & {
11
12
  readonly gateway: Extract<ControllerZoneConfig['gateway'], {
@@ -13,18 +14,32 @@ type OpenClawZoneConfig = ControllerZoneConfig & {
13
14
  }>;
14
15
  };
15
16
  export interface CreateOpenClawZoneRuntimeOptions {
17
+ readonly clearTimeoutImpl?: ((timer: NodeJS.Timeout) => void) | undefined;
18
+ readonly closeGatewayTimeoutMs?: number | undefined;
19
+ readonly createFreshSecretResolver?: (() => Promise<SecretResolver>) | undefined;
16
20
  readonly deleteGatewayRuntimeRecord?: (stateDirectory: string) => Promise<void>;
21
+ readonly appendGatewayLifecycleOperationRecord?: (record: GatewayLifecycleOperationRecord) => Promise<void>;
22
+ readonly isProcessAlive?: (pid: number) => boolean;
17
23
  readonly leaseManager: Pick<LeaseManager, 'listLeases' | 'releaseLease'>;
18
24
  readonly now: () => number;
19
- readonly restartGatewayZone?: (zoneId: string) => Promise<GatewayZoneStartResult>;
25
+ readonly restartGatewayZone?: (zoneId: string, options?: GatewayZoneStartOptions) => Promise<GatewayZoneStartResult>;
20
26
  readonly runControllerCredentialsRefresh?: typeof runControllerCredentialsRefreshDefault;
21
27
  readonly runControllerDestroy?: typeof runControllerDestroyDefault;
22
28
  readonly runControllerLogs?: typeof runControllerLogsDefault;
23
29
  readonly runControllerUpgrade?: typeof runControllerUpgradeDefault;
24
30
  readonly secretResolver: SecretResolver;
31
+ readonly setTimeoutImpl?: ((callback: () => void, delayMs: number) => NodeJS.Timeout) | undefined;
25
32
  readonly systemConfig: LoadedSystemConfig;
26
33
  readonly zone: OpenClawZoneConfig;
27
34
  }
35
+ interface GatewayZoneStartOptions {
36
+ readonly secretResolver?: SecretResolver | undefined;
37
+ }
38
+ declare class OpenClawZoneRestartTimeoutError extends Error {
39
+ readonly code = "OPENCLAW_GATEWAY_RESTART_TIMEOUT";
40
+ constructor(zoneId: string, timeoutMs: number);
41
+ }
42
+ export declare function isOpenClawZoneRestartTimeoutError(error: unknown): error is OpenClawZoneRestartTimeoutError;
28
43
  export declare function createOpenClawZoneRuntime(options: CreateOpenClawZoneRuntimeOptions): OpenClawZoneRuntime;
29
44
  export {};
30
45
  //# sourceMappingURL=openclaw-zone-runtime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"openclaw-zone-runtime.d.ts","sourceRoot":"","sources":["../../../src/controller/zone-runtimes/openclaw-zone-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAElE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAKxE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AACpF,OAAO,EAAE,+BAA+B,IAAI,sCAAsC,EAAE,MAAM,yCAAyC,CAAC;AACpI,OAAO,EAAE,oBAAoB,IAAI,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AACvG,OAAO,EAAE,oBAAoB,IAAI,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AACvG,OAAO,EAAE,iBAAiB,IAAI,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAC9F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAK/D,OAAO,KAAK,EACX,oBAAoB,EAEpB,mBAAmB,EACnB,MAAM,yBAAyB,CAAC;AAEjC,KAAK,kBAAkB,GAAG,oBAAoB,GAAG;IAChD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,oBAAoB,CAAC,SAAS,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;KAAE,CAAC,CAAC;CAC1F,CAAC;AAEF,MAAM,WAAW,gCAAgC;IAChD,QAAQ,CAAC,0BAA0B,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChF,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,YAAY,GAAG,cAAc,CAAC,CAAC;IACzE,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC;IAC3B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAClF,QAAQ,CAAC,+BAA+B,CAAC,EAAE,OAAO,sCAAsC,CAAC;IACzF,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,2BAA2B,CAAC;IACnE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,wBAAwB,CAAC;IAC7D,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,2BAA2B,CAAC;IACnE,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,QAAQ,CAAC,YAAY,EAAE,kBAAkB,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;CAClC;AAgBD,wBAAgB,yBAAyB,CACxC,OAAO,EAAE,gCAAgC,GACvC,mBAAmB,CAsJrB"}
1
+ {"version":3,"file":"openclaw-zone-runtime.d.ts","sourceRoot":"","sources":["../../../src/controller/zone-runtimes/openclaw-zone-runtime.ts"],"names":[],"mappings":"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"}