@shravansunder/agent-vm 0.0.1 → 0.0.3

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 (131) hide show
  1. package/dist/backup/backup-encryption.d.ts +2 -2
  2. package/dist/backup/backup-encryption.d.ts.map +1 -1
  3. package/dist/backup/backup-encryption.js +29 -7
  4. package/dist/backup/backup-encryption.js.map +1 -1
  5. package/dist/build/docker-image-builder.d.ts +3 -1
  6. package/dist/build/docker-image-builder.d.ts.map +1 -1
  7. package/dist/build/docker-image-builder.js +4 -4
  8. package/dist/build/docker-image-builder.js.map +1 -1
  9. package/dist/build/gondolin-image-builder.d.ts +2 -2
  10. package/dist/build/gondolin-image-builder.d.ts.map +1 -1
  11. package/dist/build/gondolin-image-builder.js +10 -9
  12. package/dist/build/gondolin-image-builder.js.map +1 -1
  13. package/dist/build/stale-image-cleaner.d.ts.map +1 -1
  14. package/dist/build/stale-image-cleaner.js +15 -11
  15. package/dist/build/stale-image-cleaner.js.map +1 -1
  16. package/dist/cli/agent-vm-cli-support.d.ts +3 -3
  17. package/dist/cli/agent-vm-cli-support.d.ts.map +1 -1
  18. package/dist/cli/agent-vm-cli-support.js +5 -8
  19. package/dist/cli/agent-vm-cli-support.js.map +1 -1
  20. package/dist/cli/agent-vm-entrypoint.js +0 -0
  21. package/dist/cli/auth-interactive-command.d.ts +1 -1
  22. package/dist/cli/auth-interactive-command.d.ts.map +1 -1
  23. package/dist/cli/build-command.d.ts +2 -1
  24. package/dist/cli/build-command.d.ts.map +1 -1
  25. package/dist/cli/build-command.js +29 -1
  26. package/dist/cli/build-command.js.map +1 -1
  27. package/dist/cli/commands/command-definition-support.js +5 -5
  28. package/dist/cli/commands/command-definition-support.js.map +1 -1
  29. package/dist/cli/commands/controller-definition.d.ts.map +1 -1
  30. package/dist/cli/commands/controller-definition.js +2 -2
  31. package/dist/cli/commands/controller-definition.js.map +1 -1
  32. package/dist/cli/commands/create-app.d.ts +139 -139
  33. package/dist/cli/commands/create-app.js +1 -1
  34. package/dist/cli/commands/init-definition.js +1 -1
  35. package/dist/cli/init-command.d.ts +2 -2
  36. package/dist/cli/init-command.d.ts.map +1 -1
  37. package/dist/cli/init-command.js +32 -49
  38. package/dist/cli/init-command.js.map +1 -1
  39. package/dist/cli/openclaw-plugin-bundle.d.ts +8 -1
  40. package/dist/cli/openclaw-plugin-bundle.d.ts.map +1 -1
  41. package/dist/cli/openclaw-plugin-bundle.js +12 -7
  42. package/dist/cli/openclaw-plugin-bundle.js.map +1 -1
  43. package/dist/config/system-config.d.ts +21 -6
  44. package/dist/config/system-config.d.ts.map +1 -1
  45. package/dist/config/system-config.js +74 -8
  46. package/dist/config/system-config.js.map +1 -1
  47. package/dist/controller/composite-secret-resolver.d.ts +3 -0
  48. package/dist/controller/composite-secret-resolver.d.ts.map +1 -0
  49. package/dist/controller/composite-secret-resolver.js +38 -0
  50. package/dist/controller/composite-secret-resolver.js.map +1 -0
  51. package/dist/controller/controller-runtime-operations.d.ts +2 -2
  52. package/dist/controller/controller-runtime-operations.d.ts.map +1 -1
  53. package/dist/controller/controller-runtime-operations.js +4 -16
  54. package/dist/controller/controller-runtime-operations.js.map +1 -1
  55. package/dist/controller/controller-runtime-support.d.ts +3 -2
  56. package/dist/controller/controller-runtime-support.d.ts.map +1 -1
  57. package/dist/controller/controller-runtime-support.js +11 -5
  58. package/dist/controller/controller-runtime-support.js.map +1 -1
  59. package/dist/controller/controller-runtime-types.d.ts +7 -3
  60. package/dist/controller/controller-runtime-types.d.ts.map +1 -1
  61. package/dist/controller/controller-runtime.d.ts.map +1 -1
  62. package/dist/controller/controller-runtime.js +86 -20
  63. package/dist/controller/controller-runtime.js.map +1 -1
  64. package/dist/controller/docker-service-routing.d.ts +11 -0
  65. package/dist/controller/docker-service-routing.d.ts.map +1 -0
  66. package/dist/controller/docker-service-routing.js +148 -0
  67. package/dist/controller/docker-service-routing.js.map +1 -0
  68. package/dist/controller/http/controller-http-route-support.d.ts +8 -0
  69. package/dist/controller/http/controller-http-route-support.d.ts.map +1 -1
  70. package/dist/controller/http/controller-http-route-support.js.map +1 -1
  71. package/dist/controller/http/controller-http-routes.d.ts +2 -0
  72. package/dist/controller/http/controller-http-routes.d.ts.map +1 -1
  73. package/dist/controller/http/controller-http-routes.js +20 -2
  74. package/dist/controller/http/controller-http-routes.js.map +1 -1
  75. package/dist/controller/http/controller-request-schemas.d.ts +8 -0
  76. package/dist/controller/http/controller-request-schemas.d.ts.map +1 -1
  77. package/dist/controller/http/controller-request-schemas.js +6 -0
  78. package/dist/controller/http/controller-request-schemas.js.map +1 -1
  79. package/dist/controller/http/controller-zone-operation-routes.d.ts.map +1 -1
  80. package/dist/controller/http/controller-zone-operation-routes.js +25 -1
  81. package/dist/controller/http/controller-zone-operation-routes.js.map +1 -1
  82. package/dist/controller/leases/lease-manager.d.ts +1 -1
  83. package/dist/controller/leases/lease-manager.d.ts.map +1 -1
  84. package/dist/controller/leases/lease-manager.js +1 -3
  85. package/dist/controller/leases/lease-manager.js.map +1 -1
  86. package/dist/controller/worker-task-runner.d.ts +39 -0
  87. package/dist/controller/worker-task-runner.d.ts.map +1 -0
  88. package/dist/controller/worker-task-runner.js +242 -0
  89. package/dist/controller/worker-task-runner.js.map +1 -0
  90. package/dist/gateway/credential-manager.d.ts +1 -1
  91. package/dist/gateway/credential-manager.d.ts.map +1 -1
  92. package/dist/gateway/credential-manager.js +26 -7
  93. package/dist/gateway/credential-manager.js.map +1 -1
  94. package/dist/gateway/gateway-image-builder.d.ts +1 -1
  95. package/dist/gateway/gateway-image-builder.d.ts.map +1 -1
  96. package/dist/gateway/gateway-lifecycle-loader.d.ts +1 -1
  97. package/dist/gateway/gateway-lifecycle-loader.d.ts.map +1 -1
  98. package/dist/gateway/gateway-lifecycle-loader.js +3 -3
  99. package/dist/gateway/gateway-lifecycle-loader.js.map +1 -1
  100. package/dist/gateway/gateway-recovery.d.ts +19 -0
  101. package/dist/gateway/gateway-recovery.d.ts.map +1 -0
  102. package/dist/gateway/gateway-recovery.js +147 -0
  103. package/dist/gateway/gateway-recovery.js.map +1 -0
  104. package/dist/gateway/gateway-runtime-record.d.ts +33 -0
  105. package/dist/gateway/gateway-runtime-record.d.ts.map +1 -0
  106. package/dist/gateway/gateway-runtime-record.js +114 -0
  107. package/dist/gateway/gateway-runtime-record.js.map +1 -0
  108. package/dist/gateway/gateway-zone-orchestrator.d.ts +6 -2
  109. package/dist/gateway/gateway-zone-orchestrator.d.ts.map +1 -1
  110. package/dist/gateway/gateway-zone-orchestrator.js +61 -16
  111. package/dist/gateway/gateway-zone-orchestrator.js.map +1 -1
  112. package/dist/gateway/gateway-zone-support.d.ts +7 -4
  113. package/dist/gateway/gateway-zone-support.d.ts.map +1 -1
  114. package/dist/gateway/gateway-zone-support.js +34 -0
  115. package/dist/gateway/gateway-zone-support.js.map +1 -1
  116. package/dist/operations/doctor.d.ts.map +1 -1
  117. package/dist/operations/doctor.js +22 -11
  118. package/dist/operations/doctor.js.map +1 -1
  119. package/dist/operations/upgrade-zone.d.ts +0 -1
  120. package/dist/operations/upgrade-zone.d.ts.map +1 -1
  121. package/dist/operations/upgrade-zone.js +0 -1
  122. package/dist/operations/upgrade-zone.js.map +1 -1
  123. package/dist/runtime/project-namespace.d.ts +5 -0
  124. package/dist/runtime/project-namespace.d.ts.map +1 -0
  125. package/dist/runtime/project-namespace.js +22 -0
  126. package/dist/runtime/project-namespace.js.map +1 -0
  127. package/dist/tool-vm/tool-vm-lifecycle.d.ts +1 -1
  128. package/dist/tool-vm/tool-vm-lifecycle.d.ts.map +1 -1
  129. package/dist/tool-vm/tool-vm-lifecycle.js +3 -2
  130. package/dist/tool-vm/tool-vm-lifecycle.js.map +1 -1
  131. package/package.json +42 -40
@@ -68,9 +68,7 @@ export function createLeaseManager(options) {
68
68
  await lease.cleanWorkspace?.();
69
69
  }
70
70
  catch (error) {
71
- if (!releaseError) {
72
- releaseError = error instanceof Error ? error : new Error(String(error));
73
- }
71
+ releaseError ??= error instanceof Error ? error : new Error(String(error));
74
72
  }
75
73
  leases.delete(leaseId);
76
74
  options.tcpPool.release(lease.tcpSlot);
@@ -1 +1 @@
1
- {"version":3,"file":"lease-manager.js","sourceRoot":"","sources":["../../../src/controller/leases/lease-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lease-manager.js","sourceRoot":"","sources":["../../../src/controller/leases/lease-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { SecretResolver } from '@shravansunder/gondolin-core';
2
+ import type { SystemConfig } from '../config/system-config.js';
3
+ import type { GatewayZone } from '../gateway/gateway-zone-support.js';
4
+ export interface WorkerTaskInput {
5
+ readonly prompt: string;
6
+ readonly repos: readonly {
7
+ readonly repoUrl: string;
8
+ readonly baseBranch: string;
9
+ }[];
10
+ readonly context: Record<string, unknown>;
11
+ }
12
+ export interface PreStartResult {
13
+ readonly taskId: string;
14
+ readonly taskRoot: string;
15
+ readonly workspaceDir: string;
16
+ readonly stateDir: string;
17
+ readonly composeFilePaths: readonly string[];
18
+ readonly tcpHosts: Record<string, string>;
19
+ readonly repos: readonly {
20
+ readonly repoUrl: string;
21
+ readonly baseBranch: string;
22
+ readonly workspacePath: string;
23
+ }[];
24
+ }
25
+ export interface WorkerTaskResult {
26
+ readonly taskId: string;
27
+ readonly finalState: unknown;
28
+ readonly taskRoot: string;
29
+ }
30
+ export declare function preStartGateway(taskInput: WorkerTaskInput, zoneConfig: GatewayZone): Promise<PreStartResult>;
31
+ export declare function postStopGateway(taskId: string, zoneConfig: GatewayZone, composeFilePaths?: readonly string[]): Promise<void>;
32
+ export declare function runWorkerTask(options: {
33
+ readonly input: WorkerTaskInput;
34
+ readonly secretResolver: SecretResolver;
35
+ readonly systemConfig: SystemConfig;
36
+ readonly zoneId: string;
37
+ readonly timeoutMs?: number;
38
+ }): Promise<WorkerTaskResult>;
39
+ //# sourceMappingURL=worker-task-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-task-runner.d.ts","sourceRoot":"","sources":["../../src/controller/worker-task-runner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAInE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAqDtE,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACrF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,KAAK,EAAE,SAAS;QACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;KAC/B,EAAE,CAAC;CACJ;AAeD,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAsB,eAAe,CACpC,SAAS,EAAE,eAAe,EAC1B,UAAU,EAAE,WAAW,GACrB,OAAO,CAAC,cAAc,CAAC,CA2EzB;AAED,wBAAsB,eAAe,CACpC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,WAAW,EACvB,gBAAgB,GAAE,SAAS,MAAM,EAAO,GACtC,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAUD,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAC5C,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC5B,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqG5B"}
@@ -0,0 +1,242 @@
1
+ import crypto from 'node:crypto';
2
+ import fs from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { workerConfigSchema } from '@shravansunder/agent-vm-worker';
5
+ import { execa } from 'execa';
6
+ import { z } from 'zod';
7
+ import { startGatewayZone } from '../gateway/gateway-zone-orchestrator.js';
8
+ import { DockerServiceRoutingError, startDockerServicesForTask, stopDockerServicesForTask, } from './docker-service-routing.js';
9
+ function isPlainObject(value) {
10
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
11
+ }
12
+ function deepMerge(base, override) {
13
+ if (Array.isArray(base) || Array.isArray(override)) {
14
+ return override ?? base;
15
+ }
16
+ if (isPlainObject(base) && isPlainObject(override)) {
17
+ const keys = new Set([...Object.keys(base), ...Object.keys(override)]);
18
+ const mergedEntries = [...keys].map((key) => [key, deepMerge(base[key], override[key])]);
19
+ return Object.fromEntries(mergedEntries);
20
+ }
21
+ return override ?? base;
22
+ }
23
+ function writeStderr(message) {
24
+ process.stderr.write(`${message}\n`);
25
+ }
26
+ const taskStatusResponseSchema = z
27
+ .object({
28
+ status: z.string(),
29
+ })
30
+ .passthrough();
31
+ async function readJsonObjectFile(filePath, options) {
32
+ try {
33
+ const raw = await fs.readFile(filePath, 'utf8');
34
+ const parsed = JSON.parse(raw);
35
+ if (!isPlainObject(parsed)) {
36
+ throw new Error(`${options.label} must be a JSON object`);
37
+ }
38
+ return parsed;
39
+ }
40
+ catch (error) {
41
+ if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {
42
+ return options.missingValue;
43
+ }
44
+ const message = error instanceof Error ? error.message : String(error);
45
+ throw new Error(`Invalid ${options.label}: ${message}`, { cause: error });
46
+ }
47
+ }
48
+ function deriveRepoDirectoryName(repoUrl, usedNames) {
49
+ const cleanedUrl = repoUrl.replace(/\.git$/, '');
50
+ const baseName = cleanedUrl.split('/').pop()?.trim() ?? 'repo';
51
+ let candidate = baseName.replace(/[^a-zA-Z0-9._-]/g, '-');
52
+ let counter = 2;
53
+ while (usedNames.has(candidate)) {
54
+ candidate = `${baseName}-${counter}`;
55
+ counter += 1;
56
+ }
57
+ usedNames.add(candidate);
58
+ return candidate;
59
+ }
60
+ export async function preStartGateway(taskInput, zoneConfig) {
61
+ const taskId = crypto.randomUUID();
62
+ const taskRoot = path.join(zoneConfig.gateway.stateDir, 'tasks', taskId);
63
+ const workspaceDir = path.join(taskRoot, 'workspace');
64
+ const stateDir = path.join(taskRoot, 'state');
65
+ let composeFilePaths = [];
66
+ await fs.mkdir(workspaceDir, { recursive: true });
67
+ await fs.mkdir(stateDir, { recursive: true });
68
+ try {
69
+ const usedRepoNames = new Set();
70
+ const clonedRepoHostDirs = [];
71
+ const clonedRepos = [];
72
+ for (const repo of taskInput.repos) {
73
+ const repoDirectoryName = deriveRepoDirectoryName(repo.repoUrl, usedRepoNames);
74
+ const repoWorkspaceDir = path.join(workspaceDir, repoDirectoryName);
75
+ const cloneArgs = ['clone', '--branch', repo.baseBranch, repo.repoUrl, repoWorkspaceDir];
76
+ // Repo cloning is intentionally sequential to keep host-side side effects easy to reason about.
77
+ // oxlint-disable-next-line eslint/no-await-in-loop
78
+ await execa('git', cloneArgs);
79
+ clonedRepoHostDirs.push(repoWorkspaceDir);
80
+ clonedRepos.push({
81
+ repoUrl: repo.repoUrl,
82
+ baseBranch: repo.baseBranch,
83
+ workspacePath: `/workspace/${repoDirectoryName}`,
84
+ });
85
+ }
86
+ const primaryRepoWorkspaceDir = clonedRepoHostDirs[0] ?? workspaceDir;
87
+ const projectConfigPath = path.join(primaryRepoWorkspaceDir, '.agent-vm', 'config.json');
88
+ const projectConfig = await readJsonObjectFile(projectConfigPath, {
89
+ label: 'project config',
90
+ missingValue: {},
91
+ });
92
+ const baseConfig = await readJsonObjectFile(zoneConfig.gateway.gatewayConfig, {
93
+ label: 'gateway config',
94
+ missingValue: {},
95
+ });
96
+ const effectiveConfig = workerConfigSchema.parse(deepMerge(baseConfig, projectConfig));
97
+ await fs.writeFile(path.join(stateDir, 'effective-worker.json'), JSON.stringify(effectiveConfig, null, 2), { encoding: 'utf8', mode: 0o600 });
98
+ const dockerRouting = await startDockerServicesForTask(workspaceDir, clonedRepoHostDirs);
99
+ composeFilePaths = dockerRouting.composeFilePaths;
100
+ return {
101
+ taskId,
102
+ taskRoot,
103
+ workspaceDir,
104
+ stateDir,
105
+ composeFilePaths,
106
+ tcpHosts: dockerRouting.tcpHosts,
107
+ repos: clonedRepos,
108
+ };
109
+ }
110
+ catch (error) {
111
+ const composeFilesToStop = error instanceof DockerServiceRoutingError ? error.startedComposeFilePaths : composeFilePaths;
112
+ try {
113
+ await stopDockerServicesForTask(composeFilesToStop);
114
+ }
115
+ finally {
116
+ await fs.rm(taskRoot, { recursive: true, force: true });
117
+ }
118
+ throw error;
119
+ }
120
+ }
121
+ export async function postStopGateway(taskId, zoneConfig, composeFilePaths = []) {
122
+ const taskRoot = path.join(zoneConfig.gateway.stateDir, 'tasks', taskId);
123
+ let cleanupError = null;
124
+ let removalError = null;
125
+ try {
126
+ await stopDockerServicesForTask(composeFilePaths);
127
+ }
128
+ catch (error) {
129
+ cleanupError = error instanceof Error ? error : new Error(String(error));
130
+ }
131
+ try {
132
+ await fs.rm(taskRoot, { recursive: true, force: true });
133
+ }
134
+ catch (error) {
135
+ removalError = error instanceof Error ? error : new Error(String(error));
136
+ }
137
+ if (cleanupError && removalError) {
138
+ throw new AggregateError([cleanupError, removalError], `Failed to stop Docker services and delete task root for ${taskId}.`);
139
+ }
140
+ if (cleanupError) {
141
+ throw cleanupError;
142
+ }
143
+ if (removalError) {
144
+ throw removalError;
145
+ }
146
+ }
147
+ async function fetchJson(url, init) {
148
+ const response = await fetch(url, init);
149
+ if (!response.ok) {
150
+ throw new Error(`${init?.method ?? 'GET'} ${url} failed with ${response.status}`);
151
+ }
152
+ return await response.json();
153
+ }
154
+ export async function runWorkerTask(options) {
155
+ const zone = options.systemConfig.zones.find((candidateZone) => candidateZone.id === options.zoneId);
156
+ if (!zone) {
157
+ throw new Error(`Unknown zone '${options.zoneId}'.`);
158
+ }
159
+ if (zone.gateway.type !== 'worker') {
160
+ throw new Error(`Zone '${options.zoneId}' is not a worker zone.`);
161
+ }
162
+ const preStartResult = await preStartGateway(options.input, zone);
163
+ const taskZoneConfig = {
164
+ ...zone,
165
+ gateway: {
166
+ ...zone.gateway,
167
+ workspaceDir: preStartResult.workspaceDir,
168
+ stateDir: preStartResult.stateDir,
169
+ },
170
+ };
171
+ let gateway;
172
+ try {
173
+ gateway = await startGatewayZone({
174
+ secretResolver: options.secretResolver,
175
+ systemConfig: options.systemConfig,
176
+ tcpHostsOverride: preStartResult.tcpHosts,
177
+ zoneId: options.zoneId,
178
+ zoneOverride: taskZoneConfig,
179
+ });
180
+ const baseUrl = `http://${gateway.ingress.host}:${gateway.ingress.port}`;
181
+ await fetchJson(`${baseUrl}/tasks`, {
182
+ method: 'POST',
183
+ headers: { 'content-type': 'application/json' },
184
+ body: JSON.stringify({
185
+ taskId: preStartResult.taskId,
186
+ prompt: options.input.prompt,
187
+ repos: preStartResult.repos,
188
+ context: options.input.context,
189
+ }),
190
+ });
191
+ const timeoutMs = options.timeoutMs ?? 30 * 60 * 1000;
192
+ const start = Date.now();
193
+ let consecutivePollFailures = 0;
194
+ while (Date.now() - start < timeoutMs) {
195
+ let state;
196
+ try {
197
+ // Polling task state is intentionally sequential because each request depends on prior status.
198
+ // oxlint-disable-next-line eslint/no-await-in-loop
199
+ const response = await fetchJson(`${baseUrl}/tasks/${preStartResult.taskId}`);
200
+ state = taskStatusResponseSchema.parse(response);
201
+ consecutivePollFailures = 0;
202
+ }
203
+ catch (error) {
204
+ if (error instanceof z.ZodError) {
205
+ throw new Error(`Worker task status response did not match the expected schema for task ${preStartResult.taskId}.`, { cause: error });
206
+ }
207
+ consecutivePollFailures += 1;
208
+ const message = error instanceof Error ? error.message : String(error);
209
+ writeStderr(`[worker-task-runner] Poll failure ${consecutivePollFailures} for task ${preStartResult.taskId}: ${message}`);
210
+ if (consecutivePollFailures >= 3) {
211
+ throw error;
212
+ }
213
+ }
214
+ if (!state) {
215
+ // Poll retry loop intentionally sleeps before the next serial attempt.
216
+ // oxlint-disable-next-line eslint/no-await-in-loop
217
+ await new Promise((resolve) => setTimeout(resolve, 1000));
218
+ continue;
219
+ }
220
+ if (state.status === 'completed' || state.status === 'failed' || state.status === 'closed') {
221
+ return {
222
+ taskId: preStartResult.taskId,
223
+ finalState: state,
224
+ taskRoot: preStartResult.taskRoot,
225
+ };
226
+ }
227
+ // The sleep is part of the serial poll loop and cannot be parallelized.
228
+ // oxlint-disable-next-line eslint/no-await-in-loop
229
+ await new Promise((resolve) => setTimeout(resolve, 1000));
230
+ }
231
+ throw new Error(`Worker task timed out after ${timeoutMs}ms.`);
232
+ }
233
+ finally {
234
+ try {
235
+ await gateway?.vm.close();
236
+ }
237
+ finally {
238
+ await postStopGateway(preStartResult.taskId, zone, preStartResult.composeFilePaths);
239
+ }
240
+ }
241
+ }
242
+ //# sourceMappingURL=worker-task-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-task-runner.js","sourceRoot":"","sources":["../../src/controller/worker-task-runner.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { SecretResolver } from '@shravansunder/agent-vm-gondolin-core';
1
+ import type { SecretResolver } from '@shravansunder/gondolin-core';
2
2
  import type { SystemConfig } from '../config/system-config.js';
3
3
  export declare function resolveZoneSecrets(options: {
4
4
  readonly systemConfig: SystemConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"credential-manager.d.ts","sourceRoot":"","sources":["../../src/gateway/credential-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAEvF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AA0B/D,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IACjD,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;CACxC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA+BlC"}
1
+ {"version":3,"file":"credential-manager.d.ts","sourceRoot":"","sources":["../../src/gateway/credential-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AA0B/D,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IACjD,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;CACxC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAwDlC"}
@@ -24,21 +24,40 @@ export async function resolveZoneSecrets(options) {
24
24
  }
25
25
  const resolvedSecrets = {};
26
26
  for (const [secretName, secretConfig] of Object.entries(zone.secrets)) {
27
- if (!secretConfig.ref) {
28
- throw new Error(`Zone '${zone.id}' secret '${secretName}' is missing 'ref'. Add an explicit 1Password reference such as '${buildSuggestedSecretRef(zone.id, secretName)}'.`);
27
+ let secretRef;
28
+ switch (secretConfig.source) {
29
+ case 'environment':
30
+ if (!secretConfig.envVar) {
31
+ throw new Error(`Zone '${zone.id}' secret '${secretName}' is missing 'envVar'. Add an explicit environment variable name.`);
32
+ }
33
+ secretRef = {
34
+ ref: secretConfig.envVar,
35
+ source: 'environment',
36
+ };
37
+ break;
38
+ case '1password':
39
+ if (!secretConfig.ref) {
40
+ throw new Error(`Zone '${zone.id}' secret '${secretName}' is missing 'ref'. Add an explicit 1Password reference such as '${buildSuggestedSecretRef(zone.id, secretName)}'.`);
41
+ }
42
+ secretRef = {
43
+ ref: secretConfig.ref,
44
+ source: '1password',
45
+ };
46
+ break;
47
+ default: {
48
+ const exhaustiveCheck = secretConfig;
49
+ throw new Error(`Unsupported secret config for '${secretName}': ${JSON.stringify(exhaustiveCheck)}`);
50
+ }
29
51
  }
30
52
  try {
31
- const secretRef = {
32
- ref: secretConfig.ref,
33
- source: secretConfig.source,
34
- };
35
53
  // Sequential resolution gives the user exact secret context on failure.
36
54
  // oxlint-disable-next-line eslint/no-await-in-loop
37
55
  resolvedSecrets[secretName] = await options.secretResolver.resolve(secretRef);
38
56
  }
39
57
  catch (error) {
40
58
  const message = error instanceof Error ? error.message : String(error);
41
- throw new Error(`Failed to resolve secret '${secretName}' for zone '${zone.id}' from '${secretConfig.ref}': ${message}`, { cause: error });
59
+ const sourceReference = secretConfig.source === 'environment' ? secretConfig.envVar : secretConfig.ref;
60
+ throw new Error(`Failed to resolve secret '${secretName}' for zone '${zone.id}' from '${sourceReference}': ${message}`, { cause: error });
42
61
  }
43
62
  }
44
63
  return resolvedSecrets;
@@ -1 +1 @@
1
- {"version":3,"file":"credential-manager.js","sourceRoot":"","sources":["../../src/gateway/credential-manager.ts"],"names":[],"mappings":"AAIA,SAAS,uBAAuB,CAAC,MAAc,EAAE,UAAkB;IAClE,QAAQ,UAAU,EAAE,CAAC;QACpB,KAAK,mBAAmB;YACvB,OAAO,iBAAiB,MAAM,oBAAoB,CAAC;QACpD,KAAK,oBAAoB;YACxB,OAAO,iBAAiB,MAAM,wBAAwB,CAAC;QACxD,KAAK,wBAAwB;YAC5B,OAAO,iBAAiB,MAAM,wBAAwB,CAAC;QACxD,KAAK,gBAAgB;YACpB,OAAO,iBAAiB,MAAM,oBAAoB,CAAC;QACpD,KAAK,mBAAmB;YACvB,OAAO,iBAAiB,MAAM,uBAAuB,CAAC;QACvD;YACC,OAAO,iBAAiB,MAAM,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,aAAa,CAAC;IAC9F,CAAC;AACF,CAAC;AAED,SAAS,QAAQ,CAChB,YAA0B,EAC1B,MAAc;IAEd,OAAO,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAIxC;IACA,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5D,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,iBAAiB,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,eAAe,GAA2B,EAAE,CAAC;IACnD,KAAK,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACvE,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CACd,SAAS,IAAI,CAAC,EAAE,aAAa,UAAU,oEAAoE,uBAAuB,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,CAC3J,CAAC;QACH,CAAC;QACD,IAAI,CAAC;YACJ,MAAM,SAAS,GAAc;gBAC5B,GAAG,EAAE,YAAY,CAAC,GAAG;gBACrB,MAAM,EAAE,YAAY,CAAC,MAAM;aAC3B,CAAC;YACF,wEAAwE;YACxE,mDAAmD;YACnD,eAAe,CAAC,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC/E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,IAAI,KAAK,CACd,6BAA6B,UAAU,eAAe,IAAI,CAAC,EAAE,WAAW,YAAY,CAAC,GAAG,MAAM,OAAO,EAAE,EACvG,EAAE,KAAK,EAAE,KAAK,EAAE,CAChB,CAAC;QACH,CAAC;IACF,CAAC;IAED,OAAO,eAAe,CAAC;AACxB,CAAC"}
1
+ {"version":3,"file":"credential-manager.js","sourceRoot":"","sources":["../../src/gateway/credential-manager.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { BuildImageResult } from '@shravansunder/agent-vm-gondolin-core';
1
+ import type { BuildImageResult } from '@shravansunder/gondolin-core';
2
2
  import { type GondolinImageBuilderDependencies } from '../build/gondolin-image-builder.js';
3
3
  import type { GatewayBuildImageOptions } from './gateway-zone-support.js';
4
4
  export interface GatewayImageBuilderDependencies {
@@ -1 +1 @@
1
- {"version":3,"file":"gateway-image-builder.d.ts","sourceRoot":"","sources":["../../src/gateway/gateway-image-builder.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAe,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAE3F,OAAO,EAEN,KAAK,gCAAgC,EACrC,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAE1E,MAAM,WAAW,+BAA+B;IAC/C,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,wBAAwB,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACvF,QAAQ,CAAC,kBAAkB,CAAC,EAAE,gCAAgC,CAAC,YAAY,CAAC,CAAC;IAC7E,QAAQ,CAAC,eAAe,CAAC,EAAE,gCAAgC,CAAC,iBAAiB,CAAC,CAAC;CAC/E;AAMD,wBAAsB,iBAAiB,CACtC,OAAO,EAAE;IACR,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC1B,EACD,YAAY,GAAE,+BAAoC,GAChD,OAAO,CAAC,gBAAgB,CAAC,CAa3B"}
1
+ {"version":3,"file":"gateway-image-builder.d.ts","sourceRoot":"","sources":["../../src/gateway/gateway-image-builder.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAe,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAElF,OAAO,EAEN,KAAK,gCAAgC,EACrC,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAE1E,MAAM,WAAW,+BAA+B;IAC/C,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,wBAAwB,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACvF,QAAQ,CAAC,kBAAkB,CAAC,EAAE,gCAAgC,CAAC,YAAY,CAAC,CAAC;IAC7E,QAAQ,CAAC,eAAe,CAAC,EAAE,gCAAgC,CAAC,iBAAiB,CAAC,CAAC;CAC/E;AAMD,wBAAsB,iBAAiB,CACtC,OAAO,EAAE;IACR,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC1B,EACD,YAAY,GAAE,+BAAoC,GAChD,OAAO,CAAC,gBAAgB,CAAC,CAa3B"}
@@ -1,3 +1,3 @@
1
- import type { GatewayLifecycle, GatewayZoneConfig } from '@shravansunder/agent-vm-gateway-interface';
1
+ import type { GatewayLifecycle, GatewayZoneConfig } from '@shravansunder/gateway-interface';
2
2
  export declare function loadGatewayLifecycle(type: GatewayZoneConfig['gateway']['type']): GatewayLifecycle;
3
3
  //# sourceMappingURL=gateway-lifecycle-loader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gateway-lifecycle-loader.d.ts","sourceRoot":"","sources":["../../src/gateway/gateway-lifecycle-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,gBAAgB,EAChB,iBAAiB,EACjB,MAAM,2CAA2C,CAAC;AASnD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,GAAG,gBAAgB,CAEjG"}
1
+ {"version":3,"file":"gateway-lifecycle-loader.d.ts","sourceRoot":"","sources":["../../src/gateway/gateway-lifecycle-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAS5F,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,GAAG,gBAAgB,CAEjG"}
@@ -1,7 +1,7 @@
1
- import { openclawLifecycle } from '@shravansunder/agent-vm-openclaw-gateway';
2
- import { workerLifecycle } from '@shravansunder/agent-vm-worker-gateway';
1
+ import { openclawLifecycle } from '@shravansunder/openclaw-gateway';
2
+ import { workerLifecycle } from '@shravansunder/worker-gateway';
3
3
  const lifecycleByType = {
4
- coding: workerLifecycle,
4
+ worker: workerLifecycle,
5
5
  openclaw: openclawLifecycle,
6
6
  };
7
7
  export function loadGatewayLifecycle(type) {
@@ -1 +1 @@
1
- {"version":3,"file":"gateway-lifecycle-loader.js","sourceRoot":"","sources":["../../src/gateway/gateway-lifecycle-loader.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAEzE,MAAM,eAAe,GAAG;IACvB,MAAM,EAAE,eAAe;IACvB,QAAQ,EAAE,iBAAiB;CACgB,CAAC;AAE7C,MAAM,UAAU,oBAAoB,CAAC,IAA0C;IAC9E,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC"}
1
+ {"version":3,"file":"gateway-lifecycle-loader.js","sourceRoot":"","sources":["../../src/gateway/gateway-lifecycle-loader.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,MAAM,eAAe,GAAG;IACvB,MAAM,EAAE,eAAe;IACvB,QAAQ,EAAE,iBAAiB;CACgB,CAAC;AAE7C,MAAM,UAAU,oBAAoB,CAAC,IAA0C;IAC9E,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { deleteGatewayRuntimeRecord, loadGatewayRuntimeRecord } from './gateway-runtime-record.js';
2
+ export interface GatewayRecoveryDependencies {
3
+ readonly deleteGatewayRuntimeRecord?: typeof deleteGatewayRuntimeRecord;
4
+ readonly isProcessAlive?: (pid: number) => boolean;
5
+ readonly killProcess?: (pid: number, signal: NodeJS.Signals) => void;
6
+ readonly loadGatewayRuntimeRecord?: typeof loadGatewayRuntimeRecord;
7
+ readonly log?: (message: string) => void;
8
+ readonly readProcessCommand?: (pid: number) => Promise<string | null>;
9
+ readonly sleep?: (delayMs: number) => Promise<void>;
10
+ }
11
+ export declare function cleanupOrphanedGatewayIfPresent(options: {
12
+ readonly stateDir: string;
13
+ readonly zoneId: string;
14
+ }, dependencies?: GatewayRecoveryDependencies): Promise<{
15
+ readonly cleanedUp: boolean;
16
+ readonly cleanupWarning?: string;
17
+ readonly killedPid: number | null;
18
+ }>;
19
+ //# sourceMappingURL=gateway-recovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-recovery.d.ts","sourceRoot":"","sources":["../../src/gateway/gateway-recovery.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAiJnG,MAAM,WAAW,2BAA2B;IAC3C,QAAQ,CAAC,0BAA0B,CAAC,EAAE,OAAO,0BAA0B,CAAC;IACxE,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACnD,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC;IACrE,QAAQ,CAAC,wBAAwB,CAAC,EAAE,OAAO,wBAAwB,CAAC;IACpE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACtE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACpD;AAED,wBAAsB,+BAA+B,CACpD,OAAO,EAAE;IACR,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB,EACD,YAAY,GAAE,2BAAgC,GAC5C,OAAO,CAAC;IACV,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC,CAAC,CAwCD"}
@@ -0,0 +1,147 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ import { deleteGatewayRuntimeRecord, loadGatewayRuntimeRecord } from './gateway-runtime-record.js';
4
+ const execFileAsync = promisify(execFile);
5
+ function isProcessAlive(pid) {
6
+ try {
7
+ process.kill(pid, 0);
8
+ return true;
9
+ }
10
+ catch (error) {
11
+ if (typeof error === 'object' && error !== null && 'code' in error) {
12
+ if (error.code === 'EPERM') {
13
+ return true;
14
+ }
15
+ if (error.code === 'ESRCH') {
16
+ return false;
17
+ }
18
+ }
19
+ throw error;
20
+ }
21
+ }
22
+ async function readProcessCommand(pid) {
23
+ try {
24
+ const { stdout } = await execFileAsync('ps', ['-p', String(pid), '-o', 'command=']);
25
+ const command = stdout.trim();
26
+ return command.length > 0 ? command : null;
27
+ }
28
+ catch (error) {
29
+ if (typeof error === 'object' && error !== null && 'code' in error && error.code === 1) {
30
+ return null;
31
+ }
32
+ throw error;
33
+ }
34
+ }
35
+ function isManagedGatewayProcess(command) {
36
+ return /\b(qemu-system|krun)\b/u.test(command);
37
+ }
38
+ function writeRecoveryLog(message) {
39
+ process.stderr.write(`[agent-vm] ${message}\n`);
40
+ }
41
+ function killProcess(pid, signal) {
42
+ try {
43
+ process.kill(pid, signal);
44
+ }
45
+ catch (error) {
46
+ if (typeof error === 'object' && error !== null && 'code' in error && error.code === 'ESRCH') {
47
+ return;
48
+ }
49
+ if (typeof error === 'object' && error !== null && 'code' in error && error.code === 'EPERM') {
50
+ throw new Error(`Permission denied while sending ${signal} to orphaned gateway pid ${pid}. The process is still running and may require elevated privileges to terminate.`, { cause: error });
51
+ }
52
+ throw error;
53
+ }
54
+ }
55
+ function isNoSuchProcessError(error) {
56
+ return typeof error === 'object' && error !== null && 'code' in error && error.code === 'ESRCH';
57
+ }
58
+ async function sleep(delayMs) {
59
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
60
+ }
61
+ async function waitForExit(options) {
62
+ const deadline = Date.now() + options.timeoutMs;
63
+ while (Date.now() < deadline) {
64
+ if (!options.processIsAlive(options.pid)) {
65
+ return true;
66
+ }
67
+ // oxlint-disable-next-line no-await-in-loop -- polling loop must wait between liveness checks
68
+ await options.sleep(100);
69
+ }
70
+ return !options.processIsAlive(options.pid);
71
+ }
72
+ async function killOrphanedGatewayProcess(runtimeRecord, dependencies) {
73
+ if (!dependencies.isProcessAlive(runtimeRecord.qemuPid)) {
74
+ return null;
75
+ }
76
+ const processCommand = await dependencies.readProcessCommand(runtimeRecord.qemuPid);
77
+ if (!processCommand || !isManagedGatewayProcess(processCommand)) {
78
+ throw new Error(`Gateway runtime record for zone '${runtimeRecord.zoneId}' points at unexpected live process ${runtimeRecord.qemuPid}: ${processCommand ?? '(command unavailable)'}.`);
79
+ }
80
+ try {
81
+ dependencies.killProcess(runtimeRecord.qemuPid, 'SIGTERM');
82
+ }
83
+ catch (error) {
84
+ if (!isNoSuchProcessError(error)) {
85
+ throw error;
86
+ }
87
+ }
88
+ if (await waitForExit({
89
+ pid: runtimeRecord.qemuPid,
90
+ processIsAlive: dependencies.isProcessAlive,
91
+ sleep: dependencies.sleep,
92
+ timeoutMs: 2_000,
93
+ })) {
94
+ return runtimeRecord.qemuPid;
95
+ }
96
+ try {
97
+ dependencies.killProcess(runtimeRecord.qemuPid, 'SIGKILL');
98
+ }
99
+ catch (error) {
100
+ if (!isNoSuchProcessError(error)) {
101
+ throw error;
102
+ }
103
+ }
104
+ if (await waitForExit({
105
+ pid: runtimeRecord.qemuPid,
106
+ processIsAlive: dependencies.isProcessAlive,
107
+ sleep: dependencies.sleep,
108
+ timeoutMs: 2_000,
109
+ })) {
110
+ return runtimeRecord.qemuPid;
111
+ }
112
+ throw new Error(`Failed to terminate orphaned gateway VM process ${runtimeRecord.qemuPid} for zone '${runtimeRecord.zoneId}'.`);
113
+ }
114
+ export async function cleanupOrphanedGatewayIfPresent(options, dependencies = {}) {
115
+ const log = dependencies.log ?? writeRecoveryLog;
116
+ const runtimeRecord = await (dependencies.loadGatewayRuntimeRecord ?? loadGatewayRuntimeRecord)(options.stateDir, { log });
117
+ if (!runtimeRecord) {
118
+ return { cleanedUp: false, killedPid: null };
119
+ }
120
+ log(`Found persisted gateway runtime for zone '${runtimeRecord.zoneId}' (pid ${runtimeRecord.qemuPid}, vm ${runtimeRecord.vmId}).`);
121
+ const killedPid = await killOrphanedGatewayProcess(runtimeRecord, {
122
+ isProcessAlive: dependencies.isProcessAlive ?? isProcessAlive,
123
+ killProcess: dependencies.killProcess ?? killProcess,
124
+ readProcessCommand: dependencies.readProcessCommand ?? readProcessCommand,
125
+ sleep: dependencies.sleep ?? sleep,
126
+ });
127
+ try {
128
+ await (dependencies.deleteGatewayRuntimeRecord ?? deleteGatewayRuntimeRecord)(options.stateDir);
129
+ }
130
+ catch (error) {
131
+ const cleanupWarning = `Failed to remove stale gateway runtime record for zone '${runtimeRecord.zoneId}' at '${options.stateDir}': ${error instanceof Error ? error.message : JSON.stringify(error)}`;
132
+ log(cleanupWarning);
133
+ return {
134
+ cleanedUp: false,
135
+ cleanupWarning,
136
+ killedPid,
137
+ };
138
+ }
139
+ log(killedPid === null
140
+ ? `Removed stale gateway runtime record for zone '${runtimeRecord.zoneId}' after confirming the orphaned process was already gone.`
141
+ : `Removed stale gateway runtime record for zone '${runtimeRecord.zoneId}' after terminating orphaned gateway pid ${killedPid}.`);
142
+ return {
143
+ cleanedUp: true,
144
+ killedPid,
145
+ };
146
+ }
147
+ //# sourceMappingURL=gateway-recovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-recovery.js","sourceRoot":"","sources":["../../src/gateway/gateway-recovery.ts"],"names":[],"mappings":"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"}