spawnfile 0.1.14 → 0.1.17
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/README.md +60 -159
- package/dist/audit/checksShared.d.ts +1 -1
- package/dist/auth/importers.d.ts +10 -0
- package/dist/auth/importers.js +29 -4
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.js +1 -0
- package/dist/auth/paths.d.ts +1 -1
- package/dist/auth/profileStore.js +9 -9
- package/dist/auth/targetSecretSourceFsIdentity.d.ts +40 -0
- package/dist/auth/targetSecretSourceFsIdentity.js +42 -0
- package/dist/auth/targetSecretSourceFsPublish.d.ts +2 -0
- package/dist/auth/targetSecretSourceFsPublish.js +3 -1
- package/dist/auth/targetSecretSourceFsPublishImmutable.d.ts +2 -1
- package/dist/auth/targetSecretSourceFsPublishImmutable.js +104 -71
- package/dist/auth/targetSecretSourceFsRead.js +5 -14
- package/dist/auth/trainingAuth.d.ts +21 -0
- package/dist/auth/trainingAuth.js +86 -0
- package/dist/auth/types.d.ts +1 -1
- package/dist/cli/authCommands.d.ts +1 -1
- package/dist/cli/authCommands.js +9 -0
- package/dist/cli/canaryCutoverCommand.d.ts +2 -0
- package/dist/cli/canaryCutoverCommand.js +30 -0
- package/dist/cli/capabilitiesCommand.d.ts +3 -0
- package/dist/cli/capabilitiesCommand.js +12 -0
- package/dist/cli/capabilitiesReceipt.d.ts +56 -0
- package/dist/cli/capabilitiesReceipt.js +56 -0
- package/dist/cli/compileBuildCommands.js +13 -0
- package/dist/cli/composedLifecycleContractSet.d.ts +21 -0
- package/dist/cli/composedLifecycleContractSet.js +204 -0
- package/dist/cli/devCommands.js +2 -0
- package/dist/cli/downCommand.js +19 -8
- package/dist/cli/evidenceExportHelperCommand.d.ts +13 -0
- package/dist/cli/evidenceExportHelperCommand.js +51 -0
- package/dist/cli/index.js +12 -3
- package/dist/cli/lifecycleMachine.d.ts +7 -1
- package/dist/cli/lifecycleMachine.js +2 -2
- package/dist/cli/paideiaDelegation.d.ts +17 -0
- package/dist/cli/paideiaDelegation.js +210 -0
- package/dist/cli/paideiaSupervisor.d.ts +17 -0
- package/dist/cli/paideiaSupervisor.js +48 -0
- package/dist/cli/productStateCloneCommand.d.ts +2 -0
- package/dist/cli/productStateCloneCommand.js +34 -0
- package/dist/cli/runCli.d.ts +13 -3
- package/dist/cli/runCli.js +37 -9
- package/dist/cli/targetCommands.d.ts +4 -7
- package/dist/cli/targetCommands.js +16 -46
- package/dist/cli/targetConfigPreparedPlan.d.ts +3 -0
- package/dist/cli/targetConfigPreparedPlan.js +74 -0
- package/dist/cli/targetConfigResolver.d.ts +3 -0
- package/dist/cli/targetConfigResolver.js +111 -0
- package/dist/cli/targetConfigResolverCommand.d.ts +6 -0
- package/dist/cli/targetConfigResolverCommand.js +43 -0
- package/dist/cli/targetConfigResolverContracts.d.ts +56 -0
- package/dist/cli/targetConfigResolverContracts.js +30 -0
- package/dist/cli/targetConfigResolverDocker.d.ts +4 -0
- package/dist/cli/targetConfigResolverDocker.js +47 -0
- package/dist/cli/targetConfigResolverValidation.d.ts +10 -0
- package/dist/cli/targetConfigResolverValidation.js +94 -0
- package/dist/cli/targetDefaultAuthorities.d.ts +2 -0
- package/dist/cli/targetDefaultAuthorities.js +3 -0
- package/dist/cli/targetDefaultConfig.d.ts +7 -0
- package/dist/cli/targetDefaultConfig.js +22 -5
- package/dist/cli/targetDefaultConfigStdin.js +7 -1
- package/dist/cli/targetDefaultHandlerFactory.js +23 -2
- package/dist/cli/targetDefaultHandlers.d.ts +2 -2
- package/dist/cli/targetProductionCommands.d.ts +5 -0
- package/dist/cli/targetProductionCommands.js +45 -0
- package/dist/cli/trainCommand.d.ts +3 -0
- package/dist/cli/trainCommand.js +61 -0
- package/dist/cli/upCommand.js +35 -6
- package/dist/cli/upLifecycleRecovery.d.ts +2 -2
- package/dist/cli/upLifecycleRecovery.js +188 -44
- package/dist/cli/usageCommand.d.ts +40 -0
- package/dist/cli/usageCommand.js +284 -0
- package/dist/cli/usageCommandLive.d.ts +84 -0
- package/dist/cli/usageCommandLive.js +95 -0
- package/dist/cli/usageDeploymentSource.d.ts +9 -0
- package/dist/cli/usageDeploymentSource.js +22 -0
- package/dist/cli/workspaceResourceMigrationCommand.d.ts +8 -0
- package/dist/cli/workspaceResourceMigrationCommand.js +36 -0
- package/dist/compiler/buildCompilePlanTeams.d.ts +1 -1
- package/dist/compiler/buildCompilePlanTeams.js +6 -1
- package/dist/compiler/compilePlanHelpers.js +3 -0
- package/dist/compiler/compileProject.d.ts +2 -0
- package/dist/compiler/compileProject.js +5 -1
- package/dist/compiler/compileProjectSupport.js +9 -0
- package/dist/compiler/containerArtifacts.d.ts +3 -1
- package/dist/compiler/containerArtifacts.js +92 -40
- package/dist/compiler/containerArtifactsPlans.d.ts +1 -1
- package/dist/compiler/containerArtifactsPlans.js +24 -7
- package/dist/compiler/containerArtifactsRender.d.ts +2 -1
- package/dist/compiler/containerArtifactsRender.js +91 -58
- package/dist/compiler/containerArtifactsTypes.d.ts +8 -0
- package/dist/compiler/containerBackedMountRender.d.ts +56 -0
- package/dist/compiler/containerBackedMountRender.js +101 -0
- package/dist/compiler/containerDaimonBrokerRender.d.ts +112 -0
- package/dist/compiler/containerDaimonBrokerRender.js +191 -0
- package/dist/compiler/containerDaimonGrokWorkerProvisioning.d.ts +38 -0
- package/dist/compiler/containerDaimonGrokWorkerProvisioning.js +108 -0
- package/dist/compiler/containerDaimonGrokWorkerRender.d.ts +172 -0
- package/dist/compiler/containerDaimonGrokWorkerRender.js +268 -0
- package/dist/compiler/containerDaimonOwnershipGuardRender.d.ts +12 -0
- package/dist/compiler/containerDaimonOwnershipGuardRender.js +191 -0
- package/dist/compiler/containerDaimonUidEntrypointRender.d.ts +24 -0
- package/dist/compiler/containerDaimonUidEntrypointRender.js +297 -0
- package/dist/compiler/containerEntrypointRender.d.ts +7 -0
- package/dist/compiler/containerEntrypointRender.js +28 -22
- package/dist/compiler/containerPersistentMounts.d.ts +30 -0
- package/dist/compiler/containerPersistentMounts.js +66 -0
- package/dist/compiler/containerReadinessPaths.d.ts +1 -0
- package/dist/compiler/containerReadinessPaths.js +1 -0
- package/dist/compiler/containerRuntimeLinkMaterializer.d.ts +2 -0
- package/dist/compiler/containerRuntimeLinkMaterializer.js +12 -0
- package/dist/compiler/containerRuntimeReadinessRender.d.ts +7 -0
- package/dist/compiler/containerRuntimeReadinessRender.js +40 -0
- package/dist/compiler/containerStateOwnershipRender.d.ts +4 -0
- package/dist/compiler/containerStateOwnershipRender.js +75 -0
- package/dist/compiler/containerTargetResources.d.ts +22 -1
- package/dist/compiler/containerTargetResources.js +94 -2
- package/dist/compiler/containerVolumeBootstrap.d.ts +3 -0
- package/dist/compiler/containerVolumeBootstrap.js +3 -0
- package/dist/compiler/containerWorkspaceResourceRender.js +49 -1
- package/dist/compiler/daimonTelemetryArtifacts.d.ts +2 -2
- package/dist/compiler/daimonTelemetryArtifacts.js +5 -10
- package/dist/compiler/deploymentLineage.d.ts +40 -0
- package/dist/compiler/deploymentLineage.js +50 -0
- package/dist/compiler/index.d.ts +3 -0
- package/dist/compiler/index.js +3 -0
- package/dist/compiler/initProject.d.ts +2 -0
- package/dist/compiler/initProject.js +39 -1
- package/dist/compiler/localMoltnetAuthority.d.ts +64 -0
- package/dist/compiler/localMoltnetAuthority.js +177 -0
- package/dist/compiler/memoryArtifacts.d.ts +1 -1
- package/dist/compiler/memoryArtifacts.js +108 -32
- package/dist/compiler/modelEnv.d.ts +5 -0
- package/dist/compiler/modelEnv.js +8 -2
- package/dist/compiler/moltnetArtifactPaths.d.ts +17 -12
- package/dist/compiler/moltnetArtifactPaths.js +17 -15
- package/dist/compiler/moltnetArtifactTypes.d.ts +10 -0
- package/dist/compiler/moltnetArtifacts.d.ts +1 -1
- package/dist/compiler/moltnetArtifacts.js +52 -12
- package/dist/compiler/moltnetBinaries.d.ts +16 -4
- package/dist/compiler/moltnetBinaries.js +46 -6
- package/dist/compiler/moltnetClientConfig.js +1 -1
- package/dist/compiler/moltnetConfigLowering.d.ts +3 -1
- package/dist/compiler/moltnetConfigLowering.js +30 -6
- package/dist/compiler/moltnetNodeConfig.js +1 -1
- package/dist/compiler/moltnetReleaseAuthority.d.ts +24 -1
- package/dist/compiler/moltnetReleaseAuthority.js +33 -4
- package/dist/compiler/moltnetRepresentativeResolution.d.ts +1 -1
- package/dist/compiler/moltnetRepresentativeResolution.js +2 -2
- package/dist/compiler/moltnetResolution.js +9 -15
- package/dist/compiler/moltnetRoomMemberships.js +20 -5
- package/dist/compiler/moltnetRoomPolicyCompatibility.d.ts +1 -1
- package/dist/compiler/moltnetRoomPolicyCompatibility.js +3 -1
- package/dist/compiler/moltnetRuntimeConfig.d.ts +1 -1
- package/dist/compiler/moltnetRuntimeConfig.js +22 -2
- package/dist/compiler/moltnetServerPlans.js +19 -0
- package/dist/compiler/organizationExternalParticipants.d.ts +3 -0
- package/dist/compiler/organizationExternalParticipants.js +176 -0
- package/dist/compiler/organizationIdentity.d.ts +3 -9
- package/dist/compiler/organizationIdentity.js +37 -270
- package/dist/compiler/organizationIdentityGraph.d.ts +15 -0
- package/dist/compiler/organizationIdentityGraph.js +115 -0
- package/dist/compiler/organizationReadyEvidence.d.ts +8 -0
- package/dist/compiler/organizationReadyEvidence.js +23 -3
- package/dist/compiler/runProject.d.ts +4 -2
- package/dist/compiler/runProject.js +32 -6
- package/dist/compiler/runProjectAuth.d.ts +3 -1
- package/dist/compiler/runProjectAuth.js +19 -3
- package/dist/compiler/runProjectDaimonCodexDocker.d.ts +3 -0
- package/dist/compiler/runProjectDaimonCodexDocker.js +36 -0
- package/dist/compiler/runProjectDocker.d.ts +8 -4
- package/dist/compiler/runProjectDocker.js +43 -18
- package/dist/compiler/runProjectDockerDaimonGuards.d.ts +15 -0
- package/dist/compiler/runProjectDockerDaimonGuards.js +122 -0
- package/dist/compiler/runProjectDockerReservation.d.ts +3 -0
- package/dist/compiler/runProjectDockerReservation.js +118 -0
- package/dist/compiler/runProjectLifecycle.js +1 -1
- package/dist/compiler/training/broker/declaration.d.ts +45 -0
- package/dist/compiler/training/broker/declaration.js +55 -0
- package/dist/compiler/training/broker/entrypoint.d.ts +39 -0
- package/dist/compiler/training/broker/entrypoint.js +111 -0
- package/dist/compiler/training/broker/index.d.ts +10 -0
- package/dist/compiler/training/broker/index.js +10 -0
- package/dist/compiler/training/broker/main.d.ts +2 -0
- package/dist/compiler/training/broker/main.js +14 -0
- package/dist/compiler/training/broker/paths.d.ts +196 -0
- package/dist/compiler/training/broker/paths.js +241 -0
- package/dist/compiler/training/broker/processes.d.ts +42 -0
- package/dist/compiler/training/broker/processes.js +99 -0
- package/dist/compiler/training/broker/projection.d.ts +51 -0
- package/dist/compiler/training/broker/projection.js +76 -0
- package/dist/compiler/training/broker/provisioning.d.ts +87 -0
- package/dist/compiler/training/broker/provisioning.js +213 -0
- package/dist/compiler/training/broker/receipt.d.ts +77 -0
- package/dist/compiler/training/broker/receipt.js +110 -0
- package/dist/compiler/training/broker/registration.d.ts +41 -0
- package/dist/compiler/training/broker/registration.js +102 -0
- package/dist/compiler/training/broker/runtime.d.ts +25 -0
- package/dist/compiler/training/broker/runtime.js +173 -0
- package/dist/compiler/training/broker/seccompRoutes.d.ts +31 -0
- package/dist/compiler/training/broker/seccompRoutes.js +36 -0
- package/dist/compiler/training/broker/supervisor.d.ts +109 -0
- package/dist/compiler/training/broker/supervisor.js +173 -0
- package/dist/compiler/training/container/contract.d.ts +31 -0
- package/dist/compiler/training/container/contract.js +33 -0
- package/dist/compiler/training/container/index.d.ts +4 -0
- package/dist/compiler/training/container/index.js +2 -0
- package/dist/compiler/training/container/launch.d.ts +18 -0
- package/dist/compiler/training/container/launch.js +173 -0
- package/dist/compiler/training/container/prepare.d.ts +8 -0
- package/dist/compiler/training/container/prepare.js +80 -0
- package/dist/compiler/training/container/process.d.ts +14 -0
- package/dist/compiler/training/container/process.js +70 -0
- package/dist/compiler/training/container/security.d.ts +36 -0
- package/dist/compiler/training/container/security.js +58 -0
- package/dist/compiler/training/context.d.ts +7 -0
- package/dist/compiler/training/context.js +93 -0
- package/dist/compiler/training/contract.d.ts +142 -0
- package/dist/compiler/training/contract.js +34 -0
- package/dist/compiler/training/index.d.ts +4 -0
- package/dist/compiler/training/index.js +3 -0
- package/dist/compiler/training/preparation/assets/Dockerfile +98 -0
- package/dist/compiler/training/preparation/assets/package-lock.json +3787 -0
- package/dist/compiler/training/preparation/broker.d.ts +21 -0
- package/dist/compiler/training/preparation/broker.js +43 -0
- package/dist/compiler/training/preparation/contextModes.d.ts +12 -0
- package/dist/compiler/training/preparation/contextModes.js +38 -0
- package/dist/compiler/training/preparation/contract.d.ts +182 -0
- package/dist/compiler/training/preparation/contract.js +94 -0
- package/dist/compiler/training/preparation/copyAssets.d.ts +1 -0
- package/dist/compiler/training/preparation/copyAssets.js +8 -0
- package/dist/compiler/training/preparation/daimonParent.d.ts +42 -0
- package/dist/compiler/training/preparation/daimonParent.js +114 -0
- package/dist/compiler/training/preparation/files.d.ts +25 -0
- package/dist/compiler/training/preparation/files.js +85 -0
- package/dist/compiler/training/preparation/image.d.ts +28 -0
- package/dist/compiler/training/preparation/image.js +102 -0
- package/dist/compiler/training/preparation/index.d.ts +3 -0
- package/dist/compiler/training/preparation/index.js +2 -0
- package/dist/compiler/training/preparation/inputs.d.ts +23 -0
- package/dist/compiler/training/preparation/inputs.js +93 -0
- package/dist/compiler/training/preparation/prepare.d.ts +33 -0
- package/dist/compiler/training/preparation/prepare.js +186 -0
- package/dist/compiler/training/preparation/scratch.d.ts +19 -0
- package/dist/compiler/training/preparation/scratch.js +48 -0
- package/dist/compiler/training/repair/compatibility.d.ts +11 -0
- package/dist/compiler/training/repair/compatibility.js +34 -0
- package/dist/compiler/training/repair/contract.d.ts +506 -0
- package/dist/compiler/training/repair/contract.js +31 -0
- package/dist/compiler/training/repair/index.d.ts +3 -0
- package/dist/compiler/training/repair/index.js +3 -0
- package/dist/compiler/training/repair/prepare.d.ts +230 -0
- package/dist/compiler/training/repair/prepare.js +74 -0
- package/dist/compiler/training/repair/witness.d.ts +203 -0
- package/dist/compiler/training/repair/witness.js +42 -0
- package/dist/compiler/types.d.ts +2 -0
- package/dist/compiler/upProject.d.ts +26 -1
- package/dist/compiler/upProject.js +117 -178
- package/dist/compiler/upProjectHandoff.d.ts +62 -0
- package/dist/compiler/upProjectHandoff.js +204 -0
- package/dist/compiler/upReceipt.js +49 -4
- package/dist/compiler/updateProjectModels.js +1 -0
- package/dist/compiler/view/types.d.ts +1 -1
- package/dist/compiler/workspaceBundleArtifacts.d.ts +3 -0
- package/dist/compiler/workspaceBundleArtifacts.js +106 -0
- package/dist/compiler/workspaceResources.d.ts +4 -1
- package/dist/compiler/workspaceResources.js +12 -7
- package/dist/deployment/artifactsExportPlan.js +51 -1
- package/dist/deployment/canaryCutover.d.ts +42 -0
- package/dist/deployment/canaryCutover.js +140 -0
- package/dist/deployment/candidateDiagnostics.d.ts +15 -0
- package/dist/deployment/candidateDiagnostics.js +90 -0
- package/dist/deployment/dockerLogs.js +4 -1
- package/dist/deployment/dockerManager.js +9 -3
- package/dist/deployment/dockerProbeGateway.d.ts +17 -0
- package/dist/deployment/dockerProbeGateway.js +17 -2
- package/dist/deployment/downDeployment.d.ts +5 -0
- package/dist/deployment/downDeployment.js +109 -8
- package/dist/deployment/downReceiptTypes.d.ts +17 -2
- package/dist/deployment/downReceiptTypes.js +17 -2
- package/dist/deployment/index.d.ts +4 -0
- package/dist/deployment/index.js +4 -0
- package/dist/deployment/lifecycleCompletionContracts.d.ts +66 -0
- package/dist/deployment/lifecycleCompletionContracts.js +34 -0
- package/dist/deployment/lifecycleCompletionPaths.d.ts +4 -1
- package/dist/deployment/lifecycleCompletionPaths.js +3 -0
- package/dist/deployment/lifecycleCompletionPublication.d.ts +2 -0
- package/dist/deployment/lifecycleCompletionPublication.js +18 -4
- package/dist/deployment/lifecycleCompletionStore.d.ts +1 -1
- package/dist/deployment/lifecycleCompletionStore.js +7 -7
- package/dist/deployment/lifecycleUpRecords.d.ts +11 -0
- package/dist/deployment/lifecycleUpRecords.js +127 -0
- package/dist/deployment/native/AGENTS.md +11 -0
- package/dist/deployment/native/rename-noreplace-arm64 +0 -0
- package/dist/deployment/native/rename-noreplace-arm64.provenance.json +1 -0
- package/dist/deployment/native/rename-noreplace-x64 +0 -0
- package/dist/deployment/native/rename-noreplace-x64.provenance.json +1 -0
- package/dist/deployment/noReplaceActivation.d.ts +17 -0
- package/dist/deployment/noReplaceActivation.js +50 -0
- package/dist/deployment/organizationHandoffAuthorityFsBudget.d.ts +110 -0
- package/dist/deployment/organizationHandoffAuthorityFsBudget.js +156 -0
- package/dist/deployment/organizationHandoffAuthorityFsClient.js +82 -27
- package/dist/deployment/organizationHandoffAuthorityFsElection.d.ts +21 -0
- package/dist/deployment/organizationHandoffAuthorityFsElection.js +57 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorker.js +254 -108
- package/dist/deployment/organizationHandoffAuthorityFsWorkerStall.fixture.d.ts +1 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorkerStall.fixture.js +16 -0
- package/dist/deployment/organizationHandoffAuthorityStore.js +14 -7
- package/dist/deployment/organizationHandoffAuthorityTypes.d.ts +2 -2
- package/dist/deployment/organizationHandoffAuthorityTypes.js +2 -1
- package/dist/deployment/organizationReady.d.ts +2 -0
- package/dist/deployment/organizationReady.js +36 -4
- package/dist/deployment/productStateClone.d.ts +43 -0
- package/dist/deployment/productStateClone.js +319 -0
- package/dist/deployment/upLifecycleRecoveryState.d.ts +23 -0
- package/dist/deployment/upLifecycleRecoveryState.js +12 -0
- package/dist/deployment/upReceiptTypes.d.ts +32 -6
- package/dist/deployment/upReceiptTypes.js +29 -2
- package/dist/deployment/workspaceResourceMigration.d.ts +55 -0
- package/dist/deployment/workspaceResourceMigration.js +315 -0
- package/dist/dev/project.d.ts +7 -0
- package/dist/dev/project.js +9 -0
- package/dist/distribution/consumeImage.d.ts +2 -0
- package/dist/distribution/consumeImage.js +98 -73
- package/dist/distribution/consumeImageDaimonDocker.d.ts +3 -0
- package/dist/distribution/consumeImageDaimonDocker.js +45 -0
- package/dist/distribution/consumeImageLifecycle.d.ts +17 -0
- package/dist/distribution/consumeImageLifecycle.js +231 -0
- package/dist/distribution/consumeImageSupport.d.ts +12 -0
- package/dist/distribution/consumeImageSupport.js +15 -0
- package/dist/distribution/distributionReportSchema.d.ts +11 -1
- package/dist/distribution/distributionReportSchema.js +15 -2
- package/dist/distribution/dockerRunner.d.ts +6 -1
- package/dist/distribution/dockerRunner.js +31 -4
- package/dist/distribution/imageRuntimeAuth.d.ts +9 -1
- package/dist/distribution/imageRuntimeAuth.js +70 -1
- package/dist/distribution/index.d.ts +1 -1
- package/dist/distribution/index.js +1 -1
- package/dist/distribution/preflight.js +5 -1
- package/dist/distribution/types.d.ts +14 -1
- package/dist/distribution/types.js +3 -0
- package/dist/evidenceExportHelper/boundedExecutor.d.ts +3 -0
- package/dist/evidenceExportHelper/boundedExecutor.js +33 -0
- package/dist/evidenceExportHelper/helperProgram.mjs +156 -0
- package/dist/evidenceExportHelper/index.d.ts +4 -0
- package/dist/evidenceExportHelper/index.js +4 -0
- package/dist/evidenceExportHelper/preparedAuthority.d.ts +64 -0
- package/dist/evidenceExportHelper/preparedAuthority.js +228 -0
- package/dist/evidenceExportHelper/preparedBuilder.d.ts +10 -0
- package/dist/evidenceExportHelper/preparedBuilder.js +183 -0
- package/dist/evidenceExportHelper/preparedBuilderTypes.d.ts +19 -0
- package/dist/evidenceExportHelper/preparedBuilderTypes.js +1 -0
- package/dist/evidenceExportHelper/recipe.d.ts +7 -0
- package/dist/evidenceExportHelper/recipe.js +83 -0
- package/dist/filesystem/io.d.ts +2 -0
- package/dist/filesystem/io.js +16 -1
- package/dist/manifest/executionSchemas.d.ts +27 -0
- package/dist/manifest/executionSchemas.js +21 -2
- package/dist/manifest/mcpSchemas.d.ts +1 -0
- package/dist/manifest/mcpSchemas.js +3 -0
- package/dist/manifest/renderSpawnfileNetworks.js +11 -0
- package/dist/manifest/renderSpawnfileWorkspace.js +5 -0
- package/dist/manifest/scheduleSchemas.d.ts +3 -1
- package/dist/manifest/scheduleSchemas.js +91 -5
- package/dist/manifest/schemas.d.ts +237 -12
- package/dist/manifest/schemas.js +5 -2
- package/dist/manifest/teamNetworkAccessSchemas.d.ts +5 -1
- package/dist/manifest/teamNetworkAccessSchemas.js +11 -0
- package/dist/manifest/teamNetworkAuthSchemas.d.ts +1 -1
- package/dist/manifest/teamNetworkSchemas.d.ts +17 -3
- package/dist/manifest/teamNetworkSchemas.js +19 -1
- package/dist/manifest/teamNetworkServerSchemas.d.ts +8 -3
- package/dist/manifest/teamNetworkServerSchemas.js +18 -2
- package/dist/manifest/workspaceSchemas.d.ts +16 -0
- package/dist/manifest/workspaceSchemas.js +11 -0
- package/dist/report/types.d.ts +34 -4
- package/dist/runtime/common.d.ts +28 -1
- package/dist/runtime/common.js +33 -3
- package/dist/runtime/container.js +49 -33
- package/dist/runtime/daimon/adapter.d.ts +14 -0
- package/dist/runtime/daimon/adapter.js +243 -0
- package/dist/runtime/daimon/attention.d.ts +8 -0
- package/dist/runtime/daimon/attention.js +32 -0
- package/dist/runtime/daimon/config.d.ts +25 -0
- package/dist/runtime/daimon/config.js +272 -0
- package/dist/runtime/daimon/contractManifest.d.ts +295 -0
- package/dist/runtime/daimon/contractManifest.js +319 -0
- package/dist/runtime/daimon/grokModel.d.ts +19 -0
- package/dist/runtime/daimon/grokModel.js +33 -0
- package/dist/runtime/daimon/grokWorkerConfigBytes.d.ts +26 -0
- package/dist/runtime/daimon/grokWorkerConfigBytes.js +36 -0
- package/dist/runtime/daimon/grokWorkerContract.d.ts +22 -0
- package/dist/runtime/daimon/grokWorkerContract.js +48 -0
- package/dist/runtime/daimon/memory.d.ts +57 -0
- package/dist/runtime/daimon/memory.js +125 -0
- package/dist/runtime/daimon/runAuth.d.ts +51 -0
- package/dist/runtime/daimon/runAuth.js +279 -0
- package/dist/runtime/daimon/runtimeIdentity.d.ts +22 -0
- package/dist/runtime/daimon/runtimeIdentity.js +22 -0
- package/dist/runtime/daimon/scheduleAuthority.d.ts +3 -0
- package/dist/runtime/daimon/scheduleAuthority.js +17 -0
- package/dist/runtime/index.d.ts +4 -0
- package/dist/runtime/index.js +4 -0
- package/dist/runtime/install.d.ts +3 -0
- package/dist/runtime/install.js +3 -0
- package/dist/runtime/localDaimonAuthority.d.ts +11 -0
- package/dist/runtime/localDaimonAuthority.js +77 -0
- package/dist/runtime/mnemeMcp.d.ts +13 -0
- package/dist/runtime/mnemeMcp.js +26 -0
- package/dist/runtime/openclaw/adapter.js +2 -2
- package/dist/runtime/pi/adapter.d.ts +0 -1
- package/dist/runtime/pi/adapter.js +2 -6
- package/dist/runtime/pi/appCliSource.js +1 -1
- package/dist/runtime/pi/appScheduleSource.js +6 -2
- package/dist/runtime/pi/appTemplateTypes.d.ts +1 -1
- package/dist/runtime/picoclaw/adapter.js +2 -2
- package/dist/runtime/registry.d.ts +3 -0
- package/dist/runtime/registry.js +19 -2
- package/dist/runtime/scheduleUtils.d.ts +1 -0
- package/dist/runtime/scheduleUtils.js +5 -1
- package/dist/runtime/types.d.ts +25 -0
- package/dist/runtime/usageLedger.d.ts +158 -0
- package/dist/runtime/usageLedger.js +269 -0
- package/dist/runtime/usageLedgerRead.d.ts +48 -0
- package/dist/runtime/usageLedgerRead.js +102 -0
- package/dist/runtime/usageRequestLedger.d.ts +42 -0
- package/dist/runtime/usageRequestLedger.js +72 -0
- package/dist/shared/daimonCodexDocker.d.ts +32 -0
- package/dist/shared/daimonCodexDocker.js +120 -0
- package/dist/shared/daimonGrokSeccompProfile.d.ts +10 -0
- package/dist/shared/daimonGrokSeccompProfile.js +11 -0
- package/dist/shared/index.d.ts +2 -0
- package/dist/shared/index.js +2 -0
- package/dist/shared/types.d.ts +1 -1
- package/dist/shared/volumeNames.d.ts +6 -0
- package/dist/shared/volumeNames.js +14 -0
- package/dist/target/dockerArtifactsProvider.js +34 -7
- package/dist/target/dockerBaseImage.d.ts +2 -0
- package/dist/target/dockerBaseImage.js +11 -0
- package/dist/target/dockerCommandExecutor.d.ts +11 -0
- package/dist/target/dockerCommandExecutor.js +53 -2
- package/dist/target/dockerCommandExecutorCore.d.ts +2 -1
- package/dist/target/dockerCommandExecutorCore.js +4 -2
- package/dist/target/dockerPublicArtifactSnapshot.d.ts +3 -3
- package/dist/target/dockerPublicArtifactSnapshot.js +17 -33
- package/dist/target/dockerTarget.d.ts +1 -0
- package/dist/target/dockerTargetBinding.d.ts +1 -2
- package/dist/target/dockerTargetBinding.js +2 -3
- package/dist/target/dockerTargetExecFile.d.ts +19 -0
- package/dist/target/dockerTargetExecFile.js +194 -0
- package/dist/target/dockerWorldServiceProvider.d.ts +4 -0
- package/dist/target/dockerWorldServiceProvider.js +13 -1
- package/dist/target/evidenceExport.d.ts +3 -1
- package/dist/target/evidenceExport.js +12 -3
- package/dist/target/evidenceExportOperationsTestKit.js +3 -3
- package/dist/target/evidenceExportProvider.d.ts +2 -0
- package/dist/target/evidenceExportProvider.js +15 -5
- package/dist/target/publicArtifactSnapshot.d.ts +31 -0
- package/dist/target/publicArtifactSnapshot.js +37 -3
- package/examples/README.md +45 -0
- package/examples/agent-with-subagents/AGENTS.md +3 -0
- package/examples/agent-with-subagents/Spawnfile +30 -0
- package/examples/agent-with-subagents/subagents/critic/AGENTS.md +3 -0
- package/examples/agent-with-subagents/subagents/critic/Spawnfile +15 -0
- package/examples/agent-with-subagents/subagents/researcher/AGENTS.md +3 -0
- package/examples/agent-with-subagents/subagents/researcher/Spawnfile +17 -0
- package/examples/daimon-org/Spawnfile +68 -0
- package/examples/daimon-org/TEAM.md +4 -0
- package/examples/daimon-org/agents/mapper/AGENTS.md +4 -0
- package/examples/daimon-org/agents/mapper/Spawnfile +37 -0
- package/examples/daimon-org/shared/skills/file-note/SKILL.md +9 -0
- package/examples/daimon-org/teams/review/Spawnfile +53 -0
- package/examples/daimon-org/teams/review/agents/reviewer/AGENTS.md +4 -0
- package/examples/daimon-org/teams/review/agents/reviewer/Spawnfile +37 -0
- package/examples/daimon-public-host/AGENTS.md +3 -0
- package/examples/daimon-public-host/Spawnfile +21 -0
- package/examples/distribution-org/Spawnfile +43 -0
- package/examples/distribution-org/TEAM.md +4 -0
- package/examples/distribution-org/agents/coordinator/AGENTS.md +1 -0
- package/examples/distribution-org/agents/coordinator/Spawnfile +20 -0
- package/examples/distribution-org/agents/researcher/AGENTS.md +1 -0
- package/examples/distribution-org/agents/researcher/Spawnfile +20 -0
- package/examples/jungian-daimon-org/Spawnfile +41 -0
- package/examples/jungian-daimon-org/TEAM.md +21 -0
- package/examples/jungian-daimon-org/teams/luna/Spawnfile +47 -0
- package/examples/jungian-daimon-org/teams/luna/TEAM.md +4 -0
- package/examples/jungian-daimon-org/teams/luna/agents/animus/AGENTS.md +10 -0
- package/examples/jungian-daimon-org/teams/luna/agents/animus/Spawnfile +33 -0
- package/examples/jungian-daimon-org/teams/luna/agents/representative/AGENTS.md +21 -0
- package/examples/jungian-daimon-org/teams/luna/agents/representative/Spawnfile +30 -0
- package/examples/jungian-daimon-org/teams/luna/agents/shadow/AGENTS.md +10 -0
- package/examples/jungian-daimon-org/teams/luna/agents/shadow/Spawnfile +33 -0
- package/examples/jungian-daimon-org/teams/selene/Spawnfile +47 -0
- package/examples/jungian-daimon-org/teams/selene/TEAM.md +4 -0
- package/examples/jungian-daimon-org/teams/selene/agents/animus/AGENTS.md +10 -0
- package/examples/jungian-daimon-org/teams/selene/agents/animus/Spawnfile +33 -0
- package/examples/jungian-daimon-org/teams/selene/agents/representative/AGENTS.md +19 -0
- package/examples/jungian-daimon-org/teams/selene/agents/representative/Spawnfile +33 -0
- package/examples/jungian-daimon-org/teams/selene/agents/shadow/AGENTS.md +10 -0
- package/examples/jungian-daimon-org/teams/selene/agents/shadow/Spawnfile +30 -0
- package/examples/mixed-runtime-org/Spawnfile +71 -0
- package/examples/mixed-runtime-org/TEAM.md +8 -0
- package/examples/mixed-runtime-org/agents/analyst/AGENTS.md +8 -0
- package/examples/mixed-runtime-org/agents/analyst/Spawnfile +27 -0
- package/examples/mixed-runtime-org/agents/conductor/AGENTS.md +8 -0
- package/examples/mixed-runtime-org/agents/conductor/Spawnfile +27 -0
- package/examples/mixed-runtime-org/agents/localist/AGENTS.md +7 -0
- package/examples/mixed-runtime-org/agents/localist/Spawnfile +50 -0
- package/examples/moltnet-team-chat/Spawnfile +43 -0
- package/examples/moltnet-team-chat/TEAM.md +5 -0
- package/examples/moltnet-team-chat/agents/coordinator/AGENTS.md +9 -0
- package/examples/moltnet-team-chat/agents/coordinator/Spawnfile +26 -0
- package/examples/moltnet-team-chat/teams/analysis/Spawnfile +23 -0
- package/examples/moltnet-team-chat/teams/analysis/TEAM.md +3 -0
- package/examples/moltnet-team-chat/teams/analysis/agents/observer/AGENTS.md +5 -0
- package/examples/moltnet-team-chat/teams/analysis/agents/observer/Spawnfile +19 -0
- package/examples/moltnet-team-chat/teams/analysis/agents/representative/AGENTS.md +5 -0
- package/examples/moltnet-team-chat/teams/analysis/agents/representative/Spawnfile +19 -0
- package/examples/moltnet-team-chat/teams/field/Spawnfile +41 -0
- package/examples/moltnet-team-chat/teams/field/TEAM.md +3 -0
- package/examples/moltnet-team-chat/teams/field/agents/observer/AGENTS.md +5 -0
- package/examples/moltnet-team-chat/teams/field/agents/observer/Spawnfile +26 -0
- package/examples/moltnet-team-chat/teams/field/agents/representative/AGENTS.md +11 -0
- package/examples/moltnet-team-chat/teams/field/agents/representative/Spawnfile +26 -0
- package/examples/single-agent/AGENTS.md +3 -0
- package/examples/single-agent/HEARTBEAT.md +3 -0
- package/examples/single-agent/IDENTITY.md +3 -0
- package/examples/single-agent/MEMORY.md +3 -0
- package/examples/single-agent/SOUL.md +3 -0
- package/examples/single-agent/Spawnfile +41 -0
- package/examples/single-agent/skills/web_search/SKILL.md +6 -0
- package/moltnet-releases.json +5 -4
- package/package.json +36 -9
- package/runtimes.yaml +5 -2
- package/dist/cli/targetWorldClockCrossProcess.test-helper.d.ts +0 -13
- package/dist/cli/targetWorldClockCrossProcess.test-helper.js +0 -109
- package/dist/deployment/providerRuntimeBoundaryScanner.test-helper.d.ts +0 -8
- package/dist/deployment/providerRuntimeBoundaryScanner.test-helper.js +0 -60
- package/dist/deployment/simfileFixtureBoundary.test-helper.d.ts +0 -8
- package/dist/deployment/simfileFixtureBoundary.test-helper.js +0 -103
- package/dist/ownership/simfileRunOperatorInputs.d.ts +0 -103
- package/dist/ownership/simfileRunOperatorInputs.js +0 -139
- package/dist/target/cleanupRunDocker.test-helper.d.ts +0 -67
- package/dist/target/cleanupRunDocker.test-helper.js +0 -238
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
import { createHash } from "node:crypto";
|
|
3
2
|
import { rm } from "node:fs/promises";
|
|
4
|
-
import { createOrganizationReadinessPending,
|
|
5
|
-
import { createCanonicalSelectedTargetReceiptBytes, parseOpaqueTargetHandle, parseRunId, parseSelectedTargetReceipt, selectTarget } from "../target/index.js";
|
|
3
|
+
import { createOrganizationReadinessPending, createDockerDeploymentRecord, probeDockerOrganizationReadiness, readDeploymentRecord, resolveDockerDeploymentTarget, resolveDeploymentRecordPath, writeDeploymentRecord, writeDockerDeploymentRecordForRun, } from "../deployment/index.js";
|
|
6
4
|
import { buildProject } from "./buildProject.js";
|
|
7
5
|
import { createDockerRunInvocation, resolveDetachedDeploymentOptions, runDockerContainer } from "./runProject.js";
|
|
8
6
|
import { executeDockerRunWithSupportCleanup } from "./runProjectLifecycle.js";
|
|
9
7
|
import { requireAuthProfile } from "../auth/index.js";
|
|
10
8
|
import { DEFAULT_OUTPUT_DIRECTORY, SpawnfileError } from "../shared/index.js";
|
|
9
|
+
import { assertNoDeclaredVolumeNames, resolveDeploymentLineage } from "./deploymentLineage.js";
|
|
11
10
|
import { ensureNoopolisRunId, resolveNoopolisRunId } from "../runtime/index.js";
|
|
12
11
|
import { fileExists } from "../filesystem/index.js";
|
|
13
12
|
import { resolveHostCliCredential } from "./runProjectAuth.js";
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
import { defaultDockerTargetExecFile } from "../target/dockerTargetExecFile.js";
|
|
14
|
+
import { compileOrganizationHandoff, executeOrganizationHandoff, organizationHandoffInputError, resolveRequestedOrganizationHandoff, verifyRequestedOrganizationHandoffTarget, } from "./upProjectHandoff.js";
|
|
16
15
|
const stableRecord = (record) => {
|
|
17
16
|
const { created_at: _createdAt, export_index: _exportIndex, organization_ready: _organizationReady, ...stable } = record;
|
|
18
17
|
return stable;
|
|
@@ -26,85 +25,17 @@ const canonicalJson = (value) => {
|
|
|
26
25
|
}
|
|
27
26
|
const serialized = JSON.stringify(value);
|
|
28
27
|
if (serialized === undefined)
|
|
29
|
-
throw
|
|
28
|
+
throw organizationHandoffInputError();
|
|
30
29
|
return serialized;
|
|
31
30
|
};
|
|
32
|
-
const resolveRequestedHandoff = (options) => {
|
|
33
|
-
const values = [
|
|
34
|
-
options.descriptorDigest,
|
|
35
|
-
options.organizationHandoffRunId,
|
|
36
|
-
options.selectedTargetReceiptDigest,
|
|
37
|
-
options.selectedTargetReceipt,
|
|
38
|
-
options.networkAttachmentHandle,
|
|
39
|
-
options.worldBindingsPath
|
|
40
|
-
];
|
|
41
|
-
if (values.every((value) => value === undefined))
|
|
42
|
-
return null;
|
|
43
|
-
if (values.some((value) => value === undefined) || !options.detach)
|
|
44
|
-
throw handoffInputError();
|
|
45
|
-
try {
|
|
46
|
-
const selectedTarget = parseSelectedTargetReceipt(options.selectedTargetReceipt);
|
|
47
|
-
const selectedDigest = parseCanonicalSha256Digest(options.selectedTargetReceiptDigest, "selected_target_receipt_digest");
|
|
48
|
-
const computedDigest = `sha256:${createHash("sha256").update(createCanonicalSelectedTargetReceiptBytes(selectedTarget), "utf8").digest("hex")}`;
|
|
49
|
-
if (selectedDigest !== computedDigest)
|
|
50
|
-
throw new Error("selected receipt digest mismatch");
|
|
51
|
-
return {
|
|
52
|
-
descriptorDigest: parseCanonicalSha256Digest(options.descriptorDigest, "descriptor_digest"),
|
|
53
|
-
runId: parseRunId(options.organizationHandoffRunId),
|
|
54
|
-
networkAttachmentHandle: parseOpaqueTargetHandle(options.networkAttachmentHandle),
|
|
55
|
-
selectedTarget,
|
|
56
|
-
selectedTargetReceiptDigest: selectedDigest
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
throw handoffInputError();
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
const verifyRequestedHandoffTarget = async (requested, resolved, options) => {
|
|
64
|
-
if (!requested)
|
|
65
|
-
return;
|
|
66
|
-
if (typeof resolved.dockerContext !== "string" || resolved.dockerContext.length === 0
|
|
67
|
-
|| resolved.dockerHost != null || process.env.DOCKER_HOST != null)
|
|
68
|
-
throw handoffInputError();
|
|
69
|
-
try {
|
|
70
|
-
const actual = await selectTarget({
|
|
71
|
-
context: resolved.dockerContext,
|
|
72
|
-
dockerCommand: options.dockerCommand,
|
|
73
|
-
execFile: options.targetExecFile
|
|
74
|
-
});
|
|
75
|
-
if (createCanonicalSelectedTargetReceiptBytes(actual)
|
|
76
|
-
!== createCanonicalSelectedTargetReceiptBytes(requested.selectedTarget))
|
|
77
|
-
throw new Error("target mismatch");
|
|
78
|
-
}
|
|
79
|
-
catch {
|
|
80
|
-
throw handoffInputError();
|
|
81
|
-
}
|
|
82
|
-
};
|
|
83
|
-
const resolveCompiledHandoff = (requested, buildResult) => {
|
|
84
|
-
if (!requested)
|
|
85
|
-
return undefined;
|
|
86
|
-
try {
|
|
87
|
-
const bindingDigest = buildResult.organizationReadinessEvidence.worldBindings?.digest;
|
|
88
|
-
if (!bindingDigest)
|
|
89
|
-
throw new Error("missing compiled binding evidence");
|
|
90
|
-
const bindingDigestParsed = parseCanonicalSha256Digest(bindingDigest, "binding_digest");
|
|
91
|
-
return { authority: { ...requested, bindingDigest: bindingDigestParsed }, organizationHandoff: {
|
|
92
|
-
bindingDigest: bindingDigestParsed, networkAttachmentHandle: requested.networkAttachmentHandle,
|
|
93
|
-
selectedTargetReceiptDigest: requested.selectedTargetReceiptDigest
|
|
94
|
-
} };
|
|
95
|
-
}
|
|
96
|
-
catch {
|
|
97
|
-
throw handoffInputError();
|
|
98
|
-
}
|
|
99
|
-
};
|
|
100
31
|
export const upProject = async (inputPath, options = {}) => {
|
|
101
32
|
// Parse caller authority before any target or build work. Target identity is
|
|
102
33
|
// verified below from the resolved detached options, including exact record reuse.
|
|
103
|
-
const requestedHandoff =
|
|
34
|
+
const requestedHandoff = resolveRequestedOrganizationHandoff(options);
|
|
104
35
|
// Handoff reservation identity must survive a process crash. Unlike an
|
|
105
36
|
// ordinary deployment run, it may never silently mint a fresh run id.
|
|
106
37
|
if (requestedHandoff && resolveNoopolisRunId(process.env) !== requestedHandoff.runId)
|
|
107
|
-
throw
|
|
38
|
+
throw organizationHandoffInputError();
|
|
108
39
|
const resolvedOptions = await resolveDetachedDeploymentOptions(path.resolve(options.outputDirectory ?? DEFAULT_OUTPUT_DIRECTORY), {
|
|
109
40
|
authProfile: options.authProfile,
|
|
110
41
|
containerName: options.containerName,
|
|
@@ -117,7 +48,7 @@ export const upProject = async (inputPath, options = {}) => {
|
|
|
117
48
|
imageTag: options.imageTag,
|
|
118
49
|
targetExecFile: options.targetExecFile
|
|
119
50
|
});
|
|
120
|
-
await
|
|
51
|
+
await verifyRequestedOrganizationHandoffTarget(requestedHandoff, resolvedOptions, options);
|
|
121
52
|
// Every authority container compiled for this deployment must stamp
|
|
122
53
|
// causal events under the same real run id (see specs/CAUSAL.md).
|
|
123
54
|
// buildProject/compileProject stay deterministic functions of the host
|
|
@@ -132,6 +63,7 @@ export const upProject = async (inputPath, options = {}) => {
|
|
|
132
63
|
containerArchitecture: options.containerArchitecture,
|
|
133
64
|
dockerContext: resolvedOptions.dockerContext,
|
|
134
65
|
dockerCommand: options.dockerCommand,
|
|
66
|
+
deploymentLineage: resolveDeploymentLineage(resolvedOptions.deploymentName ?? "default", options.deploymentLineageNamespace),
|
|
135
67
|
imageTag: resolvedOptions.imageTag,
|
|
136
68
|
outputDirectory: options.outputDirectory,
|
|
137
69
|
runtimePackageOverrides: options.runtimePackageOverrides,
|
|
@@ -139,7 +71,12 @@ export const upProject = async (inputPath, options = {}) => {
|
|
|
139
71
|
? { worldBindingsPath: options.worldBindingsPath }
|
|
140
72
|
: {})
|
|
141
73
|
});
|
|
142
|
-
|
|
74
|
+
// Before anything starts: a namespaced (dev) deployment must not silently
|
|
75
|
+
// attach production's author-declared volumes by name.
|
|
76
|
+
if (options.deploymentLineageNamespace && !options.allowDeclaredVolumeNames) {
|
|
77
|
+
assertNoDeclaredVolumeNames(buildResult.report.container?.persistent_mounts ?? []);
|
|
78
|
+
}
|
|
79
|
+
const handoff = compileOrganizationHandoff(requestedHandoff, buildResult);
|
|
143
80
|
const authProfile = resolvedOptions.authProfile
|
|
144
81
|
? await requireAuthProfile(resolvedOptions.authProfile)
|
|
145
82
|
: null;
|
|
@@ -156,124 +93,113 @@ export const upProject = async (inputPath, options = {}) => {
|
|
|
156
93
|
dockerHost: resolvedOptions.dockerHost,
|
|
157
94
|
envFilePath: resolvedOptions.envFilePath
|
|
158
95
|
});
|
|
159
|
-
|
|
96
|
+
if (options.onDetachedStarted) {
|
|
97
|
+
const started = options.onDetachedStarted;
|
|
98
|
+
invocation.onDetachedStarted = async (result) => {
|
|
99
|
+
if (!result.containerId || !result.containerName || !result.imageId || !result.deploymentLabels) {
|
|
100
|
+
throw new SpawnfileError("runtime_error", "Detached deployment metadata is incomplete");
|
|
101
|
+
}
|
|
102
|
+
await started({ ...result, containerId: result.containerId, containerName: result.containerName, imageId: result.imageId, deploymentLabels: result.deploymentLabels });
|
|
103
|
+
};
|
|
104
|
+
}
|
|
160
105
|
let deploymentRecordPath;
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
106
|
+
if (handoff) {
|
|
107
|
+
const executed = await executeOrganizationHandoff({
|
|
108
|
+
dockerCommand: options.dockerCommand,
|
|
109
|
+
handoff,
|
|
110
|
+
invocation,
|
|
111
|
+
lifecycleRecovery: options.lifecycleRecovery,
|
|
112
|
+
onDetachedReservation: options.onDetachedReservation,
|
|
113
|
+
runRunner: options.runRunner ?? runDockerContainer,
|
|
114
|
+
targetExecFile: options.targetExecFile,
|
|
115
|
+
});
|
|
116
|
+
const { organizationHandoffHandle, runMetadata } = executed;
|
|
117
|
+
const existingRecordPath = invocation.detach && invocation.deploymentName
|
|
118
|
+
? resolveDeploymentRecordPath(buildResult.outputDirectory, invocation.deploymentName)
|
|
119
|
+
: null;
|
|
120
|
+
if (existingRecordPath && await fileExists(existingRecordPath)) {
|
|
121
|
+
const existing = await readDeploymentRecord(existingRecordPath);
|
|
122
|
+
const target = await resolveDockerDeploymentTarget({
|
|
123
|
+
context: invocation.dockerContext ?? undefined,
|
|
124
|
+
dockerCommand: invocation.command,
|
|
125
|
+
dockerHost: invocation.dockerHost ?? undefined,
|
|
126
|
+
execFile: options.targetExecFile,
|
|
127
|
+
});
|
|
128
|
+
const expected = createDockerDeploymentRecord({
|
|
129
|
+
authProfileName: authProfile?.name ?? null,
|
|
130
|
+
compileFingerprint: buildResult.report.compile_fingerprint ?? "",
|
|
170
131
|
containerName: invocation.containerName,
|
|
171
|
-
|
|
172
|
-
|
|
132
|
+
deploymentName: invocation.deploymentName ?? undefined,
|
|
133
|
+
envFilePath: resolvedOptions.envFilePath,
|
|
134
|
+
imageTag,
|
|
135
|
+
networkIds: buildResult.report.container?.moltnet?.server_plans
|
|
136
|
+
.filter((server) => server.mode === "managed").map((server) => server.network_id),
|
|
137
|
+
nodes: buildResult.report.nodes,
|
|
173
138
|
organizationHandoff: handoff.organizationHandoff,
|
|
139
|
+
organizationHandoffHandle,
|
|
140
|
+
outputDirectory: buildResult.outputDirectory,
|
|
141
|
+
projectRoot: buildResult.report.root,
|
|
174
142
|
runId: handoff.authority.runId,
|
|
175
|
-
|
|
176
|
-
|
|
143
|
+
runMetadata,
|
|
144
|
+
runtimeInstanceIds: buildResult.report.container?.runtime_instances.map((instance) => instance.id) ?? [],
|
|
145
|
+
target,
|
|
177
146
|
});
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
}
|
|
183
|
-
let runMetadata = undefined;
|
|
184
|
-
if (!recovered) {
|
|
185
|
-
dockerLifecycleInvoked = true;
|
|
186
|
-
runMetadata = await executeDockerRunWithSupportCleanup(invocation, options.runRunner ?? runDockerContainer);
|
|
147
|
+
if (canonicalJson(stableRecord(existing)) !== canonicalJson(stableRecord(expected))) {
|
|
148
|
+
throw organizationHandoffInputError();
|
|
149
|
+
}
|
|
150
|
+
deploymentRecordPath = existingRecordPath;
|
|
187
151
|
}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
if (recovered && !observed)
|
|
192
|
-
throw handoffRecoveryIncompleteError();
|
|
193
|
-
const recoveredMetadata = observed
|
|
194
|
-
? { containerId: observed.container_id, deploymentLabels: observed.deployment_labels, imageId: observed.image_id }
|
|
195
|
-
: undefined;
|
|
196
|
-
const exactRunMetadata = runMetadata ?? recoveredMetadata;
|
|
197
|
-
let organizationHandoffHandle;
|
|
198
|
-
if (handoff) {
|
|
199
|
-
if (!exactRunMetadata?.containerId || !exactRunMetadata.deploymentLabels || !exactRunMetadata.imageId || !authority || !pending)
|
|
200
|
-
throw handoffInputError();
|
|
201
|
-
if (!recovered)
|
|
202
|
-
await authority.observeDockerMutation(pending.pending_key, {
|
|
203
|
-
containerId: exactRunMetadata.containerId, deploymentLabels: exactRunMetadata.deploymentLabels, imageId: exactRunMetadata.imageId
|
|
204
|
-
});
|
|
205
|
-
const finalized = await authority.finalize(pending.pending_key, { containerId: exactRunMetadata.containerId, deploymentLabels: exactRunMetadata.deploymentLabels });
|
|
206
|
-
organizationHandoffHandle = finalized.organization_handoff_handle;
|
|
207
|
-
const existingRecordPath = invocation.detach && invocation.deploymentName
|
|
208
|
-
? resolveDeploymentRecordPath(buildResult.outputDirectory, invocation.deploymentName)
|
|
209
|
-
: null;
|
|
210
|
-
if (existingRecordPath && await fileExists(existingRecordPath)) {
|
|
211
|
-
const existing = await readDeploymentRecord(existingRecordPath);
|
|
212
|
-
const target = await resolveDockerDeploymentTarget({
|
|
213
|
-
context: invocation.dockerContext ?? undefined,
|
|
214
|
-
dockerCommand: invocation.command,
|
|
215
|
-
dockerHost: invocation.dockerHost ?? undefined,
|
|
216
|
-
execFile: options.targetExecFile
|
|
217
|
-
});
|
|
218
|
-
const expected = createDockerDeploymentRecord({
|
|
152
|
+
else {
|
|
153
|
+
deploymentRecordPath = invocation.detach && invocation.deploymentName
|
|
154
|
+
? await writeDockerDeploymentRecordForRun({
|
|
219
155
|
authProfileName: authProfile?.name ?? null,
|
|
220
|
-
compileFingerprint: buildResult.report.compile_fingerprint ?? "",
|
|
221
|
-
containerName: invocation.containerName,
|
|
222
|
-
deploymentName: invocation.deploymentName ?? undefined,
|
|
223
156
|
envFilePath: resolvedOptions.envFilePath,
|
|
224
157
|
imageTag,
|
|
225
|
-
|
|
226
|
-
.filter((server) => server.mode === "managed").map((server) => server.network_id),
|
|
227
|
-
nodes: buildResult.report.nodes,
|
|
158
|
+
invocation,
|
|
228
159
|
organizationHandoff: handoff.organizationHandoff,
|
|
229
160
|
organizationHandoffHandle,
|
|
230
161
|
outputDirectory: buildResult.outputDirectory,
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
162
|
+
report: buildResult.report,
|
|
163
|
+
runMetadata,
|
|
164
|
+
targetExecFile: options.targetExecFile,
|
|
165
|
+
})
|
|
166
|
+
: null;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
let dockerLifecycleInvoked = false;
|
|
171
|
+
try {
|
|
172
|
+
if (options.onDetachedReservation) {
|
|
173
|
+
if (!invocation.detach || !invocation.containerName || !invocation.deploymentLabels) {
|
|
174
|
+
throw new SpawnfileError("runtime_error", "Detached deployment authority is incomplete");
|
|
175
|
+
}
|
|
176
|
+
await options.onDetachedReservation({
|
|
177
|
+
containerName: invocation.containerName,
|
|
178
|
+
deploymentLabels: invocation.deploymentLabels,
|
|
179
|
+
dockerCommand: invocation.command,
|
|
180
|
+
dockerContext: invocation.dockerContext ?? null,
|
|
236
181
|
});
|
|
237
|
-
if (canonicalJson(stableRecord(existing)) !== canonicalJson(stableRecord(expected)))
|
|
238
|
-
throw handoffInputError();
|
|
239
|
-
deploymentRecordPath = existingRecordPath;
|
|
240
182
|
}
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
? await writeDockerDeploymentRecordForRun({ authProfileName: authProfile?.name ?? null, envFilePath: resolvedOptions.envFilePath,
|
|
244
|
-
imageTag, invocation, outputDirectory: buildResult.outputDirectory,
|
|
245
|
-
organizationHandoff: handoff.organizationHandoff, organizationHandoffHandle, report: buildResult.report,
|
|
246
|
-
runMetadata: exactRunMetadata, targetExecFile: options.targetExecFile })
|
|
247
|
-
: null;
|
|
248
|
-
}
|
|
249
|
-
else
|
|
183
|
+
dockerLifecycleInvoked = true;
|
|
184
|
+
const runMetadata = await executeDockerRunWithSupportCleanup(invocation, options.runRunner ?? runDockerContainer);
|
|
250
185
|
deploymentRecordPath = invocation.detach && invocation.deploymentName
|
|
251
|
-
? await writeDockerDeploymentRecordForRun({
|
|
252
|
-
|
|
253
|
-
|
|
186
|
+
? await writeDockerDeploymentRecordForRun({
|
|
187
|
+
authProfileName: authProfile?.name ?? null,
|
|
188
|
+
envFilePath: resolvedOptions.envFilePath,
|
|
189
|
+
imageTag,
|
|
190
|
+
invocation,
|
|
191
|
+
outputDirectory: buildResult.outputDirectory,
|
|
192
|
+
report: buildResult.report,
|
|
193
|
+
runMetadata: runMetadata ?? undefined,
|
|
194
|
+
targetExecFile: options.targetExecFile,
|
|
195
|
+
})
|
|
254
196
|
: null;
|
|
255
|
-
}
|
|
256
|
-
finally {
|
|
257
|
-
// Replay creates a fresh support directory but does not invoke the normal
|
|
258
|
-
// Docker lifecycle wrapper. Preserve its detached credential cleanup
|
|
259
|
-
// semantics without deleting bind-mount support files.
|
|
260
|
-
let cleanupError;
|
|
261
|
-
try {
|
|
262
|
-
if (invocation.detach && !dockerLifecycleInvoked)
|
|
263
|
-
await rm(invocation.envFilePath, { force: true });
|
|
264
|
-
}
|
|
265
|
-
catch (error) {
|
|
266
|
-
cleanupError = error;
|
|
267
197
|
}
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
if (cleanupError === undefined)
|
|
273
|
-
throw error;
|
|
198
|
+
finally {
|
|
199
|
+
if (invocation.detach && !dockerLifecycleInvoked) {
|
|
200
|
+
await rm(invocation.envFilePath, { force: true });
|
|
201
|
+
}
|
|
274
202
|
}
|
|
275
|
-
if (cleanupError !== undefined)
|
|
276
|
-
throw cleanupError;
|
|
277
203
|
}
|
|
278
204
|
if (deploymentRecordPath && buildResult.organizationReadinessEvidence) {
|
|
279
205
|
const record = await readDeploymentRecord(deploymentRecordPath);
|
|
@@ -292,6 +218,19 @@ export const upProject = async (inputPath, options = {}) => {
|
|
|
292
218
|
execFile: options.targetExecFile,
|
|
293
219
|
record: pendingRecord
|
|
294
220
|
});
|
|
221
|
+
if (organizationReady.state === "failed" || organizationReady.state === "cancelled") {
|
|
222
|
+
const unit = record.units[0];
|
|
223
|
+
const reference = unit?.container_id ?? unit?.container_name;
|
|
224
|
+
if (reference) {
|
|
225
|
+
const prefix = invocation.dockerContext
|
|
226
|
+
? ["--context", invocation.dockerContext]
|
|
227
|
+
: invocation.dockerHost ? ["--host", invocation.dockerHost] : [];
|
|
228
|
+
await (options.targetExecFile ?? defaultDockerTargetExecFile)(invocation.command, [...prefix, "container", "rm", "--force", reference], { timeout: 30_000 });
|
|
229
|
+
}
|
|
230
|
+
await rm(invocation.supportDirectory, { recursive: true, force: true });
|
|
231
|
+
await rm(deploymentRecordPath, { force: true });
|
|
232
|
+
throw new SpawnfileError("runtime_error", "Detached deployment failed organization readiness and was rolled back");
|
|
233
|
+
}
|
|
295
234
|
await writeDeploymentRecord(buildResult.outputDirectory, {
|
|
296
235
|
...pendingRecord,
|
|
297
236
|
organization_ready: organizationReady
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { type DockerTargetExecFile, type OrganizationHandoffInput } from "../deployment/index.js";
|
|
2
|
+
import { type OpaqueTargetHandle, type SelectedTargetReceipt } from "../target/index.js";
|
|
3
|
+
import type { UpLifecycleRecovery } from "../deployment/upLifecycleRecoveryState.js";
|
|
4
|
+
import { SpawnfileError } from "../shared/index.js";
|
|
5
|
+
import type { BuildProjectResult } from "./buildProject.js";
|
|
6
|
+
import { type DockerRunInvocation, type DockerRunResult, type DockerRunRunner } from "./runProject.js";
|
|
7
|
+
export interface OrganizationHandoffRequestOptions {
|
|
8
|
+
readonly descriptorDigest?: string;
|
|
9
|
+
readonly detach?: boolean;
|
|
10
|
+
readonly networkAttachmentHandle?: string;
|
|
11
|
+
readonly organizationHandoffRunId?: string;
|
|
12
|
+
readonly selectedTargetReceipt?: unknown;
|
|
13
|
+
readonly selectedTargetReceiptDigest?: string;
|
|
14
|
+
readonly worldBindingsPath?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface RequestedOrganizationHandoff extends Omit<OrganizationHandoffInput, "bindingDigest"> {
|
|
17
|
+
readonly descriptorDigest: string;
|
|
18
|
+
readonly runId: string;
|
|
19
|
+
readonly selectedTarget: SelectedTargetReceipt;
|
|
20
|
+
}
|
|
21
|
+
export interface CompiledOrganizationHandoff {
|
|
22
|
+
readonly authority: RequestedOrganizationHandoff & {
|
|
23
|
+
readonly bindingDigest: string;
|
|
24
|
+
};
|
|
25
|
+
readonly organizationHandoff: OrganizationHandoffInput;
|
|
26
|
+
}
|
|
27
|
+
export interface DetachedReservation {
|
|
28
|
+
readonly containerName: string;
|
|
29
|
+
readonly deploymentLabels: Readonly<Record<string, string>>;
|
|
30
|
+
readonly dockerCommand: string;
|
|
31
|
+
readonly dockerContext: string | null;
|
|
32
|
+
}
|
|
33
|
+
export declare const organizationHandoffInputError: () => SpawnfileError;
|
|
34
|
+
export declare const resolveRequestedOrganizationHandoff: (options: OrganizationHandoffRequestOptions) => RequestedOrganizationHandoff | null;
|
|
35
|
+
export declare const verifyRequestedOrganizationHandoffTarget: (requested: RequestedOrganizationHandoff | null, resolved: {
|
|
36
|
+
readonly dockerContext?: string | null;
|
|
37
|
+
readonly dockerHost?: string | null;
|
|
38
|
+
}, options: Pick<OrganizationHandoffExecutionOptions, "dockerCommand" | "targetExecFile">) => Promise<void>;
|
|
39
|
+
export declare const compileOrganizationHandoff: (requested: RequestedOrganizationHandoff | null, buildResult: BuildProjectResult) => CompiledOrganizationHandoff | undefined;
|
|
40
|
+
interface OrganizationHandoffExecutionOptions {
|
|
41
|
+
readonly dockerCommand?: string;
|
|
42
|
+
readonly lifecycleRecovery?: UpLifecycleRecovery;
|
|
43
|
+
readonly targetExecFile?: DockerTargetExecFile;
|
|
44
|
+
}
|
|
45
|
+
export interface ExecuteOrganizationHandoffOptions extends OrganizationHandoffExecutionOptions {
|
|
46
|
+
readonly handoff: CompiledOrganizationHandoff;
|
|
47
|
+
readonly invocation: DockerRunInvocation;
|
|
48
|
+
readonly onDetachedReservation?: (authority: DetachedReservation) => Promise<void>;
|
|
49
|
+
readonly runRunner: DockerRunRunner;
|
|
50
|
+
}
|
|
51
|
+
interface ExactRunMetadata extends DockerRunResult {
|
|
52
|
+
readonly containerId: string;
|
|
53
|
+
readonly containerName: string;
|
|
54
|
+
readonly deploymentLabels: Readonly<Record<string, string>>;
|
|
55
|
+
readonly imageId: string;
|
|
56
|
+
}
|
|
57
|
+
/** Resumes only lifecycle-verified state, never stale authority observations. */
|
|
58
|
+
export declare const executeOrganizationHandoff: (input: ExecuteOrganizationHandoffOptions) => Promise<{
|
|
59
|
+
readonly organizationHandoffHandle: OpaqueTargetHandle;
|
|
60
|
+
readonly runMetadata: ExactRunMetadata;
|
|
61
|
+
}>;
|
|
62
|
+
export {};
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { rm } from "node:fs/promises";
|
|
3
|
+
import { createDockerOrganizationHandoffSession, initializeOrganizationHandoffAuthorityStore, parseCanonicalSha256Digest, } from "../deployment/index.js";
|
|
4
|
+
import { createCanonicalSelectedTargetReceiptBytes, parseOpaqueTargetHandle, parseRunId, parseSelectedTargetReceipt, selectTarget, } from "../target/index.js";
|
|
5
|
+
import { isTrustedUpLifecycleRecovery } from "../deployment/upLifecycleRecoveryState.js";
|
|
6
|
+
import { SpawnfileError } from "../shared/index.js";
|
|
7
|
+
import { executeDockerRunWithSupportCleanup } from "./runProjectLifecycle.js";
|
|
8
|
+
import { recoverDetachedDockerRun, } from "./runProject.js";
|
|
9
|
+
export const organizationHandoffInputError = () => new SpawnfileError("validation_error", "Organization handoff requires authorized run id, selected target receipt, descriptor digest, selected target receipt digest, network attachment handle, and world bindings");
|
|
10
|
+
const recoveryError = () => new SpawnfileError("runtime_error", "Organization handoff recovery is incomplete; redeploy with explicit authorization");
|
|
11
|
+
export const resolveRequestedOrganizationHandoff = (options) => {
|
|
12
|
+
const values = [
|
|
13
|
+
options.descriptorDigest,
|
|
14
|
+
options.organizationHandoffRunId,
|
|
15
|
+
options.selectedTargetReceiptDigest,
|
|
16
|
+
options.selectedTargetReceipt,
|
|
17
|
+
options.networkAttachmentHandle,
|
|
18
|
+
options.worldBindingsPath,
|
|
19
|
+
];
|
|
20
|
+
if (values.every((value) => value === undefined))
|
|
21
|
+
return null;
|
|
22
|
+
if (values.some((value) => value === undefined) || !options.detach)
|
|
23
|
+
throw organizationHandoffInputError();
|
|
24
|
+
try {
|
|
25
|
+
const selectedTarget = parseSelectedTargetReceipt(options.selectedTargetReceipt);
|
|
26
|
+
const selectedDigest = parseCanonicalSha256Digest(options.selectedTargetReceiptDigest, "selected_target_receipt_digest");
|
|
27
|
+
const computedDigest = `sha256:${createHash("sha256").update(createCanonicalSelectedTargetReceiptBytes(selectedTarget), "utf8").digest("hex")}`;
|
|
28
|
+
if (selectedDigest !== computedDigest)
|
|
29
|
+
throw new Error("selected receipt digest mismatch");
|
|
30
|
+
return {
|
|
31
|
+
descriptorDigest: parseCanonicalSha256Digest(options.descriptorDigest, "descriptor_digest"),
|
|
32
|
+
runId: parseRunId(options.organizationHandoffRunId),
|
|
33
|
+
networkAttachmentHandle: parseOpaqueTargetHandle(options.networkAttachmentHandle),
|
|
34
|
+
selectedTarget,
|
|
35
|
+
selectedTargetReceiptDigest: selectedDigest,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
throw organizationHandoffInputError();
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
export const verifyRequestedOrganizationHandoffTarget = async (requested, resolved, options) => {
|
|
43
|
+
if (!requested)
|
|
44
|
+
return;
|
|
45
|
+
if (typeof resolved.dockerContext !== "string" || resolved.dockerContext.length === 0
|
|
46
|
+
|| resolved.dockerHost != null || process.env.DOCKER_HOST != null)
|
|
47
|
+
throw organizationHandoffInputError();
|
|
48
|
+
try {
|
|
49
|
+
const actual = await selectTarget({
|
|
50
|
+
context: resolved.dockerContext,
|
|
51
|
+
dockerCommand: options.dockerCommand,
|
|
52
|
+
execFile: options.targetExecFile,
|
|
53
|
+
});
|
|
54
|
+
if (createCanonicalSelectedTargetReceiptBytes(actual)
|
|
55
|
+
!== createCanonicalSelectedTargetReceiptBytes(requested.selectedTarget))
|
|
56
|
+
throw new Error("target mismatch");
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
throw organizationHandoffInputError();
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
export const compileOrganizationHandoff = (requested, buildResult) => {
|
|
63
|
+
if (!requested)
|
|
64
|
+
return undefined;
|
|
65
|
+
try {
|
|
66
|
+
const bindingDigest = buildResult.organizationReadinessEvidence.worldBindings?.digest;
|
|
67
|
+
if (!bindingDigest)
|
|
68
|
+
throw new Error("missing compiled binding evidence");
|
|
69
|
+
const parsedBindingDigest = parseCanonicalSha256Digest(bindingDigest, "binding_digest");
|
|
70
|
+
return {
|
|
71
|
+
authority: { ...requested, bindingDigest: parsedBindingDigest },
|
|
72
|
+
organizationHandoff: {
|
|
73
|
+
bindingDigest: parsedBindingDigest,
|
|
74
|
+
networkAttachmentHandle: requested.networkAttachmentHandle,
|
|
75
|
+
selectedTargetReceiptDigest: requested.selectedTargetReceiptDigest,
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
throw organizationHandoffInputError();
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
const canonical = (value) => value === null || typeof value !== "object"
|
|
84
|
+
? JSON.stringify(value)
|
|
85
|
+
: Array.isArray(value) ? `[${value.map(canonical).join(",")}]`
|
|
86
|
+
: `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`).join(",")}}`;
|
|
87
|
+
const same = (left, right) => canonical(left) === canonical(right);
|
|
88
|
+
const exactRunMetadata = (value) => {
|
|
89
|
+
if (!value?.containerId || !value.containerName || !value.imageId || !value.deploymentLabels) {
|
|
90
|
+
throw organizationHandoffInputError();
|
|
91
|
+
}
|
|
92
|
+
return value;
|
|
93
|
+
};
|
|
94
|
+
const reattestRecoveredRun = async (invocation, expected) => {
|
|
95
|
+
const actual = exactRunMetadata(await recoverDetachedDockerRun(invocation, expected.containerId));
|
|
96
|
+
if (actual.containerName !== expected.containerName || actual.imageId !== expected.imageId
|
|
97
|
+
|| !same(actual.deploymentLabels, expected.deploymentLabels))
|
|
98
|
+
throw recoveryError();
|
|
99
|
+
return actual;
|
|
100
|
+
};
|
|
101
|
+
const recovery = (value) => {
|
|
102
|
+
if (value !== undefined && !isTrustedUpLifecycleRecovery(value))
|
|
103
|
+
throw organizationHandoffInputError();
|
|
104
|
+
return value;
|
|
105
|
+
};
|
|
106
|
+
const reserveDetachedRun = async (invocation, reserve) => {
|
|
107
|
+
if (!reserve)
|
|
108
|
+
return;
|
|
109
|
+
if (!invocation.detach || !invocation.containerName || !invocation.deploymentLabels) {
|
|
110
|
+
throw new SpawnfileError("runtime_error", "Detached deployment authority is incomplete");
|
|
111
|
+
}
|
|
112
|
+
await reserve({
|
|
113
|
+
containerName: invocation.containerName,
|
|
114
|
+
deploymentLabels: invocation.deploymentLabels,
|
|
115
|
+
dockerCommand: invocation.command,
|
|
116
|
+
dockerContext: invocation.dockerContext ?? null,
|
|
117
|
+
});
|
|
118
|
+
};
|
|
119
|
+
/** Resumes only lifecycle-verified state, never stale authority observations. */
|
|
120
|
+
export const executeOrganizationHandoff = async (input) => {
|
|
121
|
+
const { handoff, invocation } = input;
|
|
122
|
+
if (!invocation.deploymentLabels || !invocation.containerName)
|
|
123
|
+
throw organizationHandoffInputError();
|
|
124
|
+
const lifecycleRecovery = recovery(input.lifecycleRecovery);
|
|
125
|
+
const session = createDockerOrganizationHandoffSession({
|
|
126
|
+
bindingDigest: handoff.authority.bindingDigest,
|
|
127
|
+
containerName: invocation.containerName,
|
|
128
|
+
deploymentLabels: invocation.deploymentLabels,
|
|
129
|
+
descriptorDigest: handoff.authority.descriptorDigest,
|
|
130
|
+
organizationHandoff: handoff.organizationHandoff,
|
|
131
|
+
runId: handoff.authority.runId,
|
|
132
|
+
selectedTarget: handoff.authority.selectedTarget,
|
|
133
|
+
selectedTargetReceiptDigest: handoff.authority.selectedTargetReceiptDigest,
|
|
134
|
+
});
|
|
135
|
+
let authority;
|
|
136
|
+
let dockerLifecycleInvoked = false;
|
|
137
|
+
try {
|
|
138
|
+
// Persist the lifecycle reservation first. A post-begin crash can then be
|
|
139
|
+
// distinguished as no-start, exact-container, or ambiguous on restart.
|
|
140
|
+
if (lifecycleRecovery?.kind !== "deployment_record") {
|
|
141
|
+
await reserveDetachedRun(invocation, input.onDetachedReservation);
|
|
142
|
+
}
|
|
143
|
+
authority = await initializeOrganizationHandoffAuthorityStore();
|
|
144
|
+
const begun = await authority.begin(session.authorityInput);
|
|
145
|
+
let runMetadata;
|
|
146
|
+
if (begun.created) {
|
|
147
|
+
if (lifecycleRecovery?.kind === "detached_container"
|
|
148
|
+
|| lifecycleRecovery?.kind === "deployment_record")
|
|
149
|
+
throw recoveryError();
|
|
150
|
+
dockerLifecycleInvoked = true;
|
|
151
|
+
runMetadata = exactRunMetadata(await executeDockerRunWithSupportCleanup(invocation, input.runRunner));
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
const observed = await authority.readDockerMutation(begun.pending.pending_key);
|
|
155
|
+
if (observed) {
|
|
156
|
+
if (lifecycleRecovery?.kind === "no_docker_mutation")
|
|
157
|
+
throw recoveryError();
|
|
158
|
+
const expected = {
|
|
159
|
+
containerId: observed.container_id,
|
|
160
|
+
containerName: invocation.containerName,
|
|
161
|
+
deploymentLabels: observed.deployment_labels,
|
|
162
|
+
imageId: observed.image_id,
|
|
163
|
+
};
|
|
164
|
+
if (lifecycleRecovery?.kind === "detached_container" && (lifecycleRecovery.containerId !== expected.containerId
|
|
165
|
+
|| lifecycleRecovery.containerName !== expected.containerName
|
|
166
|
+
|| lifecycleRecovery.imageId !== expected.imageId
|
|
167
|
+
|| !same(lifecycleRecovery.deploymentLabels, expected.deploymentLabels)))
|
|
168
|
+
throw recoveryError();
|
|
169
|
+
runMetadata = await reattestRecoveredRun(invocation, expected);
|
|
170
|
+
}
|
|
171
|
+
else if (lifecycleRecovery?.kind === "detached_container") {
|
|
172
|
+
runMetadata = await reattestRecoveredRun(invocation, lifecycleRecovery);
|
|
173
|
+
}
|
|
174
|
+
else if (lifecycleRecovery?.kind === "no_docker_mutation") {
|
|
175
|
+
dockerLifecycleInvoked = true;
|
|
176
|
+
runMetadata = exactRunMetadata(await executeDockerRunWithSupportCleanup(invocation, input.runRunner));
|
|
177
|
+
}
|
|
178
|
+
else
|
|
179
|
+
throw recoveryError();
|
|
180
|
+
}
|
|
181
|
+
await authority.observeDockerMutation(begun.pending.pending_key, runMetadata);
|
|
182
|
+
const finalized = await authority.finalize(begun.pending.pending_key, runMetadata);
|
|
183
|
+
return { organizationHandoffHandle: finalized.organization_handoff_handle, runMetadata };
|
|
184
|
+
}
|
|
185
|
+
finally {
|
|
186
|
+
let cleanupError;
|
|
187
|
+
try {
|
|
188
|
+
if (invocation.detach && !dockerLifecycleInvoked)
|
|
189
|
+
await rm(invocation.envFilePath, { force: true });
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
cleanupError = error;
|
|
193
|
+
}
|
|
194
|
+
try {
|
|
195
|
+
await authority?.dispose();
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
if (cleanupError === undefined)
|
|
199
|
+
throw error;
|
|
200
|
+
}
|
|
201
|
+
if (cleanupError !== undefined)
|
|
202
|
+
throw cleanupError;
|
|
203
|
+
}
|
|
204
|
+
};
|