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,23 @@
|
|
|
1
|
+
import { type TargetResourceReceipt } from "./contracts.js";
|
|
2
|
+
import { type TargetJournalStore } from "./journal.js";
|
|
3
|
+
import { type OrganizationAttachmentResolver } from "./organizationAttachmentAuthority.js";
|
|
4
|
+
import { type DockerOrganizationAttachmentExecutor } from "./organizationAttachmentProvider.js";
|
|
5
|
+
import { type OrganizationAttachmentAuthorityStore } from "./organizationAttachmentStore.js";
|
|
6
|
+
type OperationResult = {
|
|
7
|
+
readonly receipt: TargetResourceReceipt;
|
|
8
|
+
readonly receiptBytes: string;
|
|
9
|
+
};
|
|
10
|
+
export interface DockerOrganizationAttachmentOperationsOptions {
|
|
11
|
+
readonly authorityStore: OrganizationAttachmentAuthorityStore;
|
|
12
|
+
readonly context: unknown;
|
|
13
|
+
readonly executor: DockerOrganizationAttachmentExecutor;
|
|
14
|
+
readonly journal: TargetJournalStore;
|
|
15
|
+
readonly resolver: OrganizationAttachmentResolver;
|
|
16
|
+
readonly signal?: AbortSignal;
|
|
17
|
+
readonly timeoutMs?: unknown;
|
|
18
|
+
}
|
|
19
|
+
export interface DockerOrganizationAttachmentOperations {
|
|
20
|
+
execute(raw: unknown): Promise<OperationResult>;
|
|
21
|
+
}
|
|
22
|
+
export declare const createDockerOrganizationAttachmentOperations: (options: DockerOrganizationAttachmentOperationsOptions) => DockerOrganizationAttachmentOperations;
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { SpawnfileError } from "../shared/index.js";
|
|
2
|
+
import { parseTargetResourceRequest } from "./contracts.js";
|
|
3
|
+
import { createDockerResourceSpec } from "./dockerResourcesProvider.js";
|
|
4
|
+
import { selectTarget } from "./dockerTarget.js";
|
|
5
|
+
import { createTargetReceiptDigest } from "./handles.js";
|
|
6
|
+
import { createOrganizationAttachmentAuthorization, parseOrganizationAttachmentResolution } from "./organizationAttachmentAuthority.js";
|
|
7
|
+
import { ORGANIZATION_ATTACHMENT_ERROR, createDockerOrganizationAttachmentSpec } from "./organizationAttachmentProvider.js";
|
|
8
|
+
import { executeOrganizationAttachmentCommand, inspectContainer, inspectNetwork, mutate } from "./organizationAttachmentLifecycle.js";
|
|
9
|
+
import { createOrganizationAttachmentBinding, createOrganizationAttachmentMutationAdmission } from "./organizationAttachmentStore.js";
|
|
10
|
+
const CONTEXT_PATTERN = /^[a-z][a-z0-9_-]{0,63}$/u;
|
|
11
|
+
const fail = () => {
|
|
12
|
+
throw new SpawnfileError("runtime_error", ORGANIZATION_ATTACHMENT_ERROR);
|
|
13
|
+
};
|
|
14
|
+
const same = (left, right) => JSON.stringify(left) === JSON.stringify(right);
|
|
15
|
+
const validOptions = (raw) => {
|
|
16
|
+
if (!raw.authorityStore
|
|
17
|
+
|| typeof raw.authorityStore.bindAttachment !== "function"
|
|
18
|
+
|| typeof raw.authorityStore.bindMutationAdmission !== "function"
|
|
19
|
+
|| typeof raw.authorityStore.bindResolution !== "function"
|
|
20
|
+
|| typeof raw.authorityStore.loadAttachment !== "function"
|
|
21
|
+
|| typeof raw.authorityStore.requireMutationAdmission !== "function"
|
|
22
|
+
|| typeof raw.context !== "string" || !CONTEXT_PATTERN.test(raw.context)
|
|
23
|
+
|| typeof raw.executor !== "function" || !raw.journal
|
|
24
|
+
|| !raw.resolver || typeof raw.resolver.resolve !== "function"
|
|
25
|
+
|| raw.timeoutMs !== undefined && (typeof raw.timeoutMs !== "number"
|
|
26
|
+
|| !Number.isSafeInteger(raw.timeoutMs) || raw.timeoutMs < 1
|
|
27
|
+
|| raw.timeoutMs > 120_000))
|
|
28
|
+
return fail();
|
|
29
|
+
return {
|
|
30
|
+
authorityStore: raw.authorityStore,
|
|
31
|
+
context: raw.context,
|
|
32
|
+
executor: raw.executor,
|
|
33
|
+
journal: raw.journal,
|
|
34
|
+
resolver: raw.resolver,
|
|
35
|
+
signal: raw.signal,
|
|
36
|
+
timeoutMs: raw.timeoutMs ?? 10_000
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
const parseRequest = (raw) => {
|
|
40
|
+
const request = parseTargetResourceRequest(raw);
|
|
41
|
+
if (request.operation !== "attach_organization"
|
|
42
|
+
&& request.operation !== "detach_organization")
|
|
43
|
+
return fail();
|
|
44
|
+
return request;
|
|
45
|
+
};
|
|
46
|
+
const selectedContextMatches = async (request, options) => {
|
|
47
|
+
const selected = await selectTarget({
|
|
48
|
+
context: options.context,
|
|
49
|
+
dockerCommand: "docker",
|
|
50
|
+
execFile: async (_file, args, execution) => executeOrganizationAttachmentCommand(args, {
|
|
51
|
+
...options,
|
|
52
|
+
signal: execution.signal,
|
|
53
|
+
timeoutMs: execution.timeout
|
|
54
|
+
}),
|
|
55
|
+
signal: options.signal,
|
|
56
|
+
timeoutMs: options.timeoutMs
|
|
57
|
+
});
|
|
58
|
+
if (!same({ fingerprint: selected.fingerprint, handle: selected.handle }, request.selected_target))
|
|
59
|
+
return fail();
|
|
60
|
+
};
|
|
61
|
+
const dataNetworkClaim = async (request, options) => {
|
|
62
|
+
const journal = await options.journal.read();
|
|
63
|
+
const matches = journal.entries
|
|
64
|
+
.filter((entry) => entry.operation === "create_data_network" && entry.state === "completed")
|
|
65
|
+
.filter((entry) => createDockerResourceSpec({
|
|
66
|
+
kind: "data_network",
|
|
67
|
+
operationHandle: entry.operation_handle,
|
|
68
|
+
requestDigest: entry.request_digest,
|
|
69
|
+
runId: request.run_id,
|
|
70
|
+
selectedTargetHandle: request.selected_target.handle
|
|
71
|
+
}).resultHandle === request.data_network_handle);
|
|
72
|
+
if (matches.length !== 1)
|
|
73
|
+
return fail();
|
|
74
|
+
return {
|
|
75
|
+
operationHandle: matches[0].operation_handle,
|
|
76
|
+
requestDigest: matches[0].request_digest
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
const resolveAttach = async (request, claim, options) => {
|
|
80
|
+
const authorization = createOrganizationAttachmentAuthorization({
|
|
81
|
+
descriptorDigest: request.descriptor_digest,
|
|
82
|
+
operationHandle: claim.operationHandle,
|
|
83
|
+
organizationHandoffHandle: request.organization_handoff_handle,
|
|
84
|
+
requestDigest: claim.requestDigest,
|
|
85
|
+
runId: request.run_id,
|
|
86
|
+
selectedTarget: request.selected_target
|
|
87
|
+
});
|
|
88
|
+
const resolution = parseOrganizationAttachmentResolution(await options.resolver.resolve({ authorization, signal: options.signal }));
|
|
89
|
+
if (!same(resolution.authorization, authorization))
|
|
90
|
+
return fail();
|
|
91
|
+
await options.authorityStore.bindResolution(resolution);
|
|
92
|
+
return resolution;
|
|
93
|
+
};
|
|
94
|
+
const receiptFor = (input) => {
|
|
95
|
+
const raw = {
|
|
96
|
+
cleanup_state: "not_requested",
|
|
97
|
+
descriptor_digest: input.request.descriptor_digest,
|
|
98
|
+
export_state: "not_requested",
|
|
99
|
+
labels: Object.entries(input.labels).map(([key, value]) => ({ key, value })),
|
|
100
|
+
operation: input.request.operation,
|
|
101
|
+
operation_handle: input.claim.operationHandle,
|
|
102
|
+
receipt_digest: `sha256:${"0".repeat(64)}`,
|
|
103
|
+
request_digest: input.claim.requestDigest,
|
|
104
|
+
result_handle: input.resultHandle,
|
|
105
|
+
resulting_revision: input.request.expected_revision + 1,
|
|
106
|
+
run_id: input.request.run_id,
|
|
107
|
+
selected_target: input.request.selected_target,
|
|
108
|
+
version: "spawnfile.target-resource.receipt.v1"
|
|
109
|
+
};
|
|
110
|
+
return { ...raw, receipt_digest: createTargetReceiptDigest(raw) };
|
|
111
|
+
};
|
|
112
|
+
class DockerOrganizationAttachmentOperationsImpl {
|
|
113
|
+
#live = new Map();
|
|
114
|
+
#options;
|
|
115
|
+
constructor(options) { this.#options = options; }
|
|
116
|
+
execute(raw) {
|
|
117
|
+
let request;
|
|
118
|
+
try {
|
|
119
|
+
request = parseRequest(raw);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return Promise.reject(new SpawnfileError("runtime_error", ORGANIZATION_ATTACHMENT_ERROR));
|
|
123
|
+
}
|
|
124
|
+
const active = this.#live.get(request.idempotency_key);
|
|
125
|
+
if (active)
|
|
126
|
+
return same(active.request, request)
|
|
127
|
+
? active.promise
|
|
128
|
+
: Promise.reject(new SpawnfileError("runtime_error", ORGANIZATION_ATTACHMENT_ERROR));
|
|
129
|
+
const promise = this.executeOwner(request);
|
|
130
|
+
this.#live.set(request.idempotency_key, { promise, request });
|
|
131
|
+
void promise.finally(() => {
|
|
132
|
+
if (this.#live.get(request.idempotency_key)?.promise === promise) {
|
|
133
|
+
this.#live.delete(request.idempotency_key);
|
|
134
|
+
}
|
|
135
|
+
}).catch(() => undefined);
|
|
136
|
+
return promise;
|
|
137
|
+
}
|
|
138
|
+
async executeOwner(request) {
|
|
139
|
+
try {
|
|
140
|
+
const reservation = await this.#options.journal.reserve(request);
|
|
141
|
+
if (reservation.kind === "replay") {
|
|
142
|
+
return { receipt: reservation.receipt, receiptBytes: reservation.receiptBytes };
|
|
143
|
+
}
|
|
144
|
+
if (request.operation === "attach_organization") {
|
|
145
|
+
return await this.attach(request, reservation.kind, reservation.claim);
|
|
146
|
+
}
|
|
147
|
+
return await this.detach(request, reservation.kind, reservation.claim);
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return fail();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
async attach(request, reservation, claim) {
|
|
154
|
+
const networkClaim = await dataNetworkClaim(request, this.#options);
|
|
155
|
+
const resolution = await resolveAttach(request, claim, this.#options);
|
|
156
|
+
await selectedContextMatches(request, this.#options);
|
|
157
|
+
const spec = createDockerOrganizationAttachmentSpec({
|
|
158
|
+
containerId: resolution.network_attachment.container_id,
|
|
159
|
+
dataNetworkOperationHandle: networkClaim.operationHandle,
|
|
160
|
+
dataNetworkRequestDigest: networkClaim.requestDigest,
|
|
161
|
+
deploymentLabels: resolution.network_attachment.deployment_labels,
|
|
162
|
+
operationHandle: claim.operationHandle,
|
|
163
|
+
organizationHandoffHandle: request.organization_handoff_handle,
|
|
164
|
+
requestDigest: claim.requestDigest,
|
|
165
|
+
runId: request.run_id,
|
|
166
|
+
selectedTargetHandle: request.selected_target.handle
|
|
167
|
+
});
|
|
168
|
+
if (spec.network.resultHandle !== request.data_network_handle)
|
|
169
|
+
return fail();
|
|
170
|
+
const networkId = await inspectNetwork(spec, this.#options);
|
|
171
|
+
const binding = createOrganizationAttachmentBinding({
|
|
172
|
+
dataNetworkOperationHandle: networkClaim.operationHandle,
|
|
173
|
+
dataNetworkRequestDigest: networkClaim.requestDigest,
|
|
174
|
+
networkId,
|
|
175
|
+
resolution,
|
|
176
|
+
spec
|
|
177
|
+
});
|
|
178
|
+
await this.#options.authorityStore.bindAttachment(binding);
|
|
179
|
+
const admission = createOrganizationAttachmentMutationAdmission({
|
|
180
|
+
binding, operation: request.operation,
|
|
181
|
+
operationHandle: claim.operationHandle, requestDigest: claim.requestDigest
|
|
182
|
+
});
|
|
183
|
+
if (reservation === "pending")
|
|
184
|
+
await this.#options.authorityStore
|
|
185
|
+
.requireMutationAdmission(admission);
|
|
186
|
+
const before = await inspectContainer(spec, this.#options);
|
|
187
|
+
if (reservation === "owner" && before.attached)
|
|
188
|
+
return fail();
|
|
189
|
+
if (reservation === "owner")
|
|
190
|
+
await this.#options.authorityStore
|
|
191
|
+
.bindMutationAdmission(admission);
|
|
192
|
+
if (!before.attached) {
|
|
193
|
+
await mutate("connect", binding.data_network.id, spec.containerId, this.#options);
|
|
194
|
+
}
|
|
195
|
+
if (!(await inspectContainer(spec, this.#options)).attached)
|
|
196
|
+
return fail();
|
|
197
|
+
if (await inspectNetwork(spec, this.#options) !== binding.data_network.id)
|
|
198
|
+
return fail();
|
|
199
|
+
const receipt = receiptFor({
|
|
200
|
+
claim,
|
|
201
|
+
labels: binding.receipt_labels,
|
|
202
|
+
request,
|
|
203
|
+
resultHandle: binding.attachment_handle
|
|
204
|
+
});
|
|
205
|
+
return await this.#options.journal.complete(claim, receipt);
|
|
206
|
+
}
|
|
207
|
+
async detach(request, reservation, claim) {
|
|
208
|
+
const binding = await this.#options.authorityStore.loadAttachment(request.organization_attachment_handle);
|
|
209
|
+
if (binding.attachment_handle !== request.organization_attachment_handle
|
|
210
|
+
|| binding.data_network.handle !== request.data_network_handle
|
|
211
|
+
|| binding.resolution.authorization.run_id !== request.run_id
|
|
212
|
+
|| binding.resolution.authorization.descriptor_digest !== request.descriptor_digest
|
|
213
|
+
|| !same(binding.resolution.authorization.selected_target, request.selected_target))
|
|
214
|
+
return fail();
|
|
215
|
+
const networkClaim = await dataNetworkClaim(request, this.#options);
|
|
216
|
+
if (networkClaim.operationHandle !== binding.data_network.operation_handle
|
|
217
|
+
|| networkClaim.requestDigest !== binding.data_network.request_digest)
|
|
218
|
+
return fail();
|
|
219
|
+
await selectedContextMatches(request, this.#options);
|
|
220
|
+
const spec = createDockerOrganizationAttachmentSpec({
|
|
221
|
+
containerId: binding.resolution.network_attachment.container_id,
|
|
222
|
+
dataNetworkOperationHandle: networkClaim.operationHandle,
|
|
223
|
+
dataNetworkRequestDigest: networkClaim.requestDigest,
|
|
224
|
+
deploymentLabels: binding.resolution.network_attachment.deployment_labels,
|
|
225
|
+
operationHandle: binding.resolution.authorization.operation_handle,
|
|
226
|
+
organizationHandoffHandle: binding.resolution.authorization.organization_handoff_handle,
|
|
227
|
+
requestDigest: binding.resolution.authorization.request_digest,
|
|
228
|
+
runId: binding.resolution.authorization.run_id,
|
|
229
|
+
selectedTargetHandle: binding.resolution.authorization.selected_target.handle
|
|
230
|
+
});
|
|
231
|
+
if (spec.resultHandle !== binding.attachment_handle
|
|
232
|
+
|| await inspectNetwork(spec, this.#options) !== binding.data_network.id)
|
|
233
|
+
return fail();
|
|
234
|
+
const admission = createOrganizationAttachmentMutationAdmission({
|
|
235
|
+
binding, operation: request.operation,
|
|
236
|
+
operationHandle: claim.operationHandle, requestDigest: claim.requestDigest
|
|
237
|
+
});
|
|
238
|
+
if (reservation === "pending")
|
|
239
|
+
await this.#options.authorityStore
|
|
240
|
+
.requireMutationAdmission(admission);
|
|
241
|
+
const before = await inspectContainer(spec, this.#options);
|
|
242
|
+
if (reservation === "owner" && !before.attached)
|
|
243
|
+
return fail();
|
|
244
|
+
if (reservation === "owner")
|
|
245
|
+
await this.#options.authorityStore
|
|
246
|
+
.bindMutationAdmission(admission);
|
|
247
|
+
if (before.attached) {
|
|
248
|
+
await mutate("disconnect", binding.data_network.id, spec.containerId, this.#options);
|
|
249
|
+
}
|
|
250
|
+
if ((await inspectContainer(spec, this.#options)).attached)
|
|
251
|
+
return fail();
|
|
252
|
+
if (await inspectNetwork(spec, this.#options) !== binding.data_network.id)
|
|
253
|
+
return fail();
|
|
254
|
+
const receipt = receiptFor({
|
|
255
|
+
claim,
|
|
256
|
+
labels: binding.receipt_labels,
|
|
257
|
+
request,
|
|
258
|
+
resultHandle: null
|
|
259
|
+
});
|
|
260
|
+
return await this.#options.journal.complete(claim, receipt);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
export const createDockerOrganizationAttachmentOperations = (options) => new DockerOrganizationAttachmentOperationsImpl(validOptions(options));
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { type OpaqueTargetHandle, type SelectedTargetReceipt } from "./contracts.js";
|
|
2
|
+
import { type OrganizationDeploymentLabels } from "./organizationAttachmentProvider.js";
|
|
3
|
+
export declare const ORGANIZATION_ATTACHMENT_AUTHORIZATION_VERSION: "spawnfile.target-organization-attachment.authorization.v1";
|
|
4
|
+
export declare const ORGANIZATION_HANDOFF_VERSION: "spawnfile.organization-handoff.v1";
|
|
5
|
+
export interface OrganizationAttachmentAuthorization {
|
|
6
|
+
readonly descriptor_digest: string;
|
|
7
|
+
readonly operation_handle: OpaqueTargetHandle;
|
|
8
|
+
readonly organization_handoff_handle: OpaqueTargetHandle;
|
|
9
|
+
readonly request_digest: string;
|
|
10
|
+
readonly run_id: string;
|
|
11
|
+
readonly selected_target: {
|
|
12
|
+
readonly fingerprint: string;
|
|
13
|
+
readonly handle: OpaqueTargetHandle;
|
|
14
|
+
};
|
|
15
|
+
readonly version: typeof ORGANIZATION_ATTACHMENT_AUTHORIZATION_VERSION;
|
|
16
|
+
}
|
|
17
|
+
export interface ResolvedOrganizationHandoff {
|
|
18
|
+
readonly binding_digest: string;
|
|
19
|
+
readonly deployment_handle: string;
|
|
20
|
+
readonly lifecycle_receipts: {
|
|
21
|
+
readonly down: "spawnfile.down-receipt.v1";
|
|
22
|
+
readonly export: "spawnfile.export-index.v1";
|
|
23
|
+
readonly up: "spawnfile.up-receipt.v1";
|
|
24
|
+
};
|
|
25
|
+
readonly network_attachment_handle: OpaqueTargetHandle;
|
|
26
|
+
readonly run_id: string;
|
|
27
|
+
readonly selected_target_receipt_digest: string;
|
|
28
|
+
readonly version: typeof ORGANIZATION_HANDOFF_VERSION;
|
|
29
|
+
}
|
|
30
|
+
export interface OrganizationAttachmentResolution {
|
|
31
|
+
readonly authorization: OrganizationAttachmentAuthorization;
|
|
32
|
+
readonly descriptor_binding: {
|
|
33
|
+
readonly binding_digest: string;
|
|
34
|
+
readonly descriptor_digest: string;
|
|
35
|
+
};
|
|
36
|
+
readonly handoff: ResolvedOrganizationHandoff;
|
|
37
|
+
readonly network_attachment: {
|
|
38
|
+
readonly container_id: string;
|
|
39
|
+
readonly deployment_labels: OrganizationDeploymentLabels;
|
|
40
|
+
readonly network_attachment_handle: OpaqueTargetHandle;
|
|
41
|
+
};
|
|
42
|
+
readonly selected_target_binding: {
|
|
43
|
+
readonly receipt: SelectedTargetReceipt;
|
|
44
|
+
readonly receipt_digest: string;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export interface OrganizationAttachmentResolverInput {
|
|
48
|
+
readonly authorization: OrganizationAttachmentAuthorization;
|
|
49
|
+
readonly signal?: AbortSignal;
|
|
50
|
+
}
|
|
51
|
+
/** Trusted operator seam from one opaque handoff capability to exact private identity. */
|
|
52
|
+
export interface OrganizationAttachmentResolver {
|
|
53
|
+
resolve(input: OrganizationAttachmentResolverInput): Promise<unknown>;
|
|
54
|
+
}
|
|
55
|
+
export declare const createOrganizationAttachmentAuthorization: (input: {
|
|
56
|
+
readonly descriptorDigest: unknown;
|
|
57
|
+
readonly operationHandle: unknown;
|
|
58
|
+
readonly organizationHandoffHandle: unknown;
|
|
59
|
+
readonly requestDigest: unknown;
|
|
60
|
+
readonly runId: unknown;
|
|
61
|
+
readonly selectedTarget: unknown;
|
|
62
|
+
}) => OrganizationAttachmentAuthorization;
|
|
63
|
+
export declare const parseOrganizationAttachmentAuthorization: (raw: unknown) => OrganizationAttachmentAuthorization;
|
|
64
|
+
export declare const parseResolvedOrganizationHandoff: (raw: unknown) => ResolvedOrganizationHandoff;
|
|
65
|
+
export declare const parseOrganizationAttachmentResolution: (raw: unknown) => OrganizationAttachmentResolution;
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { assertOrdinaryJsonGraph, parseOpaqueTargetHandle, parseRunId, parseSelectedTargetReceipt } from "./contracts.js";
|
|
3
|
+
import { ORGANIZATION_ATTACHMENT_ERROR, parseOrganizationContainerId, parseOrganizationDeploymentLabels } from "./organizationAttachmentProvider.js";
|
|
4
|
+
export const ORGANIZATION_ATTACHMENT_AUTHORIZATION_VERSION = "spawnfile.target-organization-attachment.authorization.v1";
|
|
5
|
+
export const ORGANIZATION_HANDOFF_VERSION = "spawnfile.organization-handoff.v1";
|
|
6
|
+
const DIGEST_PATTERN = /^sha256:[a-f0-9]{64}$/u;
|
|
7
|
+
const FINGERPRINT_PATTERN = /^sha256:[a-f0-9]{32}$/u;
|
|
8
|
+
const DEPLOYMENT_HANDLE_PATTERN = /^sf-oh1-[a-f0-9]{64}$/u;
|
|
9
|
+
const fail = () => { throw new Error(ORGANIZATION_ATTACHMENT_ERROR); };
|
|
10
|
+
const ordinary = (raw) => {
|
|
11
|
+
try {
|
|
12
|
+
assertOrdinaryJsonGraph(raw);
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return fail();
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
const exactRecord = (value) => value !== null && typeof value === "object" && !Array.isArray(value)
|
|
19
|
+
&& Object.getPrototypeOf(value) === Object.prototype;
|
|
20
|
+
const exactKeys = (value, expected) => {
|
|
21
|
+
const actual = Object.keys(value).sort();
|
|
22
|
+
const sorted = [...expected].sort();
|
|
23
|
+
return actual.length === sorted.length
|
|
24
|
+
&& actual.every((key, index) => key === sorted[index]);
|
|
25
|
+
};
|
|
26
|
+
const digest = (value) => {
|
|
27
|
+
if (typeof value !== "string" || !DIGEST_PATTERN.test(value))
|
|
28
|
+
return fail();
|
|
29
|
+
return value;
|
|
30
|
+
};
|
|
31
|
+
const same = (left, right) => JSON.stringify(left) === JSON.stringify(right);
|
|
32
|
+
export const createOrganizationAttachmentAuthorization = (input) => {
|
|
33
|
+
const selected = parseSelectedTargetReceipt({
|
|
34
|
+
...(exactRecord(input.selectedTarget) ? input.selectedTarget : {}),
|
|
35
|
+
version: "spawnfile.target-resource.selected-target.v1"
|
|
36
|
+
});
|
|
37
|
+
return Object.freeze({
|
|
38
|
+
descriptor_digest: digest(input.descriptorDigest),
|
|
39
|
+
operation_handle: parseOpaqueTargetHandle(input.operationHandle),
|
|
40
|
+
organization_handoff_handle: parseOpaqueTargetHandle(input.organizationHandoffHandle),
|
|
41
|
+
request_digest: digest(input.requestDigest),
|
|
42
|
+
run_id: parseRunId(input.runId),
|
|
43
|
+
selected_target: Object.freeze({ fingerprint: selected.fingerprint, handle: selected.handle }),
|
|
44
|
+
version: ORGANIZATION_ATTACHMENT_AUTHORIZATION_VERSION
|
|
45
|
+
});
|
|
46
|
+
};
|
|
47
|
+
export const parseOrganizationAttachmentAuthorization = (raw) => {
|
|
48
|
+
ordinary(raw);
|
|
49
|
+
if (!exactRecord(raw) || !exactKeys(raw, [
|
|
50
|
+
"descriptor_digest", "operation_handle", "organization_handoff_handle",
|
|
51
|
+
"request_digest", "run_id", "selected_target", "version"
|
|
52
|
+
]) || raw.version !== ORGANIZATION_ATTACHMENT_AUTHORIZATION_VERSION
|
|
53
|
+
|| !exactRecord(raw.selected_target)
|
|
54
|
+
|| !exactKeys(raw.selected_target, ["fingerprint", "handle"])
|
|
55
|
+
|| typeof raw.selected_target.fingerprint !== "string"
|
|
56
|
+
|| !FINGERPRINT_PATTERN.test(raw.selected_target.fingerprint))
|
|
57
|
+
return fail();
|
|
58
|
+
return createOrganizationAttachmentAuthorization({
|
|
59
|
+
descriptorDigest: raw.descriptor_digest,
|
|
60
|
+
operationHandle: raw.operation_handle,
|
|
61
|
+
organizationHandoffHandle: raw.organization_handoff_handle,
|
|
62
|
+
requestDigest: raw.request_digest,
|
|
63
|
+
runId: raw.run_id,
|
|
64
|
+
selectedTarget: raw.selected_target
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
const handoffHandle = (input) => {
|
|
68
|
+
const canonical = [
|
|
69
|
+
"spawnfile.organization-handoff.v1\0",
|
|
70
|
+
input.run_id,
|
|
71
|
+
input.selected_target_receipt_digest,
|
|
72
|
+
input.network_attachment_handle,
|
|
73
|
+
input.binding_digest,
|
|
74
|
+
input.lifecycle_receipts.up,
|
|
75
|
+
input.lifecycle_receipts.export,
|
|
76
|
+
input.lifecycle_receipts.down
|
|
77
|
+
].join("\n");
|
|
78
|
+
return `sf-oh1-${createHash("sha256").update(canonical, "utf8").digest("hex")}`;
|
|
79
|
+
};
|
|
80
|
+
export const parseResolvedOrganizationHandoff = (raw) => {
|
|
81
|
+
ordinary(raw);
|
|
82
|
+
if (!exactRecord(raw) || !exactKeys(raw, [
|
|
83
|
+
"binding_digest", "deployment_handle", "lifecycle_receipts",
|
|
84
|
+
"network_attachment_handle", "run_id", "selected_target_receipt_digest", "version"
|
|
85
|
+
]) || raw.version !== ORGANIZATION_HANDOFF_VERSION
|
|
86
|
+
|| typeof raw.deployment_handle !== "string"
|
|
87
|
+
|| !DEPLOYMENT_HANDLE_PATTERN.test(raw.deployment_handle)
|
|
88
|
+
|| !exactRecord(raw.lifecycle_receipts)
|
|
89
|
+
|| !exactKeys(raw.lifecycle_receipts, ["down", "export", "up"])
|
|
90
|
+
|| raw.lifecycle_receipts.down !== "spawnfile.down-receipt.v1"
|
|
91
|
+
|| raw.lifecycle_receipts.export !== "spawnfile.export-index.v1"
|
|
92
|
+
|| raw.lifecycle_receipts.up !== "spawnfile.up-receipt.v1")
|
|
93
|
+
return fail();
|
|
94
|
+
const body = {
|
|
95
|
+
binding_digest: digest(raw.binding_digest),
|
|
96
|
+
lifecycle_receipts: Object.freeze({
|
|
97
|
+
down: "spawnfile.down-receipt.v1",
|
|
98
|
+
export: "spawnfile.export-index.v1",
|
|
99
|
+
up: "spawnfile.up-receipt.v1"
|
|
100
|
+
}),
|
|
101
|
+
network_attachment_handle: parseOpaqueTargetHandle(raw.network_attachment_handle),
|
|
102
|
+
run_id: parseRunId(raw.run_id),
|
|
103
|
+
selected_target_receipt_digest: digest(raw.selected_target_receipt_digest)
|
|
104
|
+
};
|
|
105
|
+
if (raw.deployment_handle !== handoffHandle(body))
|
|
106
|
+
return fail();
|
|
107
|
+
return Object.freeze({
|
|
108
|
+
...body,
|
|
109
|
+
deployment_handle: raw.deployment_handle,
|
|
110
|
+
version: ORGANIZATION_HANDOFF_VERSION
|
|
111
|
+
});
|
|
112
|
+
};
|
|
113
|
+
export const parseOrganizationAttachmentResolution = (raw) => {
|
|
114
|
+
ordinary(raw);
|
|
115
|
+
if (!exactRecord(raw) || !exactKeys(raw, [
|
|
116
|
+
"authorization", "descriptor_binding", "handoff",
|
|
117
|
+
"network_attachment", "selected_target_binding"
|
|
118
|
+
]) || !exactRecord(raw.descriptor_binding)
|
|
119
|
+
|| !exactKeys(raw.descriptor_binding, ["binding_digest", "descriptor_digest"])
|
|
120
|
+
|| !exactRecord(raw.network_attachment)
|
|
121
|
+
|| !exactKeys(raw.network_attachment, [
|
|
122
|
+
"container_id", "deployment_labels", "network_attachment_handle"
|
|
123
|
+
]) || !exactRecord(raw.selected_target_binding)
|
|
124
|
+
|| !exactKeys(raw.selected_target_binding, ["receipt", "receipt_digest"]))
|
|
125
|
+
return fail();
|
|
126
|
+
const authorization = parseOrganizationAttachmentAuthorization(raw.authorization);
|
|
127
|
+
const handoff = parseResolvedOrganizationHandoff(raw.handoff);
|
|
128
|
+
const receipt = parseSelectedTargetReceipt(raw.selected_target_binding.receipt);
|
|
129
|
+
const resolution = Object.freeze({
|
|
130
|
+
authorization,
|
|
131
|
+
descriptor_binding: Object.freeze({
|
|
132
|
+
binding_digest: digest(raw.descriptor_binding.binding_digest),
|
|
133
|
+
descriptor_digest: digest(raw.descriptor_binding.descriptor_digest)
|
|
134
|
+
}),
|
|
135
|
+
handoff,
|
|
136
|
+
network_attachment: Object.freeze({
|
|
137
|
+
container_id: parseOrganizationContainerId(raw.network_attachment.container_id),
|
|
138
|
+
deployment_labels: parseOrganizationDeploymentLabels(raw.network_attachment.deployment_labels),
|
|
139
|
+
network_attachment_handle: parseOpaqueTargetHandle(raw.network_attachment.network_attachment_handle)
|
|
140
|
+
}),
|
|
141
|
+
selected_target_binding: Object.freeze({
|
|
142
|
+
receipt,
|
|
143
|
+
receipt_digest: digest(raw.selected_target_binding.receipt_digest)
|
|
144
|
+
})
|
|
145
|
+
});
|
|
146
|
+
if (resolution.descriptor_binding.descriptor_digest !== authorization.descriptor_digest
|
|
147
|
+
|| resolution.descriptor_binding.binding_digest !== handoff.binding_digest
|
|
148
|
+
|| handoff.run_id !== authorization.run_id
|
|
149
|
+
|| resolution.network_attachment.network_attachment_handle
|
|
150
|
+
!== handoff.network_attachment_handle
|
|
151
|
+
|| resolution.network_attachment.deployment_labels["com.spawnfile.run_id"]
|
|
152
|
+
!== authorization.run_id
|
|
153
|
+
|| resolution.selected_target_binding.receipt_digest
|
|
154
|
+
!== handoff.selected_target_receipt_digest
|
|
155
|
+
|| !same({
|
|
156
|
+
fingerprint: resolution.selected_target_binding.receipt.fingerprint,
|
|
157
|
+
handle: resolution.selected_target_binding.receipt.handle
|
|
158
|
+
}, authorization.selected_target))
|
|
159
|
+
return fail();
|
|
160
|
+
return resolution;
|
|
161
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type DockerOrganizationAttachmentExecutor, type DockerOrganizationAttachmentSpec } from "./organizationAttachmentProvider.js";
|
|
2
|
+
export interface OrganizationAttachmentLifecycleOptions {
|
|
3
|
+
readonly context: string;
|
|
4
|
+
readonly executor: DockerOrganizationAttachmentExecutor;
|
|
5
|
+
readonly signal?: AbortSignal;
|
|
6
|
+
readonly timeoutMs: number;
|
|
7
|
+
}
|
|
8
|
+
export declare const executeOrganizationAttachmentCommand: (args: string[], options: OrganizationAttachmentLifecycleOptions) => Promise<{
|
|
9
|
+
stderr: string;
|
|
10
|
+
stdout: string;
|
|
11
|
+
}>;
|
|
12
|
+
export declare const inspectNetwork: (spec: DockerOrganizationAttachmentSpec, options: OrganizationAttachmentLifecycleOptions) => Promise<string>;
|
|
13
|
+
export declare const inspectContainer: (spec: DockerOrganizationAttachmentSpec, options: OrganizationAttachmentLifecycleOptions) => Promise<{
|
|
14
|
+
readonly attached: boolean;
|
|
15
|
+
}>;
|
|
16
|
+
export declare const mutate: (operation: "connect" | "disconnect", networkId: string, containerId: string, options: OrganizationAttachmentLifecycleOptions) => Promise<void>;
|
|
17
|
+
export declare const detachExactOrganizationAttachment: (rawBinding: unknown, options: OrganizationAttachmentLifecycleOptions) => Promise<void>;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { SpawnfileError } from "../shared/index.js";
|
|
2
|
+
import { ORGANIZATION_ATTACHMENT_ERROR, ORGANIZATION_NETWORK_INSPECTION_FORMAT, DockerOrganizationAttachmentProviderError, createDockerOrganizationAttachmentSpec, executeDockerOrganizationAttachment, parseExpectedOrganizationContainer, parseExpectedOrganizationNetwork } from "./organizationAttachmentProvider.js";
|
|
3
|
+
import { parseOrganizationAttachmentBinding } from "./organizationAttachmentStore.js";
|
|
4
|
+
const CONTEXT_PATTERN = /^[a-z][a-z0-9_-]{0,63}$/u;
|
|
5
|
+
const fail = () => {
|
|
6
|
+
throw new SpawnfileError("runtime_error", ORGANIZATION_ATTACHMENT_ERROR);
|
|
7
|
+
};
|
|
8
|
+
const validOptions = (raw) => {
|
|
9
|
+
if (!raw || typeof raw.context !== "string" || !CONTEXT_PATTERN.test(raw.context)
|
|
10
|
+
|| typeof raw.executor !== "function" || typeof raw.timeoutMs !== "number"
|
|
11
|
+
|| !Number.isSafeInteger(raw.timeoutMs) || raw.timeoutMs < 1
|
|
12
|
+
|| raw.timeoutMs > 120_000)
|
|
13
|
+
return fail();
|
|
14
|
+
return raw;
|
|
15
|
+
};
|
|
16
|
+
export const executeOrganizationAttachmentCommand = async (args, options) => executeDockerOrganizationAttachment({
|
|
17
|
+
args,
|
|
18
|
+
executor: options.executor,
|
|
19
|
+
signal: options.signal,
|
|
20
|
+
timeoutMs: options.timeoutMs
|
|
21
|
+
});
|
|
22
|
+
export const inspectNetwork = async (spec, options) => {
|
|
23
|
+
const result = await executeOrganizationAttachmentCommand([
|
|
24
|
+
"--context", options.context, "network", "inspect", "--format",
|
|
25
|
+
ORGANIZATION_NETWORK_INSPECTION_FORMAT, spec.network.name
|
|
26
|
+
], options);
|
|
27
|
+
const id = parseExpectedOrganizationNetwork(result.stdout, spec);
|
|
28
|
+
if (result.stderr !== "" || id === null)
|
|
29
|
+
return fail();
|
|
30
|
+
return id;
|
|
31
|
+
};
|
|
32
|
+
export const inspectContainer = async (spec, options) => {
|
|
33
|
+
const result = await executeOrganizationAttachmentCommand([
|
|
34
|
+
"--context", options.context, "container", "inspect", "--format",
|
|
35
|
+
spec.containerInspectionFormat, spec.containerId
|
|
36
|
+
], options);
|
|
37
|
+
const inspection = parseExpectedOrganizationContainer(result.stdout, spec);
|
|
38
|
+
if (result.stderr !== "" || inspection === null)
|
|
39
|
+
return fail();
|
|
40
|
+
return inspection;
|
|
41
|
+
};
|
|
42
|
+
const networkMutation = (operation, networkId, containerId, options) => executeOrganizationAttachmentCommand([
|
|
43
|
+
"--context", options.context, "network", operation, networkId, containerId
|
|
44
|
+
], options);
|
|
45
|
+
export const mutate = async (operation, networkId, containerId, options) => {
|
|
46
|
+
const result = await networkMutation(operation, networkId, containerId, options);
|
|
47
|
+
if (result.stdout !== "" || result.stderr !== "")
|
|
48
|
+
return fail();
|
|
49
|
+
};
|
|
50
|
+
const specFor = (binding) => createDockerOrganizationAttachmentSpec({
|
|
51
|
+
containerId: binding.resolution.network_attachment.container_id,
|
|
52
|
+
dataNetworkOperationHandle: binding.data_network.operation_handle,
|
|
53
|
+
dataNetworkRequestDigest: binding.data_network.request_digest,
|
|
54
|
+
deploymentLabels: binding.resolution.network_attachment.deployment_labels,
|
|
55
|
+
operationHandle: binding.resolution.authorization.operation_handle,
|
|
56
|
+
organizationHandoffHandle: binding.resolution.authorization.organization_handoff_handle,
|
|
57
|
+
requestDigest: binding.resolution.authorization.request_digest,
|
|
58
|
+
runId: binding.resolution.authorization.run_id,
|
|
59
|
+
selectedTargetHandle: binding.resolution.authorization.selected_target.handle
|
|
60
|
+
});
|
|
61
|
+
const inspectContainerOrAbsent = async (spec, options) => {
|
|
62
|
+
try {
|
|
63
|
+
return await inspectContainer(spec, options);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
if (error instanceof DockerOrganizationAttachmentProviderError
|
|
67
|
+
&& error.kind === "not_found")
|
|
68
|
+
return null;
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
const proveNetwork = async (binding, spec, options) => {
|
|
73
|
+
if (await inspectNetwork(spec, options) !== binding.data_network.id)
|
|
74
|
+
return fail();
|
|
75
|
+
};
|
|
76
|
+
export const detachExactOrganizationAttachment = async (rawBinding, options) => {
|
|
77
|
+
// Parse the complete immutable authority record before any provider call.
|
|
78
|
+
const binding = parseOrganizationAttachmentBinding(rawBinding);
|
|
79
|
+
const checkedOptions = validOptions(options);
|
|
80
|
+
const spec = specFor(binding);
|
|
81
|
+
if (spec.resultHandle !== binding.attachment_handle)
|
|
82
|
+
return fail();
|
|
83
|
+
await proveNetwork(binding, spec, checkedOptions);
|
|
84
|
+
const before = await inspectContainerOrAbsent(spec, checkedOptions);
|
|
85
|
+
if (before === null || !before.attached)
|
|
86
|
+
return;
|
|
87
|
+
let mutationResult;
|
|
88
|
+
try {
|
|
89
|
+
mutationResult = await networkMutation("disconnect", binding.data_network.id, spec.containerId, checkedOptions);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// A thrown mutation is ambiguous. Reconciliation below is the only retry-like action.
|
|
93
|
+
}
|
|
94
|
+
if (mutationResult
|
|
95
|
+
&& (mutationResult.stdout !== "" || mutationResult.stderr !== ""))
|
|
96
|
+
return fail();
|
|
97
|
+
const after = await inspectContainerOrAbsent(spec, checkedOptions);
|
|
98
|
+
if (after?.attached === true)
|
|
99
|
+
return fail();
|
|
100
|
+
await proveNetwork(binding, spec, checkedOptions);
|
|
101
|
+
};
|