spawnfile 0.1.12 → 0.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -12
- package/dist/audit/auditCli.d.ts +19 -0
- package/dist/audit/auditCli.js +63 -0
- package/dist/audit/checks.d.ts +100 -0
- package/dist/audit/checks.js +279 -0
- package/dist/audit/checksShared.d.ts +74 -0
- package/dist/audit/checksShared.js +37 -0
- package/dist/audit/generateAudit.d.ts +19 -0
- package/dist/audit/generateAudit.js +122 -0
- package/dist/audit/index.d.ts +4 -0
- package/dist/audit/index.js +4 -0
- package/dist/audit/readAudit.d.ts +50 -0
- package/dist/audit/readAudit.js +59 -0
- package/dist/audit/types.d.ts +40 -0
- package/dist/audit/types.js +8 -0
- package/dist/auth/credentialEnvFile.d.ts +11 -0
- package/dist/auth/credentialEnvFile.js +60 -0
- package/dist/auth/credentialProvisioning.d.ts +15 -0
- package/dist/auth/credentialProvisioning.js +75 -0
- package/dist/auth/credentialProvisioningReceipt.d.ts +28 -0
- package/dist/auth/credentialProvisioningReceipt.js +70 -0
- package/dist/auth/credentialProvisioningRequest.d.ts +51 -0
- package/dist/auth/credentialProvisioningRequest.js +169 -0
- package/dist/auth/credentialWorldBindings.d.ts +21 -0
- package/dist/auth/credentialWorldBindings.js +104 -0
- package/dist/auth/index.d.ts +7 -0
- package/dist/auth/index.js +7 -0
- package/dist/auth/paths.d.ts +11 -0
- package/dist/auth/paths.js +21 -0
- package/dist/auth/runtimeCredentials.js +18 -2
- package/dist/auth/targetSecretSourceAuthor.d.ts +18 -0
- package/dist/auth/targetSecretSourceAuthor.js +52 -0
- package/dist/auth/targetSecretSourceFsPublish.d.ts +15 -0
- package/dist/auth/targetSecretSourceFsPublish.js +49 -0
- package/dist/auth/targetSecretSourceFsPublishImmutable.d.ts +16 -0
- package/dist/auth/targetSecretSourceFsPublishImmutable.js +435 -0
- package/dist/auth/targetSecretSourceFsRead.d.ts +14 -0
- package/dist/auth/targetSecretSourceFsRead.js +198 -0
- package/dist/auth/targetSecretSourceGrant.d.ts +16 -0
- package/dist/auth/targetSecretSourceGrant.js +99 -0
- package/dist/auth/targetSecretSourceGrantRecords.d.ts +84 -0
- package/dist/auth/targetSecretSourceGrantRecords.js +214 -0
- package/dist/auth/targetSecretSourceLifecycle.d.ts +30 -0
- package/dist/auth/targetSecretSourceLifecycle.js +52 -0
- package/dist/auth/targetSecretSourceOwnerEntropy.d.ts +6 -0
- package/dist/auth/targetSecretSourceOwnerEntropy.js +28 -0
- package/dist/auth/targetSecretSourceRecordCommon.d.ts +14 -0
- package/dist/auth/targetSecretSourceRecordCommon.js +100 -0
- package/dist/auth/targetSecretSourceRecordPublish.d.ts +10 -0
- package/dist/auth/targetSecretSourceRecordPublish.js +104 -0
- package/dist/auth/targetSecretSourceResolver.d.ts +10 -0
- package/dist/auth/targetSecretSourceResolver.js +137 -0
- package/dist/auth/targetSecretSourceRevoke.d.ts +20 -0
- package/dist/auth/targetSecretSourceRevoke.js +92 -0
- package/dist/auth/targetSecretSourceRotate.d.ts +19 -0
- package/dist/auth/targetSecretSourceRotate.js +121 -0
- package/dist/auth/targetSecretSourceVersionRecords.d.ts +49 -0
- package/dist/auth/targetSecretSourceVersionRecords.js +166 -0
- package/dist/cli/artifactsCommands.d.ts +27 -0
- package/dist/cli/artifactsCommands.js +132 -0
- package/dist/cli/authCommands.d.ts +5 -0
- package/dist/cli/authCommands.js +221 -0
- package/dist/cli/compileBuildCommands.d.ts +3 -0
- package/dist/cli/compileBuildCommands.js +35 -0
- package/dist/cli/containerBundleCommand.d.ts +6 -0
- package/dist/cli/containerBundleCommand.js +116 -0
- package/dist/cli/devCommands.d.ts +3 -0
- package/dist/cli/devCommands.js +115 -0
- package/dist/cli/downCommand.d.ts +25 -0
- package/dist/cli/downCommand.js +134 -0
- package/dist/cli/index.js +6 -3
- package/dist/cli/lifecycleCommands.d.ts +1 -1
- package/dist/cli/lifecycleCommands.js +11 -179
- package/dist/cli/lifecycleMachine.d.ts +19 -0
- package/dist/cli/lifecycleMachine.js +78 -0
- package/dist/cli/lifecyclePlan.d.ts +35 -0
- package/dist/cli/lifecyclePlan.js +240 -0
- package/dist/cli/lifecyclePlanningCommands.d.ts +3 -0
- package/dist/cli/lifecyclePlanningCommands.js +30 -0
- package/dist/cli/runCli.d.ts +15 -2
- package/dist/cli/runCli.js +31 -71
- package/dist/cli/runPublishCommands.d.ts +3 -0
- package/dist/cli/runPublishCommands.js +70 -0
- package/dist/cli/statusCommand.d.ts +3 -32
- package/dist/cli/statusCommand.js +37 -233
- package/dist/cli/statusCommandLive.d.ts +20 -0
- package/dist/cli/statusCommandLive.js +188 -0
- package/dist/cli/statusCommandOptions.d.ts +40 -0
- package/dist/cli/statusCommandOptions.js +42 -0
- package/dist/cli/targetCliRoute.d.ts +2 -0
- package/dist/cli/targetCliRoute.js +30 -0
- package/dist/cli/targetCommands.d.ts +33 -0
- package/dist/cli/targetCommands.js +257 -0
- package/dist/cli/targetComposedPreparationCommand.d.ts +6 -0
- package/dist/cli/targetComposedPreparationCommand.js +39 -0
- package/dist/cli/targetDefaultArtifactAuthority.d.ts +5 -0
- package/dist/cli/targetDefaultArtifactAuthority.js +28 -0
- package/dist/cli/targetDefaultAuthorities.d.ts +53 -0
- package/dist/cli/targetDefaultAuthorities.js +210 -0
- package/dist/cli/targetDefaultConfig.d.ts +68 -0
- package/dist/cli/targetDefaultConfig.js +317 -0
- package/dist/cli/targetDefaultConfigStdin.d.ts +13 -0
- package/dist/cli/targetDefaultConfigStdin.js +215 -0
- package/dist/cli/targetDefaultEnvelope.d.ts +1 -0
- package/dist/cli/targetDefaultEnvelope.js +13 -0
- package/dist/cli/targetDefaultHandlerFactory.d.ts +28 -0
- package/dist/cli/targetDefaultHandlerFactory.js +247 -0
- package/dist/cli/targetDefaultHandlers.d.ts +21 -0
- package/dist/cli/targetDefaultHandlers.js +72 -0
- package/dist/cli/targetDefaultJournalAuthority.d.ts +35 -0
- package/dist/cli/targetDefaultJournalAuthority.js +135 -0
- package/dist/cli/targetDefaultWorldClock.d.ts +4 -0
- package/dist/cli/targetDefaultWorldClock.js +14 -0
- package/dist/cli/targetDefaultWorldQueries.d.ts +5 -0
- package/dist/cli/targetDefaultWorldQueries.js +11 -0
- package/dist/cli/targetDefaultWorldReadiness.d.ts +4 -0
- package/dist/cli/targetDefaultWorldReadiness.js +17 -0
- package/dist/cli/targetEvidenceHelperResolution.d.ts +14 -0
- package/dist/cli/targetEvidenceHelperResolution.js +23 -0
- package/dist/cli/targetLookupCli.d.ts +3 -0
- package/dist/cli/targetLookupCli.js +31 -0
- package/dist/cli/targetLookupCommands.d.ts +12 -0
- package/dist/cli/targetLookupCommands.js +69 -0
- package/dist/cli/targetOperationDispatch.d.ts +58 -0
- package/dist/cli/targetOperationDispatch.js +21 -0
- package/dist/cli/targetReceiptOutput.d.ts +14 -0
- package/dist/cli/targetReceiptOutput.js +21 -0
- package/dist/cli/targetRequestFile.d.ts +14 -0
- package/dist/cli/targetRequestFile.js +63 -0
- package/dist/cli/targetSecretSourceInput.d.ts +28 -0
- package/dist/cli/targetSecretSourceInput.js +121 -0
- package/dist/cli/targetWorldClockCommand.d.ts +10 -0
- package/dist/cli/targetWorldClockCommand.js +42 -0
- package/dist/cli/targetWorldClockCrossProcess.test-helper.d.ts +13 -0
- package/dist/cli/targetWorldClockCrossProcess.test-helper.js +109 -0
- package/dist/cli/targetWorldReadinessCommand.d.ts +10 -0
- package/dist/cli/targetWorldReadinessCommand.js +43 -0
- package/dist/cli/upCommand.d.ts +3 -0
- package/dist/cli/upCommand.js +133 -0
- package/dist/cli/upImageCommand.d.ts +11 -0
- package/dist/cli/upImageCommand.js +41 -0
- package/dist/cli/upLifecycleInvocation.d.ts +41 -0
- package/dist/cli/upLifecycleInvocation.js +48 -0
- package/dist/cli/upLifecycleRecovery.d.ts +4 -0
- package/dist/cli/upLifecycleRecovery.js +53 -0
- package/dist/compiler/agentNodeMerge.d.ts +2 -0
- package/dist/compiler/agentNodeMerge.js +79 -0
- package/dist/compiler/agentSurfaces.js +11 -1
- package/dist/compiler/buildCompilePlan.js +17 -0
- package/dist/compiler/buildCompilePlanAgent.d.ts +11 -0
- package/dist/compiler/buildCompilePlanAgent.js +56 -0
- package/dist/compiler/buildCompilePlanTeams.d.ts +1 -0
- package/dist/compiler/buildCompilePlanTeams.js +4 -1
- package/dist/compiler/buildCompilePlanTraversal.js +75 -82
- package/dist/compiler/buildProject.d.ts +20 -1
- package/dist/compiler/buildProject.js +121 -7
- package/dist/compiler/compilePlanHelpers.js +2 -0
- package/dist/compiler/compileProject.d.ts +15 -0
- package/dist/compiler/compileProject.js +29 -75
- package/dist/compiler/compileProjectPolicy.d.ts +5 -0
- package/dist/compiler/compileProjectPolicy.js +21 -0
- package/dist/compiler/compileProjectReports.d.ts +9 -0
- package/dist/compiler/compileProjectReports.js +52 -0
- package/dist/compiler/containerArtifactSummaries.d.ts +7 -0
- package/dist/compiler/containerArtifactSummaries.js +138 -0
- package/dist/compiler/containerArtifacts.d.ts +10 -0
- package/dist/compiler/containerArtifacts.js +126 -125
- package/dist/compiler/containerArtifactsPlans.d.ts +5 -3
- package/dist/compiler/containerArtifactsPlans.js +31 -118
- package/dist/compiler/containerArtifactsRender.d.ts +3 -1
- package/dist/compiler/containerArtifactsRender.js +40 -81
- package/dist/compiler/containerArtifactsTypes.d.ts +12 -0
- package/dist/compiler/containerConfigEnvRender.d.ts +3 -0
- package/dist/compiler/containerConfigEnvRender.js +54 -0
- package/dist/compiler/containerEntrypointRender.d.ts +1 -0
- package/dist/compiler/containerEntrypointRender.js +60 -53
- package/dist/compiler/containerEntrypointShell.d.ts +5 -0
- package/dist/compiler/containerEntrypointShell.js +29 -0
- package/dist/compiler/containerPackageOverrides.d.ts +27 -0
- package/dist/compiler/containerPackageOverrides.js +63 -0
- package/dist/compiler/containerPackageRender.d.ts +15 -0
- package/dist/compiler/containerPackageRender.js +63 -0
- package/dist/compiler/containerTargetPlanResolution.d.ts +20 -0
- package/dist/compiler/containerTargetPlanResolution.js +97 -0
- package/dist/compiler/containerTargetResources.js +3 -1
- package/dist/compiler/daimonTelemetryArtifacts.d.ts +22 -0
- package/dist/compiler/daimonTelemetryArtifacts.js +61 -0
- package/dist/compiler/dockerBuildContext.d.ts +16 -0
- package/dist/compiler/dockerBuildContext.js +159 -0
- package/dist/compiler/dockerBuildSkip.d.ts +30 -0
- package/dist/compiler/dockerBuildSkip.js +81 -0
- package/dist/compiler/index.d.ts +4 -0
- package/dist/compiler/index.js +4 -0
- package/dist/compiler/memoryArtifacts.d.ts +26 -0
- package/dist/compiler/memoryArtifacts.js +134 -0
- package/dist/compiler/memoryResolution.d.ts +4 -0
- package/dist/compiler/memoryResolution.js +147 -0
- package/dist/compiler/modelEnv.d.ts +2 -0
- package/dist/compiler/modelEnv.js +6 -0
- package/dist/compiler/moltnetAllowedWakeSendersValidation.d.ts +2 -0
- package/dist/compiler/moltnetAllowedWakeSendersValidation.js +42 -0
- package/dist/compiler/moltnetArtifactPaths.d.ts +26 -0
- package/dist/compiler/moltnetArtifactPaths.js +49 -0
- package/dist/compiler/moltnetArtifactTypes.d.ts +46 -0
- package/dist/compiler/moltnetArtifactTypes.js +1 -0
- package/dist/compiler/moltnetArtifacts.d.ts +2 -40
- package/dist/compiler/moltnetArtifacts.js +56 -95
- package/dist/compiler/moltnetBinaries.d.ts +21 -1
- package/dist/compiler/moltnetBinaries.js +156 -28
- package/dist/compiler/moltnetClientConfig.js +18 -2
- package/dist/compiler/moltnetConfigLowering.d.ts +16 -1
- package/dist/compiler/moltnetConfigLowering.js +67 -5
- package/dist/compiler/moltnetExternalParticipantArtifact.d.ts +38 -0
- package/dist/compiler/moltnetExternalParticipantArtifact.js +188 -0
- package/dist/compiler/moltnetNodeConfig.js +7 -2
- package/dist/compiler/moltnetReleaseAuthority.d.ts +17 -0
- package/dist/compiler/moltnetReleaseAuthority.js +73 -0
- package/dist/compiler/moltnetReleaseDownload.d.ts +12 -0
- package/dist/compiler/moltnetReleaseDownload.js +85 -0
- package/dist/compiler/moltnetRepresentativeResolution.d.ts +1 -0
- package/dist/compiler/moltnetRepresentativeResolution.js +16 -2
- package/dist/compiler/moltnetResolution.js +72 -20
- package/dist/compiler/moltnetRoomMemberships.js +37 -9
- package/dist/compiler/moltnetRuntimeConfig.js +11 -0
- package/dist/compiler/moltnetServerPlans.d.ts +9 -0
- package/dist/compiler/moltnetServerPlans.js +132 -0
- package/dist/compiler/organizationIdentity.d.ts +27 -0
- package/dist/compiler/organizationIdentity.js +297 -0
- package/dist/compiler/organizationReadyEvidence.d.ts +49 -0
- package/dist/compiler/organizationReadyEvidence.js +261 -0
- package/dist/compiler/projectManifestGraph.d.ts +4 -0
- package/dist/compiler/projectManifestGraph.js +24 -0
- package/dist/compiler/runProject.d.ts +4 -0
- package/dist/compiler/runProject.js +37 -22
- package/dist/compiler/runProjectAuth.d.ts +7 -1
- package/dist/compiler/runProjectAuth.js +87 -9
- package/dist/compiler/runProjectDocker.d.ts +7 -0
- package/dist/compiler/runProjectDocker.js +187 -19
- package/dist/compiler/runProjectLifecycle.d.ts +7 -0
- package/dist/compiler/runProjectLifecycle.js +40 -0
- package/dist/compiler/syncProjectAuth.js +4 -1
- package/dist/compiler/teamContextActiveEnvironments.d.ts +13 -0
- package/dist/compiler/teamContextActiveEnvironments.js +255 -0
- package/dist/compiler/teamContextSupport.js +32 -40
- package/dist/compiler/teamContextTypes.d.ts +2 -0
- package/dist/compiler/types.d.ts +82 -1
- package/dist/compiler/upProject.d.ts +5 -0
- package/dist/compiler/upProject.js +257 -20
- package/dist/compiler/upReceipt.d.ts +36 -0
- package/dist/compiler/upReceipt.js +82 -0
- package/dist/compiler/updateProjectModels.js +42 -60
- package/dist/compiler/updateProjectRuntime.js +22 -35
- package/dist/compiler/updateProjectSurfaces.js +53 -47
- package/dist/compiler/worldBindings.d.ts +39 -0
- package/dist/compiler/worldBindings.js +247 -0
- package/dist/compiler/worldBindingsFile.d.ts +5 -0
- package/dist/compiler/worldBindingsFile.js +162 -0
- package/dist/deployment/artifactsExport.d.ts +49 -0
- package/dist/deployment/artifactsExport.js +217 -0
- package/dist/deployment/artifactsExportDocker.d.ts +48 -0
- package/dist/deployment/artifactsExportDocker.js +91 -0
- package/dist/deployment/artifactsExportPlan.d.ts +24 -0
- package/dist/deployment/artifactsExportPlan.js +135 -0
- package/dist/deployment/artifactsExportTypes.d.ts +50 -0
- package/dist/deployment/artifactsExportTypes.js +52 -0
- package/dist/deployment/buildImageCacheStore.d.ts +23 -0
- package/dist/deployment/buildImageCacheStore.js +54 -0
- package/dist/deployment/deploymentLifecycleCorrelation.d.ts +11 -0
- package/dist/deployment/deploymentLifecycleCorrelation.js +33 -0
- package/dist/deployment/dockerInspect.d.ts +9 -0
- package/dist/deployment/dockerInspect.js +24 -1
- package/dist/deployment/dockerLabels.d.ts +2 -0
- package/dist/deployment/dockerLabels.js +2 -0
- package/dist/deployment/dockerLogs.js +2 -10
- package/dist/deployment/dockerManager.d.ts +51 -0
- package/dist/deployment/dockerManager.js +118 -1
- package/dist/deployment/dockerProbeGateway.js +64 -5
- package/dist/deployment/dockerRecover.d.ts +17 -0
- package/dist/deployment/dockerRecover.js +137 -0
- package/dist/deployment/dockerTeardown.d.ts +32 -0
- package/dist/deployment/dockerTeardown.js +61 -0
- package/dist/deployment/downDeployment.d.ts +34 -0
- package/dist/deployment/downDeployment.js +147 -0
- package/dist/deployment/downReceiptTypes.d.ts +21 -0
- package/dist/deployment/downReceiptTypes.js +30 -0
- package/dist/deployment/index.d.ts +17 -0
- package/dist/deployment/index.js +18 -0
- package/dist/deployment/lifecycleCompletion.d.ts +37 -0
- package/dist/deployment/lifecycleCompletion.js +236 -0
- package/dist/deployment/lifecycleCompletionContracts.d.ts +158 -0
- package/dist/deployment/lifecycleCompletionContracts.js +106 -0
- package/dist/deployment/lifecycleCompletionHeartbeat.d.ts +2 -0
- package/dist/deployment/lifecycleCompletionHeartbeat.js +50 -0
- package/dist/deployment/lifecycleCompletionLookup.d.ts +18 -0
- package/dist/deployment/lifecycleCompletionLookup.js +88 -0
- package/dist/deployment/lifecycleCompletionOwner.d.ts +8 -0
- package/dist/deployment/lifecycleCompletionOwner.js +31 -0
- package/dist/deployment/lifecycleCompletionParsing.d.ts +12 -0
- package/dist/deployment/lifecycleCompletionParsing.js +108 -0
- package/dist/deployment/lifecycleCompletionPaths.d.ts +9 -0
- package/dist/deployment/lifecycleCompletionPaths.js +16 -0
- package/dist/deployment/lifecycleCompletionPublication.d.ts +5 -0
- package/dist/deployment/lifecycleCompletionPublication.js +35 -0
- package/dist/deployment/lifecycleCompletionRecovery.d.ts +21 -0
- package/dist/deployment/lifecycleCompletionRecovery.js +56 -0
- package/dist/deployment/lifecycleCompletionRoot.d.ts +21 -0
- package/dist/deployment/lifecycleCompletionRoot.js +243 -0
- package/dist/deployment/lifecycleCompletionStore.d.ts +6 -0
- package/dist/deployment/lifecycleCompletionStore.js +151 -0
- package/dist/deployment/organizationHandoffAuthorityFsClient.d.ts +17 -0
- package/dist/deployment/organizationHandoffAuthorityFsClient.js +132 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorker.d.ts +1 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorker.js +285 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorkerParent.fixture.d.ts +1 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorkerParent.fixture.js +26 -0
- package/dist/deployment/organizationHandoffAuthorityStore.d.ts +41 -0
- package/dist/deployment/organizationHandoffAuthorityStore.js +348 -0
- package/dist/deployment/organizationHandoffAuthorityTypes.d.ts +76 -0
- package/dist/deployment/organizationHandoffAuthorityTypes.js +148 -0
- package/dist/deployment/organizationHandoffTypes.d.ts +29 -0
- package/dist/deployment/organizationHandoffTypes.js +80 -0
- package/dist/deployment/organizationReady.d.ts +52 -0
- package/dist/deployment/organizationReady.js +200 -0
- package/dist/deployment/privateArtifactsExport.d.ts +18 -0
- package/dist/deployment/privateArtifactsExport.js +80 -0
- package/dist/deployment/providerRuntimeBoundaryScanner.test-helper.d.ts +8 -0
- package/dist/deployment/providerRuntimeBoundaryScanner.test-helper.js +60 -0
- package/dist/deployment/record.d.ts +26 -1
- package/dist/deployment/record.js +49 -4
- package/dist/deployment/simfileFixtureBoundary.test-helper.d.ts +8 -0
- package/dist/deployment/simfileFixtureBoundary.test-helper.js +103 -0
- package/dist/deployment/target.d.ts +1 -35
- package/dist/deployment/target.js +1 -96
- package/dist/deployment/upReceiptTypes.d.ts +111 -0
- package/dist/deployment/upReceiptTypes.js +164 -0
- package/dist/dev/activity.d.ts +14 -0
- package/dist/dev/activity.js +48 -0
- package/dist/dev/docker.d.ts +16 -0
- package/dist/dev/docker.js +71 -0
- package/dist/dev/index.d.ts +2 -0
- package/dist/dev/index.js +2 -0
- package/dist/dev/project.d.ts +35 -0
- package/dist/dev/project.js +170 -0
- package/dist/distribution/buildDistributionReport.d.ts +2 -1
- package/dist/distribution/buildDistributionReport.js +2 -1
- package/dist/distribution/distributionReportSchema.d.ts +5 -0
- package/dist/distribution/distributionReportSchema.js +7 -2
- package/dist/distribution/index.d.ts +2 -2
- package/dist/distribution/index.js +1 -1
- package/dist/distribution/types.d.ts +7 -0
- package/dist/distribution/types.js +1 -0
- package/dist/filesystem/paths.js +10 -1
- package/dist/ledger/causalConformanceCli.d.ts +1 -0
- package/dist/ledger/causalConformanceCli.js +41 -0
- package/dist/ledger/causeNamespace.d.ts +8 -0
- package/dist/ledger/causeNamespace.js +24 -0
- package/dist/ledger/conformance.d.ts +83 -0
- package/dist/ledger/conformance.js +259 -0
- package/dist/ledger/emitters.d.ts +76 -0
- package/dist/ledger/emitters.js +188 -0
- package/dist/ledger/index.d.ts +4 -0
- package/dist/ledger/index.js +4 -0
- package/dist/ledger/principal.d.ts +96 -0
- package/dist/ledger/principal.js +121 -0
- package/dist/manifest/externalParticipantSchemas.d.ts +18 -0
- package/dist/manifest/externalParticipantSchemas.js +17 -0
- package/dist/manifest/index.d.ts +1 -0
- package/dist/manifest/index.js +1 -0
- package/dist/manifest/inlineAgentMember.d.ts +2 -0
- package/dist/manifest/inlineAgentMember.js +9 -0
- package/dist/manifest/loadManifest.js +14 -8
- package/dist/manifest/mcpSchemas.d.ts +17 -0
- package/dist/manifest/mcpSchemas.js +41 -0
- package/dist/manifest/memorySchemas.d.ts +245 -0
- package/dist/manifest/memorySchemas.js +148 -0
- package/dist/manifest/renderSpawnfile.js +22 -131
- package/dist/manifest/renderSpawnfileNetworks.js +9 -2
- package/dist/manifest/renderSpawnfileSurfaces.d.ts +2 -0
- package/dist/manifest/renderSpawnfileSurfaces.js +134 -0
- package/dist/manifest/schemas.d.ts +1868 -99
- package/dist/manifest/schemas.js +78 -32
- package/dist/manifest/surfaceSchemas.d.ts +17 -0
- package/dist/manifest/surfaceSchemas.js +24 -1
- package/dist/manifest/teamNetworkAccessSchemas.d.ts +1 -1
- package/dist/manifest/teamNetworkAuthSchemas.d.ts +48 -0
- package/dist/manifest/teamNetworkAuthSchemas.js +103 -0
- package/dist/manifest/teamNetworkSchemas.d.ts +8 -187
- package/dist/manifest/teamNetworkSchemas.js +3 -317
- package/dist/manifest/teamNetworkServerSchemas.d.ts +150 -0
- package/dist/manifest/teamNetworkServerSchemas.js +199 -0
- package/dist/ownership/siblingBuildFreshness.d.ts +20 -0
- package/dist/ownership/siblingBuildFreshness.js +20 -0
- package/dist/ownership/simfileRunOperatorInputs.d.ts +103 -0
- package/dist/ownership/simfileRunOperatorInputs.js +139 -0
- package/dist/report/types.d.ts +142 -0
- package/dist/runtime/common.d.ts +37 -0
- package/dist/runtime/common.js +56 -1
- package/dist/runtime/container.d.ts +29 -1
- package/dist/runtime/container.js +127 -11
- package/dist/runtime/containerPackageOverrides.d.ts +37 -0
- package/dist/runtime/containerPackageOverrides.js +33 -0
- package/dist/runtime/index.d.ts +2 -0
- package/dist/runtime/index.js +2 -0
- package/dist/runtime/install.d.ts +1 -1
- package/dist/runtime/install.js +43 -1
- package/dist/runtime/mnemeMcp.d.ts +15 -0
- package/dist/runtime/mnemeMcp.js +109 -0
- package/dist/runtime/openclaw/adapter.js +15 -4
- package/dist/runtime/openclaw/mcp.d.ts +10 -0
- package/dist/runtime/openclaw/mcp.js +69 -0
- package/dist/runtime/openclaw/runAuth.js +2 -2
- package/dist/runtime/openclaw/scaffold.js +1 -1
- package/dist/runtime/openclaw/schedules.d.ts +38 -0
- package/dist/runtime/openclaw/schedules.js +74 -0
- package/dist/runtime/pi/adapter.d.ts +4 -0
- package/dist/runtime/pi/adapter.js +231 -0
- package/dist/runtime/pi/appActivitySource.d.ts +1 -0
- package/dist/runtime/pi/appActivitySource.js +199 -0
- package/dist/runtime/pi/appAgentConfig.d.ts +11 -0
- package/dist/runtime/pi/appAgentConfig.js +264 -0
- package/dist/runtime/pi/appCliEnginesSource.d.ts +1 -0
- package/dist/runtime/pi/appCliEnginesSource.js +183 -0
- package/dist/runtime/pi/appCliSource.d.ts +1 -0
- package/dist/runtime/pi/appCliSource.js +353 -0
- package/dist/runtime/pi/appControlSource.d.ts +1 -0
- package/dist/runtime/pi/appControlSource.js +390 -0
- package/dist/runtime/pi/appControlWakeIdentitySource.d.ts +1 -0
- package/dist/runtime/pi/appControlWakeIdentitySource.js +19 -0
- package/dist/runtime/pi/appCoreSource.d.ts +4 -0
- package/dist/runtime/pi/appCoreSource.js +244 -0
- package/dist/runtime/pi/appPreludeSource.d.ts +1 -0
- package/dist/runtime/pi/appPreludeSource.js +191 -0
- package/dist/runtime/pi/appScheduleSource.d.ts +1 -0
- package/dist/runtime/pi/appScheduleSource.js +80 -0
- package/dist/runtime/pi/appScriptedEngine.d.ts +31 -0
- package/dist/runtime/pi/appScriptedEngine.js +42 -0
- package/dist/runtime/pi/appSource.d.ts +4 -0
- package/dist/runtime/pi/appSource.js +12 -0
- package/dist/runtime/pi/appTemplate.d.ts +14 -0
- package/dist/runtime/pi/appTemplate.js +27 -0
- package/dist/runtime/pi/appTemplateTypes.d.ts +64 -0
- package/dist/runtime/pi/appTemplateTypes.js +18 -0
- package/dist/runtime/pi/appWakeContextSource.d.ts +1 -0
- package/dist/runtime/pi/appWakeContextSource.js +398 -0
- package/dist/runtime/pi/containerTargets.d.ts +4 -0
- package/dist/runtime/pi/containerTargets.js +57 -0
- package/dist/runtime/pi/runAuth.d.ts +2 -0
- package/dist/runtime/pi/runAuth.js +185 -0
- package/dist/runtime/pi/testHelpers.d.ts +2 -0
- package/dist/runtime/pi/testHelpers.js +40 -0
- package/dist/runtime/picoclaw/adapter.js +23 -27
- package/dist/runtime/picoclaw/mcp.d.ts +4 -0
- package/dist/runtime/picoclaw/mcp.js +43 -0
- package/dist/runtime/picoclaw/memory.d.ts +7 -0
- package/dist/runtime/picoclaw/memory.js +17 -0
- package/dist/runtime/picoclaw/runAuth.js +1 -1
- package/dist/runtime/picoclaw/scaffold.js +1 -1
- package/dist/runtime/picoclaw/schedules.d.ts +26 -0
- package/dist/runtime/picoclaw/schedules.js +62 -3
- package/dist/runtime/registry.js +3 -0
- package/dist/runtime/scheduleUtils.d.ts +2 -0
- package/dist/runtime/scheduleUtils.js +15 -0
- package/dist/runtime/types.d.ts +26 -2
- package/dist/shared/errors.d.ts +1 -1
- package/dist/shared/errors.js +2 -2
- package/dist/shared/index.d.ts +1 -0
- package/dist/shared/index.js +1 -0
- package/dist/shared/redaction.d.ts +2 -0
- package/dist/shared/redaction.js +10 -0
- package/dist/status/buildStatus.d.ts +1 -0
- package/dist/status/buildStatus.js +2 -0
- package/dist/status/compileReport.d.ts +22 -0
- package/dist/status/compileReport.js +16 -2
- package/dist/status/compiledProbeCollection.d.ts +21 -0
- package/dist/status/compiledProbeCollection.js +27 -0
- package/dist/status/deployments.js +5 -12
- package/dist/status/imageStatusReport.js +6 -0
- package/dist/status/index.d.ts +3 -0
- package/dist/status/index.js +3 -0
- package/dist/status/lifecycleProbes.d.ts +19 -0
- package/dist/status/lifecycleProbes.js +174 -0
- package/dist/status/moltnetProbes.d.ts +7 -8
- package/dist/status/moltnetProbes.js +27 -198
- package/dist/status/moltnetWiringProbes.d.ts +19 -0
- package/dist/status/moltnetWiringProbes.js +178 -0
- package/dist/target/cleanupRun.d.ts +41 -0
- package/dist/target/cleanupRun.js +139 -0
- package/dist/target/cleanupRunDocker.d.ts +16 -0
- package/dist/target/cleanupRunDocker.js +66 -0
- package/dist/target/cleanupRunDocker.test-helper.d.ts +67 -0
- package/dist/target/cleanupRunDocker.test-helper.js +238 -0
- package/dist/target/cleanupRunDockerPreflight.d.ts +17 -0
- package/dist/target/cleanupRunDockerPreflight.js +224 -0
- package/dist/target/composedPreparation.d.ts +205 -0
- package/dist/target/composedPreparation.js +223 -0
- package/dist/target/containerBundle.d.ts +82 -0
- package/dist/target/containerBundle.js +243 -0
- package/dist/target/containerBundleArchive.d.ts +31 -0
- package/dist/target/containerBundleArchive.js +140 -0
- package/dist/target/containerBundleAuthority.d.ts +25 -0
- package/dist/target/containerBundleAuthority.js +65 -0
- package/dist/target/containerBundleContracts.d.ts +114 -0
- package/dist/target/containerBundleContracts.js +173 -0
- package/dist/target/containerBundleFilesystemStore.d.ts +3 -0
- package/dist/target/containerBundleFilesystemStore.js +247 -0
- package/dist/target/containerBundlePolicy.d.ts +33 -0
- package/dist/target/containerBundlePolicy.js +64 -0
- package/dist/target/containerBundleStore.d.ts +127 -0
- package/dist/target/containerBundleStore.js +284 -0
- package/dist/target/contracts.d.ts +538 -0
- package/dist/target/contracts.js +373 -0
- package/dist/target/dockerArtifactIdentityTypes.d.ts +56 -0
- package/dist/target/dockerArtifactIdentityTypes.js +1 -0
- package/dist/target/dockerArtifactInspection.d.ts +40 -0
- package/dist/target/dockerArtifactInspection.js +125 -0
- package/dist/target/dockerArtifacts.d.ts +21 -0
- package/dist/target/dockerArtifacts.js +110 -0
- package/dist/target/dockerArtifactsProvider.d.ts +41 -0
- package/dist/target/dockerArtifactsProvider.js +449 -0
- package/dist/target/dockerCommandExecutor.d.ts +27 -0
- package/dist/target/dockerCommandExecutor.js +200 -0
- package/dist/target/dockerCommandExecutorCore.d.ts +34 -0
- package/dist/target/dockerCommandExecutorCore.js +273 -0
- package/dist/target/dockerContainerBundleBuilder.d.ts +8 -0
- package/dist/target/dockerContainerBundleBuilder.js +256 -0
- package/dist/target/dockerContextSnapshot.d.ts +21 -0
- package/dist/target/dockerContextSnapshot.js +158 -0
- package/dist/target/dockerEndpointFingerprint.d.ts +1 -0
- package/dist/target/dockerEndpointFingerprint.js +9 -0
- package/dist/target/dockerPreparedArtifact.d.ts +48 -0
- package/dist/target/dockerPreparedArtifact.js +131 -0
- package/dist/target/dockerProjectionJson.d.ts +1 -0
- package/dist/target/dockerProjectionJson.js +80 -0
- package/dist/target/dockerPublicArtifactSnapshot.d.ts +17 -0
- package/dist/target/dockerPublicArtifactSnapshot.js +99 -0
- package/dist/target/dockerResources.d.ts +26 -0
- package/dist/target/dockerResources.js +162 -0
- package/dist/target/dockerResourcesProvider.d.ts +44 -0
- package/dist/target/dockerResourcesProvider.js +207 -0
- package/dist/target/dockerSecrets.d.ts +39 -0
- package/dist/target/dockerSecrets.js +249 -0
- package/dist/target/dockerSecretsAuthority.d.ts +26 -0
- package/dist/target/dockerSecretsAuthority.js +216 -0
- package/dist/target/dockerSecretsLifecycle.d.ts +25 -0
- package/dist/target/dockerSecretsLifecycle.js +133 -0
- package/dist/target/dockerSecretsProvider.d.ts +68 -0
- package/dist/target/dockerSecretsProvider.js +329 -0
- package/dist/target/dockerTarget.d.ts +52 -0
- package/dist/target/dockerTarget.js +48 -0
- package/dist/target/dockerTargetBinding.d.ts +14 -0
- package/dist/target/dockerTargetBinding.js +96 -0
- package/dist/target/dockerWorldClock.d.ts +17 -0
- package/dist/target/dockerWorldClock.js +111 -0
- package/dist/target/dockerWorldReadiness.d.ts +17 -0
- package/dist/target/dockerWorldReadiness.js +119 -0
- package/dist/target/dockerWorldService.d.ts +23 -0
- package/dist/target/dockerWorldService.js +216 -0
- package/dist/target/dockerWorldServiceAuthority.d.ts +80 -0
- package/dist/target/dockerWorldServiceAuthority.js +182 -0
- package/dist/target/dockerWorldServiceLifecycle.d.ts +41 -0
- package/dist/target/dockerWorldServiceLifecycle.js +275 -0
- package/dist/target/dockerWorldServiceProvider.d.ts +60 -0
- package/dist/target/dockerWorldServiceProvider.js +318 -0
- package/dist/target/dockerWorldServiceStore.d.ts +73 -0
- package/dist/target/dockerWorldServiceStore.js +367 -0
- package/dist/target/evidenceExport.d.ts +55 -0
- package/dist/target/evidenceExport.js +518 -0
- package/dist/target/evidenceExportArchive.d.ts +10 -0
- package/dist/target/evidenceExportArchive.js +302 -0
- package/dist/target/evidenceExportContract.d.ts +27 -0
- package/dist/target/evidenceExportContract.js +40 -0
- package/dist/target/evidenceExportOperationsTestKit.d.ts +87 -0
- package/dist/target/evidenceExportOperationsTestKit.js +312 -0
- package/dist/target/evidenceExportProvider.d.ts +85 -0
- package/dist/target/evidenceExportProvider.js +187 -0
- package/dist/target/evidenceExportPublicationTypes.d.ts +16 -0
- package/dist/target/evidenceExportPublicationTypes.js +1 -0
- package/dist/target/evidenceExportStore.d.ts +70 -0
- package/dist/target/evidenceExportStore.js +498 -0
- package/dist/target/evidenceExportStorePublication.d.ts +7 -0
- package/dist/target/evidenceExportStorePublication.js +395 -0
- package/dist/target/handles.d.ts +20 -0
- package/dist/target/handles.js +56 -0
- package/dist/target/index.d.ts +12 -0
- package/dist/target/index.js +11 -0
- package/dist/target/journal.d.ts +59 -0
- package/dist/target/journal.js +529 -0
- package/dist/target/journalFilesystem.d.ts +3 -0
- package/dist/target/journalFilesystem.js +111 -0
- package/dist/target/journalRoot.d.ts +4 -0
- package/dist/target/journalRoot.js +6 -0
- package/dist/target/organizationAttachment.d.ts +23 -0
- package/dist/target/organizationAttachment.js +263 -0
- package/dist/target/organizationAttachmentAuthority.d.ts +65 -0
- package/dist/target/organizationAttachmentAuthority.js +161 -0
- package/dist/target/organizationAttachmentLifecycle.d.ts +17 -0
- package/dist/target/organizationAttachmentLifecycle.js +101 -0
- package/dist/target/organizationAttachmentProvider.d.ts +76 -0
- package/dist/target/organizationAttachmentProvider.js +289 -0
- package/dist/target/organizationAttachmentStore.d.ts +51 -0
- package/dist/target/organizationAttachmentStore.js +316 -0
- package/dist/target/publicArtifactSnapshot.d.ts +41 -0
- package/dist/target/publicArtifactSnapshot.js +150 -0
- package/dist/target/topologyActivation.d.ts +51 -0
- package/dist/target/topologyActivation.js +149 -0
- package/dist/target/topologyAttestation.d.ts +37 -0
- package/dist/target/topologyAttestation.js +300 -0
- package/dist/target/topologyAttestationErrors.d.ts +1 -0
- package/dist/target/topologyAttestationErrors.js +1 -0
- package/dist/target/worldClock.d.ts +60 -0
- package/dist/target/worldClock.js +129 -0
- package/dist/target/worldReadiness.d.ts +103 -0
- package/dist/target/worldReadiness.js +153 -0
- package/moltnet-releases.json +20 -0
- package/package.json +29 -8
- package/runtimes.yaml +28 -27
- package/dist/runtime/openclaw/scaffold-assets/CLAUDE.md +0 -5
- package/dist/runtime/picoclaw/scaffold-assets/CLAUDE.md +0 -5
- /package/dist/runtime/openclaw/scaffold-assets/{AGENTS.md → WORKSPACE_AGENTS.md} +0 -0
- /package/dist/runtime/picoclaw/scaffold-assets/{AGENTS.md → WORKSPACE_AGENTS.md} +0 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { DeploymentRecord } from "./record.js";
|
|
2
|
+
/** Same injectable exec shape as `dockerInspect.ts`/`dockerLogs.ts` — real Docker calls
|
|
3
|
+
* are the default, tests inject a fake. */
|
|
4
|
+
export type DockerArtifactExecFile = (file: string, args: string[], options: {
|
|
5
|
+
timeout: number;
|
|
6
|
+
}) => Promise<{
|
|
7
|
+
stderr: string;
|
|
8
|
+
stdout: string;
|
|
9
|
+
}>;
|
|
10
|
+
export interface DockerRunnerOptions {
|
|
11
|
+
dockerCommand: string;
|
|
12
|
+
execFile: DockerArtifactExecFile;
|
|
13
|
+
timeoutMs: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* True when `containerRef` (an id or name) still exists in Docker, false when Docker
|
|
17
|
+
* reports it missing (a stopped-and-removed container, or one never created). Any other
|
|
18
|
+
* Docker failure (daemon unreachable, context misconfigured, ...) is re-thrown rather than
|
|
19
|
+
* folded into "missing" — export-before-teardown detection must not misreport a genuine
|
|
20
|
+
* Docker connectivity problem as "this deployment was already torn down".
|
|
21
|
+
*/
|
|
22
|
+
export declare const containerExists: (target: DeploymentRecord["target"], containerRef: string, options: DockerRunnerOptions) => Promise<boolean>;
|
|
23
|
+
/** `docker cp <containerRef>:<containerPath> <hostPath>` — best-effort, returns false
|
|
24
|
+
* instead of throwing (a single missing file inside an otherwise-live container is a
|
|
25
|
+
* per-file concern, handled by the caller via each planned file's `optional` flag). */
|
|
26
|
+
export declare const copyContainerFileToHost: (input: {
|
|
27
|
+
containerPath: string;
|
|
28
|
+
containerRef: string;
|
|
29
|
+
hostPath: string;
|
|
30
|
+
target: DeploymentRecord["target"];
|
|
31
|
+
} & DockerRunnerOptions) => Promise<boolean>;
|
|
32
|
+
/**
|
|
33
|
+
* Reads one file out of a named Docker volume without needing the volume's original
|
|
34
|
+
* container: creates a throwaway container (never started — its own entrypoint never
|
|
35
|
+
* runs) with the volume read-only mounted, `docker cp`s the single file out, then always
|
|
36
|
+
* removes the throwaway container. `readerImage` is expected to be an image already
|
|
37
|
+
* present locally (the deployment's own `unit.image_tag` is the natural choice — it is
|
|
38
|
+
* guaranteed to exist wherever the deployment itself ran, so this never needs to pull a
|
|
39
|
+
* new "tiny image" from a registry).
|
|
40
|
+
*/
|
|
41
|
+
export declare const copyVolumeFileToHost: (input: {
|
|
42
|
+
hostPath: string;
|
|
43
|
+
readerImage: string;
|
|
44
|
+
target: DeploymentRecord["target"];
|
|
45
|
+
volumeName: string;
|
|
46
|
+
volumePath: string;
|
|
47
|
+
} & DockerRunnerOptions) => Promise<boolean>;
|
|
48
|
+
export declare const defaultDockerArtifactExecFile: DockerArtifactExecFile;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { execFile as execFileCallback } from "node:child_process";
|
|
3
|
+
import { promisify } from "node:util";
|
|
4
|
+
import { dockerContextNameForTarget } from "./target.js";
|
|
5
|
+
const execFile = promisify(execFileCallback);
|
|
6
|
+
const withDockerTarget = (target, args) => {
|
|
7
|
+
const context = dockerContextNameForTarget(target);
|
|
8
|
+
if (context) {
|
|
9
|
+
return ["--context", context, ...args];
|
|
10
|
+
}
|
|
11
|
+
if (target.kind === "host") {
|
|
12
|
+
return ["--host", target.value, ...args];
|
|
13
|
+
}
|
|
14
|
+
return args;
|
|
15
|
+
};
|
|
16
|
+
const toErrorMessage = (error) => {
|
|
17
|
+
if (typeof error === "object" && error !== null && "stderr" in error) {
|
|
18
|
+
const stderr = error.stderr;
|
|
19
|
+
if (typeof stderr === "string" && stderr.length > 0) {
|
|
20
|
+
return stderr.trim();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return error instanceof Error ? error.message : String(error);
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* True when `containerRef` (an id or name) still exists in Docker, false when Docker
|
|
27
|
+
* reports it missing (a stopped-and-removed container, or one never created). Any other
|
|
28
|
+
* Docker failure (daemon unreachable, context misconfigured, ...) is re-thrown rather than
|
|
29
|
+
* folded into "missing" — export-before-teardown detection must not misreport a genuine
|
|
30
|
+
* Docker connectivity problem as "this deployment was already torn down".
|
|
31
|
+
*/
|
|
32
|
+
export const containerExists = async (target, containerRef, options) => {
|
|
33
|
+
try {
|
|
34
|
+
await options.execFile(options.dockerCommand, withDockerTarget(target, ["inspect", "--type", "container", containerRef]), { timeout: options.timeoutMs });
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
const message = toErrorMessage(error);
|
|
39
|
+
if (/No such (?:object|container)/i.test(message)) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
throw new Error(`Unable to check whether container "${containerRef}" exists: ${message}`);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
/** `docker cp <containerRef>:<containerPath> <hostPath>` — best-effort, returns false
|
|
46
|
+
* instead of throwing (a single missing file inside an otherwise-live container is a
|
|
47
|
+
* per-file concern, handled by the caller via each planned file's `optional` flag). */
|
|
48
|
+
export const copyContainerFileToHost = async (input) => {
|
|
49
|
+
try {
|
|
50
|
+
await input.execFile(input.dockerCommand, withDockerTarget(input.target, ["cp", `${input.containerRef}:${input.containerPath}`, input.hostPath]), { timeout: input.timeoutMs });
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Reads one file out of a named Docker volume without needing the volume's original
|
|
59
|
+
* container: creates a throwaway container (never started — its own entrypoint never
|
|
60
|
+
* runs) with the volume read-only mounted, `docker cp`s the single file out, then always
|
|
61
|
+
* removes the throwaway container. `readerImage` is expected to be an image already
|
|
62
|
+
* present locally (the deployment's own `unit.image_tag` is the natural choice — it is
|
|
63
|
+
* guaranteed to exist wherever the deployment itself ran, so this never needs to pull a
|
|
64
|
+
* new "tiny image" from a registry).
|
|
65
|
+
*/
|
|
66
|
+
export const copyVolumeFileToHost = async (input) => {
|
|
67
|
+
const mountPoint = "/spawnfile-export-src";
|
|
68
|
+
const readerContainerName = `spawnfile-artifacts-export-${randomUUID()}`;
|
|
69
|
+
try {
|
|
70
|
+
await input.execFile(input.dockerCommand, withDockerTarget(input.target, [
|
|
71
|
+
"create",
|
|
72
|
+
"--name", readerContainerName,
|
|
73
|
+
"-v", `${input.volumeName}:${mountPoint}:ro`,
|
|
74
|
+
input.readerImage
|
|
75
|
+
]), { timeout: input.timeoutMs });
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
await input.execFile(input.dockerCommand, withDockerTarget(input.target, ["cp", `${readerContainerName}:${mountPoint}/${input.volumePath}`, input.hostPath]), { timeout: input.timeoutMs });
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
await input.execFile(input.dockerCommand, withDockerTarget(input.target, ["rm", "-f", readerContainerName]), { timeout: input.timeoutMs }).catch(() => undefined);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
export const defaultDockerArtifactExecFile = execFile;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { CompileReport } from "../report/index.js";
|
|
2
|
+
/** One durable-artifact file `spawnfile artifacts export` egresses, and where it lands
|
|
3
|
+
* under `<out>` (Decision 21 §2 run-dir layout). Pure planning data — no Docker/IO here;
|
|
4
|
+
* `artifactsExport.ts` executes each plan entry and `artifactsExportDocker.ts` knows how. */
|
|
5
|
+
export interface PlannedExportFile {
|
|
6
|
+
/** Path relative to the export destination directory, e.g. "raw/moltnet/causal.jsonl". */
|
|
7
|
+
relativePath: string;
|
|
8
|
+
source: {
|
|
9
|
+
kind: "volume";
|
|
10
|
+
volumeName: string;
|
|
11
|
+
volumePath: string;
|
|
12
|
+
} | {
|
|
13
|
+
kind: "container";
|
|
14
|
+
containerPath: string;
|
|
15
|
+
};
|
|
16
|
+
/** True when the file may legitimately be absent (e.g. a bank's causal.jsonl before any
|
|
17
|
+
* recall event, or events.jsonl before any memory write) — a missing optional file is a
|
|
18
|
+
* silent skip, never a diagnostic. Non-optional sources missing is worth flagging. */
|
|
19
|
+
optional: boolean;
|
|
20
|
+
}
|
|
21
|
+
/** Resolves every durable artifact file this run's compile report declares, and where each
|
|
22
|
+
* one is read from. Pure function of the compile report alone (no deployment record, no
|
|
23
|
+
* Docker) — `artifactsExport.ts` supplies the live container name at execution time. */
|
|
24
|
+
export declare const planArtifactExports: (report: CompileReport) => PlannedExportFile[];
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import path from "node:path/posix";
|
|
2
|
+
const AGENT_NODE_ID_PREFIX = "agent:";
|
|
3
|
+
const TEAM_NODE_ID_PREFIX = "team:";
|
|
4
|
+
/** Strips the compiler's `agent:` node-id prefix down to the generated runtime slug, the
|
|
5
|
+
* same convention `src/e2e/moltnetMemeticsArtifacts.ts`'s `agentSlugFromNodeId` uses (kept
|
|
6
|
+
* as a local copy here rather than an import: compiler/deployment code must not depend on
|
|
7
|
+
* `src/e2e`, per that folder's own charter — e2e depends on compiler, never the reverse). */
|
|
8
|
+
const agentSlugFromNodeId = (nodeId) => {
|
|
9
|
+
if (nodeId.startsWith(AGENT_NODE_ID_PREFIX)) {
|
|
10
|
+
return nodeId.slice(AGENT_NODE_ID_PREFIX.length);
|
|
11
|
+
}
|
|
12
|
+
return nodeId.startsWith(TEAM_NODE_ID_PREFIX) ? null : nodeId;
|
|
13
|
+
};
|
|
14
|
+
const mountById = (mounts) => new Map((mounts ?? []).map((mount) => [mount.id, mount]));
|
|
15
|
+
/** Moltnet: one `causal.jsonl` and one `transcript.json` per managed network, always
|
|
16
|
+
* mounted at the causal directory's own root (see `moltnetArtifacts.ts`'s
|
|
17
|
+
* `createMoltnetCausalDirectory` — the mount path IS the directory the event file lives
|
|
18
|
+
* directly under). A single managed network exports to the flat `raw/moltnet/causal.jsonl`;
|
|
19
|
+
* more than one disambiguates by network id under `raw/moltnet/<network_id>/causal.jsonl`.
|
|
20
|
+
*
|
|
21
|
+
* The transcript rides the SAME mount deliberately: the causal log records only
|
|
22
|
+
* `content_sha256`, so the transcript's text is verified against the log sitting beside it
|
|
23
|
+
* rather than trusted on its own. See moltnet's `internal/observability/transcript.go` for
|
|
24
|
+
* why that volume now holds message bodies and what its attestation does and does not
|
|
25
|
+
* cover. */
|
|
26
|
+
const planMoltnetFiles = (report, mounts) => {
|
|
27
|
+
const managedNetworkIds = (report.container?.moltnet?.server_plans ?? [])
|
|
28
|
+
.filter((serverPlan) => serverPlan.mode === "managed")
|
|
29
|
+
.map((serverPlan) => serverPlan.network_id);
|
|
30
|
+
const resolved = managedNetworkIds
|
|
31
|
+
.map((networkId) => ({ mount: mounts.get(`moltnet-${networkId}-causal`), networkId }))
|
|
32
|
+
.filter((entry) => entry.mount !== undefined);
|
|
33
|
+
const singleNetwork = resolved.length === 1;
|
|
34
|
+
return resolved.flatMap(({ mount, networkId }) => [{
|
|
35
|
+
// A managed network that received zero room messages has no causal.jsonl yet — no
|
|
36
|
+
// room activity is a legitimate (if unusual) state, not an export failure.
|
|
37
|
+
optional: true,
|
|
38
|
+
relativePath: singleNetwork
|
|
39
|
+
? "raw/moltnet/causal.jsonl"
|
|
40
|
+
: `raw/moltnet/${networkId}/causal.jsonl`,
|
|
41
|
+
source: { kind: "volume", volumeName: mount.volume_name, volumePath: "causal.jsonl" }
|
|
42
|
+
}, {
|
|
43
|
+
// Optional for the same reason: a network with zero accepted messages has no
|
|
44
|
+
// transcript yet.
|
|
45
|
+
optional: true,
|
|
46
|
+
relativePath: singleNetwork
|
|
47
|
+
? "raw/moltnet/transcript.json"
|
|
48
|
+
: `raw/moltnet/${networkId}/transcript.json`,
|
|
49
|
+
source: { kind: "volume", volumeName: mount.volume_name, volumePath: "transcript.json" }
|
|
50
|
+
}]);
|
|
51
|
+
};
|
|
52
|
+
/** Mneme: each durable (json/sqlite-backed) bank writes its append-only ledger
|
|
53
|
+
* (`events.jsonl`) and causal stream (`causal.jsonl`) into a `memory/` subdirectory of its
|
|
54
|
+
* own mount root — not the mount root itself (verified live; see
|
|
55
|
+
* `ecosystem/mneme/src/store/store.ts`'s `JsonlMemoryStore` and `causalStore.ts`'s
|
|
56
|
+
* `CausalEventStore`, both keyed off the same `<runtimeHomePath>/memory` dir, where
|
|
57
|
+
* `runtimeHomePath` is exactly this mount's path). Both files are optional: a bank with no
|
|
58
|
+
* recall yet has no causal.jsonl, and one with no writes yet has no events.jsonl. */
|
|
59
|
+
const planMnemeFiles = (report, mounts) => (report.container?.memory ?? []).flatMap((bank) => {
|
|
60
|
+
const mountId = bank.store.persistent_mount_id;
|
|
61
|
+
const mount = mountId ? mounts.get(mountId) : undefined;
|
|
62
|
+
if (!mount) {
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
return ["causal.jsonl", "events.jsonl"].map((fileName) => ({
|
|
66
|
+
optional: true,
|
|
67
|
+
relativePath: `raw/mneme/${bank.id}/${fileName}`,
|
|
68
|
+
source: {
|
|
69
|
+
kind: "volume",
|
|
70
|
+
volumeName: mount.volume_name,
|
|
71
|
+
volumePath: `memory/${fileName}`
|
|
72
|
+
}
|
|
73
|
+
}));
|
|
74
|
+
});
|
|
75
|
+
/** Daimon: per pi/daimon runtime instance, per agent it covers, the turn-causal telemetry
|
|
76
|
+
* stream at `runtime/agents/<slug>/telemetry/causal.jsonl` under the instance root (see
|
|
77
|
+
* `ecosystem/daimon/src/observability/causalEvents.ts`). As of Piece 4b, that directory is
|
|
78
|
+
* a run-scoped durable volume (`daimonTelemetryArtifacts.ts`, mirroring how
|
|
79
|
+
* `moltnetArtifacts.ts` mounts the Moltnet causal directory), resolved here via each
|
|
80
|
+
* instance's `telemetry_mount_ids` (node id -> persistent mount id). This is the real
|
|
81
|
+
* relaxation of the export-before-teardown invariant (Decision 21) for daimon truth:
|
|
82
|
+
* `spawnfile down` (without `--volumes`) can run BEFORE `spawnfile artifacts export`, and
|
|
83
|
+
* export still recovers every agent's causal.jsonl from its named volume.
|
|
84
|
+
*
|
|
85
|
+
* The `instance.home_path`-keyed branch below is a legacy fallback for a compile report
|
|
86
|
+
* written before Piece 4b (no `telemetry_mount_ids` yet) — it reads the old container-local
|
|
87
|
+
* path with `docker cp`, which only works while the container is still live. Any report
|
|
88
|
+
* produced by this compiler build always populates `telemetry_mount_ids` for a pi/daimon
|
|
89
|
+
* instance, so that branch never fires today; it exists only so an out-of-date report
|
|
90
|
+
* doesn't silently export zero daimon files. Optional either way: a fresh instance that
|
|
91
|
+
* never woke has no telemetry file yet. */
|
|
92
|
+
const planDaimonFiles = (report, mounts) => (report.container?.runtime_instances ?? [])
|
|
93
|
+
.filter((instance) => instance.runtime === "pi" || instance.runtime === "daimon")
|
|
94
|
+
.flatMap((instance) => (instance.node_ids ?? []).flatMap((nodeId) => {
|
|
95
|
+
const slug = agentSlugFromNodeId(nodeId);
|
|
96
|
+
if (!slug) {
|
|
97
|
+
return [];
|
|
98
|
+
}
|
|
99
|
+
const mountId = instance.telemetry_mount_ids?.[nodeId];
|
|
100
|
+
const mount = mountId ? mounts.get(mountId) : undefined;
|
|
101
|
+
if (mount) {
|
|
102
|
+
return [{
|
|
103
|
+
optional: true,
|
|
104
|
+
relativePath: `raw/daimon/${slug}/causal.jsonl`,
|
|
105
|
+
source: {
|
|
106
|
+
kind: "volume",
|
|
107
|
+
volumeName: mount.volume_name,
|
|
108
|
+
volumePath: "causal.jsonl"
|
|
109
|
+
}
|
|
110
|
+
}];
|
|
111
|
+
}
|
|
112
|
+
if (!instance.home_path) {
|
|
113
|
+
return [];
|
|
114
|
+
}
|
|
115
|
+
const instanceRoot = path.dirname(instance.home_path);
|
|
116
|
+
return [{
|
|
117
|
+
optional: true,
|
|
118
|
+
relativePath: `raw/daimon/${slug}/causal.jsonl`,
|
|
119
|
+
source: {
|
|
120
|
+
kind: "container",
|
|
121
|
+
containerPath: `${instanceRoot}/runtime/agents/${slug}/telemetry/causal.jsonl`
|
|
122
|
+
}
|
|
123
|
+
}];
|
|
124
|
+
}));
|
|
125
|
+
/** Resolves every durable artifact file this run's compile report declares, and where each
|
|
126
|
+
* one is read from. Pure function of the compile report alone (no deployment record, no
|
|
127
|
+
* Docker) — `artifactsExport.ts` supplies the live container name at execution time. */
|
|
128
|
+
export const planArtifactExports = (report) => {
|
|
129
|
+
const mounts = mountById(report.container?.persistent_mounts);
|
|
130
|
+
return [
|
|
131
|
+
...planMoltnetFiles(report, mounts),
|
|
132
|
+
...planMnemeFiles(report, mounts),
|
|
133
|
+
...planDaimonFiles(report, mounts)
|
|
134
|
+
];
|
|
135
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* `spawnfile.export-index.v1` — the machine contract `spawnfile artifacts
|
|
4
|
+
* export` writes at `<out>/spawnfile/export-index.json` (contracts.md's
|
|
5
|
+
* Spawnfile export-index registry row; Decision 21's Piece 3). It is the
|
|
6
|
+
* only artifact `simfile observe` needs from spawnfile beyond the raw files
|
|
7
|
+
* themselves: a manifest of what was exported, from where, and its content
|
|
8
|
+
* hash, so a future `simfile.run-manifest.v1` can fold `files` straight into
|
|
9
|
+
* its own `artifacts` array (same `{path, sha256}` shape — see
|
|
10
|
+
* `ecosystem/simfile/src/observe/manifest.ts`) without re-deriving anything.
|
|
11
|
+
*
|
|
12
|
+
* `sha256` is a bare 64-character lowercase hex digest (no `sha256:`
|
|
13
|
+
* prefix), matching `simfile.run-manifest.v1`'s `artifacts[].sha256` exactly
|
|
14
|
+
* — this is deliberate so folding this index into that manifest is a
|
|
15
|
+
* straight copy, never a reformat.
|
|
16
|
+
*/
|
|
17
|
+
export declare const EXPORT_INDEX_VERSION: "spawnfile.export-index.v1";
|
|
18
|
+
declare const exportSourceSchema: z.ZodObject<{
|
|
19
|
+
kind: z.ZodUnion<readonly [z.ZodLiteral<"volume">, z.ZodLiteral<"container">]>;
|
|
20
|
+
ref: z.ZodString;
|
|
21
|
+
}, z.core.$strict>;
|
|
22
|
+
export type ExportIndexSource = z.infer<typeof exportSourceSchema>;
|
|
23
|
+
declare const exportIndexFileSchema: z.ZodObject<{
|
|
24
|
+
path: z.ZodString;
|
|
25
|
+
sha256: z.ZodString;
|
|
26
|
+
bytes: z.ZodNumber;
|
|
27
|
+
source: z.ZodObject<{
|
|
28
|
+
kind: z.ZodUnion<readonly [z.ZodLiteral<"volume">, z.ZodLiteral<"container">]>;
|
|
29
|
+
ref: z.ZodString;
|
|
30
|
+
}, z.core.$strict>;
|
|
31
|
+
}, z.core.$strict>;
|
|
32
|
+
export type ExportIndexFile = z.infer<typeof exportIndexFileSchema>;
|
|
33
|
+
export declare const exportIndexSchema: z.ZodObject<{
|
|
34
|
+
version: z.ZodLiteral<"spawnfile.export-index.v1">;
|
|
35
|
+
run_id: z.ZodString;
|
|
36
|
+
deployment: z.ZodString;
|
|
37
|
+
exported_at: z.ZodString;
|
|
38
|
+
files: z.ZodArray<z.ZodObject<{
|
|
39
|
+
path: z.ZodString;
|
|
40
|
+
sha256: z.ZodString;
|
|
41
|
+
bytes: z.ZodNumber;
|
|
42
|
+
source: z.ZodObject<{
|
|
43
|
+
kind: z.ZodUnion<readonly [z.ZodLiteral<"volume">, z.ZodLiteral<"container">]>;
|
|
44
|
+
ref: z.ZodString;
|
|
45
|
+
}, z.core.$strict>;
|
|
46
|
+
}, z.core.$strict>>;
|
|
47
|
+
}, z.core.$strict>;
|
|
48
|
+
export type ExportIndex = z.infer<typeof exportIndexSchema>;
|
|
49
|
+
export declare const parseExportIndex: (raw: unknown) => ExportIndex;
|
|
50
|
+
export {};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* `spawnfile.export-index.v1` — the machine contract `spawnfile artifacts
|
|
4
|
+
* export` writes at `<out>/spawnfile/export-index.json` (contracts.md's
|
|
5
|
+
* Spawnfile export-index registry row; Decision 21's Piece 3). It is the
|
|
6
|
+
* only artifact `simfile observe` needs from spawnfile beyond the raw files
|
|
7
|
+
* themselves: a manifest of what was exported, from where, and its content
|
|
8
|
+
* hash, so a future `simfile.run-manifest.v1` can fold `files` straight into
|
|
9
|
+
* its own `artifacts` array (same `{path, sha256}` shape — see
|
|
10
|
+
* `ecosystem/simfile/src/observe/manifest.ts`) without re-deriving anything.
|
|
11
|
+
*
|
|
12
|
+
* `sha256` is a bare 64-character lowercase hex digest (no `sha256:`
|
|
13
|
+
* prefix), matching `simfile.run-manifest.v1`'s `artifacts[].sha256` exactly
|
|
14
|
+
* — this is deliberate so folding this index into that manifest is a
|
|
15
|
+
* straight copy, never a reformat.
|
|
16
|
+
*/
|
|
17
|
+
export const EXPORT_INDEX_VERSION = "spawnfile.export-index.v1";
|
|
18
|
+
const sha256HexSchema = z
|
|
19
|
+
.string()
|
|
20
|
+
.regex(/^[0-9a-f]{64}$/u, "sha256 must be a 64-character lowercase hex digest");
|
|
21
|
+
const exportSourceSchema = z
|
|
22
|
+
.object({
|
|
23
|
+
kind: z.union([z.literal("volume"), z.literal("container")]),
|
|
24
|
+
ref: z.string().min(1)
|
|
25
|
+
})
|
|
26
|
+
.strict();
|
|
27
|
+
const exportIndexFileSchema = z
|
|
28
|
+
.object({
|
|
29
|
+
path: z.string().min(1),
|
|
30
|
+
sha256: sha256HexSchema,
|
|
31
|
+
bytes: z.number().int().nonnegative(),
|
|
32
|
+
source: exportSourceSchema
|
|
33
|
+
})
|
|
34
|
+
.strict();
|
|
35
|
+
export const exportIndexSchema = z
|
|
36
|
+
.object({
|
|
37
|
+
version: z.literal(EXPORT_INDEX_VERSION),
|
|
38
|
+
run_id: z.string().min(1),
|
|
39
|
+
deployment: z.string().min(1),
|
|
40
|
+
exported_at: z.string().min(1),
|
|
41
|
+
files: z.array(exportIndexFileSchema)
|
|
42
|
+
})
|
|
43
|
+
.strict();
|
|
44
|
+
export const parseExportIndex = (raw) => {
|
|
45
|
+
const result = exportIndexSchema.safeParse(raw);
|
|
46
|
+
if (!result.success) {
|
|
47
|
+
throw new Error(`invalid ${EXPORT_INDEX_VERSION}: ${result.error.issues
|
|
48
|
+
.map((issue) => `${issue.path.join(".") || "<root>"}: ${issue.message}`)
|
|
49
|
+
.join("; ")}`);
|
|
50
|
+
}
|
|
51
|
+
return result.data;
|
|
52
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const BUILD_IMAGE_CACHE_VERSION: "spawnfile.build-image-cache.v1";
|
|
3
|
+
export declare const buildImageCacheEntrySchema: z.ZodObject<{
|
|
4
|
+
compileFingerprint: z.ZodString;
|
|
5
|
+
contextDigest: z.ZodString;
|
|
6
|
+
dockerContext: z.ZodNullable<z.ZodString>;
|
|
7
|
+
imageId: z.ZodString;
|
|
8
|
+
imageTag: z.ZodString;
|
|
9
|
+
projectRoot: z.ZodString;
|
|
10
|
+
version: z.ZodLiteral<"spawnfile.build-image-cache.v1">;
|
|
11
|
+
writtenAt: z.ZodString;
|
|
12
|
+
}, z.core.$strict>;
|
|
13
|
+
export type BuildImageCacheEntry = z.infer<typeof buildImageCacheEntrySchema>;
|
|
14
|
+
export interface BuildImageCacheKeyInput {
|
|
15
|
+
dockerContext?: string | null;
|
|
16
|
+
imageTag: string;
|
|
17
|
+
projectRoot: string;
|
|
18
|
+
}
|
|
19
|
+
export declare const createBuildImageCacheKey: (input: BuildImageCacheKeyInput) => string;
|
|
20
|
+
export declare const resolveBuildImageCacheDirectory: () => string;
|
|
21
|
+
export declare const resolveBuildImageCachePath: (input: BuildImageCacheKeyInput) => string;
|
|
22
|
+
export declare const readBuildImageCacheEntry: (input: BuildImageCacheKeyInput) => Promise<BuildImageCacheEntry | null>;
|
|
23
|
+
export declare const writeBuildImageCacheEntry: (entry: BuildImageCacheEntry) => Promise<boolean>;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { resolveSpawnfileHome } from "../auth/index.js";
|
|
6
|
+
import { ensureDirectory } from "../filesystem/index.js";
|
|
7
|
+
export const BUILD_IMAGE_CACHE_VERSION = "spawnfile.build-image-cache.v1";
|
|
8
|
+
export const buildImageCacheEntrySchema = z.object({
|
|
9
|
+
compileFingerprint: z.string().min(1),
|
|
10
|
+
contextDigest: z.string().regex(/^sha256:[a-f0-9]{64}$/u),
|
|
11
|
+
dockerContext: z.string().min(1).nullable(),
|
|
12
|
+
imageId: z.string().min(1),
|
|
13
|
+
imageTag: z.string().min(1),
|
|
14
|
+
projectRoot: z.string().min(1),
|
|
15
|
+
version: z.literal(BUILD_IMAGE_CACHE_VERSION),
|
|
16
|
+
writtenAt: z.string().min(1)
|
|
17
|
+
}).strict();
|
|
18
|
+
export const createBuildImageCacheKey = (input) => createHash("sha256")
|
|
19
|
+
.update(`${input.projectRoot}\0${input.imageTag}\0${input.dockerContext ?? ""}`)
|
|
20
|
+
.digest("hex");
|
|
21
|
+
export const resolveBuildImageCacheDirectory = () => path.join(resolveSpawnfileHome(), "build-image-cache");
|
|
22
|
+
export const resolveBuildImageCachePath = (input) => path.join(resolveBuildImageCacheDirectory(), `${createBuildImageCacheKey(input)}.json`);
|
|
23
|
+
export const readBuildImageCacheEntry = async (input) => {
|
|
24
|
+
try {
|
|
25
|
+
const source = await readFile(resolveBuildImageCachePath(input), "utf8");
|
|
26
|
+
return buildImageCacheEntrySchema.parse(JSON.parse(source));
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
export const writeBuildImageCacheEntry = async (entry) => {
|
|
33
|
+
let temporaryPath = null;
|
|
34
|
+
try {
|
|
35
|
+
const parsed = buildImageCacheEntrySchema.parse(entry);
|
|
36
|
+
const directory = resolveBuildImageCacheDirectory();
|
|
37
|
+
await ensureDirectory(directory);
|
|
38
|
+
const destinationPath = resolveBuildImageCachePath(parsed);
|
|
39
|
+
temporaryPath = path.join(directory, `.${path.basename(destinationPath)}.${process.pid}.${randomUUID()}.tmp`);
|
|
40
|
+
await writeFile(temporaryPath, `${JSON.stringify(parsed, null, 2)}\n`, {
|
|
41
|
+
encoding: "utf8",
|
|
42
|
+
mode: 0o600
|
|
43
|
+
});
|
|
44
|
+
await rename(temporaryPath, destinationPath);
|
|
45
|
+
temporaryPath = null;
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
if (temporaryPath) {
|
|
50
|
+
await rm(temporaryPath, { force: true }).catch(() => undefined);
|
|
51
|
+
}
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { DeploymentRecord } from "./record.js";
|
|
2
|
+
export interface DeploymentLifecycleCorrelation {
|
|
3
|
+
compile_fingerprint: string;
|
|
4
|
+
deployment_instance_digest: string;
|
|
5
|
+
deployment: string;
|
|
6
|
+
run_id: string | null;
|
|
7
|
+
target: string;
|
|
8
|
+
}
|
|
9
|
+
export declare const createDeploymentInstanceDigest: (record: DeploymentRecord) => string;
|
|
10
|
+
export declare const createDeploymentLifecycleCorrelation: (record: DeploymentRecord) => DeploymentLifecycleCorrelation;
|
|
11
|
+
export declare const assertDeploymentLifecycleCorrelation: (record: DeploymentRecord, expected: DeploymentLifecycleCorrelation | undefined) => void;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { SpawnfileError } from "../shared/index.js";
|
|
3
|
+
const canonical = (value) => {
|
|
4
|
+
if (Array.isArray(value))
|
|
5
|
+
return `[${value.map(canonical).join(",")}]`;
|
|
6
|
+
if (value !== null && typeof value === "object") {
|
|
7
|
+
const record = value;
|
|
8
|
+
return `{${Object.keys(record)
|
|
9
|
+
.sort()
|
|
10
|
+
.map((key) => `${JSON.stringify(key)}:${canonical(record[key])}`)
|
|
11
|
+
.join(",")}}`;
|
|
12
|
+
}
|
|
13
|
+
return JSON.stringify(value);
|
|
14
|
+
};
|
|
15
|
+
export const createDeploymentInstanceDigest = (record) => {
|
|
16
|
+
const { export_index: _mutableExport, ...immutable } = record;
|
|
17
|
+
return `sha256:${createHash("sha256")
|
|
18
|
+
.update(canonical(immutable))
|
|
19
|
+
.digest("hex")}`;
|
|
20
|
+
};
|
|
21
|
+
export const createDeploymentLifecycleCorrelation = (record) => ({
|
|
22
|
+
compile_fingerprint: record.compile_fingerprint,
|
|
23
|
+
deployment: record.name,
|
|
24
|
+
deployment_instance_digest: createDeploymentInstanceDigest(record),
|
|
25
|
+
run_id: record.run_id ?? null,
|
|
26
|
+
target: JSON.stringify(record.target),
|
|
27
|
+
});
|
|
28
|
+
export const assertDeploymentLifecycleCorrelation = (record, expected) => {
|
|
29
|
+
if (expected &&
|
|
30
|
+
JSON.stringify(createDeploymentLifecycleCorrelation(record)) !==
|
|
31
|
+
JSON.stringify(expected))
|
|
32
|
+
throw new SpawnfileError("runtime_error", "Deployment changed after lifecycle admission; refusing effect");
|
|
33
|
+
};
|
|
@@ -11,6 +11,7 @@ export interface DockerUnitInspection {
|
|
|
11
11
|
exists: boolean | null;
|
|
12
12
|
exitCode: number | null;
|
|
13
13
|
finishedAt: string | null;
|
|
14
|
+
identity: DockerDeploymentIdentity | null;
|
|
14
15
|
imageId: string | null;
|
|
15
16
|
message: string;
|
|
16
17
|
restartCount: number | null;
|
|
@@ -20,6 +21,14 @@ export interface DockerUnitInspection {
|
|
|
20
21
|
status: string | null;
|
|
21
22
|
unitId: string;
|
|
22
23
|
}
|
|
24
|
+
export interface DockerDeploymentIdentity {
|
|
25
|
+
readonly compileFingerprint: string;
|
|
26
|
+
readonly deployment: string;
|
|
27
|
+
readonly project: string;
|
|
28
|
+
readonly runId: string;
|
|
29
|
+
readonly unit: string;
|
|
30
|
+
readonly version: string;
|
|
31
|
+
}
|
|
23
32
|
export type DockerInspectionResult = Map<string, DockerUnitInspection>;
|
|
24
33
|
export interface DockerInspectOptions {
|
|
25
34
|
dockerCommand?: string;
|
|
@@ -1,10 +1,30 @@
|
|
|
1
1
|
import { execFile as execFileCallback } from "node:child_process";
|
|
2
2
|
import { promisify } from "node:util";
|
|
3
|
+
import { dockerDeploymentLabelKeys } from "./dockerLabels.js";
|
|
3
4
|
import { dockerContextNameForTarget, verifyDockerDeploymentTarget } from "./target.js";
|
|
4
5
|
const execFile = promisify(execFileCallback);
|
|
5
6
|
const toStringOrNull = (value) => typeof value === "string" && value.length > 0 ? value : null;
|
|
6
7
|
const toNumberOrNull = (value) => typeof value === "number" && Number.isFinite(value) ? value : null;
|
|
7
8
|
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
9
|
+
const identifierLabelValuePattern = /^[A-Za-z0-9][A-Za-z0-9_.:-]{0,127}$/;
|
|
10
|
+
const identityFromInspection = (inspected) => {
|
|
11
|
+
const config = isRecord(inspected.Config) ? inspected.Config : null;
|
|
12
|
+
const labels = config && isRecord(config.Labels) ? config.Labels : null;
|
|
13
|
+
if (!labels)
|
|
14
|
+
return null;
|
|
15
|
+
const values = {
|
|
16
|
+
compileFingerprint: labels[dockerDeploymentLabelKeys.compileFingerprint],
|
|
17
|
+
deployment: labels[dockerDeploymentLabelKeys.deployment],
|
|
18
|
+
project: labels[dockerDeploymentLabelKeys.project],
|
|
19
|
+
runId: labels[dockerDeploymentLabelKeys.runId],
|
|
20
|
+
unit: labels[dockerDeploymentLabelKeys.unit],
|
|
21
|
+
version: labels[dockerDeploymentLabelKeys.version]
|
|
22
|
+
};
|
|
23
|
+
if (Object.values(values).some((value) => typeof value !== "string" || !identifierLabelValuePattern.test(value))) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
return values;
|
|
27
|
+
};
|
|
8
28
|
const targetRefForUnit = (unit) => unit.container_id ?? unit.container_name;
|
|
9
29
|
const argsForInspect = (record, targetRef) => {
|
|
10
30
|
const context = dockerContextNameForTarget(record.target);
|
|
@@ -46,9 +66,10 @@ const inspectionFromState = (unitId, unit, inspected, state) => {
|
|
|
46
66
|
exists: true,
|
|
47
67
|
exitCode: toNumberOrNull(state.ExitCode),
|
|
48
68
|
finishedAt: toStringOrNull(state.FinishedAt),
|
|
69
|
+
identity: running === true ? identityFromInspection(inspected) : null,
|
|
49
70
|
imageId,
|
|
50
71
|
message: drift.length > 0 ? `${baseMessage}; ${drift.join("; ")}` : baseMessage,
|
|
51
|
-
restartCount: toNumberOrNull(
|
|
72
|
+
restartCount: toNumberOrNull(inspected.RestartCount),
|
|
52
73
|
running,
|
|
53
74
|
severity: drift.length > 0 ? "warn" : running === false ? "error" : "ok",
|
|
54
75
|
startedAt: toStringOrNull(state.StartedAt),
|
|
@@ -62,6 +83,7 @@ const missingInspection = (unitId, message) => ({
|
|
|
62
83
|
exists: false,
|
|
63
84
|
exitCode: null,
|
|
64
85
|
finishedAt: null,
|
|
86
|
+
identity: null,
|
|
65
87
|
imageId: null,
|
|
66
88
|
message,
|
|
67
89
|
restartCount: null,
|
|
@@ -77,6 +99,7 @@ const unknownInspection = (unitId, message, severity = "unknown") => ({
|
|
|
77
99
|
exists: null,
|
|
78
100
|
exitCode: null,
|
|
79
101
|
finishedAt: null,
|
|
102
|
+
identity: null,
|
|
80
103
|
imageId: null,
|
|
81
104
|
message,
|
|
82
105
|
restartCount: null,
|
|
@@ -2,6 +2,7 @@ export declare const dockerDeploymentLabelKeys: {
|
|
|
2
2
|
readonly compileFingerprint: "com.spawnfile.compile_fingerprint";
|
|
3
3
|
readonly deployment: "com.spawnfile.deployment";
|
|
4
4
|
readonly project: "com.spawnfile.project";
|
|
5
|
+
readonly runId: "com.spawnfile.run_id";
|
|
5
6
|
readonly unit: "com.spawnfile.unit";
|
|
6
7
|
readonly version: "com.spawnfile.version";
|
|
7
8
|
};
|
|
@@ -9,6 +10,7 @@ export interface DockerDeploymentLabelInput {
|
|
|
9
10
|
compileFingerprint: string;
|
|
10
11
|
deployment: string;
|
|
11
12
|
project: string;
|
|
13
|
+
runId?: string;
|
|
12
14
|
unit: string;
|
|
13
15
|
version: string;
|
|
14
16
|
}
|
|
@@ -3,6 +3,7 @@ export const dockerDeploymentLabelKeys = {
|
|
|
3
3
|
compileFingerprint: "com.spawnfile.compile_fingerprint",
|
|
4
4
|
deployment: "com.spawnfile.deployment",
|
|
5
5
|
project: "com.spawnfile.project",
|
|
6
|
+
runId: "com.spawnfile.run_id",
|
|
6
7
|
unit: "com.spawnfile.unit",
|
|
7
8
|
version: "com.spawnfile.version"
|
|
8
9
|
};
|
|
@@ -17,6 +18,7 @@ export const createDockerDeploymentLabels = (input) => {
|
|
|
17
18
|
[dockerDeploymentLabelKeys.compileFingerprint]: input.compileFingerprint,
|
|
18
19
|
[dockerDeploymentLabelKeys.deployment]: input.deployment,
|
|
19
20
|
[dockerDeploymentLabelKeys.project]: input.project,
|
|
21
|
+
...(input.runId ? { [dockerDeploymentLabelKeys.runId]: input.runId } : {}),
|
|
20
22
|
[dockerDeploymentLabelKeys.unit]: input.unit,
|
|
21
23
|
[dockerDeploymentLabelKeys.version]: input.version
|
|
22
24
|
};
|