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,140 @@
|
|
|
1
|
+
import { Buffer } from "node:buffer";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
const BLOCK = 512;
|
|
4
|
+
const MAX_BYTES = 4_194_304;
|
|
5
|
+
const fail = () => { throw new Error("Container bundle archive failed"); };
|
|
6
|
+
const zero = (value) => value.every((byte) => byte === 0);
|
|
7
|
+
const text = (value) => {
|
|
8
|
+
const nul = value.indexOf(0);
|
|
9
|
+
const end = nul < 0 ? value.length : nul;
|
|
10
|
+
if (nul >= 0 && !zero(value.subarray(nul)))
|
|
11
|
+
return fail();
|
|
12
|
+
const result = Buffer.from(value.subarray(0, end)).toString("utf8");
|
|
13
|
+
if (!Buffer.from(result, "utf8").equals(Buffer.from(value.subarray(0, end))))
|
|
14
|
+
return fail();
|
|
15
|
+
return result;
|
|
16
|
+
};
|
|
17
|
+
const rawSha = (value) => `sha256:${createHash("sha256").update(value).digest("hex")}`;
|
|
18
|
+
const octal = (value) => {
|
|
19
|
+
if (value.at(-1) !== 0 || value.subarray(0, -1).some((byte) => byte < 48 || byte > 55))
|
|
20
|
+
return fail();
|
|
21
|
+
const parsed = Number.parseInt(Buffer.from(value.subarray(0, -1)).toString("ascii"), 8);
|
|
22
|
+
if (!Number.isSafeInteger(parsed) || parsed < 0)
|
|
23
|
+
return fail();
|
|
24
|
+
return parsed;
|
|
25
|
+
};
|
|
26
|
+
const canonicalOctal = (value) => {
|
|
27
|
+
const parsed = octal(value);
|
|
28
|
+
if (!Buffer.from(`${parsed.toString(8).padStart(value.byteLength - 1, "0")}\0`, "ascii").equals(Buffer.from(value)))
|
|
29
|
+
return fail();
|
|
30
|
+
return parsed;
|
|
31
|
+
};
|
|
32
|
+
const checksum = (header) => {
|
|
33
|
+
const field = header.subarray(148, 156);
|
|
34
|
+
/* POSIX USTAR permits both its traditional six-digit NUL-space spelling
|
|
35
|
+
* and a seven-digit NUL-terminated field. Accept neither padding nor any
|
|
36
|
+
* other checksum representation. */
|
|
37
|
+
const traditional = field[6] === 0 && field[7] === 0x20 && field.subarray(0, 6).every((byte) => byte >= 48 && byte <= 55);
|
|
38
|
+
const nulTerminated = field[7] === 0 && field.subarray(0, 7).every((byte) => byte >= 48 && byte <= 55);
|
|
39
|
+
if (!traditional && !nulTerminated)
|
|
40
|
+
return fail();
|
|
41
|
+
const claimed = Number.parseInt(Buffer.from(field.subarray(0, traditional ? 6 : 7)).toString("ascii"), 8);
|
|
42
|
+
let actual = 0;
|
|
43
|
+
for (let index = 0; index < BLOCK; index += 1)
|
|
44
|
+
actual += index >= 148 && index < 156 ? 0x20 : header[index];
|
|
45
|
+
if (claimed !== actual)
|
|
46
|
+
return fail();
|
|
47
|
+
return claimed;
|
|
48
|
+
};
|
|
49
|
+
const safePath = (raw) => {
|
|
50
|
+
if (!/^[A-Za-z0-9][A-Za-z0-9._/-]{0,255}$/u.test(raw) || raw.includes("//")
|
|
51
|
+
|| raw.split("/").some((part) => part === "." || part === ".."))
|
|
52
|
+
return fail();
|
|
53
|
+
return raw;
|
|
54
|
+
};
|
|
55
|
+
const canonicalPath = (name, prefix) => {
|
|
56
|
+
if (name.length === 0 || prefix.endsWith("/"))
|
|
57
|
+
return fail();
|
|
58
|
+
const joined = safePath(prefix ? `${prefix}/${name}` : name);
|
|
59
|
+
if (joined.length <= 100) {
|
|
60
|
+
if (prefix || name !== joined)
|
|
61
|
+
return fail();
|
|
62
|
+
return joined;
|
|
63
|
+
}
|
|
64
|
+
const split = joined.lastIndexOf("/");
|
|
65
|
+
if (split < 1 || joined.slice(0, split) !== prefix || joined.slice(split + 1) !== name
|
|
66
|
+
|| Buffer.byteLength(prefix, "utf8") > 155 || Buffer.byteLength(name, "utf8") > 100)
|
|
67
|
+
return fail();
|
|
68
|
+
return joined;
|
|
69
|
+
};
|
|
70
|
+
const canonicalAllowed = (paths) => {
|
|
71
|
+
if (paths.length < 1 || paths.length > 32)
|
|
72
|
+
return fail();
|
|
73
|
+
const normalized = paths.map(safePath);
|
|
74
|
+
if (normalized.some((value, index) => index > 0 && normalized[index - 1] >= value))
|
|
75
|
+
return fail();
|
|
76
|
+
return normalized;
|
|
77
|
+
};
|
|
78
|
+
/** Validates an uncompressed canonical USTAR bundle before Docker ever receives it. */
|
|
79
|
+
export const parseContainerBundleArchive = (raw, allowedPaths, expectedDigest) => {
|
|
80
|
+
if (!(raw instanceof Uint8Array) || raw.byteLength < BLOCK * 2 || raw.byteLength > MAX_BYTES || raw.byteLength % BLOCK !== 0
|
|
81
|
+
|| !/^sha256:[a-f0-9]{64}$/u.test(expectedDigest)
|
|
82
|
+
|| `sha256:${createHash("sha256").update(raw).digest("hex")}` !== expectedDigest)
|
|
83
|
+
return fail();
|
|
84
|
+
const expected = canonicalAllowed(allowedPaths);
|
|
85
|
+
const entries = [];
|
|
86
|
+
let offset = 0;
|
|
87
|
+
while (offset < raw.byteLength) {
|
|
88
|
+
const header = raw.subarray(offset, offset + BLOCK);
|
|
89
|
+
offset += BLOCK;
|
|
90
|
+
if (zero(header)) {
|
|
91
|
+
if (entries.length === 0 || offset + BLOCK !== raw.byteLength || !zero(raw.subarray(offset, offset + BLOCK)))
|
|
92
|
+
return fail();
|
|
93
|
+
if (entries.length !== expected.length)
|
|
94
|
+
return fail();
|
|
95
|
+
return Object.freeze({ bytes: new Uint8Array(raw), entries: Object.freeze(entries) });
|
|
96
|
+
}
|
|
97
|
+
if (!Buffer.from(header.subarray(257, 263)).equals(Buffer.from("ustar\0", "ascii"))
|
|
98
|
+
|| !Buffer.from(header.subarray(263, 265)).equals(Buffer.from("00", "ascii"))
|
|
99
|
+
|| !zero(header.subarray(157, 257)) || !zero(header.subarray(500, 512)))
|
|
100
|
+
return fail();
|
|
101
|
+
checksum(header);
|
|
102
|
+
if (canonicalOctal(header.subarray(100, 108)) !== 0o644 || canonicalOctal(header.subarray(108, 116)) !== 0
|
|
103
|
+
|| canonicalOctal(header.subarray(116, 124)) !== 0 || canonicalOctal(header.subarray(136, 148)) !== 0
|
|
104
|
+
|| !zero(header.subarray(329, 345)) || header[156] !== 48
|
|
105
|
+
|| text(header.subarray(265, 297)) !== "" || text(header.subarray(297, 329)) !== "")
|
|
106
|
+
return fail();
|
|
107
|
+
const name = text(header.subarray(0, 100));
|
|
108
|
+
const prefix = text(header.subarray(345, 500));
|
|
109
|
+
const path = canonicalPath(name, prefix);
|
|
110
|
+
if (path !== expected[entries.length])
|
|
111
|
+
return fail();
|
|
112
|
+
const size = canonicalOctal(header.subarray(124, 136));
|
|
113
|
+
const end = offset + size;
|
|
114
|
+
const padded = Math.ceil(size / BLOCK) * BLOCK;
|
|
115
|
+
if (end > raw.byteLength || offset + padded > raw.byteLength || !zero(raw.subarray(end, offset + padded)))
|
|
116
|
+
return fail();
|
|
117
|
+
entries.push(Object.freeze({ bytes: new Uint8Array(raw.subarray(offset, end)), path }));
|
|
118
|
+
offset += padded;
|
|
119
|
+
}
|
|
120
|
+
return fail();
|
|
121
|
+
};
|
|
122
|
+
/**
|
|
123
|
+
* The versioned preparation request is the sealed deployment envelope.
|
|
124
|
+
* The archive digest already commits every byte. The artifact digest is an
|
|
125
|
+
* owner-defined semantic identity (for example, a manifest digest), while the
|
|
126
|
+
* launcher is the one generic executable role whose raw bytes Spawnfile can
|
|
127
|
+
* and must verify without interpreting provider-private contents.
|
|
128
|
+
*/
|
|
129
|
+
export const validateContainerBundleEnvelope = (archive, claims) => {
|
|
130
|
+
try {
|
|
131
|
+
const launcher = archive.entries.find((item) => item.path === claims.entrypoint);
|
|
132
|
+
if (!launcher || rawSha(launcher.bytes) !== claims.launcher_digest
|
|
133
|
+
|| !/^sha256:[a-f0-9]{64}$/u.test(claims.artifact_digest)
|
|
134
|
+
|| claims.artifact_digest === claims.launcher_digest)
|
|
135
|
+
return fail();
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
return fail();
|
|
139
|
+
}
|
|
140
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { TargetLocalBundlePrepareRequest } from "./containerBundleContracts.js";
|
|
2
|
+
export interface ContainerBundleAllowlistEntry {
|
|
3
|
+
readonly archive_digest: string;
|
|
4
|
+
readonly artifact_manifest_digest: string;
|
|
5
|
+
readonly base_image_config_digest: string;
|
|
6
|
+
readonly build_policy_digest: string;
|
|
7
|
+
readonly bundle_digest: string;
|
|
8
|
+
readonly entrypoint: string;
|
|
9
|
+
readonly launcher_digest: string;
|
|
10
|
+
readonly network_alias: string;
|
|
11
|
+
readonly platform: {
|
|
12
|
+
readonly architecture: "amd64" | "arm64";
|
|
13
|
+
readonly os: "linux";
|
|
14
|
+
};
|
|
15
|
+
readonly platform_digest: string;
|
|
16
|
+
}
|
|
17
|
+
export interface AuthorizedContainerBundlePlan extends ContainerBundleAllowlistEntry {
|
|
18
|
+
readonly artifact_digest: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ContainerBundlePreparationAuthority {
|
|
21
|
+
/** Returns private build inputs only after the complete semantic tuple matches. */
|
|
22
|
+
authorize(request: TargetLocalBundlePrepareRequest): AuthorizedContainerBundlePlan;
|
|
23
|
+
}
|
|
24
|
+
/** A target may build only a complete, reviewed, target-local plan. */
|
|
25
|
+
export declare const createContainerBundlePreparationAuthority: (entries: readonly ContainerBundleAllowlistEntry[]) => ContainerBundlePreparationAuthority;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { deriveTargetLocalContainerBundlePolicy } from "./containerBundlePolicy.js";
|
|
2
|
+
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
3
|
+
const fail = () => { throw new Error("Target-local container bundle authorization failed"); };
|
|
4
|
+
const same = (left, right) => JSON.stringify(left) === JSON.stringify(right);
|
|
5
|
+
const entry = (raw) => {
|
|
6
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw) || Object.getPrototypeOf(raw) !== Object.prototype)
|
|
7
|
+
return fail();
|
|
8
|
+
const descriptors = Object.getOwnPropertyDescriptors(raw);
|
|
9
|
+
if (Object.values(descriptors).some((value) => !value.enumerable || !("value" in value)))
|
|
10
|
+
return fail();
|
|
11
|
+
const value = Object.fromEntries(Object.entries(descriptors).map(([key, descriptor]) => [key, descriptor.value]));
|
|
12
|
+
if (Object.keys(value).sort().join("\0") !== "archive_digest\0artifact_manifest_digest\0base_image_config_digest\0build_policy_digest\0bundle_digest\0entrypoint\0launcher_digest\0network_alias\0platform\0platform_digest"
|
|
13
|
+
|| !Object.values(value).filter((item) => typeof item === "string").every((item) => typeof item === "string")
|
|
14
|
+
|| ![value.archive_digest, value.artifact_manifest_digest, value.base_image_config_digest, value.build_policy_digest,
|
|
15
|
+
value.bundle_digest, value.launcher_digest, value.platform_digest].every((item) => typeof item === "string" && DIGEST.test(item))
|
|
16
|
+
|| typeof value.entrypoint !== "string" || !/^[A-Za-z0-9][A-Za-z0-9._/-]{0,239}$/u.test(value.entrypoint)
|
|
17
|
+
|| value.entrypoint.includes("//") || value.entrypoint.split("/").some((part) => part === "." || part === "..")
|
|
18
|
+
|| typeof value.network_alias !== "string" || !/^[a-z][a-z0-9-]{0,62}$/u.test(value.network_alias)
|
|
19
|
+
|| !value.platform || typeof value.platform !== "object" || Array.isArray(value.platform)
|
|
20
|
+
|| Object.getPrototypeOf(value.platform) !== Object.prototype)
|
|
21
|
+
return fail();
|
|
22
|
+
const platform = value.platform;
|
|
23
|
+
if (Object.keys(platform).sort().join("\0") !== "architecture\0os"
|
|
24
|
+
|| platform.os !== "linux" || (platform.architecture !== "amd64" && platform.architecture !== "arm64"))
|
|
25
|
+
return fail();
|
|
26
|
+
return Object.freeze({ archive_digest: value.archive_digest,
|
|
27
|
+
artifact_manifest_digest: value.artifact_manifest_digest,
|
|
28
|
+
base_image_config_digest: value.base_image_config_digest,
|
|
29
|
+
build_policy_digest: value.build_policy_digest, bundle_digest: value.bundle_digest,
|
|
30
|
+
entrypoint: value.entrypoint, launcher_digest: value.launcher_digest, network_alias: value.network_alias,
|
|
31
|
+
platform: Object.freeze({ architecture: platform.architecture, os: platform.os }),
|
|
32
|
+
platform_digest: value.platform_digest });
|
|
33
|
+
};
|
|
34
|
+
/** A target may build only a complete, reviewed, target-local plan. */
|
|
35
|
+
export const createContainerBundlePreparationAuthority = (entries) => {
|
|
36
|
+
if (!Array.isArray(entries) || entries.length > 32)
|
|
37
|
+
return fail();
|
|
38
|
+
const allowed = Object.freeze(entries.map(entry));
|
|
39
|
+
if (new Set(allowed.map((value) => value.artifact_manifest_digest)).size !== allowed.length)
|
|
40
|
+
return fail();
|
|
41
|
+
const authorize = (request) => {
|
|
42
|
+
const matches = allowed.filter((value) => value.artifact_manifest_digest === request.artifact_digest
|
|
43
|
+
&& value.archive_digest === request.archive_digest && value.build_policy_digest === request.build_policy_digest
|
|
44
|
+
&& value.bundle_digest === request.bundle_digest && value.entrypoint === request.entrypoint
|
|
45
|
+
&& value.launcher_digest === request.launcher_digest && value.network_alias === request.network_alias
|
|
46
|
+
&& value.platform_digest === request.platform_digest && same(value.platform, request.platform));
|
|
47
|
+
if (matches.length !== 1)
|
|
48
|
+
return fail();
|
|
49
|
+
const authoritative = deriveTargetLocalContainerBundlePolicy({
|
|
50
|
+
archiveDigest: request.archive_digest,
|
|
51
|
+
artifactDigest: request.artifact_digest,
|
|
52
|
+
baseImageConfigDigest: matches[0].base_image_config_digest,
|
|
53
|
+
bundleDigest: request.bundle_digest,
|
|
54
|
+
entrypoint: request.entrypoint,
|
|
55
|
+
launcherDigest: request.launcher_digest,
|
|
56
|
+
networkAlias: request.network_alias,
|
|
57
|
+
platform: request.platform
|
|
58
|
+
});
|
|
59
|
+
if (authoritative.buildPolicyDigest !== request.build_policy_digest
|
|
60
|
+
|| authoritative.platformDigest !== request.platform_digest)
|
|
61
|
+
return fail();
|
|
62
|
+
return Object.freeze({ ...matches[0], artifact_digest: request.artifact_digest });
|
|
63
|
+
};
|
|
64
|
+
return Object.freeze({ authorize });
|
|
65
|
+
};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const TARGET_LOCAL_BUNDLE_PREPARE_REQUEST_VERSION: "spawnfile.target-local-container-bundle.prepare-request.v1";
|
|
3
|
+
export declare const TARGET_LOCAL_BUNDLE_PREPARE_RECEIPT_VERSION: "spawnfile.target-local-container-bundle.prepare-receipt.v1";
|
|
4
|
+
export declare const TARGET_LOCAL_BUNDLE_LOOKUP_VERSION: "spawnfile.target-local-container-bundle.lookup.v1";
|
|
5
|
+
export declare const targetLocalBundlePrepareRequestSchema: z.ZodObject<{
|
|
6
|
+
archive_base64: z.ZodString;
|
|
7
|
+
archive_digest: z.ZodString;
|
|
8
|
+
archive_entries: z.ZodArray<z.ZodString>;
|
|
9
|
+
artifact_digest: z.ZodString;
|
|
10
|
+
build_policy_digest: z.ZodString;
|
|
11
|
+
bundle_digest: z.ZodString;
|
|
12
|
+
entrypoint: z.ZodString;
|
|
13
|
+
idempotency_key: z.ZodString;
|
|
14
|
+
launcher_digest: z.ZodString;
|
|
15
|
+
network_alias: z.ZodString;
|
|
16
|
+
platform: z.ZodObject<{
|
|
17
|
+
architecture: z.ZodEnum<{
|
|
18
|
+
amd64: "amd64";
|
|
19
|
+
arm64: "arm64";
|
|
20
|
+
}>;
|
|
21
|
+
os: z.ZodLiteral<"linux">;
|
|
22
|
+
}, z.core.$strict>;
|
|
23
|
+
platform_digest: z.ZodString;
|
|
24
|
+
selected_target: z.ZodObject<{
|
|
25
|
+
fingerprint: z.ZodString;
|
|
26
|
+
handle: z.ZodPipe<z.ZodString, z.ZodTransform<import("./contracts.js").OpaqueTargetHandle, string>>;
|
|
27
|
+
}, z.core.$strict>;
|
|
28
|
+
version: z.ZodLiteral<"spawnfile.target-local-container-bundle.prepare-request.v1">;
|
|
29
|
+
}, z.core.$strict>;
|
|
30
|
+
export declare const targetLocalBundlePrepareReceiptSchema: z.ZodObject<{
|
|
31
|
+
archive_digest: z.ZodString;
|
|
32
|
+
artifact_digest: z.ZodString;
|
|
33
|
+
build_policy_digest: z.ZodString;
|
|
34
|
+
bundle_digest: z.ZodString;
|
|
35
|
+
launcher_digest: z.ZodString;
|
|
36
|
+
mapping_handle: z.ZodPipe<z.ZodString, z.ZodTransform<import("./contracts.js").OpaqueTargetHandle, string>>;
|
|
37
|
+
network_alias: z.ZodString;
|
|
38
|
+
operation_handle: z.ZodPipe<z.ZodString, z.ZodTransform<import("./contracts.js").OpaqueTargetHandle, string>>;
|
|
39
|
+
platform: z.ZodObject<{
|
|
40
|
+
architecture: z.ZodEnum<{
|
|
41
|
+
amd64: "amd64";
|
|
42
|
+
arm64: "arm64";
|
|
43
|
+
}>;
|
|
44
|
+
os: z.ZodLiteral<"linux">;
|
|
45
|
+
}, z.core.$strict>;
|
|
46
|
+
platform_digest: z.ZodString;
|
|
47
|
+
receipt_digest: z.ZodString;
|
|
48
|
+
request_digest: z.ZodString;
|
|
49
|
+
selected_target: z.ZodObject<{
|
|
50
|
+
fingerprint: z.ZodString;
|
|
51
|
+
handle: z.ZodPipe<z.ZodString, z.ZodTransform<import("./contracts.js").OpaqueTargetHandle, string>>;
|
|
52
|
+
}, z.core.$strict>;
|
|
53
|
+
version: z.ZodLiteral<"spawnfile.target-local-container-bundle.prepare-receipt.v1">;
|
|
54
|
+
}, z.core.$strict>;
|
|
55
|
+
export declare const targetLocalBundleLookupSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
56
|
+
status: z.ZodLiteral<"not_applied">;
|
|
57
|
+
idempotency_key: z.ZodString;
|
|
58
|
+
request_digest: z.ZodString;
|
|
59
|
+
version: z.ZodLiteral<"spawnfile.target-local-container-bundle.lookup.v1">;
|
|
60
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
61
|
+
operation_handle: z.ZodPipe<z.ZodString, z.ZodTransform<import("./contracts.js").OpaqueTargetHandle, string>>;
|
|
62
|
+
status: z.ZodLiteral<"pending">;
|
|
63
|
+
idempotency_key: z.ZodString;
|
|
64
|
+
request_digest: z.ZodString;
|
|
65
|
+
version: z.ZodLiteral<"spawnfile.target-local-container-bundle.lookup.v1">;
|
|
66
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
67
|
+
operation_handle: z.ZodPipe<z.ZodString, z.ZodTransform<import("./contracts.js").OpaqueTargetHandle, string>>;
|
|
68
|
+
receipt: z.ZodObject<{
|
|
69
|
+
archive_digest: z.ZodString;
|
|
70
|
+
artifact_digest: z.ZodString;
|
|
71
|
+
build_policy_digest: z.ZodString;
|
|
72
|
+
bundle_digest: z.ZodString;
|
|
73
|
+
launcher_digest: z.ZodString;
|
|
74
|
+
mapping_handle: z.ZodPipe<z.ZodString, z.ZodTransform<import("./contracts.js").OpaqueTargetHandle, string>>;
|
|
75
|
+
network_alias: z.ZodString;
|
|
76
|
+
operation_handle: z.ZodPipe<z.ZodString, z.ZodTransform<import("./contracts.js").OpaqueTargetHandle, string>>;
|
|
77
|
+
platform: z.ZodObject<{
|
|
78
|
+
architecture: z.ZodEnum<{
|
|
79
|
+
amd64: "amd64";
|
|
80
|
+
arm64: "arm64";
|
|
81
|
+
}>;
|
|
82
|
+
os: z.ZodLiteral<"linux">;
|
|
83
|
+
}, z.core.$strict>;
|
|
84
|
+
platform_digest: z.ZodString;
|
|
85
|
+
receipt_digest: z.ZodString;
|
|
86
|
+
request_digest: z.ZodString;
|
|
87
|
+
selected_target: z.ZodObject<{
|
|
88
|
+
fingerprint: z.ZodString;
|
|
89
|
+
handle: z.ZodPipe<z.ZodString, z.ZodTransform<import("./contracts.js").OpaqueTargetHandle, string>>;
|
|
90
|
+
}, z.core.$strict>;
|
|
91
|
+
version: z.ZodLiteral<"spawnfile.target-local-container-bundle.prepare-receipt.v1">;
|
|
92
|
+
}, z.core.$strict>;
|
|
93
|
+
status: z.ZodLiteral<"completed">;
|
|
94
|
+
idempotency_key: z.ZodString;
|
|
95
|
+
request_digest: z.ZodString;
|
|
96
|
+
version: z.ZodLiteral<"spawnfile.target-local-container-bundle.lookup.v1">;
|
|
97
|
+
}, z.core.$strict>], "status">;
|
|
98
|
+
export declare const targetLocalBundleLookupRequestSchema: z.ZodObject<{
|
|
99
|
+
idempotency_key: z.ZodString;
|
|
100
|
+
request_digest: z.ZodString;
|
|
101
|
+
version: z.ZodLiteral<"spawnfile.target-local-container-bundle.lookup.v1">;
|
|
102
|
+
}, z.core.$strict>;
|
|
103
|
+
export type TargetLocalBundlePrepareRequest = z.infer<typeof targetLocalBundlePrepareRequestSchema>;
|
|
104
|
+
export type TargetLocalBundlePrepareReceipt = z.infer<typeof targetLocalBundlePrepareReceiptSchema>;
|
|
105
|
+
export type TargetLocalBundleLookup = z.infer<typeof targetLocalBundleLookupSchema>;
|
|
106
|
+
export type TargetLocalBundleLookupRequest = z.infer<typeof targetLocalBundleLookupRequestSchema>;
|
|
107
|
+
export declare const parseTargetLocalBundlePrepareRequest: (raw: unknown) => TargetLocalBundlePrepareRequest;
|
|
108
|
+
export declare const parseTargetLocalBundlePrepareReceipt: (raw: unknown) => TargetLocalBundlePrepareReceipt;
|
|
109
|
+
export declare const parseTargetLocalBundleLookup: (raw: unknown) => TargetLocalBundleLookup;
|
|
110
|
+
export declare const parseTargetLocalBundleLookupRequest: (raw: unknown) => TargetLocalBundleLookupRequest;
|
|
111
|
+
export declare const createTargetLocalBundleRequestDigest: (raw: unknown) => `sha256:${string}`;
|
|
112
|
+
export declare const createTargetLocalBundleReceiptDigest: (raw: unknown) => `sha256:${string}`;
|
|
113
|
+
export declare const createCanonicalTargetLocalBundleReceiptBytes: (raw: unknown) => string;
|
|
114
|
+
export declare const createCanonicalTargetLocalBundleLookupBytes: (raw: unknown) => string;
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { Buffer } from "node:buffer";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { assertOrdinaryJsonGraph, opaqueTargetHandleSchema, selectedTargetSchema } from "./contracts.js";
|
|
5
|
+
export const TARGET_LOCAL_BUNDLE_PREPARE_REQUEST_VERSION = "spawnfile.target-local-container-bundle.prepare-request.v1";
|
|
6
|
+
export const TARGET_LOCAL_BUNDLE_PREPARE_RECEIPT_VERSION = "spawnfile.target-local-container-bundle.prepare-receipt.v1";
|
|
7
|
+
export const TARGET_LOCAL_BUNDLE_LOOKUP_VERSION = "spawnfile.target-local-container-bundle.lookup.v1";
|
|
8
|
+
const digest = z.string().regex(/^sha256:[a-f0-9]{64}$/u);
|
|
9
|
+
const idempotency = z.string().regex(/^idem_[a-z0-9]{16,64}$/u);
|
|
10
|
+
const alias = z.string().regex(/^[a-z][a-z0-9-]{0,62}$/u);
|
|
11
|
+
const archivePath = z.string().regex(/^[A-Za-z0-9][A-Za-z0-9._/-]{0,255}$/u)
|
|
12
|
+
.refine((value) => !value.includes("//") && !value.split("/").some((part) => part === "." || part === ".."))
|
|
13
|
+
.refine((value) => {
|
|
14
|
+
if (Buffer.byteLength(value, "utf8") <= 100)
|
|
15
|
+
return true;
|
|
16
|
+
const split = value.lastIndexOf("/");
|
|
17
|
+
return split > 0 && Buffer.byteLength(value.slice(0, split), "utf8") <= 155
|
|
18
|
+
&& Buffer.byteLength(value.slice(split + 1), "utf8") <= 100;
|
|
19
|
+
});
|
|
20
|
+
const platform = z.object({ architecture: z.enum(["amd64", "arm64"]), os: z.literal("linux") }).strict();
|
|
21
|
+
const canonicalBase64 = (value) => {
|
|
22
|
+
if (value.length > 5_592_408 || value.length % 4 !== 0)
|
|
23
|
+
return false;
|
|
24
|
+
let padding = 0;
|
|
25
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
26
|
+
const code = value.charCodeAt(index);
|
|
27
|
+
const equals = code === 61;
|
|
28
|
+
const ordinary = code >= 65 && code <= 90 || code >= 97 && code <= 122 || code >= 48 && code <= 57 || code === 43 || code === 47;
|
|
29
|
+
if (!equals && !ordinary || equals && index < value.length - 2)
|
|
30
|
+
return false;
|
|
31
|
+
if (equals)
|
|
32
|
+
padding += 1;
|
|
33
|
+
else if (padding > 0)
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
if (padding > 2 || padding === 1 && value.at(-1) !== "=" || padding === 2 && !value.endsWith("=="))
|
|
37
|
+
return false;
|
|
38
|
+
const bytes = Buffer.from(value, "base64");
|
|
39
|
+
return bytes.byteLength <= 4_194_304 && bytes.toString("base64") === value;
|
|
40
|
+
};
|
|
41
|
+
const archiveBytes = z.string().refine(canonicalBase64);
|
|
42
|
+
const canonicalEntries = (items) => items.every((item, index) => (index === 0 || items[index - 1] < item) && archivePath.safeParse(item).success);
|
|
43
|
+
export const targetLocalBundlePrepareRequestSchema = z.object({
|
|
44
|
+
archive_base64: archiveBytes,
|
|
45
|
+
archive_digest: digest,
|
|
46
|
+
archive_entries: z.array(archivePath).min(1).max(32).superRefine((items, context) => {
|
|
47
|
+
if (!canonicalEntries(items)) {
|
|
48
|
+
context.addIssue({ code: z.ZodIssueCode.custom, message: "archive entries must be canonical" });
|
|
49
|
+
}
|
|
50
|
+
}),
|
|
51
|
+
artifact_digest: digest,
|
|
52
|
+
build_policy_digest: digest,
|
|
53
|
+
bundle_digest: digest,
|
|
54
|
+
entrypoint: archivePath,
|
|
55
|
+
idempotency_key: idempotency,
|
|
56
|
+
launcher_digest: digest,
|
|
57
|
+
network_alias: alias,
|
|
58
|
+
platform,
|
|
59
|
+
platform_digest: digest,
|
|
60
|
+
selected_target: selectedTargetSchema,
|
|
61
|
+
version: z.literal(TARGET_LOCAL_BUNDLE_PREPARE_REQUEST_VERSION)
|
|
62
|
+
}).strict().superRefine((value, context) => {
|
|
63
|
+
if (new Set([value.archive_digest, value.artifact_digest, value.build_policy_digest,
|
|
64
|
+
value.bundle_digest, value.launcher_digest, value.platform_digest]).size !== 6) {
|
|
65
|
+
context.addIssue({ code: z.ZodIssueCode.custom, message: "bundle correlations must be distinct" });
|
|
66
|
+
}
|
|
67
|
+
if (!value.archive_entries.includes(value.entrypoint)) {
|
|
68
|
+
context.addIssue({ code: z.ZodIssueCode.custom, message: "entrypoint must be an admitted archive entry" });
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
const receiptBodySchema = z.object({
|
|
72
|
+
archive_digest: digest,
|
|
73
|
+
artifact_digest: digest,
|
|
74
|
+
build_policy_digest: digest,
|
|
75
|
+
bundle_digest: digest,
|
|
76
|
+
launcher_digest: digest,
|
|
77
|
+
mapping_handle: opaqueTargetHandleSchema,
|
|
78
|
+
network_alias: alias,
|
|
79
|
+
operation_handle: opaqueTargetHandleSchema,
|
|
80
|
+
platform,
|
|
81
|
+
platform_digest: digest,
|
|
82
|
+
receipt_digest: digest,
|
|
83
|
+
request_digest: digest,
|
|
84
|
+
selected_target: selectedTargetSchema,
|
|
85
|
+
version: z.literal(TARGET_LOCAL_BUNDLE_PREPARE_RECEIPT_VERSION)
|
|
86
|
+
}).strict();
|
|
87
|
+
export const targetLocalBundlePrepareReceiptSchema = receiptBodySchema;
|
|
88
|
+
const lookupBase = {
|
|
89
|
+
idempotency_key: idempotency,
|
|
90
|
+
request_digest: digest,
|
|
91
|
+
version: z.literal(TARGET_LOCAL_BUNDLE_LOOKUP_VERSION)
|
|
92
|
+
};
|
|
93
|
+
export const targetLocalBundleLookupSchema = z.discriminatedUnion("status", [
|
|
94
|
+
z.object({ ...lookupBase, status: z.literal("not_applied") }).strict(),
|
|
95
|
+
z.object({ ...lookupBase, operation_handle: opaqueTargetHandleSchema, status: z.literal("pending") }).strict(),
|
|
96
|
+
z.object({ ...lookupBase, operation_handle: opaqueTargetHandleSchema, receipt: receiptBodySchema, status: z.literal("completed") }).strict()
|
|
97
|
+
]);
|
|
98
|
+
export const targetLocalBundleLookupRequestSchema = z.object({
|
|
99
|
+
idempotency_key: idempotency,
|
|
100
|
+
request_digest: digest,
|
|
101
|
+
version: z.literal(TARGET_LOCAL_BUNDLE_LOOKUP_VERSION)
|
|
102
|
+
}).strict();
|
|
103
|
+
/* The generic JSON graph guard intentionally caps ordinary control messages at
|
|
104
|
+
* 64 KiB. A bundle request is the one bounded binary envelope: its canonical
|
|
105
|
+
* base64 may be 5,592,408 bytes for a 4 MiB archive. Clone descriptor values
|
|
106
|
+
* first, replacing only that field for graph admission, so schema parsing
|
|
107
|
+
* never invokes caller-owned accessors or proxies. */
|
|
108
|
+
const safeBundleRequestGraph = (raw) => {
|
|
109
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
|
|
110
|
+
assertOrdinaryJsonGraph(raw);
|
|
111
|
+
return raw;
|
|
112
|
+
}
|
|
113
|
+
const prototype = Object.getPrototypeOf(raw);
|
|
114
|
+
const descriptors = Object.getOwnPropertyDescriptors(raw);
|
|
115
|
+
const archive = descriptors.archive_base64;
|
|
116
|
+
if (prototype !== Object.prototype || !archive || !("value" in archive) || typeof archive.value !== "string") {
|
|
117
|
+
assertOrdinaryJsonGraph(raw);
|
|
118
|
+
return raw;
|
|
119
|
+
}
|
|
120
|
+
const admitted = Object.create(Object.prototype);
|
|
121
|
+
Object.defineProperties(admitted, descriptors);
|
|
122
|
+
Object.defineProperty(admitted, "archive_base64", { configurable: true, enumerable: true, value: "", writable: true });
|
|
123
|
+
assertOrdinaryJsonGraph(admitted);
|
|
124
|
+
Object.defineProperty(admitted, "archive_base64", { configurable: true, enumerable: true, value: archive.value, writable: true });
|
|
125
|
+
return admitted;
|
|
126
|
+
};
|
|
127
|
+
export const parseTargetLocalBundlePrepareRequest = (raw) => {
|
|
128
|
+
return targetLocalBundlePrepareRequestSchema.parse(safeBundleRequestGraph(raw));
|
|
129
|
+
};
|
|
130
|
+
export const parseTargetLocalBundlePrepareReceipt = (raw) => {
|
|
131
|
+
assertOrdinaryJsonGraph(raw);
|
|
132
|
+
const parsed = targetLocalBundlePrepareReceiptSchema.parse(raw);
|
|
133
|
+
if (parsed.receipt_digest !== createTargetLocalBundleReceiptDigest(parsed))
|
|
134
|
+
throw new Error("Container bundle receipt failed");
|
|
135
|
+
return parsed;
|
|
136
|
+
};
|
|
137
|
+
export const parseTargetLocalBundleLookup = (raw) => {
|
|
138
|
+
assertOrdinaryJsonGraph(raw);
|
|
139
|
+
const parsed = targetLocalBundleLookupSchema.parse(raw);
|
|
140
|
+
if (parsed.status === "completed") {
|
|
141
|
+
const receipt = parseTargetLocalBundlePrepareReceipt(parsed.receipt);
|
|
142
|
+
if (receipt.operation_handle !== parsed.operation_handle || receipt.request_digest !== parsed.request_digest) {
|
|
143
|
+
throw new Error("Container bundle lookup failed");
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return parsed;
|
|
147
|
+
};
|
|
148
|
+
export const parseTargetLocalBundleLookupRequest = (raw) => {
|
|
149
|
+
assertOrdinaryJsonGraph(raw);
|
|
150
|
+
return targetLocalBundleLookupRequestSchema.parse(raw);
|
|
151
|
+
};
|
|
152
|
+
const canonical = (value, trusted = false) => {
|
|
153
|
+
if (!trusted)
|
|
154
|
+
assertOrdinaryJsonGraph(value);
|
|
155
|
+
if (Array.isArray(value))
|
|
156
|
+
return `[${value.map((item) => canonical(item, true)).join(",")}]`;
|
|
157
|
+
if (value !== null && typeof value === "object") {
|
|
158
|
+
const record = value;
|
|
159
|
+
return `{${Object.keys(record).sort().map((key) => `${JSON.stringify(key)}:${canonical(record[key], true)}`).join(",")}}`;
|
|
160
|
+
}
|
|
161
|
+
return JSON.stringify(value);
|
|
162
|
+
};
|
|
163
|
+
const hashed = (domain, value, trusted = false) => `sha256:${createHash("sha256")
|
|
164
|
+
.update(`spawnfile.target-local-container-bundle.${domain}.v1\0`, "utf8")
|
|
165
|
+
.update(canonical(value, trusted), "utf8").digest("hex")}`;
|
|
166
|
+
export const createTargetLocalBundleRequestDigest = (raw) => hashed("request", parseTargetLocalBundlePrepareRequest(raw), true);
|
|
167
|
+
export const createTargetLocalBundleReceiptDigest = (raw) => {
|
|
168
|
+
assertOrdinaryJsonGraph(raw);
|
|
169
|
+
const { receipt_digest: _digest, ...body } = targetLocalBundlePrepareReceiptSchema.parse(raw);
|
|
170
|
+
return hashed("receipt", body);
|
|
171
|
+
};
|
|
172
|
+
export const createCanonicalTargetLocalBundleReceiptBytes = (raw) => canonical(parseTargetLocalBundlePrepareReceipt(raw));
|
|
173
|
+
export const createCanonicalTargetLocalBundleLookupBytes = (raw) => canonical(parseTargetLocalBundleLookup(raw));
|