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,37 @@
|
|
|
1
|
+
import { DEFAULT_PAYLOAD_MINIMUMS } from "../ledger/index.js";
|
|
2
|
+
export const notApplicable = (id, category, severity, reason) => ({
|
|
3
|
+
category,
|
|
4
|
+
evidence: { reason },
|
|
5
|
+
id,
|
|
6
|
+
severity,
|
|
7
|
+
status: "not_applicable"
|
|
8
|
+
});
|
|
9
|
+
export const statusFor = (ok) => (ok ? "pass" : "fail");
|
|
10
|
+
/** `conformance.ts`'s `checkPayloadMinimums` is not exported (it is that module's private helper); this is the same one-line key-presence rule applied directly to already-parsed events, not a reimplementation of `validateConformanceSources`'s schema/seq/stitch pipeline. */
|
|
11
|
+
export const missingRequiredKeys = (event, requiredKeys) => requiredKeys.filter((key) => !(key in event.payload) || event.payload[key] === undefined);
|
|
12
|
+
export const DENIAL_MINIMUMS_BY_TYPE = new Map(DEFAULT_PAYLOAD_MINIMUMS.filter((minimum) => minimum.type.endsWith(".denied")).map((minimum) => [
|
|
13
|
+
minimum.type,
|
|
14
|
+
minimum.requiredKeys
|
|
15
|
+
]));
|
|
16
|
+
/** Env name gating the operator-only wake endpoint (appControlSource.ts:45, `CONTROL_TOKEN_ENV`). */
|
|
17
|
+
export const CONTROL_TOKEN_ENV = "SPAWNFILE_PI_CONTROL_TOKEN";
|
|
18
|
+
/**
|
|
19
|
+
* Verbatim source-text substring of appControlSource.ts:75's fail-closed
|
|
20
|
+
* rejection branch (`return { ok: false, reason: "no operator token
|
|
21
|
+
* configured (" + CONTROL_TOKEN_ENV + " is unset)" }`). The literal string
|
|
22
|
+
* checked here is only the first concatenated chunk — the source
|
|
23
|
+
* concatenates `CONTROL_TOKEN_ENV` in with `+`, so the fully-assembled
|
|
24
|
+
* runtime message never appears as one literal in the source text itself.
|
|
25
|
+
* Its presence is direct evidence the fail-closed branch was actually
|
|
26
|
+
* emitted, not paraphrased.
|
|
27
|
+
*/
|
|
28
|
+
export const FAIL_CLOSED_MARKER = "no operator token configured (";
|
|
29
|
+
export const escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/gu, "\\$&");
|
|
30
|
+
/**
|
|
31
|
+
* Matches a literal (non-`$`-expansion) shell/Dockerfile assignment
|
|
32
|
+
* `NAME=<value>` — never a `require_env 'NAME'` call (no `=` follows the
|
|
33
|
+
* name there at all) and never a same-name passthrough reference like
|
|
34
|
+
* `NAME="$NAME"`/`NAME=${NAME}` (an optional quote followed by `$`), both of
|
|
35
|
+
* which read the env rather than bake a value into it.
|
|
36
|
+
*/
|
|
37
|
+
export const literalAssignmentPattern = (name) => new RegExp(`\\b${escapeRegExp(name)}=(?!['"]?\\$)\\S`, "u");
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { AuditReport } from "./types.js";
|
|
2
|
+
export interface GenerateAuditOptions {
|
|
3
|
+
/** Required. The compiled-output directory (`spawnfile compile`'s emitted `Dockerfile`, `entrypoint.sh`, and — for a Pi-targeted compile — `runtime/app.mjs`). Static checks 3-4 always evaluate pass/fail against whatever is (or is not) present here; a missing file reads as an empty string, never a silent skip. */
|
|
4
|
+
compiledOutputDirPath: string;
|
|
5
|
+
/** Optional. A directory of `*.jsonl` ledger fixture files plus an optional `expected-denials.json` manifest (see checks.ts's `RunLedgerEvidence`). Omitting it (or an empty directory) is what makes run-mode checks 1, 2, 5, 6 report `not_applicable` — they never `pass` without it. */
|
|
6
|
+
ledgerDirPath?: string;
|
|
7
|
+
/** Injectable clock for `generated_at`, defaulting to `() => new Date()`. Every other report field is deterministic given the same inputs. */
|
|
8
|
+
now?: () => Date;
|
|
9
|
+
/** Secret env var NAMES this compile declared required (`requiredSecrets` passed to `renderEntrypoint`). Defaults to `[]`. */
|
|
10
|
+
requiredSecrets?: string[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Orchestrator: the only I/O-performing function in src/audit/. Reads the
|
|
14
|
+
* compiled-output directory and, if given, the ledger directory, then runs
|
|
15
|
+
* the seven pure checks (checks.ts) and assembles the `AuditReport`.
|
|
16
|
+
* Deterministic across repeated calls with the same inputs except for
|
|
17
|
+
* `generated_at`.
|
|
18
|
+
*/
|
|
19
|
+
export declare const generateAudit: (options: GenerateAuditOptions) => Promise<AuditReport>;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { readdir } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileExists, readUtf8File } from "../filesystem/index.js";
|
|
4
|
+
import { runRealConformance } from "../ledger/index.js";
|
|
5
|
+
import { checkContainerNoBakedSecrets, checkControlWakeFailClosed, checkDeniedLedgerVisible, checkMemoryCrossScopeCapability, checkNonMemberWriteDenied, checkPrincipalsAuthenticated, checkProvenanceSignedReport } from "./checks.js";
|
|
6
|
+
import { SPAWNFILE_AUDIT_SCHEMA } from "./types.js";
|
|
7
|
+
const readOptionalFile = async (filePath) => (await fileExists(filePath)) ? readUtf8File(filePath) : "";
|
|
8
|
+
const readExpectedDenials = async (ledgerDirPath) => {
|
|
9
|
+
const manifestPath = path.join(ledgerDirPath, "expected-denials.json");
|
|
10
|
+
if (!(await fileExists(manifestPath))) {
|
|
11
|
+
return { expectedDenialTypes: [], manifestPresent: false };
|
|
12
|
+
}
|
|
13
|
+
const raw = await readUtf8File(manifestPath);
|
|
14
|
+
const parsed = JSON.parse(raw);
|
|
15
|
+
if (!Array.isArray(parsed.expectedDenialTypes)) {
|
|
16
|
+
return { expectedDenialTypes: [], manifestPresent: true };
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
expectedDenialTypes: parsed.expectedDenialTypes.filter((value) => typeof value === "string"),
|
|
20
|
+
manifestPresent: true
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Reads every `*.jsonl` file in `ledgerDirPath` and feeds it to
|
|
25
|
+
* `runRealConformance` (src/ledger/conformance.ts) through an injected
|
|
26
|
+
* `exec` that returns each file's pre-read text instead of spawning a real
|
|
27
|
+
* sibling emitter process. This is what keeps the whole B54 generator
|
|
28
|
+
* offline while still reusing `runRealConformance`'s real schema/seq/
|
|
29
|
+
* payload-minimum/principal-grammar/chain-stitch pipeline rather than
|
|
30
|
+
* reimplementing any of it — see src/ledger/emitters.ts for the `Exec`/
|
|
31
|
+
* `EmitterSpec` contract this fills in. Returns `undefined` (never an empty
|
|
32
|
+
* evidence object) when the directory has no `*.jsonl` files, so callers can
|
|
33
|
+
* distinguish "no run artifacts" from "ledger with zero events".
|
|
34
|
+
*/
|
|
35
|
+
const collectRunLedgerEvidence = async (ledgerDirPath) => {
|
|
36
|
+
const entries = await readdir(ledgerDirPath, { withFileTypes: true }).catch(() => []);
|
|
37
|
+
const jsonlFileNames = entries
|
|
38
|
+
.filter((entry) => entry.isFile() && entry.name.endsWith(".jsonl"))
|
|
39
|
+
.map((entry) => entry.name)
|
|
40
|
+
.sort((left, right) => left.localeCompare(right));
|
|
41
|
+
if (jsonlFileNames.length === 0) {
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
const contentByFileName = new Map();
|
|
45
|
+
for (const fileName of jsonlFileNames) {
|
|
46
|
+
contentByFileName.set(fileName, await readUtf8File(path.join(ledgerDirPath, fileName)));
|
|
47
|
+
}
|
|
48
|
+
const specs = jsonlFileNames.map((fileName) => ({
|
|
49
|
+
command: [fileName],
|
|
50
|
+
cwd: ledgerDirPath,
|
|
51
|
+
name: fileName.replace(/\.jsonl$/u, ""),
|
|
52
|
+
output: "stdout-jsonl"
|
|
53
|
+
}));
|
|
54
|
+
// Offline exec: returns the pre-read fixture text for the named source,
|
|
55
|
+
// never spawns a process. Matches src/ledger/emitters.ts's `Exec` contract.
|
|
56
|
+
const exec = (spec) => Promise.resolve({
|
|
57
|
+
exitCode: 0,
|
|
58
|
+
stderr: "",
|
|
59
|
+
stdout: contentByFileName.get(`${spec.name}.jsonl`) ?? "",
|
|
60
|
+
timedOut: false
|
|
61
|
+
});
|
|
62
|
+
const report = await runRealConformance({ exec, specs });
|
|
63
|
+
const { expectedDenialTypes, manifestPresent } = await readExpectedDenials(ledgerDirPath);
|
|
64
|
+
return {
|
|
65
|
+
eventCount: report.eventCount,
|
|
66
|
+
events: report.events,
|
|
67
|
+
expectedDenialTypes,
|
|
68
|
+
issues: report.issues,
|
|
69
|
+
manifestPresent,
|
|
70
|
+
sources: report.sourceCounts.map((entry) => entry.source)
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
const collectStaticEvidence = async (compiledOutputDirPath, requiredSecrets) => ({
|
|
74
|
+
dockerfile: await readOptionalFile(path.join(compiledOutputDirPath, "Dockerfile")),
|
|
75
|
+
entrypoint: await readOptionalFile(path.join(compiledOutputDirPath, "entrypoint.sh")),
|
|
76
|
+
piAppSource: await readOptionalFile(path.join(compiledOutputDirPath, "runtime", "app.mjs")),
|
|
77
|
+
requiredSecrets
|
|
78
|
+
});
|
|
79
|
+
const summarize = (checks) => ({
|
|
80
|
+
failed: checks.filter((check) => check.status === "fail").length,
|
|
81
|
+
na: checks.filter((check) => check.status === "not_applicable").length,
|
|
82
|
+
passed: checks.filter((check) => check.status === "pass").length
|
|
83
|
+
});
|
|
84
|
+
/** `null` unless every ledger event shares one `run_id` (see specs/CAUSAL.md — a single audit always covers one run). */
|
|
85
|
+
const resolveRunId = (events) => {
|
|
86
|
+
if (events.length === 0) {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
const runIds = new Set(events.map((event) => event.run_id));
|
|
90
|
+
return runIds.size === 1 ? runIds.values().next().value : null;
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Orchestrator: the only I/O-performing function in src/audit/. Reads the
|
|
94
|
+
* compiled-output directory and, if given, the ledger directory, then runs
|
|
95
|
+
* the seven pure checks (checks.ts) and assembles the `AuditReport`.
|
|
96
|
+
* Deterministic across repeated calls with the same inputs except for
|
|
97
|
+
* `generated_at`.
|
|
98
|
+
*/
|
|
99
|
+
export const generateAudit = async (options) => {
|
|
100
|
+
const now = options.now ?? (() => new Date());
|
|
101
|
+
const requiredSecrets = options.requiredSecrets ?? [];
|
|
102
|
+
const [ledgerEvidence, staticEvidence] = await Promise.all([
|
|
103
|
+
options.ledgerDirPath ? collectRunLedgerEvidence(options.ledgerDirPath) : Promise.resolve(undefined),
|
|
104
|
+
collectStaticEvidence(options.compiledOutputDirPath, requiredSecrets)
|
|
105
|
+
]);
|
|
106
|
+
const checks = [
|
|
107
|
+
checkPrincipalsAuthenticated(ledgerEvidence),
|
|
108
|
+
checkDeniedLedgerVisible(ledgerEvidence),
|
|
109
|
+
checkControlWakeFailClosed(staticEvidence),
|
|
110
|
+
checkContainerNoBakedSecrets(staticEvidence),
|
|
111
|
+
checkMemoryCrossScopeCapability(ledgerEvidence),
|
|
112
|
+
checkNonMemberWriteDenied(ledgerEvidence),
|
|
113
|
+
checkProvenanceSignedReport()
|
|
114
|
+
];
|
|
115
|
+
return {
|
|
116
|
+
checks,
|
|
117
|
+
generated_at: now().toISOString(),
|
|
118
|
+
run_id: ledgerEvidence ? resolveRunId(ledgerEvidence.events) : null,
|
|
119
|
+
schema: SPAWNFILE_AUDIT_SCHEMA,
|
|
120
|
+
summary: summarize(checks)
|
|
121
|
+
};
|
|
122
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { AuditReport } from "./types.js";
|
|
3
|
+
export declare const auditReportSchema: z.ZodObject<{
|
|
4
|
+
checks: z.ZodArray<z.ZodObject<{
|
|
5
|
+
category: z.ZodEnum<{
|
|
6
|
+
provenance: "provenance";
|
|
7
|
+
causal: "causal";
|
|
8
|
+
container: "container";
|
|
9
|
+
control: "control";
|
|
10
|
+
memory: "memory";
|
|
11
|
+
network: "network";
|
|
12
|
+
}>;
|
|
13
|
+
evidence: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
14
|
+
id: z.ZodString;
|
|
15
|
+
severity: z.ZodEnum<{
|
|
16
|
+
critical: "critical";
|
|
17
|
+
high: "high";
|
|
18
|
+
medium: "medium";
|
|
19
|
+
}>;
|
|
20
|
+
status: z.ZodEnum<{
|
|
21
|
+
pass: "pass";
|
|
22
|
+
fail: "fail";
|
|
23
|
+
not_applicable: "not_applicable";
|
|
24
|
+
}>;
|
|
25
|
+
}, z.core.$strict>>;
|
|
26
|
+
generated_at: z.ZodString;
|
|
27
|
+
run_id: z.ZodNullable<z.ZodString>;
|
|
28
|
+
schema: z.ZodLiteral<"spawnfile.audit.v1">;
|
|
29
|
+
summary: z.ZodObject<{
|
|
30
|
+
failed: z.ZodNumber;
|
|
31
|
+
na: z.ZodNumber;
|
|
32
|
+
passed: z.ZodNumber;
|
|
33
|
+
}, z.core.$strict>;
|
|
34
|
+
}, z.core.$strict>;
|
|
35
|
+
export interface AuditReadError {
|
|
36
|
+
message: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Safe (non-throwing) validator. Rejects an unknown `schema` string as a
|
|
40
|
+
* top-level structural mismatch — `z.literal` already fails it — rather
|
|
41
|
+
* than accepting any string and comparing separately, so a caller cannot
|
|
42
|
+
* bypass the schema gate with a structurally-valid-but-wrong-version report.
|
|
43
|
+
*/
|
|
44
|
+
export declare const validateAuditReport: (value: unknown) => {
|
|
45
|
+
report: AuditReport;
|
|
46
|
+
} | {
|
|
47
|
+
error: AuditReadError;
|
|
48
|
+
};
|
|
49
|
+
/** Throwing counterpart of `validateAuditReport`, mirroring `envelope.ts`'s `parseCausalEvent`. */
|
|
50
|
+
export declare const readAuditReport: (value: unknown) => AuditReport;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { SPAWNFILE_AUDIT_SCHEMA } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Pure reader/validator for an existing `spawnfile.audit.v1` report — the
|
|
5
|
+
* `envelope.ts` precedent (a zod schema mirroring the hand-written
|
|
6
|
+
* `AuditReport` interface, plus a `parse*`/`validate*` pair). No I/O:
|
|
7
|
+
* callers pass already-read JSON (typically `JSON.parse`d from a file
|
|
8
|
+
* `generateAudit.ts` wrote), this module only checks shape.
|
|
9
|
+
*/
|
|
10
|
+
const auditCheckSchema = z
|
|
11
|
+
.object({
|
|
12
|
+
category: z.enum(["causal", "container", "control", "memory", "network", "provenance"]),
|
|
13
|
+
evidence: z.record(z.string(), z.unknown()),
|
|
14
|
+
id: z.string().min(1),
|
|
15
|
+
severity: z.enum(["critical", "high", "medium"]),
|
|
16
|
+
status: z.enum(["pass", "fail", "not_applicable"])
|
|
17
|
+
})
|
|
18
|
+
.strict();
|
|
19
|
+
const auditSummarySchema = z
|
|
20
|
+
.object({
|
|
21
|
+
failed: z.number().int().min(0),
|
|
22
|
+
na: z.number().int().min(0),
|
|
23
|
+
passed: z.number().int().min(0)
|
|
24
|
+
})
|
|
25
|
+
.strict();
|
|
26
|
+
export const auditReportSchema = z
|
|
27
|
+
.object({
|
|
28
|
+
checks: z.array(auditCheckSchema),
|
|
29
|
+
generated_at: z.string().min(1),
|
|
30
|
+
run_id: z.string().min(1).nullable(),
|
|
31
|
+
schema: z.literal(SPAWNFILE_AUDIT_SCHEMA),
|
|
32
|
+
summary: auditSummarySchema
|
|
33
|
+
})
|
|
34
|
+
.strict();
|
|
35
|
+
/**
|
|
36
|
+
* Safe (non-throwing) validator. Rejects an unknown `schema` string as a
|
|
37
|
+
* top-level structural mismatch — `z.literal` already fails it — rather
|
|
38
|
+
* than accepting any string and comparing separately, so a caller cannot
|
|
39
|
+
* bypass the schema gate with a structurally-valid-but-wrong-version report.
|
|
40
|
+
*/
|
|
41
|
+
export const validateAuditReport = (value) => {
|
|
42
|
+
const result = auditReportSchema.safeParse(value);
|
|
43
|
+
if (!result.success) {
|
|
44
|
+
return {
|
|
45
|
+
error: {
|
|
46
|
+
message: result.error.issues.map((issue) => `${issue.path.join(".")}: ${issue.message}`).join("; ")
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
return { report: result.data };
|
|
51
|
+
};
|
|
52
|
+
/** Throwing counterpart of `validateAuditReport`, mirroring `envelope.ts`'s `parseCausalEvent`. */
|
|
53
|
+
export const readAuditReport = (value) => {
|
|
54
|
+
const result = validateAuditReport(value);
|
|
55
|
+
if ("error" in result) {
|
|
56
|
+
throw new Error(`invalid spawnfile.audit.v1 report: ${result.error.message}`);
|
|
57
|
+
}
|
|
58
|
+
return result.report;
|
|
59
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* B54 — spawnfile.audit.v1 contract types. This module is type-only (no
|
|
3
|
+
* logic, no I/O): the schema constant plus the AuditCheck/AuditReport shapes
|
|
4
|
+
* every other file in src/audit/ produces or consumes. See AGENTS.md for the
|
|
5
|
+
* folder-wide "reports, never enforces" rule this contract exists to serve.
|
|
6
|
+
*/
|
|
7
|
+
/** Versioned schema identifier stamped on every generated report, mirroring the `noopolis.causal-event.v1` precedent (src/ledger/envelope.ts). */
|
|
8
|
+
export declare const SPAWNFILE_AUDIT_SCHEMA: "spawnfile.audit.v1";
|
|
9
|
+
/**
|
|
10
|
+
* The five ledger/runtime categories checks 1-6 are grounded in, plus
|
|
11
|
+
* "provenance" for check 7 (`provenance.signed-report`). The frozen B54
|
|
12
|
+
* packet's contract line only lists five category values; "provenance" is
|
|
13
|
+
* added here to keep every check's `id` prefix equal to its `category`
|
|
14
|
+
* (checks 1-6 already follow that pattern exactly), rather than
|
|
15
|
+
* mis-bucketing check 7 under an unrelated category. See AGENTS.md
|
|
16
|
+
* "Deviations from the frozen packet".
|
|
17
|
+
*/
|
|
18
|
+
export type AuditCheckCategory = "causal" | "container" | "control" | "memory" | "network" | "provenance";
|
|
19
|
+
export type AuditCheckStatus = "pass" | "fail" | "not_applicable";
|
|
20
|
+
export type AuditCheckSeverity = "critical" | "high" | "medium";
|
|
21
|
+
export interface AuditCheck {
|
|
22
|
+
category: AuditCheckCategory;
|
|
23
|
+
evidence: Record<string, unknown>;
|
|
24
|
+
id: string;
|
|
25
|
+
severity: AuditCheckSeverity;
|
|
26
|
+
status: AuditCheckStatus;
|
|
27
|
+
}
|
|
28
|
+
export interface AuditSummary {
|
|
29
|
+
failed: number;
|
|
30
|
+
na: number;
|
|
31
|
+
passed: number;
|
|
32
|
+
}
|
|
33
|
+
export interface AuditReport {
|
|
34
|
+
checks: AuditCheck[];
|
|
35
|
+
/** Diagnostic only — excluded from determinism comparisons (two otherwise-identical generator runs may differ only here). */
|
|
36
|
+
generated_at: string;
|
|
37
|
+
run_id: string | null;
|
|
38
|
+
schema: typeof SPAWNFILE_AUDIT_SCHEMA;
|
|
39
|
+
summary: AuditSummary;
|
|
40
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* B54 — spawnfile.audit.v1 contract types. This module is type-only (no
|
|
3
|
+
* logic, no I/O): the schema constant plus the AuditCheck/AuditReport shapes
|
|
4
|
+
* every other file in src/audit/ produces or consumes. See AGENTS.md for the
|
|
5
|
+
* folder-wide "reports, never enforces" rule this contract exists to serve.
|
|
6
|
+
*/
|
|
7
|
+
/** Versioned schema identifier stamped on every generated report, mirroring the `noopolis.causal-event.v1` precedent (src/ledger/envelope.ts). */
|
|
8
|
+
export const SPAWNFILE_AUDIT_SCHEMA = "spawnfile.audit.v1";
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CredentialProvisioningReceipt } from "./credentialProvisioningReceipt.js";
|
|
2
|
+
import type { ProvisionedCredentialMaterials } from "./credentialProvisioning.js";
|
|
3
|
+
export type ProvisionedEnvFileResult = Readonly<{
|
|
4
|
+
digest: string;
|
|
5
|
+
path: string;
|
|
6
|
+
}>;
|
|
7
|
+
export declare const writeProvisionedEnvFile: (input: Readonly<{
|
|
8
|
+
materials: ProvisionedCredentialMaterials;
|
|
9
|
+
path: string;
|
|
10
|
+
receipt: CredentialProvisioningReceipt;
|
|
11
|
+
}>) => Promise<ProvisionedEnvFileResult>;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { open, unlink } from "node:fs/promises";
|
|
3
|
+
import { TARGET_SECRET_SOURCE_ERROR } from "./targetSecretSourceRecordCommon.js";
|
|
4
|
+
const fail = () => { throw new Error(TARGET_SECRET_SOURCE_ERROR); };
|
|
5
|
+
export const writeProvisionedEnvFile = async (input) => {
|
|
6
|
+
let bytes;
|
|
7
|
+
let handle;
|
|
8
|
+
let created = false;
|
|
9
|
+
try {
|
|
10
|
+
const credentials = [...input.receipt.credentials].sort((left, right) => left.env < right.env ? -1 : left.env > right.env ? 1 : 0);
|
|
11
|
+
if (credentials.length === 0 || input.materials.size !== credentials.length)
|
|
12
|
+
fail();
|
|
13
|
+
const prefixes = credentials.map(({ env }) => new TextEncoder().encode(`${env}=`));
|
|
14
|
+
try {
|
|
15
|
+
const size = credentials.reduce((total, credential, index) => {
|
|
16
|
+
const prefix = prefixes[index] ?? fail();
|
|
17
|
+
const material = input.materials.get(credential.name) ?? fail();
|
|
18
|
+
if (!material || material.length === 0 || material.some((byte) => byte === 0 || byte === 10 || byte === 13))
|
|
19
|
+
fail();
|
|
20
|
+
return total + prefix.length + material.length + 1;
|
|
21
|
+
}, 0);
|
|
22
|
+
bytes = new Uint8Array(size);
|
|
23
|
+
let offset = 0;
|
|
24
|
+
for (const [index, credential] of credentials.entries()) {
|
|
25
|
+
const prefix = prefixes[index] ?? fail();
|
|
26
|
+
const material = input.materials.get(credential.name) ?? fail();
|
|
27
|
+
bytes.set(prefix, offset);
|
|
28
|
+
offset += prefix.length;
|
|
29
|
+
bytes.set(material, offset);
|
|
30
|
+
offset += material.length;
|
|
31
|
+
bytes[offset] = 10;
|
|
32
|
+
offset += 1;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
for (const prefix of prefixes)
|
|
37
|
+
prefix.fill(0);
|
|
38
|
+
}
|
|
39
|
+
handle = await open(input.path, "wx", 0o600);
|
|
40
|
+
created = true;
|
|
41
|
+
await handle.chmod(0o600);
|
|
42
|
+
await handle.writeFile(bytes);
|
|
43
|
+
await handle.sync();
|
|
44
|
+
const digest = `sha256:${createHash("sha256").update(bytes).digest("hex")}`;
|
|
45
|
+
await handle.close();
|
|
46
|
+
handle = undefined;
|
|
47
|
+
return Object.freeze({ digest, path: input.path });
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
await handle?.close().catch(() => undefined);
|
|
51
|
+
handle = undefined;
|
|
52
|
+
if (created)
|
|
53
|
+
await unlink(input.path).catch(() => undefined);
|
|
54
|
+
return fail();
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
bytes?.fill(0);
|
|
58
|
+
await handle?.close().catch(() => undefined);
|
|
59
|
+
}
|
|
60
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type CredentialProvisioningReceipt } from "./credentialProvisioningReceipt.js";
|
|
2
|
+
import type { CredentialProvisioningRequest } from "./credentialProvisioningRequest.js";
|
|
3
|
+
import type { TargetSecretSourceLifecycle } from "./targetSecretSourceLifecycle.js";
|
|
4
|
+
export type ProvisionedCredentialMaterials = Map<string, Uint8Array>;
|
|
5
|
+
export type CredentialProvisioningEntropy = (bytes: number) => Uint8Array;
|
|
6
|
+
export interface CredentialProvisioningOptions {
|
|
7
|
+
readonly entropy?: CredentialProvisioningEntropy;
|
|
8
|
+
readonly lifecycle?: Pick<TargetSecretSourceLifecycle, "author" | "grant">;
|
|
9
|
+
}
|
|
10
|
+
export type ProvisionedCredentials = Readonly<{
|
|
11
|
+
materials: ProvisionedCredentialMaterials;
|
|
12
|
+
receipt: CredentialProvisioningReceipt;
|
|
13
|
+
}>;
|
|
14
|
+
export declare const disposeProvisionedMaterials: (materials: ProvisionedCredentialMaterials) => void;
|
|
15
|
+
export declare const provisionCredentials: (request: CredentialProvisioningRequest, options?: CredentialProvisioningOptions) => Promise<ProvisionedCredentials>;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Buffer } from "node:buffer";
|
|
2
|
+
import { randomBytes } from "node:crypto";
|
|
3
|
+
import { createCredentialProvisioningReceipt } from "./credentialProvisioningReceipt.js";
|
|
4
|
+
import { TARGET_SECRET_SOURCE_ERROR, createCanonicalTargetSecretSourceJson } from "./targetSecretSourceRecordCommon.js";
|
|
5
|
+
const fail = () => { throw new Error(TARGET_SECRET_SOURCE_ERROR); };
|
|
6
|
+
const defaultEntropy = (size) => {
|
|
7
|
+
const bytes = randomBytes(size);
|
|
8
|
+
try {
|
|
9
|
+
return Uint8Array.from(bytes);
|
|
10
|
+
}
|
|
11
|
+
finally {
|
|
12
|
+
bytes.fill(0);
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
const generatedToken = (size, entropy) => {
|
|
16
|
+
let raw;
|
|
17
|
+
let encoded;
|
|
18
|
+
try {
|
|
19
|
+
raw = entropy(size);
|
|
20
|
+
if (!(raw instanceof Uint8Array) || raw.length !== size)
|
|
21
|
+
fail();
|
|
22
|
+
encoded = Buffer.from(raw);
|
|
23
|
+
return new TextEncoder().encode(encoded.toString("hex"));
|
|
24
|
+
}
|
|
25
|
+
finally {
|
|
26
|
+
encoded?.fill(0);
|
|
27
|
+
raw?.fill(0);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
export const disposeProvisionedMaterials = (materials) => {
|
|
31
|
+
for (const material of materials.values())
|
|
32
|
+
material.fill(0);
|
|
33
|
+
materials.clear();
|
|
34
|
+
};
|
|
35
|
+
export const provisionCredentials = async (request, options = {}) => {
|
|
36
|
+
const materials = new Map();
|
|
37
|
+
try {
|
|
38
|
+
const lifecycle = options.lifecycle
|
|
39
|
+
?? await (await import("./targetSecretSourceLifecycle.js")).initializeTargetSecretSourceLifecycle();
|
|
40
|
+
const entropy = options.entropy ?? defaultEntropy;
|
|
41
|
+
for (const credential of request.credentials) {
|
|
42
|
+
const material = credential.kind === "generated-token"
|
|
43
|
+
? generatedToken(credential.bytes, entropy)
|
|
44
|
+
: createCanonicalTargetSecretSourceJson(credential.content);
|
|
45
|
+
materials.set(credential.name, material);
|
|
46
|
+
}
|
|
47
|
+
const sources = new Map();
|
|
48
|
+
for (const credential of request.credentials) {
|
|
49
|
+
const material = materials.get(credential.name) ?? fail();
|
|
50
|
+
const authored = await lifecycle.author(material);
|
|
51
|
+
sources.set(credential.name, authored.source_handle);
|
|
52
|
+
}
|
|
53
|
+
for (const credential of request.credentials) {
|
|
54
|
+
const sourceHandle = sources.get(credential.name);
|
|
55
|
+
const granted = await lifecycle.grant({
|
|
56
|
+
descriptor_digest: request.descriptor_digest,
|
|
57
|
+
name: credential.name,
|
|
58
|
+
run_id: request.run_id,
|
|
59
|
+
scope: request.scope,
|
|
60
|
+
selected_target: request.selected_target,
|
|
61
|
+
source_handle: sourceHandle
|
|
62
|
+
});
|
|
63
|
+
if (granted.source_handle !== sourceHandle)
|
|
64
|
+
fail();
|
|
65
|
+
}
|
|
66
|
+
return Object.freeze({
|
|
67
|
+
materials,
|
|
68
|
+
receipt: createCredentialProvisioningReceipt({ request, source_handles: sources })
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
disposeProvisionedMaterials(materials);
|
|
73
|
+
return fail();
|
|
74
|
+
}
|
|
75
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { CredentialProvisioningRequest } from "./credentialProvisioningRequest.js";
|
|
2
|
+
import { type OpaqueTargetSecretSourceHandle } from "./targetSecretSourceRecordCommon.js";
|
|
3
|
+
export declare const CREDENTIAL_PROVISIONING_RECEIPT_VERSION: "spawnfile.auth.credential-provisioning.receipt.v1";
|
|
4
|
+
export type CredentialProvisioningPhase = "author" | "grant" | "model_engine_auth" | "env_file" | "world_bindings";
|
|
5
|
+
export type CredentialProvisioningReceiptCredential = Readonly<{
|
|
6
|
+
env: string;
|
|
7
|
+
name: string;
|
|
8
|
+
scope: string;
|
|
9
|
+
source_handle: OpaqueTargetSecretSourceHandle;
|
|
10
|
+
}>;
|
|
11
|
+
export type CredentialProvisioningReceipt = Readonly<{
|
|
12
|
+
credentials: readonly CredentialProvisioningReceiptCredential[];
|
|
13
|
+
env_file_digest?: string;
|
|
14
|
+
phases: readonly CredentialProvisioningPhase[];
|
|
15
|
+
run_id: string;
|
|
16
|
+
scope: string;
|
|
17
|
+
version: typeof CREDENTIAL_PROVISIONING_RECEIPT_VERSION;
|
|
18
|
+
world_bindings_digest?: string;
|
|
19
|
+
}>;
|
|
20
|
+
export declare const createCredentialProvisioningReceipt: (input: Readonly<{
|
|
21
|
+
request: CredentialProvisioningRequest;
|
|
22
|
+
source_handles: ReadonlyMap<string, unknown>;
|
|
23
|
+
}>) => CredentialProvisioningReceipt;
|
|
24
|
+
export declare const finalizeCredentialProvisioningReceipt: (receipt: CredentialProvisioningReceipt, outputs: Readonly<{
|
|
25
|
+
env_file_digest?: string;
|
|
26
|
+
model_engine_auth?: boolean;
|
|
27
|
+
world_bindings_digest?: string;
|
|
28
|
+
}>) => CredentialProvisioningReceipt;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { TARGET_SECRET_SOURCE_ERROR, parseTargetSecretSourceOpaqueHandle } from "./targetSecretSourceRecordCommon.js";
|
|
2
|
+
export const CREDENTIAL_PROVISIONING_RECEIPT_VERSION = "spawnfile.auth.credential-provisioning.receipt.v1";
|
|
3
|
+
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
4
|
+
const fail = () => { throw new Error(TARGET_SECRET_SOURCE_ERROR); };
|
|
5
|
+
const digest = (raw) => typeof raw === "string" && DIGEST.test(raw) ? raw : fail();
|
|
6
|
+
export const createCredentialProvisioningReceipt = (input) => {
|
|
7
|
+
try {
|
|
8
|
+
const credentials = input.request.credentials.map((credential) => {
|
|
9
|
+
const sourceHandle = input.source_handles.get(credential.name);
|
|
10
|
+
return Object.freeze({
|
|
11
|
+
env: credential.env,
|
|
12
|
+
name: credential.name,
|
|
13
|
+
scope: input.request.scope,
|
|
14
|
+
source_handle: parseTargetSecretSourceOpaqueHandle(sourceHandle)
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
if (input.source_handles.size !== credentials.length)
|
|
18
|
+
fail();
|
|
19
|
+
return Object.freeze({
|
|
20
|
+
credentials: Object.freeze(credentials),
|
|
21
|
+
phases: Object.freeze(["author", "grant"]),
|
|
22
|
+
run_id: input.request.run_id,
|
|
23
|
+
scope: input.request.scope,
|
|
24
|
+
version: CREDENTIAL_PROVISIONING_RECEIPT_VERSION
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return fail();
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
export const finalizeCredentialProvisioningReceipt = (receipt, outputs) => {
|
|
32
|
+
try {
|
|
33
|
+
if (receipt.version !== CREDENTIAL_PROVISIONING_RECEIPT_VERSION
|
|
34
|
+
|| receipt.phases.length !== 2
|
|
35
|
+
|| receipt.phases[0] !== "author"
|
|
36
|
+
|| receipt.phases[1] !== "grant")
|
|
37
|
+
fail();
|
|
38
|
+
const credentials = receipt.credentials.map((credential) => Object.freeze({
|
|
39
|
+
env: credential.env,
|
|
40
|
+
name: credential.name,
|
|
41
|
+
scope: credential.scope,
|
|
42
|
+
source_handle: parseTargetSecretSourceOpaqueHandle(credential.source_handle)
|
|
43
|
+
}));
|
|
44
|
+
const envFileDigest = outputs.env_file_digest === undefined
|
|
45
|
+
? undefined
|
|
46
|
+
: digest(outputs.env_file_digest);
|
|
47
|
+
const worldBindingsDigest = outputs.world_bindings_digest === undefined
|
|
48
|
+
? undefined
|
|
49
|
+
: digest(outputs.world_bindings_digest);
|
|
50
|
+
const phases = ["author", "grant"];
|
|
51
|
+
if (outputs.model_engine_auth === true)
|
|
52
|
+
phases.push("model_engine_auth");
|
|
53
|
+
if (envFileDigest !== undefined)
|
|
54
|
+
phases.push("env_file");
|
|
55
|
+
if (worldBindingsDigest !== undefined)
|
|
56
|
+
phases.push("world_bindings");
|
|
57
|
+
return Object.freeze({
|
|
58
|
+
credentials: Object.freeze(credentials),
|
|
59
|
+
...(envFileDigest === undefined ? {} : { env_file_digest: envFileDigest }),
|
|
60
|
+
phases: Object.freeze(phases),
|
|
61
|
+
run_id: receipt.run_id,
|
|
62
|
+
scope: receipt.scope,
|
|
63
|
+
version: CREDENTIAL_PROVISIONING_RECEIPT_VERSION,
|
|
64
|
+
...(worldBindingsDigest === undefined ? {} : { world_bindings_digest: worldBindingsDigest })
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return fail();
|
|
69
|
+
}
|
|
70
|
+
};
|