@shravansunder/agent-vm 0.0.1
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/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 +71 -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 +9 -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 +12 -0
- package/dist/build/gondolin-image-builder.d.ts.map +1 -0
- package/dist/build/gondolin-image-builder.js +23 -0
- package/dist/build/gondolin-image-builder.js.map +1 -0
- package/dist/build/stale-image-cleaner.d.ts +15 -0
- package/dist/build/stale-image-cleaner.d.ts.map +1 -0
- package/dist/build/stale-image-cleaner.js +46 -0
- package/dist/build/stale-image-cleaner.js.map +1 -0
- package/dist/cli/agent-vm-cli-support.d.ts +68 -0
- package/dist/cli/agent-vm-cli-support.d.ts.map +1 -0
- package/dist/cli/agent-vm-cli-support.js +72 -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 +22 -0
- package/dist/cli/build-command.d.ts.map +1 -0
- package/dist/cli/build-command.js +77 -0
- package/dist/cli/build-command.js.map +1 -0
- package/dist/cli/cache-commands.d.ts +29 -0
- package/dist/cli/cache-commands.d.ts.map +1 -0
- package/dist/cli/cache-commands.js +71 -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 +25 -0
- package/dist/cli/commands/command-definition-support.d.ts.map +1 -0
- package/dist/cli/commands/command-definition-support.js +74 -0
- package/dist/cli/commands/command-definition-support.js.map +1 -0
- package/dist/cli/commands/controller-definition.d.ts +223 -0
- package/dist/cli/commands/controller-definition.d.ts.map +1 -0
- package/dist/cli/commands/controller-definition.js +200 -0
- package/dist/cli/commands/controller-definition.js.map +1 -0
- package/dist/cli/commands/create-app.d.ts +421 -0
- package/dist/cli/commands/create-app.d.ts.map +1 -0
- package/dist/cli/commands/create-app.js +26 -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 +13 -0
- package/dist/cli/commands/init-definition.d.ts.map +1 -0
- package/dist/cli/commands/init-definition.js +32 -0
- package/dist/cli/commands/init-definition.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 +74 -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 +29 -0
- package/dist/cli/init-command.d.ts.map +1 -0
- package/dist/cli/init-command.js +407 -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 +3 -0
- package/dist/cli/openclaw-plugin-bundle.d.ts.map +1 -0
- package/dist/cli/openclaw-plugin-bundle.js +30 -0
- package/dist/cli/openclaw-plugin-bundle.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/config/system-config.d.ts +72 -0
- package/dist/config/system-config.d.ts.map +1 -0
- package/dist/config/system-config.js +121 -0
- package/dist/config/system-config.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 +111 -0
- package/dist/controller/controller-runtime-operations.js.map +1 -0
- package/dist/controller/controller-runtime-support.d.ts +8 -0
- package/dist/controller/controller-runtime-support.d.ts.map +1 -0
- package/dist/controller/controller-runtime-support.js +15 -0
- package/dist/controller/controller-runtime-support.js.map +1 -0
- package/dist/controller/controller-runtime-types.d.ts +46 -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 +135 -0
- package/dist/controller/controller-runtime.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 +26 -0
- package/dist/controller/http/controller-http-route-support.d.ts.map +1 -0
- package/dist/controller/http/controller-http-route-support.js +21 -0
- package/dist/controller/http/controller-http-route-support.js.map +1 -0
- package/dist/controller/http/controller-http-routes.d.ts +20 -0
- package/dist/controller/http/controller-http-routes.d.ts.map +1 -0
- package/dist/controller/http/controller-http-routes.js +83 -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 +15 -0
- package/dist/controller/http/controller-request-schemas.d.ts.map +1 -0
- package/dist/controller/http/controller-request-schemas.js +15 -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 +54 -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 +57 -0
- package/dist/controller/leases/lease-manager.d.ts.map +1 -0
- package/dist/controller/leases/lease-manager.js +83 -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/gateway/credential-manager.d.ts +8 -0
- package/dist/gateway/credential-manager.d.ts.map +1 -0
- package/dist/gateway/credential-manager.js +46 -0
- package/dist/gateway/credential-manager.js.map +1 -0
- package/dist/gateway/gateway-image-builder.d.ts +13 -0
- package/dist/gateway/gateway-image-builder.d.ts.map +1 -0
- package/dist/gateway/gateway-image-builder.js +19 -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-zone-orchestrator.d.ts +10 -0
- package/dist/gateway/gateway-zone-orchestrator.d.ts.map +1 -0
- package/dist/gateway/gateway-zone-orchestrator.js +92 -0
- package/dist/gateway/gateway-zone-orchestrator.js.map +1 -0
- package/dist/gateway/gateway-zone-support.d.ts +49 -0
- package/dist/gateway/gateway-zone-support.d.ts.map +1 -0
- package/dist/gateway/gateway-zone-support.js +8 -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 +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.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 +22 -0
- package/dist/operations/doctor.d.ts.map +1 -0
- package/dist/operations/doctor.js +83 -0
- package/dist/operations/doctor.js.map +1 -0
- package/dist/operations/upgrade-zone.d.ts +13 -0
- package/dist/operations/upgrade-zone.d.ts.map +1 -0
- package/dist/operations/upgrade-zone.js +11 -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/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 +27 -0
- package/dist/tool-vm/tool-vm-lifecycle.d.ts.map +1 -0
- package/dist/tool-vm/tool-vm-lifecycle.js +54 -0
- package/dist/tool-vm/tool-vm-lifecycle.js.map +1 -0
- package/package.json +41 -0
|
@@ -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 never written to disk — they're passed via stdin
|
|
16
|
+
* using /dev/stdin as the identity file path.
|
|
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":"AAEA,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;AAiDD;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACxC,YAAY,EAAE,yBAAyB,GACrC,gBAAgB,CAuBlB"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
/**
|
|
3
|
+
* Run a command with optional stdin input. Returns stdout as a string.
|
|
4
|
+
* Rejects if the process exits non-zero.
|
|
5
|
+
*/
|
|
6
|
+
function runWithStdin(command, args, stdinInput) {
|
|
7
|
+
return new Promise((resolve, reject) => {
|
|
8
|
+
const child = spawn(command, [...args], { stdio: ['pipe', 'pipe', 'pipe'] });
|
|
9
|
+
let stdout = '';
|
|
10
|
+
let stderr = '';
|
|
11
|
+
child.stdout.on('data', (data) => {
|
|
12
|
+
stdout += data.toString('utf8');
|
|
13
|
+
});
|
|
14
|
+
child.stderr.on('data', (data) => {
|
|
15
|
+
stderr += data.toString('utf8');
|
|
16
|
+
});
|
|
17
|
+
child.on('close', (code) => {
|
|
18
|
+
if (code !== 0) {
|
|
19
|
+
reject(new Error(`${command} failed (exit ${code}): ${stderr.trim()}`));
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
resolve(stdout);
|
|
23
|
+
});
|
|
24
|
+
if (stdinInput !== undefined) {
|
|
25
|
+
child.stdin.write(stdinInput);
|
|
26
|
+
child.stdin.end();
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
child.stdin.end();
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Derive the public key (recipient) from an age identity key via stdin.
|
|
35
|
+
* No temp files — the secret key stays in memory.
|
|
36
|
+
*/
|
|
37
|
+
async function deriveRecipientFromIdentity(identityLine) {
|
|
38
|
+
const stdout = await runWithStdin('age-keygen', ['-y', '/dev/stdin'], identityLine + '\n');
|
|
39
|
+
return stdout.trim();
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Age identity-key-based encryption for zone backups.
|
|
43
|
+
*
|
|
44
|
+
* Uses age public-key encryption: the identity key (AGE-SECRET-KEY-1...)
|
|
45
|
+
* is stored in 1Password per zone. The public key (recipient) is derived
|
|
46
|
+
* at encryption time via age-keygen -y.
|
|
47
|
+
*
|
|
48
|
+
* Secret keys are never written to disk — they're passed via stdin
|
|
49
|
+
* using /dev/stdin as the identity file path.
|
|
50
|
+
*/
|
|
51
|
+
export function createAgeBackupEncryption(dependencies) {
|
|
52
|
+
return {
|
|
53
|
+
encrypt: async (inputPath, outputPath) => {
|
|
54
|
+
const identity = await dependencies.resolveIdentity();
|
|
55
|
+
const recipient = await deriveRecipientFromIdentity(identity);
|
|
56
|
+
await runWithStdin('age', [
|
|
57
|
+
'--encrypt',
|
|
58
|
+
'--recipient',
|
|
59
|
+
recipient,
|
|
60
|
+
'--output',
|
|
61
|
+
outputPath,
|
|
62
|
+
inputPath,
|
|
63
|
+
]);
|
|
64
|
+
},
|
|
65
|
+
decrypt: async (inputPath, outputPath) => {
|
|
66
|
+
const identity = await dependencies.resolveIdentity();
|
|
67
|
+
await runWithStdin('age', ['--decrypt', '--identity', '/dev/stdin', '--output', outputPath, inputPath], identity + '\n');
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=backup-encryption.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup-encryption.js","sourceRoot":"","sources":["../../src/backup/backup-encryption.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAW3C;;;GAGG;AACH,SAAS,YAAY,CACpB,OAAe,EACf,IAAuB,EACvB,UAAmB;IAEnB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACtC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7E,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACxC,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACxC,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YAC1B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBAChB,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,OAAO,iBAAiB,IAAI,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;gBACxE,OAAO;YACR,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC9B,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC9B,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACnB,CAAC;aAAM,CAAC;YACP,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACnB,CAAC;IACF,CAAC,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,2BAA2B,CAAC,YAAoB;IAC9D,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC,CAAC;IAC3F,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,yBAAyB,CACxC,YAAuC;IAEvC,OAAO;QACN,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE;YACxC,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,eAAe,EAAE,CAAC;YACtD,MAAM,SAAS,GAAG,MAAM,2BAA2B,CAAC,QAAQ,CAAC,CAAC;YAC9D,MAAM,YAAY,CAAC,KAAK,EAAE;gBACzB,WAAW;gBACX,aAAa;gBACb,SAAS;gBACT,UAAU;gBACV,UAAU;gBACV,SAAS;aACT,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE;YACxC,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,eAAe,EAAE,CAAC;YACtD,MAAM,YAAY,CACjB,KAAK,EACL,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,EAC5E,QAAQ,GAAG,IAAI,CACf,CAAC;QACH,CAAC;KACD,CAAC;AACH,CAAC"}
|
|
@@ -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,9 @@
|
|
|
1
|
+
export interface DockerImageBuilderDependencies {
|
|
2
|
+
readonly executeCommand?: (command: string, args: readonly string[]) => Promise<void>;
|
|
3
|
+
}
|
|
4
|
+
export interface BuildDockerImageOptions {
|
|
5
|
+
readonly dockerfilePath: string;
|
|
6
|
+
readonly imageTag: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function buildDockerImage(options: BuildDockerImageOptions, dependencies?: DockerImageBuilderDependencies): Promise<void>;
|
|
9
|
+
//# 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,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtF;AAED,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC1B;AASD,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, arguments_) {
|
|
4
|
+
await execa(command, arguments_, { 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 contextDirectory = path.dirname(resolvedDockerfilePath);
|
|
10
|
+
try {
|
|
11
|
+
await executeCommand('docker', [
|
|
12
|
+
'build',
|
|
13
|
+
'-f',
|
|
14
|
+
resolvedDockerfilePath,
|
|
15
|
+
'-t',
|
|
16
|
+
options.imageTag,
|
|
17
|
+
contextDirectory,
|
|
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;AAW9B,KAAK,UAAU,oBAAoB,CAClC,OAAe,EACf,UAA6B;IAE7B,MAAM,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AACxD,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,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAE9D,IAAI,CAAC;QACJ,MAAM,cAAc,CAAC,QAAQ,EAAE;YAC9B,OAAO;YACP,IAAI;YACJ,sBAAsB;YACtB,IAAI;YACJ,OAAO,CAAC,QAAQ;YAChB,gBAAgB;SAChB,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,12 @@
|
|
|
1
|
+
import { type BuildConfig, type BuildImageOptions, type BuildImageResult } from '@shravansunder/agent-vm-gondolin-core';
|
|
2
|
+
export interface GondolinImageBuilderDependencies {
|
|
3
|
+
readonly buildImage?: (options: BuildImageOptions) => Promise<BuildImageResult>;
|
|
4
|
+
readonly loadBuildConfig?: (buildConfigPath: string) => Promise<BuildConfig>;
|
|
5
|
+
}
|
|
6
|
+
export declare function buildGondolinImage(options: {
|
|
7
|
+
readonly buildConfigPath: string;
|
|
8
|
+
readonly cacheDir: string;
|
|
9
|
+
readonly fullReset?: boolean;
|
|
10
|
+
}, dependencies?: GondolinImageBuilderDependencies): Promise<BuildImageResult>;
|
|
11
|
+
export declare function computeFingerprintFromConfigPath(buildConfigPath: string, dependencies?: Pick<GondolinImageBuilderDependencies, 'loadBuildConfig'>): Promise<string>;
|
|
12
|
+
//# 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,uCAAuC,CAAC;AAE/C,MAAM,WAAW,gCAAgC;IAChD,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAChF,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;CAC7E;AAMD,wBAAsB,kBAAkB,CACvC,OAAO,EAAE;IACR,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC7B,EACD,YAAY,GAAE,gCAAqC,GACjD,OAAO,CAAC,gBAAgB,CAAC,CAY3B;AAED,wBAAsB,gCAAgC,CACrD,eAAe,EAAE,MAAM,EACvB,YAAY,GAAE,IAAI,CAAC,gCAAgC,EAAE,iBAAiB,CAAM,GAC1E,OAAO,CAAC,MAAM,CAAC,CAGjB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { buildImage as buildImageFromCore, computeBuildFingerprint, } from '@shravansunder/agent-vm-gondolin-core';
|
|
4
|
+
async function loadBuildConfigFromJson(buildConfigPath) {
|
|
5
|
+
return JSON.parse(await fs.readFile(buildConfigPath, 'utf8'));
|
|
6
|
+
}
|
|
7
|
+
export async function buildGondolinImage(options, dependencies = {}) {
|
|
8
|
+
const loadBuildConfig = dependencies.loadBuildConfig ?? loadBuildConfigFromJson;
|
|
9
|
+
const buildImage = dependencies.buildImage ?? buildImageFromCore;
|
|
10
|
+
const configDirectory = path.dirname(path.resolve(options.buildConfigPath));
|
|
11
|
+
const buildConfig = await loadBuildConfig(options.buildConfigPath);
|
|
12
|
+
return await buildImage({
|
|
13
|
+
buildConfig,
|
|
14
|
+
cacheDir: options.cacheDir,
|
|
15
|
+
configDir: configDirectory,
|
|
16
|
+
...(options.fullReset !== undefined ? { fullReset: options.fullReset } : {}),
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export async function computeFingerprintFromConfigPath(buildConfigPath, dependencies = {}) {
|
|
20
|
+
const loadBuildConfig = dependencies.loadBuildConfig ?? loadBuildConfigFromJson;
|
|
21
|
+
return computeBuildFingerprint(await loadBuildConfig(buildConfigPath));
|
|
22
|
+
}
|
|
23
|
+
//# 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":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EACN,UAAU,IAAI,kBAAkB,EAChC,uBAAuB,GAIvB,MAAM,uCAAuC,CAAC;AAO/C,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,kBAAkB,CACvC,OAIC,EACD,eAAiD,EAAE;IAEnD,MAAM,eAAe,GAAG,YAAY,CAAC,eAAe,IAAI,uBAAuB,CAAC;IAChF,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,IAAI,kBAAkB,CAAC;IACjE,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;IAC5E,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAEnE,OAAO,MAAM,UAAU,CAAC;QACvB,WAAW;QACX,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,SAAS,EAAE,eAAe;QAC1B,GAAG,CAAC,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5E,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACrD,eAAuB,EACvB,eAA0E,EAAE;IAE5E,MAAM,eAAe,GAAG,YAAY,CAAC,eAAe,IAAI,uBAAuB,CAAC;IAChF,OAAO,uBAAuB,CAAC,MAAM,eAAe,CAAC,eAAe,CAAC,CAAC,CAAC;AACxE,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface StaleImageEntry {
|
|
2
|
+
readonly absolutePath: string;
|
|
3
|
+
readonly imageType: 'gateway' | 'tool';
|
|
4
|
+
readonly name: string;
|
|
5
|
+
readonly sizeBytes: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function findStaleImageDirectories(options: {
|
|
8
|
+
readonly cacheDir: string;
|
|
9
|
+
readonly currentFingerprints: {
|
|
10
|
+
readonly gateway: string;
|
|
11
|
+
readonly tool: string;
|
|
12
|
+
};
|
|
13
|
+
}): readonly StaleImageEntry[];
|
|
14
|
+
export declare function deleteStaleImageDirectories(entries: readonly StaleImageEntry[]): void;
|
|
15
|
+
//# sourceMappingURL=stale-image-cleaner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stale-image-cleaner.d.ts","sourceRoot":"","sources":["../../src/build/stale-image-cleaner.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC3B;AAoBD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IAClD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,mBAAmB,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAClF,GAAG,SAAS,eAAe,EAAE,CA2B7B;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,GAAG,IAAI,CAIrF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
function getDirectorySizeBytes(directoryPath) {
|
|
4
|
+
let totalSizeBytes = 0;
|
|
5
|
+
try {
|
|
6
|
+
for (const entry of fs.readdirSync(directoryPath, { withFileTypes: true })) {
|
|
7
|
+
if (!entry.isFile()) {
|
|
8
|
+
continue;
|
|
9
|
+
}
|
|
10
|
+
totalSizeBytes += fs.statSync(path.join(directoryPath, entry.name)).size;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return 0;
|
|
15
|
+
}
|
|
16
|
+
return totalSizeBytes;
|
|
17
|
+
}
|
|
18
|
+
export function findStaleImageDirectories(options) {
|
|
19
|
+
const staleEntries = [];
|
|
20
|
+
for (const imageType of ['gateway', 'tool']) {
|
|
21
|
+
const typeDirectory = path.join(options.cacheDir, 'images', imageType);
|
|
22
|
+
if (!fs.existsSync(typeDirectory)) {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const currentFingerprint = options.currentFingerprints[imageType];
|
|
26
|
+
for (const entry of fs.readdirSync(typeDirectory, { withFileTypes: true })) {
|
|
27
|
+
if (!entry.isDirectory() || entry.name === currentFingerprint) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
const absolutePath = path.join(typeDirectory, entry.name);
|
|
31
|
+
staleEntries.push({
|
|
32
|
+
absolutePath,
|
|
33
|
+
imageType,
|
|
34
|
+
name: entry.name,
|
|
35
|
+
sizeBytes: getDirectorySizeBytes(absolutePath),
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return staleEntries;
|
|
40
|
+
}
|
|
41
|
+
export function deleteStaleImageDirectories(entries) {
|
|
42
|
+
for (const entry of entries) {
|
|
43
|
+
fs.rmSync(entry.absolutePath, { recursive: true, force: true });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=stale-image-cleaner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stale-image-cleaner.js","sourceRoot":"","sources":["../../src/build/stale-image-cleaner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAS7B,SAAS,qBAAqB,CAAC,aAAqB;IACnD,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,IAAI,CAAC;QACJ,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,aAAa,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC5E,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBACrB,SAAS;YACV,CAAC;YAED,cAAc,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1E,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,CAAC,CAAC;IACV,CAAC;IAED,OAAO,cAAc,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAGzC;IACA,MAAM,YAAY,GAAsB,EAAE,CAAC;IAE3C,KAAK,MAAM,SAAS,IAAI,CAAC,SAAS,EAAE,MAAM,CAAU,EAAE,CAAC;QACtD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QACvE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YACnC,SAAS;QACV,CAAC;QAED,MAAM,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAElE,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,aAAa,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC5E,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBAC/D,SAAS;YACV,CAAC;YAED,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC1D,YAAY,CAAC,IAAI,CAAC;gBACjB,YAAY;gBACZ,SAAS;gBACT,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,SAAS,EAAE,qBAAqB,CAAC,YAAY,CAAC;aAC9C,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAED,OAAO,YAAY,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,OAAmC;IAC9E,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC7B,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { SecretResolver } from '@shravansunder/agent-vm-gondolin-core';
|
|
2
|
+
import { createOpCliSecretResolver, resolveServiceAccountToken } from '@shravansunder/agent-vm-gondolin-core';
|
|
3
|
+
import { createAgeBackupEncryption } from '../backup/backup-encryption.js';
|
|
4
|
+
import { createZoneBackupManager } from '../backup/backup-manager.js';
|
|
5
|
+
import { loadSystemConfig, type SystemConfig } from '../config/system-config.js';
|
|
6
|
+
import type { ControllerRuntimeDependencies } from '../controller/controller-runtime-types.js';
|
|
7
|
+
import { createControllerClient } from '../controller/http/controller-client.js';
|
|
8
|
+
import { startGatewayZone } from '../gateway/gateway-zone-orchestrator.js';
|
|
9
|
+
import { buildControllerStatus } from '../operations/controller-status.js';
|
|
10
|
+
import { runControllerDoctor } from '../operations/doctor.js';
|
|
11
|
+
import { runBuildCommand } from './build-command.js';
|
|
12
|
+
import { runCacheCommand } from './cache-commands.js';
|
|
13
|
+
import { type GatewayType, type ScaffoldAgentVmProjectResult } from './init-command.js';
|
|
14
|
+
export interface CliDependencies {
|
|
15
|
+
readonly buildControllerStatus: typeof buildControllerStatus;
|
|
16
|
+
readonly createAgeBackupEncryption: typeof createAgeBackupEncryption;
|
|
17
|
+
readonly createControllerClient: typeof createControllerClient;
|
|
18
|
+
readonly createSecretResolver: typeof createOpCliSecretResolver;
|
|
19
|
+
readonly createZoneBackupManager: typeof createZoneBackupManager;
|
|
20
|
+
readonly getCurrentWorkingDirectory?: () => string;
|
|
21
|
+
readonly isGatewayImageCached?: (systemConfig: SystemConfig) => Promise<boolean>;
|
|
22
|
+
readonly loadSystemConfig: typeof loadSystemConfig;
|
|
23
|
+
readonly runBuildCommand?: typeof runBuildCommand;
|
|
24
|
+
readonly runCacheCommand?: typeof runCacheCommand;
|
|
25
|
+
readonly runCommand?: (command: string, arguments_: readonly string[]) => Promise<{
|
|
26
|
+
readonly exitCode: number;
|
|
27
|
+
readonly stderr: string;
|
|
28
|
+
readonly stdout: string;
|
|
29
|
+
}>;
|
|
30
|
+
readonly runInteractiveProcess?: (command: string, arguments_: readonly string[]) => Promise<void>;
|
|
31
|
+
readonly resolveServiceAccountToken: typeof resolveServiceAccountToken;
|
|
32
|
+
readonly runControllerDoctor: typeof runControllerDoctor;
|
|
33
|
+
readonly promptAndStoreServiceAccountToken?: () => Promise<boolean>;
|
|
34
|
+
readonly scaffoldAgentVmProject?: (options: {
|
|
35
|
+
readonly gatewayType: GatewayType;
|
|
36
|
+
readonly targetDir: string;
|
|
37
|
+
readonly zoneId: string;
|
|
38
|
+
}) => Promise<ScaffoldAgentVmProjectResult>;
|
|
39
|
+
readonly startControllerRuntime: (options: {
|
|
40
|
+
readonly systemConfig: SystemConfig;
|
|
41
|
+
readonly zoneId: string;
|
|
42
|
+
}, runtimeDependencies?: ControllerRuntimeDependencies) => Promise<{
|
|
43
|
+
readonly controllerPort: number;
|
|
44
|
+
readonly gateway: {
|
|
45
|
+
readonly ingress: {
|
|
46
|
+
readonly host: string;
|
|
47
|
+
readonly port: number;
|
|
48
|
+
};
|
|
49
|
+
readonly vm: {
|
|
50
|
+
readonly id: string;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
}>;
|
|
54
|
+
readonly startGatewayZone: typeof startGatewayZone;
|
|
55
|
+
}
|
|
56
|
+
export interface CliIo {
|
|
57
|
+
readonly stderr: Pick<NodeJS.WriteStream, 'write'>;
|
|
58
|
+
readonly stdout: Pick<NodeJS.WriteStream, 'write'>;
|
|
59
|
+
}
|
|
60
|
+
export declare const defaultCliDependencies: CliDependencies;
|
|
61
|
+
export declare function writeJson(io: CliIo, value: unknown): void;
|
|
62
|
+
export declare function resolveConfigPath(argv: readonly string[]): string;
|
|
63
|
+
export declare function readZoneFlag(argv: readonly string[]): string | undefined;
|
|
64
|
+
export declare function resolveControllerBaseUrl(systemConfig: SystemConfig): string;
|
|
65
|
+
export declare function findZone(systemConfig: SystemConfig, zoneId: string): SystemConfig['zones'][number];
|
|
66
|
+
export declare function requireZone(systemConfig: SystemConfig, zoneFlag: string | undefined): SystemConfig['zones'][number];
|
|
67
|
+
export declare function createResolverFromSystemConfig(systemConfig: SystemConfig, dependencies: Pick<CliDependencies, 'createSecretResolver' | 'resolveServiceAccountToken'>): Promise<SecretResolver>;
|
|
68
|
+
//# sourceMappingURL=agent-vm-cli-support.d.ts.map
|