spawnfile 0.1.12 → 0.1.14
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 +58 -12
- package/dist/audit/auditCli.d.ts +19 -0
- package/dist/audit/auditCli.js +63 -0
- package/dist/audit/checks.d.ts +100 -0
- package/dist/audit/checks.js +279 -0
- package/dist/audit/checksShared.d.ts +74 -0
- package/dist/audit/checksShared.js +37 -0
- package/dist/audit/generateAudit.d.ts +19 -0
- package/dist/audit/generateAudit.js +122 -0
- package/dist/audit/index.d.ts +4 -0
- package/dist/audit/index.js +4 -0
- package/dist/audit/readAudit.d.ts +50 -0
- package/dist/audit/readAudit.js +59 -0
- package/dist/audit/types.d.ts +40 -0
- package/dist/audit/types.js +8 -0
- package/dist/auth/credentialEnvFile.d.ts +11 -0
- package/dist/auth/credentialEnvFile.js +60 -0
- package/dist/auth/credentialProvisioning.d.ts +15 -0
- package/dist/auth/credentialProvisioning.js +75 -0
- package/dist/auth/credentialProvisioningReceipt.d.ts +28 -0
- package/dist/auth/credentialProvisioningReceipt.js +70 -0
- package/dist/auth/credentialProvisioningRequest.d.ts +51 -0
- package/dist/auth/credentialProvisioningRequest.js +169 -0
- package/dist/auth/credentialWorldBindings.d.ts +21 -0
- package/dist/auth/credentialWorldBindings.js +104 -0
- package/dist/auth/index.d.ts +7 -0
- package/dist/auth/index.js +7 -0
- package/dist/auth/paths.d.ts +11 -0
- package/dist/auth/paths.js +21 -0
- package/dist/auth/runtimeCredentials.js +18 -2
- package/dist/auth/targetSecretSourceAuthor.d.ts +18 -0
- package/dist/auth/targetSecretSourceAuthor.js +52 -0
- package/dist/auth/targetSecretSourceFsPublish.d.ts +15 -0
- package/dist/auth/targetSecretSourceFsPublish.js +49 -0
- package/dist/auth/targetSecretSourceFsPublishImmutable.d.ts +16 -0
- package/dist/auth/targetSecretSourceFsPublishImmutable.js +435 -0
- package/dist/auth/targetSecretSourceFsRead.d.ts +14 -0
- package/dist/auth/targetSecretSourceFsRead.js +198 -0
- package/dist/auth/targetSecretSourceGrant.d.ts +16 -0
- package/dist/auth/targetSecretSourceGrant.js +99 -0
- package/dist/auth/targetSecretSourceGrantRecords.d.ts +84 -0
- package/dist/auth/targetSecretSourceGrantRecords.js +214 -0
- package/dist/auth/targetSecretSourceLifecycle.d.ts +30 -0
- package/dist/auth/targetSecretSourceLifecycle.js +52 -0
- package/dist/auth/targetSecretSourceOwnerEntropy.d.ts +6 -0
- package/dist/auth/targetSecretSourceOwnerEntropy.js +28 -0
- package/dist/auth/targetSecretSourceRecordCommon.d.ts +14 -0
- package/dist/auth/targetSecretSourceRecordCommon.js +100 -0
- package/dist/auth/targetSecretSourceRecordPublish.d.ts +10 -0
- package/dist/auth/targetSecretSourceRecordPublish.js +104 -0
- package/dist/auth/targetSecretSourceResolver.d.ts +10 -0
- package/dist/auth/targetSecretSourceResolver.js +137 -0
- package/dist/auth/targetSecretSourceRevoke.d.ts +20 -0
- package/dist/auth/targetSecretSourceRevoke.js +92 -0
- package/dist/auth/targetSecretSourceRotate.d.ts +19 -0
- package/dist/auth/targetSecretSourceRotate.js +121 -0
- package/dist/auth/targetSecretSourceVersionRecords.d.ts +49 -0
- package/dist/auth/targetSecretSourceVersionRecords.js +166 -0
- package/dist/cli/artifactsCommands.d.ts +27 -0
- package/dist/cli/artifactsCommands.js +132 -0
- package/dist/cli/authCommands.d.ts +5 -0
- package/dist/cli/authCommands.js +221 -0
- package/dist/cli/compileBuildCommands.d.ts +3 -0
- package/dist/cli/compileBuildCommands.js +35 -0
- package/dist/cli/containerBundleCommand.d.ts +6 -0
- package/dist/cli/containerBundleCommand.js +116 -0
- package/dist/cli/devCommands.d.ts +3 -0
- package/dist/cli/devCommands.js +115 -0
- package/dist/cli/downCommand.d.ts +25 -0
- package/dist/cli/downCommand.js +134 -0
- package/dist/cli/index.js +6 -3
- package/dist/cli/lifecycleCommands.d.ts +1 -1
- package/dist/cli/lifecycleCommands.js +11 -179
- package/dist/cli/lifecycleMachine.d.ts +19 -0
- package/dist/cli/lifecycleMachine.js +78 -0
- package/dist/cli/lifecyclePlan.d.ts +35 -0
- package/dist/cli/lifecyclePlan.js +240 -0
- package/dist/cli/lifecyclePlanningCommands.d.ts +3 -0
- package/dist/cli/lifecyclePlanningCommands.js +30 -0
- package/dist/cli/runCli.d.ts +15 -2
- package/dist/cli/runCli.js +31 -71
- package/dist/cli/runPublishCommands.d.ts +3 -0
- package/dist/cli/runPublishCommands.js +70 -0
- package/dist/cli/statusCommand.d.ts +3 -32
- package/dist/cli/statusCommand.js +37 -233
- package/dist/cli/statusCommandLive.d.ts +20 -0
- package/dist/cli/statusCommandLive.js +188 -0
- package/dist/cli/statusCommandOptions.d.ts +40 -0
- package/dist/cli/statusCommandOptions.js +42 -0
- package/dist/cli/targetCliRoute.d.ts +2 -0
- package/dist/cli/targetCliRoute.js +30 -0
- package/dist/cli/targetCommands.d.ts +33 -0
- package/dist/cli/targetCommands.js +257 -0
- package/dist/cli/targetComposedPreparationCommand.d.ts +6 -0
- package/dist/cli/targetComposedPreparationCommand.js +39 -0
- package/dist/cli/targetDefaultArtifactAuthority.d.ts +5 -0
- package/dist/cli/targetDefaultArtifactAuthority.js +28 -0
- package/dist/cli/targetDefaultAuthorities.d.ts +53 -0
- package/dist/cli/targetDefaultAuthorities.js +210 -0
- package/dist/cli/targetDefaultConfig.d.ts +68 -0
- package/dist/cli/targetDefaultConfig.js +317 -0
- package/dist/cli/targetDefaultConfigStdin.d.ts +13 -0
- package/dist/cli/targetDefaultConfigStdin.js +215 -0
- package/dist/cli/targetDefaultEnvelope.d.ts +1 -0
- package/dist/cli/targetDefaultEnvelope.js +13 -0
- package/dist/cli/targetDefaultHandlerFactory.d.ts +28 -0
- package/dist/cli/targetDefaultHandlerFactory.js +247 -0
- package/dist/cli/targetDefaultHandlers.d.ts +21 -0
- package/dist/cli/targetDefaultHandlers.js +72 -0
- package/dist/cli/targetDefaultJournalAuthority.d.ts +35 -0
- package/dist/cli/targetDefaultJournalAuthority.js +135 -0
- package/dist/cli/targetDefaultWorldClock.d.ts +4 -0
- package/dist/cli/targetDefaultWorldClock.js +14 -0
- package/dist/cli/targetDefaultWorldQueries.d.ts +5 -0
- package/dist/cli/targetDefaultWorldQueries.js +11 -0
- package/dist/cli/targetDefaultWorldReadiness.d.ts +4 -0
- package/dist/cli/targetDefaultWorldReadiness.js +17 -0
- package/dist/cli/targetEvidenceHelperResolution.d.ts +14 -0
- package/dist/cli/targetEvidenceHelperResolution.js +23 -0
- package/dist/cli/targetLookupCli.d.ts +3 -0
- package/dist/cli/targetLookupCli.js +31 -0
- package/dist/cli/targetLookupCommands.d.ts +12 -0
- package/dist/cli/targetLookupCommands.js +69 -0
- package/dist/cli/targetOperationDispatch.d.ts +58 -0
- package/dist/cli/targetOperationDispatch.js +21 -0
- package/dist/cli/targetReceiptOutput.d.ts +14 -0
- package/dist/cli/targetReceiptOutput.js +21 -0
- package/dist/cli/targetRequestFile.d.ts +14 -0
- package/dist/cli/targetRequestFile.js +63 -0
- package/dist/cli/targetSecretSourceInput.d.ts +28 -0
- package/dist/cli/targetSecretSourceInput.js +121 -0
- package/dist/cli/targetWorldClockCommand.d.ts +10 -0
- package/dist/cli/targetWorldClockCommand.js +42 -0
- package/dist/cli/targetWorldClockCrossProcess.test-helper.d.ts +13 -0
- package/dist/cli/targetWorldClockCrossProcess.test-helper.js +109 -0
- package/dist/cli/targetWorldReadinessCommand.d.ts +10 -0
- package/dist/cli/targetWorldReadinessCommand.js +43 -0
- package/dist/cli/upCommand.d.ts +3 -0
- package/dist/cli/upCommand.js +133 -0
- package/dist/cli/upImageCommand.d.ts +11 -0
- package/dist/cli/upImageCommand.js +41 -0
- package/dist/cli/upLifecycleInvocation.d.ts +41 -0
- package/dist/cli/upLifecycleInvocation.js +48 -0
- package/dist/cli/upLifecycleRecovery.d.ts +4 -0
- package/dist/cli/upLifecycleRecovery.js +53 -0
- package/dist/compiler/agentNodeMerge.d.ts +2 -0
- package/dist/compiler/agentNodeMerge.js +79 -0
- package/dist/compiler/agentSurfaces.js +11 -1
- package/dist/compiler/buildCompilePlan.js +17 -0
- package/dist/compiler/buildCompilePlanAgent.d.ts +11 -0
- package/dist/compiler/buildCompilePlanAgent.js +56 -0
- package/dist/compiler/buildCompilePlanTeams.d.ts +1 -0
- package/dist/compiler/buildCompilePlanTeams.js +4 -1
- package/dist/compiler/buildCompilePlanTraversal.js +75 -82
- package/dist/compiler/buildProject.d.ts +20 -1
- package/dist/compiler/buildProject.js +121 -7
- package/dist/compiler/compilePlanHelpers.js +2 -0
- package/dist/compiler/compileProject.d.ts +15 -0
- package/dist/compiler/compileProject.js +29 -75
- package/dist/compiler/compileProjectPolicy.d.ts +5 -0
- package/dist/compiler/compileProjectPolicy.js +21 -0
- package/dist/compiler/compileProjectReports.d.ts +9 -0
- package/dist/compiler/compileProjectReports.js +52 -0
- package/dist/compiler/containerArtifactSummaries.d.ts +7 -0
- package/dist/compiler/containerArtifactSummaries.js +138 -0
- package/dist/compiler/containerArtifacts.d.ts +10 -0
- package/dist/compiler/containerArtifacts.js +126 -125
- package/dist/compiler/containerArtifactsPlans.d.ts +5 -3
- package/dist/compiler/containerArtifactsPlans.js +31 -118
- package/dist/compiler/containerArtifactsRender.d.ts +3 -1
- package/dist/compiler/containerArtifactsRender.js +40 -81
- package/dist/compiler/containerArtifactsTypes.d.ts +12 -0
- package/dist/compiler/containerConfigEnvRender.d.ts +3 -0
- package/dist/compiler/containerConfigEnvRender.js +54 -0
- package/dist/compiler/containerEntrypointRender.d.ts +1 -0
- package/dist/compiler/containerEntrypointRender.js +60 -53
- package/dist/compiler/containerEntrypointShell.d.ts +5 -0
- package/dist/compiler/containerEntrypointShell.js +29 -0
- package/dist/compiler/containerPackageOverrides.d.ts +27 -0
- package/dist/compiler/containerPackageOverrides.js +63 -0
- package/dist/compiler/containerPackageRender.d.ts +15 -0
- package/dist/compiler/containerPackageRender.js +63 -0
- package/dist/compiler/containerTargetPlanResolution.d.ts +20 -0
- package/dist/compiler/containerTargetPlanResolution.js +97 -0
- package/dist/compiler/containerTargetResources.js +3 -1
- package/dist/compiler/daimonTelemetryArtifacts.d.ts +22 -0
- package/dist/compiler/daimonTelemetryArtifacts.js +61 -0
- package/dist/compiler/dockerBuildContext.d.ts +16 -0
- package/dist/compiler/dockerBuildContext.js +159 -0
- package/dist/compiler/dockerBuildSkip.d.ts +30 -0
- package/dist/compiler/dockerBuildSkip.js +81 -0
- package/dist/compiler/index.d.ts +4 -0
- package/dist/compiler/index.js +4 -0
- package/dist/compiler/memoryArtifacts.d.ts +26 -0
- package/dist/compiler/memoryArtifacts.js +134 -0
- package/dist/compiler/memoryResolution.d.ts +4 -0
- package/dist/compiler/memoryResolution.js +147 -0
- package/dist/compiler/modelEnv.d.ts +2 -0
- package/dist/compiler/modelEnv.js +6 -0
- package/dist/compiler/moltnetAllowedWakeSendersValidation.d.ts +2 -0
- package/dist/compiler/moltnetAllowedWakeSendersValidation.js +42 -0
- package/dist/compiler/moltnetArtifactPaths.d.ts +26 -0
- package/dist/compiler/moltnetArtifactPaths.js +49 -0
- package/dist/compiler/moltnetArtifactTypes.d.ts +46 -0
- package/dist/compiler/moltnetArtifactTypes.js +1 -0
- package/dist/compiler/moltnetArtifacts.d.ts +2 -40
- package/dist/compiler/moltnetArtifacts.js +56 -95
- package/dist/compiler/moltnetBinaries.d.ts +21 -1
- package/dist/compiler/moltnetBinaries.js +156 -28
- package/dist/compiler/moltnetClientConfig.js +18 -2
- package/dist/compiler/moltnetConfigLowering.d.ts +16 -1
- package/dist/compiler/moltnetConfigLowering.js +67 -5
- package/dist/compiler/moltnetExternalParticipantArtifact.d.ts +38 -0
- package/dist/compiler/moltnetExternalParticipantArtifact.js +188 -0
- package/dist/compiler/moltnetNodeConfig.js +7 -2
- package/dist/compiler/moltnetReleaseAuthority.d.ts +17 -0
- package/dist/compiler/moltnetReleaseAuthority.js +73 -0
- package/dist/compiler/moltnetReleaseDownload.d.ts +12 -0
- package/dist/compiler/moltnetReleaseDownload.js +85 -0
- package/dist/compiler/moltnetRepresentativeResolution.d.ts +1 -0
- package/dist/compiler/moltnetRepresentativeResolution.js +16 -2
- package/dist/compiler/moltnetResolution.js +72 -20
- package/dist/compiler/moltnetRoomMemberships.js +37 -9
- package/dist/compiler/moltnetRuntimeConfig.js +11 -0
- package/dist/compiler/moltnetServerPlans.d.ts +9 -0
- package/dist/compiler/moltnetServerPlans.js +132 -0
- package/dist/compiler/organizationIdentity.d.ts +27 -0
- package/dist/compiler/organizationIdentity.js +297 -0
- package/dist/compiler/organizationReadyEvidence.d.ts +49 -0
- package/dist/compiler/organizationReadyEvidence.js +261 -0
- package/dist/compiler/projectManifestGraph.d.ts +4 -0
- package/dist/compiler/projectManifestGraph.js +24 -0
- package/dist/compiler/runProject.d.ts +4 -0
- package/dist/compiler/runProject.js +37 -22
- package/dist/compiler/runProjectAuth.d.ts +7 -1
- package/dist/compiler/runProjectAuth.js +87 -9
- package/dist/compiler/runProjectDocker.d.ts +7 -0
- package/dist/compiler/runProjectDocker.js +187 -19
- package/dist/compiler/runProjectLifecycle.d.ts +7 -0
- package/dist/compiler/runProjectLifecycle.js +40 -0
- package/dist/compiler/syncProjectAuth.js +4 -1
- package/dist/compiler/teamContextActiveEnvironments.d.ts +13 -0
- package/dist/compiler/teamContextActiveEnvironments.js +255 -0
- package/dist/compiler/teamContextSupport.js +32 -40
- package/dist/compiler/teamContextTypes.d.ts +2 -0
- package/dist/compiler/types.d.ts +82 -1
- package/dist/compiler/upProject.d.ts +5 -0
- package/dist/compiler/upProject.js +257 -20
- package/dist/compiler/upReceipt.d.ts +36 -0
- package/dist/compiler/upReceipt.js +82 -0
- package/dist/compiler/updateProjectModels.js +42 -60
- package/dist/compiler/updateProjectRuntime.js +22 -35
- package/dist/compiler/updateProjectSurfaces.js +53 -47
- package/dist/compiler/worldBindings.d.ts +39 -0
- package/dist/compiler/worldBindings.js +247 -0
- package/dist/compiler/worldBindingsFile.d.ts +5 -0
- package/dist/compiler/worldBindingsFile.js +162 -0
- package/dist/deployment/artifactsExport.d.ts +49 -0
- package/dist/deployment/artifactsExport.js +217 -0
- package/dist/deployment/artifactsExportDocker.d.ts +48 -0
- package/dist/deployment/artifactsExportDocker.js +91 -0
- package/dist/deployment/artifactsExportPlan.d.ts +24 -0
- package/dist/deployment/artifactsExportPlan.js +135 -0
- package/dist/deployment/artifactsExportTypes.d.ts +50 -0
- package/dist/deployment/artifactsExportTypes.js +52 -0
- package/dist/deployment/buildImageCacheStore.d.ts +23 -0
- package/dist/deployment/buildImageCacheStore.js +54 -0
- package/dist/deployment/deploymentLifecycleCorrelation.d.ts +11 -0
- package/dist/deployment/deploymentLifecycleCorrelation.js +33 -0
- package/dist/deployment/dockerInspect.d.ts +9 -0
- package/dist/deployment/dockerInspect.js +24 -1
- package/dist/deployment/dockerLabels.d.ts +2 -0
- package/dist/deployment/dockerLabels.js +2 -0
- package/dist/deployment/dockerLogs.js +2 -10
- package/dist/deployment/dockerManager.d.ts +51 -0
- package/dist/deployment/dockerManager.js +118 -1
- package/dist/deployment/dockerProbeGateway.js +64 -5
- package/dist/deployment/dockerRecover.d.ts +17 -0
- package/dist/deployment/dockerRecover.js +137 -0
- package/dist/deployment/dockerTeardown.d.ts +32 -0
- package/dist/deployment/dockerTeardown.js +61 -0
- package/dist/deployment/downDeployment.d.ts +34 -0
- package/dist/deployment/downDeployment.js +147 -0
- package/dist/deployment/downReceiptTypes.d.ts +21 -0
- package/dist/deployment/downReceiptTypes.js +30 -0
- package/dist/deployment/index.d.ts +17 -0
- package/dist/deployment/index.js +18 -0
- package/dist/deployment/lifecycleCompletion.d.ts +37 -0
- package/dist/deployment/lifecycleCompletion.js +236 -0
- package/dist/deployment/lifecycleCompletionContracts.d.ts +158 -0
- package/dist/deployment/lifecycleCompletionContracts.js +106 -0
- package/dist/deployment/lifecycleCompletionHeartbeat.d.ts +2 -0
- package/dist/deployment/lifecycleCompletionHeartbeat.js +50 -0
- package/dist/deployment/lifecycleCompletionLookup.d.ts +18 -0
- package/dist/deployment/lifecycleCompletionLookup.js +88 -0
- package/dist/deployment/lifecycleCompletionOwner.d.ts +8 -0
- package/dist/deployment/lifecycleCompletionOwner.js +31 -0
- package/dist/deployment/lifecycleCompletionParsing.d.ts +12 -0
- package/dist/deployment/lifecycleCompletionParsing.js +108 -0
- package/dist/deployment/lifecycleCompletionPaths.d.ts +9 -0
- package/dist/deployment/lifecycleCompletionPaths.js +16 -0
- package/dist/deployment/lifecycleCompletionPublication.d.ts +5 -0
- package/dist/deployment/lifecycleCompletionPublication.js +35 -0
- package/dist/deployment/lifecycleCompletionRecovery.d.ts +21 -0
- package/dist/deployment/lifecycleCompletionRecovery.js +56 -0
- package/dist/deployment/lifecycleCompletionRoot.d.ts +21 -0
- package/dist/deployment/lifecycleCompletionRoot.js +243 -0
- package/dist/deployment/lifecycleCompletionStore.d.ts +6 -0
- package/dist/deployment/lifecycleCompletionStore.js +151 -0
- package/dist/deployment/organizationHandoffAuthorityFsClient.d.ts +17 -0
- package/dist/deployment/organizationHandoffAuthorityFsClient.js +132 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorker.d.ts +1 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorker.js +285 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorkerParent.fixture.d.ts +1 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorkerParent.fixture.js +26 -0
- package/dist/deployment/organizationHandoffAuthorityStore.d.ts +41 -0
- package/dist/deployment/organizationHandoffAuthorityStore.js +348 -0
- package/dist/deployment/organizationHandoffAuthorityTypes.d.ts +76 -0
- package/dist/deployment/organizationHandoffAuthorityTypes.js +148 -0
- package/dist/deployment/organizationHandoffTypes.d.ts +29 -0
- package/dist/deployment/organizationHandoffTypes.js +80 -0
- package/dist/deployment/organizationReady.d.ts +52 -0
- package/dist/deployment/organizationReady.js +200 -0
- package/dist/deployment/privateArtifactsExport.d.ts +18 -0
- package/dist/deployment/privateArtifactsExport.js +80 -0
- package/dist/deployment/providerRuntimeBoundaryScanner.test-helper.d.ts +8 -0
- package/dist/deployment/providerRuntimeBoundaryScanner.test-helper.js +60 -0
- package/dist/deployment/record.d.ts +26 -1
- package/dist/deployment/record.js +49 -4
- package/dist/deployment/simfileFixtureBoundary.test-helper.d.ts +8 -0
- package/dist/deployment/simfileFixtureBoundary.test-helper.js +103 -0
- package/dist/deployment/target.d.ts +1 -35
- package/dist/deployment/target.js +1 -96
- package/dist/deployment/upReceiptTypes.d.ts +111 -0
- package/dist/deployment/upReceiptTypes.js +164 -0
- package/dist/dev/activity.d.ts +14 -0
- package/dist/dev/activity.js +48 -0
- package/dist/dev/docker.d.ts +16 -0
- package/dist/dev/docker.js +71 -0
- package/dist/dev/index.d.ts +2 -0
- package/dist/dev/index.js +2 -0
- package/dist/dev/project.d.ts +35 -0
- package/dist/dev/project.js +170 -0
- package/dist/distribution/buildDistributionReport.d.ts +2 -1
- package/dist/distribution/buildDistributionReport.js +2 -1
- package/dist/distribution/distributionReportSchema.d.ts +5 -0
- package/dist/distribution/distributionReportSchema.js +7 -2
- package/dist/distribution/index.d.ts +2 -2
- package/dist/distribution/index.js +1 -1
- package/dist/distribution/types.d.ts +7 -0
- package/dist/distribution/types.js +1 -0
- package/dist/filesystem/paths.js +10 -1
- package/dist/ledger/causalConformanceCli.d.ts +1 -0
- package/dist/ledger/causalConformanceCli.js +41 -0
- package/dist/ledger/causeNamespace.d.ts +8 -0
- package/dist/ledger/causeNamespace.js +24 -0
- package/dist/ledger/conformance.d.ts +83 -0
- package/dist/ledger/conformance.js +259 -0
- package/dist/ledger/emitters.d.ts +76 -0
- package/dist/ledger/emitters.js +188 -0
- package/dist/ledger/index.d.ts +4 -0
- package/dist/ledger/index.js +4 -0
- package/dist/ledger/principal.d.ts +96 -0
- package/dist/ledger/principal.js +121 -0
- package/dist/manifest/externalParticipantSchemas.d.ts +18 -0
- package/dist/manifest/externalParticipantSchemas.js +17 -0
- package/dist/manifest/index.d.ts +1 -0
- package/dist/manifest/index.js +1 -0
- package/dist/manifest/inlineAgentMember.d.ts +2 -0
- package/dist/manifest/inlineAgentMember.js +9 -0
- package/dist/manifest/loadManifest.js +14 -8
- package/dist/manifest/mcpSchemas.d.ts +17 -0
- package/dist/manifest/mcpSchemas.js +41 -0
- package/dist/manifest/memorySchemas.d.ts +245 -0
- package/dist/manifest/memorySchemas.js +148 -0
- package/dist/manifest/renderSpawnfile.js +22 -131
- package/dist/manifest/renderSpawnfileNetworks.js +9 -2
- package/dist/manifest/renderSpawnfileSurfaces.d.ts +2 -0
- package/dist/manifest/renderSpawnfileSurfaces.js +134 -0
- package/dist/manifest/schemas.d.ts +1868 -99
- package/dist/manifest/schemas.js +78 -32
- package/dist/manifest/surfaceSchemas.d.ts +17 -0
- package/dist/manifest/surfaceSchemas.js +24 -1
- package/dist/manifest/teamNetworkAccessSchemas.d.ts +1 -1
- package/dist/manifest/teamNetworkAuthSchemas.d.ts +48 -0
- package/dist/manifest/teamNetworkAuthSchemas.js +103 -0
- package/dist/manifest/teamNetworkSchemas.d.ts +8 -187
- package/dist/manifest/teamNetworkSchemas.js +3 -317
- package/dist/manifest/teamNetworkServerSchemas.d.ts +150 -0
- package/dist/manifest/teamNetworkServerSchemas.js +199 -0
- package/dist/ownership/siblingBuildFreshness.d.ts +20 -0
- package/dist/ownership/siblingBuildFreshness.js +20 -0
- package/dist/ownership/simfileRunOperatorInputs.d.ts +103 -0
- package/dist/ownership/simfileRunOperatorInputs.js +139 -0
- package/dist/report/types.d.ts +142 -0
- package/dist/runtime/common.d.ts +37 -0
- package/dist/runtime/common.js +56 -1
- package/dist/runtime/container.d.ts +29 -1
- package/dist/runtime/container.js +127 -11
- package/dist/runtime/containerPackageOverrides.d.ts +37 -0
- package/dist/runtime/containerPackageOverrides.js +33 -0
- package/dist/runtime/index.d.ts +2 -0
- package/dist/runtime/index.js +2 -0
- package/dist/runtime/install.d.ts +1 -1
- package/dist/runtime/install.js +43 -1
- package/dist/runtime/mnemeMcp.d.ts +15 -0
- package/dist/runtime/mnemeMcp.js +109 -0
- package/dist/runtime/openclaw/adapter.js +15 -4
- package/dist/runtime/openclaw/mcp.d.ts +10 -0
- package/dist/runtime/openclaw/mcp.js +69 -0
- package/dist/runtime/openclaw/runAuth.js +2 -2
- package/dist/runtime/openclaw/scaffold.js +1 -1
- package/dist/runtime/openclaw/schedules.d.ts +38 -0
- package/dist/runtime/openclaw/schedules.js +74 -0
- package/dist/runtime/pi/adapter.d.ts +4 -0
- package/dist/runtime/pi/adapter.js +231 -0
- package/dist/runtime/pi/appActivitySource.d.ts +1 -0
- package/dist/runtime/pi/appActivitySource.js +199 -0
- package/dist/runtime/pi/appAgentConfig.d.ts +11 -0
- package/dist/runtime/pi/appAgentConfig.js +264 -0
- package/dist/runtime/pi/appCliEnginesSource.d.ts +1 -0
- package/dist/runtime/pi/appCliEnginesSource.js +183 -0
- package/dist/runtime/pi/appCliSource.d.ts +1 -0
- package/dist/runtime/pi/appCliSource.js +353 -0
- package/dist/runtime/pi/appControlSource.d.ts +1 -0
- package/dist/runtime/pi/appControlSource.js +390 -0
- package/dist/runtime/pi/appControlWakeIdentitySource.d.ts +1 -0
- package/dist/runtime/pi/appControlWakeIdentitySource.js +19 -0
- package/dist/runtime/pi/appCoreSource.d.ts +4 -0
- package/dist/runtime/pi/appCoreSource.js +244 -0
- package/dist/runtime/pi/appPreludeSource.d.ts +1 -0
- package/dist/runtime/pi/appPreludeSource.js +191 -0
- package/dist/runtime/pi/appScheduleSource.d.ts +1 -0
- package/dist/runtime/pi/appScheduleSource.js +80 -0
- package/dist/runtime/pi/appScriptedEngine.d.ts +31 -0
- package/dist/runtime/pi/appScriptedEngine.js +42 -0
- package/dist/runtime/pi/appSource.d.ts +4 -0
- package/dist/runtime/pi/appSource.js +12 -0
- package/dist/runtime/pi/appTemplate.d.ts +14 -0
- package/dist/runtime/pi/appTemplate.js +27 -0
- package/dist/runtime/pi/appTemplateTypes.d.ts +64 -0
- package/dist/runtime/pi/appTemplateTypes.js +18 -0
- package/dist/runtime/pi/appWakeContextSource.d.ts +1 -0
- package/dist/runtime/pi/appWakeContextSource.js +398 -0
- package/dist/runtime/pi/containerTargets.d.ts +4 -0
- package/dist/runtime/pi/containerTargets.js +57 -0
- package/dist/runtime/pi/runAuth.d.ts +2 -0
- package/dist/runtime/pi/runAuth.js +185 -0
- package/dist/runtime/pi/testHelpers.d.ts +2 -0
- package/dist/runtime/pi/testHelpers.js +40 -0
- package/dist/runtime/picoclaw/adapter.js +23 -27
- package/dist/runtime/picoclaw/mcp.d.ts +4 -0
- package/dist/runtime/picoclaw/mcp.js +43 -0
- package/dist/runtime/picoclaw/memory.d.ts +7 -0
- package/dist/runtime/picoclaw/memory.js +17 -0
- package/dist/runtime/picoclaw/runAuth.js +1 -1
- package/dist/runtime/picoclaw/scaffold.js +1 -1
- package/dist/runtime/picoclaw/schedules.d.ts +26 -0
- package/dist/runtime/picoclaw/schedules.js +62 -3
- package/dist/runtime/registry.js +3 -0
- package/dist/runtime/scheduleUtils.d.ts +2 -0
- package/dist/runtime/scheduleUtils.js +15 -0
- package/dist/runtime/types.d.ts +26 -2
- package/dist/shared/errors.d.ts +1 -1
- package/dist/shared/errors.js +2 -2
- package/dist/shared/index.d.ts +1 -0
- package/dist/shared/index.js +1 -0
- package/dist/shared/redaction.d.ts +2 -0
- package/dist/shared/redaction.js +10 -0
- package/dist/status/buildStatus.d.ts +1 -0
- package/dist/status/buildStatus.js +2 -0
- package/dist/status/compileReport.d.ts +22 -0
- package/dist/status/compileReport.js +16 -2
- package/dist/status/compiledProbeCollection.d.ts +21 -0
- package/dist/status/compiledProbeCollection.js +27 -0
- package/dist/status/deployments.js +5 -12
- package/dist/status/imageStatusReport.js +6 -0
- package/dist/status/index.d.ts +3 -0
- package/dist/status/index.js +3 -0
- package/dist/status/lifecycleProbes.d.ts +19 -0
- package/dist/status/lifecycleProbes.js +174 -0
- package/dist/status/moltnetProbes.d.ts +7 -8
- package/dist/status/moltnetProbes.js +27 -198
- package/dist/status/moltnetWiringProbes.d.ts +19 -0
- package/dist/status/moltnetWiringProbes.js +178 -0
- package/dist/target/cleanupRun.d.ts +41 -0
- package/dist/target/cleanupRun.js +139 -0
- package/dist/target/cleanupRunDocker.d.ts +16 -0
- package/dist/target/cleanupRunDocker.js +66 -0
- package/dist/target/cleanupRunDocker.test-helper.d.ts +67 -0
- package/dist/target/cleanupRunDocker.test-helper.js +238 -0
- package/dist/target/cleanupRunDockerPreflight.d.ts +17 -0
- package/dist/target/cleanupRunDockerPreflight.js +224 -0
- package/dist/target/composedPreparation.d.ts +205 -0
- package/dist/target/composedPreparation.js +223 -0
- package/dist/target/containerBundle.d.ts +82 -0
- package/dist/target/containerBundle.js +243 -0
- package/dist/target/containerBundleArchive.d.ts +31 -0
- package/dist/target/containerBundleArchive.js +140 -0
- package/dist/target/containerBundleAuthority.d.ts +25 -0
- package/dist/target/containerBundleAuthority.js +65 -0
- package/dist/target/containerBundleContracts.d.ts +114 -0
- package/dist/target/containerBundleContracts.js +173 -0
- package/dist/target/containerBundleFilesystemStore.d.ts +3 -0
- package/dist/target/containerBundleFilesystemStore.js +247 -0
- package/dist/target/containerBundlePolicy.d.ts +33 -0
- package/dist/target/containerBundlePolicy.js +64 -0
- package/dist/target/containerBundleStore.d.ts +127 -0
- package/dist/target/containerBundleStore.js +284 -0
- package/dist/target/contracts.d.ts +538 -0
- package/dist/target/contracts.js +373 -0
- package/dist/target/dockerArtifactIdentityTypes.d.ts +56 -0
- package/dist/target/dockerArtifactIdentityTypes.js +1 -0
- package/dist/target/dockerArtifactInspection.d.ts +40 -0
- package/dist/target/dockerArtifactInspection.js +125 -0
- package/dist/target/dockerArtifacts.d.ts +21 -0
- package/dist/target/dockerArtifacts.js +110 -0
- package/dist/target/dockerArtifactsProvider.d.ts +41 -0
- package/dist/target/dockerArtifactsProvider.js +449 -0
- package/dist/target/dockerCommandExecutor.d.ts +27 -0
- package/dist/target/dockerCommandExecutor.js +200 -0
- package/dist/target/dockerCommandExecutorCore.d.ts +34 -0
- package/dist/target/dockerCommandExecutorCore.js +273 -0
- package/dist/target/dockerContainerBundleBuilder.d.ts +8 -0
- package/dist/target/dockerContainerBundleBuilder.js +256 -0
- package/dist/target/dockerContextSnapshot.d.ts +21 -0
- package/dist/target/dockerContextSnapshot.js +158 -0
- package/dist/target/dockerEndpointFingerprint.d.ts +1 -0
- package/dist/target/dockerEndpointFingerprint.js +9 -0
- package/dist/target/dockerPreparedArtifact.d.ts +48 -0
- package/dist/target/dockerPreparedArtifact.js +131 -0
- package/dist/target/dockerProjectionJson.d.ts +1 -0
- package/dist/target/dockerProjectionJson.js +80 -0
- package/dist/target/dockerPublicArtifactSnapshot.d.ts +17 -0
- package/dist/target/dockerPublicArtifactSnapshot.js +99 -0
- package/dist/target/dockerResources.d.ts +26 -0
- package/dist/target/dockerResources.js +162 -0
- package/dist/target/dockerResourcesProvider.d.ts +44 -0
- package/dist/target/dockerResourcesProvider.js +207 -0
- package/dist/target/dockerSecrets.d.ts +39 -0
- package/dist/target/dockerSecrets.js +249 -0
- package/dist/target/dockerSecretsAuthority.d.ts +26 -0
- package/dist/target/dockerSecretsAuthority.js +216 -0
- package/dist/target/dockerSecretsLifecycle.d.ts +25 -0
- package/dist/target/dockerSecretsLifecycle.js +133 -0
- package/dist/target/dockerSecretsProvider.d.ts +68 -0
- package/dist/target/dockerSecretsProvider.js +329 -0
- package/dist/target/dockerTarget.d.ts +52 -0
- package/dist/target/dockerTarget.js +48 -0
- package/dist/target/dockerTargetBinding.d.ts +14 -0
- package/dist/target/dockerTargetBinding.js +96 -0
- package/dist/target/dockerWorldClock.d.ts +17 -0
- package/dist/target/dockerWorldClock.js +111 -0
- package/dist/target/dockerWorldReadiness.d.ts +17 -0
- package/dist/target/dockerWorldReadiness.js +119 -0
- package/dist/target/dockerWorldService.d.ts +23 -0
- package/dist/target/dockerWorldService.js +216 -0
- package/dist/target/dockerWorldServiceAuthority.d.ts +80 -0
- package/dist/target/dockerWorldServiceAuthority.js +182 -0
- package/dist/target/dockerWorldServiceLifecycle.d.ts +41 -0
- package/dist/target/dockerWorldServiceLifecycle.js +275 -0
- package/dist/target/dockerWorldServiceProvider.d.ts +60 -0
- package/dist/target/dockerWorldServiceProvider.js +318 -0
- package/dist/target/dockerWorldServiceStore.d.ts +73 -0
- package/dist/target/dockerWorldServiceStore.js +367 -0
- package/dist/target/evidenceExport.d.ts +55 -0
- package/dist/target/evidenceExport.js +518 -0
- package/dist/target/evidenceExportArchive.d.ts +10 -0
- package/dist/target/evidenceExportArchive.js +302 -0
- package/dist/target/evidenceExportContract.d.ts +27 -0
- package/dist/target/evidenceExportContract.js +40 -0
- package/dist/target/evidenceExportOperationsTestKit.d.ts +87 -0
- package/dist/target/evidenceExportOperationsTestKit.js +312 -0
- package/dist/target/evidenceExportProvider.d.ts +85 -0
- package/dist/target/evidenceExportProvider.js +187 -0
- package/dist/target/evidenceExportPublicationTypes.d.ts +16 -0
- package/dist/target/evidenceExportPublicationTypes.js +1 -0
- package/dist/target/evidenceExportStore.d.ts +70 -0
- package/dist/target/evidenceExportStore.js +498 -0
- package/dist/target/evidenceExportStorePublication.d.ts +7 -0
- package/dist/target/evidenceExportStorePublication.js +395 -0
- package/dist/target/handles.d.ts +20 -0
- package/dist/target/handles.js +56 -0
- package/dist/target/index.d.ts +12 -0
- package/dist/target/index.js +11 -0
- package/dist/target/journal.d.ts +59 -0
- package/dist/target/journal.js +529 -0
- package/dist/target/journalFilesystem.d.ts +3 -0
- package/dist/target/journalFilesystem.js +111 -0
- package/dist/target/journalRoot.d.ts +4 -0
- package/dist/target/journalRoot.js +6 -0
- package/dist/target/organizationAttachment.d.ts +23 -0
- package/dist/target/organizationAttachment.js +263 -0
- package/dist/target/organizationAttachmentAuthority.d.ts +65 -0
- package/dist/target/organizationAttachmentAuthority.js +161 -0
- package/dist/target/organizationAttachmentLifecycle.d.ts +17 -0
- package/dist/target/organizationAttachmentLifecycle.js +101 -0
- package/dist/target/organizationAttachmentProvider.d.ts +76 -0
- package/dist/target/organizationAttachmentProvider.js +289 -0
- package/dist/target/organizationAttachmentStore.d.ts +51 -0
- package/dist/target/organizationAttachmentStore.js +316 -0
- package/dist/target/publicArtifactSnapshot.d.ts +41 -0
- package/dist/target/publicArtifactSnapshot.js +150 -0
- package/dist/target/topologyActivation.d.ts +51 -0
- package/dist/target/topologyActivation.js +149 -0
- package/dist/target/topologyAttestation.d.ts +37 -0
- package/dist/target/topologyAttestation.js +300 -0
- package/dist/target/topologyAttestationErrors.d.ts +1 -0
- package/dist/target/topologyAttestationErrors.js +1 -0
- package/dist/target/worldClock.d.ts +60 -0
- package/dist/target/worldClock.js +129 -0
- package/dist/target/worldReadiness.d.ts +103 -0
- package/dist/target/worldReadiness.js +153 -0
- package/moltnet-releases.json +20 -0
- package/package.json +29 -8
- package/runtimes.yaml +28 -27
- package/dist/runtime/openclaw/scaffold-assets/CLAUDE.md +0 -5
- package/dist/runtime/picoclaw/scaffold-assets/CLAUDE.md +0 -5
- /package/dist/runtime/openclaw/scaffold-assets/{AGENTS.md → WORKSPACE_AGENTS.md} +0 -0
- /package/dist/runtime/picoclaw/scaffold-assets/{AGENTS.md → WORKSPACE_AGENTS.md} +0 -0
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { Buffer } from "node:buffer";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { DockerArtifactProviderError } from "./dockerArtifactsProvider.js";
|
|
4
|
+
import { selectTarget } from "./dockerTarget.js";
|
|
5
|
+
const ERROR = "Target-local container bundle preparation failed";
|
|
6
|
+
const BLOCK = 512;
|
|
7
|
+
const ID = /^sha256:[a-f0-9]{64}$/u;
|
|
8
|
+
const BASE_LABEL = "spawnfile_target_bundle_v1_base";
|
|
9
|
+
const ENTRYPOINT_LABEL = "spawnfile_target_bundle_v1_entrypoint";
|
|
10
|
+
const fail = () => { throw new Error(ERROR); };
|
|
11
|
+
const canonical = (value) => {
|
|
12
|
+
if (Array.isArray(value))
|
|
13
|
+
return `[${value.map(canonical).join(",")}]`;
|
|
14
|
+
if (value !== null && typeof value === "object") {
|
|
15
|
+
const record = value;
|
|
16
|
+
return `{${Object.keys(record).sort().map((key) => `${JSON.stringify(key)}:${canonical(record[key])}`).join(",")}}`;
|
|
17
|
+
}
|
|
18
|
+
return JSON.stringify(value);
|
|
19
|
+
};
|
|
20
|
+
const exact = (left, right) => canonical(left) === canonical(right);
|
|
21
|
+
const strings = (value) => Array.isArray(value) && value.every((item) => typeof item === "string") ? value : null;
|
|
22
|
+
const labels = (value) => {
|
|
23
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
24
|
+
return null;
|
|
25
|
+
const result = value;
|
|
26
|
+
return Object.values(result).every((item) => typeof item === "string") ? Object.freeze({ ...result }) : null;
|
|
27
|
+
};
|
|
28
|
+
const octal = (value, width) => Buffer.from(`${value.toString(8).padStart(width - 1, "0")}\0`, "ascii");
|
|
29
|
+
const checksum = (header) => {
|
|
30
|
+
header.fill(0x20, 148, 156);
|
|
31
|
+
let sum = 0;
|
|
32
|
+
for (const byte of header)
|
|
33
|
+
sum += byte;
|
|
34
|
+
header.set(Buffer.from(`${sum.toString(8).padStart(6, "0")}\0 `, "ascii"), 148);
|
|
35
|
+
};
|
|
36
|
+
const ustarPath = (value) => {
|
|
37
|
+
const bytes = Buffer.from(value, "utf8");
|
|
38
|
+
if (bytes.byteLength <= 100)
|
|
39
|
+
return { name: bytes, prefix: Buffer.alloc(0) };
|
|
40
|
+
const slash = value.lastIndexOf("/");
|
|
41
|
+
if (slash < 1)
|
|
42
|
+
fail();
|
|
43
|
+
const prefix = Buffer.from(value.slice(0, slash), "utf8");
|
|
44
|
+
const name = Buffer.from(value.slice(slash + 1), "utf8");
|
|
45
|
+
if (prefix.byteLength > 155 || name.byteLength > 100)
|
|
46
|
+
fail();
|
|
47
|
+
return { name, prefix };
|
|
48
|
+
};
|
|
49
|
+
/** A canonical, uncompressed USTAR stream. The archive parser has already admitted the bundle paths. */
|
|
50
|
+
const tar = (entries) => {
|
|
51
|
+
const output = [];
|
|
52
|
+
for (const entry of entries) {
|
|
53
|
+
const { name, prefix } = ustarPath(entry.path);
|
|
54
|
+
const header = Buffer.alloc(BLOCK);
|
|
55
|
+
header.set(name);
|
|
56
|
+
header.set(octal(0o644, 8), 100);
|
|
57
|
+
header.set(octal(0, 8), 108);
|
|
58
|
+
header.set(octal(0, 8), 116);
|
|
59
|
+
header.set(octal(entry.bytes.byteLength, 12), 124);
|
|
60
|
+
header.set(octal(0, 12), 136);
|
|
61
|
+
header[156] = 48;
|
|
62
|
+
header.set(Buffer.from("ustar\x00", "ascii"), 257);
|
|
63
|
+
header.set(Buffer.from("00", "ascii"), 263);
|
|
64
|
+
header.set(prefix, 345);
|
|
65
|
+
checksum(header);
|
|
66
|
+
output.push(header, Buffer.from(entry.bytes));
|
|
67
|
+
const pad = (BLOCK - entry.bytes.byteLength % BLOCK) % BLOCK;
|
|
68
|
+
if (pad)
|
|
69
|
+
output.push(Buffer.alloc(pad));
|
|
70
|
+
}
|
|
71
|
+
output.push(Buffer.alloc(BLOCK), Buffer.alloc(BLOCK));
|
|
72
|
+
return Buffer.concat(output);
|
|
73
|
+
};
|
|
74
|
+
const safeEntrypoint = (value) => typeof value === "string" && /^[A-Za-z0-9][A-Za-z0-9._/-]{0,239}$/u.test(value)
|
|
75
|
+
&& !value.includes("//") && !value.split("/").some((part) => part === "." || part === "..");
|
|
76
|
+
const dockerfile = (base, entrypoint) => {
|
|
77
|
+
if (!/^spfb_base_[a-f0-9]{53}$/u.test(base) || !safeEntrypoint(entrypoint))
|
|
78
|
+
fail();
|
|
79
|
+
return Buffer.from(`FROM ${base}\nWORKDIR /opt/bundle\nCOPY bundle/ /opt/bundle/\nENTRYPOINT ["node","/opt/bundle/${entrypoint}"]\nCMD []\n`, "utf8");
|
|
80
|
+
};
|
|
81
|
+
/* Docker 29 errors when a nil Labels map is dereferenced in a Go template.
|
|
82
|
+
* Project Config as one JSON value, then validate its exact security-relevant
|
|
83
|
+
* fields locally; this remains a private Docker inspection. */
|
|
84
|
+
const projectionFormat = "[{\"Id\":{{json .Id}},\"Config\":{{json .Config}},\"RootFSType\":{{json .RootFS.Type}},\"RootFSLayers\":{{json .RootFS.Layers}},\"Os\":{{json .Os}},\"Architecture\":{{json .Architecture}}}]";
|
|
85
|
+
const parseProjection = (raw) => {
|
|
86
|
+
try {
|
|
87
|
+
const value = JSON.parse(raw);
|
|
88
|
+
if (!Array.isArray(value) || value.length !== 1 || !value[0] || typeof value[0] !== "object")
|
|
89
|
+
return null;
|
|
90
|
+
const item = value[0];
|
|
91
|
+
if (Object.keys(item).sort().join("\0") !== "Architecture\0Config\0Id\0Os\0RootFSLayers\0RootFSType")
|
|
92
|
+
return null;
|
|
93
|
+
const config = item.Config;
|
|
94
|
+
if (!config || typeof config !== "object" || Array.isArray(config))
|
|
95
|
+
return null;
|
|
96
|
+
const source = config;
|
|
97
|
+
const itemLabels = source.Labels === undefined || source.Labels === null ? Object.freeze({}) : labels(source.Labels);
|
|
98
|
+
const entrypoint = source.Entrypoint === undefined || source.Entrypoint === null ? null : strings(source.Entrypoint);
|
|
99
|
+
const cmd = source.Cmd === undefined || source.Cmd === null ? null : strings(source.Cmd);
|
|
100
|
+
const env = source.Env === undefined || source.Env === null ? Object.freeze([]) : strings(source.Env);
|
|
101
|
+
const rootfs = strings(item.RootFSLayers);
|
|
102
|
+
if (!ID.test(item.Id) || !itemLabels || entrypoint === null && source.Entrypoint !== undefined && source.Entrypoint !== null || cmd === null && source.Cmd !== undefined && source.Cmd !== null || !env || !rootfs
|
|
103
|
+
|| rootfs.length < 1 || item.RootFSType !== "layers" || (item.Architecture !== "amd64" && item.Architecture !== "arm64") || item.Os !== "linux"
|
|
104
|
+
|| source.User !== undefined && source.User !== null && typeof source.User !== "string"
|
|
105
|
+
|| source.WorkingDir !== undefined && source.WorkingDir !== null && typeof source.WorkingDir !== "string"
|
|
106
|
+
|| source.OnBuild !== undefined && source.OnBuild !== null || source.Volumes !== undefined && source.Volumes !== null
|
|
107
|
+
|| source.ExposedPorts !== undefined && source.ExposedPorts !== null || source.Healthcheck !== undefined && source.Healthcheck !== null)
|
|
108
|
+
return null;
|
|
109
|
+
return Object.freeze({ configId: item.Id, cmd, entrypoint, env, labels: itemLabels,
|
|
110
|
+
platform: Object.freeze({ architecture: item.Architecture, os: "linux" }), rootfs: Object.freeze([...rootfs]), user: source.User ?? "", workdir: source.WorkingDir ?? "" });
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
const isSafeBase = (value, expectedId, platform) =>
|
|
117
|
+
/* Dockerfile deterministically replaces the inherited workdir, entrypoint,
|
|
118
|
+
* and command. Those base defaults therefore cannot affect the output or
|
|
119
|
+
* execute during this COPY-only build; rejecting them would exclude the
|
|
120
|
+
* reviewed node base. OnBuild remains forbidden because it can execute
|
|
121
|
+
* while building, and labels/user remain constrained because they persist. */
|
|
122
|
+
value.configId === expectedId && exact(value.labels, {}) && value.user === ""
|
|
123
|
+
&& exact(value.platform, platform);
|
|
124
|
+
const expectedEntrypoint = (value) => {
|
|
125
|
+
const entrypoint = value[ENTRYPOINT_LABEL];
|
|
126
|
+
return safeEntrypoint(entrypoint) ? Object.freeze(["node", `/opt/bundle/${entrypoint}`]) : null;
|
|
127
|
+
};
|
|
128
|
+
const isOutput = (value, input) => {
|
|
129
|
+
const entrypoint = expectedEntrypoint(input.labels);
|
|
130
|
+
return (!input.configId || value.configId === input.configId) && entrypoint !== null && exact(value.labels, input.labels)
|
|
131
|
+
// Docker normalizes the explicit `CMD []` in the generated Dockerfile to
|
|
132
|
+
// a null Config.Cmd. Null is therefore the exact no-inherited-command
|
|
133
|
+
// representation we attest on real daemons.
|
|
134
|
+
&& exact(value.entrypoint, entrypoint) && exact(value.cmd, null) && exact(value.env, input.base.env)
|
|
135
|
+
&& value.user === "" && value.workdir === "/opt/bundle" && exact(value.platform, input.platform)
|
|
136
|
+
&& value.rootfs.length > input.base.rootfs.length && input.base.rootfs.every((layer, index) => value.rootfs[index] === layer);
|
|
137
|
+
};
|
|
138
|
+
const daemonEpoch = (id) => `sha256:${createHash("sha256")
|
|
139
|
+
.update("spawnfile.target-local-container-bundle.daemon-epoch.v1\0", "utf8").update(id, "utf8").digest("hex")}`;
|
|
140
|
+
/* Bound to both output request and base config: no other operation can safely inherit this scratch tag. */
|
|
141
|
+
const baseTag = (configId, gcTag) => `spfb_base_${createHash("sha256")
|
|
142
|
+
.update("spawnfile.target-local-container-bundle.base-tag.v2\0", "utf8").update(`${configId}\0${gcTag}`, "utf8").digest("hex").slice(0, 53)}`;
|
|
143
|
+
/** Private Docker lowering. It refuses tag adoption; durable post-build recovery uses inspect() instead. */
|
|
144
|
+
export const createDockerTargetLocalBundleBuilder = (input) => {
|
|
145
|
+
if (!/^[a-z][a-z0-9_-]{0,63}$/u.test(input.context) || typeof input.executor !== "function")
|
|
146
|
+
fail();
|
|
147
|
+
const timeout = input.timeoutMs ?? 30_000;
|
|
148
|
+
const execute = async (args, stdin) => {
|
|
149
|
+
const result = await input.executor("docker", args, { timeout, ...(stdin ? { stdin } : {}) });
|
|
150
|
+
if (!result || Buffer.byteLength(result.stdout, "utf8") > 65_536 || Buffer.byteLength(result.stderr, "utf8") > 65_536)
|
|
151
|
+
fail();
|
|
152
|
+
return result.stdout;
|
|
153
|
+
};
|
|
154
|
+
const read = async (reference) => {
|
|
155
|
+
const value = parseProjection(await execute(["--context", input.context, "image", "inspect", "--format", projectionFormat, reference]));
|
|
156
|
+
return value ?? fail();
|
|
157
|
+
};
|
|
158
|
+
const readMaybe = async (reference) => {
|
|
159
|
+
try {
|
|
160
|
+
return await read(reference);
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
if (error instanceof DockerArtifactProviderError && error.kind === "image_not_found")
|
|
164
|
+
return "missing";
|
|
165
|
+
throw error;
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
const absent = async (reference) => (await readMaybe(reference)) === "missing";
|
|
169
|
+
const base = async (configId, platform) => {
|
|
170
|
+
if (!ID.test(configId))
|
|
171
|
+
fail();
|
|
172
|
+
const result = await read(configId);
|
|
173
|
+
if (!isSafeBase(result, configId, platform))
|
|
174
|
+
fail();
|
|
175
|
+
return result;
|
|
176
|
+
};
|
|
177
|
+
const inspect = async (configId, gcTag, expected) => {
|
|
178
|
+
const baseId = expected.labels[BASE_LABEL];
|
|
179
|
+
if (!ID.test(baseId))
|
|
180
|
+
return null;
|
|
181
|
+
const baseImage = await base(baseId, expected.platform).catch(() => null);
|
|
182
|
+
if (!baseImage)
|
|
183
|
+
return null;
|
|
184
|
+
const byId = await readMaybe(configId);
|
|
185
|
+
const byTag = await readMaybe(gcTag);
|
|
186
|
+
if (byId === "missing" || byTag === "missing")
|
|
187
|
+
return null;
|
|
188
|
+
if (byId.configId !== byTag.configId || !isOutput(byId, { base: baseImage, ...(ID.test(configId) ? { configId } : {}), ...expected }))
|
|
189
|
+
return null;
|
|
190
|
+
return Object.freeze({ config_id: byId.configId, labels: Object.freeze({ ...expected.labels }), platform: expected.platform });
|
|
191
|
+
};
|
|
192
|
+
const inspectAnchor = async (gcTag, expected) => {
|
|
193
|
+
const byTag = await readMaybe(gcTag);
|
|
194
|
+
if (byTag === "missing")
|
|
195
|
+
return "missing";
|
|
196
|
+
return inspect(byTag.configId, gcTag, expected);
|
|
197
|
+
};
|
|
198
|
+
const builder = {
|
|
199
|
+
attestTarget: async ({ selected_target }) => {
|
|
200
|
+
const selected = await selectTarget({ context: input.context, execFile: async (_file, args) => ({ stderr: "", stdout: await execute(args) }), timeoutMs: timeout });
|
|
201
|
+
if (!exact({ fingerprint: selected.fingerprint, handle: selected.handle }, selected_target))
|
|
202
|
+
return null;
|
|
203
|
+
const raw = (await execute(["--context", input.context, "info", "--format", "{{json .ID}}"])).trim();
|
|
204
|
+
let id;
|
|
205
|
+
try {
|
|
206
|
+
id = JSON.parse(raw);
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
return typeof id === "string" && id.length > 0 ? Object.freeze({ daemon_epoch: daemonEpoch(id) }) : null;
|
|
212
|
+
},
|
|
213
|
+
build: async ({ archive, base_image_config_digest, entrypoint, gc_tag, labels: expectedLabels, platform }) => {
|
|
214
|
+
if (!/^spfb_[a-f0-9]{58}$/u.test(gc_tag) || !safeEntrypoint(entrypoint) || expectedLabels[ENTRYPOINT_LABEL] !== entrypoint
|
|
215
|
+
|| expectedLabels[BASE_LABEL] !== base_image_config_digest)
|
|
216
|
+
fail();
|
|
217
|
+
const baseImage = await base(base_image_config_digest, platform);
|
|
218
|
+
/* Any output tag, even a seemingly matching one, belongs to recovery rather than a new build. */
|
|
219
|
+
if (!await absent(gc_tag))
|
|
220
|
+
fail();
|
|
221
|
+
const scratch = baseTag(base_image_config_digest, gc_tag);
|
|
222
|
+
if (!await absent(scratch))
|
|
223
|
+
fail();
|
|
224
|
+
let ownScratch = false;
|
|
225
|
+
try {
|
|
226
|
+
const tagResult = await execute(["--context", input.context, "image", "tag", base_image_config_digest, scratch]);
|
|
227
|
+
if (tagResult.trim() !== "")
|
|
228
|
+
fail();
|
|
229
|
+
ownScratch = true;
|
|
230
|
+
const pinned = await read(scratch);
|
|
231
|
+
if (!isSafeBase(pinned, base_image_config_digest, platform))
|
|
232
|
+
fail();
|
|
233
|
+
const context = tar([{ path: "Dockerfile", bytes: dockerfile(scratch, entrypoint) }, ...archive.entries.map((entry) => ({ path: `bundle/${entry.path}`, bytes: entry.bytes }))]);
|
|
234
|
+
const labelArgs = Object.entries(expectedLabels).flatMap(([key, value]) => ["--label", `${key}=${value}`]);
|
|
235
|
+
await execute(["--context", input.context, "build", "--pull=false", "--network=none", "--platform", `${platform.os}/${platform.architecture}`, "--tag", gc_tag, ...labelArgs, "-"], context);
|
|
236
|
+
const result = await inspect(gc_tag, gc_tag, { labels: expectedLabels, platform });
|
|
237
|
+
if (!result)
|
|
238
|
+
fail();
|
|
239
|
+
return result;
|
|
240
|
+
}
|
|
241
|
+
finally {
|
|
242
|
+
if (ownScratch) {
|
|
243
|
+
const pinned = await read(scratch);
|
|
244
|
+
if (!isSafeBase(pinned, base_image_config_digest, platform))
|
|
245
|
+
fail();
|
|
246
|
+
const removed = await execute(["--context", input.context, "image", "rm", scratch]);
|
|
247
|
+
if (removed.trim().length > 4_096)
|
|
248
|
+
fail();
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
inspect: async ({ config_id, gc_tag, labels: expectedLabels, platform }) => inspect(config_id, gc_tag, { labels: expectedLabels, platform }),
|
|
253
|
+
inspectAnchor: async ({ gc_tag, labels: expectedLabels, platform }) => inspectAnchor(gc_tag, { labels: expectedLabels, platform })
|
|
254
|
+
};
|
|
255
|
+
return Object.freeze(builder);
|
|
256
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { rm } from "node:fs/promises";
|
|
2
|
+
import type { SelectedTargetReceipt } from "./contracts.js";
|
|
3
|
+
import type { DockerResourceExecutor } from "./dockerResourcesProvider.js";
|
|
4
|
+
type SnapshotRemove = typeof rm;
|
|
5
|
+
/** Test-only seam for deterministic cleanup failure coverage. */
|
|
6
|
+
export declare const setDockerContextSnapshotRemoveForTests: (replacement: SnapshotRemove) => (() => void);
|
|
7
|
+
export interface DockerContextSnapshot {
|
|
8
|
+
readonly args: readonly ["--config", string, "--context", string];
|
|
9
|
+
dispose(): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Privately recreates one named Docker context without placing its endpoint or
|
|
13
|
+
* TLS options in argv. The synthetic config is short-lived and never exported.
|
|
14
|
+
*/
|
|
15
|
+
export declare const createDockerContextSnapshot: (input: {
|
|
16
|
+
readonly context: string;
|
|
17
|
+
readonly executor: DockerResourceExecutor;
|
|
18
|
+
readonly selectedTarget: Pick<SelectedTargetReceipt, "fingerprint" | "handle">;
|
|
19
|
+
readonly timeoutMs: number;
|
|
20
|
+
}) => Promise<DockerContextSnapshot>;
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { constants } from "node:fs";
|
|
2
|
+
import { lstat, mkdtemp, mkdir, open, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
6
|
+
import { SpawnfileError } from "../shared/index.js";
|
|
7
|
+
import { selectedTargetForContextEndpoint } from "./dockerTargetBinding.js";
|
|
8
|
+
const ERROR = "Docker context snapshot failed";
|
|
9
|
+
const MAX_INSPECTION_BYTES = 32_768;
|
|
10
|
+
const CONTEXT_PATTERN = /^[a-z][a-z0-9_-]{0,63}$/u;
|
|
11
|
+
const TLS_FILE_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/u;
|
|
12
|
+
let snapshotRemove = rm;
|
|
13
|
+
/** Test-only seam for deterministic cleanup failure coverage. */
|
|
14
|
+
export const setDockerContextSnapshotRemoveForTests = (replacement) => {
|
|
15
|
+
const previous = snapshotRemove;
|
|
16
|
+
snapshotRemove = replacement;
|
|
17
|
+
return () => { snapshotRemove = previous; };
|
|
18
|
+
};
|
|
19
|
+
const fail = () => { throw new SpawnfileError("runtime_error", ERROR); };
|
|
20
|
+
const exactRecord = (raw) => raw !== null && typeof raw === "object" && !Array.isArray(raw)
|
|
21
|
+
&& Object.getPrototypeOf(raw) === Object.prototype;
|
|
22
|
+
const exactKeys = (value, expected) => {
|
|
23
|
+
const actual = Object.keys(value).sort();
|
|
24
|
+
const sorted = [...expected].sort();
|
|
25
|
+
return actual.length === sorted.length && actual.every((key, index) => key === sorted[index]);
|
|
26
|
+
};
|
|
27
|
+
const bounded = (value) => typeof value === "string"
|
|
28
|
+
&& Buffer.byteLength(value, "utf8") <= MAX_INSPECTION_BYTES;
|
|
29
|
+
const parseContextInspection = (stdout, context) => {
|
|
30
|
+
if (!bounded(stdout))
|
|
31
|
+
return fail();
|
|
32
|
+
let raw;
|
|
33
|
+
try {
|
|
34
|
+
raw = JSON.parse(stdout);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return fail();
|
|
38
|
+
}
|
|
39
|
+
if (!Array.isArray(raw) || raw.length !== 1 || !exactRecord(raw[0]))
|
|
40
|
+
return fail();
|
|
41
|
+
const value = raw[0];
|
|
42
|
+
if (!exactKeys(value, ["Endpoints", "Metadata", "Name", "Storage", "TLSMaterial"])
|
|
43
|
+
|| value.Name !== context || !exactRecord(value.Endpoints) || !exactRecord(value.Metadata)
|
|
44
|
+
|| !exactRecord(value.Storage) || !exactRecord(value.TLSMaterial)
|
|
45
|
+
|| !exactKeys(value.Endpoints, ["docker"])
|
|
46
|
+
|| !(exactKeys(value.TLSMaterial, []) || exactKeys(value.TLSMaterial, ["docker"]))
|
|
47
|
+
|| !exactKeys(value.Storage, ["MetadataPath", "TLSPath"]))
|
|
48
|
+
return fail();
|
|
49
|
+
const endpoint = value.Endpoints.docker;
|
|
50
|
+
const tlsFiles = value.TLSMaterial.docker ?? [];
|
|
51
|
+
if (!exactRecord(endpoint) || !exactKeys(endpoint, ["Host", "SkipTLSVerify"])
|
|
52
|
+
|| typeof endpoint.Host !== "string" || typeof endpoint.SkipTLSVerify !== "boolean"
|
|
53
|
+
|| !Array.isArray(tlsFiles) || tlsFiles.length > 8
|
|
54
|
+
|| new Set(tlsFiles).size !== tlsFiles.length
|
|
55
|
+
|| tlsFiles.some((item) => typeof item !== "string" || !TLS_FILE_PATTERN.test(item)))
|
|
56
|
+
return fail();
|
|
57
|
+
const exactEndpoint = Object.freeze({ Host: endpoint.Host, SkipTLSVerify: endpoint.SkipTLSVerify });
|
|
58
|
+
const tlsPath = value.Storage.TLSPath;
|
|
59
|
+
if (tlsFiles.length === 0)
|
|
60
|
+
return Object.freeze({ endpoint: exactEndpoint, tlsFiles: Object.freeze([]), tlsPath: null });
|
|
61
|
+
if (typeof tlsPath !== "string" || tlsPath.length === 0 || Buffer.byteLength(tlsPath, "utf8") > 4_096)
|
|
62
|
+
return fail();
|
|
63
|
+
return Object.freeze({ endpoint: exactEndpoint, tlsFiles: Object.freeze([...tlsFiles]), tlsPath });
|
|
64
|
+
};
|
|
65
|
+
const copyStableTlsFile = async (source, destination) => {
|
|
66
|
+
let handle;
|
|
67
|
+
try {
|
|
68
|
+
handle = await open(source, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
69
|
+
const initial = await handle.stat();
|
|
70
|
+
if (!initial.isFile() || initial.size > 65_536)
|
|
71
|
+
return fail();
|
|
72
|
+
const bytes = await handle.readFile();
|
|
73
|
+
const current = await handle.stat();
|
|
74
|
+
if (!current.isFile() || current.size !== initial.size || bytes.length !== initial.size)
|
|
75
|
+
return fail();
|
|
76
|
+
await writeFile(destination, bytes, { encoding: undefined, flag: "wx", mode: 0o600 });
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return fail();
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
await handle?.close().catch(() => undefined);
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
const requirePrivateDirectory = async (directory) => {
|
|
86
|
+
try {
|
|
87
|
+
const stats = await lstat(directory);
|
|
88
|
+
if (!stats.isDirectory() || stats.isSymbolicLink())
|
|
89
|
+
return fail();
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return fail();
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
const removeSnapshotRoot = async (root) => {
|
|
96
|
+
for (let attempt = 0; attempt < 3; attempt += 1) {
|
|
97
|
+
try {
|
|
98
|
+
await snapshotRemove(root, { force: true, recursive: true });
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
if (attempt === 2)
|
|
103
|
+
return fail();
|
|
104
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
/**
|
|
109
|
+
* Privately recreates one named Docker context without placing its endpoint or
|
|
110
|
+
* TLS options in argv. The synthetic config is short-lived and never exported.
|
|
111
|
+
*/
|
|
112
|
+
export const createDockerContextSnapshot = async (input) => {
|
|
113
|
+
if (!CONTEXT_PATTERN.test(input.context) || !Number.isSafeInteger(input.timeoutMs)
|
|
114
|
+
|| input.timeoutMs < 1 || input.timeoutMs > 120_000)
|
|
115
|
+
return fail();
|
|
116
|
+
let root;
|
|
117
|
+
try {
|
|
118
|
+
const result = await input.executor("docker", ["context", "inspect", input.context], { timeout: input.timeoutMs });
|
|
119
|
+
if (!result || result.stderr !== "" || !bounded(result.stdout))
|
|
120
|
+
return fail();
|
|
121
|
+
const source = parseContextInspection(result.stdout, input.context);
|
|
122
|
+
const selected = selectedTargetForContextEndpoint(input.context, source.endpoint.Host);
|
|
123
|
+
if (selected.fingerprint !== input.selectedTarget.fingerprint || selected.handle !== input.selectedTarget.handle)
|
|
124
|
+
return fail();
|
|
125
|
+
root = await mkdtemp(path.join(os.tmpdir(), "spawnfile-docker-context-"));
|
|
126
|
+
const synthetic = `spfn_${randomUUID().replaceAll("-", "")}`;
|
|
127
|
+
const contextId = createHash("sha256").update(synthetic, "utf8").digest("hex");
|
|
128
|
+
const metaDirectory = path.join(root, "contexts", "meta", contextId);
|
|
129
|
+
const tlsDirectory = path.join(root, "contexts", "tls", contextId, "docker");
|
|
130
|
+
await mkdir(metaDirectory, { recursive: true, mode: 0o700 });
|
|
131
|
+
await mkdir(tlsDirectory, { recursive: true, mode: 0o700 });
|
|
132
|
+
const meta = JSON.stringify({ Endpoints: { docker: source.endpoint }, Metadata: {}, Name: synthetic });
|
|
133
|
+
await writeFile(path.join(metaDirectory, "meta.json"), meta, { encoding: "utf8", flag: "wx", mode: 0o600 });
|
|
134
|
+
if (source.tlsPath) {
|
|
135
|
+
await requirePrivateDirectory(source.tlsPath);
|
|
136
|
+
await requirePrivateDirectory(path.join(source.tlsPath, "docker"));
|
|
137
|
+
for (const file of source.tlsFiles) {
|
|
138
|
+
await copyStableTlsFile(path.join(source.tlsPath, "docker", file), path.join(tlsDirectory, file));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
const args = Object.freeze(["--config", root, "--context", synthetic]);
|
|
142
|
+
let disposed = false;
|
|
143
|
+
return Object.freeze({
|
|
144
|
+
args,
|
|
145
|
+
dispose: async () => {
|
|
146
|
+
if (disposed)
|
|
147
|
+
return;
|
|
148
|
+
await removeSnapshotRoot(root);
|
|
149
|
+
disposed = true;
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
if (root)
|
|
155
|
+
await removeSnapshotRoot(root);
|
|
156
|
+
return fail();
|
|
157
|
+
}
|
|
158
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const createEndpointFingerprint: (endpoint: string) => string;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { SpawnfileError } from "../shared/index.js";
|
|
3
|
+
export const createEndpointFingerprint = (endpoint) => {
|
|
4
|
+
const normalized = endpoint.trim();
|
|
5
|
+
if (normalized.length === 0) {
|
|
6
|
+
throw new SpawnfileError("validation_error", "Deployment target endpoint must not be empty");
|
|
7
|
+
}
|
|
8
|
+
return `sha256:${createHash("sha256").update(normalized).digest("hex").slice(0, 32)}`;
|
|
9
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { type TargetResourceReceipt, type TargetResourceRequest } from "./contracts.js";
|
|
2
|
+
import { type TargetLocalBundlePrivateMapping, type TargetLocalBundleStore } from "./containerBundleStore.js";
|
|
3
|
+
import { type DockerTargetLocalBundleBuilder } from "./containerBundle.js";
|
|
4
|
+
import { type DockerConfigArtifactIdentityBinding, type DockerArtifactIdentityStore } from "./dockerArtifactsProvider.js";
|
|
5
|
+
import { type TargetJournalStore } from "./journal.js";
|
|
6
|
+
export declare const DOCKER_PREPARED_ARTIFACT_ERROR = "Docker artifact resolution failed";
|
|
7
|
+
type ArtifactRequest = Extract<TargetResourceRequest, {
|
|
8
|
+
operation: "resolve_world_artifact";
|
|
9
|
+
}>;
|
|
10
|
+
type ArtifactResult = {
|
|
11
|
+
readonly receipt: TargetResourceReceipt;
|
|
12
|
+
readonly receiptBytes: string;
|
|
13
|
+
};
|
|
14
|
+
export interface PreparedArtifactAuthorityMapping {
|
|
15
|
+
readonly archive_digest: string;
|
|
16
|
+
readonly artifact_manifest_digest: string;
|
|
17
|
+
readonly base_image_config_digest: string;
|
|
18
|
+
readonly build_policy_digest: string;
|
|
19
|
+
readonly bundle_digest: string;
|
|
20
|
+
readonly entrypoint: string;
|
|
21
|
+
readonly launcher_digest: string;
|
|
22
|
+
readonly network_alias: string;
|
|
23
|
+
readonly platform: {
|
|
24
|
+
readonly architecture: "amd64" | "arm64";
|
|
25
|
+
readonly os: "linux";
|
|
26
|
+
};
|
|
27
|
+
readonly platform_digest: string;
|
|
28
|
+
}
|
|
29
|
+
export interface DockerPreparedArtifactOperations {
|
|
30
|
+
execute(raw: unknown): Promise<ArtifactResult>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Reconstructs the prepared-image authority without ever substituting the
|
|
34
|
+
* later resolution claim for the preparation claim that minted its GC anchor.
|
|
35
|
+
*/
|
|
36
|
+
export declare const attestPreparedArtifactIdentity: (builder: DockerTargetLocalBundleBuilder, binding: DockerConfigArtifactIdentityBinding, prepared: TargetLocalBundlePrivateMapping, selectedTarget: ArtifactRequest["selected_target"]) => Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Private target-default lowering. It admits an already prepared local image
|
|
39
|
+
* only through the bundle store's exact selected-target/correlation lookup.
|
|
40
|
+
*/
|
|
41
|
+
export declare const createDockerPreparedArtifactOperations: (input: {
|
|
42
|
+
readonly identityStore: DockerArtifactIdentityStore;
|
|
43
|
+
readonly builder: DockerTargetLocalBundleBuilder;
|
|
44
|
+
readonly journal: TargetJournalStore;
|
|
45
|
+
readonly mapping: PreparedArtifactAuthorityMapping;
|
|
46
|
+
readonly store: TargetLocalBundleStore;
|
|
47
|
+
}) => DockerPreparedArtifactOperations;
|
|
48
|
+
export {};
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { SpawnfileError } from "../shared/index.js";
|
|
2
|
+
import { parseTargetResourceRequest } from "./contracts.js";
|
|
3
|
+
import { attestTargetLocalBundleMapping } from "./containerBundle.js";
|
|
4
|
+
import { createDockerConfigArtifactSpec } from "./dockerArtifactsProvider.js";
|
|
5
|
+
import { createTargetReceiptDigest } from "./handles.js";
|
|
6
|
+
export const DOCKER_PREPARED_ARTIFACT_ERROR = "Docker artifact resolution failed";
|
|
7
|
+
const fail = () => { throw new SpawnfileError("runtime_error", DOCKER_PREPARED_ARTIFACT_ERROR); };
|
|
8
|
+
/**
|
|
9
|
+
* Reconstructs the prepared-image authority without ever substituting the
|
|
10
|
+
* later resolution claim for the preparation claim that minted its GC anchor.
|
|
11
|
+
*/
|
|
12
|
+
export const attestPreparedArtifactIdentity = async (builder, binding, prepared, selectedTarget) => {
|
|
13
|
+
const expected = {
|
|
14
|
+
archive_digest: binding.archiveDigest,
|
|
15
|
+
artifact_digest: binding.artifactManifestDigest,
|
|
16
|
+
base_image_config_digest: binding.baseImageConfigDigest,
|
|
17
|
+
build_policy_digest: binding.buildPolicyDigest,
|
|
18
|
+
bundle_digest: binding.bundleDigest,
|
|
19
|
+
config_id: binding.configId,
|
|
20
|
+
daemon_epoch: binding.daemonEpoch,
|
|
21
|
+
entrypoint: binding.entrypoint,
|
|
22
|
+
gc_tag: binding.gcTag,
|
|
23
|
+
identity_kind: binding.identityKind,
|
|
24
|
+
launcher_digest: binding.launcherDigest,
|
|
25
|
+
network_alias: binding.networkAlias,
|
|
26
|
+
operation_handle: binding.preparedOperationHandle,
|
|
27
|
+
platform: binding.platform,
|
|
28
|
+
platform_digest: binding.platformDigest,
|
|
29
|
+
request_digest: binding.preparedRequestDigest,
|
|
30
|
+
selected_target: selectedTarget
|
|
31
|
+
};
|
|
32
|
+
if (JSON.stringify(prepared) !== JSON.stringify(expected))
|
|
33
|
+
return fail();
|
|
34
|
+
await attestTargetLocalBundleMapping(builder, prepared);
|
|
35
|
+
};
|
|
36
|
+
const request = (raw) => {
|
|
37
|
+
const parsed = parseTargetResourceRequest(raw);
|
|
38
|
+
if (parsed.operation !== "resolve_world_artifact")
|
|
39
|
+
return fail();
|
|
40
|
+
return parsed;
|
|
41
|
+
};
|
|
42
|
+
const receipt = async (input) => {
|
|
43
|
+
const raw = {
|
|
44
|
+
cleanup_state: "not_requested", descriptor_digest: input.request.descriptor_digest,
|
|
45
|
+
export_state: "not_requested", labels: Object.entries(input.labels).map(([key, value]) => ({ key, value })),
|
|
46
|
+
operation: input.request.operation, operation_handle: input.claim.operationHandle,
|
|
47
|
+
receipt_digest: `sha256:${"0".repeat(64)}`, request_digest: input.claim.requestDigest,
|
|
48
|
+
result_handle: input.resultHandle, resulting_revision: (await input.journal.read()).revision + 1,
|
|
49
|
+
run_id: input.request.run_id, selected_target: input.request.selected_target,
|
|
50
|
+
version: "spawnfile.target-resource.receipt.v1"
|
|
51
|
+
};
|
|
52
|
+
return { ...raw, receipt_digest: createTargetReceiptDigest(raw) };
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Private target-default lowering. It admits an already prepared local image
|
|
56
|
+
* only through the bundle store's exact selected-target/correlation lookup.
|
|
57
|
+
*/
|
|
58
|
+
export const createDockerPreparedArtifactOperations = (input) => {
|
|
59
|
+
if (!input?.identityStore || !input.builder || !input.journal || !input.mapping || !input.store)
|
|
60
|
+
fail();
|
|
61
|
+
const execute = async (raw) => {
|
|
62
|
+
try {
|
|
63
|
+
const value = request(raw);
|
|
64
|
+
if (value.artifact_manifest_digest !== input.mapping.artifact_manifest_digest)
|
|
65
|
+
return fail();
|
|
66
|
+
const reservation = await input.journal.reserve(value);
|
|
67
|
+
if (reservation.kind === "replay")
|
|
68
|
+
return { receipt: reservation.receipt, receiptBytes: reservation.receiptBytes };
|
|
69
|
+
const prepared = await input.store.resolvePrepared({
|
|
70
|
+
artifact_digest: value.artifact_manifest_digest,
|
|
71
|
+
build_policy_digest: input.mapping.build_policy_digest,
|
|
72
|
+
bundle_digest: input.mapping.bundle_digest,
|
|
73
|
+
selected_target: value.selected_target
|
|
74
|
+
});
|
|
75
|
+
if (!prepared || prepared.request.selected_target.handle !== value.selected_target.handle
|
|
76
|
+
|| prepared.request.selected_target.fingerprint !== value.selected_target.fingerprint
|
|
77
|
+
|| prepared.request.artifact_digest !== value.artifact_manifest_digest
|
|
78
|
+
|| prepared.mapping.archive_digest !== input.mapping.archive_digest
|
|
79
|
+
|| prepared.mapping.base_image_config_digest !== input.mapping.base_image_config_digest
|
|
80
|
+
|| prepared.request.bundle_digest !== input.mapping.bundle_digest
|
|
81
|
+
|| prepared.request.build_policy_digest !== input.mapping.build_policy_digest
|
|
82
|
+
|| prepared.mapping.entrypoint !== input.mapping.entrypoint
|
|
83
|
+
|| prepared.request.launcher_digest !== input.mapping.launcher_digest
|
|
84
|
+
|| prepared.request.network_alias !== input.mapping.network_alias
|
|
85
|
+
|| prepared.request.platform_digest !== input.mapping.platform_digest
|
|
86
|
+
|| JSON.stringify(prepared.request.platform) !== JSON.stringify(input.mapping.platform)
|
|
87
|
+
|| prepared.mapping.artifact_digest !== value.artifact_manifest_digest
|
|
88
|
+
|| prepared.mapping.build_policy_digest !== input.mapping.build_policy_digest
|
|
89
|
+
|| prepared.mapping.bundle_digest !== input.mapping.bundle_digest
|
|
90
|
+
|| prepared.mapping.launcher_digest !== input.mapping.launcher_digest
|
|
91
|
+
|| prepared.mapping.network_alias !== input.mapping.network_alias
|
|
92
|
+
|| prepared.mapping.platform_digest !== input.mapping.platform_digest
|
|
93
|
+
|| JSON.stringify(prepared.mapping.platform) !== JSON.stringify(input.mapping.platform))
|
|
94
|
+
return fail();
|
|
95
|
+
await attestTargetLocalBundleMapping(input.builder, prepared.mapping);
|
|
96
|
+
const spec = createDockerConfigArtifactSpec({
|
|
97
|
+
archiveDigest: input.mapping.archive_digest,
|
|
98
|
+
artifactManifestDigest: value.artifact_manifest_digest,
|
|
99
|
+
baseImageConfigDigest: input.mapping.base_image_config_digest,
|
|
100
|
+
buildPolicyDigest: input.mapping.build_policy_digest,
|
|
101
|
+
bundleDigest: input.mapping.bundle_digest, configId: prepared.mapping.config_id,
|
|
102
|
+
daemonEpoch: prepared.mapping.daemon_epoch, entrypoint: input.mapping.entrypoint,
|
|
103
|
+
launcherDigest: input.mapping.launcher_digest, networkAlias: input.mapping.network_alias,
|
|
104
|
+
operationHandle: reservation.claim.operationHandle, requestDigest: reservation.claim.requestDigest,
|
|
105
|
+
selectedTargetHandle: value.selected_target.handle, platform: input.mapping.platform,
|
|
106
|
+
platformDigest: input.mapping.platform_digest
|
|
107
|
+
});
|
|
108
|
+
await input.identityStore.bind({
|
|
109
|
+
archiveDigest: input.mapping.archive_digest,
|
|
110
|
+
artifactManifestDigest: value.artifact_manifest_digest,
|
|
111
|
+
baseImageConfigDigest: input.mapping.base_image_config_digest,
|
|
112
|
+
buildPolicyDigest: input.mapping.build_policy_digest,
|
|
113
|
+
bundleDigest: input.mapping.bundle_digest, configId: prepared.mapping.config_id,
|
|
114
|
+
daemonEpoch: prepared.mapping.daemon_epoch, entrypoint: input.mapping.entrypoint, gcTag: prepared.mapping.gc_tag,
|
|
115
|
+
identityKind: "docker_image_config_digest", operationHandle: reservation.claim.operationHandle,
|
|
116
|
+
launcherDigest: input.mapping.launcher_digest, networkAlias: input.mapping.network_alias,
|
|
117
|
+
preparedOperationHandle: prepared.mapping.operation_handle,
|
|
118
|
+
preparedRequestDigest: prepared.mapping.request_digest,
|
|
119
|
+
requestDigest: reservation.claim.requestDigest, resultHandle: spec.resultHandle,
|
|
120
|
+
selectedTargetHandle: value.selected_target.handle, platform: input.mapping.platform,
|
|
121
|
+
platformDigest: input.mapping.platform_digest
|
|
122
|
+
});
|
|
123
|
+
return input.journal.complete(reservation.claim, await receipt({ claim: reservation.claim,
|
|
124
|
+
journal: input.journal, labels: spec.labels, request: value, resultHandle: spec.resultHandle }));
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
return fail();
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
return Object.freeze({ execute });
|
|
131
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const parseDuplicateFreeDockerProjection: (source: string) => unknown | null;
|