@agent-vm/agent-vm 0.0.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/backup/backup-archive-layout.d.ts +15 -0
- package/dist/backup/backup-archive-layout.d.ts.map +1 -0
- package/dist/backup/backup-archive-layout.js +34 -0
- package/dist/backup/backup-archive-layout.js.map +1 -0
- package/dist/backup/backup-create-operation.d.ts +9 -0
- package/dist/backup/backup-create-operation.d.ts.map +1 -0
- package/dist/backup/backup-create-operation.js +50 -0
- package/dist/backup/backup-create-operation.js.map +1 -0
- package/dist/backup/backup-encryption.d.ts +20 -0
- package/dist/backup/backup-encryption.d.ts.map +1 -0
- package/dist/backup/backup-encryption.js +93 -0
- package/dist/backup/backup-encryption.js.map +1 -0
- package/dist/backup/backup-manager.d.ts +42 -0
- package/dist/backup/backup-manager.d.ts.map +1 -0
- package/dist/backup/backup-manager.js +37 -0
- package/dist/backup/backup-manager.js.map +1 -0
- package/dist/backup/backup-restore-operation.d.ts +8 -0
- package/dist/backup/backup-restore-operation.d.ts.map +1 -0
- package/dist/backup/backup-restore-operation.js +53 -0
- package/dist/backup/backup-restore-operation.js.map +1 -0
- package/dist/build/docker-image-builder.d.ts +11 -0
- package/dist/build/docker-image-builder.d.ts.map +1 -0
- package/dist/build/docker-image-builder.js +24 -0
- package/dist/build/docker-image-builder.js.map +1 -0
- package/dist/build/gondolin-image-builder.d.ts +16 -0
- package/dist/build/gondolin-image-builder.d.ts.map +1 -0
- package/dist/build/gondolin-image-builder.js +52 -0
- package/dist/build/gondolin-image-builder.js.map +1 -0
- package/dist/build/runtime-versions.d.ts +13 -0
- package/dist/build/runtime-versions.d.ts.map +1 -0
- package/dist/build/runtime-versions.js +100 -0
- package/dist/build/runtime-versions.js.map +1 -0
- package/dist/build/stale-image-cleaner.d.ts +17 -0
- package/dist/build/stale-image-cleaner.d.ts.map +1 -0
- package/dist/build/stale-image-cleaner.js +70 -0
- package/dist/build/stale-image-cleaner.js.map +1 -0
- package/dist/cli/agent-vm-cli-support.d.ts +78 -0
- package/dist/cli/agent-vm-cli-support.d.ts.map +1 -0
- package/dist/cli/agent-vm-cli-support.js +77 -0
- package/dist/cli/agent-vm-cli-support.js.map +1 -0
- package/dist/cli/agent-vm-entrypoint.d.ts +9 -0
- package/dist/cli/agent-vm-entrypoint.d.ts.map +1 -0
- package/dist/cli/agent-vm-entrypoint.js +59 -0
- package/dist/cli/agent-vm-entrypoint.js.map +1 -0
- package/dist/cli/auth-interactive-command.d.ts +27 -0
- package/dist/cli/auth-interactive-command.d.ts.map +1 -0
- package/dist/cli/auth-interactive-command.js +83 -0
- package/dist/cli/auth-interactive-command.js.map +1 -0
- package/dist/cli/backup-commands.d.ts +11 -0
- package/dist/cli/backup-commands.d.ts.map +1 -0
- package/dist/cli/backup-commands.js +46 -0
- package/dist/cli/backup-commands.js.map +1 -0
- package/dist/cli/build-command.d.ts +24 -0
- package/dist/cli/build-command.d.ts.map +1 -0
- package/dist/cli/build-command.js +132 -0
- package/dist/cli/build-command.js.map +1 -0
- package/dist/cli/cache-commands.d.ts +32 -0
- package/dist/cli/cache-commands.d.ts.map +1 -0
- package/dist/cli/cache-commands.js +106 -0
- package/dist/cli/cache-commands.js.map +1 -0
- package/dist/cli/commands/auth-interactive-definition.d.ts +15 -0
- package/dist/cli/commands/auth-interactive-definition.d.ts.map +1 -0
- package/dist/cli/commands/auth-interactive-definition.js +36 -0
- package/dist/cli/commands/auth-interactive-definition.js.map +1 -0
- package/dist/cli/commands/backup-definition.d.ts +63 -0
- package/dist/cli/commands/backup-definition.d.ts.map +1 -0
- package/dist/cli/commands/backup-definition.js +73 -0
- package/dist/cli/commands/backup-definition.js.map +1 -0
- package/dist/cli/commands/build-definition.d.ts +13 -0
- package/dist/cli/commands/build-definition.d.ts.map +1 -0
- package/dist/cli/commands/build-definition.js +27 -0
- package/dist/cli/commands/build-definition.js.map +1 -0
- package/dist/cli/commands/cache-definition.d.ts +41 -0
- package/dist/cli/commands/cache-definition.d.ts.map +1 -0
- package/dist/cli/commands/cache-definition.js +41 -0
- package/dist/cli/commands/cache-definition.js.map +1 -0
- package/dist/cli/commands/command-definition-support.d.ts +26 -0
- package/dist/cli/commands/command-definition-support.d.ts.map +1 -0
- package/dist/cli/commands/command-definition-support.js +85 -0
- package/dist/cli/commands/command-definition-support.js.map +1 -0
- package/dist/cli/commands/config-definition.d.ts +27 -0
- package/dist/cli/commands/config-definition.d.ts.map +1 -0
- package/dist/cli/commands/config-definition.js +60 -0
- package/dist/cli/commands/config-definition.js.map +1 -0
- package/dist/cli/commands/controller-definition.d.ts +225 -0
- package/dist/cli/commands/controller-definition.d.ts.map +1 -0
- package/dist/cli/commands/controller-definition.js +211 -0
- package/dist/cli/commands/controller-definition.js.map +1 -0
- package/dist/cli/commands/create-app.d.ts +541 -0
- package/dist/cli/commands/create-app.d.ts.map +1 -0
- package/dist/cli/commands/create-app.js +32 -0
- package/dist/cli/commands/create-app.js.map +1 -0
- package/dist/cli/commands/doctor-definition.d.ts +11 -0
- package/dist/cli/commands/doctor-definition.d.ts.map +1 -0
- package/dist/cli/commands/doctor-definition.js +23 -0
- package/dist/cli/commands/doctor-definition.js.map +1 -0
- package/dist/cli/commands/init-definition.d.ts +34 -0
- package/dist/cli/commands/init-definition.d.ts.map +1 -0
- package/dist/cli/commands/init-definition.js +134 -0
- package/dist/cli/commands/init-definition.js.map +1 -0
- package/dist/cli/commands/resources-definition.d.ts +55 -0
- package/dist/cli/commands/resources-definition.d.ts.map +1 -0
- package/dist/cli/commands/resources-definition.js +93 -0
- package/dist/cli/commands/resources-definition.js.map +1 -0
- package/dist/cli/commands/validate-definition.d.ts +11 -0
- package/dist/cli/commands/validate-definition.d.ts.map +1 -0
- package/dist/cli/commands/validate-definition.js +20 -0
- package/dist/cli/commands/validate-definition.js.map +1 -0
- package/dist/cli/config-commands.d.ts +10 -0
- package/dist/cli/config-commands.d.ts.map +1 -0
- package/dist/cli/config-commands.js +103 -0
- package/dist/cli/config-commands.js.map +1 -0
- package/dist/cli/controller-operation-commands.d.ts +12 -0
- package/dist/cli/controller-operation-commands.d.ts.map +1 -0
- package/dist/cli/controller-operation-commands.js +133 -0
- package/dist/cli/controller-operation-commands.js.map +1 -0
- package/dist/cli/format-zod-error.d.ts +3 -0
- package/dist/cli/format-zod-error.d.ts.map +1 -0
- package/dist/cli/format-zod-error.js +18 -0
- package/dist/cli/format-zod-error.js.map +1 -0
- package/dist/cli/init-command.d.ts +52 -0
- package/dist/cli/init-command.d.ts.map +1 -0
- package/dist/cli/init-command.js +645 -0
- package/dist/cli/init-command.js.map +1 -0
- package/dist/cli/keychain-credential.d.ts +19 -0
- package/dist/cli/keychain-credential.d.ts.map +1 -0
- package/dist/cli/keychain-credential.js +52 -0
- package/dist/cli/keychain-credential.js.map +1 -0
- package/dist/cli/lease-commands.d.ts +11 -0
- package/dist/cli/lease-commands.d.ts.map +1 -0
- package/dist/cli/lease-commands.js +22 -0
- package/dist/cli/lease-commands.js.map +1 -0
- package/dist/cli/openclaw-plugin-bundle.d.ts +10 -0
- package/dist/cli/openclaw-plugin-bundle.d.ts.map +1 -0
- package/dist/cli/openclaw-plugin-bundle.js +37 -0
- package/dist/cli/openclaw-plugin-bundle.js.map +1 -0
- package/dist/cli/resource-contract-templates.d.ts +8 -0
- package/dist/cli/resource-contract-templates.d.ts.map +1 -0
- package/dist/cli/resource-contract-templates.js +157 -0
- package/dist/cli/resource-contract-templates.js.map +1 -0
- package/dist/cli/resources-commands.d.ts +19 -0
- package/dist/cli/resources-commands.d.ts.map +1 -0
- package/dist/cli/resources-commands.js +158 -0
- package/dist/cli/resources-commands.js.map +1 -0
- package/dist/cli/run-task.d.ts +4 -0
- package/dist/cli/run-task.d.ts.map +1 -0
- package/dist/cli/run-task.js +17 -0
- package/dist/cli/run-task.js.map +1 -0
- package/dist/cli/ssh-commands.d.ts +20 -0
- package/dist/cli/ssh-commands.d.ts.map +1 -0
- package/dist/cli/ssh-commands.js +72 -0
- package/dist/cli/ssh-commands.js.map +1 -0
- package/dist/cli/vm-host-system-templates.d.ts +12 -0
- package/dist/cli/vm-host-system-templates.d.ts.map +1 -0
- package/dist/cli/vm-host-system-templates.js +186 -0
- package/dist/cli/vm-host-system-templates.js.map +1 -0
- package/dist/config/resource-contracts/index.d.ts +3 -0
- package/dist/config/resource-contracts/index.d.ts.map +1 -0
- package/dist/config/resource-contracts/index.js +2 -0
- package/dist/config/resource-contracts/index.js.map +1 -0
- package/dist/config/resource-contracts/repo-resource-contract-types.d.ts +110 -0
- package/dist/config/resource-contracts/repo-resource-contract-types.d.ts.map +1 -0
- package/dist/config/resource-contracts/repo-resource-contract-types.js +2 -0
- package/dist/config/resource-contracts/repo-resource-contract-types.js.map +1 -0
- package/dist/config/resource-contracts/resource-contract-schemas.d.ts +198 -0
- package/dist/config/resource-contracts/resource-contract-schemas.d.ts.map +1 -0
- package/dist/config/resource-contracts/resource-contract-schemas.js +163 -0
- package/dist/config/resource-contracts/resource-contract-schemas.js.map +1 -0
- package/dist/config/system-cache-identifier.d.ts +22 -0
- package/dist/config/system-cache-identifier.d.ts.map +1 -0
- package/dist/config/system-cache-identifier.js +49 -0
- package/dist/config/system-cache-identifier.js.map +1 -0
- package/dist/config/system-config.d.ts +111 -0
- package/dist/config/system-config.d.ts.map +1 -0
- package/dist/config/system-config.js +267 -0
- package/dist/config/system-config.js.map +1 -0
- package/dist/controller/active-task-registry.d.ts +32 -0
- package/dist/controller/active-task-registry.d.ts.map +1 -0
- package/dist/controller/active-task-registry.js +83 -0
- package/dist/controller/active-task-registry.js.map +1 -0
- package/dist/controller/composite-secret-resolver.d.ts +3 -0
- package/dist/controller/composite-secret-resolver.d.ts.map +1 -0
- package/dist/controller/composite-secret-resolver.js +38 -0
- package/dist/controller/composite-secret-resolver.js.map +1 -0
- package/dist/controller/controller-runtime-operations.d.ts +62 -0
- package/dist/controller/controller-runtime-operations.d.ts.map +1 -0
- package/dist/controller/controller-runtime-operations.js +99 -0
- package/dist/controller/controller-runtime-operations.js.map +1 -0
- package/dist/controller/controller-runtime-support.d.ts +10 -0
- package/dist/controller/controller-runtime-support.d.ts.map +1 -0
- package/dist/controller/controller-runtime-support.js +36 -0
- package/dist/controller/controller-runtime-support.js.map +1 -0
- package/dist/controller/controller-runtime-types.d.ts +58 -0
- package/dist/controller/controller-runtime-types.d.ts.map +1 -0
- package/dist/controller/controller-runtime-types.js +2 -0
- package/dist/controller/controller-runtime-types.js.map +1 -0
- package/dist/controller/controller-runtime.d.ts +3 -0
- package/dist/controller/controller-runtime.d.ts.map +1 -0
- package/dist/controller/controller-runtime.js +326 -0
- package/dist/controller/controller-runtime.js.map +1 -0
- package/dist/controller/git-auth-support.d.ts +3 -0
- package/dist/controller/git-auth-support.d.ts.map +1 -0
- package/dist/controller/git-auth-support.js +11 -0
- package/dist/controller/git-auth-support.js.map +1 -0
- package/dist/controller/git-pull-default-operations.d.ts +34 -0
- package/dist/controller/git-pull-default-operations.d.ts.map +1 -0
- package/dist/controller/git-pull-default-operations.js +175 -0
- package/dist/controller/git-pull-default-operations.js.map +1 -0
- package/dist/controller/git-push-operations.d.ts +38 -0
- package/dist/controller/git-push-operations.d.ts.map +1 -0
- package/dist/controller/git-push-operations.js +247 -0
- package/dist/controller/git-push-operations.js.map +1 -0
- package/dist/controller/heartbeat-sender.d.ts +13 -0
- package/dist/controller/heartbeat-sender.d.ts.map +1 -0
- package/dist/controller/heartbeat-sender.js +94 -0
- package/dist/controller/heartbeat-sender.js.map +1 -0
- package/dist/controller/http/controller-client.d.ts +17 -0
- package/dist/controller/http/controller-client.d.ts.map +1 -0
- package/dist/controller/http/controller-client.js +76 -0
- package/dist/controller/http/controller-client.js.map +1 -0
- package/dist/controller/http/controller-http-route-support.d.ts +46 -0
- package/dist/controller/http/controller-http-route-support.d.ts.map +1 -0
- package/dist/controller/http/controller-http-route-support.js +25 -0
- package/dist/controller/http/controller-http-route-support.js.map +1 -0
- package/dist/controller/http/controller-http-routes.d.ts +22 -0
- package/dist/controller/http/controller-http-routes.d.ts.map +1 -0
- package/dist/controller/http/controller-http-routes.js +107 -0
- package/dist/controller/http/controller-http-routes.js.map +1 -0
- package/dist/controller/http/controller-http-server.d.ts +8 -0
- package/dist/controller/http/controller-http-server.d.ts.map +1 -0
- package/dist/controller/http/controller-http-server.js +21 -0
- package/dist/controller/http/controller-http-server.js.map +1 -0
- package/dist/controller/http/controller-request-schemas.d.ts +102 -0
- package/dist/controller/http/controller-request-schemas.d.ts.map +1 -0
- package/dist/controller/http/controller-request-schemas.js +66 -0
- package/dist/controller/http/controller-request-schemas.js.map +1 -0
- package/dist/controller/http/controller-zone-operation-routes.d.ts +4 -0
- package/dist/controller/http/controller-zone-operation-routes.d.ts.map +1 -0
- package/dist/controller/http/controller-zone-operation-routes.js +223 -0
- package/dist/controller/http/controller-zone-operation-routes.js.map +1 -0
- package/dist/controller/leases/idle-reaper.d.ts +12 -0
- package/dist/controller/leases/idle-reaper.d.ts.map +1 -0
- package/dist/controller/leases/idle-reaper.js +15 -0
- package/dist/controller/leases/idle-reaper.js.map +1 -0
- package/dist/controller/leases/lease-manager.d.ts +58 -0
- package/dist/controller/leases/lease-manager.d.ts.map +1 -0
- package/dist/controller/leases/lease-manager.js +81 -0
- package/dist/controller/leases/lease-manager.js.map +1 -0
- package/dist/controller/leases/tcp-pool.d.ts +11 -0
- package/dist/controller/leases/tcp-pool.d.ts.map +1 -0
- package/dist/controller/leases/tcp-pool.js +26 -0
- package/dist/controller/leases/tcp-pool.js.map +1 -0
- package/dist/controller/request-heartbeat-registry.d.ts +15 -0
- package/dist/controller/request-heartbeat-registry.d.ts.map +1 -0
- package/dist/controller/request-heartbeat-registry.js +54 -0
- package/dist/controller/request-heartbeat-registry.js.map +1 -0
- package/dist/controller/task-config-builder.d.ts +14 -0
- package/dist/controller/task-config-builder.d.ts.map +1 -0
- package/dist/controller/task-config-builder.js +14 -0
- package/dist/controller/task-config-builder.js.map +1 -0
- package/dist/controller/task-state-reader.d.ts +17 -0
- package/dist/controller/task-state-reader.d.ts.map +1 -0
- package/dist/controller/task-state-reader.js +87 -0
- package/dist/controller/task-state-reader.js.map +1 -0
- package/dist/controller/worker-task-runner.d.ts +67 -0
- package/dist/controller/worker-task-runner.d.ts.map +1 -0
- package/dist/controller/worker-task-runner.js +497 -0
- package/dist/controller/worker-task-runner.js.map +1 -0
- package/dist/gateway/credential-manager.d.ts +8 -0
- package/dist/gateway/credential-manager.d.ts.map +1 -0
- package/dist/gateway/credential-manager.js +65 -0
- package/dist/gateway/credential-manager.js.map +1 -0
- package/dist/gateway/gateway-image-builder.d.ts +14 -0
- package/dist/gateway/gateway-image-builder.d.ts.map +1 -0
- package/dist/gateway/gateway-image-builder.js +33 -0
- package/dist/gateway/gateway-image-builder.js.map +1 -0
- package/dist/gateway/gateway-lifecycle-loader.d.ts +3 -0
- package/dist/gateway/gateway-lifecycle-loader.d.ts.map +1 -0
- package/dist/gateway/gateway-lifecycle-loader.js +10 -0
- package/dist/gateway/gateway-lifecycle-loader.js.map +1 -0
- package/dist/gateway/gateway-recovery.d.ts +19 -0
- package/dist/gateway/gateway-recovery.d.ts.map +1 -0
- package/dist/gateway/gateway-recovery.js +147 -0
- package/dist/gateway/gateway-recovery.js.map +1 -0
- package/dist/gateway/gateway-runtime-record.d.ts +33 -0
- package/dist/gateway/gateway-runtime-record.d.ts.map +1 -0
- package/dist/gateway/gateway-runtime-record.js +114 -0
- package/dist/gateway/gateway-runtime-record.js.map +1 -0
- package/dist/gateway/gateway-zone-orchestrator.d.ts +14 -0
- package/dist/gateway/gateway-zone-orchestrator.d.ts.map +1 -0
- package/dist/gateway/gateway-zone-orchestrator.js +161 -0
- package/dist/gateway/gateway-zone-orchestrator.js.map +1 -0
- package/dist/gateway/gateway-zone-support.d.ts +55 -0
- package/dist/gateway/gateway-zone-support.d.ts.map +1 -0
- package/dist/gateway/gateway-zone-support.js +42 -0
- package/dist/gateway/gateway-zone-support.js.map +1 -0
- package/dist/gateway-api-client/gateway-api-client.d.ts +34 -0
- package/dist/gateway-api-client/gateway-api-client.d.ts.map +1 -0
- package/dist/gateway-api-client/gateway-api-client.js +29 -0
- package/dist/gateway-api-client/gateway-api-client.js.map +1 -0
- package/dist/gateway-api-client/gateway-websocket-client.d.ts +45 -0
- package/dist/gateway-api-client/gateway-websocket-client.d.ts.map +1 -0
- package/dist/gateway-api-client/gateway-websocket-client.js +140 -0
- package/dist/gateway-api-client/gateway-websocket-client.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/operations/config-validation.d.ts +15 -0
- package/dist/operations/config-validation.d.ts.map +1 -0
- package/dist/operations/config-validation.js +126 -0
- package/dist/operations/config-validation.js.map +1 -0
- package/dist/operations/controller-status.d.ts +13 -0
- package/dist/operations/controller-status.d.ts.map +1 -0
- package/dist/operations/controller-status.js +13 -0
- package/dist/operations/controller-status.js.map +1 -0
- package/dist/operations/credentials-refresh.d.ts +10 -0
- package/dist/operations/credentials-refresh.d.ts.map +1 -0
- package/dist/operations/credentials-refresh.js +9 -0
- package/dist/operations/credentials-refresh.js.map +1 -0
- package/dist/operations/destroy-zone.d.ts +14 -0
- package/dist/operations/destroy-zone.d.ts.map +1 -0
- package/dist/operations/destroy-zone.js +19 -0
- package/dist/operations/destroy-zone.js.map +1 -0
- package/dist/operations/doctor.d.ts +23 -0
- package/dist/operations/doctor.d.ts.map +1 -0
- package/dist/operations/doctor.js +148 -0
- package/dist/operations/doctor.js.map +1 -0
- package/dist/operations/upgrade-zone.d.ts +12 -0
- package/dist/operations/upgrade-zone.d.ts.map +1 -0
- package/dist/operations/upgrade-zone.js +10 -0
- package/dist/operations/upgrade-zone.js.map +1 -0
- package/dist/operations/zone-logs.d.ts +9 -0
- package/dist/operations/zone-logs.d.ts.map +1 -0
- package/dist/operations/zone-logs.js +7 -0
- package/dist/operations/zone-logs.js.map +1 -0
- package/dist/resources/repo-resource-contract-loader.d.ts +12 -0
- package/dist/resources/repo-resource-contract-loader.d.ts.map +1 -0
- package/dist/resources/repo-resource-contract-loader.js +100 -0
- package/dist/resources/repo-resource-contract-loader.js.map +1 -0
- package/dist/resources/repo-resource-provider-runner.d.ts +32 -0
- package/dist/resources/repo-resource-provider-runner.d.ts.map +1 -0
- package/dist/resources/repo-resource-provider-runner.js +415 -0
- package/dist/resources/repo-resource-provider-runner.js.map +1 -0
- package/dist/resources/resource-compiler.d.ts +18 -0
- package/dist/resources/resource-compiler.d.ts.map +1 -0
- package/dist/resources/resource-compiler.js +51 -0
- package/dist/resources/resource-compiler.js.map +1 -0
- package/dist/resources/resource-resolver.d.ts +25 -0
- package/dist/resources/resource-resolver.d.ts.map +1 -0
- package/dist/resources/resource-resolver.js +90 -0
- package/dist/resources/resource-resolver.js.map +1 -0
- package/dist/runtime/project-namespace.d.ts +5 -0
- package/dist/runtime/project-namespace.d.ts.map +1 -0
- package/dist/runtime/project-namespace.js +22 -0
- package/dist/runtime/project-namespace.js.map +1 -0
- package/dist/shared/run-task.d.ts +3 -0
- package/dist/shared/run-task.d.ts.map +1 -0
- package/dist/shared/run-task.js +12 -0
- package/dist/shared/run-task.js.map +1 -0
- package/dist/tool-vm/tool-vm-lifecycle.d.ts +28 -0
- package/dist/tool-vm/tool-vm-lifecycle.d.ts.map +1 -0
- package/dist/tool-vm/tool-vm-lifecycle.js +60 -0
- package/dist/tool-vm/tool-vm-lifecycle.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { execa } from 'execa';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { finalizeRepoResourceSetupInSubprocess } from './repo-resource-contract-loader.js';
|
|
6
|
+
const DOCKER_COMPOSE_TIMEOUT_MS = 120_000;
|
|
7
|
+
const DOCKER_INSPECT_TIMEOUT_MS = 30_000;
|
|
8
|
+
const REPO_SETUP_TIMEOUT_MS = 120_000;
|
|
9
|
+
const SAFE_REPO_SUBPROCESS_ENV_KEYS = [
|
|
10
|
+
'DOCKER_CONFIG',
|
|
11
|
+
'DOCKER_CONTEXT',
|
|
12
|
+
'DOCKER_HOST',
|
|
13
|
+
'PATH',
|
|
14
|
+
'XDG_RUNTIME_DIR',
|
|
15
|
+
];
|
|
16
|
+
const dockerInspectContainerSchema = z.object({
|
|
17
|
+
Config: z
|
|
18
|
+
.object({
|
|
19
|
+
ExposedPorts: z.record(z.string(), z.unknown()).optional(),
|
|
20
|
+
Labels: z.record(z.string(), z.string()).optional(),
|
|
21
|
+
})
|
|
22
|
+
.optional(),
|
|
23
|
+
NetworkSettings: z
|
|
24
|
+
.object({
|
|
25
|
+
Networks: z
|
|
26
|
+
.record(z.string(), z.object({
|
|
27
|
+
IPAddress: z.string().optional(),
|
|
28
|
+
}))
|
|
29
|
+
.optional(),
|
|
30
|
+
})
|
|
31
|
+
.optional(),
|
|
32
|
+
});
|
|
33
|
+
const dockerInspectResultSchema = z.array(dockerInspectContainerSchema);
|
|
34
|
+
const dockerComposeConfigSchema = z
|
|
35
|
+
.object({
|
|
36
|
+
services: z
|
|
37
|
+
.record(z.string(), z
|
|
38
|
+
.object({
|
|
39
|
+
ports: z.array(z.unknown()).optional(),
|
|
40
|
+
})
|
|
41
|
+
.passthrough())
|
|
42
|
+
.optional(),
|
|
43
|
+
})
|
|
44
|
+
.passthrough();
|
|
45
|
+
function buildRepoSubprocessEnv(extraEnv = {}) {
|
|
46
|
+
// Repo setup scripts are task-controlled code. Keep Docker/PATH plumbing
|
|
47
|
+
// but do not inherit controller secrets or unrelated host environment.
|
|
48
|
+
const environment = {};
|
|
49
|
+
for (const key of SAFE_REPO_SUBPROCESS_ENV_KEYS) {
|
|
50
|
+
const value = process.env[key];
|
|
51
|
+
if (value) {
|
|
52
|
+
environment[key] = value;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return { ...environment, ...extraEnv };
|
|
56
|
+
}
|
|
57
|
+
async function runDockerCommand(options) {
|
|
58
|
+
const result = await execa('docker', options.args, {
|
|
59
|
+
cwd: options.cwd,
|
|
60
|
+
env: buildRepoSubprocessEnv(),
|
|
61
|
+
extendEnv: false,
|
|
62
|
+
reject: true,
|
|
63
|
+
timeout: options.timeoutMs,
|
|
64
|
+
});
|
|
65
|
+
if (typeof result.stdout !== 'string') {
|
|
66
|
+
throw new Error(`Docker command '${options.args.join(' ')}' returned non-string stdout.`);
|
|
67
|
+
}
|
|
68
|
+
return { stdout: result.stdout };
|
|
69
|
+
}
|
|
70
|
+
async function runRepoSetupCommand(options) {
|
|
71
|
+
const result = await execa(options.command, options.args, {
|
|
72
|
+
cwd: options.cwd,
|
|
73
|
+
env: buildRepoSubprocessEnv({
|
|
74
|
+
COMPOSE_PROJECT_NAME: options.composeProjectName,
|
|
75
|
+
RESOURCE_OUTPUT_DIR: options.outputDir,
|
|
76
|
+
}),
|
|
77
|
+
extendEnv: false,
|
|
78
|
+
reject: true,
|
|
79
|
+
timeout: REPO_SETUP_TIMEOUT_MS,
|
|
80
|
+
});
|
|
81
|
+
if (typeof result.stdout !== 'string') {
|
|
82
|
+
throw new Error(`Repo setup command '${options.command}' returned non-string stdout.`);
|
|
83
|
+
}
|
|
84
|
+
return { stdout: result.stdout };
|
|
85
|
+
}
|
|
86
|
+
function getSingleContainerIp(options) {
|
|
87
|
+
const networkIps = Object.values(options.container.NetworkSettings?.Networks ?? {})
|
|
88
|
+
.map((network) => network?.IPAddress)
|
|
89
|
+
.filter((ipAddress) => Boolean(ipAddress));
|
|
90
|
+
if (networkIps.length === 0) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
if (networkIps.length !== 1) {
|
|
94
|
+
throw new Error(`Compose service '${options.service}' in project '${options.composeProjectName}' must be attached to exactly one Docker network with an IP; found ${String(networkIps.length)}.`);
|
|
95
|
+
}
|
|
96
|
+
return networkIps[0] ?? null;
|
|
97
|
+
}
|
|
98
|
+
function buildComposeProjectName(taskId, repoId) {
|
|
99
|
+
// Architecture note: this currently uses the worker task id only as a
|
|
100
|
+
// temporary per-run namespace. Resource task segregation is not a complete
|
|
101
|
+
// first-class model yet; when resources get their own lifecycle, replace
|
|
102
|
+
// this with an explicit resource namespace/id instead of overloading taskId.
|
|
103
|
+
return `agent-vm-${taskId}-${repoId}`;
|
|
104
|
+
}
|
|
105
|
+
function buildCleanupAggregateError(options) {
|
|
106
|
+
const aggregateError = new AggregateError(options.errors, options.message);
|
|
107
|
+
aggregateError.cause = options.cause;
|
|
108
|
+
return aggregateError;
|
|
109
|
+
}
|
|
110
|
+
function groupReposByComposeProject(options) {
|
|
111
|
+
const groupsByRepoId = new Map();
|
|
112
|
+
for (const repo of options.repos) {
|
|
113
|
+
const existingGroup = groupsByRepoId.get(repo.repoId);
|
|
114
|
+
if (existingGroup) {
|
|
115
|
+
if (existingGroup.repoDir !== repo.repoDir ||
|
|
116
|
+
existingGroup.outputDir !== repo.outputDir ||
|
|
117
|
+
existingGroup.repoUrl !== repo.repoUrl ||
|
|
118
|
+
existingGroup.setupCommand !== repo.setupCommand) {
|
|
119
|
+
throw new Error(`Resource setup repo '${repo.repoId}' has inconsistent paths.`);
|
|
120
|
+
}
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
groupsByRepoId.set(repo.repoId, {
|
|
124
|
+
composeFilePath: path.join(repo.repoDir, '.agent-vm', 'docker-compose.yml'),
|
|
125
|
+
composeProjectName: buildComposeProjectName(options.taskId, repo.repoId),
|
|
126
|
+
outputDir: repo.outputDir,
|
|
127
|
+
providers: [],
|
|
128
|
+
repoDir: repo.repoDir,
|
|
129
|
+
repoId: repo.repoId,
|
|
130
|
+
repoUrl: repo.repoUrl,
|
|
131
|
+
setupCommand: repo.setupCommand,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
for (const provider of options.providers) {
|
|
135
|
+
const existingGroup = groupsByRepoId.get(provider.repoId);
|
|
136
|
+
if (!existingGroup) {
|
|
137
|
+
throw new Error(`Resource provider references unknown setup repo '${provider.repoId}'.`);
|
|
138
|
+
}
|
|
139
|
+
if (existingGroup.repoDir !== provider.repoDir ||
|
|
140
|
+
existingGroup.outputDir !== provider.outputDir ||
|
|
141
|
+
existingGroup.repoUrl !== provider.repoUrl ||
|
|
142
|
+
existingGroup.setupCommand !== provider.setupCommand) {
|
|
143
|
+
throw new Error(`Resource provider repo '${provider.repoId}' has inconsistent paths.`);
|
|
144
|
+
}
|
|
145
|
+
existingGroup.providers.push(provider);
|
|
146
|
+
}
|
|
147
|
+
return [...groupsByRepoId.values()];
|
|
148
|
+
}
|
|
149
|
+
async function resolveComposeTarget(options) {
|
|
150
|
+
const psResult = await runDockerCommand({
|
|
151
|
+
args: [
|
|
152
|
+
'compose',
|
|
153
|
+
'-p',
|
|
154
|
+
options.composeProjectName,
|
|
155
|
+
'-f',
|
|
156
|
+
options.composeFilePath,
|
|
157
|
+
'ps',
|
|
158
|
+
'-q',
|
|
159
|
+
options.service,
|
|
160
|
+
],
|
|
161
|
+
cwd: options.repoDir,
|
|
162
|
+
timeoutMs: DOCKER_COMPOSE_TIMEOUT_MS,
|
|
163
|
+
});
|
|
164
|
+
const containerIds = psResult.stdout
|
|
165
|
+
.split('\n')
|
|
166
|
+
.map((line) => line.trim())
|
|
167
|
+
.filter((line) => line.length > 0);
|
|
168
|
+
const inspectedContainers = await Promise.all(containerIds.map(async (containerId) => {
|
|
169
|
+
const inspectResult = await runDockerCommand({
|
|
170
|
+
args: ['inspect', containerId],
|
|
171
|
+
cwd: options.repoDir,
|
|
172
|
+
timeoutMs: DOCKER_INSPECT_TIMEOUT_MS,
|
|
173
|
+
});
|
|
174
|
+
return dockerInspectResultSchema.parse(JSON.parse(inspectResult.stdout));
|
|
175
|
+
}));
|
|
176
|
+
for (const containers of inspectedContainers) {
|
|
177
|
+
for (const container of containers) {
|
|
178
|
+
const serviceName = container.Config?.Labels?.['com.docker.compose.service'];
|
|
179
|
+
const host = getSingleContainerIp({
|
|
180
|
+
container,
|
|
181
|
+
composeProjectName: options.composeProjectName,
|
|
182
|
+
service: options.service,
|
|
183
|
+
});
|
|
184
|
+
const exposedPorts = Object.keys(container.Config?.ExposedPorts ?? {});
|
|
185
|
+
const exposesBindingPort = exposedPorts.includes(`${options.binding.port}/tcp`);
|
|
186
|
+
if (serviceName === options.service && host && exposesBindingPort) {
|
|
187
|
+
return { host, port: options.binding.port };
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
throw new Error(`Unable to resolve compose target for service '${options.service}' in project '${options.composeProjectName}' exposing ${String(options.binding.port)}/tcp.`);
|
|
192
|
+
}
|
|
193
|
+
async function assertSelectedServicesDoNotPublishHostPorts(options) {
|
|
194
|
+
const configResult = await runDockerCommand({
|
|
195
|
+
args: [
|
|
196
|
+
'compose',
|
|
197
|
+
'-p',
|
|
198
|
+
options.composeProjectName,
|
|
199
|
+
'-f',
|
|
200
|
+
options.composeFilePath,
|
|
201
|
+
'config',
|
|
202
|
+
'--format',
|
|
203
|
+
'json',
|
|
204
|
+
],
|
|
205
|
+
cwd: options.repoDir,
|
|
206
|
+
timeoutMs: DOCKER_COMPOSE_TIMEOUT_MS,
|
|
207
|
+
});
|
|
208
|
+
const config = dockerComposeConfigSchema.parse(JSON.parse(configResult.stdout));
|
|
209
|
+
for (const serviceName of options.services) {
|
|
210
|
+
const service = config.services?.[serviceName];
|
|
211
|
+
if ((service?.ports?.length ?? 0) > 0) {
|
|
212
|
+
throw new Error(`Repo resource compose service '${serviceName}' must not publish host ports; use expose/internal service ports so parallel tasks and repos do not collide.`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
function isPathInside(parentPath, candidatePath) {
|
|
217
|
+
const relativePath = path.relative(parentPath, candidatePath);
|
|
218
|
+
return relativePath === '' || (!relativePath.startsWith('..') && !path.isAbsolute(relativePath));
|
|
219
|
+
}
|
|
220
|
+
async function validateGeneratedResourcePaths(options) {
|
|
221
|
+
const realOutputDir = await fs.realpath(options.outputDir);
|
|
222
|
+
await Promise.all(options.final.generated.map(async (generatedPath) => {
|
|
223
|
+
const absolutePath = path.resolve(options.outputDir, generatedPath.path);
|
|
224
|
+
if (!isPathInside(options.outputDir, absolutePath)) {
|
|
225
|
+
throw new Error(`Generated resource path '${generatedPath.path}' for repo '${options.repoId}' escapes RESOURCE_OUTPUT_DIR.`);
|
|
226
|
+
}
|
|
227
|
+
const realGeneratedPath = await fs.realpath(absolutePath);
|
|
228
|
+
if (!isPathInside(realOutputDir, realGeneratedPath)) {
|
|
229
|
+
throw new Error(`Generated resource path '${generatedPath.path}' for repo '${options.repoId}' escapes RESOURCE_OUTPUT_DIR.`);
|
|
230
|
+
}
|
|
231
|
+
const stat = await fs.stat(realGeneratedPath);
|
|
232
|
+
if (generatedPath.kind === 'directory' && !stat.isDirectory()) {
|
|
233
|
+
throw new Error(`Generated resource path '${generatedPath.path}' for repo '${options.repoId}' is not a directory.`);
|
|
234
|
+
}
|
|
235
|
+
if (generatedPath.kind === 'file' && !stat.isFile()) {
|
|
236
|
+
throw new Error(`Generated resource path '${generatedPath.path}' for repo '${options.repoId}' is not a file.`);
|
|
237
|
+
}
|
|
238
|
+
}));
|
|
239
|
+
}
|
|
240
|
+
async function startOneProviderGroup(options) {
|
|
241
|
+
const startedProvider = {
|
|
242
|
+
composeFilePath: options.group.composeFilePath,
|
|
243
|
+
composeProjectName: options.group.composeProjectName,
|
|
244
|
+
repoDir: options.group.repoDir,
|
|
245
|
+
repoId: options.group.repoId,
|
|
246
|
+
};
|
|
247
|
+
let composeStarted = false;
|
|
248
|
+
try {
|
|
249
|
+
await fs.mkdir(options.group.outputDir, { recursive: true });
|
|
250
|
+
const services = [
|
|
251
|
+
...new Set(options.group.providers.map((provider) => provider.provider.service)),
|
|
252
|
+
];
|
|
253
|
+
if (services.length > 0) {
|
|
254
|
+
await assertSelectedServicesDoNotPublishHostPorts({
|
|
255
|
+
composeFilePath: options.group.composeFilePath,
|
|
256
|
+
composeProjectName: options.group.composeProjectName,
|
|
257
|
+
repoDir: options.group.repoDir,
|
|
258
|
+
services,
|
|
259
|
+
});
|
|
260
|
+
composeStarted = true;
|
|
261
|
+
await runDockerCommand({
|
|
262
|
+
args: [
|
|
263
|
+
'compose',
|
|
264
|
+
'-p',
|
|
265
|
+
options.group.composeProjectName,
|
|
266
|
+
'-f',
|
|
267
|
+
options.group.composeFilePath,
|
|
268
|
+
'up',
|
|
269
|
+
'-d',
|
|
270
|
+
'--wait',
|
|
271
|
+
'--no-deps',
|
|
272
|
+
...services,
|
|
273
|
+
],
|
|
274
|
+
cwd: options.group.repoDir,
|
|
275
|
+
timeoutMs: DOCKER_COMPOSE_TIMEOUT_MS,
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
const selectedResources = Object.fromEntries(await Promise.all(options.group.providers.map(async (provider) => {
|
|
279
|
+
const target = await resolveComposeTarget({
|
|
280
|
+
binding: provider.binding,
|
|
281
|
+
composeFilePath: options.group.composeFilePath,
|
|
282
|
+
composeProjectName: options.group.composeProjectName,
|
|
283
|
+
repoDir: options.group.repoDir,
|
|
284
|
+
service: provider.provider.service,
|
|
285
|
+
});
|
|
286
|
+
return [provider.resourceName, { binding: provider.binding, target }];
|
|
287
|
+
})));
|
|
288
|
+
const setupCommand = path.resolve(options.group.repoDir, options.group.setupCommand);
|
|
289
|
+
const relativeSetupCommand = path.relative(options.group.repoDir, setupCommand);
|
|
290
|
+
if (relativeSetupCommand.startsWith('..') || path.isAbsolute(relativeSetupCommand)) {
|
|
291
|
+
throw new Error(`setupCommand for repo '${options.group.repoId}' must stay inside the repo.`);
|
|
292
|
+
}
|
|
293
|
+
await runRepoSetupCommand({
|
|
294
|
+
args: [],
|
|
295
|
+
composeProjectName: options.group.composeProjectName,
|
|
296
|
+
command: setupCommand,
|
|
297
|
+
cwd: options.group.repoDir,
|
|
298
|
+
outputDir: options.group.outputDir,
|
|
299
|
+
});
|
|
300
|
+
const final = await finalizeRepoResourceSetupInSubprocess({
|
|
301
|
+
repoDir: options.group.repoDir,
|
|
302
|
+
input: {
|
|
303
|
+
repoId: options.group.repoId,
|
|
304
|
+
repoUrl: options.group.repoUrl,
|
|
305
|
+
repoDir: options.group.repoDir,
|
|
306
|
+
outputDir: options.group.outputDir,
|
|
307
|
+
selectedResources,
|
|
308
|
+
},
|
|
309
|
+
});
|
|
310
|
+
await validateGeneratedResourcePaths({
|
|
311
|
+
final,
|
|
312
|
+
outputDir: options.group.outputDir,
|
|
313
|
+
repoId: options.group.repoId,
|
|
314
|
+
});
|
|
315
|
+
return {
|
|
316
|
+
finalization: {
|
|
317
|
+
final,
|
|
318
|
+
outputDir: options.group.outputDir,
|
|
319
|
+
repoId: options.group.repoId,
|
|
320
|
+
},
|
|
321
|
+
startedProvider: composeStarted ? startedProvider : undefined,
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
catch (error) {
|
|
325
|
+
if (!composeStarted) {
|
|
326
|
+
throw error;
|
|
327
|
+
}
|
|
328
|
+
try {
|
|
329
|
+
await stopRepoResourceProviders([startedProvider]);
|
|
330
|
+
}
|
|
331
|
+
catch (cleanupError) {
|
|
332
|
+
throw buildCleanupAggregateError({
|
|
333
|
+
cause: error,
|
|
334
|
+
errors: [error, cleanupError],
|
|
335
|
+
message: `Failed to start and clean up repo resource provider '${options.group.repoId}'.`,
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
throw error;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
export async function startRepoResourceProviders(options) {
|
|
342
|
+
const groups = groupReposByComposeProject(options);
|
|
343
|
+
const settledResults = await Promise.allSettled(groups.map(async (group) => await startOneProviderGroup({ group })));
|
|
344
|
+
const rejectedReasons = [];
|
|
345
|
+
for (const result of settledResults) {
|
|
346
|
+
if (result.status === 'rejected') {
|
|
347
|
+
rejectedReasons.push(result.reason);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
if (rejectedReasons.length > 0) {
|
|
351
|
+
const startedProviders = settledResults.flatMap((result) => result.status === 'fulfilled' && result.value.startedProvider
|
|
352
|
+
? [result.value.startedProvider]
|
|
353
|
+
: []);
|
|
354
|
+
try {
|
|
355
|
+
await stopRepoResourceProviders(startedProviders);
|
|
356
|
+
}
|
|
357
|
+
catch (cleanupError) {
|
|
358
|
+
throw buildCleanupAggregateError({
|
|
359
|
+
cause: rejectedReasons[0],
|
|
360
|
+
errors: [...rejectedReasons, cleanupError],
|
|
361
|
+
message: 'Failed to start repo resource providers and clean up started providers.',
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
if (rejectedReasons.length === 1) {
|
|
365
|
+
throw rejectedReasons[0];
|
|
366
|
+
}
|
|
367
|
+
throw new AggregateError(rejectedReasons, 'Failed to start repo resource providers.');
|
|
368
|
+
}
|
|
369
|
+
const results = settledResults.map((result) => {
|
|
370
|
+
if (result.status === 'rejected') {
|
|
371
|
+
throw result.reason;
|
|
372
|
+
}
|
|
373
|
+
return result.value;
|
|
374
|
+
});
|
|
375
|
+
return {
|
|
376
|
+
finalizations: results.map((result) => result.finalization),
|
|
377
|
+
startedProviders: results.flatMap((result) => result.startedProvider ? [result.startedProvider] : []),
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
export async function stopRepoResourceProviders(providers) {
|
|
381
|
+
const uniqueProviders = [
|
|
382
|
+
...new Map(providers.map((provider) => [
|
|
383
|
+
`${provider.composeProjectName}\0${provider.composeFilePath}\0${provider.repoDir}`,
|
|
384
|
+
provider,
|
|
385
|
+
])).values(),
|
|
386
|
+
];
|
|
387
|
+
const errors = [];
|
|
388
|
+
await Promise.all(uniqueProviders.map(async (provider) => {
|
|
389
|
+
try {
|
|
390
|
+
await runDockerCommand({
|
|
391
|
+
args: [
|
|
392
|
+
'compose',
|
|
393
|
+
'-p',
|
|
394
|
+
provider.composeProjectName,
|
|
395
|
+
'-f',
|
|
396
|
+
provider.composeFilePath,
|
|
397
|
+
'down',
|
|
398
|
+
'--remove-orphans',
|
|
399
|
+
],
|
|
400
|
+
cwd: provider.repoDir,
|
|
401
|
+
timeoutMs: DOCKER_COMPOSE_TIMEOUT_MS,
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
catch (error) {
|
|
405
|
+
errors.push(error);
|
|
406
|
+
}
|
|
407
|
+
}));
|
|
408
|
+
if (errors.length === 1) {
|
|
409
|
+
throw new Error('Failed to stop repo resource provider.', { cause: errors[0] });
|
|
410
|
+
}
|
|
411
|
+
if (errors.length > 1) {
|
|
412
|
+
throw new AggregateError(errors, 'Failed to stop one or more repo resource providers.');
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
//# sourceMappingURL=repo-resource-provider-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-resource-provider-runner.js","sourceRoot":"","sources":["../../src/resources/repo-resource-provider-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { VfsMountSpec } from '@agent-vm/gondolin-adapter';
|
|
2
|
+
import type { ExternalResources, ResolvedRepoResourcesFinal } from '../config/resource-contracts/index.js';
|
|
3
|
+
export interface RepoResourceFinalization {
|
|
4
|
+
readonly final: ResolvedRepoResourcesFinal;
|
|
5
|
+
readonly outputDir: string;
|
|
6
|
+
readonly repoId: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ResourceOverlay {
|
|
9
|
+
readonly environment: Record<string, string>;
|
|
10
|
+
readonly tcpHosts: Record<string, string>;
|
|
11
|
+
readonly vfsMounts: Record<string, VfsMountSpec>;
|
|
12
|
+
}
|
|
13
|
+
export interface CompileResourceOverlayOptions {
|
|
14
|
+
readonly externalResources: ExternalResources;
|
|
15
|
+
readonly repoFinalizations: readonly RepoResourceFinalization[];
|
|
16
|
+
}
|
|
17
|
+
export declare function compileResourceOverlay(options: CompileResourceOverlayOptions): ResourceOverlay;
|
|
18
|
+
//# sourceMappingURL=resource-compiler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-compiler.d.ts","sourceRoot":"","sources":["../../src/resources/resource-compiler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D,OAAO,KAAK,EACX,iBAAiB,EACjB,0BAA0B,EAC1B,MAAM,uCAAuC,CAAC;AAG/C,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,KAAK,EAAE,0BAA0B,CAAC;IAC3C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,6BAA6B;IAC7C,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;IAC9C,QAAQ,CAAC,iBAAiB,EAAE,SAAS,wBAAwB,EAAE,CAAC;CAChE;AAsCD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,6BAA6B,GAAG,eAAe,CA0B9F"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { RESERVED_RESOURCE_ENV_KEYS } from '../config/resource-contracts/index.js';
|
|
2
|
+
function toTcpHostKey(resource) {
|
|
3
|
+
return `${resource.binding.host}:${resource.binding.port}`;
|
|
4
|
+
}
|
|
5
|
+
function toTcpHostTarget(resource) {
|
|
6
|
+
return `${resource.target.host}:${resource.target.port}`;
|
|
7
|
+
}
|
|
8
|
+
function assignResourceEnvironment(environment, resourceEnv) {
|
|
9
|
+
for (const [key, value] of Object.entries(resourceEnv)) {
|
|
10
|
+
if (RESERVED_RESOURCE_ENV_KEYS.has(key)) {
|
|
11
|
+
throw new Error(`Resource env contains reserved environment key '${key}'.`);
|
|
12
|
+
}
|
|
13
|
+
const existingValue = environment[key];
|
|
14
|
+
if (existingValue !== undefined && existingValue !== value) {
|
|
15
|
+
throw new Error(`Resource env contains conflicting environment key '${key}'.`);
|
|
16
|
+
}
|
|
17
|
+
environment[key] = value;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function assignTcpHost(tcpHosts, key, target) {
|
|
21
|
+
const existingTarget = tcpHosts[key];
|
|
22
|
+
if (existingTarget !== undefined && existingTarget !== target) {
|
|
23
|
+
throw new Error(`Resource overlay contains conflicting TCP binding '${key}'.`);
|
|
24
|
+
}
|
|
25
|
+
tcpHosts[key] = target;
|
|
26
|
+
}
|
|
27
|
+
export function compileResourceOverlay(options) {
|
|
28
|
+
const tcpHosts = {};
|
|
29
|
+
const environment = {};
|
|
30
|
+
const vfsMounts = {};
|
|
31
|
+
for (const resource of Object.values(options.externalResources)) {
|
|
32
|
+
assignTcpHost(tcpHosts, toTcpHostKey(resource), toTcpHostTarget(resource));
|
|
33
|
+
assignResourceEnvironment(environment, resource.env);
|
|
34
|
+
}
|
|
35
|
+
for (const finalization of options.repoFinalizations) {
|
|
36
|
+
vfsMounts[`/agent-vm/resources/${finalization.repoId}`] = {
|
|
37
|
+
hostPath: finalization.outputDir,
|
|
38
|
+
kind: 'realfs-readonly',
|
|
39
|
+
};
|
|
40
|
+
for (const resource of Object.values(finalization.final.resources)) {
|
|
41
|
+
assignTcpHost(tcpHosts, toTcpHostKey(resource), toTcpHostTarget(resource));
|
|
42
|
+
assignResourceEnvironment(environment, resource.env);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
environment,
|
|
47
|
+
tcpHosts,
|
|
48
|
+
vfsMounts,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=resource-compiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-compiler.js","sourceRoot":"","sources":["../../src/resources/resource-compiler.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAC;AAmBnF,SAAS,YAAY,CAAC,QAErB;IACA,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AAC5D,CAAC;AAED,SAAS,eAAe,CAAC,QAExB;IACA,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AAC1D,CAAC;AAED,SAAS,yBAAyB,CACjC,WAAmC,EACnC,WAAmC;IAEnC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QACxD,IAAI,0BAA0B,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,mDAAmD,GAAG,IAAI,CAAC,CAAC;QAC7E,CAAC;QACD,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;YAC5D,MAAM,IAAI,KAAK,CAAC,sDAAsD,GAAG,IAAI,CAAC,CAAC;QAChF,CAAC;QACD,WAAW,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC1B,CAAC;AACF,CAAC;AAED,SAAS,aAAa,CAAC,QAAgC,EAAE,GAAW,EAAE,MAAc;IACnF,MAAM,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,cAAc,KAAK,SAAS,IAAI,cAAc,KAAK,MAAM,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,sDAAsD,GAAG,IAAI,CAAC,CAAC;IAChF,CAAC;IACD,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAsC;IAC5E,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,MAAM,WAAW,GAA2B,EAAE,CAAC;IAC/C,MAAM,SAAS,GAAiC,EAAE,CAAC;IAEnD,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACjE,aAAa,CAAC,QAAQ,EAAE,YAAY,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3E,yBAAyB,CAAC,WAAW,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,MAAM,YAAY,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;QACtD,SAAS,CAAC,uBAAuB,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG;YACzD,QAAQ,EAAE,YAAY,CAAC,SAAS;YAChC,IAAI,EAAE,iBAAiB;SACvB,CAAC;QACF,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YACpE,aAAa,CAAC,QAAQ,EAAE,YAAY,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC3E,yBAAyB,CAAC,WAAW,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;QACtD,CAAC;IACF,CAAC;IAED,OAAO;QACN,WAAW;QACX,QAAQ;QACR,SAAS;KACT,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ExternalResources, RepoResourceRequirement, ResolvedComposeResourceProvider, ResolvedRepoResourcesDescription, ZoneResourcesPolicy } from '../config/resource-contracts/index.js';
|
|
2
|
+
export interface RepoResourceDescriptionInput {
|
|
3
|
+
readonly description: ResolvedRepoResourcesDescription;
|
|
4
|
+
readonly repoId: string;
|
|
5
|
+
readonly repoUrl: string;
|
|
6
|
+
}
|
|
7
|
+
export interface SelectedRepoResourceProvider {
|
|
8
|
+
readonly binding: RepoResourceRequirement['binding'];
|
|
9
|
+
readonly provider: ResolvedComposeResourceProvider;
|
|
10
|
+
readonly repoId: string;
|
|
11
|
+
readonly repoUrl: string;
|
|
12
|
+
readonly resourceName: string;
|
|
13
|
+
readonly setupCommand: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ResolveTaskResourcesOptions {
|
|
16
|
+
readonly allowRepoResources: ZoneResourcesPolicy['allowRepoResources'];
|
|
17
|
+
readonly externalResources: ExternalResources;
|
|
18
|
+
readonly repos: readonly RepoResourceDescriptionInput[];
|
|
19
|
+
}
|
|
20
|
+
export interface ResolvedTaskResources {
|
|
21
|
+
readonly externalResources: ExternalResources;
|
|
22
|
+
readonly selectedRepoProviders: readonly SelectedRepoResourceProvider[];
|
|
23
|
+
}
|
|
24
|
+
export declare function resolveTaskResources(options: ResolveTaskResourcesOptions): ResolvedTaskResources;
|
|
25
|
+
//# sourceMappingURL=resource-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-resolver.d.ts","sourceRoot":"","sources":["../../src/resources/resource-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,iBAAiB,EAEjB,uBAAuB,EACvB,+BAA+B,EAC/B,gCAAgC,EAChC,mBAAmB,EACnB,MAAM,uCAAuC,CAAC;AAE/C,MAAM,WAAW,4BAA4B;IAC5C,QAAQ,CAAC,WAAW,EAAE,gCAAgC,CAAC;IACvD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,4BAA4B;IAC5C,QAAQ,CAAC,OAAO,EAAE,uBAAuB,CAAC,SAAS,CAAC,CAAC;IACrD,QAAQ,CAAC,QAAQ,EAAE,+BAA+B,CAAC;IACnD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,2BAA2B;IAC3C,QAAQ,CAAC,kBAAkB,EAAE,mBAAmB,CAAC,oBAAoB,CAAC,CAAC;IACvE,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;IAC9C,QAAQ,CAAC,KAAK,EAAE,SAAS,4BAA4B,EAAE,CAAC;CACxD;AAED,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;IAC9C,QAAQ,CAAC,qBAAqB,EAAE,SAAS,4BAA4B,EAAE,CAAC;CACxE;AAgED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,qBAAqB,CAuDhG"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
function isRepoAllowed(allowRepoResources, repoUrl) {
|
|
2
|
+
if (allowRepoResources === true) {
|
|
3
|
+
return true;
|
|
4
|
+
}
|
|
5
|
+
if (allowRepoResources === false) {
|
|
6
|
+
return false;
|
|
7
|
+
}
|
|
8
|
+
const normalizedRepoUrl = normalizeRepoUrl(repoUrl, 'repo resource provider URL');
|
|
9
|
+
return allowRepoResources.some((allowedRepoUrl) => normalizeRepoUrl(allowedRepoUrl, 'repo resource allow-list URL') === normalizedRepoUrl);
|
|
10
|
+
}
|
|
11
|
+
function normalizeRepoUrl(repoUrl, label) {
|
|
12
|
+
try {
|
|
13
|
+
const parsedUrl = new URL(repoUrl);
|
|
14
|
+
parsedUrl.hash = '';
|
|
15
|
+
parsedUrl.search = '';
|
|
16
|
+
parsedUrl.hostname = parsedUrl.hostname.toLowerCase();
|
|
17
|
+
parsedUrl.pathname = parsedUrl.pathname.replace(/\/+$/u, '').replace(/\.git$/u, '');
|
|
18
|
+
return parsedUrl.toString().replace(/\/$/u, '');
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
throw new Error(`Invalid ${label}: '${repoUrl}'.`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function bindingsMatch(left, right) {
|
|
25
|
+
return left.host === right.host && left.port === right.port;
|
|
26
|
+
}
|
|
27
|
+
function describeBinding(binding) {
|
|
28
|
+
return `${binding.host}:${String(binding.port)}`;
|
|
29
|
+
}
|
|
30
|
+
function resolveRequiredBinding(options) {
|
|
31
|
+
const requirements = options.repos.flatMap((repo) => {
|
|
32
|
+
const requirement = repo.description.requires[options.resourceName];
|
|
33
|
+
return requirement ? [{ repo, requirement }] : [];
|
|
34
|
+
});
|
|
35
|
+
const firstRequirement = requirements[0]?.requirement;
|
|
36
|
+
if (!firstRequirement) {
|
|
37
|
+
throw new Error(`Required resource '${options.resourceName}' disappeared during resolution.`);
|
|
38
|
+
}
|
|
39
|
+
for (const { repo, requirement } of requirements.slice(1)) {
|
|
40
|
+
if (!bindingsMatch(firstRequirement.binding, requirement.binding)) {
|
|
41
|
+
throw new Error(`Resource '${options.resourceName}' has conflicting bindings: ` +
|
|
42
|
+
`${describeBinding(firstRequirement.binding)} and ` +
|
|
43
|
+
`${describeBinding(requirement.binding)} from '${repo.repoUrl}'.`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return firstRequirement.binding;
|
|
47
|
+
}
|
|
48
|
+
export function resolveTaskResources(options) {
|
|
49
|
+
const requiredResourceNames = new Set();
|
|
50
|
+
for (const repo of options.repos) {
|
|
51
|
+
for (const resourceName of Object.keys(repo.description.requires)) {
|
|
52
|
+
requiredResourceNames.add(resourceName);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const selectedRepoProviders = [];
|
|
56
|
+
for (const resourceName of requiredResourceNames) {
|
|
57
|
+
const requiredBinding = resolveRequiredBinding({ resourceName, repos: options.repos });
|
|
58
|
+
const externalResource = options.externalResources[resourceName];
|
|
59
|
+
if (externalResource) {
|
|
60
|
+
if (!bindingsMatch(requiredBinding, externalResource.binding)) {
|
|
61
|
+
throw new Error(`External resource '${resourceName}' binding ${describeBinding(externalResource.binding)} does not match required binding ${describeBinding(requiredBinding)}.`);
|
|
62
|
+
}
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const providerRepo = options.repos.find((repo) => repo.description.provides[resourceName]);
|
|
66
|
+
if (!providerRepo) {
|
|
67
|
+
throw new Error(`Required resource '${resourceName}' has no external resource or repo provider.`);
|
|
68
|
+
}
|
|
69
|
+
if (!isRepoAllowed(options.allowRepoResources, providerRepo.repoUrl)) {
|
|
70
|
+
throw new Error(`Repo resource '${resourceName}' from '${providerRepo.repoUrl}' is not allowed by zone policy.`);
|
|
71
|
+
}
|
|
72
|
+
const provider = providerRepo.description.provides[resourceName];
|
|
73
|
+
if (!provider) {
|
|
74
|
+
throw new Error(`Required resource '${resourceName}' provider disappeared during resolution.`);
|
|
75
|
+
}
|
|
76
|
+
selectedRepoProviders.push({
|
|
77
|
+
binding: requiredBinding,
|
|
78
|
+
provider,
|
|
79
|
+
repoId: providerRepo.repoId,
|
|
80
|
+
repoUrl: providerRepo.repoUrl,
|
|
81
|
+
resourceName,
|
|
82
|
+
setupCommand: providerRepo.description.setupCommand,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
externalResources: options.externalResources,
|
|
87
|
+
selectedRepoProviders,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=resource-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-resolver.js","sourceRoot":"","sources":["../../src/resources/resource-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function buildDefaultProjectNamespace(targetDirectory: string, dependencies?: {
|
|
2
|
+
readonly realpath?: (targetDirectory: string) => Promise<string>;
|
|
3
|
+
readonly resolvePath?: (targetDirectory: string) => string;
|
|
4
|
+
}): Promise<string>;
|
|
5
|
+
//# sourceMappingURL=project-namespace.d.ts.map
|