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
package/README.md
CHANGED
|
@@ -20,6 +20,26 @@ It's not a runtime-to-runtime translator. The compiler starts from the canonical
|
|
|
20
20
|
|
|
21
21
|
Pairs with [**Moltnet**](https://moltnet.dev) as the first provider for `team.networks[]`, letting compiled agents share declared rooms, DMs, and history across runtimes without Spawnfile injecting its own message router.
|
|
22
22
|
|
|
23
|
+
For a Simfile linked to a Spawnfile, the product entrypoint is owned by
|
|
24
|
+
Simfile:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
simfile run ./Simfile --view
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
That command delegates only organization lifecycle operations to Spawnfile's
|
|
31
|
+
public CLI and versioned receipts. Spawnfile prepares target resources,
|
|
32
|
+
deploys the organization, records the pinned Pi-bridge Moltnet identity,
|
|
33
|
+
exports evidence, and cleans up; it does not carry simulation behavior or
|
|
34
|
+
trigger cognition. The world reaches paused/pristine readiness first, the
|
|
35
|
+
organization starts second, and one attested activation releases independent
|
|
36
|
+
world ticks and organization-owned schedules. A separately manifested
|
|
37
|
+
`simfile.world-decision-claim.v1` capability may extend the base world-sidecar
|
|
38
|
+
ABI without changing it. See
|
|
39
|
+
[`specs/ECOSYSTEM_RUNTIME_BOUNDARIES.md`](specs/ECOSYSTEM_RUNTIME_BOUNDARIES.md)
|
|
40
|
+
for ownership and [`specs/TARGETS.md`](specs/TARGETS.md) for target, auth,
|
|
41
|
+
Moltnet pinning, recovery, and cleanup contracts.
|
|
42
|
+
|
|
23
43
|
## Install
|
|
24
44
|
|
|
25
45
|
```bash
|
|
@@ -49,7 +69,7 @@ spawnfile status . --live # inspect the detached deployme
|
|
|
49
69
|
spawnfile publish . --tag you/my-agent:1.0.0 # compile + build + verify + push
|
|
50
70
|
```
|
|
51
71
|
|
|
52
|
-
Compiled output lands under `.spawn/` by default, including a `Dockerfile`, `entrypoint.sh`, `.env.example`, and a prebuilt `container/rootfs/` tree. `spawnfile build` uses the pinned runtime artifacts from `runtimes.yaml`; it does not rebuild runtimes from source. Daimon, OpenClaw, and PicoClaw use published copyable artifact images by default, so normal prompt/config edits reuse their dependency layers. To test a local runtime artifact instead, set `SPAWNFILE_DAIMON_RUNTIME_IMAGE`, `SPAWNFILE_OPENCLAW_RUNTIME_IMAGE`, or `SPAWNFILE_PICOCLAW_RUNTIME_IMAGE` to a local image tag. For
|
|
72
|
+
Compiled output lands under `.spawn/` by default, including a `Dockerfile`, `entrypoint.sh`, `.env.example`, and a prebuilt `container/rootfs/` tree. `spawnfile build` uses the pinned runtime artifacts from `runtimes.yaml`; it does not rebuild runtimes from source. Daimon, OpenClaw, and PicoClaw use published copyable artifact images by default, so normal prompt/config edits reuse their dependency layers. To test a local runtime artifact instead, set `SPAWNFILE_DAIMON_RUNTIME_IMAGE`, `SPAWNFILE_OPENCLAW_RUNTIME_IMAGE`, or `SPAWNFILE_PICOCLAW_RUNTIME_IMAGE` to a local image tag. For `build`/`up` on a docker `--context`, Moltnet release assets are staged for that context's architecture (`amd64` or `arm64`); for local-only manual compile targeting a fixed architecture, set `SPAWNFILE_MOLTNET_TARGET_ARCH=amd64|arm64`.
|
|
53
73
|
|
|
54
74
|
`spawnfile status` is read-only. By default it shows authored and compiled state without Docker, runtime, or Moltnet calls. With `--live`, it reads the selected detached deployment record, inspects the recorded Docker target, runs adapter-owned runtime probes, and checks Moltnet metadata without reading message bodies. Add `--logs` for a redacted Docker log tail, or `--watch` to refresh status continuously. For a remote Docker context where the local record is missing, pass `--context <name>` with `--live` to recover the deployment from Spawnfile container labels.
|
|
55
75
|
|
|
@@ -57,6 +77,33 @@ Compiled output lands under `.spawn/` by default, including a `Dockerfile`, `ent
|
|
|
57
77
|
|
|
58
78
|
Compiled images are self-describing: `spawnfile publish` pushes one to any OCI registry, and anyone can run it with no source — `spawnfile up you/my-agent:1.0.0 --deployment prod --detach --auth-profile me` — or inspect what it needs first with `spawnfile status you/my-agent:1.0.0`. See [`specs/DISTRIBUTION.md`](specs/DISTRIBUTION.md).
|
|
59
79
|
|
|
80
|
+
### Target adapter CLI
|
|
81
|
+
|
|
82
|
+
`spawnfile target` is the explicit, non-interactive target-adapter boundary for
|
|
83
|
+
an external orchestrator. It takes one absolute request JSON file and one
|
|
84
|
+
strict private configuration object on standard input — never a configuration
|
|
85
|
+
path or inline configuration:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
target-config-producer | spawnfile target --config - create_data_network /absolute/path/request.json
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
On success it writes exactly one canonical JSON receipt followed by a newline.
|
|
92
|
+
|
|
93
|
+
For a crash-safe machine caller handoff, project-mode `up --json`, `artifacts export
|
|
94
|
+
--json`, and `down --json` accept `--lifecycle-invocation lci_<stable-id>`. Spawnfile
|
|
95
|
+
binds that id to the exact operation, correlation, and request policy, atomically stores
|
|
96
|
+
the exact JSON bytes after the owner returns and before stdout, and rejects reuse with
|
|
97
|
+
drift. `spawnfile lifecycle lookup <id>` is read-only and returns one versioned state:
|
|
98
|
+
`not_applied`, `pending`, `completed`, or `ambiguous`, without Docker/provider
|
|
99
|
+
inspection. Recovery only resumes an operation when that command verifies exact durable
|
|
100
|
+
evidence that resumption is safe; otherwise it seals `ambiguous` and fails closed.
|
|
101
|
+
It writes no secret values to output or diagnostics. The full verb list,
|
|
102
|
+
request/receipt contract, and exit behavior are in [`specs/TARGETS.md`](specs/TARGETS.md).
|
|
103
|
+
`target lookup_operation` accepts the original mutation request with a minimal
|
|
104
|
+
read-only context config and reports `completed`, `pending`, or `not_applied`
|
|
105
|
+
without calling the target provider or changing its journal.
|
|
106
|
+
|
|
60
107
|
Declare external credentials in `secrets:` and provide values through an ignored env file or the shell environment. `spawnfile auth sync --env-file .env` stores declared model auth and project secrets in a local auth profile; `spawnfile run --env-file .env` can inject the same values directly for a single run. This is the intended pattern for credentials like `GH_TOKEN`, MCP tokens, and provider API keys.
|
|
61
108
|
|
|
62
109
|
## Project structure
|
|
@@ -105,8 +152,6 @@ v0.1 targets autonomous agent runtimes that share a markdown workspace identity
|
|
|
105
152
|
| OpenClaw | active | ✅ | Discord, Telegram, WhatsApp, Slack |
|
|
106
153
|
| PicoClaw | active | | Discord, Telegram, Slack (WhatsApp blocked) |
|
|
107
154
|
| Pi | active | | Embedded org app, Moltnet client config |
|
|
108
|
-
| NullClaw | exploratory | | No active adapter yet |
|
|
109
|
-
| ZeroClaw | exploratory | | No active adapter yet |
|
|
110
155
|
| OpenFang | exploratory | | No active adapter yet |
|
|
111
156
|
| Hermes Agent | exploratory | | No active adapter yet |
|
|
112
157
|
| OpenCode | exploratory | | No active adapter yet |
|
|
@@ -131,7 +176,7 @@ The source-of-truth specs live in this repo:
|
|
|
131
176
|
- [`specs/SURFACES.md`](specs/SURFACES.md) — messaging surface model
|
|
132
177
|
- [`specs/STATUS.md`](specs/STATUS.md) — static and live operational status
|
|
133
178
|
- [`specs/DISTRIBUTION.md`](specs/DISTRIBUTION.md) — image distribution, publish, and sourceless run
|
|
134
|
-
- [`fixtures/`](fixtures/) — canonical example projects
|
|
179
|
+
- [`test/fixtures/`](test/fixtures/) — canonical example projects
|
|
135
180
|
|
|
136
181
|
## From source
|
|
137
182
|
|
|
@@ -144,16 +189,10 @@ npm run build
|
|
|
144
189
|
npm link
|
|
145
190
|
```
|
|
146
191
|
|
|
147
|
-
To clone pinned runtimes and generate reference blueprints:
|
|
148
|
-
|
|
149
|
-
```bash
|
|
150
|
-
npm run runtimes:sync
|
|
151
|
-
```
|
|
152
|
-
|
|
153
192
|
For local development without linking globally:
|
|
154
193
|
|
|
155
194
|
```bash
|
|
156
|
-
npm run dev -- validate fixtures/single-agent
|
|
195
|
+
npm run dev -- validate test/fixtures/single-agent
|
|
157
196
|
```
|
|
158
197
|
|
|
159
198
|
## Contributing
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface AuditCliOptions {
|
|
2
|
+
compiledOutput?: string;
|
|
3
|
+
fixtures?: string;
|
|
4
|
+
ledger?: string;
|
|
5
|
+
out?: string;
|
|
6
|
+
requiredSecret?: string[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* `npm run audit:generate` entry point / `tsx src/audit/auditCli.ts`. Two
|
|
10
|
+
* input modes: `--fixtures <dir>` treats one directory as BOTH the
|
|
11
|
+
* compiled-output root (`Dockerfile`/`entrypoint.sh`/`runtime/app.mjs`) and
|
|
12
|
+
* the ledger root (`*.jsonl` + `expected-denials.json`) — the shape every
|
|
13
|
+
* `src/audit/fixtures/<name>/` directory uses. `--compiled-output <dir>` /
|
|
14
|
+
* `--ledger <dir>` set them independently, for a real `spawnfile compile`
|
|
15
|
+
* output paired with a separately-located ledger capture. Prints the report
|
|
16
|
+
* JSON to stdout (or writes it to `--out <path>`), a one-line summary to
|
|
17
|
+
* stderr, and exits 1 if any check failed.
|
|
18
|
+
*/
|
|
19
|
+
export declare const runAuditCli: (argv: string[]) => Promise<void>;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { Command } from "commander";
|
|
4
|
+
import { generateAudit } from "./generateAudit.js";
|
|
5
|
+
const collectRepeatable = (value, previous) => [...previous, value];
|
|
6
|
+
/**
|
|
7
|
+
* `npm run audit:generate` entry point / `tsx src/audit/auditCli.ts`. Two
|
|
8
|
+
* input modes: `--fixtures <dir>` treats one directory as BOTH the
|
|
9
|
+
* compiled-output root (`Dockerfile`/`entrypoint.sh`/`runtime/app.mjs`) and
|
|
10
|
+
* the ledger root (`*.jsonl` + `expected-denials.json`) — the shape every
|
|
11
|
+
* `src/audit/fixtures/<name>/` directory uses. `--compiled-output <dir>` /
|
|
12
|
+
* `--ledger <dir>` set them independently, for a real `spawnfile compile`
|
|
13
|
+
* output paired with a separately-located ledger capture. Prints the report
|
|
14
|
+
* JSON to stdout (or writes it to `--out <path>`), a one-line summary to
|
|
15
|
+
* stderr, and exits 1 if any check failed.
|
|
16
|
+
*/
|
|
17
|
+
export const runAuditCli = async (argv) => {
|
|
18
|
+
const command = new Command();
|
|
19
|
+
command
|
|
20
|
+
.name("spawnfile audit:generate")
|
|
21
|
+
.description("Generate a deterministic offline spawnfile.audit.v1 security-audit report")
|
|
22
|
+
.option("--fixtures <dir>", "Directory used as both the compiled-output and ledger root")
|
|
23
|
+
.option("--compiled-output <dir>", "Compiled-output directory (Dockerfile/entrypoint.sh/runtime/app.mjs)")
|
|
24
|
+
.option("--ledger <dir>", "Ledger directory (*.jsonl + expected-denials.json)")
|
|
25
|
+
.option("--required-secret <name>", "Required secret env var name (repeatable)", collectRepeatable, [])
|
|
26
|
+
.option("--out <path>", "Write the report JSON to this path instead of stdout");
|
|
27
|
+
await command.parseAsync(argv, { from: "user" });
|
|
28
|
+
const options = command.opts();
|
|
29
|
+
const compiledOutputDirPath = options.compiledOutput ?? options.fixtures;
|
|
30
|
+
const ledgerDirPath = options.ledger ?? options.fixtures;
|
|
31
|
+
if (!compiledOutputDirPath) {
|
|
32
|
+
throw new Error("audit:generate requires --fixtures <dir> or --compiled-output <dir>");
|
|
33
|
+
}
|
|
34
|
+
const report = await generateAudit({
|
|
35
|
+
compiledOutputDirPath,
|
|
36
|
+
ledgerDirPath,
|
|
37
|
+
requiredSecrets: options.requiredSecret
|
|
38
|
+
});
|
|
39
|
+
const json = `${JSON.stringify(report, null, 2)}\n`;
|
|
40
|
+
if (options.out) {
|
|
41
|
+
await writeFile(path.resolve(options.out), json, "utf8");
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
process.stdout.write(json);
|
|
45
|
+
}
|
|
46
|
+
process.stderr.write(`spawnfile audit: ${report.summary.passed} passed, ${report.summary.failed} failed, ${report.summary.na} n/a\n`);
|
|
47
|
+
if (report.summary.failed > 0) {
|
|
48
|
+
process.exitCode = 1;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
// Only run when invoked directly (`tsx src/audit/auditCli.ts ...`), never on
|
|
52
|
+
// import — this keeps `runAuditCli` safely testable in isolation. Not
|
|
53
|
+
// unit-testable itself (import.meta.url never equals process.argv[1] under
|
|
54
|
+
// vitest), mirroring how src/ledger/causalConformanceCli.ts's own bottom
|
|
55
|
+
// bootstrap is excluded from coverage.
|
|
56
|
+
/* v8 ignore start -- process entrypoint bootstrap, exercised by `npm run audit:generate` / the CLI-run validate step, not by unit tests */
|
|
57
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
58
|
+
runAuditCli(process.argv.slice(2)).catch((error) => {
|
|
59
|
+
process.stderr.write(`${error instanceof Error ? (error.stack ?? error.message) : String(error)}\n`);
|
|
60
|
+
process.exitCode = 1;
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
/* v8 ignore stop */
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import type { RunLedgerEvidence, StaticContainerEvidence } from "./checksShared.js";
|
|
2
|
+
import type { AuditCheck } from "./types.js";
|
|
3
|
+
export type { RunLedgerEvidence, StaticContainerEvidence } from "./checksShared.js";
|
|
4
|
+
/**
|
|
5
|
+
* Check 1 — `causal.principals-authenticated` (run). Grounded in
|
|
6
|
+
* `runRealConformance` reporting zero issues over the ledger jsonl, and in
|
|
7
|
+
* `isAuthenticatedPrincipal` (src/ledger/principal.ts:87) rejecting a bare,
|
|
8
|
+
* literal-`anonymous`, or `system:moltnet.anonymous` principal
|
|
9
|
+
* (principal.ts:45,93). Fails on either a nonempty `issues` list (any
|
|
10
|
+
* schema/seq/payload/principal/chain problem `runRealConformance` found) or
|
|
11
|
+
* an event whose `principal_id` is not authenticated — evidence names the
|
|
12
|
+
* offending event and principal directly rather than relying on issue-
|
|
13
|
+
* message string matching.
|
|
14
|
+
*/
|
|
15
|
+
export declare const checkPrincipalsAuthenticated: (evidence: RunLedgerEvidence | undefined) => AuditCheck;
|
|
16
|
+
/**
|
|
17
|
+
* Check 2 — `causal.denied-ledger-visible` (run). Grounded in
|
|
18
|
+
* `DEFAULT_PAYLOAD_MINIMUMS` (conformance.ts:67-69) for every `*.denied`
|
|
19
|
+
* type: any such event that appears must carry its required keys. Also
|
|
20
|
+
* detects a silent drop — this fixture's `expected-denials.json` asserted a
|
|
21
|
+
* denial type occurred, but no matching `*.denied` event exists in the
|
|
22
|
+
* ledger — which fails even when every event that *is* present is well
|
|
23
|
+
* shaped.
|
|
24
|
+
*
|
|
25
|
+
* `not_applicable`, never `pass`, when there is no `expected-denials.json`
|
|
26
|
+
* manifest AND zero `*.denied` events are present in the ledger — with
|
|
27
|
+
* neither an assertion to check against nor an event to inspect, there is
|
|
28
|
+
* nothing here to actually assess (see AGENTS.md's cardinal rule: absent
|
|
29
|
+
* evidence is `not_applicable`, never `pass`). A manifest being present is
|
|
30
|
+
* enough to keep evaluating (silent-drop detection needs no observed event
|
|
31
|
+
* to fire), and any `*.denied` event that *is* present is always
|
|
32
|
+
* key-validated regardless of manifest presence.
|
|
33
|
+
*/
|
|
34
|
+
export declare const checkDeniedLedgerVisible: (evidence: RunLedgerEvidence | undefined) => AuditCheck;
|
|
35
|
+
/**
|
|
36
|
+
* Check 3 — `control.wake-fail-closed` (static). Grounded in
|
|
37
|
+
* appControlSource.ts:31-47 (B62 Option B): the operator wake endpoint must
|
|
38
|
+
* fail closed when `SPAWNFILE_PI_CONTROL_TOKEN` is unset, never treat an
|
|
39
|
+
* unset token as "auth disabled". Passes only when the compiled Pi app
|
|
40
|
+
* source references the token env, contains the verbatim fail-closed
|
|
41
|
+
* rejection text, and never bakes a literal default value for it.
|
|
42
|
+
*/
|
|
43
|
+
export declare const checkControlWakeFailClosed: (evidence: StaticContainerEvidence) => AuditCheck;
|
|
44
|
+
/**
|
|
45
|
+
* Check 4 — `container.no-baked-secrets` (static). Grounded in
|
|
46
|
+
* containerEntrypointRender.ts:232-233: every required secret is emitted as
|
|
47
|
+
* a `require_env <name>` runtime check, never a literal value baked into the
|
|
48
|
+
* Dockerfile build layer or the entrypoint script. Passes only when every
|
|
49
|
+
* `requiredSecrets` name is `require_env`-guarded in the entrypoint AND no
|
|
50
|
+
* name is ever followed by a literal (non-`$`) assignment anywhere in the
|
|
51
|
+
* compiled Dockerfile/entrypoint text.
|
|
52
|
+
*/
|
|
53
|
+
export declare const checkContainerNoBakedSecrets: (evidence: StaticContainerEvidence) => AuditCheck;
|
|
54
|
+
/**
|
|
55
|
+
* Check 5 — `memory.cross-scope-capability` (run). Grounded in mneme's
|
|
56
|
+
* `mneme.cap.system.v1` foreign-scope escalation capability
|
|
57
|
+
* (ecosystem/mneme/src/policy/capability.ts:28) and the
|
|
58
|
+
* `memory.write.denied` payload minimum (conformance.ts:68:
|
|
59
|
+
* `requested_scope`, `reason`). `mneme.cap.system.v1` is carried as an
|
|
60
|
+
* informational `grounding` string only — this function performs no static
|
|
61
|
+
* check against mneme's source, so the status is never driven by that
|
|
62
|
+
* literal.
|
|
63
|
+
*
|
|
64
|
+
* `not_applicable`, never `pass`, when no `memory.write.denied` event is
|
|
65
|
+
* present in the ledger: enforcement was never exercised in this run, and
|
|
66
|
+
* "nothing to violate" is not evidence the capability guard works (see
|
|
67
|
+
* AGENTS.md). When one or more denial events are present, every one must
|
|
68
|
+
* carry both `requested_scope` and `reason` to pass.
|
|
69
|
+
*/
|
|
70
|
+
export declare const checkMemoryCrossScopeCapability: (evidence: RunLedgerEvidence | undefined) => AuditCheck;
|
|
71
|
+
/**
|
|
72
|
+
* Check 6 — `network.non-member-write-denied` (run). Grounded in moltnet's
|
|
73
|
+
* `writeForbiddenError` (ecosystem/moltnet/internal/rooms/access_policy.go:23,71-72)
|
|
74
|
+
* and the `message.denied` payload minimum (conformance.ts:67: `target`,
|
|
75
|
+
* `reason`, `content_sha256`). The `writeForbiddenError` path is carried as
|
|
76
|
+
* an informational `grounding` string only — this function performs no
|
|
77
|
+
* static check against moltnet's source, so the status is never driven by
|
|
78
|
+
* that literal.
|
|
79
|
+
*
|
|
80
|
+
* `not_applicable`, never `pass`, when no `message.denied` event is present:
|
|
81
|
+
* non-member-write enforcement was never exercised in this run, which is not
|
|
82
|
+
* evidence it works (see AGENTS.md). When one or more denial events are
|
|
83
|
+
* present, every one must carry `target`, `reason`, and `content_sha256` to
|
|
84
|
+
* pass.
|
|
85
|
+
*/
|
|
86
|
+
export declare const checkNonMemberWriteDenied: (evidence: RunLedgerEvidence | undefined) => AuditCheck;
|
|
87
|
+
/**
|
|
88
|
+
* Check 7 — `provenance.signed-report` — always `not_applicable`. Report
|
|
89
|
+
* signing/provenance is deferred to B66; this audit generator has no
|
|
90
|
+
* signing input to check and must never claim it. Takes no evidence input
|
|
91
|
+
* on purpose: there is nothing yet for it to inspect.
|
|
92
|
+
*/
|
|
93
|
+
export declare const checkProvenanceSignedReport: () => AuditCheck;
|
|
94
|
+
/**
|
|
95
|
+
* The seven check ids in the order `generateAudit.ts` assembles
|
|
96
|
+
* `AuditReport.checks` in (each check function above takes a different
|
|
97
|
+
* evidence shape, so this is a documentation/ordering list only — not a
|
|
98
|
+
* uniformly-callable array).
|
|
99
|
+
*/
|
|
100
|
+
export declare const AUDIT_CHECK_IDS: readonly ["causal.principals-authenticated", "causal.denied-ledger-visible", "control.wake-fail-closed", "container.no-baked-secrets", "memory.cross-scope-capability", "network.non-member-write-denied", "provenance.signed-report"];
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
// Not re-exported by src/ledger/index.js's barrel (see conformance.ts, which
|
|
2
|
+
// also imports it directly from principal.js rather than through the
|
|
3
|
+
// barrel); mirrored here for the same reason.
|
|
4
|
+
import { isAuthenticatedPrincipal } from "../ledger/principal.js";
|
|
5
|
+
import { CONTROL_TOKEN_ENV, DENIAL_MINIMUMS_BY_TYPE, escapeRegExp, FAIL_CLOSED_MARKER, literalAssignmentPattern, missingRequiredKeys, notApplicable, statusFor } from "./checksShared.js";
|
|
6
|
+
/**
|
|
7
|
+
* Check 1 — `causal.principals-authenticated` (run). Grounded in
|
|
8
|
+
* `runRealConformance` reporting zero issues over the ledger jsonl, and in
|
|
9
|
+
* `isAuthenticatedPrincipal` (src/ledger/principal.ts:87) rejecting a bare,
|
|
10
|
+
* literal-`anonymous`, or `system:moltnet.anonymous` principal
|
|
11
|
+
* (principal.ts:45,93). Fails on either a nonempty `issues` list (any
|
|
12
|
+
* schema/seq/payload/principal/chain problem `runRealConformance` found) or
|
|
13
|
+
* an event whose `principal_id` is not authenticated — evidence names the
|
|
14
|
+
* offending event and principal directly rather than relying on issue-
|
|
15
|
+
* message string matching.
|
|
16
|
+
*/
|
|
17
|
+
export const checkPrincipalsAuthenticated = (evidence) => {
|
|
18
|
+
const id = "causal.principals-authenticated";
|
|
19
|
+
const category = "causal";
|
|
20
|
+
const severity = "critical";
|
|
21
|
+
if (!evidence) {
|
|
22
|
+
return notApplicable(id, category, severity, "no run artifacts provided");
|
|
23
|
+
}
|
|
24
|
+
const offendingPrincipals = evidence.events
|
|
25
|
+
.filter((event) => !isAuthenticatedPrincipal(event.principal_id))
|
|
26
|
+
.map((event) => ({ event_id: event.event_id, principal_id: event.principal_id }));
|
|
27
|
+
return {
|
|
28
|
+
category,
|
|
29
|
+
evidence: {
|
|
30
|
+
eventCount: evidence.eventCount,
|
|
31
|
+
issueCount: evidence.issues.length,
|
|
32
|
+
offendingPrincipals,
|
|
33
|
+
sources: evidence.sources
|
|
34
|
+
},
|
|
35
|
+
id,
|
|
36
|
+
severity,
|
|
37
|
+
status: statusFor(evidence.issues.length === 0 && offendingPrincipals.length === 0)
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Check 2 — `causal.denied-ledger-visible` (run). Grounded in
|
|
42
|
+
* `DEFAULT_PAYLOAD_MINIMUMS` (conformance.ts:67-69) for every `*.denied`
|
|
43
|
+
* type: any such event that appears must carry its required keys. Also
|
|
44
|
+
* detects a silent drop — this fixture's `expected-denials.json` asserted a
|
|
45
|
+
* denial type occurred, but no matching `*.denied` event exists in the
|
|
46
|
+
* ledger — which fails even when every event that *is* present is well
|
|
47
|
+
* shaped.
|
|
48
|
+
*
|
|
49
|
+
* `not_applicable`, never `pass`, when there is no `expected-denials.json`
|
|
50
|
+
* manifest AND zero `*.denied` events are present in the ledger — with
|
|
51
|
+
* neither an assertion to check against nor an event to inspect, there is
|
|
52
|
+
* nothing here to actually assess (see AGENTS.md's cardinal rule: absent
|
|
53
|
+
* evidence is `not_applicable`, never `pass`). A manifest being present is
|
|
54
|
+
* enough to keep evaluating (silent-drop detection needs no observed event
|
|
55
|
+
* to fire), and any `*.denied` event that *is* present is always
|
|
56
|
+
* key-validated regardless of manifest presence.
|
|
57
|
+
*/
|
|
58
|
+
export const checkDeniedLedgerVisible = (evidence) => {
|
|
59
|
+
const id = "causal.denied-ledger-visible";
|
|
60
|
+
const category = "causal";
|
|
61
|
+
const severity = "high";
|
|
62
|
+
if (!evidence) {
|
|
63
|
+
return notApplicable(id, category, severity, "no run artifacts provided");
|
|
64
|
+
}
|
|
65
|
+
const presentDenials = evidence.events.filter((event) => DENIAL_MINIMUMS_BY_TYPE.has(event.type));
|
|
66
|
+
if (!evidence.manifestPresent && presentDenials.length === 0) {
|
|
67
|
+
return notApplicable(id, category, severity, "no denial events and no expected-denials manifest; cannot assess silent-drop");
|
|
68
|
+
}
|
|
69
|
+
const malformed = presentDenials
|
|
70
|
+
.map((event) => ({
|
|
71
|
+
event_id: event.event_id,
|
|
72
|
+
/* v8 ignore next -- presentDenials already filtered by DENIAL_MINIMUMS_BY_TYPE.has(event.type), so .get() always hits; defensive fallback only */
|
|
73
|
+
missingKeys: missingRequiredKeys(event, DENIAL_MINIMUMS_BY_TYPE.get(event.type) ?? []),
|
|
74
|
+
type: event.type
|
|
75
|
+
}))
|
|
76
|
+
.filter((entry) => entry.missingKeys.length > 0);
|
|
77
|
+
const presentTypes = new Set(presentDenials.map((event) => event.type));
|
|
78
|
+
const silentlyDropped = evidence.expectedDenialTypes.filter((type) => !presentTypes.has(type));
|
|
79
|
+
return {
|
|
80
|
+
category,
|
|
81
|
+
evidence: {
|
|
82
|
+
deniedEventCount: presentDenials.length,
|
|
83
|
+
expectedDenialTypes: evidence.expectedDenialTypes,
|
|
84
|
+
malformed,
|
|
85
|
+
silentlyDropped
|
|
86
|
+
},
|
|
87
|
+
id,
|
|
88
|
+
severity,
|
|
89
|
+
status: statusFor(malformed.length === 0 && silentlyDropped.length === 0)
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Check 3 — `control.wake-fail-closed` (static). Grounded in
|
|
94
|
+
* appControlSource.ts:31-47 (B62 Option B): the operator wake endpoint must
|
|
95
|
+
* fail closed when `SPAWNFILE_PI_CONTROL_TOKEN` is unset, never treat an
|
|
96
|
+
* unset token as "auth disabled". Passes only when the compiled Pi app
|
|
97
|
+
* source references the token env, contains the verbatim fail-closed
|
|
98
|
+
* rejection text, and never bakes a literal default value for it.
|
|
99
|
+
*/
|
|
100
|
+
export const checkControlWakeFailClosed = (evidence) => {
|
|
101
|
+
const combined = `${evidence.dockerfile}\n${evidence.entrypoint}\n${evidence.piAppSource}`;
|
|
102
|
+
const tokenReferenced = combined.includes(CONTROL_TOKEN_ENV);
|
|
103
|
+
const failClosedMarkerFound = evidence.piAppSource.includes(FAIL_CLOSED_MARKER);
|
|
104
|
+
const bakedDefaultFound = literalAssignmentPattern(CONTROL_TOKEN_ENV).test(combined);
|
|
105
|
+
return {
|
|
106
|
+
category: "control",
|
|
107
|
+
evidence: {
|
|
108
|
+
bakedDefaultFound,
|
|
109
|
+
envSourceList: [CONTROL_TOKEN_ENV],
|
|
110
|
+
failClosedMarkerFound,
|
|
111
|
+
tokenReferenced
|
|
112
|
+
},
|
|
113
|
+
id: "control.wake-fail-closed",
|
|
114
|
+
severity: "critical",
|
|
115
|
+
status: statusFor(tokenReferenced && failClosedMarkerFound && !bakedDefaultFound)
|
|
116
|
+
};
|
|
117
|
+
};
|
|
118
|
+
/**
|
|
119
|
+
* Check 4 — `container.no-baked-secrets` (static). Grounded in
|
|
120
|
+
* containerEntrypointRender.ts:232-233: every required secret is emitted as
|
|
121
|
+
* a `require_env <name>` runtime check, never a literal value baked into the
|
|
122
|
+
* Dockerfile build layer or the entrypoint script. Passes only when every
|
|
123
|
+
* `requiredSecrets` name is `require_env`-guarded in the entrypoint AND no
|
|
124
|
+
* name is ever followed by a literal (non-`$`) assignment anywhere in the
|
|
125
|
+
* compiled Dockerfile/entrypoint text.
|
|
126
|
+
*/
|
|
127
|
+
export const checkContainerNoBakedSecrets = (evidence) => {
|
|
128
|
+
const combined = `${evidence.dockerfile}\n${evidence.entrypoint}`;
|
|
129
|
+
const missingRequireEnv = evidence.requiredSecrets.filter((name) => !new RegExp(`require_env\\s+['"]${escapeRegExp(name)}['"]`, "u").test(evidence.entrypoint));
|
|
130
|
+
const bakedLiteralValues = evidence.requiredSecrets.filter((name) => literalAssignmentPattern(name).test(combined));
|
|
131
|
+
return {
|
|
132
|
+
category: "container",
|
|
133
|
+
evidence: {
|
|
134
|
+
bakedLiteralValues,
|
|
135
|
+
missingRequireEnv,
|
|
136
|
+
requiredSecrets: evidence.requiredSecrets
|
|
137
|
+
},
|
|
138
|
+
id: "container.no-baked-secrets",
|
|
139
|
+
severity: "critical",
|
|
140
|
+
status: statusFor(missingRequireEnv.length === 0 && bakedLiteralValues.length === 0)
|
|
141
|
+
};
|
|
142
|
+
};
|
|
143
|
+
/**
|
|
144
|
+
* Check 5 — `memory.cross-scope-capability` (run). Grounded in mneme's
|
|
145
|
+
* `mneme.cap.system.v1` foreign-scope escalation capability
|
|
146
|
+
* (ecosystem/mneme/src/policy/capability.ts:28) and the
|
|
147
|
+
* `memory.write.denied` payload minimum (conformance.ts:68:
|
|
148
|
+
* `requested_scope`, `reason`). `mneme.cap.system.v1` is carried as an
|
|
149
|
+
* informational `grounding` string only — this function performs no static
|
|
150
|
+
* check against mneme's source, so the status is never driven by that
|
|
151
|
+
* literal.
|
|
152
|
+
*
|
|
153
|
+
* `not_applicable`, never `pass`, when no `memory.write.denied` event is
|
|
154
|
+
* present in the ledger: enforcement was never exercised in this run, and
|
|
155
|
+
* "nothing to violate" is not evidence the capability guard works (see
|
|
156
|
+
* AGENTS.md). When one or more denial events are present, every one must
|
|
157
|
+
* carry both `requested_scope` and `reason` to pass.
|
|
158
|
+
*/
|
|
159
|
+
export const checkMemoryCrossScopeCapability = (evidence) => {
|
|
160
|
+
const id = "memory.cross-scope-capability";
|
|
161
|
+
const category = "memory";
|
|
162
|
+
const severity = "high";
|
|
163
|
+
if (!evidence) {
|
|
164
|
+
return notApplicable(id, category, severity, "no run artifacts provided");
|
|
165
|
+
}
|
|
166
|
+
const denials = evidence.events.filter((event) => event.type === "memory.write.denied");
|
|
167
|
+
if (denials.length === 0) {
|
|
168
|
+
return {
|
|
169
|
+
category,
|
|
170
|
+
evidence: {
|
|
171
|
+
deniedEventCount: 0,
|
|
172
|
+
reason: "no memory.write.denied events observed; cross-scope enforcement was not exercised in this run"
|
|
173
|
+
},
|
|
174
|
+
id,
|
|
175
|
+
severity,
|
|
176
|
+
status: "not_applicable"
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/* v8 ignore next -- "memory.write.denied" is always in DEFAULT_PAYLOAD_MINIMUMS (conformance.ts:68); defensive fallback only */
|
|
180
|
+
const requiredKeys = DENIAL_MINIMUMS_BY_TYPE.get("memory.write.denied") ?? [];
|
|
181
|
+
const malformed = denials
|
|
182
|
+
.map((event) => ({
|
|
183
|
+
event_id: event.event_id,
|
|
184
|
+
missingKeys: missingRequiredKeys(event, requiredKeys),
|
|
185
|
+
requested_scope: event.payload.requested_scope,
|
|
186
|
+
reason: event.payload.reason
|
|
187
|
+
}))
|
|
188
|
+
.filter((entry) => entry.missingKeys.length > 0);
|
|
189
|
+
return {
|
|
190
|
+
category,
|
|
191
|
+
evidence: {
|
|
192
|
+
deniedEventCount: denials.length,
|
|
193
|
+
grounding: "mneme.cap.system.v1",
|
|
194
|
+
malformed
|
|
195
|
+
},
|
|
196
|
+
id,
|
|
197
|
+
severity,
|
|
198
|
+
status: statusFor(malformed.length === 0)
|
|
199
|
+
};
|
|
200
|
+
};
|
|
201
|
+
/**
|
|
202
|
+
* Check 6 — `network.non-member-write-denied` (run). Grounded in moltnet's
|
|
203
|
+
* `writeForbiddenError` (ecosystem/moltnet/internal/rooms/access_policy.go:23,71-72)
|
|
204
|
+
* and the `message.denied` payload minimum (conformance.ts:67: `target`,
|
|
205
|
+
* `reason`, `content_sha256`). The `writeForbiddenError` path is carried as
|
|
206
|
+
* an informational `grounding` string only — this function performs no
|
|
207
|
+
* static check against moltnet's source, so the status is never driven by
|
|
208
|
+
* that literal.
|
|
209
|
+
*
|
|
210
|
+
* `not_applicable`, never `pass`, when no `message.denied` event is present:
|
|
211
|
+
* non-member-write enforcement was never exercised in this run, which is not
|
|
212
|
+
* evidence it works (see AGENTS.md). When one or more denial events are
|
|
213
|
+
* present, every one must carry `target`, `reason`, and `content_sha256` to
|
|
214
|
+
* pass.
|
|
215
|
+
*/
|
|
216
|
+
export const checkNonMemberWriteDenied = (evidence) => {
|
|
217
|
+
const id = "network.non-member-write-denied";
|
|
218
|
+
const category = "network";
|
|
219
|
+
const severity = "high";
|
|
220
|
+
if (!evidence) {
|
|
221
|
+
return notApplicable(id, category, severity, "no run artifacts provided");
|
|
222
|
+
}
|
|
223
|
+
const denials = evidence.events.filter((event) => event.type === "message.denied");
|
|
224
|
+
if (denials.length === 0) {
|
|
225
|
+
return {
|
|
226
|
+
category,
|
|
227
|
+
evidence: {
|
|
228
|
+
deniedEventCount: 0,
|
|
229
|
+
reason: "no message.denied events observed; non-member write enforcement was not exercised in this run"
|
|
230
|
+
},
|
|
231
|
+
id,
|
|
232
|
+
severity,
|
|
233
|
+
status: "not_applicable"
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
/* v8 ignore next -- "message.denied" is always in DEFAULT_PAYLOAD_MINIMUMS (conformance.ts:67); defensive fallback only */
|
|
237
|
+
const requiredKeys = DENIAL_MINIMUMS_BY_TYPE.get("message.denied") ?? [];
|
|
238
|
+
const malformed = denials
|
|
239
|
+
.map((event) => ({
|
|
240
|
+
event_id: event.event_id,
|
|
241
|
+
missingKeys: missingRequiredKeys(event, requiredKeys),
|
|
242
|
+
target: event.payload.target,
|
|
243
|
+
reason: event.payload.reason
|
|
244
|
+
}))
|
|
245
|
+
.filter((entry) => entry.missingKeys.length > 0);
|
|
246
|
+
return {
|
|
247
|
+
category,
|
|
248
|
+
evidence: {
|
|
249
|
+
deniedEventCount: denials.length,
|
|
250
|
+
grounding: "ecosystem/moltnet/internal/rooms/access_policy.go writeForbiddenError",
|
|
251
|
+
malformed
|
|
252
|
+
},
|
|
253
|
+
id,
|
|
254
|
+
severity,
|
|
255
|
+
status: statusFor(malformed.length === 0)
|
|
256
|
+
};
|
|
257
|
+
};
|
|
258
|
+
/**
|
|
259
|
+
* Check 7 — `provenance.signed-report` — always `not_applicable`. Report
|
|
260
|
+
* signing/provenance is deferred to B66; this audit generator has no
|
|
261
|
+
* signing input to check and must never claim it. Takes no evidence input
|
|
262
|
+
* on purpose: there is nothing yet for it to inspect.
|
|
263
|
+
*/
|
|
264
|
+
export const checkProvenanceSignedReport = () => notApplicable("provenance.signed-report", "provenance", "medium", "not yet enforced (see B66)");
|
|
265
|
+
/**
|
|
266
|
+
* The seven check ids in the order `generateAudit.ts` assembles
|
|
267
|
+
* `AuditReport.checks` in (each check function above takes a different
|
|
268
|
+
* evidence shape, so this is a documentation/ordering list only — not a
|
|
269
|
+
* uniformly-callable array).
|
|
270
|
+
*/
|
|
271
|
+
export const AUDIT_CHECK_IDS = [
|
|
272
|
+
"causal.principals-authenticated",
|
|
273
|
+
"causal.denied-ledger-visible",
|
|
274
|
+
"control.wake-fail-closed",
|
|
275
|
+
"container.no-baked-secrets",
|
|
276
|
+
"memory.cross-scope-capability",
|
|
277
|
+
"network.non-member-write-denied",
|
|
278
|
+
"provenance.signed-report"
|
|
279
|
+
];
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evidence input types and small pure helpers shared by every check function
|
|
3
|
+
* in checks.ts. Split out purely to keep checks.ts under the repo's 400-line
|
|
4
|
+
* cap (see /Users/apresmoi/Documents/spawnfile/CLAUDE.md) — nothing here is
|
|
5
|
+
* a different layer or a different contract, it is checks.ts's own
|
|
6
|
+
* plumbing. No I/O, same as checks.ts itself.
|
|
7
|
+
*/
|
|
8
|
+
import type { CausalEvent, ConformanceIssue } from "../ledger/index.js";
|
|
9
|
+
import type { AuditCheck, AuditCheckCategory, AuditCheckSeverity, AuditCheckStatus } from "./types.js";
|
|
10
|
+
/**
|
|
11
|
+
* Ledger evidence handed to every run-mode check (1, 2, 5, 6). Built once by
|
|
12
|
+
* `generateAudit.ts` from `runRealConformance` (offline-mode: an injected
|
|
13
|
+
* `exec` that reads fixture files instead of spawning a sibling process —
|
|
14
|
+
* see generateAudit.ts) plus the audit's own `expected-denials.json`
|
|
15
|
+
* manifest. `undefined` means "no run artifacts provided" — every run-mode
|
|
16
|
+
* check below returns `not_applicable` in that case, and never `pass`.
|
|
17
|
+
*/
|
|
18
|
+
export interface RunLedgerEvidence {
|
|
19
|
+
eventCount: number;
|
|
20
|
+
events: CausalEvent[];
|
|
21
|
+
/** Denial types this fixture's `expected-denials.json` asserts a `*.denied` event must exist for (silent-drop detection, check 2). */
|
|
22
|
+
expectedDenialTypes: string[];
|
|
23
|
+
/** Every schema/seq/payload-minimum/principal-grammar/chain-stitch issue `runRealConformance` reported — reused, never recomputed. */
|
|
24
|
+
issues: ConformanceIssue[];
|
|
25
|
+
/** Whether the ledger directory actually contained an `expected-denials.json` file — distinct from `expectedDenialTypes.length === 0`, which is also true for a *present-but-empty* manifest. Check 2 uses this to tell "no manifest, so silent-drop cannot be assessed" apart from "a manifest exists and asserts nothing". */
|
|
26
|
+
manifestPresent: boolean;
|
|
27
|
+
sources: string[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Compiled-output evidence handed to every static check (3, 4). Plain
|
|
31
|
+
* strings, not paths — `generateAudit.ts` owns the file reads, these
|
|
32
|
+
* functions stay pure. Any file that does not exist in the compiled output
|
|
33
|
+
* directory reads as an empty string; that is itself audit-worthy (absence
|
|
34
|
+
* of proof is not proof of enforcement), never treated as not_applicable —
|
|
35
|
+
* unlike run-mode checks, the compiled-output directory is a required
|
|
36
|
+
* `generateAudit` input, never optional.
|
|
37
|
+
*/
|
|
38
|
+
export interface StaticContainerEvidence {
|
|
39
|
+
/** Rendered Dockerfile text (containerArtifactsRender.ts's `renderDockerfile` output shape). */
|
|
40
|
+
dockerfile: string;
|
|
41
|
+
/** Rendered entrypoint.sh text (containerEntrypointRender.ts's `renderEntrypoint` output shape). */
|
|
42
|
+
entrypoint: string;
|
|
43
|
+
/** Rendered generated Pi app source, if this compile targeted Pi (appControlSource.ts's `renderPiControlSource` output is inlined into it). Empty string if the compiled output has no such file. */
|
|
44
|
+
piAppSource: string;
|
|
45
|
+
/** Secret env var NAMES this compile declared required (containerEntrypointRender.ts's `renderEntrypoint(runtimePlans, requiredSecrets, ...)` second argument) — never the values. */
|
|
46
|
+
requiredSecrets: string[];
|
|
47
|
+
}
|
|
48
|
+
export declare const notApplicable: (id: string, category: AuditCheckCategory, severity: AuditCheckSeverity, reason: string) => AuditCheck;
|
|
49
|
+
export declare const statusFor: (ok: boolean) => AuditCheckStatus;
|
|
50
|
+
/** `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. */
|
|
51
|
+
export declare const missingRequiredKeys: (event: CausalEvent, requiredKeys: string[]) => string[];
|
|
52
|
+
export declare const DENIAL_MINIMUMS_BY_TYPE: Map<string, string[]>;
|
|
53
|
+
/** Env name gating the operator-only wake endpoint (appControlSource.ts:45, `CONTROL_TOKEN_ENV`). */
|
|
54
|
+
export declare const CONTROL_TOKEN_ENV = "SPAWNFILE_PI_CONTROL_TOKEN";
|
|
55
|
+
/**
|
|
56
|
+
* Verbatim source-text substring of appControlSource.ts:75's fail-closed
|
|
57
|
+
* rejection branch (`return { ok: false, reason: "no operator token
|
|
58
|
+
* configured (" + CONTROL_TOKEN_ENV + " is unset)" }`). The literal string
|
|
59
|
+
* checked here is only the first concatenated chunk — the source
|
|
60
|
+
* concatenates `CONTROL_TOKEN_ENV` in with `+`, so the fully-assembled
|
|
61
|
+
* runtime message never appears as one literal in the source text itself.
|
|
62
|
+
* Its presence is direct evidence the fail-closed branch was actually
|
|
63
|
+
* emitted, not paraphrased.
|
|
64
|
+
*/
|
|
65
|
+
export declare const FAIL_CLOSED_MARKER = "no operator token configured (";
|
|
66
|
+
export declare const escapeRegExp: (value: string) => string;
|
|
67
|
+
/**
|
|
68
|
+
* Matches a literal (non-`$`-expansion) shell/Dockerfile assignment
|
|
69
|
+
* `NAME=<value>` — never a `require_env 'NAME'` call (no `=` follows the
|
|
70
|
+
* name there at all) and never a same-name passthrough reference like
|
|
71
|
+
* `NAME="$NAME"`/`NAME=${NAME}` (an optional quote followed by `$`), both of
|
|
72
|
+
* which read the env rather than bake a value into it.
|
|
73
|
+
*/
|
|
74
|
+
export declare const literalAssignmentPattern: (name: string) => RegExp;
|