@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
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025-2026 Shravan Sunder
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { BackupResult } from './backup-manager.js';
|
|
2
|
+
export declare const BACKUP_FILENAME_DELIMITER = "__";
|
|
3
|
+
export declare function buildBackupPaths(options: {
|
|
4
|
+
readonly backupDir: string;
|
|
5
|
+
readonly timestamp: string;
|
|
6
|
+
readonly zoneId: string;
|
|
7
|
+
}): {
|
|
8
|
+
readonly encryptedPath: string;
|
|
9
|
+
readonly tarPath: string;
|
|
10
|
+
};
|
|
11
|
+
export declare function listBackupArtifacts(options: {
|
|
12
|
+
readonly backupDir: string;
|
|
13
|
+
readonly zoneId?: string;
|
|
14
|
+
}): BackupResult[];
|
|
15
|
+
//# sourceMappingURL=backup-archive-layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup-archive-layout.d.ts","sourceRoot":"","sources":["../../src/backup/backup-archive-layout.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB,GAAG;IACH,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CACzB,CAOA;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC5C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,YAAY,EAAE,CA0BjB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
export const BACKUP_FILENAME_DELIMITER = '__';
|
|
4
|
+
export function buildBackupPaths(options) {
|
|
5
|
+
const tarName = `${options.zoneId}${BACKUP_FILENAME_DELIMITER}${options.timestamp}.tar`;
|
|
6
|
+
const tarPath = path.join(options.backupDir, tarName);
|
|
7
|
+
return {
|
|
8
|
+
encryptedPath: `${tarPath}.age`,
|
|
9
|
+
tarPath,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export function listBackupArtifacts(options) {
|
|
13
|
+
if (!fs.existsSync(options.backupDir)) {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
const backupFiles = fs
|
|
17
|
+
.readdirSync(options.backupDir)
|
|
18
|
+
.filter((fileName) => fileName.endsWith('.tar.age'));
|
|
19
|
+
const filteredFiles = options.zoneId
|
|
20
|
+
? backupFiles.filter((fileName) => fileName.startsWith(`${options.zoneId}${BACKUP_FILENAME_DELIMITER}`))
|
|
21
|
+
: backupFiles;
|
|
22
|
+
return filteredFiles.map((fileName) => {
|
|
23
|
+
const fileStem = fileName.replace('.tar.age', '');
|
|
24
|
+
const delimiterIndex = fileStem.indexOf(BACKUP_FILENAME_DELIMITER);
|
|
25
|
+
return {
|
|
26
|
+
backupPath: path.join(options.backupDir, fileName),
|
|
27
|
+
timestamp: delimiterIndex >= 0
|
|
28
|
+
? fileStem.slice(delimiterIndex + BACKUP_FILENAME_DELIMITER.length)
|
|
29
|
+
: '',
|
|
30
|
+
zoneId: delimiterIndex >= 0 ? fileStem.slice(0, delimiterIndex) : fileStem,
|
|
31
|
+
};
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=backup-archive-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup-archive-layout.js","sourceRoot":"","sources":["../../src/backup/backup-archive-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AAE9C,MAAM,UAAU,gBAAgB,CAAC,OAIhC;IAIA,MAAM,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,yBAAyB,GAAG,OAAO,CAAC,SAAS,MAAM,CAAC;IACxF,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACtD,OAAO;QACN,aAAa,EAAE,GAAG,OAAO,MAAM;QAC/B,OAAO;KACP,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAGnC;IACA,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACvC,OAAO,EAAE,CAAC;IACX,CAAC;IAED,MAAM,WAAW,GAAG,EAAE;SACpB,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;SAC9B,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;IACtD,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM;QACnC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAChC,QAAQ,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,yBAAyB,EAAE,CAAC,CACpE;QACF,CAAC,CAAC,WAAW,CAAC;IAEf,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QACrC,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAClD,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;QACnE,OAAO;YACN,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC;YAClD,SAAS,EACR,cAAc,IAAI,CAAC;gBAClB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,GAAG,yBAAyB,CAAC,MAAM,CAAC;gBACnE,CAAC,CAAC,EAAE;YACN,MAAM,EAAE,cAAc,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,QAAQ;SAC1E,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { BackupEncryption, BackupResult } from './backup-manager.js';
|
|
2
|
+
export declare function createEncryptedBackup(options: {
|
|
3
|
+
readonly backupDir: string;
|
|
4
|
+
readonly encryption: BackupEncryption;
|
|
5
|
+
readonly stateDir: string;
|
|
6
|
+
readonly workspaceDir: string;
|
|
7
|
+
readonly zoneId: string;
|
|
8
|
+
}): Promise<BackupResult>;
|
|
9
|
+
//# sourceMappingURL=backup-create-operation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup-create-operation.d.ts","sourceRoot":"","sources":["../../src/backup/backup-create-operation.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAI1E,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IACpD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAAC,YAAY,CAAC,CAiDxB"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { promisify } from 'node:util';
|
|
6
|
+
import { buildBackupPaths } from './backup-archive-layout.js';
|
|
7
|
+
const execFileAsync = promisify(execFile);
|
|
8
|
+
export async function createEncryptedBackup(options) {
|
|
9
|
+
const timestamp = new Date().toISOString().replace(/[:.]/gu, '-');
|
|
10
|
+
const backupPaths = buildBackupPaths({
|
|
11
|
+
backupDir: options.backupDir,
|
|
12
|
+
timestamp,
|
|
13
|
+
zoneId: options.zoneId,
|
|
14
|
+
});
|
|
15
|
+
await fs.mkdir(options.backupDir, { recursive: true });
|
|
16
|
+
const stagingDirectory = await fs.mkdtemp(path.join(os.tmpdir(), 'backup-stage-'));
|
|
17
|
+
try {
|
|
18
|
+
await execFileAsync('cp', ['-a', options.stateDir, path.join(stagingDirectory, 'state')]);
|
|
19
|
+
await execFileAsync('cp', [
|
|
20
|
+
'-a',
|
|
21
|
+
options.workspaceDir,
|
|
22
|
+
path.join(stagingDirectory, 'workspace'),
|
|
23
|
+
]);
|
|
24
|
+
await fs.writeFile(path.join(stagingDirectory, 'manifest.json'), JSON.stringify({
|
|
25
|
+
createdAt: new Date().toISOString(),
|
|
26
|
+
timestamp,
|
|
27
|
+
zoneId: options.zoneId,
|
|
28
|
+
}));
|
|
29
|
+
await execFileAsync('tar', [
|
|
30
|
+
'cf',
|
|
31
|
+
backupPaths.tarPath,
|
|
32
|
+
'-C',
|
|
33
|
+
stagingDirectory,
|
|
34
|
+
'state',
|
|
35
|
+
'workspace',
|
|
36
|
+
'manifest.json',
|
|
37
|
+
]);
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
await fs.rm(stagingDirectory, { recursive: true, force: true });
|
|
41
|
+
}
|
|
42
|
+
await options.encryption.encrypt(backupPaths.tarPath, backupPaths.encryptedPath);
|
|
43
|
+
await fs.unlink(backupPaths.tarPath);
|
|
44
|
+
return {
|
|
45
|
+
backupPath: backupPaths.encryptedPath,
|
|
46
|
+
timestamp,
|
|
47
|
+
zoneId: options.zoneId,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=backup-create-operation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup-create-operation.js","sourceRoot":"","sources":["../../src/backup/backup-create-operation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAG9D,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAM3C;IACA,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,gBAAgB,CAAC;QACpC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS;QACT,MAAM,EAAE,OAAO,CAAC,MAAM;KACtB,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEvD,MAAM,gBAAgB,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IACnF,IAAI,CAAC;QACJ,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1F,MAAM,aAAa,CAAC,IAAI,EAAE;YACzB,IAAI;YACJ,OAAO,CAAC,YAAY;YACpB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC;SACxC,CAAC,CAAC;QAEH,MAAM,EAAE,CAAC,SAAS,CACjB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,eAAe,CAAC,EAC5C,IAAI,CAAC,SAAS,CAAC;YACd,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS;YACT,MAAM,EAAE,OAAO,CAAC,MAAM;SACtB,CAAC,CACF,CAAC;QAEF,MAAM,aAAa,CAAC,KAAK,EAAE;YAC1B,IAAI;YACJ,WAAW,CAAC,OAAO;YACnB,IAAI;YACJ,gBAAgB;YAChB,OAAO;YACP,WAAW;YACX,eAAe;SACf,CAAC,CAAC;IACJ,CAAC;YAAS,CAAC;QACV,MAAM,EAAE,CAAC,EAAE,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;IACjF,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAErC,OAAO;QACN,UAAU,EAAE,WAAW,CAAC,aAAa;QACrC,SAAS;QACT,MAAM,EAAE,OAAO,CAAC,MAAM;KACtB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { BackupEncryption } from './backup-manager.js';
|
|
2
|
+
interface AgeEncryptionDependencies {
|
|
3
|
+
/** Resolves the age identity (secret key) string from 1Password.
|
|
4
|
+
* Format: AGE-SECRET-KEY-1... (the full key line from age-keygen).
|
|
5
|
+
* Store this in 1Password as a "password" field. Generate with: age-keygen */
|
|
6
|
+
readonly resolveIdentity: () => Promise<string>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Age identity-key-based encryption for zone backups.
|
|
10
|
+
*
|
|
11
|
+
* Uses age public-key encryption: the identity key (AGE-SECRET-KEY-1...)
|
|
12
|
+
* is stored in 1Password per zone. The public key (recipient) is derived
|
|
13
|
+
* at encryption time via age-keygen -y.
|
|
14
|
+
*
|
|
15
|
+
* Secret keys are written only to a short-lived 0600 temp file for tool
|
|
16
|
+
* compatibility, then deleted immediately after each operation.
|
|
17
|
+
*/
|
|
18
|
+
export declare function createAgeBackupEncryption(dependencies: AgeEncryptionDependencies): BackupEncryption;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=backup-encryption.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup-encryption.d.ts","sourceRoot":"","sources":["../../src/backup/backup-encryption.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,UAAU,yBAAyB;IAClC;;mFAE+E;IAC/E,QAAQ,CAAC,eAAe,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CAChD;AAqED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACxC,YAAY,EAAE,yBAAyB,GACrC,gBAAgB,CA8BlB"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
/**
|
|
6
|
+
* Run a command with optional stdin input. Returns stdout as a string.
|
|
7
|
+
* Rejects if the process exits non-zero.
|
|
8
|
+
*/
|
|
9
|
+
function runWithStdin(command, args, stdinInput) {
|
|
10
|
+
return new Promise((resolve, reject) => {
|
|
11
|
+
const child = spawn(command, [...args], { stdio: ['pipe', 'pipe', 'pipe'] });
|
|
12
|
+
let stdout = '';
|
|
13
|
+
let stderr = '';
|
|
14
|
+
child.stdout.on('data', (data) => {
|
|
15
|
+
stdout += data.toString('utf8');
|
|
16
|
+
});
|
|
17
|
+
child.stderr.on('data', (data) => {
|
|
18
|
+
stderr += data.toString('utf8');
|
|
19
|
+
});
|
|
20
|
+
child.on('close', (code) => {
|
|
21
|
+
if (code !== 0) {
|
|
22
|
+
reject(new Error(`${command} failed (exit ${code}): ${stderr.trim()}`));
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
resolve(stdout);
|
|
26
|
+
});
|
|
27
|
+
if (stdinInput !== undefined) {
|
|
28
|
+
child.stdin.write(stdinInput);
|
|
29
|
+
child.stdin.end();
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
child.stdin.end();
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
async function withTemporaryIdentityFile(identityLine, runWithIdentityFile) {
|
|
37
|
+
const temporaryIdentityPath = path.join(os.tmpdir(), `agent-vm-age-identity-${process.pid}-${Date.now()}.txt`);
|
|
38
|
+
await fs.writeFile(temporaryIdentityPath, `${identityLine}\n`, {
|
|
39
|
+
encoding: 'utf8',
|
|
40
|
+
mode: 0o600,
|
|
41
|
+
});
|
|
42
|
+
try {
|
|
43
|
+
return await runWithIdentityFile(temporaryIdentityPath);
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
await fs.rm(temporaryIdentityPath, { force: true });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Derive the public key (recipient) from an age identity key via a short-lived
|
|
51
|
+
* 0600 temp file. `/dev/stdin` is not portable enough across CI runners.
|
|
52
|
+
*/
|
|
53
|
+
async function deriveRecipientFromIdentity(identityLine) {
|
|
54
|
+
return await withTemporaryIdentityFile(identityLine, async (identityFilePath) => (await runWithStdin('age-keygen', ['-y', identityFilePath])).trim());
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Age identity-key-based encryption for zone backups.
|
|
58
|
+
*
|
|
59
|
+
* Uses age public-key encryption: the identity key (AGE-SECRET-KEY-1...)
|
|
60
|
+
* is stored in 1Password per zone. The public key (recipient) is derived
|
|
61
|
+
* at encryption time via age-keygen -y.
|
|
62
|
+
*
|
|
63
|
+
* Secret keys are written only to a short-lived 0600 temp file for tool
|
|
64
|
+
* compatibility, then deleted immediately after each operation.
|
|
65
|
+
*/
|
|
66
|
+
export function createAgeBackupEncryption(dependencies) {
|
|
67
|
+
return {
|
|
68
|
+
encrypt: async (inputPath, outputPath) => {
|
|
69
|
+
const identity = await dependencies.resolveIdentity();
|
|
70
|
+
const recipient = await deriveRecipientFromIdentity(identity);
|
|
71
|
+
await runWithStdin('age', [
|
|
72
|
+
'--encrypt',
|
|
73
|
+
'--recipient',
|
|
74
|
+
recipient,
|
|
75
|
+
'--output',
|
|
76
|
+
outputPath,
|
|
77
|
+
inputPath,
|
|
78
|
+
]);
|
|
79
|
+
},
|
|
80
|
+
decrypt: async (inputPath, outputPath) => {
|
|
81
|
+
const identity = await dependencies.resolveIdentity();
|
|
82
|
+
await withTemporaryIdentityFile(identity, async (identityFilePath) => await runWithStdin('age', [
|
|
83
|
+
'--decrypt',
|
|
84
|
+
'--identity',
|
|
85
|
+
identityFilePath,
|
|
86
|
+
'--output',
|
|
87
|
+
outputPath,
|
|
88
|
+
inputPath,
|
|
89
|
+
]));
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=backup-encryption.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup-encryption.js","sourceRoot":"","sources":["../../src/backup/backup-encryption.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export interface BackupEncryption {
|
|
2
|
+
readonly encrypt: (inputPath: string, outputPath: string) => Promise<void>;
|
|
3
|
+
readonly decrypt: (inputPath: string, outputPath: string) => Promise<void>;
|
|
4
|
+
}
|
|
5
|
+
export interface BackupResult {
|
|
6
|
+
readonly backupPath: string;
|
|
7
|
+
readonly timestamp: string;
|
|
8
|
+
readonly zoneId: string;
|
|
9
|
+
}
|
|
10
|
+
export interface BackupRestoreResult {
|
|
11
|
+
readonly stateDir: string;
|
|
12
|
+
readonly workspaceDir: string;
|
|
13
|
+
readonly zoneId: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ZoneBackupManager {
|
|
16
|
+
createBackup(options: {
|
|
17
|
+
readonly zoneId: string;
|
|
18
|
+
readonly stateDir: string;
|
|
19
|
+
readonly workspaceDir: string;
|
|
20
|
+
readonly backupDir: string;
|
|
21
|
+
}): Promise<BackupResult>;
|
|
22
|
+
restoreBackup(options: {
|
|
23
|
+
readonly backupPath: string;
|
|
24
|
+
readonly stateDir: string;
|
|
25
|
+
readonly workspaceDir: string;
|
|
26
|
+
}): Promise<BackupRestoreResult>;
|
|
27
|
+
listBackups(options: {
|
|
28
|
+
readonly backupDir: string;
|
|
29
|
+
readonly zoneId?: string;
|
|
30
|
+
}): BackupResult[];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Archive layout inside the tar:
|
|
34
|
+
* state/ — contents of stateDir
|
|
35
|
+
* workspace/ — contents of workspaceDir
|
|
36
|
+
* manifest.json
|
|
37
|
+
*
|
|
38
|
+
* This fixed layout decouples archive structure from host paths, so stateDir
|
|
39
|
+
* and workspaceDir can live under completely different parents on restore.
|
|
40
|
+
*/
|
|
41
|
+
export declare function createZoneBackupManager(encryption: BackupEncryption): ZoneBackupManager;
|
|
42
|
+
//# sourceMappingURL=backup-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup-manager.d.ts","sourceRoot":"","sources":["../../src/backup/backup-manager.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,QAAQ,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3E;AAED,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IACjC,YAAY,CAAC,OAAO,EAAE;QACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;KAC3B,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE1B,aAAa,CAAC,OAAO,EAAE;QACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;KAC9B,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAEjC,WAAW,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,YAAY,EAAE,CAAC;CAC/F;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,gBAAgB,GAAG,iBAAiB,CAuBvF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { listBackupArtifacts } from './backup-archive-layout.js';
|
|
2
|
+
import { createEncryptedBackup } from './backup-create-operation.js';
|
|
3
|
+
import { restoreEncryptedBackup } from './backup-restore-operation.js';
|
|
4
|
+
/**
|
|
5
|
+
* Archive layout inside the tar:
|
|
6
|
+
* state/ — contents of stateDir
|
|
7
|
+
* workspace/ — contents of workspaceDir
|
|
8
|
+
* manifest.json
|
|
9
|
+
*
|
|
10
|
+
* This fixed layout decouples archive structure from host paths, so stateDir
|
|
11
|
+
* and workspaceDir can live under completely different parents on restore.
|
|
12
|
+
*/
|
|
13
|
+
export function createZoneBackupManager(encryption) {
|
|
14
|
+
return {
|
|
15
|
+
async createBackup(options) {
|
|
16
|
+
return await createEncryptedBackup({
|
|
17
|
+
encryption,
|
|
18
|
+
backupDir: options.backupDir,
|
|
19
|
+
stateDir: options.stateDir,
|
|
20
|
+
workspaceDir: options.workspaceDir,
|
|
21
|
+
zoneId: options.zoneId,
|
|
22
|
+
});
|
|
23
|
+
},
|
|
24
|
+
async restoreBackup(options) {
|
|
25
|
+
return await restoreEncryptedBackup({
|
|
26
|
+
encryption,
|
|
27
|
+
backupPath: options.backupPath,
|
|
28
|
+
stateDir: options.stateDir,
|
|
29
|
+
workspaceDir: options.workspaceDir,
|
|
30
|
+
});
|
|
31
|
+
},
|
|
32
|
+
listBackups(options) {
|
|
33
|
+
return listBackupArtifacts(options);
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=backup-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup-manager.js","sourceRoot":"","sources":["../../src/backup/backup-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAoCvE;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CAAC,UAA4B;IACnE,OAAO;QACN,KAAK,CAAC,YAAY,CAAC,OAAO;YACzB,OAAO,MAAM,qBAAqB,CAAC;gBAClC,UAAU;gBACV,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,MAAM,EAAE,OAAO,CAAC,MAAM;aACtB,CAAC,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,aAAa,CAAC,OAAO;YAC1B,OAAO,MAAM,sBAAsB,CAAC;gBACnC,UAAU;gBACV,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;aAClC,CAAC,CAAC;QACJ,CAAC;QACD,WAAW,CAAC,OAAO;YAClB,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;KACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { BackupEncryption, BackupRestoreResult } from './backup-manager.js';
|
|
2
|
+
export declare function restoreEncryptedBackup(options: {
|
|
3
|
+
readonly backupPath: string;
|
|
4
|
+
readonly encryption: BackupEncryption;
|
|
5
|
+
readonly stateDir: string;
|
|
6
|
+
readonly workspaceDir: string;
|
|
7
|
+
}): Promise<BackupRestoreResult>;
|
|
8
|
+
//# sourceMappingURL=backup-restore-operation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup-restore-operation.d.ts","sourceRoot":"","sources":["../../src/backup/backup-restore-operation.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAqCjF,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACrD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC9B,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAsB/B"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { promisify } from 'node:util';
|
|
6
|
+
const execFileAsync = promisify(execFile);
|
|
7
|
+
async function copyExtractedDirectoryContents(sourceDirectory, targetDirectory) {
|
|
8
|
+
try {
|
|
9
|
+
await fs.access(sourceDirectory);
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const entries = await fs.readdir(sourceDirectory);
|
|
15
|
+
await Promise.all(entries.map(async (entryName) => {
|
|
16
|
+
await execFileAsync('cp', [
|
|
17
|
+
'-a',
|
|
18
|
+
path.join(sourceDirectory, entryName),
|
|
19
|
+
path.join(targetDirectory, entryName),
|
|
20
|
+
]);
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
23
|
+
async function readZoneIdFromManifest(extractDirectory) {
|
|
24
|
+
const manifestPath = path.join(extractDirectory, 'manifest.json');
|
|
25
|
+
try {
|
|
26
|
+
const rawManifest = await fs.readFile(manifestPath, 'utf8');
|
|
27
|
+
const manifest = JSON.parse(rawManifest);
|
|
28
|
+
return manifest.zoneId ?? 'unknown';
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return 'unknown';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export async function restoreEncryptedBackup(options) {
|
|
35
|
+
const decryptedTarPath = `${options.backupPath}.decrypted.tar`;
|
|
36
|
+
await options.encryption.decrypt(options.backupPath, decryptedTarPath);
|
|
37
|
+
const extractDirectory = await fs.mkdtemp(path.join(os.tmpdir(), 'backup-extract-'));
|
|
38
|
+
try {
|
|
39
|
+
await execFileAsync('tar', ['xf', decryptedTarPath, '-C', extractDirectory]);
|
|
40
|
+
await copyExtractedDirectoryContents(path.join(extractDirectory, 'state'), options.stateDir);
|
|
41
|
+
await copyExtractedDirectoryContents(path.join(extractDirectory, 'workspace'), options.workspaceDir);
|
|
42
|
+
return {
|
|
43
|
+
stateDir: options.stateDir,
|
|
44
|
+
workspaceDir: options.workspaceDir,
|
|
45
|
+
zoneId: await readZoneIdFromManifest(extractDirectory),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
await fs.rm(extractDirectory, { recursive: true, force: true });
|
|
50
|
+
await fs.unlink(decryptedTarPath);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=backup-restore-operation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup-restore-operation.js","sourceRoot":"","sources":["../../src/backup/backup-restore-operation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAItC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,KAAK,UAAU,8BAA8B,CAC5C,eAAuB,EACvB,eAAuB;IAEvB,IAAI,CAAC;QACJ,MAAM,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO;IACR,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAClD,MAAM,OAAO,CAAC,GAAG,CAChB,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;QAC/B,MAAM,aAAa,CAAC,IAAI,EAAE;YACzB,IAAI;YACJ,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC;YACrC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC;SACrC,CAAC,CAAC;IACJ,CAAC,CAAC,CACF,CAAC;AACH,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,gBAAwB;IAC7D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;IAClE,IAAI,CAAC;QACJ,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAiC,CAAC;QACzE,OAAO,QAAQ,CAAC,MAAM,IAAI,SAAS,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,OAK5C;IACA,MAAM,gBAAgB,GAAG,GAAG,OAAO,CAAC,UAAU,gBAAgB,CAAC;IAC/D,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;IAEvE,MAAM,gBAAgB,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACrF,IAAI,CAAC;QACJ,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAC7E,MAAM,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC7F,MAAM,8BAA8B,CACnC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,EACxC,OAAO,CAAC,YAAY,CACpB,CAAC;QAEF,OAAO;YACN,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,MAAM,EAAE,MAAM,sBAAsB,CAAC,gBAAgB,CAAC;SACtD,CAAC;IACH,CAAC;YAAS,CAAC;QACV,MAAM,EAAE,CAAC,EAAE,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,MAAM,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACnC,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface DockerImageBuilderDependencies {
|
|
2
|
+
readonly executeCommand?: (command: string, args: readonly string[]) => Promise<{
|
|
3
|
+
readonly exitCode?: number;
|
|
4
|
+
} | void>;
|
|
5
|
+
}
|
|
6
|
+
export interface BuildDockerImageOptions {
|
|
7
|
+
readonly dockerfilePath: string;
|
|
8
|
+
readonly imageTag: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function buildDockerImage(options: BuildDockerImageOptions, dependencies?: DockerImageBuilderDependencies): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=docker-image-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-image-builder.d.ts","sourceRoot":"","sources":["../../src/build/docker-image-builder.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,8BAA8B;IAC9C,QAAQ,CAAC,cAAc,CAAC,EAAE,CACzB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,KACnB,OAAO,CAAC;QACZ,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;KAC3B,GAAG,IAAI,CAAC,CAAC;CACV;AAED,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC1B;AAMD,wBAAsB,gBAAgB,CACrC,OAAO,EAAE,uBAAuB,EAChC,YAAY,GAAE,8BAAmC,GAC/C,OAAO,CAAC,IAAI,CAAC,CAoBf"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { execa } from 'execa';
|
|
3
|
+
async function executeDockerCommand(command, args) {
|
|
4
|
+
await execa(command, args, { stdio: 'inherit' });
|
|
5
|
+
}
|
|
6
|
+
export async function buildDockerImage(options, dependencies = {}) {
|
|
7
|
+
const executeCommand = dependencies.executeCommand ?? executeDockerCommand;
|
|
8
|
+
const resolvedDockerfilePath = path.resolve(options.dockerfilePath);
|
|
9
|
+
const dockerBuildContextDirectory = path.dirname(resolvedDockerfilePath);
|
|
10
|
+
try {
|
|
11
|
+
await executeCommand('docker', [
|
|
12
|
+
'build',
|
|
13
|
+
'-f',
|
|
14
|
+
resolvedDockerfilePath,
|
|
15
|
+
'-t',
|
|
16
|
+
options.imageTag,
|
|
17
|
+
dockerBuildContextDirectory,
|
|
18
|
+
]);
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
throw new Error(`Docker build failed for ${options.imageTag}: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=docker-image-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-image-builder.js","sourceRoot":"","sources":["../../src/build/docker-image-builder.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAgB9B,KAAK,UAAU,oBAAoB,CAAC,OAAe,EAAE,IAAuB;IAC3E,MAAM,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACrC,OAAgC,EAChC,eAA+C,EAAE;IAEjD,MAAM,cAAc,GAAG,YAAY,CAAC,cAAc,IAAI,oBAAoB,CAAC;IAC3E,MAAM,sBAAsB,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACpE,MAAM,2BAA2B,GAAG,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAEzE,IAAI,CAAC;QACJ,MAAM,cAAc,CAAC,QAAQ,EAAE;YAC9B,OAAO;YACP,IAAI;YACJ,sBAAsB;YACtB,IAAI;YACJ,OAAO,CAAC,QAAQ;YAChB,2BAA2B;SAC3B,CAAC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACd,2BAA2B,OAAO,CAAC,QAAQ,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EACxG,EAAE,KAAK,EAAE,KAAK,EAAE,CAChB,CAAC;IACH,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type BuildConfig, type BuildImageOptions, type BuildImageResult } from '@agent-vm/gondolin-adapter';
|
|
2
|
+
export interface GondolinImageBuilderDependencies {
|
|
3
|
+
readonly buildImage?: (options: BuildImageOptions, dependencies?: {
|
|
4
|
+
readonly gondolinVersion?: string;
|
|
5
|
+
}) => Promise<BuildImageResult>;
|
|
6
|
+
readonly loadBuildConfig?: (buildConfigPath: string) => Promise<BuildConfig>;
|
|
7
|
+
readonly resolveRuntimeBuildVersionTag?: () => Promise<string>;
|
|
8
|
+
}
|
|
9
|
+
export declare function computeFingerprintFromConfigPath(buildConfigPath: string, systemCacheIdentifierPath: string, dependencies?: Pick<GondolinImageBuilderDependencies, 'resolveRuntimeBuildVersionTag'>): Promise<string>;
|
|
10
|
+
export declare function buildGondolinImage(options: {
|
|
11
|
+
readonly buildConfigPath: string;
|
|
12
|
+
readonly systemCacheIdentifierPath: string;
|
|
13
|
+
readonly cacheDir: string;
|
|
14
|
+
readonly fullReset?: boolean;
|
|
15
|
+
}, dependencies?: GondolinImageBuilderDependencies): Promise<BuildImageResult>;
|
|
16
|
+
//# sourceMappingURL=gondolin-image-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gondolin-image-builder.d.ts","sourceRoot":"","sources":["../../src/build/gondolin-image-builder.ts"],"names":[],"mappings":"AAGA,OAAO,EAGN,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,MAAM,4BAA4B,CAAC;AAKpC,MAAM,WAAW,gCAAgC;IAChD,QAAQ,CAAC,UAAU,CAAC,EAAE,CACrB,OAAO,EAAE,iBAAiB,EAC1B,YAAY,CAAC,EAAE;QAAE,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,KAChD,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC/B,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7E,QAAQ,CAAC,6BAA6B,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CAC/D;AAuBD,wBAAsB,gCAAgC,CACrD,eAAe,EAAE,MAAM,EACvB,yBAAyB,EAAE,MAAM,EACjC,YAAY,GAAE,IAAI,CAAC,gCAAgC,EAAE,+BAA+B,CAAM,GACxF,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED,wBAAsB,kBAAkB,CACvC,OAAO,EAAE;IACR,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,yBAAyB,EAAE,MAAM,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC7B,EACD,YAAY,GAAE,gCAAqC,GACjD,OAAO,CAAC,gBAAgB,CAAC,CAwB3B"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { buildImage as buildImageFromCore, computeBuildFingerprint, } from '@agent-vm/gondolin-adapter';
|
|
4
|
+
import { loadSystemCacheIdentifier } from '../config/system-cache-identifier.js';
|
|
5
|
+
import { resolveRuntimeBuildVersionTag as resolveRuntimeBuildVersionTagDefault } from './runtime-versions.js';
|
|
6
|
+
async function loadBuildConfigFromJson(buildConfigPath) {
|
|
7
|
+
let rawContents;
|
|
8
|
+
try {
|
|
9
|
+
rawContents = await fs.readFile(buildConfigPath, 'utf8');
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
13
|
+
throw new Error(`Failed to read build config '${buildConfigPath}': ${message}`, {
|
|
14
|
+
cause: error,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
return JSON.parse(rawContents);
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
22
|
+
throw new Error(`Failed to parse build config '${buildConfigPath}': ${message}`, {
|
|
23
|
+
cause: error,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export async function computeFingerprintFromConfigPath(buildConfigPath, systemCacheIdentifierPath, dependencies = {}) {
|
|
28
|
+
const buildConfig = await loadBuildConfigFromJson(buildConfigPath);
|
|
29
|
+
const fingerprintInput = await loadSystemCacheIdentifier({ filePath: systemCacheIdentifierPath });
|
|
30
|
+
const runtimeBuildVersionTag = await (dependencies.resolveRuntimeBuildVersionTag ?? resolveRuntimeBuildVersionTagDefault)();
|
|
31
|
+
return computeBuildFingerprint(buildConfig, runtimeBuildVersionTag, fingerprintInput);
|
|
32
|
+
}
|
|
33
|
+
export async function buildGondolinImage(options, dependencies = {}) {
|
|
34
|
+
const loadBuildConfig = dependencies.loadBuildConfig ?? loadBuildConfigFromJson;
|
|
35
|
+
const buildImage = dependencies.buildImage ?? buildImageFromCore;
|
|
36
|
+
const configDir = path.dirname(path.resolve(options.buildConfigPath));
|
|
37
|
+
const buildConfig = await loadBuildConfig(options.buildConfigPath);
|
|
38
|
+
const fingerprintInput = await loadSystemCacheIdentifier({
|
|
39
|
+
filePath: options.systemCacheIdentifierPath,
|
|
40
|
+
});
|
|
41
|
+
const runtimeBuildVersionTag = await (dependencies.resolveRuntimeBuildVersionTag ?? resolveRuntimeBuildVersionTagDefault)();
|
|
42
|
+
return await buildImage({
|
|
43
|
+
buildConfig,
|
|
44
|
+
cacheDir: options.cacheDir,
|
|
45
|
+
configDir,
|
|
46
|
+
fingerprintInput,
|
|
47
|
+
...(options.fullReset ? { fullReset: true } : {}),
|
|
48
|
+
}, {
|
|
49
|
+
gondolinVersion: runtimeBuildVersionTag,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=gondolin-image-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gondolin-image-builder.js","sourceRoot":"","sources":["../../src/build/gondolin-image-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface RuntimePackageVersions {
|
|
2
|
+
readonly agentVm: string;
|
|
3
|
+
readonly gondolinAdapter: string;
|
|
4
|
+
readonly gondolinPackage: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function findPackageJsonPathFromStart(startPath: string): Promise<string>;
|
|
7
|
+
export declare function readRuntimePackageVersions(options: {
|
|
8
|
+
readonly agentVmPackageJsonPath: string;
|
|
9
|
+
readonly gondolinAdapterPackageJsonPath: string;
|
|
10
|
+
}): Promise<RuntimePackageVersions>;
|
|
11
|
+
export declare function formatRuntimeBuildVersionTag(versions: RuntimePackageVersions): string;
|
|
12
|
+
export declare function resolveRuntimeBuildVersionTag(): Promise<string>;
|
|
13
|
+
//# sourceMappingURL=runtime-versions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-versions.d.ts","sourceRoot":"","sources":["../../src/build/runtime-versions.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CACjC;AAoDD,wBAAsB,4BAA4B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA0BrF;AAkBD,wBAAsB,0BAA0B,CAAC,OAAO,EAAE;IACzD,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,8BAA8B,EAAE,MAAM,CAAC;CAChD,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAkBlC;AAED,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,sBAAsB,GAAG,MAAM,CAMrF;AAED,wBAAsB,6BAA6B,IAAI,OAAO,CAAC,MAAM,CAAC,CAerE"}
|