@agent-vm/agent-vm 0.0.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/backup/backup-archive-layout.d.ts +15 -0
- package/dist/backup/backup-archive-layout.d.ts.map +1 -0
- package/dist/backup/backup-archive-layout.js +34 -0
- package/dist/backup/backup-archive-layout.js.map +1 -0
- package/dist/backup/backup-create-operation.d.ts +9 -0
- package/dist/backup/backup-create-operation.d.ts.map +1 -0
- package/dist/backup/backup-create-operation.js +50 -0
- package/dist/backup/backup-create-operation.js.map +1 -0
- package/dist/backup/backup-encryption.d.ts +20 -0
- package/dist/backup/backup-encryption.d.ts.map +1 -0
- package/dist/backup/backup-encryption.js +93 -0
- package/dist/backup/backup-encryption.js.map +1 -0
- package/dist/backup/backup-manager.d.ts +42 -0
- package/dist/backup/backup-manager.d.ts.map +1 -0
- package/dist/backup/backup-manager.js +37 -0
- package/dist/backup/backup-manager.js.map +1 -0
- package/dist/backup/backup-restore-operation.d.ts +8 -0
- package/dist/backup/backup-restore-operation.d.ts.map +1 -0
- package/dist/backup/backup-restore-operation.js +53 -0
- package/dist/backup/backup-restore-operation.js.map +1 -0
- package/dist/build/docker-image-builder.d.ts +11 -0
- package/dist/build/docker-image-builder.d.ts.map +1 -0
- package/dist/build/docker-image-builder.js +24 -0
- package/dist/build/docker-image-builder.js.map +1 -0
- package/dist/build/gondolin-image-builder.d.ts +16 -0
- package/dist/build/gondolin-image-builder.d.ts.map +1 -0
- package/dist/build/gondolin-image-builder.js +52 -0
- package/dist/build/gondolin-image-builder.js.map +1 -0
- package/dist/build/runtime-versions.d.ts +13 -0
- package/dist/build/runtime-versions.d.ts.map +1 -0
- package/dist/build/runtime-versions.js +100 -0
- package/dist/build/runtime-versions.js.map +1 -0
- package/dist/build/stale-image-cleaner.d.ts +17 -0
- package/dist/build/stale-image-cleaner.d.ts.map +1 -0
- package/dist/build/stale-image-cleaner.js +70 -0
- package/dist/build/stale-image-cleaner.js.map +1 -0
- package/dist/cli/agent-vm-cli-support.d.ts +78 -0
- package/dist/cli/agent-vm-cli-support.d.ts.map +1 -0
- package/dist/cli/agent-vm-cli-support.js +77 -0
- package/dist/cli/agent-vm-cli-support.js.map +1 -0
- package/dist/cli/agent-vm-entrypoint.d.ts +9 -0
- package/dist/cli/agent-vm-entrypoint.d.ts.map +1 -0
- package/dist/cli/agent-vm-entrypoint.js +59 -0
- package/dist/cli/agent-vm-entrypoint.js.map +1 -0
- package/dist/cli/auth-interactive-command.d.ts +27 -0
- package/dist/cli/auth-interactive-command.d.ts.map +1 -0
- package/dist/cli/auth-interactive-command.js +83 -0
- package/dist/cli/auth-interactive-command.js.map +1 -0
- package/dist/cli/backup-commands.d.ts +11 -0
- package/dist/cli/backup-commands.d.ts.map +1 -0
- package/dist/cli/backup-commands.js +46 -0
- package/dist/cli/backup-commands.js.map +1 -0
- package/dist/cli/build-command.d.ts +24 -0
- package/dist/cli/build-command.d.ts.map +1 -0
- package/dist/cli/build-command.js +132 -0
- package/dist/cli/build-command.js.map +1 -0
- package/dist/cli/cache-commands.d.ts +32 -0
- package/dist/cli/cache-commands.d.ts.map +1 -0
- package/dist/cli/cache-commands.js +106 -0
- package/dist/cli/cache-commands.js.map +1 -0
- package/dist/cli/commands/auth-interactive-definition.d.ts +15 -0
- package/dist/cli/commands/auth-interactive-definition.d.ts.map +1 -0
- package/dist/cli/commands/auth-interactive-definition.js +36 -0
- package/dist/cli/commands/auth-interactive-definition.js.map +1 -0
- package/dist/cli/commands/backup-definition.d.ts +63 -0
- package/dist/cli/commands/backup-definition.d.ts.map +1 -0
- package/dist/cli/commands/backup-definition.js +73 -0
- package/dist/cli/commands/backup-definition.js.map +1 -0
- package/dist/cli/commands/build-definition.d.ts +13 -0
- package/dist/cli/commands/build-definition.d.ts.map +1 -0
- package/dist/cli/commands/build-definition.js +27 -0
- package/dist/cli/commands/build-definition.js.map +1 -0
- package/dist/cli/commands/cache-definition.d.ts +41 -0
- package/dist/cli/commands/cache-definition.d.ts.map +1 -0
- package/dist/cli/commands/cache-definition.js +41 -0
- package/dist/cli/commands/cache-definition.js.map +1 -0
- package/dist/cli/commands/command-definition-support.d.ts +26 -0
- package/dist/cli/commands/command-definition-support.d.ts.map +1 -0
- package/dist/cli/commands/command-definition-support.js +85 -0
- package/dist/cli/commands/command-definition-support.js.map +1 -0
- package/dist/cli/commands/config-definition.d.ts +27 -0
- package/dist/cli/commands/config-definition.d.ts.map +1 -0
- package/dist/cli/commands/config-definition.js +60 -0
- package/dist/cli/commands/config-definition.js.map +1 -0
- package/dist/cli/commands/controller-definition.d.ts +225 -0
- package/dist/cli/commands/controller-definition.d.ts.map +1 -0
- package/dist/cli/commands/controller-definition.js +211 -0
- package/dist/cli/commands/controller-definition.js.map +1 -0
- package/dist/cli/commands/create-app.d.ts +541 -0
- package/dist/cli/commands/create-app.d.ts.map +1 -0
- package/dist/cli/commands/create-app.js +32 -0
- package/dist/cli/commands/create-app.js.map +1 -0
- package/dist/cli/commands/doctor-definition.d.ts +11 -0
- package/dist/cli/commands/doctor-definition.d.ts.map +1 -0
- package/dist/cli/commands/doctor-definition.js +23 -0
- package/dist/cli/commands/doctor-definition.js.map +1 -0
- package/dist/cli/commands/init-definition.d.ts +34 -0
- package/dist/cli/commands/init-definition.d.ts.map +1 -0
- package/dist/cli/commands/init-definition.js +134 -0
- package/dist/cli/commands/init-definition.js.map +1 -0
- package/dist/cli/commands/resources-definition.d.ts +55 -0
- package/dist/cli/commands/resources-definition.d.ts.map +1 -0
- package/dist/cli/commands/resources-definition.js +93 -0
- package/dist/cli/commands/resources-definition.js.map +1 -0
- package/dist/cli/commands/validate-definition.d.ts +11 -0
- package/dist/cli/commands/validate-definition.d.ts.map +1 -0
- package/dist/cli/commands/validate-definition.js +20 -0
- package/dist/cli/commands/validate-definition.js.map +1 -0
- package/dist/cli/config-commands.d.ts +10 -0
- package/dist/cli/config-commands.d.ts.map +1 -0
- package/dist/cli/config-commands.js +103 -0
- package/dist/cli/config-commands.js.map +1 -0
- package/dist/cli/controller-operation-commands.d.ts +12 -0
- package/dist/cli/controller-operation-commands.d.ts.map +1 -0
- package/dist/cli/controller-operation-commands.js +133 -0
- package/dist/cli/controller-operation-commands.js.map +1 -0
- package/dist/cli/format-zod-error.d.ts +3 -0
- package/dist/cli/format-zod-error.d.ts.map +1 -0
- package/dist/cli/format-zod-error.js +18 -0
- package/dist/cli/format-zod-error.js.map +1 -0
- package/dist/cli/init-command.d.ts +52 -0
- package/dist/cli/init-command.d.ts.map +1 -0
- package/dist/cli/init-command.js +645 -0
- package/dist/cli/init-command.js.map +1 -0
- package/dist/cli/keychain-credential.d.ts +19 -0
- package/dist/cli/keychain-credential.d.ts.map +1 -0
- package/dist/cli/keychain-credential.js +52 -0
- package/dist/cli/keychain-credential.js.map +1 -0
- package/dist/cli/lease-commands.d.ts +11 -0
- package/dist/cli/lease-commands.d.ts.map +1 -0
- package/dist/cli/lease-commands.js +22 -0
- package/dist/cli/lease-commands.js.map +1 -0
- package/dist/cli/openclaw-plugin-bundle.d.ts +10 -0
- package/dist/cli/openclaw-plugin-bundle.d.ts.map +1 -0
- package/dist/cli/openclaw-plugin-bundle.js +37 -0
- package/dist/cli/openclaw-plugin-bundle.js.map +1 -0
- package/dist/cli/resource-contract-templates.d.ts +8 -0
- package/dist/cli/resource-contract-templates.d.ts.map +1 -0
- package/dist/cli/resource-contract-templates.js +157 -0
- package/dist/cli/resource-contract-templates.js.map +1 -0
- package/dist/cli/resources-commands.d.ts +19 -0
- package/dist/cli/resources-commands.d.ts.map +1 -0
- package/dist/cli/resources-commands.js +158 -0
- package/dist/cli/resources-commands.js.map +1 -0
- package/dist/cli/run-task.d.ts +4 -0
- package/dist/cli/run-task.d.ts.map +1 -0
- package/dist/cli/run-task.js +17 -0
- package/dist/cli/run-task.js.map +1 -0
- package/dist/cli/ssh-commands.d.ts +20 -0
- package/dist/cli/ssh-commands.d.ts.map +1 -0
- package/dist/cli/ssh-commands.js +72 -0
- package/dist/cli/ssh-commands.js.map +1 -0
- package/dist/cli/vm-host-system-templates.d.ts +12 -0
- package/dist/cli/vm-host-system-templates.d.ts.map +1 -0
- package/dist/cli/vm-host-system-templates.js +186 -0
- package/dist/cli/vm-host-system-templates.js.map +1 -0
- package/dist/config/resource-contracts/index.d.ts +3 -0
- package/dist/config/resource-contracts/index.d.ts.map +1 -0
- package/dist/config/resource-contracts/index.js +2 -0
- package/dist/config/resource-contracts/index.js.map +1 -0
- package/dist/config/resource-contracts/repo-resource-contract-types.d.ts +110 -0
- package/dist/config/resource-contracts/repo-resource-contract-types.d.ts.map +1 -0
- package/dist/config/resource-contracts/repo-resource-contract-types.js +2 -0
- package/dist/config/resource-contracts/repo-resource-contract-types.js.map +1 -0
- package/dist/config/resource-contracts/resource-contract-schemas.d.ts +198 -0
- package/dist/config/resource-contracts/resource-contract-schemas.d.ts.map +1 -0
- package/dist/config/resource-contracts/resource-contract-schemas.js +163 -0
- package/dist/config/resource-contracts/resource-contract-schemas.js.map +1 -0
- package/dist/config/system-cache-identifier.d.ts +22 -0
- package/dist/config/system-cache-identifier.d.ts.map +1 -0
- package/dist/config/system-cache-identifier.js +49 -0
- package/dist/config/system-cache-identifier.js.map +1 -0
- package/dist/config/system-config.d.ts +111 -0
- package/dist/config/system-config.d.ts.map +1 -0
- package/dist/config/system-config.js +267 -0
- package/dist/config/system-config.js.map +1 -0
- package/dist/controller/active-task-registry.d.ts +32 -0
- package/dist/controller/active-task-registry.d.ts.map +1 -0
- package/dist/controller/active-task-registry.js +83 -0
- package/dist/controller/active-task-registry.js.map +1 -0
- package/dist/controller/composite-secret-resolver.d.ts +3 -0
- package/dist/controller/composite-secret-resolver.d.ts.map +1 -0
- package/dist/controller/composite-secret-resolver.js +38 -0
- package/dist/controller/composite-secret-resolver.js.map +1 -0
- package/dist/controller/controller-runtime-operations.d.ts +62 -0
- package/dist/controller/controller-runtime-operations.d.ts.map +1 -0
- package/dist/controller/controller-runtime-operations.js +99 -0
- package/dist/controller/controller-runtime-operations.js.map +1 -0
- package/dist/controller/controller-runtime-support.d.ts +10 -0
- package/dist/controller/controller-runtime-support.d.ts.map +1 -0
- package/dist/controller/controller-runtime-support.js +36 -0
- package/dist/controller/controller-runtime-support.js.map +1 -0
- package/dist/controller/controller-runtime-types.d.ts +58 -0
- package/dist/controller/controller-runtime-types.d.ts.map +1 -0
- package/dist/controller/controller-runtime-types.js +2 -0
- package/dist/controller/controller-runtime-types.js.map +1 -0
- package/dist/controller/controller-runtime.d.ts +3 -0
- package/dist/controller/controller-runtime.d.ts.map +1 -0
- package/dist/controller/controller-runtime.js +326 -0
- package/dist/controller/controller-runtime.js.map +1 -0
- package/dist/controller/git-auth-support.d.ts +3 -0
- package/dist/controller/git-auth-support.d.ts.map +1 -0
- package/dist/controller/git-auth-support.js +11 -0
- package/dist/controller/git-auth-support.js.map +1 -0
- package/dist/controller/git-pull-default-operations.d.ts +34 -0
- package/dist/controller/git-pull-default-operations.d.ts.map +1 -0
- package/dist/controller/git-pull-default-operations.js +175 -0
- package/dist/controller/git-pull-default-operations.js.map +1 -0
- package/dist/controller/git-push-operations.d.ts +38 -0
- package/dist/controller/git-push-operations.d.ts.map +1 -0
- package/dist/controller/git-push-operations.js +247 -0
- package/dist/controller/git-push-operations.js.map +1 -0
- package/dist/controller/heartbeat-sender.d.ts +13 -0
- package/dist/controller/heartbeat-sender.d.ts.map +1 -0
- package/dist/controller/heartbeat-sender.js +94 -0
- package/dist/controller/heartbeat-sender.js.map +1 -0
- package/dist/controller/http/controller-client.d.ts +17 -0
- package/dist/controller/http/controller-client.d.ts.map +1 -0
- package/dist/controller/http/controller-client.js +76 -0
- package/dist/controller/http/controller-client.js.map +1 -0
- package/dist/controller/http/controller-http-route-support.d.ts +46 -0
- package/dist/controller/http/controller-http-route-support.d.ts.map +1 -0
- package/dist/controller/http/controller-http-route-support.js +25 -0
- package/dist/controller/http/controller-http-route-support.js.map +1 -0
- package/dist/controller/http/controller-http-routes.d.ts +22 -0
- package/dist/controller/http/controller-http-routes.d.ts.map +1 -0
- package/dist/controller/http/controller-http-routes.js +107 -0
- package/dist/controller/http/controller-http-routes.js.map +1 -0
- package/dist/controller/http/controller-http-server.d.ts +8 -0
- package/dist/controller/http/controller-http-server.d.ts.map +1 -0
- package/dist/controller/http/controller-http-server.js +21 -0
- package/dist/controller/http/controller-http-server.js.map +1 -0
- package/dist/controller/http/controller-request-schemas.d.ts +102 -0
- package/dist/controller/http/controller-request-schemas.d.ts.map +1 -0
- package/dist/controller/http/controller-request-schemas.js +66 -0
- package/dist/controller/http/controller-request-schemas.js.map +1 -0
- package/dist/controller/http/controller-zone-operation-routes.d.ts +4 -0
- package/dist/controller/http/controller-zone-operation-routes.d.ts.map +1 -0
- package/dist/controller/http/controller-zone-operation-routes.js +223 -0
- package/dist/controller/http/controller-zone-operation-routes.js.map +1 -0
- package/dist/controller/leases/idle-reaper.d.ts +12 -0
- package/dist/controller/leases/idle-reaper.d.ts.map +1 -0
- package/dist/controller/leases/idle-reaper.js +15 -0
- package/dist/controller/leases/idle-reaper.js.map +1 -0
- package/dist/controller/leases/lease-manager.d.ts +58 -0
- package/dist/controller/leases/lease-manager.d.ts.map +1 -0
- package/dist/controller/leases/lease-manager.js +81 -0
- package/dist/controller/leases/lease-manager.js.map +1 -0
- package/dist/controller/leases/tcp-pool.d.ts +11 -0
- package/dist/controller/leases/tcp-pool.d.ts.map +1 -0
- package/dist/controller/leases/tcp-pool.js +26 -0
- package/dist/controller/leases/tcp-pool.js.map +1 -0
- package/dist/controller/request-heartbeat-registry.d.ts +15 -0
- package/dist/controller/request-heartbeat-registry.d.ts.map +1 -0
- package/dist/controller/request-heartbeat-registry.js +54 -0
- package/dist/controller/request-heartbeat-registry.js.map +1 -0
- package/dist/controller/task-config-builder.d.ts +14 -0
- package/dist/controller/task-config-builder.d.ts.map +1 -0
- package/dist/controller/task-config-builder.js +14 -0
- package/dist/controller/task-config-builder.js.map +1 -0
- package/dist/controller/task-state-reader.d.ts +17 -0
- package/dist/controller/task-state-reader.d.ts.map +1 -0
- package/dist/controller/task-state-reader.js +87 -0
- package/dist/controller/task-state-reader.js.map +1 -0
- package/dist/controller/worker-task-runner.d.ts +67 -0
- package/dist/controller/worker-task-runner.d.ts.map +1 -0
- package/dist/controller/worker-task-runner.js +497 -0
- package/dist/controller/worker-task-runner.js.map +1 -0
- package/dist/gateway/credential-manager.d.ts +8 -0
- package/dist/gateway/credential-manager.d.ts.map +1 -0
- package/dist/gateway/credential-manager.js +65 -0
- package/dist/gateway/credential-manager.js.map +1 -0
- package/dist/gateway/gateway-image-builder.d.ts +14 -0
- package/dist/gateway/gateway-image-builder.d.ts.map +1 -0
- package/dist/gateway/gateway-image-builder.js +33 -0
- package/dist/gateway/gateway-image-builder.js.map +1 -0
- package/dist/gateway/gateway-lifecycle-loader.d.ts +3 -0
- package/dist/gateway/gateway-lifecycle-loader.d.ts.map +1 -0
- package/dist/gateway/gateway-lifecycle-loader.js +10 -0
- package/dist/gateway/gateway-lifecycle-loader.js.map +1 -0
- package/dist/gateway/gateway-recovery.d.ts +19 -0
- package/dist/gateway/gateway-recovery.d.ts.map +1 -0
- package/dist/gateway/gateway-recovery.js +147 -0
- package/dist/gateway/gateway-recovery.js.map +1 -0
- package/dist/gateway/gateway-runtime-record.d.ts +33 -0
- package/dist/gateway/gateway-runtime-record.d.ts.map +1 -0
- package/dist/gateway/gateway-runtime-record.js +114 -0
- package/dist/gateway/gateway-runtime-record.js.map +1 -0
- package/dist/gateway/gateway-zone-orchestrator.d.ts +14 -0
- package/dist/gateway/gateway-zone-orchestrator.d.ts.map +1 -0
- package/dist/gateway/gateway-zone-orchestrator.js +161 -0
- package/dist/gateway/gateway-zone-orchestrator.js.map +1 -0
- package/dist/gateway/gateway-zone-support.d.ts +55 -0
- package/dist/gateway/gateway-zone-support.d.ts.map +1 -0
- package/dist/gateway/gateway-zone-support.js +42 -0
- package/dist/gateway/gateway-zone-support.js.map +1 -0
- package/dist/gateway-api-client/gateway-api-client.d.ts +34 -0
- package/dist/gateway-api-client/gateway-api-client.d.ts.map +1 -0
- package/dist/gateway-api-client/gateway-api-client.js +29 -0
- package/dist/gateway-api-client/gateway-api-client.js.map +1 -0
- package/dist/gateway-api-client/gateway-websocket-client.d.ts +45 -0
- package/dist/gateway-api-client/gateway-websocket-client.d.ts.map +1 -0
- package/dist/gateway-api-client/gateway-websocket-client.js +140 -0
- package/dist/gateway-api-client/gateway-websocket-client.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/operations/config-validation.d.ts +15 -0
- package/dist/operations/config-validation.d.ts.map +1 -0
- package/dist/operations/config-validation.js +126 -0
- package/dist/operations/config-validation.js.map +1 -0
- package/dist/operations/controller-status.d.ts +13 -0
- package/dist/operations/controller-status.d.ts.map +1 -0
- package/dist/operations/controller-status.js +13 -0
- package/dist/operations/controller-status.js.map +1 -0
- package/dist/operations/credentials-refresh.d.ts +10 -0
- package/dist/operations/credentials-refresh.d.ts.map +1 -0
- package/dist/operations/credentials-refresh.js +9 -0
- package/dist/operations/credentials-refresh.js.map +1 -0
- package/dist/operations/destroy-zone.d.ts +14 -0
- package/dist/operations/destroy-zone.d.ts.map +1 -0
- package/dist/operations/destroy-zone.js +19 -0
- package/dist/operations/destroy-zone.js.map +1 -0
- package/dist/operations/doctor.d.ts +23 -0
- package/dist/operations/doctor.d.ts.map +1 -0
- package/dist/operations/doctor.js +148 -0
- package/dist/operations/doctor.js.map +1 -0
- package/dist/operations/upgrade-zone.d.ts +12 -0
- package/dist/operations/upgrade-zone.d.ts.map +1 -0
- package/dist/operations/upgrade-zone.js +10 -0
- package/dist/operations/upgrade-zone.js.map +1 -0
- package/dist/operations/zone-logs.d.ts +9 -0
- package/dist/operations/zone-logs.d.ts.map +1 -0
- package/dist/operations/zone-logs.js +7 -0
- package/dist/operations/zone-logs.js.map +1 -0
- package/dist/resources/repo-resource-contract-loader.d.ts +12 -0
- package/dist/resources/repo-resource-contract-loader.d.ts.map +1 -0
- package/dist/resources/repo-resource-contract-loader.js +100 -0
- package/dist/resources/repo-resource-contract-loader.js.map +1 -0
- package/dist/resources/repo-resource-provider-runner.d.ts +32 -0
- package/dist/resources/repo-resource-provider-runner.d.ts.map +1 -0
- package/dist/resources/repo-resource-provider-runner.js +415 -0
- package/dist/resources/repo-resource-provider-runner.js.map +1 -0
- package/dist/resources/resource-compiler.d.ts +18 -0
- package/dist/resources/resource-compiler.d.ts.map +1 -0
- package/dist/resources/resource-compiler.js +51 -0
- package/dist/resources/resource-compiler.js.map +1 -0
- package/dist/resources/resource-resolver.d.ts +25 -0
- package/dist/resources/resource-resolver.d.ts.map +1 -0
- package/dist/resources/resource-resolver.js +90 -0
- package/dist/resources/resource-resolver.js.map +1 -0
- package/dist/runtime/project-namespace.d.ts +5 -0
- package/dist/runtime/project-namespace.d.ts.map +1 -0
- package/dist/runtime/project-namespace.js +22 -0
- package/dist/runtime/project-namespace.js.map +1 -0
- package/dist/shared/run-task.d.ts +3 -0
- package/dist/shared/run-task.d.ts.map +1 -0
- package/dist/shared/run-task.js +12 -0
- package/dist/shared/run-task.js.map +1 -0
- package/dist/tool-vm/tool-vm-lifecycle.d.ts +28 -0
- package/dist/tool-vm/tool-vm-lifecycle.d.ts.map +1 -0
- package/dist/tool-vm/tool-vm-lifecycle.js +60 -0
- package/dist/tool-vm/tool-vm-lifecycle.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import { buildGondolinImage as buildGondolinImageDefault, } from '../build/gondolin-image-builder.js';
|
|
3
|
+
async function loadBuildConfigFromJson(buildConfigPath) {
|
|
4
|
+
return JSON.parse(await fs.readFile(buildConfigPath, 'utf8'));
|
|
5
|
+
}
|
|
6
|
+
export async function buildGatewayImage(options, dependencies = {}) {
|
|
7
|
+
const buildImage = dependencies.buildImage;
|
|
8
|
+
if (buildImage) {
|
|
9
|
+
const loadBuildConfig = dependencies.loadBuildConfig ?? loadBuildConfigFromJson;
|
|
10
|
+
return await buildGondolinImageDefault({
|
|
11
|
+
buildConfigPath: options.buildConfigPath,
|
|
12
|
+
systemCacheIdentifierPath: options.systemCacheIdentifierPath,
|
|
13
|
+
cacheDir: options.cacheDir,
|
|
14
|
+
}, {
|
|
15
|
+
buildImage: async (buildImageOptions) => await buildImage({
|
|
16
|
+
buildConfig: buildImageOptions.buildConfig,
|
|
17
|
+
cacheDir: buildImageOptions.cacheDir,
|
|
18
|
+
fingerprintInput: buildImageOptions.fingerprintInput,
|
|
19
|
+
...(buildImageOptions.fullReset ? { fullReset: true } : {}),
|
|
20
|
+
}),
|
|
21
|
+
loadBuildConfig,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
return await buildGondolinImageDefault({
|
|
25
|
+
buildConfigPath: options.buildConfigPath,
|
|
26
|
+
systemCacheIdentifierPath: options.systemCacheIdentifierPath,
|
|
27
|
+
cacheDir: options.cacheDir,
|
|
28
|
+
}, {
|
|
29
|
+
...(dependencies.buildGondolinImage ? { buildImage: dependencies.buildGondolinImage } : {}),
|
|
30
|
+
...(dependencies.loadBuildConfig ? { loadBuildConfig: dependencies.loadBuildConfig } : {}),
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=gateway-image-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-image-builder.js","sourceRoot":"","sources":["../../src/gateway/gateway-image-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAIlC,OAAO,EACN,kBAAkB,IAAI,yBAAyB,GAE/C,MAAM,oCAAoC,CAAC;AAS5C,KAAK,UAAU,uBAAuB,CAAC,eAAuB;IAC7D,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC,CAAgB,CAAC;AAC9E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACtC,OAIC,EACD,eAAgD,EAAE;IAElD,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;IAC3C,IAAI,UAAU,EAAE,CAAC;QAChB,MAAM,eAAe,GAAG,YAAY,CAAC,eAAe,IAAI,uBAAuB,CAAC;QAChF,OAAO,MAAM,yBAAyB,CACrC;YACC,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,yBAAyB,EAAE,OAAO,CAAC,yBAAyB;YAC5D,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC1B,EACD;YACC,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,CACvC,MAAM,UAAU,CAAC;gBAChB,WAAW,EAAE,iBAAiB,CAAC,WAAW;gBAC1C,QAAQ,EAAE,iBAAiB,CAAC,QAAQ;gBACpC,gBAAgB,EAAE,iBAAiB,CAAC,gBAAgB;gBACpD,GAAG,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3D,CAAC;YACH,eAAe;SACf,CACD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,yBAAyB,CACrC;QACC,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,yBAAyB,EAAE,OAAO,CAAC,yBAAyB;QAC5D,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC1B,EACD;QACC,GAAG,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,YAAY,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3F,GAAG,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,YAAY,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1F,CACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
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,6BAA6B,CAAC;AASvF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,GAAG,gBAAgB,CAEjG"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { openclawLifecycle } from '@agent-vm/openclaw-gateway';
|
|
2
|
+
import { workerLifecycle } from '@agent-vm/worker-gateway';
|
|
3
|
+
const lifecycleByType = {
|
|
4
|
+
worker: workerLifecycle,
|
|
5
|
+
openclaw: openclawLifecycle,
|
|
6
|
+
};
|
|
7
|
+
export function loadGatewayLifecycle(type) {
|
|
8
|
+
return lifecycleByType[type];
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=gateway-lifecycle-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-lifecycle-loader.js","sourceRoot":"","sources":["../../src/gateway/gateway-lifecycle-loader.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D,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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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type GatewayProcessSpec, type GatewayType } from '@agent-vm/gateway-interface';
|
|
2
|
+
import { type ManagedVm } from '@agent-vm/gondolin-adapter';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
export declare const gatewayRuntimeRecordSchema: z.ZodObject<{
|
|
5
|
+
createdAt: z.ZodString;
|
|
6
|
+
gatewayType: z.ZodEnum<{
|
|
7
|
+
openclaw: "openclaw";
|
|
8
|
+
worker: "worker";
|
|
9
|
+
}>;
|
|
10
|
+
guestListenPort: z.ZodNumber;
|
|
11
|
+
ingressPort: z.ZodNumber;
|
|
12
|
+
projectNamespace: z.ZodString;
|
|
13
|
+
qemuPid: z.ZodNumber;
|
|
14
|
+
sessionLabel: z.ZodString;
|
|
15
|
+
vmId: z.ZodString;
|
|
16
|
+
zoneId: z.ZodString;
|
|
17
|
+
}, z.core.$strip>;
|
|
18
|
+
export type GatewayRuntimeRecord = z.infer<typeof gatewayRuntimeRecordSchema>;
|
|
19
|
+
export type GatewayRuntimeLog = (message: string) => void;
|
|
20
|
+
export declare function loadGatewayRuntimeRecord(stateDirectory: string, options?: {
|
|
21
|
+
readonly log?: GatewayRuntimeLog;
|
|
22
|
+
}): Promise<GatewayRuntimeRecord | null>;
|
|
23
|
+
export declare function writeGatewayRuntimeRecord(stateDirectory: string, record: GatewayRuntimeRecord): Promise<void>;
|
|
24
|
+
export declare function deleteGatewayRuntimeRecord(stateDirectory: string): Promise<void>;
|
|
25
|
+
export declare function buildGatewayRuntimeRecord(options: {
|
|
26
|
+
readonly gatewayType: GatewayType;
|
|
27
|
+
readonly ingressPort: number;
|
|
28
|
+
readonly managedVm: ManagedVm;
|
|
29
|
+
readonly processSpec: GatewayProcessSpec;
|
|
30
|
+
readonly projectNamespace: string;
|
|
31
|
+
readonly zoneId: string;
|
|
32
|
+
}): GatewayRuntimeRecord;
|
|
33
|
+
//# sourceMappingURL=gateway-runtime-record.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-runtime-record.d.ts","sourceRoot":"","sources":["../../src/gateway/gateway-runtime-record.ts"],"names":[],"mappings":"AAGA,OAAO,EAGN,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,KAAK,SAAS,EAAuB,MAAM,4BAA4B,CAAC;AACjF,OAAO,EAAY,CAAC,EAAE,MAAM,KAAK,CAAC;AAElC,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;iBAUrC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC9E,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAwC1D,wBAAsB,wBAAwB,CAC7C,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE;IACR,QAAQ,CAAC,GAAG,CAAC,EAAE,iBAAiB,CAAC;CAC5B,GACJ,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAyBtC;AAED,wBAAsB,yBAAyB,CAC9C,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,oBAAoB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAQf;AAED,wBAAsB,0BAA0B,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtF;AAmCD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IAClD,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;IACzC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB,GAAG,oBAAoB,CAcvB"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { buildGatewaySessionLabel, gatewayTypeValues, } from '@agent-vm/gateway-interface';
|
|
4
|
+
import { writeFileAtomically } from '@agent-vm/gondolin-adapter';
|
|
5
|
+
import { ZodError, z } from 'zod';
|
|
6
|
+
export const gatewayRuntimeRecordSchema = z.object({
|
|
7
|
+
createdAt: z.string().datetime(),
|
|
8
|
+
gatewayType: z.enum(gatewayTypeValues),
|
|
9
|
+
guestListenPort: z.number().int().positive(),
|
|
10
|
+
ingressPort: z.number().int().positive(),
|
|
11
|
+
projectNamespace: z.string().min(1),
|
|
12
|
+
qemuPid: z.number().int().positive(),
|
|
13
|
+
sessionLabel: z.string().min(1),
|
|
14
|
+
vmId: z.string().min(1),
|
|
15
|
+
zoneId: z.string().min(1),
|
|
16
|
+
});
|
|
17
|
+
const gatewayRuntimeRecordFileName = 'gateway-runtime.json';
|
|
18
|
+
function resolveGatewayRuntimeRecordPath(stateDirectory) {
|
|
19
|
+
return path.join(stateDirectory, gatewayRuntimeRecordFileName);
|
|
20
|
+
}
|
|
21
|
+
function resolveInvalidGatewayRuntimeRecordPath(stateDirectory) {
|
|
22
|
+
return path.join(stateDirectory, `gateway-runtime.invalid.${Date.now()}.json`);
|
|
23
|
+
}
|
|
24
|
+
function isObjectRecord(value) {
|
|
25
|
+
return typeof value === 'object' && value !== null;
|
|
26
|
+
}
|
|
27
|
+
async function quarantineMalformedGatewayRuntimeRecord(stateDirectory, runtimeRecordPath, log) {
|
|
28
|
+
const invalidRuntimeRecordPath = resolveInvalidGatewayRuntimeRecordPath(stateDirectory);
|
|
29
|
+
try {
|
|
30
|
+
await fs.rename(runtimeRecordPath, invalidRuntimeRecordPath);
|
|
31
|
+
log(`Quarantined malformed gateway runtime record '${runtimeRecordPath}' to '${invalidRuntimeRecordPath}'.`);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
await fs.rm(runtimeRecordPath, { force: true });
|
|
36
|
+
log(`Deleted malformed gateway runtime record '${runtimeRecordPath}' after quarantine rename failed: ${error instanceof Error ? error.message : JSON.stringify(error)}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function writeGatewayRuntimeLog(message) {
|
|
40
|
+
process.stderr.write(`[agent-vm] ${message}\n`);
|
|
41
|
+
}
|
|
42
|
+
export async function loadGatewayRuntimeRecord(stateDirectory, options = {}) {
|
|
43
|
+
const runtimeRecordPath = resolveGatewayRuntimeRecordPath(stateDirectory);
|
|
44
|
+
let rawRuntimeRecord;
|
|
45
|
+
try {
|
|
46
|
+
rawRuntimeRecord = await fs.readFile(runtimeRecordPath, 'utf8');
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
if (typeof error === 'object' && error !== null && 'code' in error && error.code === 'ENOENT') {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
return gatewayRuntimeRecordSchema.parse(JSON.parse(rawRuntimeRecord));
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
if (!(error instanceof SyntaxError) && !(error instanceof ZodError)) {
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
await quarantineMalformedGatewayRuntimeRecord(stateDirectory, runtimeRecordPath, options.log ?? writeGatewayRuntimeLog);
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export async function writeGatewayRuntimeRecord(stateDirectory, record) {
|
|
66
|
+
const runtimeRecordPath = resolveGatewayRuntimeRecordPath(stateDirectory);
|
|
67
|
+
await fs.mkdir(stateDirectory, { recursive: true });
|
|
68
|
+
await writeFileAtomically(runtimeRecordPath, `${JSON.stringify(gatewayRuntimeRecordSchema.parse(record), null, 2)}\n`, { mode: 0o600 });
|
|
69
|
+
}
|
|
70
|
+
export async function deleteGatewayRuntimeRecord(stateDirectory) {
|
|
71
|
+
await fs.rm(resolveGatewayRuntimeRecordPath(stateDirectory), { force: true });
|
|
72
|
+
}
|
|
73
|
+
function resolveManagedVmQemuPid(managedVm) {
|
|
74
|
+
const vmInstance = managedVm.getVmInstance();
|
|
75
|
+
if (!isObjectRecord(vmInstance)) {
|
|
76
|
+
throw new Error('Gateway VM runtime is missing its live VM instance.');
|
|
77
|
+
}
|
|
78
|
+
// Level 1 currently relies on Gondolin's live runtime object graph:
|
|
79
|
+
// VM -> SandboxServer -> SandboxController -> child_process.ChildProcess.
|
|
80
|
+
// If Gondolin refactors that structure, we fail closed here instead of
|
|
81
|
+
// silently persisting an invalid pid into gateway-runtime.json.
|
|
82
|
+
const server = vmInstance.server;
|
|
83
|
+
if (!isObjectRecord(server)) {
|
|
84
|
+
throw new Error('Gateway VM runtime is missing its live sandbox server.');
|
|
85
|
+
}
|
|
86
|
+
const controller = server.controller;
|
|
87
|
+
if (!isObjectRecord(controller)) {
|
|
88
|
+
throw new Error('Gateway VM runtime is missing its live sandbox controller.');
|
|
89
|
+
}
|
|
90
|
+
const child = controller.child;
|
|
91
|
+
if (!isObjectRecord(child)) {
|
|
92
|
+
throw new Error('Gateway VM runtime is missing its live QEMU child process.');
|
|
93
|
+
}
|
|
94
|
+
const qemuPid = child.pid;
|
|
95
|
+
if (typeof qemuPid !== 'number' || !Number.isInteger(qemuPid) || qemuPid <= 0) {
|
|
96
|
+
throw new Error('Gateway VM runtime is missing its live QEMU pid.');
|
|
97
|
+
}
|
|
98
|
+
return qemuPid;
|
|
99
|
+
}
|
|
100
|
+
export function buildGatewayRuntimeRecord(options) {
|
|
101
|
+
const gatewayType = gatewayRuntimeRecordSchema.shape.gatewayType.parse(options.gatewayType);
|
|
102
|
+
return {
|
|
103
|
+
createdAt: new Date().toISOString(),
|
|
104
|
+
gatewayType,
|
|
105
|
+
guestListenPort: options.processSpec.guestListenPort,
|
|
106
|
+
ingressPort: options.ingressPort,
|
|
107
|
+
projectNamespace: options.projectNamespace,
|
|
108
|
+
qemuPid: resolveManagedVmQemuPid(options.managedVm),
|
|
109
|
+
sessionLabel: buildGatewaySessionLabel(options.projectNamespace, options.zoneId),
|
|
110
|
+
vmId: options.managedVm.id,
|
|
111
|
+
zoneId: options.zoneId,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=gateway-runtime-record.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-runtime-record.js","sourceRoot":"","sources":["../../src/gateway/gateway-runtime-record.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { GatewayLifecycle, GatewayZoneConfig } from '@agent-vm/gateway-interface';
|
|
2
|
+
import { type ManagedVm } from '@agent-vm/gondolin-adapter';
|
|
3
|
+
import { type GatewayImageBuilderDependencies } from './gateway-image-builder.js';
|
|
4
|
+
import { cleanupOrphanedGatewayIfPresent } from './gateway-recovery.js';
|
|
5
|
+
import { type GatewayRuntimeRecord } from './gateway-runtime-record.js';
|
|
6
|
+
import { type GatewayManagedVmFactoryOptions, type GatewayZoneStartResult, type StartGatewayZoneOptions } from './gateway-zone-support.js';
|
|
7
|
+
export interface GatewayManagerDependencies extends GatewayImageBuilderDependencies {
|
|
8
|
+
readonly cleanupOrphanedGatewayIfPresent?: typeof cleanupOrphanedGatewayIfPresent;
|
|
9
|
+
readonly createManagedVm?: (options: GatewayManagedVmFactoryOptions) => Promise<ManagedVm>;
|
|
10
|
+
readonly loadGatewayLifecycle?: (type: GatewayZoneConfig['gateway']['type']) => GatewayLifecycle;
|
|
11
|
+
readonly writeGatewayRuntimeRecord?: (stateDirectory: string, record: GatewayRuntimeRecord) => Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
export declare function startGatewayZone(options: StartGatewayZoneOptions, dependencies?: GatewayManagerDependencies): Promise<GatewayZoneStartResult>;
|
|
14
|
+
//# sourceMappingURL=gateway-zone-orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-zone-orchestrator.d.ts","sourceRoot":"","sources":["../../src/gateway/gateway-zone-orchestrator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEX,gBAAgB,EAChB,iBAAiB,EACjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAEN,KAAK,SAAS,EACd,MAAM,4BAA4B,CAAC;AAIpC,OAAO,EAEN,KAAK,+BAA+B,EACpC,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,+BAA+B,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAGN,KAAK,oBAAoB,EACzB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAIN,KAAK,8BAA8B,EACnC,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,MAAM,2BAA2B,CAAC;AAEnC,MAAM,WAAW,0BAA2B,SAAQ,+BAA+B;IAClF,QAAQ,CAAC,+BAA+B,CAAC,EAAE,OAAO,+BAA+B,CAAC;IAClF,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,8BAA8B,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IAC3F,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,gBAAgB,CAAC;IACjG,QAAQ,CAAC,yBAAyB,CAAC,EAAE,CACpC,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,oBAAoB,KACxB,OAAO,CAAC,IAAI,CAAC,CAAC;CACnB;AAyDD,wBAAsB,gBAAgB,CACrC,OAAO,EAAE,uBAAuB,EAChC,YAAY,GAAE,0BAA+B,GAC3C,OAAO,CAAC,sBAAsB,CAAC,CA0IjC"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { createManagedVm as createManagedVmFromCore, } from '@agent-vm/gondolin-adapter';
|
|
4
|
+
import { runTaskWithResult } from '../shared/run-task.js';
|
|
5
|
+
import { resolveZoneSecrets } from './credential-manager.js';
|
|
6
|
+
import { buildGatewayImage, } from './gateway-image-builder.js';
|
|
7
|
+
import { loadGatewayLifecycle } from './gateway-lifecycle-loader.js';
|
|
8
|
+
import { cleanupOrphanedGatewayIfPresent } from './gateway-recovery.js';
|
|
9
|
+
import { buildGatewayRuntimeRecord, writeGatewayRuntimeRecord, } from './gateway-runtime-record.js';
|
|
10
|
+
import { findGatewayZone, mapSystemGatewayZoneToLifecycleZone, } from './gateway-zone-support.js';
|
|
11
|
+
function selectGatewayImageProfile(options) {
|
|
12
|
+
const profile = options.systemConfig.imageProfiles.gateways[options.zone.gateway.imageProfile];
|
|
13
|
+
if (!profile) {
|
|
14
|
+
throw new Error(`Gateway image profile '${options.zone.gateway.imageProfile}' is not configured.`);
|
|
15
|
+
}
|
|
16
|
+
return profile;
|
|
17
|
+
}
|
|
18
|
+
async function waitForHealth(options) {
|
|
19
|
+
const attempt = options.attempt ?? 0;
|
|
20
|
+
const maxAttempts = options.maxAttempts ?? 30;
|
|
21
|
+
const lastObservation = options.lastObservation ?? 'none';
|
|
22
|
+
if (attempt >= maxAttempts) {
|
|
23
|
+
throw new Error(`Gateway readiness check failed after ${maxAttempts} attempts. Last observation: ${lastObservation}.`);
|
|
24
|
+
}
|
|
25
|
+
const healthCommand = options.healthCheck.type === 'http'
|
|
26
|
+
? `curl -sS -o /dev/null -w "%{http_code}" --max-time 2 http://127.0.0.1:${options.healthCheck.port}${options.healthCheck.path} 2>/dev/null || echo 000`
|
|
27
|
+
: options.healthCheck.command;
|
|
28
|
+
const result = await options.managedVm.exec(healthCommand);
|
|
29
|
+
const currentObservation = options.healthCheck.type === 'http'
|
|
30
|
+
? `http ${result.stdout.trim() || '(empty)'}`
|
|
31
|
+
: `exit ${result.exitCode}`;
|
|
32
|
+
if ((options.healthCheck.type === 'http' && result.stdout.trim().startsWith('2')) ||
|
|
33
|
+
(options.healthCheck.type === 'command' && result.exitCode === 0)) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
37
|
+
await waitForHealth({
|
|
38
|
+
attempt: attempt + 1,
|
|
39
|
+
healthCheck: options.healthCheck,
|
|
40
|
+
lastObservation: currentObservation,
|
|
41
|
+
managedVm: options.managedVm,
|
|
42
|
+
maxAttempts,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
export async function startGatewayZone(options, dependencies = {}) {
|
|
46
|
+
const runTaskStep = options.runTask ?? (async (_title, fn) => await fn());
|
|
47
|
+
const zone = options.zoneOverride ?? findGatewayZone(options.systemConfig, options.zoneId);
|
|
48
|
+
const lifecycleZone = mapSystemGatewayZoneToLifecycleZone(zone);
|
|
49
|
+
await runTaskStep('Cleaning orphaned gateway runtime', async () => {
|
|
50
|
+
await (dependencies.cleanupOrphanedGatewayIfPresent ?? cleanupOrphanedGatewayIfPresent)({
|
|
51
|
+
stateDir: zone.gateway.stateDir,
|
|
52
|
+
zoneId: zone.id,
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
const lifecycle = (dependencies.loadGatewayLifecycle ?? loadGatewayLifecycle)(zone.gateway.type);
|
|
56
|
+
const resolvedSecrets = await runTaskWithResult(runTaskStep, 'Resolving zone secrets', async () => await resolveZoneSecrets({
|
|
57
|
+
systemConfig: options.systemConfig,
|
|
58
|
+
zoneId: zone.id,
|
|
59
|
+
secretResolver: options.secretResolver,
|
|
60
|
+
}));
|
|
61
|
+
const image = await runTaskWithResult(runTaskStep, 'Building gateway image', async () => {
|
|
62
|
+
const gatewayImageProfile = selectGatewayImageProfile({
|
|
63
|
+
systemConfig: options.systemConfig,
|
|
64
|
+
zone,
|
|
65
|
+
});
|
|
66
|
+
return await buildGatewayImage({
|
|
67
|
+
buildConfigPath: gatewayImageProfile.buildConfig,
|
|
68
|
+
systemCacheIdentifierPath: options.systemConfig.systemCacheIdentifierPath,
|
|
69
|
+
cacheDir: path.join(options.systemConfig.cacheDir, 'gateway-images', zone.gateway.imageProfile),
|
|
70
|
+
}, {
|
|
71
|
+
...(dependencies.buildImage ? { buildImage: dependencies.buildImage } : {}),
|
|
72
|
+
...(dependencies.loadBuildConfig ? { loadBuildConfig: dependencies.loadBuildConfig } : {}),
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
await fs.mkdir(zone.gateway.stateDir, { recursive: true });
|
|
76
|
+
await fs.mkdir(zone.gateway.workspaceDir, { recursive: true });
|
|
77
|
+
await runTaskStep('Preparing host state', async () => {
|
|
78
|
+
await lifecycle.prepareHostState?.(lifecycleZone, options.secretResolver);
|
|
79
|
+
});
|
|
80
|
+
const vmSpec = lifecycle.buildVmSpec({
|
|
81
|
+
controllerPort: options.systemConfig.host.controllerPort,
|
|
82
|
+
projectNamespace: options.systemConfig.host.projectNamespace,
|
|
83
|
+
resolvedSecrets,
|
|
84
|
+
tcpPool: options.systemConfig.tcpPool,
|
|
85
|
+
zone: lifecycleZone,
|
|
86
|
+
});
|
|
87
|
+
const processSpec = lifecycle.buildProcessSpec(lifecycleZone, resolvedSecrets);
|
|
88
|
+
const environment = {
|
|
89
|
+
...vmSpec.environment,
|
|
90
|
+
...options.environmentOverride,
|
|
91
|
+
};
|
|
92
|
+
const tcpHosts = {
|
|
93
|
+
...vmSpec.tcpHosts,
|
|
94
|
+
...options.tcpHostsOverride,
|
|
95
|
+
};
|
|
96
|
+
const vfsMounts = {
|
|
97
|
+
...vmSpec.vfsMounts,
|
|
98
|
+
...options.vfsMountsOverride,
|
|
99
|
+
};
|
|
100
|
+
const createManagedVm = dependencies.createManagedVm ?? createManagedVmFromCore;
|
|
101
|
+
const managedVm = await runTaskWithResult(runTaskStep, 'Booting gateway VM', async () => await createManagedVm({
|
|
102
|
+
allowedHosts: vmSpec.allowedHosts,
|
|
103
|
+
cpus: zone.gateway.cpus,
|
|
104
|
+
env: environment,
|
|
105
|
+
imagePath: image.imagePath,
|
|
106
|
+
memory: zone.gateway.memory,
|
|
107
|
+
rootfsMode: vmSpec.rootfsMode,
|
|
108
|
+
secrets: vmSpec.mediatedSecrets,
|
|
109
|
+
sessionLabel: vmSpec.sessionLabel,
|
|
110
|
+
tcpHosts,
|
|
111
|
+
vfsMounts,
|
|
112
|
+
}));
|
|
113
|
+
await runTaskStep('Configuring gateway', async () => {
|
|
114
|
+
await managedVm.exec(processSpec.bootstrapCommand);
|
|
115
|
+
});
|
|
116
|
+
await runTaskStep('Starting gateway', async () => {
|
|
117
|
+
await managedVm.exec(processSpec.startCommand);
|
|
118
|
+
});
|
|
119
|
+
await runTaskStep('Waiting for readiness', async () => {
|
|
120
|
+
await waitForHealth({
|
|
121
|
+
healthCheck: processSpec.healthCheck,
|
|
122
|
+
managedVm,
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
managedVm.setIngressRoutes([
|
|
126
|
+
{
|
|
127
|
+
port: processSpec.guestListenPort,
|
|
128
|
+
prefix: '/',
|
|
129
|
+
stripPrefix: true,
|
|
130
|
+
},
|
|
131
|
+
]);
|
|
132
|
+
const ingress = await managedVm.enableIngress({
|
|
133
|
+
listenPort: zone.gateway.port,
|
|
134
|
+
});
|
|
135
|
+
try {
|
|
136
|
+
await runTaskStep('Recording gateway runtime', async () => {
|
|
137
|
+
await (dependencies.writeGatewayRuntimeRecord ?? writeGatewayRuntimeRecord)(zone.gateway.stateDir, buildGatewayRuntimeRecord({
|
|
138
|
+
gatewayType: zone.gateway.type,
|
|
139
|
+
ingressPort: ingress.port,
|
|
140
|
+
managedVm,
|
|
141
|
+
processSpec,
|
|
142
|
+
projectNamespace: options.systemConfig.host.projectNamespace,
|
|
143
|
+
zoneId: zone.id,
|
|
144
|
+
}));
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
await managedVm.close().catch((closeError) => {
|
|
149
|
+
process.stderr.write(`[agent-vm] Failed to close gateway VM after runtime-record write failure: ${closeError instanceof Error ? closeError.message : JSON.stringify(closeError)}\n`);
|
|
150
|
+
});
|
|
151
|
+
throw error;
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
image,
|
|
155
|
+
ingress,
|
|
156
|
+
processSpec,
|
|
157
|
+
vm: managedVm,
|
|
158
|
+
zone,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=gateway-zone-orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-zone-orchestrator.js","sourceRoot":"","sources":["../../src/gateway/gateway-zone-orchestrator.ts"],"names":[],"mappings":"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"}
|