spawnfile 0.1.13 → 0.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +50 -11
- package/dist/audit/auditCli.d.ts +19 -0
- package/dist/audit/auditCli.js +63 -0
- package/dist/audit/checks.d.ts +100 -0
- package/dist/audit/checks.js +279 -0
- package/dist/audit/checksShared.d.ts +74 -0
- package/dist/audit/checksShared.js +37 -0
- package/dist/audit/generateAudit.d.ts +19 -0
- package/dist/audit/generateAudit.js +122 -0
- package/dist/audit/index.d.ts +4 -0
- package/dist/audit/index.js +4 -0
- package/dist/audit/readAudit.d.ts +50 -0
- package/dist/audit/readAudit.js +59 -0
- package/dist/audit/types.d.ts +40 -0
- package/dist/audit/types.js +8 -0
- package/dist/auth/credentialEnvFile.d.ts +11 -0
- package/dist/auth/credentialEnvFile.js +60 -0
- package/dist/auth/credentialProvisioning.d.ts +15 -0
- package/dist/auth/credentialProvisioning.js +75 -0
- package/dist/auth/credentialProvisioningReceipt.d.ts +28 -0
- package/dist/auth/credentialProvisioningReceipt.js +70 -0
- package/dist/auth/credentialProvisioningRequest.d.ts +51 -0
- package/dist/auth/credentialProvisioningRequest.js +169 -0
- package/dist/auth/credentialWorldBindings.d.ts +21 -0
- package/dist/auth/credentialWorldBindings.js +104 -0
- package/dist/auth/index.d.ts +7 -0
- package/dist/auth/index.js +7 -0
- package/dist/auth/paths.d.ts +11 -0
- package/dist/auth/paths.js +21 -0
- package/dist/auth/targetSecretSourceAuthor.d.ts +18 -0
- package/dist/auth/targetSecretSourceAuthor.js +52 -0
- package/dist/auth/targetSecretSourceFsPublish.d.ts +15 -0
- package/dist/auth/targetSecretSourceFsPublish.js +49 -0
- package/dist/auth/targetSecretSourceFsPublishImmutable.d.ts +16 -0
- package/dist/auth/targetSecretSourceFsPublishImmutable.js +435 -0
- package/dist/auth/targetSecretSourceFsRead.d.ts +14 -0
- package/dist/auth/targetSecretSourceFsRead.js +198 -0
- package/dist/auth/targetSecretSourceGrant.d.ts +16 -0
- package/dist/auth/targetSecretSourceGrant.js +99 -0
- package/dist/auth/targetSecretSourceGrantRecords.d.ts +84 -0
- package/dist/auth/targetSecretSourceGrantRecords.js +214 -0
- package/dist/auth/targetSecretSourceLifecycle.d.ts +30 -0
- package/dist/auth/targetSecretSourceLifecycle.js +52 -0
- package/dist/auth/targetSecretSourceOwnerEntropy.d.ts +6 -0
- package/dist/auth/targetSecretSourceOwnerEntropy.js +28 -0
- package/dist/auth/targetSecretSourceRecordCommon.d.ts +14 -0
- package/dist/auth/targetSecretSourceRecordCommon.js +100 -0
- package/dist/auth/targetSecretSourceRecordPublish.d.ts +10 -0
- package/dist/auth/targetSecretSourceRecordPublish.js +104 -0
- package/dist/auth/targetSecretSourceResolver.d.ts +10 -0
- package/dist/auth/targetSecretSourceResolver.js +137 -0
- package/dist/auth/targetSecretSourceRevoke.d.ts +20 -0
- package/dist/auth/targetSecretSourceRevoke.js +92 -0
- package/dist/auth/targetSecretSourceRotate.d.ts +19 -0
- package/dist/auth/targetSecretSourceRotate.js +121 -0
- package/dist/auth/targetSecretSourceVersionRecords.d.ts +49 -0
- package/dist/auth/targetSecretSourceVersionRecords.js +166 -0
- package/dist/cli/artifactsCommands.d.ts +27 -0
- package/dist/cli/artifactsCommands.js +132 -0
- package/dist/cli/authCommands.d.ts +5 -0
- package/dist/cli/authCommands.js +221 -0
- package/dist/cli/compileBuildCommands.d.ts +3 -0
- package/dist/cli/compileBuildCommands.js +35 -0
- package/dist/cli/containerBundleCommand.d.ts +6 -0
- package/dist/cli/containerBundleCommand.js +116 -0
- package/dist/cli/downCommand.d.ts +25 -0
- package/dist/cli/downCommand.js +134 -0
- package/dist/cli/index.js +6 -3
- package/dist/cli/lifecycleCommands.d.ts +1 -1
- package/dist/cli/lifecycleCommands.js +11 -181
- package/dist/cli/lifecycleMachine.d.ts +19 -0
- package/dist/cli/lifecycleMachine.js +78 -0
- package/dist/cli/lifecyclePlan.d.ts +35 -0
- package/dist/cli/lifecyclePlan.js +240 -0
- package/dist/cli/lifecyclePlanningCommands.d.ts +3 -0
- package/dist/cli/lifecyclePlanningCommands.js +30 -0
- package/dist/cli/runCli.d.ts +9 -2
- package/dist/cli/runCli.js +27 -71
- package/dist/cli/runPublishCommands.d.ts +3 -0
- package/dist/cli/runPublishCommands.js +70 -0
- package/dist/cli/statusCommand.d.ts +3 -33
- package/dist/cli/statusCommand.js +19 -249
- package/dist/cli/statusCommandLive.d.ts +20 -0
- package/dist/cli/statusCommandLive.js +188 -0
- package/dist/cli/statusCommandOptions.d.ts +40 -0
- package/dist/cli/statusCommandOptions.js +42 -0
- package/dist/cli/targetCliRoute.d.ts +2 -0
- package/dist/cli/targetCliRoute.js +30 -0
- package/dist/cli/targetCommands.d.ts +33 -0
- package/dist/cli/targetCommands.js +257 -0
- package/dist/cli/targetComposedPreparationCommand.d.ts +6 -0
- package/dist/cli/targetComposedPreparationCommand.js +39 -0
- package/dist/cli/targetDefaultArtifactAuthority.d.ts +5 -0
- package/dist/cli/targetDefaultArtifactAuthority.js +28 -0
- package/dist/cli/targetDefaultAuthorities.d.ts +53 -0
- package/dist/cli/targetDefaultAuthorities.js +210 -0
- package/dist/cli/targetDefaultConfig.d.ts +68 -0
- package/dist/cli/targetDefaultConfig.js +317 -0
- package/dist/cli/targetDefaultConfigStdin.d.ts +13 -0
- package/dist/cli/targetDefaultConfigStdin.js +215 -0
- package/dist/cli/targetDefaultEnvelope.d.ts +1 -0
- package/dist/cli/targetDefaultEnvelope.js +13 -0
- package/dist/cli/targetDefaultHandlerFactory.d.ts +28 -0
- package/dist/cli/targetDefaultHandlerFactory.js +247 -0
- package/dist/cli/targetDefaultHandlers.d.ts +21 -0
- package/dist/cli/targetDefaultHandlers.js +72 -0
- package/dist/cli/targetDefaultJournalAuthority.d.ts +35 -0
- package/dist/cli/targetDefaultJournalAuthority.js +135 -0
- package/dist/cli/targetDefaultWorldClock.d.ts +4 -0
- package/dist/cli/targetDefaultWorldClock.js +14 -0
- package/dist/cli/targetDefaultWorldQueries.d.ts +5 -0
- package/dist/cli/targetDefaultWorldQueries.js +11 -0
- package/dist/cli/targetDefaultWorldReadiness.d.ts +4 -0
- package/dist/cli/targetDefaultWorldReadiness.js +17 -0
- package/dist/cli/targetEvidenceHelperResolution.d.ts +14 -0
- package/dist/cli/targetEvidenceHelperResolution.js +23 -0
- package/dist/cli/targetLookupCli.d.ts +3 -0
- package/dist/cli/targetLookupCli.js +31 -0
- package/dist/cli/targetLookupCommands.d.ts +12 -0
- package/dist/cli/targetLookupCommands.js +69 -0
- package/dist/cli/targetOperationDispatch.d.ts +58 -0
- package/dist/cli/targetOperationDispatch.js +21 -0
- package/dist/cli/targetReceiptOutput.d.ts +14 -0
- package/dist/cli/targetReceiptOutput.js +21 -0
- package/dist/cli/targetRequestFile.d.ts +14 -0
- package/dist/cli/targetRequestFile.js +63 -0
- package/dist/cli/targetSecretSourceInput.d.ts +28 -0
- package/dist/cli/targetSecretSourceInput.js +121 -0
- package/dist/cli/targetWorldClockCommand.d.ts +10 -0
- package/dist/cli/targetWorldClockCommand.js +42 -0
- package/dist/cli/targetWorldClockCrossProcess.test-helper.d.ts +13 -0
- package/dist/cli/targetWorldClockCrossProcess.test-helper.js +109 -0
- package/dist/cli/targetWorldReadinessCommand.d.ts +10 -0
- package/dist/cli/targetWorldReadinessCommand.js +43 -0
- package/dist/cli/upCommand.d.ts +3 -0
- package/dist/cli/upCommand.js +133 -0
- package/dist/cli/upImageCommand.d.ts +11 -0
- package/dist/cli/upImageCommand.js +41 -0
- package/dist/cli/upLifecycleInvocation.d.ts +41 -0
- package/dist/cli/upLifecycleInvocation.js +48 -0
- package/dist/cli/upLifecycleRecovery.d.ts +4 -0
- package/dist/cli/upLifecycleRecovery.js +53 -0
- package/dist/compiler/agentNodeMerge.d.ts +2 -0
- package/dist/compiler/agentNodeMerge.js +79 -0
- package/dist/compiler/agentSurfaces.js +11 -1
- package/dist/compiler/buildCompilePlan.js +17 -0
- package/dist/compiler/buildCompilePlanAgent.d.ts +11 -0
- package/dist/compiler/buildCompilePlanAgent.js +56 -0
- package/dist/compiler/buildCompilePlanTeams.d.ts +1 -0
- package/dist/compiler/buildCompilePlanTeams.js +4 -1
- package/dist/compiler/buildCompilePlanTraversal.js +75 -82
- package/dist/compiler/buildProject.d.ts +11 -0
- package/dist/compiler/buildProject.js +77 -2
- package/dist/compiler/compilePlanHelpers.js +2 -0
- package/dist/compiler/compileProject.d.ts +13 -0
- package/dist/compiler/compileProject.js +26 -74
- package/dist/compiler/compileProjectPolicy.d.ts +5 -0
- package/dist/compiler/compileProjectPolicy.js +21 -0
- package/dist/compiler/compileProjectReports.d.ts +9 -0
- package/dist/compiler/compileProjectReports.js +52 -0
- package/dist/compiler/containerArtifactSummaries.d.ts +7 -0
- package/dist/compiler/containerArtifactSummaries.js +138 -0
- package/dist/compiler/containerArtifacts.d.ts +10 -0
- package/dist/compiler/containerArtifacts.js +126 -125
- package/dist/compiler/containerArtifactsPlans.d.ts +5 -3
- package/dist/compiler/containerArtifactsPlans.js +31 -118
- package/dist/compiler/containerArtifactsRender.d.ts +3 -1
- package/dist/compiler/containerArtifactsRender.js +15 -12
- package/dist/compiler/containerArtifactsTypes.d.ts +12 -0
- package/dist/compiler/containerConfigEnvRender.d.ts +3 -0
- package/dist/compiler/containerConfigEnvRender.js +54 -0
- package/dist/compiler/containerEntrypointRender.d.ts +1 -0
- package/dist/compiler/containerEntrypointRender.js +56 -52
- package/dist/compiler/containerEntrypointShell.d.ts +5 -0
- package/dist/compiler/containerEntrypointShell.js +29 -0
- package/dist/compiler/containerPackageOverrides.d.ts +27 -0
- package/dist/compiler/containerPackageOverrides.js +63 -0
- package/dist/compiler/containerTargetPlanResolution.d.ts +20 -0
- package/dist/compiler/containerTargetPlanResolution.js +97 -0
- package/dist/compiler/daimonTelemetryArtifacts.d.ts +22 -0
- package/dist/compiler/daimonTelemetryArtifacts.js +61 -0
- package/dist/compiler/dockerBuildContext.d.ts +16 -0
- package/dist/compiler/dockerBuildContext.js +159 -0
- package/dist/compiler/dockerBuildSkip.d.ts +30 -0
- package/dist/compiler/dockerBuildSkip.js +81 -0
- package/dist/compiler/index.d.ts +4 -0
- package/dist/compiler/index.js +4 -0
- package/dist/compiler/memoryArtifacts.d.ts +26 -0
- package/dist/compiler/memoryArtifacts.js +134 -0
- package/dist/compiler/memoryResolution.d.ts +4 -0
- package/dist/compiler/memoryResolution.js +147 -0
- package/dist/compiler/modelEnv.d.ts +2 -0
- package/dist/compiler/modelEnv.js +6 -0
- package/dist/compiler/moltnetAllowedWakeSendersValidation.d.ts +2 -0
- package/dist/compiler/moltnetAllowedWakeSendersValidation.js +42 -0
- package/dist/compiler/moltnetArtifactPaths.d.ts +26 -0
- package/dist/compiler/moltnetArtifactPaths.js +49 -0
- package/dist/compiler/moltnetArtifactTypes.d.ts +46 -0
- package/dist/compiler/moltnetArtifactTypes.js +1 -0
- package/dist/compiler/moltnetArtifacts.d.ts +2 -40
- package/dist/compiler/moltnetArtifacts.js +43 -97
- package/dist/compiler/moltnetBinaries.d.ts +21 -4
- package/dist/compiler/moltnetBinaries.js +134 -27
- package/dist/compiler/moltnetClientConfig.js +7 -2
- package/dist/compiler/moltnetConfigLowering.d.ts +16 -1
- package/dist/compiler/moltnetConfigLowering.js +67 -5
- package/dist/compiler/moltnetExternalParticipantArtifact.d.ts +38 -0
- package/dist/compiler/moltnetExternalParticipantArtifact.js +188 -0
- package/dist/compiler/moltnetNodeConfig.js +7 -2
- package/dist/compiler/moltnetReleaseAuthority.d.ts +17 -0
- package/dist/compiler/moltnetReleaseAuthority.js +73 -0
- package/dist/compiler/moltnetReleaseDownload.d.ts +12 -0
- package/dist/compiler/moltnetReleaseDownload.js +85 -0
- package/dist/compiler/moltnetRepresentativeResolution.d.ts +1 -0
- package/dist/compiler/moltnetRepresentativeResolution.js +16 -2
- package/dist/compiler/moltnetResolution.js +72 -20
- package/dist/compiler/moltnetRoomMemberships.js +37 -9
- package/dist/compiler/moltnetServerPlans.d.ts +9 -0
- package/dist/compiler/moltnetServerPlans.js +132 -0
- package/dist/compiler/organizationIdentity.d.ts +27 -0
- package/dist/compiler/organizationIdentity.js +297 -0
- package/dist/compiler/organizationReadyEvidence.d.ts +49 -0
- package/dist/compiler/organizationReadyEvidence.js +261 -0
- package/dist/compiler/projectManifestGraph.d.ts +4 -0
- package/dist/compiler/projectManifestGraph.js +24 -0
- package/dist/compiler/runProject.d.ts +4 -0
- package/dist/compiler/runProject.js +30 -21
- package/dist/compiler/runProjectAuth.d.ts +7 -1
- package/dist/compiler/runProjectAuth.js +87 -9
- package/dist/compiler/runProjectDocker.d.ts +7 -0
- package/dist/compiler/runProjectDocker.js +31 -8
- package/dist/compiler/runProjectLifecycle.d.ts +7 -0
- package/dist/compiler/runProjectLifecycle.js +40 -0
- package/dist/compiler/syncProjectAuth.js +4 -1
- package/dist/compiler/teamContextActiveEnvironments.d.ts +13 -0
- package/dist/compiler/teamContextActiveEnvironments.js +255 -0
- package/dist/compiler/teamContextSupport.js +32 -40
- package/dist/compiler/teamContextTypes.d.ts +2 -0
- package/dist/compiler/types.d.ts +82 -1
- package/dist/compiler/upProject.d.ts +5 -0
- package/dist/compiler/upProject.js +256 -20
- package/dist/compiler/upReceipt.d.ts +36 -0
- package/dist/compiler/upReceipt.js +82 -0
- package/dist/compiler/updateProjectModels.js +42 -60
- package/dist/compiler/updateProjectRuntime.js +22 -35
- package/dist/compiler/updateProjectSurfaces.js +53 -47
- package/dist/compiler/worldBindings.d.ts +39 -0
- package/dist/compiler/worldBindings.js +247 -0
- package/dist/compiler/worldBindingsFile.d.ts +5 -0
- package/dist/compiler/worldBindingsFile.js +162 -0
- package/dist/deployment/artifactsExport.d.ts +49 -0
- package/dist/deployment/artifactsExport.js +217 -0
- package/dist/deployment/artifactsExportDocker.d.ts +48 -0
- package/dist/deployment/artifactsExportDocker.js +91 -0
- package/dist/deployment/artifactsExportPlan.d.ts +24 -0
- package/dist/deployment/artifactsExportPlan.js +135 -0
- package/dist/deployment/artifactsExportTypes.d.ts +50 -0
- package/dist/deployment/artifactsExportTypes.js +52 -0
- package/dist/deployment/buildImageCacheStore.d.ts +23 -0
- package/dist/deployment/buildImageCacheStore.js +54 -0
- package/dist/deployment/deploymentLifecycleCorrelation.d.ts +11 -0
- package/dist/deployment/deploymentLifecycleCorrelation.js +33 -0
- package/dist/deployment/dockerInspect.d.ts +9 -0
- package/dist/deployment/dockerInspect.js +24 -1
- package/dist/deployment/dockerLabels.d.ts +2 -0
- package/dist/deployment/dockerLabels.js +2 -0
- package/dist/deployment/dockerLogs.js +2 -10
- package/dist/deployment/dockerManager.d.ts +51 -0
- package/dist/deployment/dockerManager.js +118 -1
- package/dist/deployment/dockerProbeGateway.js +64 -5
- package/dist/deployment/dockerRecover.js +9 -1
- package/dist/deployment/dockerTeardown.d.ts +32 -0
- package/dist/deployment/dockerTeardown.js +61 -0
- package/dist/deployment/downDeployment.d.ts +34 -0
- package/dist/deployment/downDeployment.js +147 -0
- package/dist/deployment/downReceiptTypes.d.ts +21 -0
- package/dist/deployment/downReceiptTypes.js +30 -0
- package/dist/deployment/index.d.ts +16 -0
- package/dist/deployment/index.js +17 -0
- package/dist/deployment/lifecycleCompletion.d.ts +37 -0
- package/dist/deployment/lifecycleCompletion.js +236 -0
- package/dist/deployment/lifecycleCompletionContracts.d.ts +158 -0
- package/dist/deployment/lifecycleCompletionContracts.js +106 -0
- package/dist/deployment/lifecycleCompletionHeartbeat.d.ts +2 -0
- package/dist/deployment/lifecycleCompletionHeartbeat.js +50 -0
- package/dist/deployment/lifecycleCompletionLookup.d.ts +18 -0
- package/dist/deployment/lifecycleCompletionLookup.js +88 -0
- package/dist/deployment/lifecycleCompletionOwner.d.ts +8 -0
- package/dist/deployment/lifecycleCompletionOwner.js +31 -0
- package/dist/deployment/lifecycleCompletionParsing.d.ts +12 -0
- package/dist/deployment/lifecycleCompletionParsing.js +108 -0
- package/dist/deployment/lifecycleCompletionPaths.d.ts +9 -0
- package/dist/deployment/lifecycleCompletionPaths.js +16 -0
- package/dist/deployment/lifecycleCompletionPublication.d.ts +5 -0
- package/dist/deployment/lifecycleCompletionPublication.js +35 -0
- package/dist/deployment/lifecycleCompletionRecovery.d.ts +21 -0
- package/dist/deployment/lifecycleCompletionRecovery.js +56 -0
- package/dist/deployment/lifecycleCompletionRoot.d.ts +21 -0
- package/dist/deployment/lifecycleCompletionRoot.js +243 -0
- package/dist/deployment/lifecycleCompletionStore.d.ts +6 -0
- package/dist/deployment/lifecycleCompletionStore.js +151 -0
- package/dist/deployment/organizationHandoffAuthorityFsClient.d.ts +17 -0
- package/dist/deployment/organizationHandoffAuthorityFsClient.js +132 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorker.d.ts +1 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorker.js +285 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorkerParent.fixture.d.ts +1 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorkerParent.fixture.js +26 -0
- package/dist/deployment/organizationHandoffAuthorityStore.d.ts +41 -0
- package/dist/deployment/organizationHandoffAuthorityStore.js +348 -0
- package/dist/deployment/organizationHandoffAuthorityTypes.d.ts +76 -0
- package/dist/deployment/organizationHandoffAuthorityTypes.js +148 -0
- package/dist/deployment/organizationHandoffTypes.d.ts +29 -0
- package/dist/deployment/organizationHandoffTypes.js +80 -0
- package/dist/deployment/organizationReady.d.ts +52 -0
- package/dist/deployment/organizationReady.js +200 -0
- package/dist/deployment/privateArtifactsExport.d.ts +18 -0
- package/dist/deployment/privateArtifactsExport.js +80 -0
- package/dist/deployment/providerRuntimeBoundaryScanner.test-helper.d.ts +8 -0
- package/dist/deployment/providerRuntimeBoundaryScanner.test-helper.js +60 -0
- package/dist/deployment/record.d.ts +26 -1
- package/dist/deployment/record.js +49 -4
- package/dist/deployment/simfileFixtureBoundary.test-helper.d.ts +8 -0
- package/dist/deployment/simfileFixtureBoundary.test-helper.js +103 -0
- package/dist/deployment/target.d.ts +1 -35
- package/dist/deployment/target.js +1 -96
- package/dist/deployment/upReceiptTypes.d.ts +111 -0
- package/dist/deployment/upReceiptTypes.js +164 -0
- package/dist/dev/project.js +15 -9
- package/dist/distribution/buildDistributionReport.d.ts +2 -1
- package/dist/distribution/buildDistributionReport.js +2 -1
- package/dist/distribution/distributionReportSchema.d.ts +5 -0
- package/dist/distribution/distributionReportSchema.js +7 -2
- package/dist/distribution/index.d.ts +2 -2
- package/dist/distribution/index.js +1 -1
- package/dist/distribution/types.d.ts +7 -0
- package/dist/distribution/types.js +1 -0
- package/dist/filesystem/paths.js +10 -1
- package/dist/ledger/causalConformanceCli.d.ts +1 -0
- package/dist/ledger/causalConformanceCli.js +41 -0
- package/dist/ledger/causeNamespace.d.ts +8 -0
- package/dist/ledger/causeNamespace.js +24 -0
- package/dist/ledger/conformance.d.ts +83 -0
- package/dist/ledger/conformance.js +259 -0
- package/dist/ledger/emitters.d.ts +76 -0
- package/dist/ledger/emitters.js +188 -0
- package/dist/ledger/index.d.ts +4 -0
- package/dist/ledger/index.js +4 -0
- package/dist/ledger/principal.d.ts +96 -0
- package/dist/ledger/principal.js +121 -0
- package/dist/manifest/externalParticipantSchemas.d.ts +18 -0
- package/dist/manifest/externalParticipantSchemas.js +17 -0
- package/dist/manifest/index.d.ts +1 -0
- package/dist/manifest/index.js +1 -0
- package/dist/manifest/inlineAgentMember.d.ts +2 -0
- package/dist/manifest/inlineAgentMember.js +9 -0
- package/dist/manifest/loadManifest.js +14 -8
- package/dist/manifest/mcpSchemas.d.ts +17 -0
- package/dist/manifest/mcpSchemas.js +41 -0
- package/dist/manifest/memorySchemas.d.ts +245 -0
- package/dist/manifest/memorySchemas.js +148 -0
- package/dist/manifest/renderSpawnfile.js +22 -131
- package/dist/manifest/renderSpawnfileNetworks.js +9 -2
- package/dist/manifest/renderSpawnfileSurfaces.d.ts +2 -0
- package/dist/manifest/renderSpawnfileSurfaces.js +134 -0
- package/dist/manifest/schemas.d.ts +1868 -99
- package/dist/manifest/schemas.js +78 -32
- package/dist/manifest/surfaceSchemas.d.ts +17 -0
- package/dist/manifest/surfaceSchemas.js +24 -1
- package/dist/manifest/teamNetworkAccessSchemas.d.ts +1 -1
- package/dist/manifest/teamNetworkAuthSchemas.d.ts +48 -0
- package/dist/manifest/teamNetworkAuthSchemas.js +103 -0
- package/dist/manifest/teamNetworkSchemas.d.ts +8 -187
- package/dist/manifest/teamNetworkSchemas.js +3 -317
- package/dist/manifest/teamNetworkServerSchemas.d.ts +150 -0
- package/dist/manifest/teamNetworkServerSchemas.js +199 -0
- package/dist/ownership/siblingBuildFreshness.d.ts +20 -0
- package/dist/ownership/siblingBuildFreshness.js +20 -0
- package/dist/ownership/simfileRunOperatorInputs.d.ts +103 -0
- package/dist/ownership/simfileRunOperatorInputs.js +139 -0
- package/dist/report/types.d.ts +142 -0
- package/dist/runtime/common.d.ts +35 -0
- package/dist/runtime/common.js +55 -0
- package/dist/runtime/container.d.ts +28 -1
- package/dist/runtime/container.js +38 -5
- package/dist/runtime/containerPackageOverrides.d.ts +37 -0
- package/dist/runtime/containerPackageOverrides.js +33 -0
- package/dist/runtime/index.d.ts +2 -0
- package/dist/runtime/index.js +2 -0
- package/dist/runtime/mnemeMcp.d.ts +15 -0
- package/dist/runtime/mnemeMcp.js +109 -0
- package/dist/runtime/openclaw/adapter.js +15 -4
- package/dist/runtime/openclaw/mcp.d.ts +10 -0
- package/dist/runtime/openclaw/mcp.js +69 -0
- package/dist/runtime/openclaw/runAuth.js +2 -2
- package/dist/runtime/openclaw/scaffold.js +1 -1
- package/dist/runtime/openclaw/schedules.d.ts +38 -0
- package/dist/runtime/openclaw/schedules.js +74 -0
- package/dist/runtime/pi/adapter.d.ts +1 -1
- package/dist/runtime/pi/adapter.js +86 -53
- package/dist/runtime/pi/appActivitySource.js +114 -2
- package/dist/runtime/pi/appAgentConfig.d.ts +11 -0
- package/dist/runtime/pi/appAgentConfig.js +264 -0
- package/dist/runtime/pi/appCliEnginesSource.d.ts +1 -0
- package/dist/runtime/pi/appCliEnginesSource.js +183 -0
- package/dist/runtime/pi/appCliSource.d.ts +1 -0
- package/dist/runtime/pi/appCliSource.js +353 -0
- package/dist/runtime/pi/appControlSource.d.ts +1 -0
- package/dist/runtime/pi/appControlSource.js +390 -0
- package/dist/runtime/pi/appControlWakeIdentitySource.d.ts +1 -0
- package/dist/runtime/pi/appControlWakeIdentitySource.js +19 -0
- package/dist/runtime/pi/appCoreSource.d.ts +4 -1
- package/dist/runtime/pi/appCoreSource.js +104 -214
- package/dist/runtime/pi/appPreludeSource.js +140 -52
- package/dist/runtime/pi/appScheduleSource.d.ts +1 -0
- package/dist/runtime/pi/appScheduleSource.js +80 -0
- package/dist/runtime/pi/appScriptedEngine.d.ts +31 -0
- package/dist/runtime/pi/appScriptedEngine.js +42 -0
- package/dist/runtime/pi/appSource.d.ts +4 -1
- package/dist/runtime/pi/appSource.js +6 -2
- package/dist/runtime/pi/appTemplate.d.ts +8 -22
- package/dist/runtime/pi/appTemplate.js +9 -126
- package/dist/runtime/pi/appTemplateTypes.d.ts +64 -0
- package/dist/runtime/pi/appTemplateTypes.js +18 -0
- package/dist/runtime/pi/appWakeContextSource.d.ts +1 -0
- package/dist/runtime/pi/appWakeContextSource.js +398 -0
- package/dist/runtime/pi/containerTargets.d.ts +4 -0
- package/dist/runtime/pi/containerTargets.js +57 -0
- package/dist/runtime/pi/runAuth.js +126 -9
- package/dist/runtime/pi/testHelpers.d.ts +2 -0
- package/dist/runtime/pi/testHelpers.js +40 -0
- package/dist/runtime/picoclaw/adapter.js +23 -27
- package/dist/runtime/picoclaw/mcp.d.ts +4 -0
- package/dist/runtime/picoclaw/mcp.js +43 -0
- package/dist/runtime/picoclaw/memory.d.ts +7 -0
- package/dist/runtime/picoclaw/memory.js +17 -0
- package/dist/runtime/picoclaw/runAuth.js +1 -1
- package/dist/runtime/picoclaw/scaffold.js +1 -1
- package/dist/runtime/picoclaw/schedules.d.ts +26 -0
- package/dist/runtime/picoclaw/schedules.js +62 -3
- package/dist/runtime/scheduleUtils.d.ts +2 -0
- package/dist/runtime/scheduleUtils.js +15 -0
- package/dist/runtime/types.d.ts +25 -2
- package/dist/shared/errors.d.ts +1 -1
- package/dist/shared/errors.js +2 -2
- package/dist/shared/index.d.ts +1 -0
- package/dist/shared/index.js +1 -0
- package/dist/shared/redaction.d.ts +2 -0
- package/dist/shared/redaction.js +10 -0
- package/dist/status/buildStatus.d.ts +1 -0
- package/dist/status/buildStatus.js +2 -0
- package/dist/status/compileReport.d.ts +22 -0
- package/dist/status/compileReport.js +16 -2
- package/dist/status/compiledProbeCollection.d.ts +21 -0
- package/dist/status/compiledProbeCollection.js +27 -0
- package/dist/status/imageStatusReport.js +6 -0
- package/dist/status/index.d.ts +3 -0
- package/dist/status/index.js +3 -0
- package/dist/status/lifecycleProbes.d.ts +19 -0
- package/dist/status/lifecycleProbes.js +174 -0
- package/dist/status/moltnetProbes.d.ts +7 -8
- package/dist/status/moltnetProbes.js +27 -198
- package/dist/status/moltnetWiringProbes.d.ts +19 -0
- package/dist/status/moltnetWiringProbes.js +178 -0
- package/dist/target/cleanupRun.d.ts +41 -0
- package/dist/target/cleanupRun.js +139 -0
- package/dist/target/cleanupRunDocker.d.ts +16 -0
- package/dist/target/cleanupRunDocker.js +66 -0
- package/dist/target/cleanupRunDocker.test-helper.d.ts +67 -0
- package/dist/target/cleanupRunDocker.test-helper.js +238 -0
- package/dist/target/cleanupRunDockerPreflight.d.ts +17 -0
- package/dist/target/cleanupRunDockerPreflight.js +224 -0
- package/dist/target/composedPreparation.d.ts +205 -0
- package/dist/target/composedPreparation.js +223 -0
- package/dist/target/containerBundle.d.ts +82 -0
- package/dist/target/containerBundle.js +243 -0
- package/dist/target/containerBundleArchive.d.ts +31 -0
- package/dist/target/containerBundleArchive.js +140 -0
- package/dist/target/containerBundleAuthority.d.ts +25 -0
- package/dist/target/containerBundleAuthority.js +65 -0
- package/dist/target/containerBundleContracts.d.ts +114 -0
- package/dist/target/containerBundleContracts.js +173 -0
- package/dist/target/containerBundleFilesystemStore.d.ts +3 -0
- package/dist/target/containerBundleFilesystemStore.js +247 -0
- package/dist/target/containerBundlePolicy.d.ts +33 -0
- package/dist/target/containerBundlePolicy.js +64 -0
- package/dist/target/containerBundleStore.d.ts +127 -0
- package/dist/target/containerBundleStore.js +284 -0
- package/dist/target/contracts.d.ts +538 -0
- package/dist/target/contracts.js +373 -0
- package/dist/target/dockerArtifactIdentityTypes.d.ts +56 -0
- package/dist/target/dockerArtifactIdentityTypes.js +1 -0
- package/dist/target/dockerArtifactInspection.d.ts +40 -0
- package/dist/target/dockerArtifactInspection.js +125 -0
- package/dist/target/dockerArtifacts.d.ts +21 -0
- package/dist/target/dockerArtifacts.js +110 -0
- package/dist/target/dockerArtifactsProvider.d.ts +41 -0
- package/dist/target/dockerArtifactsProvider.js +449 -0
- package/dist/target/dockerCommandExecutor.d.ts +27 -0
- package/dist/target/dockerCommandExecutor.js +200 -0
- package/dist/target/dockerCommandExecutorCore.d.ts +34 -0
- package/dist/target/dockerCommandExecutorCore.js +273 -0
- package/dist/target/dockerContainerBundleBuilder.d.ts +8 -0
- package/dist/target/dockerContainerBundleBuilder.js +256 -0
- package/dist/target/dockerContextSnapshot.d.ts +21 -0
- package/dist/target/dockerContextSnapshot.js +158 -0
- package/dist/target/dockerEndpointFingerprint.d.ts +1 -0
- package/dist/target/dockerEndpointFingerprint.js +9 -0
- package/dist/target/dockerPreparedArtifact.d.ts +48 -0
- package/dist/target/dockerPreparedArtifact.js +131 -0
- package/dist/target/dockerProjectionJson.d.ts +1 -0
- package/dist/target/dockerProjectionJson.js +80 -0
- package/dist/target/dockerPublicArtifactSnapshot.d.ts +17 -0
- package/dist/target/dockerPublicArtifactSnapshot.js +99 -0
- package/dist/target/dockerResources.d.ts +26 -0
- package/dist/target/dockerResources.js +162 -0
- package/dist/target/dockerResourcesProvider.d.ts +44 -0
- package/dist/target/dockerResourcesProvider.js +207 -0
- package/dist/target/dockerSecrets.d.ts +39 -0
- package/dist/target/dockerSecrets.js +249 -0
- package/dist/target/dockerSecretsAuthority.d.ts +26 -0
- package/dist/target/dockerSecretsAuthority.js +216 -0
- package/dist/target/dockerSecretsLifecycle.d.ts +25 -0
- package/dist/target/dockerSecretsLifecycle.js +133 -0
- package/dist/target/dockerSecretsProvider.d.ts +68 -0
- package/dist/target/dockerSecretsProvider.js +329 -0
- package/dist/target/dockerTarget.d.ts +52 -0
- package/dist/target/dockerTarget.js +48 -0
- package/dist/target/dockerTargetBinding.d.ts +14 -0
- package/dist/target/dockerTargetBinding.js +96 -0
- package/dist/target/dockerWorldClock.d.ts +17 -0
- package/dist/target/dockerWorldClock.js +111 -0
- package/dist/target/dockerWorldReadiness.d.ts +17 -0
- package/dist/target/dockerWorldReadiness.js +119 -0
- package/dist/target/dockerWorldService.d.ts +23 -0
- package/dist/target/dockerWorldService.js +216 -0
- package/dist/target/dockerWorldServiceAuthority.d.ts +80 -0
- package/dist/target/dockerWorldServiceAuthority.js +182 -0
- package/dist/target/dockerWorldServiceLifecycle.d.ts +41 -0
- package/dist/target/dockerWorldServiceLifecycle.js +275 -0
- package/dist/target/dockerWorldServiceProvider.d.ts +60 -0
- package/dist/target/dockerWorldServiceProvider.js +318 -0
- package/dist/target/dockerWorldServiceStore.d.ts +73 -0
- package/dist/target/dockerWorldServiceStore.js +367 -0
- package/dist/target/evidenceExport.d.ts +55 -0
- package/dist/target/evidenceExport.js +518 -0
- package/dist/target/evidenceExportArchive.d.ts +10 -0
- package/dist/target/evidenceExportArchive.js +302 -0
- package/dist/target/evidenceExportContract.d.ts +27 -0
- package/dist/target/evidenceExportContract.js +40 -0
- package/dist/target/evidenceExportOperationsTestKit.d.ts +87 -0
- package/dist/target/evidenceExportOperationsTestKit.js +312 -0
- package/dist/target/evidenceExportProvider.d.ts +85 -0
- package/dist/target/evidenceExportProvider.js +187 -0
- package/dist/target/evidenceExportPublicationTypes.d.ts +16 -0
- package/dist/target/evidenceExportPublicationTypes.js +1 -0
- package/dist/target/evidenceExportStore.d.ts +70 -0
- package/dist/target/evidenceExportStore.js +498 -0
- package/dist/target/evidenceExportStorePublication.d.ts +7 -0
- package/dist/target/evidenceExportStorePublication.js +395 -0
- package/dist/target/handles.d.ts +20 -0
- package/dist/target/handles.js +56 -0
- package/dist/target/index.d.ts +12 -0
- package/dist/target/index.js +11 -0
- package/dist/target/journal.d.ts +59 -0
- package/dist/target/journal.js +529 -0
- package/dist/target/journalFilesystem.d.ts +3 -0
- package/dist/target/journalFilesystem.js +111 -0
- package/dist/target/journalRoot.d.ts +4 -0
- package/dist/target/journalRoot.js +6 -0
- package/dist/target/organizationAttachment.d.ts +23 -0
- package/dist/target/organizationAttachment.js +263 -0
- package/dist/target/organizationAttachmentAuthority.d.ts +65 -0
- package/dist/target/organizationAttachmentAuthority.js +161 -0
- package/dist/target/organizationAttachmentLifecycle.d.ts +17 -0
- package/dist/target/organizationAttachmentLifecycle.js +101 -0
- package/dist/target/organizationAttachmentProvider.d.ts +76 -0
- package/dist/target/organizationAttachmentProvider.js +289 -0
- package/dist/target/organizationAttachmentStore.d.ts +51 -0
- package/dist/target/organizationAttachmentStore.js +316 -0
- package/dist/target/publicArtifactSnapshot.d.ts +41 -0
- package/dist/target/publicArtifactSnapshot.js +150 -0
- package/dist/target/topologyActivation.d.ts +51 -0
- package/dist/target/topologyActivation.js +149 -0
- package/dist/target/topologyAttestation.d.ts +37 -0
- package/dist/target/topologyAttestation.js +300 -0
- package/dist/target/topologyAttestationErrors.d.ts +1 -0
- package/dist/target/topologyAttestationErrors.js +1 -0
- package/dist/target/worldClock.d.ts +60 -0
- package/dist/target/worldClock.js +129 -0
- package/dist/target/worldReadiness.d.ts +103 -0
- package/dist/target/worldReadiness.js +153 -0
- package/moltnet-releases.json +20 -0
- package/package.json +27 -11
- package/runtimes.yaml +8 -23
- package/dist/runtime/openclaw/scaffold-assets/CLAUDE.md +0 -5
- package/dist/runtime/picoclaw/scaffold-assets/CLAUDE.md +0 -5
- /package/dist/runtime/openclaw/scaffold-assets/{AGENTS.md → WORKSPACE_AGENTS.md} +0 -0
- /package/dist/runtime/picoclaw/scaffold-assets/{AGENTS.md → WORKSPACE_AGENTS.md} +0 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { constants } from "node:fs";
|
|
3
|
+
import { open } from "node:fs/promises";
|
|
4
|
+
import { SpawnfileError } from "../shared/index.js";
|
|
5
|
+
import { resolveWorldBindings, SIMFILE_WORLD_BINDINGS_VERSION } from "./worldBindings.js";
|
|
6
|
+
export const MAX_WORLD_BINDINGS_FILE_BYTES = 1_048_576;
|
|
7
|
+
class DuplicateJsonKeyError extends Error {
|
|
8
|
+
}
|
|
9
|
+
const fail = (message) => {
|
|
10
|
+
throw new SpawnfileError("validation_error", `invalid ${SIMFILE_WORLD_BINDINGS_VERSION} file: ${message}`);
|
|
11
|
+
};
|
|
12
|
+
const assertNoDuplicateJsonKeys = (source) => {
|
|
13
|
+
let offset = 0;
|
|
14
|
+
const whitespace = () => {
|
|
15
|
+
while (/\s/u.test(source[offset] ?? ""))
|
|
16
|
+
offset += 1;
|
|
17
|
+
};
|
|
18
|
+
const string = () => {
|
|
19
|
+
const start = offset;
|
|
20
|
+
offset += 1;
|
|
21
|
+
while (offset < source.length) {
|
|
22
|
+
if (source[offset] === "\\") {
|
|
23
|
+
offset += 2;
|
|
24
|
+
}
|
|
25
|
+
else if (source[offset] === "\"") {
|
|
26
|
+
offset += 1;
|
|
27
|
+
return JSON.parse(source.slice(start, offset));
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
offset += 1;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return fail("JSON is malformed");
|
|
34
|
+
};
|
|
35
|
+
const value = () => {
|
|
36
|
+
whitespace();
|
|
37
|
+
if (source[offset] === "{") {
|
|
38
|
+
object();
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (source[offset] === "[") {
|
|
42
|
+
array();
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (source[offset] === "\"") {
|
|
46
|
+
string();
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
while (offset < source.length && !/[\s,\]}]/u.test(source[offset] ?? "")) {
|
|
50
|
+
offset += 1;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
const object = () => {
|
|
54
|
+
offset += 1;
|
|
55
|
+
whitespace();
|
|
56
|
+
const keys = new Set();
|
|
57
|
+
if (source[offset] === "}") {
|
|
58
|
+
offset += 1;
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
while (offset < source.length) {
|
|
62
|
+
const key = string();
|
|
63
|
+
if (keys.has(key))
|
|
64
|
+
throw new DuplicateJsonKeyError();
|
|
65
|
+
keys.add(key);
|
|
66
|
+
whitespace();
|
|
67
|
+
offset += 1;
|
|
68
|
+
value();
|
|
69
|
+
whitespace();
|
|
70
|
+
if (source[offset] === "}") {
|
|
71
|
+
offset += 1;
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
offset += 1;
|
|
75
|
+
whitespace();
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
const array = () => {
|
|
79
|
+
offset += 1;
|
|
80
|
+
whitespace();
|
|
81
|
+
if (source[offset] === "]") {
|
|
82
|
+
offset += 1;
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
while (offset < source.length) {
|
|
86
|
+
value();
|
|
87
|
+
whitespace();
|
|
88
|
+
if (source[offset] === "]") {
|
|
89
|
+
offset += 1;
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
offset += 1;
|
|
93
|
+
whitespace();
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
value();
|
|
97
|
+
whitespace();
|
|
98
|
+
if (offset !== source.length)
|
|
99
|
+
fail("JSON must contain exactly one value");
|
|
100
|
+
};
|
|
101
|
+
const decodeJson = (bytes) => {
|
|
102
|
+
let source;
|
|
103
|
+
try {
|
|
104
|
+
source = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return fail("content must be valid UTF-8");
|
|
108
|
+
}
|
|
109
|
+
let parsed;
|
|
110
|
+
try {
|
|
111
|
+
parsed = JSON.parse(source);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return fail("content must be exactly one valid JSON value");
|
|
115
|
+
}
|
|
116
|
+
try {
|
|
117
|
+
assertNoDuplicateJsonKeys(source);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
if (error instanceof DuplicateJsonKeyError)
|
|
121
|
+
return fail("duplicate JSON keys are not allowed");
|
|
122
|
+
throw error;
|
|
123
|
+
}
|
|
124
|
+
return parsed;
|
|
125
|
+
};
|
|
126
|
+
export const readSimfileWorldBindingsFile = async (inputPath) => {
|
|
127
|
+
const filePath = path.resolve(inputPath);
|
|
128
|
+
let handle;
|
|
129
|
+
try {
|
|
130
|
+
handle = await open(filePath, constants.O_RDONLY | constants.O_NONBLOCK);
|
|
131
|
+
const metadata = await handle.stat();
|
|
132
|
+
if (!metadata.isFile() || metadata.size <= 0
|
|
133
|
+
|| metadata.size > MAX_WORLD_BINDINGS_FILE_BYTES) {
|
|
134
|
+
return fail(`content must be a non-empty regular file no larger than ${MAX_WORLD_BINDINGS_FILE_BYTES} bytes`);
|
|
135
|
+
}
|
|
136
|
+
const buffer = new Uint8Array(MAX_WORLD_BINDINGS_FILE_BYTES + 1);
|
|
137
|
+
const { bytesRead } = await handle.read(buffer, 0, buffer.byteLength, 0);
|
|
138
|
+
const afterRead = await handle.stat();
|
|
139
|
+
if (bytesRead !== metadata.size || afterRead.size !== metadata.size
|
|
140
|
+
|| bytesRead > MAX_WORLD_BINDINGS_FILE_BYTES) {
|
|
141
|
+
return fail("content changed while it was being read or exceeds the byte limit");
|
|
142
|
+
}
|
|
143
|
+
return decodeJson(buffer.subarray(0, bytesRead));
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
if (error instanceof SpawnfileError)
|
|
147
|
+
throw error;
|
|
148
|
+
return fail("content could not be read");
|
|
149
|
+
}
|
|
150
|
+
finally {
|
|
151
|
+
await handle?.close().catch(() => undefined);
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
export const loadWorldBindingsForCompile = async (plan, inputPath, expectedRunId) => {
|
|
155
|
+
if (!expectedRunId)
|
|
156
|
+
return fail("NOOPOLIS_RUN_ID must be set before compile");
|
|
157
|
+
const resolved = resolveWorldBindings(plan, await readSimfileWorldBindingsFile(inputPath));
|
|
158
|
+
if (resolved.artifact.bindings[0]?.run_id !== expectedRunId) {
|
|
159
|
+
return fail("binding run_id does not match the compile NOOPOLIS_RUN_ID");
|
|
160
|
+
}
|
|
161
|
+
return resolved;
|
|
162
|
+
};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type DockerArtifactExecFile } from "./artifactsExportDocker.js";
|
|
2
|
+
import { type ExportIndex } from "./artifactsExportTypes.js";
|
|
3
|
+
import { type DeploymentLifecycleCorrelation } from "./deploymentLifecycleCorrelation.js";
|
|
4
|
+
export interface ExportRunArtifactsOptions {
|
|
5
|
+
/** Where the deployment record + compile report already live (the compile's own
|
|
6
|
+
* `--out` directory) — NOT the export destination. */
|
|
7
|
+
compiledOutputDirectory: string;
|
|
8
|
+
deploymentName?: string;
|
|
9
|
+
/** Where `raw/**` and `spawnfile/export-index.json` are written. */
|
|
10
|
+
destinationDirectory: string;
|
|
11
|
+
dockerCommand?: string;
|
|
12
|
+
execFile?: DockerArtifactExecFile;
|
|
13
|
+
/** Explicitly export unredacted private runtime training artifacts. */
|
|
14
|
+
includePrivate?: boolean;
|
|
15
|
+
/** Overrides the image used to read named volumes; defaults to the deployment's own
|
|
16
|
+
* recorded `image_tag` (already present locally — see artifactsExportDocker.ts). */
|
|
17
|
+
readerImage?: string;
|
|
18
|
+
runId?: string;
|
|
19
|
+
timeoutMs?: number;
|
|
20
|
+
expectedLifecycleCorrelation?: DeploymentLifecycleCorrelation;
|
|
21
|
+
}
|
|
22
|
+
export interface ExportRunArtifactsResult {
|
|
23
|
+
deploymentName: string;
|
|
24
|
+
/** Planned files that failed to copy despite the container/volume being reachable
|
|
25
|
+
* (a real per-file problem, worth surfacing — as opposed to `missingOptionalFiles`). */
|
|
26
|
+
failedFiles: string[];
|
|
27
|
+
index: ExportIndex;
|
|
28
|
+
indexPath: string;
|
|
29
|
+
/** Planned files that were legitimately absent (e.g. no recall yet) — not failures. */
|
|
30
|
+
missingOptionalFiles: string[];
|
|
31
|
+
}
|
|
32
|
+
export declare const resolveArtifactsExportLifecycleCorrelation: (options: Pick<ExportRunArtifactsOptions, "compiledOutputDirectory" | "deploymentName" | "runId">) => Promise<DeploymentLifecycleCorrelation>;
|
|
33
|
+
/**
|
|
34
|
+
* `spawnfile artifacts export` — mechanical egress of a run's durable artifacts (moltnet
|
|
35
|
+
* causal log, mneme bank ledgers, daimon per-agent telemetry) into the compose-and-observe
|
|
36
|
+
* run-dir layout (`decisions.md` Decision 21 §2), plus the `spawnfile.export-index.v1`
|
|
37
|
+
* index simfile's observer folds into its own run manifest.
|
|
38
|
+
*
|
|
39
|
+
* As of Piece 4b, every planned file is volume-sourced (moltnet + mneme already were;
|
|
40
|
+
* daimon telemetry joined them — see `artifactsExportPlan.ts`'s `planDaimonFiles`), and a
|
|
41
|
+
* named volume outlives its container across a plain `docker rm` (no `--volumes`). So this
|
|
42
|
+
* no longer requires the deployment's container to still be alive in the general case: the
|
|
43
|
+
* container-liveness check below (`requiresLiveContainer`) only runs when the plan actually
|
|
44
|
+
* contains a `kind: "container"` file, which today only happens for a legacy pre-Piece-4b
|
|
45
|
+
* compile report. This is the real relaxation of the export-before-teardown invariant
|
|
46
|
+
* Piece 4b unlocks: `spawnfile down` (without `--volumes`) can run BEFORE `spawnfile
|
|
47
|
+
* artifacts export`, and export still recovers everything from the named volumes.
|
|
48
|
+
*/
|
|
49
|
+
export declare const exportRunArtifacts: (options: ExportRunArtifactsOptions) => Promise<ExportRunArtifactsResult>;
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { readFile, rm } from "node:fs/promises";
|
|
4
|
+
import { ensureDirectory, fileExists, readUtf8File, writeUtf8File } from "../filesystem/index.js";
|
|
5
|
+
import { SpawnfileError } from "../shared/index.js";
|
|
6
|
+
import { REPORT_FILENAME } from "../shared/index.js";
|
|
7
|
+
import { containerExists, copyContainerFileToHost, copyVolumeFileToHost, defaultDockerArtifactExecFile } from "./artifactsExportDocker.js";
|
|
8
|
+
import { EXPORT_INDEX_VERSION } from "./artifactsExportTypes.js";
|
|
9
|
+
import { planArtifactExports } from "./artifactsExportPlan.js";
|
|
10
|
+
import { exportPrivateRuntimeArtifacts } from "./privateArtifactsExport.js";
|
|
11
|
+
import { assertDeploymentLifecycleCorrelation, createDeploymentLifecycleCorrelation, } from "./deploymentLifecycleCorrelation.js";
|
|
12
|
+
import { listDeploymentRecords, readDeploymentRecordFromOutput, writeDeploymentRecord } from "./record.js";
|
|
13
|
+
const sha256Hex = (buffer) => createHash("sha256").update(buffer).digest("hex");
|
|
14
|
+
const targetRefForUnit = (unit) => unit.container_id ?? unit.container_name;
|
|
15
|
+
const resolveDeploymentRecord = async (compiledOutputDirectory, options) => {
|
|
16
|
+
if (options.deploymentName && options.runId) {
|
|
17
|
+
throw new SpawnfileError("validation_error", "spawnfile artifacts export accepts only one of --deployment or --run-id");
|
|
18
|
+
}
|
|
19
|
+
if (!options.deploymentName && !options.runId) {
|
|
20
|
+
throw new SpawnfileError("validation_error", "spawnfile artifacts export requires --deployment <name> or --run-id <id>");
|
|
21
|
+
}
|
|
22
|
+
if (options.deploymentName) {
|
|
23
|
+
try {
|
|
24
|
+
return await readDeploymentRecordFromOutput(compiledOutputDirectory, options.deploymentName);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
28
|
+
throw new SpawnfileError("runtime_error", `No deployment record named "${options.deploymentName}" under ${compiledOutputDirectory}. ` +
|
|
29
|
+
`Has it already been torn down, or never brought up with --detach? (${reason})`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const records = await listDeploymentRecords(compiledOutputDirectory);
|
|
33
|
+
const match = records.find((entry) => entry.record.run_id === options.runId);
|
|
34
|
+
if (!match) {
|
|
35
|
+
const known = records.map((entry) => entry.record.name).sort().join(", ") || "none";
|
|
36
|
+
throw new SpawnfileError("runtime_error", `No deployment record found for run id "${options.runId}" under ${compiledOutputDirectory}. ` +
|
|
37
|
+
`Known deployments: ${known}`);
|
|
38
|
+
}
|
|
39
|
+
return match.record;
|
|
40
|
+
};
|
|
41
|
+
export const resolveArtifactsExportLifecycleCorrelation = async (options) => createDeploymentLifecycleCorrelation(await resolveDeploymentRecord(path.resolve(options.compiledOutputDirectory), options));
|
|
42
|
+
const readCompileReport = async (compiledOutputDirectory) => {
|
|
43
|
+
const reportPath = path.join(compiledOutputDirectory, REPORT_FILENAME);
|
|
44
|
+
if (!(await fileExists(reportPath))) {
|
|
45
|
+
throw new SpawnfileError("validation_error", `No compile report found at ${reportPath}; recompile the project before exporting artifacts.`);
|
|
46
|
+
}
|
|
47
|
+
const parsed = JSON.parse(await readUtf8File(reportPath));
|
|
48
|
+
if (!parsed.container) {
|
|
49
|
+
throw new SpawnfileError("validation_error", `Compile report at ${reportPath} has no container section; nothing to export.`);
|
|
50
|
+
}
|
|
51
|
+
return parsed;
|
|
52
|
+
};
|
|
53
|
+
const hostPathFor = (destinationDirectory, relativePath) => path.join(destinationDirectory, ...relativePath.split("/"));
|
|
54
|
+
const exportOnePlannedFile = async (input) => {
|
|
55
|
+
const hostPath = hostPathFor(input.destinationDirectory, input.plan.relativePath);
|
|
56
|
+
await ensureDirectory(path.dirname(hostPath));
|
|
57
|
+
const runnerOptions = { dockerCommand: input.dockerCommand, execFile: input.execFile, timeoutMs: input.timeoutMs };
|
|
58
|
+
let copied;
|
|
59
|
+
let source;
|
|
60
|
+
if (input.plan.source.kind === "container") {
|
|
61
|
+
copied = await copyContainerFileToHost({
|
|
62
|
+
containerPath: input.plan.source.containerPath,
|
|
63
|
+
containerRef: input.containerRef,
|
|
64
|
+
hostPath,
|
|
65
|
+
target: input.target,
|
|
66
|
+
...runnerOptions
|
|
67
|
+
});
|
|
68
|
+
source = { kind: "container", ref: `${input.containerRef}:${input.plan.source.containerPath}` };
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
copied = await copyVolumeFileToHost({
|
|
72
|
+
hostPath,
|
|
73
|
+
readerImage: input.readerImage,
|
|
74
|
+
target: input.target,
|
|
75
|
+
volumeName: input.plan.source.volumeName,
|
|
76
|
+
volumePath: input.plan.source.volumePath,
|
|
77
|
+
...runnerOptions
|
|
78
|
+
});
|
|
79
|
+
source = { kind: "volume", ref: `${input.plan.source.volumeName}:/${input.plan.source.volumePath}` };
|
|
80
|
+
}
|
|
81
|
+
if (!copied) {
|
|
82
|
+
// docker cp never creates a partial file on failure, but be defensive: never leave a
|
|
83
|
+
// stray empty file behind for a copy this function considers failed.
|
|
84
|
+
await rm(hostPath, { force: true });
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
const buffer = await readFile(hostPath);
|
|
88
|
+
return {
|
|
89
|
+
bytes: buffer.byteLength,
|
|
90
|
+
path: input.plan.relativePath,
|
|
91
|
+
sha256: sha256Hex(buffer),
|
|
92
|
+
source
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* `spawnfile artifacts export` — mechanical egress of a run's durable artifacts (moltnet
|
|
97
|
+
* causal log, mneme bank ledgers, daimon per-agent telemetry) into the compose-and-observe
|
|
98
|
+
* run-dir layout (`decisions.md` Decision 21 §2), plus the `spawnfile.export-index.v1`
|
|
99
|
+
* index simfile's observer folds into its own run manifest.
|
|
100
|
+
*
|
|
101
|
+
* As of Piece 4b, every planned file is volume-sourced (moltnet + mneme already were;
|
|
102
|
+
* daimon telemetry joined them — see `artifactsExportPlan.ts`'s `planDaimonFiles`), and a
|
|
103
|
+
* named volume outlives its container across a plain `docker rm` (no `--volumes`). So this
|
|
104
|
+
* no longer requires the deployment's container to still be alive in the general case: the
|
|
105
|
+
* container-liveness check below (`requiresLiveContainer`) only runs when the plan actually
|
|
106
|
+
* contains a `kind: "container"` file, which today only happens for a legacy pre-Piece-4b
|
|
107
|
+
* compile report. This is the real relaxation of the export-before-teardown invariant
|
|
108
|
+
* Piece 4b unlocks: `spawnfile down` (without `--volumes`) can run BEFORE `spawnfile
|
|
109
|
+
* artifacts export`, and export still recovers everything from the named volumes.
|
|
110
|
+
*/
|
|
111
|
+
export const exportRunArtifacts = async (options) => {
|
|
112
|
+
const compiledOutputDirectory = path.resolve(options.compiledOutputDirectory);
|
|
113
|
+
const destinationDirectory = path.resolve(options.destinationDirectory);
|
|
114
|
+
const dockerCommand = options.dockerCommand ?? "docker";
|
|
115
|
+
const execFileImpl = options.execFile ?? defaultDockerArtifactExecFile;
|
|
116
|
+
const timeoutMs = options.timeoutMs ?? 30_000;
|
|
117
|
+
const record = await resolveDeploymentRecord(compiledOutputDirectory, options);
|
|
118
|
+
assertDeploymentLifecycleCorrelation(record, options.expectedLifecycleCorrelation);
|
|
119
|
+
const unit = record.units[0];
|
|
120
|
+
if (!unit) {
|
|
121
|
+
throw new SpawnfileError("validation_error", `Deployment "${record.name}" has no recorded container unit`);
|
|
122
|
+
}
|
|
123
|
+
const containerRef = targetRefForUnit(unit);
|
|
124
|
+
if (!containerRef) {
|
|
125
|
+
throw new SpawnfileError("validation_error", `Deployment "${record.name}" has no recorded container id or name`);
|
|
126
|
+
}
|
|
127
|
+
const runId = record.run_id;
|
|
128
|
+
if (!runId) {
|
|
129
|
+
throw new SpawnfileError("validation_error", `Deployment "${record.name}" has no recorded run id (it predates run-id tracking, or was ` +
|
|
130
|
+
"compiled with no NOOPOLIS_RUN_ID set), so a conformant export-index.json cannot be " +
|
|
131
|
+
"written. Recompile and redeploy the project (with NOOPOLIS_RUN_ID set, or via a plain " +
|
|
132
|
+
"`spawnfile up --detach`, which always generates one) before exporting artifacts.");
|
|
133
|
+
}
|
|
134
|
+
const report = await readCompileReport(compiledOutputDirectory);
|
|
135
|
+
const planned = planArtifactExports(report);
|
|
136
|
+
// Only a `kind: "container"` planned file needs the live container (see this function's
|
|
137
|
+
// own doc comment) — every other source reads a named volume, which survives a plain
|
|
138
|
+
// `docker rm` on its own. Gating on this, rather than checking unconditionally, is the
|
|
139
|
+
// actual export-before-teardown relaxation Piece 4b delivers.
|
|
140
|
+
const requiresLiveContainer = options.includePrivate === true
|
|
141
|
+
|| planned.some((entry) => entry.source.kind === "container");
|
|
142
|
+
if (requiresLiveContainer) {
|
|
143
|
+
const exists = await containerExists(record.target, containerRef, {
|
|
144
|
+
dockerCommand,
|
|
145
|
+
execFile: execFileImpl,
|
|
146
|
+
timeoutMs
|
|
147
|
+
});
|
|
148
|
+
if (!exists) {
|
|
149
|
+
throw new SpawnfileError("runtime_error", `Deployment "${record.name}" has no live container ("${containerRef}"), and its planned export ` +
|
|
150
|
+
"includes at least one file that can only be read from a live container (a legacy, " +
|
|
151
|
+
"pre-Piece-4b compile report — recompile to move it onto a durable volume). Run " +
|
|
152
|
+
"`spawnfile artifacts export` BEFORE `spawnfile down` removes the container, or recompile.");
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
const readerImage = options.readerImage ?? unit.image_tag;
|
|
156
|
+
const files = [];
|
|
157
|
+
const missingOptionalFiles = [];
|
|
158
|
+
const failedFiles = [];
|
|
159
|
+
for (const plan of planned) {
|
|
160
|
+
const entry = await exportOnePlannedFile({
|
|
161
|
+
containerRef,
|
|
162
|
+
destinationDirectory,
|
|
163
|
+
dockerCommand,
|
|
164
|
+
execFile: execFileImpl,
|
|
165
|
+
plan,
|
|
166
|
+
readerImage,
|
|
167
|
+
target: record.target,
|
|
168
|
+
timeoutMs
|
|
169
|
+
});
|
|
170
|
+
if (entry) {
|
|
171
|
+
files.push(entry);
|
|
172
|
+
}
|
|
173
|
+
else if (plan.optional) {
|
|
174
|
+
missingOptionalFiles.push(plan.relativePath);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
failedFiles.push(plan.relativePath);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (options.includePrivate === true) {
|
|
181
|
+
const privateResult = await exportPrivateRuntimeArtifacts({
|
|
182
|
+
containerRef,
|
|
183
|
+
destinationDirectory,
|
|
184
|
+
dockerCommand,
|
|
185
|
+
execFile: execFileImpl,
|
|
186
|
+
report,
|
|
187
|
+
target: record.target,
|
|
188
|
+
timeoutMs,
|
|
189
|
+
});
|
|
190
|
+
files.push(...privateResult.files);
|
|
191
|
+
failedFiles.push(...privateResult.missing);
|
|
192
|
+
}
|
|
193
|
+
const index = {
|
|
194
|
+
deployment: record.name,
|
|
195
|
+
exported_at: new Date().toISOString(),
|
|
196
|
+
files: files.sort((left, right) => left.path.localeCompare(right.path)),
|
|
197
|
+
run_id: runId,
|
|
198
|
+
version: EXPORT_INDEX_VERSION
|
|
199
|
+
};
|
|
200
|
+
const indexPath = path.join(destinationDirectory, "spawnfile", "export-index.json");
|
|
201
|
+
await ensureDirectory(path.dirname(indexPath));
|
|
202
|
+
await writeUtf8File(indexPath, `${JSON.stringify(index, null, 2)}\n`);
|
|
203
|
+
// Stamp the export-before-teardown marker onto the SAME deployment record `spawnfile
|
|
204
|
+
// down` resolves (record.ts's `export_index`), so down never needs a second, out-of-band
|
|
205
|
+
// way to learn that this run's artifacts are already safe to discard the container for.
|
|
206
|
+
await writeDeploymentRecord(compiledOutputDirectory, {
|
|
207
|
+
...record,
|
|
208
|
+
export_index: { exported_at: index.exported_at, path: indexPath, run_id: runId }
|
|
209
|
+
});
|
|
210
|
+
return {
|
|
211
|
+
deploymentName: record.name,
|
|
212
|
+
failedFiles,
|
|
213
|
+
index,
|
|
214
|
+
indexPath,
|
|
215
|
+
missingOptionalFiles
|
|
216
|
+
};
|
|
217
|
+
};
|
|
@@ -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[];
|