spawnfile 0.1.13 → 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 +50 -11
- 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/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/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 -181
- 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 +9 -2
- package/dist/cli/runCli.js +27 -71
- package/dist/cli/runPublishCommands.d.ts +3 -0
- package/dist/cli/runPublishCommands.js +70 -0
- package/dist/cli/statusCommand.d.ts +3 -33
- package/dist/cli/statusCommand.js +19 -249
- 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 +11 -0
- package/dist/compiler/buildProject.js +77 -2
- package/dist/compiler/compilePlanHelpers.js +2 -0
- package/dist/compiler/compileProject.d.ts +13 -0
- package/dist/compiler/compileProject.js +26 -74
- 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 +15 -12
- 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 +56 -52
- 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/containerTargetPlanResolution.d.ts +20 -0
- package/dist/compiler/containerTargetPlanResolution.js +97 -0
- 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 +43 -97
- package/dist/compiler/moltnetBinaries.d.ts +21 -4
- package/dist/compiler/moltnetBinaries.js +134 -27
- package/dist/compiler/moltnetClientConfig.js +7 -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/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 +30 -21
- 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 +31 -8
- 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 +256 -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.js +9 -1
- 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 +16 -0
- package/dist/deployment/index.js +17 -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/project.js +15 -9
- 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 +35 -0
- package/dist/runtime/common.js +55 -0
- package/dist/runtime/container.d.ts +28 -1
- package/dist/runtime/container.js +38 -5
- 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/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 +1 -1
- package/dist/runtime/pi/adapter.js +86 -53
- package/dist/runtime/pi/appActivitySource.js +114 -2
- 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 -1
- package/dist/runtime/pi/appCoreSource.js +104 -214
- package/dist/runtime/pi/appPreludeSource.js +140 -52
- 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 -1
- package/dist/runtime/pi/appSource.js +6 -2
- package/dist/runtime/pi/appTemplate.d.ts +8 -22
- package/dist/runtime/pi/appTemplate.js +9 -126
- 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.js +126 -9
- 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/scheduleUtils.d.ts +2 -0
- package/dist/runtime/scheduleUtils.js +15 -0
- package/dist/runtime/types.d.ts +25 -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/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 +27 -11
- package/runtimes.yaml +8 -23
- 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,12 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import { type TargetMutationRequest, type TargetOperationLookup } from "../target/contracts.js";
|
|
3
|
+
export interface TargetLookupCommandStreams {
|
|
4
|
+
stderr(message: string): void;
|
|
5
|
+
stdout(message: string): void;
|
|
6
|
+
}
|
|
7
|
+
export type TargetOperationLookupHandler = (request: TargetMutationRequest) => Promise<TargetOperationLookup>;
|
|
8
|
+
export type TargetOperationLookupLoader = (configInput: unknown) => Promise<TargetOperationLookupHandler>;
|
|
9
|
+
type SetExitCode = (exitCode: 1 | 2) => void;
|
|
10
|
+
export declare const registerTargetOperationLookup: (target: Command, loader: TargetOperationLookupLoader, streams: TargetLookupCommandStreams, setExitCode: SetExitCode) => void;
|
|
11
|
+
export declare const createProductionTargetLookupLoader: (stdin: AsyncIterable<unknown>) => TargetOperationLookupLoader;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { parseTargetOperationLookup } from "../target/contracts.js";
|
|
2
|
+
import { createCanonicalTargetOperationLookupBytes, createTargetReceiptDigest, createTargetRequestDigest } from "../target/handles.js";
|
|
3
|
+
import { lookupTargetOperation } from "../target/journal.js";
|
|
4
|
+
import { resolveTargetDefaultJournalRoot } from "../target/journalRoot.js";
|
|
5
|
+
import { readTargetLookupConfigStdin } from "./targetDefaultConfigStdin.js";
|
|
6
|
+
import { readTargetRequestFile } from "./targetRequestFile.js";
|
|
7
|
+
const same = (left, right) => JSON.stringify(left) === JSON.stringify(right);
|
|
8
|
+
const emitLookup = (raw, request, streams) => {
|
|
9
|
+
const result = parseTargetOperationLookup(raw);
|
|
10
|
+
const requestDigest = createTargetRequestDigest(request);
|
|
11
|
+
if (result.idempotency_key !== request.idempotency_key
|
|
12
|
+
|| result.operation !== request.operation
|
|
13
|
+
|| result.request_digest !== requestDigest)
|
|
14
|
+
throw new TypeError();
|
|
15
|
+
if (result.status === "completed"
|
|
16
|
+
&& (result.receipt.receipt_digest !== createTargetReceiptDigest(result.receipt)
|
|
17
|
+
|| result.receipt.descriptor_digest !== request.descriptor_digest
|
|
18
|
+
|| result.receipt.run_id !== request.run_id
|
|
19
|
+
|| !same(result.receipt.selected_target, request.selected_target)
|
|
20
|
+
|| result.receipt.resulting_revision !== request.expected_revision + 1)) {
|
|
21
|
+
throw new TypeError();
|
|
22
|
+
}
|
|
23
|
+
streams.stdout(createCanonicalTargetOperationLookupBytes(result));
|
|
24
|
+
};
|
|
25
|
+
export const registerTargetOperationLookup = (target, loader, streams, setExitCode) => {
|
|
26
|
+
target.command("lookup_operation")
|
|
27
|
+
.description("Read the state of one exact target mutation")
|
|
28
|
+
.argument("<request-file>", "Original strict target-resource mutation request JSON file")
|
|
29
|
+
.action(async (requestFile) => {
|
|
30
|
+
let request;
|
|
31
|
+
try {
|
|
32
|
+
const parsed = await readTargetRequestFile(requestFile);
|
|
33
|
+
if (parsed.operation === "select_target")
|
|
34
|
+
throw new TypeError();
|
|
35
|
+
request = parsed;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
streams.stderr("error: Invalid target lookup request");
|
|
39
|
+
setExitCode(2);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
let lookup;
|
|
43
|
+
try {
|
|
44
|
+
lookup = await loader(target.opts().config);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
streams.stderr("error: Invalid target lookup configuration");
|
|
48
|
+
setExitCode(2);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
emitLookup(await lookup(request), request, streams);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
streams.stderr("error: Target operation lookup failed");
|
|
56
|
+
setExitCode(1);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
export const createProductionTargetLookupLoader = (stdin) => async (configInput) => {
|
|
61
|
+
if (configInput !== "-")
|
|
62
|
+
throw new TypeError();
|
|
63
|
+
const config = await readTargetLookupConfigStdin(stdin);
|
|
64
|
+
return (request) => lookupTargetOperation({
|
|
65
|
+
context: config.context,
|
|
66
|
+
request,
|
|
67
|
+
root: resolveTargetDefaultJournalRoot()
|
|
68
|
+
});
|
|
69
|
+
};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { TargetResourceRequest } from "../target/contracts.js";
|
|
2
|
+
export type TargetOperation = TargetResourceRequest["operation"];
|
|
3
|
+
export type TargetMutationOperation = Exclude<TargetOperation, "select_target">;
|
|
4
|
+
export interface TargetSelectionDispatch {
|
|
5
|
+
readonly kind: "selection";
|
|
6
|
+
readonly operation: "select_target";
|
|
7
|
+
}
|
|
8
|
+
export interface TargetMutationDispatch {
|
|
9
|
+
readonly kind: "mutation";
|
|
10
|
+
readonly operation: TargetMutationOperation;
|
|
11
|
+
}
|
|
12
|
+
export type TargetOperationDispatch = TargetSelectionDispatch | TargetMutationDispatch;
|
|
13
|
+
export declare const TARGET_OPERATION_DISPATCH: Readonly<{
|
|
14
|
+
attach_organization: TargetMutationDispatch & {
|
|
15
|
+
readonly operation: "attach_organization";
|
|
16
|
+
};
|
|
17
|
+
cleanup_run: TargetMutationDispatch & {
|
|
18
|
+
readonly operation: "cleanup_run";
|
|
19
|
+
};
|
|
20
|
+
create_data_network: TargetMutationDispatch & {
|
|
21
|
+
readonly operation: "create_data_network";
|
|
22
|
+
};
|
|
23
|
+
create_evidence_volume: TargetMutationDispatch & {
|
|
24
|
+
readonly operation: "create_evidence_volume";
|
|
25
|
+
};
|
|
26
|
+
create_world_service: TargetMutationDispatch & {
|
|
27
|
+
readonly operation: "create_world_service";
|
|
28
|
+
};
|
|
29
|
+
detach_organization: TargetMutationDispatch & {
|
|
30
|
+
readonly operation: "detach_organization";
|
|
31
|
+
};
|
|
32
|
+
export_evidence_volume: TargetMutationDispatch & {
|
|
33
|
+
readonly operation: "export_evidence_volume";
|
|
34
|
+
};
|
|
35
|
+
prepare_secret_bindings: TargetMutationDispatch & {
|
|
36
|
+
readonly operation: "prepare_secret_bindings";
|
|
37
|
+
};
|
|
38
|
+
recover_operation: TargetMutationDispatch & {
|
|
39
|
+
readonly operation: "recover_operation";
|
|
40
|
+
};
|
|
41
|
+
resolve_world_artifact: TargetMutationDispatch & {
|
|
42
|
+
readonly operation: "resolve_world_artifact";
|
|
43
|
+
};
|
|
44
|
+
revoke_secret_bindings: TargetMutationDispatch & {
|
|
45
|
+
readonly operation: "revoke_secret_bindings";
|
|
46
|
+
};
|
|
47
|
+
select_target: {
|
|
48
|
+
kind: "selection";
|
|
49
|
+
operation: "select_target";
|
|
50
|
+
};
|
|
51
|
+
start_world_service: TargetMutationDispatch & {
|
|
52
|
+
readonly operation: "start_world_service";
|
|
53
|
+
};
|
|
54
|
+
stop_world_service: TargetMutationDispatch & {
|
|
55
|
+
readonly operation: "stop_world_service";
|
|
56
|
+
};
|
|
57
|
+
}>;
|
|
58
|
+
export declare const targetOperationDispatch: (request: TargetResourceRequest) => TargetOperationDispatch;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const mutation = (operation) => ({
|
|
2
|
+
kind: "mutation",
|
|
3
|
+
operation
|
|
4
|
+
});
|
|
5
|
+
export const TARGET_OPERATION_DISPATCH = Object.freeze({
|
|
6
|
+
attach_organization: mutation("attach_organization"),
|
|
7
|
+
cleanup_run: mutation("cleanup_run"),
|
|
8
|
+
create_data_network: mutation("create_data_network"),
|
|
9
|
+
create_evidence_volume: mutation("create_evidence_volume"),
|
|
10
|
+
create_world_service: mutation("create_world_service"),
|
|
11
|
+
detach_organization: mutation("detach_organization"),
|
|
12
|
+
export_evidence_volume: mutation("export_evidence_volume"),
|
|
13
|
+
prepare_secret_bindings: mutation("prepare_secret_bindings"),
|
|
14
|
+
recover_operation: mutation("recover_operation"),
|
|
15
|
+
resolve_world_artifact: mutation("resolve_world_artifact"),
|
|
16
|
+
revoke_secret_bindings: mutation("revoke_secret_bindings"),
|
|
17
|
+
select_target: { kind: "selection", operation: "select_target" },
|
|
18
|
+
start_world_service: mutation("start_world_service"),
|
|
19
|
+
stop_world_service: mutation("stop_world_service")
|
|
20
|
+
});
|
|
21
|
+
export const targetOperationDispatch = (request) => TARGET_OPERATION_DISPATCH[request.operation];
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type TargetResourceReceipt } from "../target/contracts.js";
|
|
2
|
+
export interface TargetMutationResult {
|
|
3
|
+
readonly receipt: unknown;
|
|
4
|
+
readonly receiptBytes: unknown;
|
|
5
|
+
}
|
|
6
|
+
export interface CanonicalTargetMutationReceipt {
|
|
7
|
+
readonly bytes: string;
|
|
8
|
+
readonly receipt: TargetResourceReceipt;
|
|
9
|
+
}
|
|
10
|
+
export type TargetCliErrorPhase = "operation" | "request";
|
|
11
|
+
export declare const formatTargetCliError: (phase: TargetCliErrorPhase) => string;
|
|
12
|
+
export declare const formatCaughtTargetCliError: (error: unknown, crashMessage: string) => string;
|
|
13
|
+
export declare const validateCanonicalTargetMutationReceipt: (raw: TargetMutationResult) => CanonicalTargetMutationReceipt;
|
|
14
|
+
export declare const emitCanonicalTargetMutationReceipt: (raw: TargetMutationResult, write: (receiptBytes: string) => void) => TargetResourceReceipt;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { createCanonicalTargetReceiptBytes, createTargetReceiptDigest } from "../target/handles.js";
|
|
2
|
+
import { parseTargetResourceReceipt } from "../target/contracts.js";
|
|
3
|
+
import { isSpawnfileError } from "../shared/index.js";
|
|
4
|
+
export const formatTargetCliError = (phase) => phase === "request" ? "error: Invalid target request" : "error: Target operation failed";
|
|
5
|
+
export const formatCaughtTargetCliError = (error, crashMessage) => isSpawnfileError(error)
|
|
6
|
+
? `error: ${error.message}`
|
|
7
|
+
: `error: ${crashMessage}`;
|
|
8
|
+
export const validateCanonicalTargetMutationReceipt = (raw) => {
|
|
9
|
+
const receipt = parseTargetResourceReceipt(raw.receipt);
|
|
10
|
+
const bytes = createCanonicalTargetReceiptBytes(receipt);
|
|
11
|
+
if (receipt.receipt_digest !== createTargetReceiptDigest(receipt)
|
|
12
|
+
|| typeof raw.receiptBytes !== "string" || raw.receiptBytes !== bytes) {
|
|
13
|
+
throw new TypeError("Target operation returned a non-canonical receipt");
|
|
14
|
+
}
|
|
15
|
+
return Object.freeze({ bytes, receipt });
|
|
16
|
+
};
|
|
17
|
+
export const emitCanonicalTargetMutationReceipt = (raw, write) => {
|
|
18
|
+
const validated = validateCanonicalTargetMutationReceipt(raw);
|
|
19
|
+
write(validated.bytes);
|
|
20
|
+
return validated.receipt;
|
|
21
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type TargetTopologyAttestationRequest, type TargetResourceRequest } from "../target/contracts.js";
|
|
2
|
+
import { type ComposedPreparationRequest } from "../target/composedPreparation.js";
|
|
3
|
+
import { type TargetPublicArtifactSnapshotRequest } from "../target/publicArtifactSnapshot.js";
|
|
4
|
+
import { type TargetWorldClockRequest } from "../target/worldClock.js";
|
|
5
|
+
import { type TargetWorldReadinessRequest } from "../target/worldReadiness.js";
|
|
6
|
+
export declare const DEFAULT_TARGET_REQUEST_FILE_BYTES = 262144;
|
|
7
|
+
export declare const MAX_TARGET_REQUEST_FILE_BYTES = 1048576;
|
|
8
|
+
export declare const MAX_TARGET_REQUEST_FILE_PATH_BYTES = 4096;
|
|
9
|
+
export declare const readTargetRequestFile: (filePath: string, byteLimit?: number) => Promise<TargetResourceRequest>;
|
|
10
|
+
export declare const readComposedPreparationRequestFile: (filePath: string, byteLimit?: number) => Promise<ComposedPreparationRequest>;
|
|
11
|
+
export declare const readTargetTopologyAttestationRequestFile: (filePath: string, byteLimit?: number) => Promise<TargetTopologyAttestationRequest>;
|
|
12
|
+
export declare const readTargetPublicArtifactSnapshotRequestFile: (filePath: string, byteLimit?: number) => Promise<TargetPublicArtifactSnapshotRequest>;
|
|
13
|
+
export declare const readTargetWorldReadinessRequestFile: (filePath: string, byteLimit?: number) => Promise<TargetWorldReadinessRequest>;
|
|
14
|
+
export declare const readTargetWorldClockRequestFile: (filePath: string, byteLimit?: number) => Promise<TargetWorldClockRequest>;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { open } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { parseTargetResourceRequest, parseTargetTopologyAttestationRequest } from "../target/contracts.js";
|
|
4
|
+
import { parseComposedPreparationRequest } from "../target/composedPreparation.js";
|
|
5
|
+
import { parseTargetPublicArtifactSnapshotRequest } from "../target/publicArtifactSnapshot.js";
|
|
6
|
+
import { parseTargetWorldClockRequest } from "../target/worldClock.js";
|
|
7
|
+
import { parseTargetWorldReadinessRequest } from "../target/worldReadiness.js";
|
|
8
|
+
export const DEFAULT_TARGET_REQUEST_FILE_BYTES = 262_144;
|
|
9
|
+
export const MAX_TARGET_REQUEST_FILE_BYTES = 1_048_576;
|
|
10
|
+
export const MAX_TARGET_REQUEST_FILE_PATH_BYTES = 4_096;
|
|
11
|
+
const parseByteLimit = (raw) => {
|
|
12
|
+
if (!Number.isSafeInteger(raw) || raw < 1
|
|
13
|
+
|| raw > MAX_TARGET_REQUEST_FILE_BYTES) {
|
|
14
|
+
throw new TypeError("Target request-file byte limit is invalid");
|
|
15
|
+
}
|
|
16
|
+
return raw;
|
|
17
|
+
};
|
|
18
|
+
const requireExactAbsolutePath = (raw) => {
|
|
19
|
+
if (typeof raw !== "string" || raw.length < 1 || raw.includes("\0")
|
|
20
|
+
|| Buffer.byteLength(raw, "utf8") > MAX_TARGET_REQUEST_FILE_PATH_BYTES
|
|
21
|
+
|| !path.isAbsolute(raw) || path.normalize(raw) !== raw) {
|
|
22
|
+
throw new TypeError("Target request file path is invalid");
|
|
23
|
+
}
|
|
24
|
+
return raw;
|
|
25
|
+
};
|
|
26
|
+
const requireObject = (raw) => {
|
|
27
|
+
if (raw === null || typeof raw !== "object" || Array.isArray(raw)) {
|
|
28
|
+
throw new TypeError("Target request file must contain one JSON object");
|
|
29
|
+
}
|
|
30
|
+
return raw;
|
|
31
|
+
};
|
|
32
|
+
const readTargetRequestFileValue = async (filePath, byteLimit) => {
|
|
33
|
+
const limit = parseByteLimit(byteLimit);
|
|
34
|
+
const exactPath = requireExactAbsolutePath(filePath);
|
|
35
|
+
const handle = await open(exactPath, "r");
|
|
36
|
+
try {
|
|
37
|
+
const info = await handle.stat();
|
|
38
|
+
if (!info.isFile() || info.size > limit) {
|
|
39
|
+
throw new TypeError("Target request file is not a bounded regular file");
|
|
40
|
+
}
|
|
41
|
+
const bytes = Buffer.alloc(limit + 1);
|
|
42
|
+
let offset = 0;
|
|
43
|
+
while (offset <= limit) {
|
|
44
|
+
const result = await handle.read(bytes, offset, limit + 1 - offset, offset);
|
|
45
|
+
if (result.bytesRead === 0)
|
|
46
|
+
break;
|
|
47
|
+
offset += result.bytesRead;
|
|
48
|
+
}
|
|
49
|
+
if (offset > limit) {
|
|
50
|
+
throw new TypeError("Target request file exceeds the byte limit");
|
|
51
|
+
}
|
|
52
|
+
return requireObject(JSON.parse(bytes.toString("utf8", 0, offset)));
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
await handle.close();
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
export const readTargetRequestFile = async (filePath, byteLimit = DEFAULT_TARGET_REQUEST_FILE_BYTES) => parseTargetResourceRequest(await readTargetRequestFileValue(filePath, byteLimit));
|
|
59
|
+
export const readComposedPreparationRequestFile = async (filePath, byteLimit = DEFAULT_TARGET_REQUEST_FILE_BYTES) => parseComposedPreparationRequest(await readTargetRequestFileValue(filePath, byteLimit));
|
|
60
|
+
export const readTargetTopologyAttestationRequestFile = async (filePath, byteLimit = DEFAULT_TARGET_REQUEST_FILE_BYTES) => parseTargetTopologyAttestationRequest(await readTargetRequestFileValue(filePath, byteLimit));
|
|
61
|
+
export const readTargetPublicArtifactSnapshotRequestFile = async (filePath, byteLimit = DEFAULT_TARGET_REQUEST_FILE_BYTES) => parseTargetPublicArtifactSnapshotRequest(await readTargetRequestFileValue(filePath, byteLimit));
|
|
62
|
+
export const readTargetWorldReadinessRequestFile = async (filePath, byteLimit = DEFAULT_TARGET_REQUEST_FILE_BYTES) => parseTargetWorldReadinessRequest(await readTargetRequestFileValue(filePath, byteLimit));
|
|
63
|
+
export const readTargetWorldClockRequestFile = async (filePath, byteLimit = DEFAULT_TARGET_REQUEST_FILE_BYTES) => parseTargetWorldClockRequest(await readTargetRequestFileValue(filePath, byteLimit));
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type OpaqueTargetSecretSourceHandle } from "../auth/targetSecretSourceRecordCommon.js";
|
|
2
|
+
import { type TargetSecretSourceGrantCommandInput } from "../auth/targetSecretSourceGrantRecords.js";
|
|
3
|
+
export declare const TARGET_SECRET_SOURCE_REQUEST_VERSION: "spawnfile.auth.target-secret.source-request.v1";
|
|
4
|
+
export declare const TARGET_SECRET_SOURCE_GRANT_REQUEST_VERSION: "spawnfile.auth.target-secret.grant-request.v1";
|
|
5
|
+
export declare const TARGET_SECRET_SOURCE_RECEIPT_VERSION: "spawnfile.auth.target-secret.receipt.v1";
|
|
6
|
+
export declare const MAX_TARGET_SECRET_SOURCE_REQUEST_FILE_BYTES = 65536;
|
|
7
|
+
export type TargetSecretSourceCommandKind = "author" | "grant" | "revoke-grant" | "revoke-version" | "rotate";
|
|
8
|
+
export type TargetSecretSourceRequest = Readonly<{
|
|
9
|
+
source_handle: OpaqueTargetSecretSourceHandle;
|
|
10
|
+
version: typeof TARGET_SECRET_SOURCE_REQUEST_VERSION;
|
|
11
|
+
}>;
|
|
12
|
+
export type TargetSecretSourceReceipt = Readonly<{
|
|
13
|
+
kind: TargetSecretSourceCommandKind;
|
|
14
|
+
source_handle: OpaqueTargetSecretSourceHandle;
|
|
15
|
+
version: typeof TARGET_SECRET_SOURCE_RECEIPT_VERSION;
|
|
16
|
+
}>;
|
|
17
|
+
export declare const parseTargetSecretSourceRequestBytes: (bytes: Uint8Array) => TargetSecretSourceRequest;
|
|
18
|
+
export declare const parseTargetSecretSourceGrantRequestBytes: (bytes: Uint8Array) => TargetSecretSourceGrantCommandInput;
|
|
19
|
+
export interface TargetSecretSourceRequestFileOptions {
|
|
20
|
+
readonly beforeReadForTest?: () => Promise<void> | void;
|
|
21
|
+
}
|
|
22
|
+
export declare const readTargetSecretSourceRequestFile: (filePath: string, options?: TargetSecretSourceRequestFileOptions) => Promise<TargetSecretSourceRequest>;
|
|
23
|
+
export declare const readTargetSecretSourceGrantRequestFile: (filePath: string, options?: TargetSecretSourceRequestFileOptions) => Promise<TargetSecretSourceGrantCommandInput>;
|
|
24
|
+
export declare const createTargetSecretSourceReceiptBytes: (raw: Readonly<{
|
|
25
|
+
kind: TargetSecretSourceCommandKind;
|
|
26
|
+
source_handle: unknown;
|
|
27
|
+
}>) => Uint8Array;
|
|
28
|
+
export declare const readBoundedTargetSecretStdin: (input: AsyncIterable<unknown>, maximumBytes: number) => Promise<Uint8Array>;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { Buffer } from "node:buffer";
|
|
2
|
+
import { open } from "node:fs/promises";
|
|
3
|
+
import { MAX_TARGET_SECRET_SOURCE_SECRET_BYTES, TARGET_SECRET_SOURCE_ERROR, assertOrdinaryJsonGraph, createCanonicalTargetSecretSourceJson, parseCanonicalTargetSecretSourceJson, parseTargetSecretSourceOpaqueHandle } from "../auth/targetSecretSourceRecordCommon.js";
|
|
4
|
+
import { parseTargetSecretSourceGrantCommandInput } from "../auth/targetSecretSourceGrantRecords.js";
|
|
5
|
+
export const TARGET_SECRET_SOURCE_REQUEST_VERSION = "spawnfile.auth.target-secret.source-request.v1";
|
|
6
|
+
export const TARGET_SECRET_SOURCE_GRANT_REQUEST_VERSION = "spawnfile.auth.target-secret.grant-request.v1";
|
|
7
|
+
export const TARGET_SECRET_SOURCE_RECEIPT_VERSION = "spawnfile.auth.target-secret.receipt.v1";
|
|
8
|
+
export const MAX_TARGET_SECRET_SOURCE_REQUEST_FILE_BYTES = 65_536;
|
|
9
|
+
const fail = () => { throw new Error(TARGET_SECRET_SOURCE_ERROR); };
|
|
10
|
+
const exact = (raw, keys) => {
|
|
11
|
+
assertOrdinaryJsonGraph(raw);
|
|
12
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
13
|
+
return fail();
|
|
14
|
+
const record = raw;
|
|
15
|
+
const actual = Object.keys(record).sort();
|
|
16
|
+
if (actual.length !== keys.length || actual.some((key, index) => key !== keys[index]))
|
|
17
|
+
fail();
|
|
18
|
+
return record;
|
|
19
|
+
};
|
|
20
|
+
export const parseTargetSecretSourceRequestBytes = (bytes) => {
|
|
21
|
+
const record = exact(parseCanonicalTargetSecretSourceJson(bytes), ["source_handle", "version"]);
|
|
22
|
+
if (record.version !== TARGET_SECRET_SOURCE_REQUEST_VERSION)
|
|
23
|
+
fail();
|
|
24
|
+
return Object.freeze({
|
|
25
|
+
source_handle: parseTargetSecretSourceOpaqueHandle(record.source_handle),
|
|
26
|
+
version: TARGET_SECRET_SOURCE_REQUEST_VERSION
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
export const parseTargetSecretSourceGrantRequestBytes = (bytes) => {
|
|
30
|
+
const record = exact(parseCanonicalTargetSecretSourceJson(bytes), ["grant", "version"]);
|
|
31
|
+
if (record.version !== TARGET_SECRET_SOURCE_GRANT_REQUEST_VERSION)
|
|
32
|
+
fail();
|
|
33
|
+
return parseTargetSecretSourceGrantCommandInput(record.grant);
|
|
34
|
+
};
|
|
35
|
+
const readRequestFile = async (filePath, parse, options) => {
|
|
36
|
+
let bytes;
|
|
37
|
+
let handle;
|
|
38
|
+
try {
|
|
39
|
+
handle = await open(filePath, "r");
|
|
40
|
+
const info = await handle.stat();
|
|
41
|
+
if (!info.isFile() || info.size < 1 || info.size > MAX_TARGET_SECRET_SOURCE_REQUEST_FILE_BYTES)
|
|
42
|
+
fail();
|
|
43
|
+
await options.beforeReadForTest?.();
|
|
44
|
+
bytes = Buffer.alloc(info.size + 1);
|
|
45
|
+
let offset = 0;
|
|
46
|
+
while (offset < bytes.length) {
|
|
47
|
+
const { bytesRead } = await handle.read(bytes, offset, bytes.length - offset, offset);
|
|
48
|
+
if (bytesRead === 0)
|
|
49
|
+
break;
|
|
50
|
+
offset += bytesRead;
|
|
51
|
+
}
|
|
52
|
+
if (offset !== info.size)
|
|
53
|
+
fail();
|
|
54
|
+
return parse(bytes.subarray(0, offset));
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return fail();
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
bytes?.fill(0);
|
|
61
|
+
await handle?.close().catch(() => undefined);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
export const readTargetSecretSourceRequestFile = (filePath, options = {}) => readRequestFile(filePath, parseTargetSecretSourceRequestBytes, options);
|
|
65
|
+
export const readTargetSecretSourceGrantRequestFile = (filePath, options = {}) => readRequestFile(filePath, parseTargetSecretSourceGrantRequestBytes, options);
|
|
66
|
+
export const createTargetSecretSourceReceiptBytes = (raw) => {
|
|
67
|
+
try {
|
|
68
|
+
const record = exact(raw, ["kind", "source_handle"]);
|
|
69
|
+
const kinds = ["author", "grant", "revoke-grant", "revoke-version", "rotate"];
|
|
70
|
+
if (!kinds.includes(record.kind))
|
|
71
|
+
fail();
|
|
72
|
+
const receipt = Object.freeze({
|
|
73
|
+
kind: record.kind,
|
|
74
|
+
source_handle: parseTargetSecretSourceOpaqueHandle(record.source_handle),
|
|
75
|
+
version: TARGET_SECRET_SOURCE_RECEIPT_VERSION
|
|
76
|
+
});
|
|
77
|
+
const canonical = createCanonicalTargetSecretSourceJson(receipt);
|
|
78
|
+
return canonical;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return fail();
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
export const readBoundedTargetSecretStdin = async (input, maximumBytes) => {
|
|
85
|
+
const chunks = [];
|
|
86
|
+
let total = 0;
|
|
87
|
+
try {
|
|
88
|
+
if (!input || typeof input[Symbol.asyncIterator] !== "function"
|
|
89
|
+
|| !Number.isSafeInteger(maximumBytes) || maximumBytes < 1
|
|
90
|
+
|| maximumBytes > MAX_TARGET_SECRET_SOURCE_SECRET_BYTES)
|
|
91
|
+
fail();
|
|
92
|
+
for await (const raw of input) {
|
|
93
|
+
if (typeof raw === "string" && Buffer.byteLength(raw, "utf8") > maximumBytes - total)
|
|
94
|
+
fail();
|
|
95
|
+
if (raw instanceof Uint8Array && raw.byteLength > maximumBytes - total)
|
|
96
|
+
fail();
|
|
97
|
+
const chunk = typeof raw === "string" ? new TextEncoder().encode(raw)
|
|
98
|
+
: raw instanceof Uint8Array ? Uint8Array.from(raw) : fail();
|
|
99
|
+
chunks.push(chunk);
|
|
100
|
+
total += chunk.length;
|
|
101
|
+
if (total > maximumBytes)
|
|
102
|
+
fail();
|
|
103
|
+
}
|
|
104
|
+
if (total === 0)
|
|
105
|
+
fail();
|
|
106
|
+
const result = new Uint8Array(total);
|
|
107
|
+
let offset = 0;
|
|
108
|
+
for (const chunk of chunks) {
|
|
109
|
+
result.set(chunk, offset);
|
|
110
|
+
offset += chunk.length;
|
|
111
|
+
}
|
|
112
|
+
return result;
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return fail();
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
for (const chunk of chunks)
|
|
119
|
+
chunk.fill(0);
|
|
120
|
+
}
|
|
121
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import { type TargetWorldClockReceipt, type TargetWorldClockRequest } from "../target/worldClock.js";
|
|
3
|
+
export interface TargetWorldClockSession {
|
|
4
|
+
queryWorldClock?(request: TargetWorldClockRequest): Promise<TargetWorldClockReceipt>;
|
|
5
|
+
}
|
|
6
|
+
export type TargetWorldClockSessionLoader = (configInput: unknown) => Promise<TargetWorldClockSession>;
|
|
7
|
+
export declare const registerTargetWorldClockCommand: (target: Command, session: TargetWorldClockSession | TargetWorldClockSessionLoader, streams: {
|
|
8
|
+
readonly stderr: (message: string) => void;
|
|
9
|
+
readonly stdout: (message: string) => void;
|
|
10
|
+
}, setExitCode: (exitCode: 1 | 2) => void) => void;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { createCanonicalTargetWorldClockReceiptBytes, verifyTargetWorldClockReceipt, } from "../target/worldClock.js";
|
|
2
|
+
import { formatCaughtTargetCliError } from "./targetReceiptOutput.js";
|
|
3
|
+
import { readTargetWorldClockRequestFile } from "./targetRequestFile.js";
|
|
4
|
+
export const registerTargetWorldClockCommand = (target, session, streams, setExitCode) => {
|
|
5
|
+
target.command("query_world_clock")
|
|
6
|
+
.description("Query one exact activated world's observed public clock")
|
|
7
|
+
.argument("<request-file>", "Strict world clock request JSON file")
|
|
8
|
+
.action(async (requestFile) => {
|
|
9
|
+
let request;
|
|
10
|
+
try {
|
|
11
|
+
request = await readTargetWorldClockRequestFile(requestFile);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
streams.stderr("error: Invalid world clock request");
|
|
15
|
+
setExitCode(2);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
let active;
|
|
19
|
+
try {
|
|
20
|
+
active = typeof session === "function"
|
|
21
|
+
? await session(target.opts().config)
|
|
22
|
+
: session;
|
|
23
|
+
if (typeof active.queryWorldClock !== "function")
|
|
24
|
+
throw new TypeError();
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
streams.stderr("error: Invalid target configuration");
|
|
28
|
+
setExitCode(2);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
const receipt = verifyTargetWorldClockReceipt({
|
|
33
|
+
receipt: await active.queryWorldClock(request), request,
|
|
34
|
+
});
|
|
35
|
+
streams.stdout(createCanonicalTargetWorldClockReceiptBytes(receipt));
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
streams.stderr(formatCaughtTargetCliError(error, "Target world clock query crashed"));
|
|
39
|
+
setExitCode(1);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type TargetWorldClockRequest } from "../target/worldClock.js";
|
|
2
|
+
export type BuiltWorldClockMode = "success" | "tick-zero" | "stale" | "topology" | "activation" | "nonzero-action";
|
|
3
|
+
export interface BuiltWorldClockState {
|
|
4
|
+
readonly callsPath: string;
|
|
5
|
+
readonly config: Readonly<Record<string, unknown>>;
|
|
6
|
+
readonly home: string;
|
|
7
|
+
readonly modePath: string;
|
|
8
|
+
readonly request: TargetWorldClockRequest;
|
|
9
|
+
readonly requestPath: string;
|
|
10
|
+
readonly root: string;
|
|
11
|
+
}
|
|
12
|
+
export declare const createBuiltWorldClockState: () => Promise<BuiltWorldClockState>;
|
|
13
|
+
export declare const selectBuiltWorldClockMode: (state: BuiltWorldClockState, mode: BuiltWorldClockMode) => Promise<void>;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { chmod, mkdtemp, realpath, writeFile } from "node:fs/promises";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { parseOpaqueTargetHandle } from "../target/contracts.js";
|
|
5
|
+
import { createDockerArtifactSpec } from "../target/dockerArtifactsProvider.js";
|
|
6
|
+
import { createDockerResourceSpec } from "../target/dockerResourcesProvider.js";
|
|
7
|
+
import { createWorldServiceAuthorization, parseWorldServiceResolution } from "../target/dockerWorldServiceAuthority.js";
|
|
8
|
+
import { worldServiceSpecForBinding } from "../target/dockerWorldServiceLifecycle.js";
|
|
9
|
+
import { createWorldServiceBinding, initializeWorldServiceAuthorityStore, worldServiceResourceBindings, } from "../target/dockerWorldServiceStore.js";
|
|
10
|
+
import { createCanonicalWorldServiceActivationBytes, createTargetTopologyActivationReceiptDigest, createWorldServiceActivationDigest, parseWorldServiceActivation, } from "../target/topologyActivation.js";
|
|
11
|
+
import { parseTargetWorldClockRequest } from "../target/worldClock.js";
|
|
12
|
+
const d = (value) => `sha256:${value.repeat(64).slice(0, 64)}`;
|
|
13
|
+
const h = (value) => parseOpaqueTargetHandle(`opaque_${value.repeat(16)}`);
|
|
14
|
+
const containerId = "c".repeat(64);
|
|
15
|
+
const after = (args, flag) => args[args.indexOf(flag) + 1];
|
|
16
|
+
const inspection = (spec) => ({
|
|
17
|
+
AutoRemove: false, BindCount: 0, CapAddCount: 0, CapDrop: ["ALL"], CgroupnsMode: "private", DeviceCount: 0,
|
|
18
|
+
DeviceRequestCount: 0, DnsCount: 0, Domainname: "", ExposedPortCount: 0, ExtraHostCount: 0, GroupAddCount: 0,
|
|
19
|
+
Hostname: spec.containerName, Id: containerId, Image: spec.imageReference, IpcMode: "none", Labels: spec.receiptLabels,
|
|
20
|
+
LinkCount: 0, LogType: "none", Mounts: spec.createArgs.filter((value, index, values) => values[index - 1] === "--mount")
|
|
21
|
+
.map((value) => Object.fromEntries(value.split(",").map((part) => part.split("=", 2))))
|
|
22
|
+
.map((mount) => ({ Destination: mount.dst, Name: mount.src, RW: mount.dst === spec.evidenceMountPath, Type: "volume" })),
|
|
23
|
+
Name: `/${spec.containerName}`, NetworkAliases: spec.networkAlias ? [spec.networkAlias] : null,
|
|
24
|
+
NetworkAttachmentCount: 1, NetworkAttachmentId: "b".repeat(64), NetworkAttachmentName: after(spec.createArgs, "--network"),
|
|
25
|
+
NetworkMode: after(spec.createArgs, "--network"), PidMode: "", PortBindingCount: 0, Privileged: false,
|
|
26
|
+
PublishAllPorts: false, ReadonlyRootfs: true, RestartMaximumRetryCount: 0, RestartPolicyName: "no",
|
|
27
|
+
SecurityOpt: ["no-new-privileges=true"], Status: "running", Tmpfs: { "/tmp": "rw,noexec,nosuid,nodev,size=1m,mode=1777" },
|
|
28
|
+
UTSMode: "", UsernsMode: "", VolumesFromCount: 0,
|
|
29
|
+
});
|
|
30
|
+
const fixture = () => {
|
|
31
|
+
const selectedTarget = { fingerprint: `sha256:${"1".repeat(32)}`, handle: h("1") };
|
|
32
|
+
const runId = "run-built-clock";
|
|
33
|
+
const dataClaim = { operationHandle: h("2"), requestDigest: d("2") };
|
|
34
|
+
const evidenceClaim = { operationHandle: h("3"), requestDigest: d("3") };
|
|
35
|
+
const data = createDockerResourceSpec({ kind: "data_network", ...dataClaim, runId, selectedTargetHandle: selectedTarget.handle });
|
|
36
|
+
const evidence = createDockerResourceSpec({ kind: "evidence_volume", ...evidenceClaim, runId, selectedTargetHandle: selectedTarget.handle });
|
|
37
|
+
const artifact = createDockerArtifactSpec({ artifactManifestDigest: d("4"), imageDigest: d("5"),
|
|
38
|
+
imageReference: `registry.example/world@${d("5")}`, operationHandle: h("4"), requestDigest: d("4"),
|
|
39
|
+
selectedTargetHandle: selectedTarget.handle });
|
|
40
|
+
const authorization = createWorldServiceAuthorization({ dataNetworkHandle: data.resultHandle, descriptorDigest: d("6"),
|
|
41
|
+
evidenceMountPath: "/run/world/evidence", evidenceVolumeHandle: evidence.resultHandle, operationHandle: h("6"),
|
|
42
|
+
requestDigest: d("6"), runId, secretBindingsHandle: h("7"), selectedTarget, worldArtifactHandle: artifact.resultHandle });
|
|
43
|
+
const resolution = parseWorldServiceResolution({ artifact: { artifact_manifest_digest: d("4"), identity_kind: "oci_image_manifest",
|
|
44
|
+
image_digest: artifact.imageDigest, image_reference: artifact.imageReference, operation_handle: h("4"),
|
|
45
|
+
request_digest: d("4"), result_handle: artifact.resultHandle }, authorization });
|
|
46
|
+
const resources = worldServiceResourceBindings({ dataNetworkClaim: dataClaim, evidenceVolumeClaim: evidenceClaim, resolution });
|
|
47
|
+
const spec = worldServiceSpecForBinding({ resolution, resources });
|
|
48
|
+
const binding = createWorldServiceBinding({ containerId, dataNetwork: resources.data_network, evidenceVolume: resources.evidence_volume,
|
|
49
|
+
resolution, secretBindings: resources.secret_bindings, spec });
|
|
50
|
+
const marker = parseWorldServiceActivation({ bundle_digest: d("8"), run_id: runId, state: "activated",
|
|
51
|
+
topology_receipt_digest: d("9"), topology_request_digest: d("a"), version: "spawnfile.world-service-activation.v1" });
|
|
52
|
+
const activationDigest = createWorldServiceActivationDigest(marker);
|
|
53
|
+
const activationReceiptDigest = createTargetTopologyActivationReceiptDigest({ activation_digest: activationDigest,
|
|
54
|
+
bundle_digest: marker.bundle_digest, receipt_digest: d("0"), run_id: runId, state: "activated",
|
|
55
|
+
topology_receipt_digest: marker.topology_receipt_digest, topology_request_digest: marker.topology_request_digest,
|
|
56
|
+
version: "spawnfile.target-topology-activation-receipt.v1" });
|
|
57
|
+
const request = parseTargetWorldClockRequest({ activation_digest: activationDigest,
|
|
58
|
+
activation_receipt_digest: activationReceiptDigest, descriptor_digest: authorization.descriptor_digest,
|
|
59
|
+
endpoint: { internal_port: 4_070, path: "/v1/world/clock" },
|
|
60
|
+
expected: { document_version: "world.clock-document.v1", world_instance_id: "world-built-clock" }, run_id: runId,
|
|
61
|
+
selected_target: selectedTarget, topology_receipt_digest: marker.topology_receipt_digest,
|
|
62
|
+
topology_request_digest: marker.topology_request_digest, version: "spawnfile.target-world-clock.request.v1",
|
|
63
|
+
world_service_handle: binding.world_service_handle });
|
|
64
|
+
return { binding, marker, request, spec };
|
|
65
|
+
};
|
|
66
|
+
export const createBuiltWorldClockState = async () => {
|
|
67
|
+
const root = await realpath(await mkdtemp(path.join(os.tmpdir(), "spawnfile-built-world-clock-")));
|
|
68
|
+
const home = path.join(root, "home");
|
|
69
|
+
const callsPath = path.join(root, "docker-calls.ndjson");
|
|
70
|
+
const modePath = path.join(root, "mode");
|
|
71
|
+
const scenariosPath = path.join(root, "scenarios.json");
|
|
72
|
+
const fakeDocker = path.join(root, "docker-clock");
|
|
73
|
+
const requestPath = path.join(root, "request.json");
|
|
74
|
+
const { binding, marker, request, spec } = fixture();
|
|
75
|
+
const store = await initializeWorldServiceAuthorityStore(path.join(home, "target", "world-authority"));
|
|
76
|
+
await store.bindService(binding);
|
|
77
|
+
const observation = { action_count: 0, clock: { completed_tick: 1, next_tick: 2, state: "running" },
|
|
78
|
+
run_id: request.run_id, version: request.expected.document_version, world_instance_id: request.expected.world_instance_id };
|
|
79
|
+
const topologyMarker = parseWorldServiceActivation({ ...marker, topology_receipt_digest: d("b") });
|
|
80
|
+
const activationMarker = parseWorldServiceActivation({ ...marker, bundle_digest: d("c") });
|
|
81
|
+
const scenarios = {
|
|
82
|
+
success: { marker: createCanonicalWorldServiceActivationBytes(marker), observation: JSON.stringify(observation) },
|
|
83
|
+
"tick-zero": { marker: createCanonicalWorldServiceActivationBytes(marker), observation: JSON.stringify({ ...observation,
|
|
84
|
+
clock: { completed_tick: 0, next_tick: 1, state: "running" } }) },
|
|
85
|
+
stale: { marker: createCanonicalWorldServiceActivationBytes(marker), observation: JSON.stringify({ ...observation, run_id: "run-stale-clock" }) },
|
|
86
|
+
topology: { marker: createCanonicalWorldServiceActivationBytes(topologyMarker), observation: JSON.stringify(observation) },
|
|
87
|
+
activation: { marker: createCanonicalWorldServiceActivationBytes(activationMarker), observation: JSON.stringify(observation) },
|
|
88
|
+
"nonzero-action": { marker: createCanonicalWorldServiceActivationBytes(marker), observation: JSON.stringify({ ...observation, action_count: 1 }) },
|
|
89
|
+
};
|
|
90
|
+
await writeFile(callsPath, "", { mode: 0o600 });
|
|
91
|
+
await writeFile(modePath, "success", { mode: 0o600 });
|
|
92
|
+
await writeFile(scenariosPath, JSON.stringify(scenarios), { mode: 0o600 });
|
|
93
|
+
await writeFile(requestPath, JSON.stringify(request), { mode: 0o600 });
|
|
94
|
+
await writeFile(fakeDocker, `#!${process.execPath}
|
|
95
|
+
const fs=require("node:fs");const args=process.argv.slice(2);
|
|
96
|
+
fs.appendFileSync(${JSON.stringify(callsPath)},JSON.stringify(args)+"\\n");
|
|
97
|
+
const all=JSON.parse(fs.readFileSync(${JSON.stringify(scenariosPath)},"utf8"));
|
|
98
|
+
const current=all[fs.readFileSync(${JSON.stringify(modePath)},"utf8").trim()];
|
|
99
|
+
if(args[2]==="container"&&args[3]==="inspect")process.stdout.write(${JSON.stringify(JSON.stringify([inspection(spec)]))});
|
|
100
|
+
else if(args[2]==="container"&&args[3]==="exec"&&args.includes("/bin/cat"))process.stdout.write(current.marker);
|
|
101
|
+
else if(args[2]==="container"&&args[3]==="exec"&&args.includes("/usr/local/bin/node"))process.stdout.write(current.observation);
|
|
102
|
+
else{process.stderr.write("unexpected fake Docker command\\n");process.exitCode=71;}
|
|
103
|
+
`, { mode: 0o700 });
|
|
104
|
+
await chmod(fakeDocker, 0o700);
|
|
105
|
+
return { callsPath, config: { context: "built_clock", dockerCommand: fakeDocker,
|
|
106
|
+
evidenceDestination: path.join(root, "unused.tar"), timeoutMs: 10_000,
|
|
107
|
+
version: "spawnfile.target-default-config.v1" }, home, modePath, request, requestPath, root };
|
|
108
|
+
};
|
|
109
|
+
export const selectBuiltWorldClockMode = async (state, mode) => { await writeFile(state.modePath, mode, { mode: 0o600 }); };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import { type TargetWorldReadinessRequest, type TargetWorldReadinessReceipt } from "../target/worldReadiness.js";
|
|
3
|
+
export interface TargetWorldReadinessSession {
|
|
4
|
+
queryWorldReadiness?(request: TargetWorldReadinessRequest): Promise<TargetWorldReadinessReceipt>;
|
|
5
|
+
}
|
|
6
|
+
export type TargetWorldReadinessSessionLoader = (configInput: unknown) => Promise<TargetWorldReadinessSession>;
|
|
7
|
+
export declare const registerTargetWorldReadinessCommand: (target: Command, session: TargetWorldReadinessSession | TargetWorldReadinessSessionLoader, streams: {
|
|
8
|
+
readonly stderr: (message: string) => void;
|
|
9
|
+
readonly stdout: (message: string) => void;
|
|
10
|
+
}, setExitCode: (exitCode: 1 | 2) => void) => void;
|