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,116 @@
|
|
|
1
|
+
import { constants } from "node:fs";
|
|
2
|
+
import { open } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { createTargetLocalContainerBundleOperations } from "../target/containerBundle.js";
|
|
5
|
+
import { createContainerBundlePreparationAuthority } from "../target/containerBundleAuthority.js";
|
|
6
|
+
import { createCanonicalTargetLocalBundleLookupBytes, createCanonicalTargetLocalBundleReceiptBytes, parseTargetLocalBundleLookupRequest, parseTargetLocalBundlePrepareRequest } from "../target/containerBundleContracts.js";
|
|
7
|
+
import { initializeFilesystemTargetLocalBundleStore } from "../target/containerBundleFilesystemStore.js";
|
|
8
|
+
import { createDockerTargetLocalBundleBuilder } from "../target/dockerContainerBundleBuilder.js";
|
|
9
|
+
import { createDockerTargetExecutors } from "../target/dockerCommandExecutor.js";
|
|
10
|
+
import { deriveTargetLocalContainerBundlePolicy } from "../target/containerBundlePolicy.js";
|
|
11
|
+
import { readTargetDefaultConfigStdin } from "./targetDefaultConfigStdin.js";
|
|
12
|
+
const MAX_BUNDLE_REQUEST_FILE_BYTES = 5_600_000;
|
|
13
|
+
const readJson = async (raw) => {
|
|
14
|
+
if (typeof raw !== "string" || raw.includes("\0") || !path.isAbsolute(raw) || path.normalize(raw) !== raw
|
|
15
|
+
|| Buffer.byteLength(raw, "utf8") > 4096)
|
|
16
|
+
throw new Error();
|
|
17
|
+
const file = await open(raw, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
18
|
+
try {
|
|
19
|
+
const info = await file.stat();
|
|
20
|
+
if (!info.isFile() || info.size > MAX_BUNDLE_REQUEST_FILE_BYTES)
|
|
21
|
+
throw new Error();
|
|
22
|
+
const bytes = Buffer.alloc(info.size + 1);
|
|
23
|
+
let offset = 0;
|
|
24
|
+
while (offset <= info.size) {
|
|
25
|
+
const result = await file.read(bytes, offset, info.size + 1 - offset, offset);
|
|
26
|
+
if (result.bytesRead === 0)
|
|
27
|
+
break;
|
|
28
|
+
offset += result.bytesRead;
|
|
29
|
+
}
|
|
30
|
+
if (offset !== info.size)
|
|
31
|
+
throw new Error();
|
|
32
|
+
return JSON.parse(bytes.toString("utf8", 0, offset));
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
await file.close();
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
const readRequest = async (file) => parseTargetLocalBundlePrepareRequest(await readJson(file));
|
|
39
|
+
const readLookup = async (file) => parseTargetLocalBundleLookupRequest(await readJson(file));
|
|
40
|
+
const operations = async (config) => {
|
|
41
|
+
const executors = createDockerTargetExecutors({ dockerCommand: config.dockerCommand });
|
|
42
|
+
return createTargetLocalContainerBundleOperations({
|
|
43
|
+
authority: createContainerBundlePreparationAuthority(config.preparedArtifactMappings),
|
|
44
|
+
builder: createDockerTargetLocalBundleBuilder({ context: config.context, executor: executors.artifact, timeoutMs: config.timeoutMs }),
|
|
45
|
+
store: await initializeFilesystemTargetLocalBundleStore(config.paths.containerBundles)
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
/** Production-only command. Its stdout is the secret-free canonical receipt. */
|
|
49
|
+
export const registerContainerBundleCommand = (target, stdin, streams, setExitCode) => {
|
|
50
|
+
target.command("derive_container_bundle_policy")
|
|
51
|
+
.argument("<claims-file>", "Strict target-local bundle policy claims")
|
|
52
|
+
.action(async (claimsFile) => {
|
|
53
|
+
try {
|
|
54
|
+
const raw = await readJson(claimsFile);
|
|
55
|
+
if (raw === null || typeof raw !== "object" || Array.isArray(raw)
|
|
56
|
+
|| Object.keys(raw).sort().join("\0") !== "archiveDigest\0artifactDigest\0baseImageConfigDigest\0bundleDigest\0entrypoint\0launcherDigest\0networkAlias\0platform") {
|
|
57
|
+
throw new Error();
|
|
58
|
+
}
|
|
59
|
+
const policy = deriveTargetLocalContainerBundlePolicy(raw);
|
|
60
|
+
streams.stdout(JSON.stringify({
|
|
61
|
+
version: "spawnfile.target-local-container-bundle-policy.v1",
|
|
62
|
+
build_policy_digest: policy.buildPolicyDigest,
|
|
63
|
+
platform_digest: policy.platformDigest
|
|
64
|
+
}));
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
streams.stderr("error: Invalid container bundle policy claims");
|
|
68
|
+
setExitCode(2);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
const execute = (name) => target.command(name)
|
|
72
|
+
.argument("<request-file>", "Strict container-bundle preparation request")
|
|
73
|
+
.action(async (requestFile) => {
|
|
74
|
+
let request;
|
|
75
|
+
try {
|
|
76
|
+
request = await readRequest(requestFile);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
streams.stderr("error: Invalid container bundle request");
|
|
80
|
+
setExitCode(2);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
const config = await readTargetDefaultConfigStdin(stdin);
|
|
85
|
+
const receipt = await (await operations(config))[name === "prepare_container_bundle" ? "prepare" : "recover"](request);
|
|
86
|
+
streams.stdout(createCanonicalTargetLocalBundleReceiptBytes(receipt));
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
streams.stderr("error: Target-local container bundle preparation failed");
|
|
90
|
+
setExitCode(1);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
execute("prepare_container_bundle");
|
|
94
|
+
execute("recover_container_bundle");
|
|
95
|
+
target.command("lookup_container_bundle").argument("<lookup-file>", "Strict semantic bundle lookup")
|
|
96
|
+
.action(async (lookupFile) => {
|
|
97
|
+
let request;
|
|
98
|
+
try {
|
|
99
|
+
request = await readLookup(lookupFile);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
streams.stderr("error: Invalid container bundle lookup");
|
|
103
|
+
setExitCode(2);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
const config = await readTargetDefaultConfigStdin(stdin);
|
|
108
|
+
const result = await (await operations(config)).lookup(request);
|
|
109
|
+
streams.stdout(createCanonicalTargetLocalBundleLookupBytes(result));
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
streams.stderr("error: Target-local container bundle preparation failed");
|
|
113
|
+
setExitCode(1);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import { type DeploymentLifecycleCorrelation, type LifecycleInvocation } from "../deployment/index.js";
|
|
3
|
+
import type { CliHandlers, CliStreams } from "./runCli.js";
|
|
4
|
+
export interface DownOptions {
|
|
5
|
+
compiled?: string;
|
|
6
|
+
deployment: string;
|
|
7
|
+
dockerCommand?: string;
|
|
8
|
+
exportTo?: string;
|
|
9
|
+
force?: boolean;
|
|
10
|
+
json?: boolean;
|
|
11
|
+
lifecycleInvocation?: string;
|
|
12
|
+
readerImage?: string;
|
|
13
|
+
timeout?: string;
|
|
14
|
+
volumes?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare const createDownLifecyclePolicy: (options: DownOptions) => {
|
|
17
|
+
docker_command: string | null;
|
|
18
|
+
export_to: string | null;
|
|
19
|
+
force: boolean;
|
|
20
|
+
reader_image: string | null;
|
|
21
|
+
remove_volumes: boolean;
|
|
22
|
+
timeout_ms: number | null;
|
|
23
|
+
};
|
|
24
|
+
export declare const createDownLifecycleInvocation: (id: string, compiledOutputDirectory: string, options: DownOptions, correlation: DeploymentLifecycleCorrelation) => LifecycleInvocation;
|
|
25
|
+
export declare const registerDownCommand: (program: Command, handlers: CliHandlers, streams: CliStreams) => void;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { createDeploymentLifecycleCorrelation, findLifecycleInvocation, readDeploymentRecordFromOutput, } from "../deployment/index.js";
|
|
3
|
+
import { resolveProjectOutputDirectory } from "../filesystem/index.js";
|
|
4
|
+
import { DEFAULT_OUTPUT_DIRECTORY, SpawnfileError } from "../shared/index.js";
|
|
5
|
+
import { canonicalLifecycleJson } from "../deployment/lifecycleCompletionContracts.js";
|
|
6
|
+
import { createLifecycleInvocation, requireMachineLifecycle, runMachineLifecycle, } from "./lifecycleMachine.js";
|
|
7
|
+
export const createDownLifecyclePolicy = (options) => ({
|
|
8
|
+
docker_command: options.dockerCommand ?? null,
|
|
9
|
+
export_to: options.exportTo ? path.resolve(options.exportTo) : null,
|
|
10
|
+
force: options.force ?? false,
|
|
11
|
+
reader_image: options.readerImage ?? null,
|
|
12
|
+
remove_volumes: options.volumes ?? false,
|
|
13
|
+
timeout_ms: options.timeout ? Number(options.timeout) : null,
|
|
14
|
+
});
|
|
15
|
+
export const createDownLifecycleInvocation = (id, compiledOutputDirectory, options, correlation) => createLifecycleInvocation(id, "down", {
|
|
16
|
+
compiled_output_directory: compiledOutputDirectory,
|
|
17
|
+
...correlation,
|
|
18
|
+
}, createDownLifecyclePolicy(options));
|
|
19
|
+
const correlationFrom = (stored) => {
|
|
20
|
+
const value = stored.correlation;
|
|
21
|
+
if (typeof value.compile_fingerprint !== "string" ||
|
|
22
|
+
typeof value.deployment_instance_digest !== "string" ||
|
|
23
|
+
typeof value.deployment !== "string" ||
|
|
24
|
+
(value.run_id !== null && typeof value.run_id !== "string") ||
|
|
25
|
+
typeof value.target !== "string") {
|
|
26
|
+
throw new SpawnfileError("runtime_error", "Invalid stored down correlation");
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
compile_fingerprint: value.compile_fingerprint,
|
|
30
|
+
deployment: value.deployment,
|
|
31
|
+
deployment_instance_digest: value.deployment_instance_digest,
|
|
32
|
+
run_id: value.run_id,
|
|
33
|
+
target: value.target,
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
const assertExactRequest = (stored, compiledOutputDirectory, options) => {
|
|
37
|
+
if (stored.operation !== "down" ||
|
|
38
|
+
stored.correlation.compiled_output_directory !== compiledOutputDirectory ||
|
|
39
|
+
stored.correlation.deployment !== options.deployment ||
|
|
40
|
+
JSON.stringify(stored.request_policy) !==
|
|
41
|
+
JSON.stringify(createDownLifecyclePolicy(options))) {
|
|
42
|
+
throw new SpawnfileError("runtime_error", "Lifecycle invocation id drift");
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
export const registerDownCommand = (program, handlers, streams) => {
|
|
46
|
+
program
|
|
47
|
+
.command("down")
|
|
48
|
+
.description("Tear down a recorded deployment; named volumes are retained by default.")
|
|
49
|
+
.argument("[path]", "Project directory or Spawnfile path", process.cwd())
|
|
50
|
+
.requiredOption("--deployment <name>", "Deployment record name to tear down")
|
|
51
|
+
.option("--compiled <directory>", "Compile output directory")
|
|
52
|
+
.option("--docker-command <command>", "Docker command")
|
|
53
|
+
.option("--export-to <directory>", "Export first, then tear down")
|
|
54
|
+
.option("--force", "Discard un-exported artifacts")
|
|
55
|
+
.option("--reader-image <image>", "Image used to read named volumes during auto export")
|
|
56
|
+
.option("--timeout <ms>", "Bound each Docker call in milliseconds")
|
|
57
|
+
.option("--volumes", "Also remove named volumes")
|
|
58
|
+
.option("--json", "Render a spawnfile.down-receipt.v1 machine-readable receipt")
|
|
59
|
+
.option("--lifecycle-invocation <id>", "Durably bind this exact JSON lifecycle invocation")
|
|
60
|
+
.action(async (inputPath, options) => {
|
|
61
|
+
requireMachineLifecycle(options.lifecycleInvocation, options.json);
|
|
62
|
+
const compiled = resolveProjectOutputDirectory(inputPath, options.compiled, DEFAULT_OUTPUT_DIRECTORY);
|
|
63
|
+
const render = async (expected) => {
|
|
64
|
+
const expectedUnits = expected
|
|
65
|
+
? (await readDeploymentRecordFromOutput(compiled, options.deployment)).units.map((unit) => unit.id).sort()
|
|
66
|
+
: undefined;
|
|
67
|
+
const receipt = await handlers.downDeployment({
|
|
68
|
+
compiledOutputDirectory: compiled,
|
|
69
|
+
deploymentName: options.deployment,
|
|
70
|
+
dockerCommand: options.dockerCommand,
|
|
71
|
+
exportTo: options.exportTo,
|
|
72
|
+
force: options.force,
|
|
73
|
+
readerImage: options.readerImage,
|
|
74
|
+
removeVolumes: options.volumes,
|
|
75
|
+
timeoutMs: options.timeout ? Number(options.timeout) : undefined,
|
|
76
|
+
...(expected ? { expectedLifecycleCorrelation: expected } : {}),
|
|
77
|
+
});
|
|
78
|
+
if (expectedUnits !== undefined &&
|
|
79
|
+
(receipt.errors.length !== 0 ||
|
|
80
|
+
(options.volumes === true &&
|
|
81
|
+
receipt.retained_volumes.length !== 0) ||
|
|
82
|
+
JSON.stringify([...receipt.units_stopped].sort()) !==
|
|
83
|
+
JSON.stringify(expectedUnits))) {
|
|
84
|
+
throw new SpawnfileError("runtime_error", "Lifecycle down is incomplete and remains retryable");
|
|
85
|
+
}
|
|
86
|
+
return JSON.stringify(receipt, null, 2);
|
|
87
|
+
};
|
|
88
|
+
if (options.json && options.lifecycleInvocation) {
|
|
89
|
+
const stored = await findLifecycleInvocation(options.lifecycleInvocation);
|
|
90
|
+
let exact;
|
|
91
|
+
let correlation;
|
|
92
|
+
if (stored) {
|
|
93
|
+
assertExactRequest(stored, compiled, options);
|
|
94
|
+
exact = stored;
|
|
95
|
+
correlation = correlationFrom(stored);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
const record = await readDeploymentRecordFromOutput(compiled, options.deployment);
|
|
99
|
+
correlation = createDeploymentLifecycleCorrelation(record);
|
|
100
|
+
exact = createDownLifecycleInvocation(options.lifecycleInvocation, compiled, options, correlation);
|
|
101
|
+
}
|
|
102
|
+
const output = await runMachineLifecycle(exact, () => render(correlation), async () => {
|
|
103
|
+
try {
|
|
104
|
+
const current = createDeploymentLifecycleCorrelation(await readDeploymentRecordFromOutput(compiled, options.deployment));
|
|
105
|
+
return canonicalLifecycleJson(current) ===
|
|
106
|
+
canonicalLifecycleJson(correlation)
|
|
107
|
+
? { status: "resume_safe" }
|
|
108
|
+
: {
|
|
109
|
+
reason: "deployment_correlation_changed",
|
|
110
|
+
status: "ambiguous",
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return {
|
|
115
|
+
reason: "deployment_correlation_unavailable",
|
|
116
|
+
status: "ambiguous",
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
streams.stdout(output);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const output = await render();
|
|
124
|
+
if (options.json) {
|
|
125
|
+
streams.stdout(output);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const receipt = JSON.parse(output);
|
|
129
|
+
streams.stdout(`deployment: ${receipt.deployment}`);
|
|
130
|
+
receipt.units_stopped.forEach((unit) => streams.stdout(`stopped: ${unit}`));
|
|
131
|
+
receipt.retained_volumes.forEach((volume) => streams.stdout(`retained volume: ${volume}`));
|
|
132
|
+
receipt.errors.forEach((error) => streams.stderr(`error: ${error}`));
|
|
133
|
+
});
|
|
134
|
+
};
|
package/dist/cli/index.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
const
|
|
4
|
-
|
|
2
|
+
import { isTargetLookupInvocation } from "./targetCliRoute.js";
|
|
3
|
+
const argv = process.argv.slice(2);
|
|
4
|
+
const exitCode = isTargetLookupInvocation(argv)
|
|
5
|
+
? await (await import("./targetLookupCli.js")).runTargetLookupCli(argv)
|
|
6
|
+
: await (await import("./runCli.js")).runCli(argv);
|
|
7
|
+
process.exitCode = exitCode;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { Command } from "commander";
|
|
2
2
|
import type { CliHandlers, CliStreams } from "./runCli.js";
|
|
3
|
-
export declare const registerLifecycleCommands: (program: Command, handlers: CliHandlers, streams: CliStreams) => void;
|
|
3
|
+
export declare const registerLifecycleCommands: (program: Command, handlers: CliHandlers, streams: CliStreams, stdin: AsyncIterable<unknown>) => void;
|
|
@@ -1,182 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const formatRedeploySummary = (previous, newRef, newDigest) => {
|
|
13
|
-
// Only claim "unchanged" when we actually resolved a matching digest; two null
|
|
14
|
-
// digests (local-only images) are unknown, not provably identical.
|
|
15
|
-
if (previous.ref === newRef && newDigest !== null && previous.digest === newDigest) {
|
|
16
|
-
return `redeployed image ${newRef} (digest unchanged ${shortDigest(newDigest)})`;
|
|
17
|
-
}
|
|
18
|
-
return (`redeployed image: ${previous.ref} (${shortDigest(previous.digest)}) ` +
|
|
19
|
-
`→ ${newRef} (${shortDigest(newDigest)})`);
|
|
20
|
-
};
|
|
21
|
-
export const registerLifecycleCommands = (program, handlers, streams) => {
|
|
22
|
-
program
|
|
23
|
-
.command("compile")
|
|
24
|
-
.description("Compile a project into runtime-native output under .spawn")
|
|
25
|
-
.argument("[path]", "Project directory or Spawnfile path", process.cwd())
|
|
26
|
-
.option("-o, --out <directory>", "Output directory")
|
|
27
|
-
.action(async (inputPath, options) => {
|
|
28
|
-
const result = await handlers.compileProject(inputPath, { outputDirectory: options.out });
|
|
29
|
-
streams.stdout(`compiled to ${result.outputDirectory}`);
|
|
30
|
-
streams.stdout(`report: ${result.reportPath}`);
|
|
31
|
-
});
|
|
32
|
-
program
|
|
33
|
-
.command("build")
|
|
34
|
-
.description("Compile and build the organization Docker image")
|
|
35
|
-
.argument("[path]", "Project directory or Spawnfile path", process.cwd())
|
|
36
|
-
.option("--context <name>", "Docker context for the build target")
|
|
37
|
-
.option("--docker-command <command>", "Docker command")
|
|
38
|
-
.option("-o, --out <directory>", "Output directory")
|
|
39
|
-
.option("-t, --tag <image>", "Docker image tag")
|
|
40
|
-
.action(async (inputPath, options) => {
|
|
41
|
-
const result = await handlers.buildProject(inputPath, {
|
|
42
|
-
dockerContext: options.context,
|
|
43
|
-
dockerCommand: options.dockerCommand,
|
|
44
|
-
imageTag: options.tag,
|
|
45
|
-
outputDirectory: options.out
|
|
46
|
-
});
|
|
47
|
-
streams.stdout(`built image ${result.imageTag}`);
|
|
48
|
-
streams.stdout(`compiled to ${result.outputDirectory}`);
|
|
49
|
-
streams.stdout(`report: ${result.reportPath}`);
|
|
50
|
-
});
|
|
51
|
-
program
|
|
52
|
-
.command("run")
|
|
53
|
-
.description("Compile, build, and run the organization container locally")
|
|
54
|
-
.argument("[path]", "Project directory or Spawnfile path", process.cwd())
|
|
55
|
-
.option("-o, --out <directory>", "Output directory")
|
|
56
|
-
.option("-t, --tag <image>", "Docker image tag")
|
|
57
|
-
.option("--auth-profile <name>", "Local Spawnfile auth profile")
|
|
58
|
-
.option("--context <name>", "Docker context for the deployment target")
|
|
59
|
-
.option("--deployment <name>", "Detached deployment record name")
|
|
60
|
-
.option("--docker-command <command>", "Docker command")
|
|
61
|
-
.option("--name <container>", "Docker container name")
|
|
62
|
-
.option("--env-file <file>", "Path to an env file for runtime secrets")
|
|
63
|
-
.option("--image", "Interpret the argument as an image reference")
|
|
64
|
-
.option("-d, --detach", "Run the container in detached mode")
|
|
65
|
-
.action(async (inputPath, options) => {
|
|
66
|
-
const runInput = resolveCommandInput(inputPath, { forceImage: options.image });
|
|
67
|
-
if (runInput.kind === "image" || (runInput.kind === "invalid" && options.image)) {
|
|
68
|
-
throw new SpawnfileError("validation_error", `Image-mode run is not supported. Deploy the image with: ` +
|
|
69
|
-
`spawnfile up ${inputPath} --auth-profile <profile> ` +
|
|
70
|
-
"(add --env-file for any extra secrets; image deployments always detach).");
|
|
71
|
-
}
|
|
72
|
-
if (runInput.kind === "invalid") {
|
|
73
|
-
throw new SpawnfileError("validation_error", `Cannot resolve "${inputPath}" as a project path or image reference. ` +
|
|
74
|
-
"Pass a project directory, a Spawnfile path, or an image like 'name:tag' (use --image to force image mode).");
|
|
75
|
-
}
|
|
76
|
-
const result = await handlers.runProject(inputPath, {
|
|
77
|
-
authProfile: options.authProfile,
|
|
78
|
-
containerName: options.name,
|
|
79
|
-
detach: options.detach,
|
|
80
|
-
deploymentName: options.deployment,
|
|
81
|
-
dockerCommand: options.dockerCommand,
|
|
82
|
-
dockerContext: options.context,
|
|
83
|
-
envFilePath: options.envFile,
|
|
84
|
-
imageTag: options.tag,
|
|
85
|
-
outputDirectory: options.out
|
|
86
|
-
});
|
|
87
|
-
if (options.detach) {
|
|
88
|
-
streams.stdout(`running container ${result.containerName ?? "unknown"}`);
|
|
89
|
-
streams.stdout(`image: ${result.imageTag}`);
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
program
|
|
93
|
-
.command("publish")
|
|
94
|
-
.description("Compile, build, verify, and push the organization image to a registry")
|
|
95
|
-
.argument("[path]", "Project directory or Spawnfile path", process.cwd())
|
|
96
|
-
.requiredOption("-t, --tag <image>", "Registry image reference to push")
|
|
97
|
-
.option("-o, --out <directory>", "Output directory")
|
|
98
|
-
.option("--docker-command <command>", "Docker command")
|
|
99
|
-
.action(async (inputPath, options) => {
|
|
100
|
-
const publishInput = resolveCommandInput(inputPath);
|
|
101
|
-
if (publishInput.kind !== "project") {
|
|
102
|
-
throw new SpawnfileError("validation_error", "publish operates on a project path, not an image reference");
|
|
103
|
-
}
|
|
104
|
-
const result = await handlers.publishProject(inputPath, {
|
|
105
|
-
dockerCommand: options.dockerCommand,
|
|
106
|
-
imageTag: options.tag,
|
|
107
|
-
outputDirectory: options.out
|
|
108
|
-
});
|
|
109
|
-
streams.stdout(`published ${result.imageTag}`);
|
|
110
|
-
streams.stdout(`digest: ${result.digest ?? "unknown"}`);
|
|
111
|
-
streams.stdout(`next: spawnfile up ${result.imageTag} --detach --auth-profile <profile>`);
|
|
112
|
-
});
|
|
113
|
-
program
|
|
114
|
-
.command("up")
|
|
115
|
-
.description("Deploy an organization from a project or a published image reference")
|
|
116
|
-
.argument("[path]", "Project directory, Spawnfile path, or image reference", process.cwd())
|
|
117
|
-
.option("-o, --out <directory>", "Output directory")
|
|
118
|
-
.option("-t, --tag <image>", "Docker image tag")
|
|
119
|
-
.option("--auth-profile <name>", "Local Spawnfile auth profile")
|
|
120
|
-
.option("--context <name>", "Docker context for the deployment target")
|
|
121
|
-
.option("--deployment <name>", "Detached deployment record name")
|
|
122
|
-
.option("--docker-command <command>", "Docker command")
|
|
123
|
-
.option("--name <container>", "Docker container name")
|
|
124
|
-
.option("--env-file <file>", "Path to an env file for runtime secrets")
|
|
125
|
-
.option("--image", "Interpret the argument as an image reference")
|
|
126
|
-
.option("--pull", "Pull the image before deploying")
|
|
127
|
-
.option("-d, --detach", "Run the container in detached mode")
|
|
128
|
-
.action(async (inputPath, options) => {
|
|
129
|
-
const upInput = resolveCommandInput(inputPath, { forceImage: options.image });
|
|
130
|
-
if (upInput.kind === "invalid") {
|
|
131
|
-
throw new SpawnfileError("validation_error", `Cannot resolve "${inputPath}" as a project path or image reference. ` +
|
|
132
|
-
"Pass a project directory, a Spawnfile path, or an image like 'name:tag' (use --image to force image mode).");
|
|
133
|
-
}
|
|
134
|
-
if (upInput.kind === "image") {
|
|
135
|
-
const [authProfile, envFileEnv] = await Promise.all([
|
|
136
|
-
resolveAuthProfileForImage(handlers, options.authProfile),
|
|
137
|
-
readRunEnvFile(options.envFile)
|
|
138
|
-
]);
|
|
139
|
-
const consumed = await handlers.consumeImageUp(upInput.ref, {
|
|
140
|
-
authProfile,
|
|
141
|
-
authProfileName: options.authProfile ?? null,
|
|
142
|
-
authValues: authProfile?.env ?? {},
|
|
143
|
-
deploymentName: options.deployment,
|
|
144
|
-
dockerCommand: options.dockerCommand,
|
|
145
|
-
dockerContext: options.context,
|
|
146
|
-
envFileEnv,
|
|
147
|
-
envFilePath: options.envFile ?? null,
|
|
148
|
-
pull: options.pull
|
|
149
|
-
});
|
|
150
|
-
if (consumed.previous) {
|
|
151
|
-
const newDigest = consumed.record.source.kind === "image" ? consumed.record.source.digest : null;
|
|
152
|
-
streams.stdout(formatRedeploySummary(consumed.previous, consumed.imageRef, newDigest));
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
streams.stdout(`deployed image ${consumed.imageRef}`);
|
|
156
|
-
}
|
|
157
|
-
streams.stdout(`deployment: ${consumed.deploymentName}`);
|
|
158
|
-
streams.stdout(`running container ${consumed.containerName}`);
|
|
159
|
-
streams.stdout(`record: ${consumed.recordPath}`);
|
|
160
|
-
streams.stdout(`next: spawnfile status --deployment ${consumed.deploymentName} --live`);
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
const result = await handlers.upProject(inputPath, {
|
|
164
|
-
authProfile: options.authProfile,
|
|
165
|
-
containerName: options.name,
|
|
166
|
-
detach: options.detach,
|
|
167
|
-
deploymentName: options.deployment,
|
|
168
|
-
dockerCommand: options.dockerCommand,
|
|
169
|
-
dockerContext: options.context,
|
|
170
|
-
envFilePath: options.envFile,
|
|
171
|
-
imageTag: options.tag,
|
|
172
|
-
outputDirectory: options.out
|
|
173
|
-
});
|
|
174
|
-
streams.stdout(`built image ${result.imageTag}`);
|
|
175
|
-
streams.stdout(`compiled to ${result.outputDirectory}`);
|
|
176
|
-
streams.stdout(`report: ${result.reportPath}`);
|
|
177
|
-
if (options.detach) {
|
|
178
|
-
streams.stdout(`running container ${result.containerName ?? "unknown"}`);
|
|
179
|
-
streams.stdout(`image: ${result.imageTag}`);
|
|
180
|
-
}
|
|
181
|
-
});
|
|
1
|
+
import { registerCompileBuildCommands } from "./compileBuildCommands.js";
|
|
2
|
+
import { registerDownCommand } from "./downCommand.js";
|
|
3
|
+
import { registerLifecyclePlanningCommands } from "./lifecyclePlanningCommands.js";
|
|
4
|
+
import { registerRunPublishCommands } from "./runPublishCommands.js";
|
|
5
|
+
import { registerUpCommand } from "./upCommand.js";
|
|
6
|
+
export const registerLifecycleCommands = (program, handlers, streams, stdin) => {
|
|
7
|
+
registerLifecyclePlanningCommands(program, streams, stdin);
|
|
8
|
+
registerCompileBuildCommands(program, handlers, streams);
|
|
9
|
+
registerRunPublishCommands(program, handlers, streams);
|
|
10
|
+
registerUpCommand(program, handlers, streams);
|
|
11
|
+
registerDownCommand(program, handlers, streams);
|
|
182
12
|
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type LifecycleInvocation } from "../deployment/index.js";
|
|
2
|
+
export declare const createLifecycleInvocation: (id: string, operation: LifecycleInvocation["operation"], correlation: LifecycleInvocation["correlation"], requestPolicy: LifecycleInvocation["request_policy"]) => LifecycleInvocation;
|
|
3
|
+
export declare const digestLifecycleBinding: (value: string | undefined) => string | null;
|
|
4
|
+
export type LifecycleReconciliation = {
|
|
5
|
+
outcomeBytes: string;
|
|
6
|
+
status: "completed";
|
|
7
|
+
} | {
|
|
8
|
+
status: "provably_not_applied";
|
|
9
|
+
} | {
|
|
10
|
+
status: "resume_safe";
|
|
11
|
+
} | {
|
|
12
|
+
reason: string;
|
|
13
|
+
status: "ambiguous";
|
|
14
|
+
};
|
|
15
|
+
export declare const runMachineLifecycle: (invocation: LifecycleInvocation, owner: (capability: {
|
|
16
|
+
epoch: string;
|
|
17
|
+
role: "initial" | "recovery";
|
|
18
|
+
}) => Promise<string>, reconcile?: () => Promise<LifecycleReconciliation>) => Promise<string>;
|
|
19
|
+
export declare const requireMachineLifecycle: (invocationId: string | undefined, json: boolean | undefined) => void;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { claimLifecycleInvocation, claimLifecycleRecovery, completeLifecycleInvocation, findExactLifecycleCompletion, markLifecycleAmbiguous, renewLifecycleOwner, } from "../deployment/index.js";
|
|
3
|
+
import { SpawnfileError } from "../shared/index.js";
|
|
4
|
+
export const createLifecycleInvocation = (id, operation, correlation, requestPolicy) => ({
|
|
5
|
+
correlation,
|
|
6
|
+
id,
|
|
7
|
+
operation,
|
|
8
|
+
request_policy: requestPolicy,
|
|
9
|
+
version: "spawnfile.lifecycle-invocation.v1",
|
|
10
|
+
});
|
|
11
|
+
export const digestLifecycleBinding = (value) => value === undefined
|
|
12
|
+
? null
|
|
13
|
+
: `sha256:${createHash("sha256").update(value).digest("hex")}`;
|
|
14
|
+
const withLifecycleHeartbeat = async (invocation, capability, task) => {
|
|
15
|
+
await renewLifecycleOwner(invocation, capability);
|
|
16
|
+
let failure;
|
|
17
|
+
const timer = setInterval(() => {
|
|
18
|
+
void renewLifecycleOwner(invocation, capability).catch((error) => {
|
|
19
|
+
failure = error;
|
|
20
|
+
});
|
|
21
|
+
}, 10_000);
|
|
22
|
+
timer.unref();
|
|
23
|
+
try {
|
|
24
|
+
const result = await task();
|
|
25
|
+
if (failure)
|
|
26
|
+
throw failure;
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
finally {
|
|
30
|
+
clearInterval(timer);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
export const runMachineLifecycle = async (invocation, owner, reconcile) => {
|
|
34
|
+
const existing = await findExactLifecycleCompletion(invocation);
|
|
35
|
+
if (existing)
|
|
36
|
+
return existing.outcome_bytes;
|
|
37
|
+
const claim = await claimLifecycleInvocation(invocation);
|
|
38
|
+
if (claim.status === "replay") {
|
|
39
|
+
const replay = await findExactLifecycleCompletion(invocation);
|
|
40
|
+
if (!replay) {
|
|
41
|
+
throw new SpawnfileError("runtime_error", "Lifecycle replay completion disappeared");
|
|
42
|
+
}
|
|
43
|
+
return replay.outcome_bytes;
|
|
44
|
+
}
|
|
45
|
+
if (claim.status === "pending" && reconcile) {
|
|
46
|
+
const recovery = await claimLifecycleRecovery(invocation);
|
|
47
|
+
if (recovery.status === "replay") {
|
|
48
|
+
const completed = await findExactLifecycleCompletion(invocation);
|
|
49
|
+
if (completed)
|
|
50
|
+
return completed.outcome_bytes;
|
|
51
|
+
throw new SpawnfileError("runtime_error", "Lifecycle replay completion disappeared");
|
|
52
|
+
}
|
|
53
|
+
if (recovery.status === "owner") {
|
|
54
|
+
const verdict = await withLifecycleHeartbeat(invocation, recovery.capability, reconcile);
|
|
55
|
+
if (verdict.status === "completed") {
|
|
56
|
+
return (await completeLifecycleInvocation(invocation, verdict.outcomeBytes, recovery.capability)).outcome_bytes;
|
|
57
|
+
}
|
|
58
|
+
if (verdict.status === "provably_not_applied" ||
|
|
59
|
+
verdict.status === "resume_safe") {
|
|
60
|
+
return (await completeLifecycleInvocation(invocation, await withLifecycleHeartbeat(invocation, recovery.capability, () => owner(recovery.capability)), recovery.capability)).outcome_bytes;
|
|
61
|
+
}
|
|
62
|
+
await markLifecycleAmbiguous(invocation, "reconciliation_ambiguous", recovery.capability);
|
|
63
|
+
throw new SpawnfileError("runtime_error", `Lifecycle recovery is ambiguous: ${verdict.reason}`);
|
|
64
|
+
}
|
|
65
|
+
if (recovery.status === "ambiguous") {
|
|
66
|
+
throw new SpawnfileError("runtime_error", "Lifecycle recovery owner died; invocation is ambiguous");
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (claim.status !== "owner") {
|
|
70
|
+
throw new SpawnfileError("runtime_error", "Lifecycle invocation already has an in-flight owner");
|
|
71
|
+
}
|
|
72
|
+
return (await completeLifecycleInvocation(invocation, await withLifecycleHeartbeat(invocation, claim.capability, () => owner(claim.capability)), claim.capability)).outcome_bytes;
|
|
73
|
+
};
|
|
74
|
+
export const requireMachineLifecycle = (invocationId, json) => {
|
|
75
|
+
if (invocationId !== undefined && !json) {
|
|
76
|
+
throw new SpawnfileError("validation_error", "--lifecycle-invocation is only valid with --json");
|
|
77
|
+
}
|
|
78
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { type LifecycleInvocation } from "../deployment/index.js";
|
|
3
|
+
export declare const LIFECYCLE_PLAN_REQUEST_VERSION: "spawnfile.lifecycle-plan-request.v1";
|
|
4
|
+
export declare const MAX_LIFECYCLE_PLAN_REQUEST_BYTES = 262144;
|
|
5
|
+
export declare const lifecyclePlanRequestSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
6
|
+
deployment: z.ZodNullable<z.ZodString>;
|
|
7
|
+
include_private: z.ZodBoolean;
|
|
8
|
+
operation: z.ZodLiteral<"artifacts_export">;
|
|
9
|
+
out: z.ZodString;
|
|
10
|
+
reader_image: z.ZodNullable<z.ZodString>;
|
|
11
|
+
run_id: z.ZodNullable<z.ZodString>;
|
|
12
|
+
compiled: z.ZodNullable<z.ZodString>;
|
|
13
|
+
docker_command: z.ZodNullable<z.ZodString>;
|
|
14
|
+
lifecycle_invocation_id: z.ZodString;
|
|
15
|
+
path: z.ZodString;
|
|
16
|
+
timeout_ms: z.ZodNullable<z.ZodNumber>;
|
|
17
|
+
version: z.ZodLiteral<"spawnfile.lifecycle-plan-request.v1">;
|
|
18
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
19
|
+
deployment: z.ZodString;
|
|
20
|
+
export_to: z.ZodNullable<z.ZodString>;
|
|
21
|
+
force: z.ZodBoolean;
|
|
22
|
+
operation: z.ZodLiteral<"down">;
|
|
23
|
+
reader_image: z.ZodNullable<z.ZodString>;
|
|
24
|
+
remove_volumes: z.ZodBoolean;
|
|
25
|
+
compiled: z.ZodNullable<z.ZodString>;
|
|
26
|
+
docker_command: z.ZodNullable<z.ZodString>;
|
|
27
|
+
lifecycle_invocation_id: z.ZodString;
|
|
28
|
+
path: z.ZodString;
|
|
29
|
+
timeout_ms: z.ZodNullable<z.ZodNumber>;
|
|
30
|
+
version: z.ZodLiteral<"spawnfile.lifecycle-plan-request.v1">;
|
|
31
|
+
}, z.core.$strict>], "operation">;
|
|
32
|
+
export type LifecyclePlanRequest = z.infer<typeof lifecyclePlanRequestSchema>;
|
|
33
|
+
export declare const readLifecyclePlanRequest: (source: string, stdin: AsyncIterable<unknown>) => Promise<LifecyclePlanRequest>;
|
|
34
|
+
export declare const createPlannedLifecycleInvocation: (request: LifecyclePlanRequest) => Promise<LifecycleInvocation>;
|
|
35
|
+
export declare const planLifecycleInvocation: (request: LifecyclePlanRequest) => Promise<LifecycleInvocation>;
|