spawnfile 0.1.12 → 0.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -12
- package/dist/audit/auditCli.d.ts +19 -0
- package/dist/audit/auditCli.js +63 -0
- package/dist/audit/checks.d.ts +100 -0
- package/dist/audit/checks.js +279 -0
- package/dist/audit/checksShared.d.ts +74 -0
- package/dist/audit/checksShared.js +37 -0
- package/dist/audit/generateAudit.d.ts +19 -0
- package/dist/audit/generateAudit.js +122 -0
- package/dist/audit/index.d.ts +4 -0
- package/dist/audit/index.js +4 -0
- package/dist/audit/readAudit.d.ts +50 -0
- package/dist/audit/readAudit.js +59 -0
- package/dist/audit/types.d.ts +40 -0
- package/dist/audit/types.js +8 -0
- package/dist/auth/credentialEnvFile.d.ts +11 -0
- package/dist/auth/credentialEnvFile.js +60 -0
- package/dist/auth/credentialProvisioning.d.ts +15 -0
- package/dist/auth/credentialProvisioning.js +75 -0
- package/dist/auth/credentialProvisioningReceipt.d.ts +28 -0
- package/dist/auth/credentialProvisioningReceipt.js +70 -0
- package/dist/auth/credentialProvisioningRequest.d.ts +51 -0
- package/dist/auth/credentialProvisioningRequest.js +169 -0
- package/dist/auth/credentialWorldBindings.d.ts +21 -0
- package/dist/auth/credentialWorldBindings.js +104 -0
- package/dist/auth/index.d.ts +7 -0
- package/dist/auth/index.js +7 -0
- package/dist/auth/paths.d.ts +11 -0
- package/dist/auth/paths.js +21 -0
- package/dist/auth/runtimeCredentials.js +18 -2
- package/dist/auth/targetSecretSourceAuthor.d.ts +18 -0
- package/dist/auth/targetSecretSourceAuthor.js +52 -0
- package/dist/auth/targetSecretSourceFsPublish.d.ts +15 -0
- package/dist/auth/targetSecretSourceFsPublish.js +49 -0
- package/dist/auth/targetSecretSourceFsPublishImmutable.d.ts +16 -0
- package/dist/auth/targetSecretSourceFsPublishImmutable.js +435 -0
- package/dist/auth/targetSecretSourceFsRead.d.ts +14 -0
- package/dist/auth/targetSecretSourceFsRead.js +198 -0
- package/dist/auth/targetSecretSourceGrant.d.ts +16 -0
- package/dist/auth/targetSecretSourceGrant.js +99 -0
- package/dist/auth/targetSecretSourceGrantRecords.d.ts +84 -0
- package/dist/auth/targetSecretSourceGrantRecords.js +214 -0
- package/dist/auth/targetSecretSourceLifecycle.d.ts +30 -0
- package/dist/auth/targetSecretSourceLifecycle.js +52 -0
- package/dist/auth/targetSecretSourceOwnerEntropy.d.ts +6 -0
- package/dist/auth/targetSecretSourceOwnerEntropy.js +28 -0
- package/dist/auth/targetSecretSourceRecordCommon.d.ts +14 -0
- package/dist/auth/targetSecretSourceRecordCommon.js +100 -0
- package/dist/auth/targetSecretSourceRecordPublish.d.ts +10 -0
- package/dist/auth/targetSecretSourceRecordPublish.js +104 -0
- package/dist/auth/targetSecretSourceResolver.d.ts +10 -0
- package/dist/auth/targetSecretSourceResolver.js +137 -0
- package/dist/auth/targetSecretSourceRevoke.d.ts +20 -0
- package/dist/auth/targetSecretSourceRevoke.js +92 -0
- package/dist/auth/targetSecretSourceRotate.d.ts +19 -0
- package/dist/auth/targetSecretSourceRotate.js +121 -0
- package/dist/auth/targetSecretSourceVersionRecords.d.ts +49 -0
- package/dist/auth/targetSecretSourceVersionRecords.js +166 -0
- package/dist/cli/artifactsCommands.d.ts +27 -0
- package/dist/cli/artifactsCommands.js +132 -0
- package/dist/cli/authCommands.d.ts +5 -0
- package/dist/cli/authCommands.js +221 -0
- package/dist/cli/compileBuildCommands.d.ts +3 -0
- package/dist/cli/compileBuildCommands.js +35 -0
- package/dist/cli/containerBundleCommand.d.ts +6 -0
- package/dist/cli/containerBundleCommand.js +116 -0
- package/dist/cli/devCommands.d.ts +3 -0
- package/dist/cli/devCommands.js +115 -0
- package/dist/cli/downCommand.d.ts +25 -0
- package/dist/cli/downCommand.js +134 -0
- package/dist/cli/index.js +6 -3
- package/dist/cli/lifecycleCommands.d.ts +1 -1
- package/dist/cli/lifecycleCommands.js +11 -179
- package/dist/cli/lifecycleMachine.d.ts +19 -0
- package/dist/cli/lifecycleMachine.js +78 -0
- package/dist/cli/lifecyclePlan.d.ts +35 -0
- package/dist/cli/lifecyclePlan.js +240 -0
- package/dist/cli/lifecyclePlanningCommands.d.ts +3 -0
- package/dist/cli/lifecyclePlanningCommands.js +30 -0
- package/dist/cli/runCli.d.ts +15 -2
- package/dist/cli/runCli.js +31 -71
- package/dist/cli/runPublishCommands.d.ts +3 -0
- package/dist/cli/runPublishCommands.js +70 -0
- package/dist/cli/statusCommand.d.ts +3 -32
- package/dist/cli/statusCommand.js +37 -233
- package/dist/cli/statusCommandLive.d.ts +20 -0
- package/dist/cli/statusCommandLive.js +188 -0
- package/dist/cli/statusCommandOptions.d.ts +40 -0
- package/dist/cli/statusCommandOptions.js +42 -0
- package/dist/cli/targetCliRoute.d.ts +2 -0
- package/dist/cli/targetCliRoute.js +30 -0
- package/dist/cli/targetCommands.d.ts +33 -0
- package/dist/cli/targetCommands.js +257 -0
- package/dist/cli/targetComposedPreparationCommand.d.ts +6 -0
- package/dist/cli/targetComposedPreparationCommand.js +39 -0
- package/dist/cli/targetDefaultArtifactAuthority.d.ts +5 -0
- package/dist/cli/targetDefaultArtifactAuthority.js +28 -0
- package/dist/cli/targetDefaultAuthorities.d.ts +53 -0
- package/dist/cli/targetDefaultAuthorities.js +210 -0
- package/dist/cli/targetDefaultConfig.d.ts +68 -0
- package/dist/cli/targetDefaultConfig.js +317 -0
- package/dist/cli/targetDefaultConfigStdin.d.ts +13 -0
- package/dist/cli/targetDefaultConfigStdin.js +215 -0
- package/dist/cli/targetDefaultEnvelope.d.ts +1 -0
- package/dist/cli/targetDefaultEnvelope.js +13 -0
- package/dist/cli/targetDefaultHandlerFactory.d.ts +28 -0
- package/dist/cli/targetDefaultHandlerFactory.js +247 -0
- package/dist/cli/targetDefaultHandlers.d.ts +21 -0
- package/dist/cli/targetDefaultHandlers.js +72 -0
- package/dist/cli/targetDefaultJournalAuthority.d.ts +35 -0
- package/dist/cli/targetDefaultJournalAuthority.js +135 -0
- package/dist/cli/targetDefaultWorldClock.d.ts +4 -0
- package/dist/cli/targetDefaultWorldClock.js +14 -0
- package/dist/cli/targetDefaultWorldQueries.d.ts +5 -0
- package/dist/cli/targetDefaultWorldQueries.js +11 -0
- package/dist/cli/targetDefaultWorldReadiness.d.ts +4 -0
- package/dist/cli/targetDefaultWorldReadiness.js +17 -0
- package/dist/cli/targetEvidenceHelperResolution.d.ts +14 -0
- package/dist/cli/targetEvidenceHelperResolution.js +23 -0
- package/dist/cli/targetLookupCli.d.ts +3 -0
- package/dist/cli/targetLookupCli.js +31 -0
- package/dist/cli/targetLookupCommands.d.ts +12 -0
- package/dist/cli/targetLookupCommands.js +69 -0
- package/dist/cli/targetOperationDispatch.d.ts +58 -0
- package/dist/cli/targetOperationDispatch.js +21 -0
- package/dist/cli/targetReceiptOutput.d.ts +14 -0
- package/dist/cli/targetReceiptOutput.js +21 -0
- package/dist/cli/targetRequestFile.d.ts +14 -0
- package/dist/cli/targetRequestFile.js +63 -0
- package/dist/cli/targetSecretSourceInput.d.ts +28 -0
- package/dist/cli/targetSecretSourceInput.js +121 -0
- package/dist/cli/targetWorldClockCommand.d.ts +10 -0
- package/dist/cli/targetWorldClockCommand.js +42 -0
- package/dist/cli/targetWorldClockCrossProcess.test-helper.d.ts +13 -0
- package/dist/cli/targetWorldClockCrossProcess.test-helper.js +109 -0
- package/dist/cli/targetWorldReadinessCommand.d.ts +10 -0
- package/dist/cli/targetWorldReadinessCommand.js +43 -0
- package/dist/cli/upCommand.d.ts +3 -0
- package/dist/cli/upCommand.js +133 -0
- package/dist/cli/upImageCommand.d.ts +11 -0
- package/dist/cli/upImageCommand.js +41 -0
- package/dist/cli/upLifecycleInvocation.d.ts +41 -0
- package/dist/cli/upLifecycleInvocation.js +48 -0
- package/dist/cli/upLifecycleRecovery.d.ts +4 -0
- package/dist/cli/upLifecycleRecovery.js +53 -0
- package/dist/compiler/agentNodeMerge.d.ts +2 -0
- package/dist/compiler/agentNodeMerge.js +79 -0
- package/dist/compiler/agentSurfaces.js +11 -1
- package/dist/compiler/buildCompilePlan.js +17 -0
- package/dist/compiler/buildCompilePlanAgent.d.ts +11 -0
- package/dist/compiler/buildCompilePlanAgent.js +56 -0
- package/dist/compiler/buildCompilePlanTeams.d.ts +1 -0
- package/dist/compiler/buildCompilePlanTeams.js +4 -1
- package/dist/compiler/buildCompilePlanTraversal.js +75 -82
- package/dist/compiler/buildProject.d.ts +20 -1
- package/dist/compiler/buildProject.js +121 -7
- package/dist/compiler/compilePlanHelpers.js +2 -0
- package/dist/compiler/compileProject.d.ts +15 -0
- package/dist/compiler/compileProject.js +29 -75
- package/dist/compiler/compileProjectPolicy.d.ts +5 -0
- package/dist/compiler/compileProjectPolicy.js +21 -0
- package/dist/compiler/compileProjectReports.d.ts +9 -0
- package/dist/compiler/compileProjectReports.js +52 -0
- package/dist/compiler/containerArtifactSummaries.d.ts +7 -0
- package/dist/compiler/containerArtifactSummaries.js +138 -0
- package/dist/compiler/containerArtifacts.d.ts +10 -0
- package/dist/compiler/containerArtifacts.js +126 -125
- package/dist/compiler/containerArtifactsPlans.d.ts +5 -3
- package/dist/compiler/containerArtifactsPlans.js +31 -118
- package/dist/compiler/containerArtifactsRender.d.ts +3 -1
- package/dist/compiler/containerArtifactsRender.js +40 -81
- package/dist/compiler/containerArtifactsTypes.d.ts +12 -0
- package/dist/compiler/containerConfigEnvRender.d.ts +3 -0
- package/dist/compiler/containerConfigEnvRender.js +54 -0
- package/dist/compiler/containerEntrypointRender.d.ts +1 -0
- package/dist/compiler/containerEntrypointRender.js +60 -53
- package/dist/compiler/containerEntrypointShell.d.ts +5 -0
- package/dist/compiler/containerEntrypointShell.js +29 -0
- package/dist/compiler/containerPackageOverrides.d.ts +27 -0
- package/dist/compiler/containerPackageOverrides.js +63 -0
- package/dist/compiler/containerPackageRender.d.ts +15 -0
- package/dist/compiler/containerPackageRender.js +63 -0
- package/dist/compiler/containerTargetPlanResolution.d.ts +20 -0
- package/dist/compiler/containerTargetPlanResolution.js +97 -0
- package/dist/compiler/containerTargetResources.js +3 -1
- package/dist/compiler/daimonTelemetryArtifacts.d.ts +22 -0
- package/dist/compiler/daimonTelemetryArtifacts.js +61 -0
- package/dist/compiler/dockerBuildContext.d.ts +16 -0
- package/dist/compiler/dockerBuildContext.js +159 -0
- package/dist/compiler/dockerBuildSkip.d.ts +30 -0
- package/dist/compiler/dockerBuildSkip.js +81 -0
- package/dist/compiler/index.d.ts +4 -0
- package/dist/compiler/index.js +4 -0
- package/dist/compiler/memoryArtifacts.d.ts +26 -0
- package/dist/compiler/memoryArtifacts.js +134 -0
- package/dist/compiler/memoryResolution.d.ts +4 -0
- package/dist/compiler/memoryResolution.js +147 -0
- package/dist/compiler/modelEnv.d.ts +2 -0
- package/dist/compiler/modelEnv.js +6 -0
- package/dist/compiler/moltnetAllowedWakeSendersValidation.d.ts +2 -0
- package/dist/compiler/moltnetAllowedWakeSendersValidation.js +42 -0
- package/dist/compiler/moltnetArtifactPaths.d.ts +26 -0
- package/dist/compiler/moltnetArtifactPaths.js +49 -0
- package/dist/compiler/moltnetArtifactTypes.d.ts +46 -0
- package/dist/compiler/moltnetArtifactTypes.js +1 -0
- package/dist/compiler/moltnetArtifacts.d.ts +2 -40
- package/dist/compiler/moltnetArtifacts.js +56 -95
- package/dist/compiler/moltnetBinaries.d.ts +21 -1
- package/dist/compiler/moltnetBinaries.js +156 -28
- package/dist/compiler/moltnetClientConfig.js +18 -2
- package/dist/compiler/moltnetConfigLowering.d.ts +16 -1
- package/dist/compiler/moltnetConfigLowering.js +67 -5
- package/dist/compiler/moltnetExternalParticipantArtifact.d.ts +38 -0
- package/dist/compiler/moltnetExternalParticipantArtifact.js +188 -0
- package/dist/compiler/moltnetNodeConfig.js +7 -2
- package/dist/compiler/moltnetReleaseAuthority.d.ts +17 -0
- package/dist/compiler/moltnetReleaseAuthority.js +73 -0
- package/dist/compiler/moltnetReleaseDownload.d.ts +12 -0
- package/dist/compiler/moltnetReleaseDownload.js +85 -0
- package/dist/compiler/moltnetRepresentativeResolution.d.ts +1 -0
- package/dist/compiler/moltnetRepresentativeResolution.js +16 -2
- package/dist/compiler/moltnetResolution.js +72 -20
- package/dist/compiler/moltnetRoomMemberships.js +37 -9
- package/dist/compiler/moltnetRuntimeConfig.js +11 -0
- package/dist/compiler/moltnetServerPlans.d.ts +9 -0
- package/dist/compiler/moltnetServerPlans.js +132 -0
- package/dist/compiler/organizationIdentity.d.ts +27 -0
- package/dist/compiler/organizationIdentity.js +297 -0
- package/dist/compiler/organizationReadyEvidence.d.ts +49 -0
- package/dist/compiler/organizationReadyEvidence.js +261 -0
- package/dist/compiler/projectManifestGraph.d.ts +4 -0
- package/dist/compiler/projectManifestGraph.js +24 -0
- package/dist/compiler/runProject.d.ts +4 -0
- package/dist/compiler/runProject.js +37 -22
- package/dist/compiler/runProjectAuth.d.ts +7 -1
- package/dist/compiler/runProjectAuth.js +87 -9
- package/dist/compiler/runProjectDocker.d.ts +7 -0
- package/dist/compiler/runProjectDocker.js +187 -19
- package/dist/compiler/runProjectLifecycle.d.ts +7 -0
- package/dist/compiler/runProjectLifecycle.js +40 -0
- package/dist/compiler/syncProjectAuth.js +4 -1
- package/dist/compiler/teamContextActiveEnvironments.d.ts +13 -0
- package/dist/compiler/teamContextActiveEnvironments.js +255 -0
- package/dist/compiler/teamContextSupport.js +32 -40
- package/dist/compiler/teamContextTypes.d.ts +2 -0
- package/dist/compiler/types.d.ts +82 -1
- package/dist/compiler/upProject.d.ts +5 -0
- package/dist/compiler/upProject.js +257 -20
- package/dist/compiler/upReceipt.d.ts +36 -0
- package/dist/compiler/upReceipt.js +82 -0
- package/dist/compiler/updateProjectModels.js +42 -60
- package/dist/compiler/updateProjectRuntime.js +22 -35
- package/dist/compiler/updateProjectSurfaces.js +53 -47
- package/dist/compiler/worldBindings.d.ts +39 -0
- package/dist/compiler/worldBindings.js +247 -0
- package/dist/compiler/worldBindingsFile.d.ts +5 -0
- package/dist/compiler/worldBindingsFile.js +162 -0
- package/dist/deployment/artifactsExport.d.ts +49 -0
- package/dist/deployment/artifactsExport.js +217 -0
- package/dist/deployment/artifactsExportDocker.d.ts +48 -0
- package/dist/deployment/artifactsExportDocker.js +91 -0
- package/dist/deployment/artifactsExportPlan.d.ts +24 -0
- package/dist/deployment/artifactsExportPlan.js +135 -0
- package/dist/deployment/artifactsExportTypes.d.ts +50 -0
- package/dist/deployment/artifactsExportTypes.js +52 -0
- package/dist/deployment/buildImageCacheStore.d.ts +23 -0
- package/dist/deployment/buildImageCacheStore.js +54 -0
- package/dist/deployment/deploymentLifecycleCorrelation.d.ts +11 -0
- package/dist/deployment/deploymentLifecycleCorrelation.js +33 -0
- package/dist/deployment/dockerInspect.d.ts +9 -0
- package/dist/deployment/dockerInspect.js +24 -1
- package/dist/deployment/dockerLabels.d.ts +2 -0
- package/dist/deployment/dockerLabels.js +2 -0
- package/dist/deployment/dockerLogs.js +2 -10
- package/dist/deployment/dockerManager.d.ts +51 -0
- package/dist/deployment/dockerManager.js +118 -1
- package/dist/deployment/dockerProbeGateway.js +64 -5
- package/dist/deployment/dockerRecover.d.ts +17 -0
- package/dist/deployment/dockerRecover.js +137 -0
- package/dist/deployment/dockerTeardown.d.ts +32 -0
- package/dist/deployment/dockerTeardown.js +61 -0
- package/dist/deployment/downDeployment.d.ts +34 -0
- package/dist/deployment/downDeployment.js +147 -0
- package/dist/deployment/downReceiptTypes.d.ts +21 -0
- package/dist/deployment/downReceiptTypes.js +30 -0
- package/dist/deployment/index.d.ts +17 -0
- package/dist/deployment/index.js +18 -0
- package/dist/deployment/lifecycleCompletion.d.ts +37 -0
- package/dist/deployment/lifecycleCompletion.js +236 -0
- package/dist/deployment/lifecycleCompletionContracts.d.ts +158 -0
- package/dist/deployment/lifecycleCompletionContracts.js +106 -0
- package/dist/deployment/lifecycleCompletionHeartbeat.d.ts +2 -0
- package/dist/deployment/lifecycleCompletionHeartbeat.js +50 -0
- package/dist/deployment/lifecycleCompletionLookup.d.ts +18 -0
- package/dist/deployment/lifecycleCompletionLookup.js +88 -0
- package/dist/deployment/lifecycleCompletionOwner.d.ts +8 -0
- package/dist/deployment/lifecycleCompletionOwner.js +31 -0
- package/dist/deployment/lifecycleCompletionParsing.d.ts +12 -0
- package/dist/deployment/lifecycleCompletionParsing.js +108 -0
- package/dist/deployment/lifecycleCompletionPaths.d.ts +9 -0
- package/dist/deployment/lifecycleCompletionPaths.js +16 -0
- package/dist/deployment/lifecycleCompletionPublication.d.ts +5 -0
- package/dist/deployment/lifecycleCompletionPublication.js +35 -0
- package/dist/deployment/lifecycleCompletionRecovery.d.ts +21 -0
- package/dist/deployment/lifecycleCompletionRecovery.js +56 -0
- package/dist/deployment/lifecycleCompletionRoot.d.ts +21 -0
- package/dist/deployment/lifecycleCompletionRoot.js +243 -0
- package/dist/deployment/lifecycleCompletionStore.d.ts +6 -0
- package/dist/deployment/lifecycleCompletionStore.js +151 -0
- package/dist/deployment/organizationHandoffAuthorityFsClient.d.ts +17 -0
- package/dist/deployment/organizationHandoffAuthorityFsClient.js +132 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorker.d.ts +1 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorker.js +285 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorkerParent.fixture.d.ts +1 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorkerParent.fixture.js +26 -0
- package/dist/deployment/organizationHandoffAuthorityStore.d.ts +41 -0
- package/dist/deployment/organizationHandoffAuthorityStore.js +348 -0
- package/dist/deployment/organizationHandoffAuthorityTypes.d.ts +76 -0
- package/dist/deployment/organizationHandoffAuthorityTypes.js +148 -0
- package/dist/deployment/organizationHandoffTypes.d.ts +29 -0
- package/dist/deployment/organizationHandoffTypes.js +80 -0
- package/dist/deployment/organizationReady.d.ts +52 -0
- package/dist/deployment/organizationReady.js +200 -0
- package/dist/deployment/privateArtifactsExport.d.ts +18 -0
- package/dist/deployment/privateArtifactsExport.js +80 -0
- package/dist/deployment/providerRuntimeBoundaryScanner.test-helper.d.ts +8 -0
- package/dist/deployment/providerRuntimeBoundaryScanner.test-helper.js +60 -0
- package/dist/deployment/record.d.ts +26 -1
- package/dist/deployment/record.js +49 -4
- package/dist/deployment/simfileFixtureBoundary.test-helper.d.ts +8 -0
- package/dist/deployment/simfileFixtureBoundary.test-helper.js +103 -0
- package/dist/deployment/target.d.ts +1 -35
- package/dist/deployment/target.js +1 -96
- package/dist/deployment/upReceiptTypes.d.ts +111 -0
- package/dist/deployment/upReceiptTypes.js +164 -0
- package/dist/dev/activity.d.ts +14 -0
- package/dist/dev/activity.js +48 -0
- package/dist/dev/docker.d.ts +16 -0
- package/dist/dev/docker.js +71 -0
- package/dist/dev/index.d.ts +2 -0
- package/dist/dev/index.js +2 -0
- package/dist/dev/project.d.ts +35 -0
- package/dist/dev/project.js +170 -0
- package/dist/distribution/buildDistributionReport.d.ts +2 -1
- package/dist/distribution/buildDistributionReport.js +2 -1
- package/dist/distribution/distributionReportSchema.d.ts +5 -0
- package/dist/distribution/distributionReportSchema.js +7 -2
- package/dist/distribution/index.d.ts +2 -2
- package/dist/distribution/index.js +1 -1
- package/dist/distribution/types.d.ts +7 -0
- package/dist/distribution/types.js +1 -0
- package/dist/filesystem/paths.js +10 -1
- package/dist/ledger/causalConformanceCli.d.ts +1 -0
- package/dist/ledger/causalConformanceCli.js +41 -0
- package/dist/ledger/causeNamespace.d.ts +8 -0
- package/dist/ledger/causeNamespace.js +24 -0
- package/dist/ledger/conformance.d.ts +83 -0
- package/dist/ledger/conformance.js +259 -0
- package/dist/ledger/emitters.d.ts +76 -0
- package/dist/ledger/emitters.js +188 -0
- package/dist/ledger/index.d.ts +4 -0
- package/dist/ledger/index.js +4 -0
- package/dist/ledger/principal.d.ts +96 -0
- package/dist/ledger/principal.js +121 -0
- package/dist/manifest/externalParticipantSchemas.d.ts +18 -0
- package/dist/manifest/externalParticipantSchemas.js +17 -0
- package/dist/manifest/index.d.ts +1 -0
- package/dist/manifest/index.js +1 -0
- package/dist/manifest/inlineAgentMember.d.ts +2 -0
- package/dist/manifest/inlineAgentMember.js +9 -0
- package/dist/manifest/loadManifest.js +14 -8
- package/dist/manifest/mcpSchemas.d.ts +17 -0
- package/dist/manifest/mcpSchemas.js +41 -0
- package/dist/manifest/memorySchemas.d.ts +245 -0
- package/dist/manifest/memorySchemas.js +148 -0
- package/dist/manifest/renderSpawnfile.js +22 -131
- package/dist/manifest/renderSpawnfileNetworks.js +9 -2
- package/dist/manifest/renderSpawnfileSurfaces.d.ts +2 -0
- package/dist/manifest/renderSpawnfileSurfaces.js +134 -0
- package/dist/manifest/schemas.d.ts +1868 -99
- package/dist/manifest/schemas.js +78 -32
- package/dist/manifest/surfaceSchemas.d.ts +17 -0
- package/dist/manifest/surfaceSchemas.js +24 -1
- package/dist/manifest/teamNetworkAccessSchemas.d.ts +1 -1
- package/dist/manifest/teamNetworkAuthSchemas.d.ts +48 -0
- package/dist/manifest/teamNetworkAuthSchemas.js +103 -0
- package/dist/manifest/teamNetworkSchemas.d.ts +8 -187
- package/dist/manifest/teamNetworkSchemas.js +3 -317
- package/dist/manifest/teamNetworkServerSchemas.d.ts +150 -0
- package/dist/manifest/teamNetworkServerSchemas.js +199 -0
- package/dist/ownership/siblingBuildFreshness.d.ts +20 -0
- package/dist/ownership/siblingBuildFreshness.js +20 -0
- package/dist/ownership/simfileRunOperatorInputs.d.ts +103 -0
- package/dist/ownership/simfileRunOperatorInputs.js +139 -0
- package/dist/report/types.d.ts +142 -0
- package/dist/runtime/common.d.ts +37 -0
- package/dist/runtime/common.js +56 -1
- package/dist/runtime/container.d.ts +29 -1
- package/dist/runtime/container.js +127 -11
- package/dist/runtime/containerPackageOverrides.d.ts +37 -0
- package/dist/runtime/containerPackageOverrides.js +33 -0
- package/dist/runtime/index.d.ts +2 -0
- package/dist/runtime/index.js +2 -0
- package/dist/runtime/install.d.ts +1 -1
- package/dist/runtime/install.js +43 -1
- package/dist/runtime/mnemeMcp.d.ts +15 -0
- package/dist/runtime/mnemeMcp.js +109 -0
- package/dist/runtime/openclaw/adapter.js +15 -4
- package/dist/runtime/openclaw/mcp.d.ts +10 -0
- package/dist/runtime/openclaw/mcp.js +69 -0
- package/dist/runtime/openclaw/runAuth.js +2 -2
- package/dist/runtime/openclaw/scaffold.js +1 -1
- package/dist/runtime/openclaw/schedules.d.ts +38 -0
- package/dist/runtime/openclaw/schedules.js +74 -0
- package/dist/runtime/pi/adapter.d.ts +4 -0
- package/dist/runtime/pi/adapter.js +231 -0
- package/dist/runtime/pi/appActivitySource.d.ts +1 -0
- package/dist/runtime/pi/appActivitySource.js +199 -0
- package/dist/runtime/pi/appAgentConfig.d.ts +11 -0
- package/dist/runtime/pi/appAgentConfig.js +264 -0
- package/dist/runtime/pi/appCliEnginesSource.d.ts +1 -0
- package/dist/runtime/pi/appCliEnginesSource.js +183 -0
- package/dist/runtime/pi/appCliSource.d.ts +1 -0
- package/dist/runtime/pi/appCliSource.js +353 -0
- package/dist/runtime/pi/appControlSource.d.ts +1 -0
- package/dist/runtime/pi/appControlSource.js +390 -0
- package/dist/runtime/pi/appControlWakeIdentitySource.d.ts +1 -0
- package/dist/runtime/pi/appControlWakeIdentitySource.js +19 -0
- package/dist/runtime/pi/appCoreSource.d.ts +4 -0
- package/dist/runtime/pi/appCoreSource.js +244 -0
- package/dist/runtime/pi/appPreludeSource.d.ts +1 -0
- package/dist/runtime/pi/appPreludeSource.js +191 -0
- package/dist/runtime/pi/appScheduleSource.d.ts +1 -0
- package/dist/runtime/pi/appScheduleSource.js +80 -0
- package/dist/runtime/pi/appScriptedEngine.d.ts +31 -0
- package/dist/runtime/pi/appScriptedEngine.js +42 -0
- package/dist/runtime/pi/appSource.d.ts +4 -0
- package/dist/runtime/pi/appSource.js +12 -0
- package/dist/runtime/pi/appTemplate.d.ts +14 -0
- package/dist/runtime/pi/appTemplate.js +27 -0
- package/dist/runtime/pi/appTemplateTypes.d.ts +64 -0
- package/dist/runtime/pi/appTemplateTypes.js +18 -0
- package/dist/runtime/pi/appWakeContextSource.d.ts +1 -0
- package/dist/runtime/pi/appWakeContextSource.js +398 -0
- package/dist/runtime/pi/containerTargets.d.ts +4 -0
- package/dist/runtime/pi/containerTargets.js +57 -0
- package/dist/runtime/pi/runAuth.d.ts +2 -0
- package/dist/runtime/pi/runAuth.js +185 -0
- package/dist/runtime/pi/testHelpers.d.ts +2 -0
- package/dist/runtime/pi/testHelpers.js +40 -0
- package/dist/runtime/picoclaw/adapter.js +23 -27
- package/dist/runtime/picoclaw/mcp.d.ts +4 -0
- package/dist/runtime/picoclaw/mcp.js +43 -0
- package/dist/runtime/picoclaw/memory.d.ts +7 -0
- package/dist/runtime/picoclaw/memory.js +17 -0
- package/dist/runtime/picoclaw/runAuth.js +1 -1
- package/dist/runtime/picoclaw/scaffold.js +1 -1
- package/dist/runtime/picoclaw/schedules.d.ts +26 -0
- package/dist/runtime/picoclaw/schedules.js +62 -3
- package/dist/runtime/registry.js +3 -0
- package/dist/runtime/scheduleUtils.d.ts +2 -0
- package/dist/runtime/scheduleUtils.js +15 -0
- package/dist/runtime/types.d.ts +26 -2
- package/dist/shared/errors.d.ts +1 -1
- package/dist/shared/errors.js +2 -2
- package/dist/shared/index.d.ts +1 -0
- package/dist/shared/index.js +1 -0
- package/dist/shared/redaction.d.ts +2 -0
- package/dist/shared/redaction.js +10 -0
- package/dist/status/buildStatus.d.ts +1 -0
- package/dist/status/buildStatus.js +2 -0
- package/dist/status/compileReport.d.ts +22 -0
- package/dist/status/compileReport.js +16 -2
- package/dist/status/compiledProbeCollection.d.ts +21 -0
- package/dist/status/compiledProbeCollection.js +27 -0
- package/dist/status/deployments.js +5 -12
- package/dist/status/imageStatusReport.js +6 -0
- package/dist/status/index.d.ts +3 -0
- package/dist/status/index.js +3 -0
- package/dist/status/lifecycleProbes.d.ts +19 -0
- package/dist/status/lifecycleProbes.js +174 -0
- package/dist/status/moltnetProbes.d.ts +7 -8
- package/dist/status/moltnetProbes.js +27 -198
- package/dist/status/moltnetWiringProbes.d.ts +19 -0
- package/dist/status/moltnetWiringProbes.js +178 -0
- package/dist/target/cleanupRun.d.ts +41 -0
- package/dist/target/cleanupRun.js +139 -0
- package/dist/target/cleanupRunDocker.d.ts +16 -0
- package/dist/target/cleanupRunDocker.js +66 -0
- package/dist/target/cleanupRunDocker.test-helper.d.ts +67 -0
- package/dist/target/cleanupRunDocker.test-helper.js +238 -0
- package/dist/target/cleanupRunDockerPreflight.d.ts +17 -0
- package/dist/target/cleanupRunDockerPreflight.js +224 -0
- package/dist/target/composedPreparation.d.ts +205 -0
- package/dist/target/composedPreparation.js +223 -0
- package/dist/target/containerBundle.d.ts +82 -0
- package/dist/target/containerBundle.js +243 -0
- package/dist/target/containerBundleArchive.d.ts +31 -0
- package/dist/target/containerBundleArchive.js +140 -0
- package/dist/target/containerBundleAuthority.d.ts +25 -0
- package/dist/target/containerBundleAuthority.js +65 -0
- package/dist/target/containerBundleContracts.d.ts +114 -0
- package/dist/target/containerBundleContracts.js +173 -0
- package/dist/target/containerBundleFilesystemStore.d.ts +3 -0
- package/dist/target/containerBundleFilesystemStore.js +247 -0
- package/dist/target/containerBundlePolicy.d.ts +33 -0
- package/dist/target/containerBundlePolicy.js +64 -0
- package/dist/target/containerBundleStore.d.ts +127 -0
- package/dist/target/containerBundleStore.js +284 -0
- package/dist/target/contracts.d.ts +538 -0
- package/dist/target/contracts.js +373 -0
- package/dist/target/dockerArtifactIdentityTypes.d.ts +56 -0
- package/dist/target/dockerArtifactIdentityTypes.js +1 -0
- package/dist/target/dockerArtifactInspection.d.ts +40 -0
- package/dist/target/dockerArtifactInspection.js +125 -0
- package/dist/target/dockerArtifacts.d.ts +21 -0
- package/dist/target/dockerArtifacts.js +110 -0
- package/dist/target/dockerArtifactsProvider.d.ts +41 -0
- package/dist/target/dockerArtifactsProvider.js +449 -0
- package/dist/target/dockerCommandExecutor.d.ts +27 -0
- package/dist/target/dockerCommandExecutor.js +200 -0
- package/dist/target/dockerCommandExecutorCore.d.ts +34 -0
- package/dist/target/dockerCommandExecutorCore.js +273 -0
- package/dist/target/dockerContainerBundleBuilder.d.ts +8 -0
- package/dist/target/dockerContainerBundleBuilder.js +256 -0
- package/dist/target/dockerContextSnapshot.d.ts +21 -0
- package/dist/target/dockerContextSnapshot.js +158 -0
- package/dist/target/dockerEndpointFingerprint.d.ts +1 -0
- package/dist/target/dockerEndpointFingerprint.js +9 -0
- package/dist/target/dockerPreparedArtifact.d.ts +48 -0
- package/dist/target/dockerPreparedArtifact.js +131 -0
- package/dist/target/dockerProjectionJson.d.ts +1 -0
- package/dist/target/dockerProjectionJson.js +80 -0
- package/dist/target/dockerPublicArtifactSnapshot.d.ts +17 -0
- package/dist/target/dockerPublicArtifactSnapshot.js +99 -0
- package/dist/target/dockerResources.d.ts +26 -0
- package/dist/target/dockerResources.js +162 -0
- package/dist/target/dockerResourcesProvider.d.ts +44 -0
- package/dist/target/dockerResourcesProvider.js +207 -0
- package/dist/target/dockerSecrets.d.ts +39 -0
- package/dist/target/dockerSecrets.js +249 -0
- package/dist/target/dockerSecretsAuthority.d.ts +26 -0
- package/dist/target/dockerSecretsAuthority.js +216 -0
- package/dist/target/dockerSecretsLifecycle.d.ts +25 -0
- package/dist/target/dockerSecretsLifecycle.js +133 -0
- package/dist/target/dockerSecretsProvider.d.ts +68 -0
- package/dist/target/dockerSecretsProvider.js +329 -0
- package/dist/target/dockerTarget.d.ts +52 -0
- package/dist/target/dockerTarget.js +48 -0
- package/dist/target/dockerTargetBinding.d.ts +14 -0
- package/dist/target/dockerTargetBinding.js +96 -0
- package/dist/target/dockerWorldClock.d.ts +17 -0
- package/dist/target/dockerWorldClock.js +111 -0
- package/dist/target/dockerWorldReadiness.d.ts +17 -0
- package/dist/target/dockerWorldReadiness.js +119 -0
- package/dist/target/dockerWorldService.d.ts +23 -0
- package/dist/target/dockerWorldService.js +216 -0
- package/dist/target/dockerWorldServiceAuthority.d.ts +80 -0
- package/dist/target/dockerWorldServiceAuthority.js +182 -0
- package/dist/target/dockerWorldServiceLifecycle.d.ts +41 -0
- package/dist/target/dockerWorldServiceLifecycle.js +275 -0
- package/dist/target/dockerWorldServiceProvider.d.ts +60 -0
- package/dist/target/dockerWorldServiceProvider.js +318 -0
- package/dist/target/dockerWorldServiceStore.d.ts +73 -0
- package/dist/target/dockerWorldServiceStore.js +367 -0
- package/dist/target/evidenceExport.d.ts +55 -0
- package/dist/target/evidenceExport.js +518 -0
- package/dist/target/evidenceExportArchive.d.ts +10 -0
- package/dist/target/evidenceExportArchive.js +302 -0
- package/dist/target/evidenceExportContract.d.ts +27 -0
- package/dist/target/evidenceExportContract.js +40 -0
- package/dist/target/evidenceExportOperationsTestKit.d.ts +87 -0
- package/dist/target/evidenceExportOperationsTestKit.js +312 -0
- package/dist/target/evidenceExportProvider.d.ts +85 -0
- package/dist/target/evidenceExportProvider.js +187 -0
- package/dist/target/evidenceExportPublicationTypes.d.ts +16 -0
- package/dist/target/evidenceExportPublicationTypes.js +1 -0
- package/dist/target/evidenceExportStore.d.ts +70 -0
- package/dist/target/evidenceExportStore.js +498 -0
- package/dist/target/evidenceExportStorePublication.d.ts +7 -0
- package/dist/target/evidenceExportStorePublication.js +395 -0
- package/dist/target/handles.d.ts +20 -0
- package/dist/target/handles.js +56 -0
- package/dist/target/index.d.ts +12 -0
- package/dist/target/index.js +11 -0
- package/dist/target/journal.d.ts +59 -0
- package/dist/target/journal.js +529 -0
- package/dist/target/journalFilesystem.d.ts +3 -0
- package/dist/target/journalFilesystem.js +111 -0
- package/dist/target/journalRoot.d.ts +4 -0
- package/dist/target/journalRoot.js +6 -0
- package/dist/target/organizationAttachment.d.ts +23 -0
- package/dist/target/organizationAttachment.js +263 -0
- package/dist/target/organizationAttachmentAuthority.d.ts +65 -0
- package/dist/target/organizationAttachmentAuthority.js +161 -0
- package/dist/target/organizationAttachmentLifecycle.d.ts +17 -0
- package/dist/target/organizationAttachmentLifecycle.js +101 -0
- package/dist/target/organizationAttachmentProvider.d.ts +76 -0
- package/dist/target/organizationAttachmentProvider.js +289 -0
- package/dist/target/organizationAttachmentStore.d.ts +51 -0
- package/dist/target/organizationAttachmentStore.js +316 -0
- package/dist/target/publicArtifactSnapshot.d.ts +41 -0
- package/dist/target/publicArtifactSnapshot.js +150 -0
- package/dist/target/topologyActivation.d.ts +51 -0
- package/dist/target/topologyActivation.js +149 -0
- package/dist/target/topologyAttestation.d.ts +37 -0
- package/dist/target/topologyAttestation.js +300 -0
- package/dist/target/topologyAttestationErrors.d.ts +1 -0
- package/dist/target/topologyAttestationErrors.js +1 -0
- package/dist/target/worldClock.d.ts +60 -0
- package/dist/target/worldClock.js +129 -0
- package/dist/target/worldReadiness.d.ts +103 -0
- package/dist/target/worldReadiness.js +153 -0
- package/moltnet-releases.json +20 -0
- package/package.json +29 -8
- package/runtimes.yaml +28 -27
- package/dist/runtime/openclaw/scaffold-assets/CLAUDE.md +0 -5
- package/dist/runtime/picoclaw/scaffold-assets/CLAUDE.md +0 -5
- /package/dist/runtime/openclaw/scaffold-assets/{AGENTS.md → WORKSPACE_AGENTS.md} +0 -0
- /package/dist/runtime/picoclaw/scaffold-assets/{AGENTS.md → WORKSPACE_AGENTS.md} +0 -0
|
@@ -1,19 +1,16 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
import { DISTRIBUTION_REPORT_IMAGE_PATH } from "../distribution/index.js";
|
|
2
|
+
import { DISTRIBUTION_REPORT_IMAGE_PATH, WORLD_BINDINGS_IMAGE_PATH } from "../distribution/index.js";
|
|
3
3
|
import { createRuntimeInstallRecipe } from "../runtime/index.js";
|
|
4
4
|
import { SpawnfileError } from "../shared/index.js";
|
|
5
5
|
export { renderEntrypoint } from "./containerEntrypointRender.js";
|
|
6
6
|
import { MOLTNET_BIN_DIRECTORY, MOLTNET_BINARY_NAMES } from "./moltnetBinaries.js";
|
|
7
|
+
import { collectPackagesByManager, createAptPackageInstallItem, createNpmPackageInstallCommand, createNpmPackageInstallItem, createPackageInstallCommand, createPipxPackageInstallCommand, createPipxPackageInstallItem, getNpmInstallItemName } from "./containerPackageRender.js";
|
|
7
8
|
const CONTAINER_ROOTFS_ROOT = "container/rootfs";
|
|
8
9
|
const GATEWAY_PORT_PLACEHOLDER = "<gateway-port>";
|
|
9
|
-
const MOLTNET_INSTALL_SCRIPT_URL = "https://moltnet.dev/install.sh";
|
|
10
|
-
const MOLTNET_RELEASE_METADATA_URL = "https://api.github.com/repos/noopolis/moltnet/releases/latest";
|
|
11
10
|
const WORKSPACE_PLACEHOLDER = "<workspace-path>";
|
|
11
|
+
const RUNTIME_ROOT_PLACEHOLDER = "<runtime-root>";
|
|
12
12
|
const shellQuote = (value) => `'${value.replace(/'/g, `'\"'\"'`)}'`;
|
|
13
13
|
const extractNodeMajorVersion = (image) => Number(image.match(/^node:(\d+)/)?.[1] ?? "0");
|
|
14
|
-
const createPackageInstallCommand = (packages) => `RUN apt-get update && apt-get install -y --no-install-recommends ${packages.join(" ")} && rm -rf /var/lib/apt/lists/*`;
|
|
15
|
-
const createNpmPackageInstallCommand = (packages) => `RUN npm install -g --omit=dev --no-fund --no-audit ${packages.join(" ")}`;
|
|
16
|
-
const createPipxPackageInstallCommand = (packages) => `RUN PIPX_HOME=/opt/pipx PIPX_BIN_DIR=/usr/local/bin pipx install ${packages.join(" ")}`;
|
|
17
14
|
const createStateOwnershipCommand = (persistentMountPaths = []) => {
|
|
18
15
|
const mountPaths = [...new Set(persistentMountPaths)].sort();
|
|
19
16
|
const mkdirPaths = [...new Set(["/var/lib/spawnfile", ...mountPaths])].sort();
|
|
@@ -21,7 +18,6 @@ const createStateOwnershipCommand = (persistentMountPaths = []) => {
|
|
|
21
18
|
const chownPaths = [
|
|
22
19
|
...new Set([
|
|
23
20
|
"/var/lib/spawnfile",
|
|
24
|
-
"/opt/spawnfile",
|
|
25
21
|
...mountPaths.filter((mountPath) => !mountPath.startsWith("/var/lib/spawnfile/"))
|
|
26
22
|
])
|
|
27
23
|
].sort();
|
|
@@ -31,70 +27,13 @@ const createStateOwnershipCommand = (persistentMountPaths = []) => {
|
|
|
31
27
|
`chown -R spawnfile:spawnfile ${chownPaths.map(shellQuote).join(" ")}`
|
|
32
28
|
].join(" && ");
|
|
33
29
|
};
|
|
34
|
-
const
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
};
|
|
41
|
-
const createPackageIdentity = (pkg) => `${pkg.manager}\u0000${pkg.name}\u0000${pkg.version ?? ""}\u0000${pkg.scope ?? ""}`;
|
|
42
|
-
const createPackageConflictIdentity = (pkg) => `${pkg.manager}\u0000${pkg.name}`;
|
|
43
|
-
const assertImagePackageCompatibility = (packages) => {
|
|
44
|
-
const byName = new Map();
|
|
45
|
-
for (const currentPackage of packages) {
|
|
46
|
-
const conflictIdentity = createPackageConflictIdentity(currentPackage);
|
|
47
|
-
const existingPackage = byName.get(conflictIdentity);
|
|
48
|
-
if (!existingPackage) {
|
|
49
|
-
byName.set(conflictIdentity, currentPackage);
|
|
50
|
-
continue;
|
|
51
|
-
}
|
|
52
|
-
if (createPackageIdentity(existingPackage) !== createPackageIdentity(currentPackage)) {
|
|
53
|
-
throw new SpawnfileError("validation_error", `Generated container declares conflicting package definitions for ${currentPackage.manager} package ${currentPackage.name}`);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
const createAptPackageInstallItem = (pkg) => pkg.version ? `${pkg.name}=${pkg.version}` : pkg.name;
|
|
58
|
-
const createNpmPackageInstallItem = (pkg) => pkg.version ? `${pkg.name}@${pkg.version}` : pkg.name;
|
|
59
|
-
const createPipxPackageInstallItem = (pkg) => pkg.version ? `${pkg.name}==${pkg.version}` : pkg.name;
|
|
60
|
-
const getNpmInstallItemName = (item) => {
|
|
61
|
-
if (!item.startsWith("@")) {
|
|
62
|
-
const versionMarker = item.indexOf("@");
|
|
63
|
-
return versionMarker === -1 ? item : item.slice(0, versionMarker);
|
|
64
|
-
}
|
|
65
|
-
const slashIndex = item.indexOf("/");
|
|
66
|
-
if (slashIndex === -1) {
|
|
67
|
-
return item;
|
|
68
|
-
}
|
|
69
|
-
const versionMarker = item.indexOf("@", slashIndex);
|
|
70
|
-
return versionMarker === -1 ? item : item.slice(0, versionMarker);
|
|
71
|
-
};
|
|
72
|
-
const collectPackagesByManager = (runtimePlans) => {
|
|
73
|
-
const packagesByManager = {
|
|
74
|
-
apt: [],
|
|
75
|
-
npm: [],
|
|
76
|
-
pipx: []
|
|
77
|
-
};
|
|
78
|
-
const imagePackages = runtimePlans.flatMap((plan) => plan.packages ?? []);
|
|
79
|
-
assertImagePackageCompatibility(imagePackages);
|
|
80
|
-
const resolvedPackages = dedupePackages(imagePackages);
|
|
81
|
-
for (const packageConfig of resolvedPackages) {
|
|
82
|
-
if (packageConfig.manager === "apt") {
|
|
83
|
-
packagesByManager.apt.push(packageConfig);
|
|
84
|
-
continue;
|
|
85
|
-
}
|
|
86
|
-
if (packageConfig.manager === "npm") {
|
|
87
|
-
packagesByManager.npm.push(packageConfig);
|
|
88
|
-
continue;
|
|
89
|
-
}
|
|
90
|
-
if (packageConfig.manager === "pipx") {
|
|
91
|
-
packagesByManager.pipx.push(packageConfig);
|
|
92
|
-
continue;
|
|
93
|
-
}
|
|
30
|
+
const selectBaseImage = (runtimePlans, runtimeRecipes) => {
|
|
31
|
+
const recipeBaseImages = [
|
|
32
|
+
...new Set(runtimeRecipes.flatMap((recipe) => recipe.baseImage ? [recipe.baseImage] : []))
|
|
33
|
+
];
|
|
34
|
+
if (recipeBaseImages.length === 1 && runtimePlans.length === runtimeRecipes.length) {
|
|
35
|
+
return recipeBaseImages[0];
|
|
94
36
|
}
|
|
95
|
-
return packagesByManager;
|
|
96
|
-
};
|
|
97
|
-
const selectBaseImage = (runtimePlans) => {
|
|
98
37
|
const firstRuntimeMeta = runtimePlans[0]?.meta;
|
|
99
38
|
if (runtimePlans.length <= 1) {
|
|
100
39
|
return firstRuntimeMeta?.standaloneBaseImage ?? "debian:bookworm-slim";
|
|
@@ -131,18 +70,22 @@ export const renderEnvExample = (variables) => {
|
|
|
131
70
|
return `${lines.join("\n").trimEnd()}\n`;
|
|
132
71
|
};
|
|
133
72
|
export const renderDockerfile = async (runtimePlans, options = {}) => {
|
|
73
|
+
if (options.hasMoltnet && !options.hasStagedMoltnetBinaries) {
|
|
74
|
+
throw new SpawnfileError("compile_error", "Moltnet must be supplied as a pinned, digest-verified, pi-bridge-stamped release; unpinned latest installation is disabled");
|
|
75
|
+
}
|
|
134
76
|
const runtimeNames = [...new Set(runtimePlans.map((plan) => plan.runtimeName))];
|
|
135
|
-
const runtimeRecipes = await Promise.all(runtimeNames.map((runtimeName) => createRuntimeInstallRecipe(runtimeName)));
|
|
136
|
-
const
|
|
137
|
-
const
|
|
77
|
+
const runtimeRecipes = await Promise.all(runtimeNames.map((runtimeName) => createRuntimeInstallRecipe(runtimeName, { packageOverrides: options.runtimePackageOverrides })));
|
|
78
|
+
const recipeByRuntimeName = new Map(runtimeRecipes.map((recipe) => [recipe.runtimeName, recipe]));
|
|
79
|
+
const baseImage = selectBaseImage(runtimePlans, runtimeRecipes);
|
|
80
|
+
const needsJsonEnvWriter = runtimePlans.some((plan) => (plan.configEnvBindings?.length ?? 0) > 0) || (options.moltnet?.nodePlans.length ?? 0) > 0
|
|
81
|
+
|| (options.moltnet?.serverPlans ?? []).some((plan) => plan.mode === "managed"
|
|
82
|
+
&& plan.configPath !== null
|
|
83
|
+
&& plan.secretPatches.length > 0);
|
|
138
84
|
const needsGit = runtimePlans.some((plan) => (plan.resources ?? []).some((resource) => resource.kind === "git"));
|
|
139
85
|
const systemDeps = [
|
|
140
86
|
...new Set([
|
|
141
|
-
...runtimePlans.flatMap((plan) => plan.meta.systemDeps),
|
|
87
|
+
...runtimePlans.flatMap((plan) => recipeByRuntimeName.get(plan.runtimeName)?.baseImage ? [] : plan.meta.systemDeps),
|
|
142
88
|
...(needsGit ? ["git"] : []),
|
|
143
|
-
...(options.hasMoltnet && !options.hasStagedMoltnetBinaries
|
|
144
|
-
? ["ca-certificates", "curl", "tar"]
|
|
145
|
-
: []),
|
|
146
89
|
...(needsJsonEnvWriter ? ["python3"] : [])
|
|
147
90
|
])
|
|
148
91
|
].sort();
|
|
@@ -181,9 +124,6 @@ export const renderDockerfile = async (runtimePlans, options = {}) => {
|
|
|
181
124
|
if (options.hasMoltnet && options.hasStagedMoltnetBinaries) {
|
|
182
125
|
lines.push(`COPY ${MOLTNET_BIN_DIRECTORY}/ /usr/local/bin/`, `RUN chmod +x ${MOLTNET_BINARY_NAMES.map((binaryName) => `/usr/local/bin/${binaryName}`).join(" ")}`, "");
|
|
183
126
|
}
|
|
184
|
-
else if (options.hasMoltnet) {
|
|
185
|
-
lines.push(`ADD ${MOLTNET_RELEASE_METADATA_URL} /tmp/spawnfile-moltnet-release.json`, `RUN MOLTNET_RELEASE="$${"("}sed -n 's/.*\\"tag_name\\": *\\"\\([^\\"]*\\)\\".*/\\1/p' /tmp/spawnfile-moltnet-release.json | head -n 1${")"}" && echo "Installing Moltnet $${"{MOLTNET_RELEASE:-latest}"}" && MOLTNET_INSTALL_DIR=/usr/local/bin sh -c ${shellQuote(`curl -fsSL ${MOLTNET_INSTALL_SCRIPT_URL} | sh`)}`, "");
|
|
186
|
-
}
|
|
187
127
|
for (const recipe of runtimeRecipes) {
|
|
188
128
|
for (const copyCommand of recipe.copyCommands) {
|
|
189
129
|
lines.push(copyCommand);
|
|
@@ -195,8 +135,19 @@ export const renderDockerfile = async (runtimePlans, options = {}) => {
|
|
|
195
135
|
}
|
|
196
136
|
lines.push('RUN if ! id -u spawnfile >/dev/null 2>&1; then useradd --create-home --home-dir /home/spawnfile --shell /bin/bash spawnfile; fi', "");
|
|
197
137
|
lines.push("COPY container/rootfs/ /", "COPY .env.example /opt/spawnfile/.env.example", 'COPY entrypoint.sh /opt/spawnfile/entrypoint.sh', "RUN chmod +x /opt/spawnfile/entrypoint.sh");
|
|
138
|
+
const postRootfsCommands = [
|
|
139
|
+
...new Set(runtimePlans.flatMap((plan) => plan.meta.postRootfsCommands ?? []))
|
|
140
|
+
];
|
|
141
|
+
for (const command of postRootfsCommands) {
|
|
142
|
+
lines.push(`RUN ${command}`);
|
|
143
|
+
}
|
|
198
144
|
if (options.distribution) {
|
|
199
|
-
lines.push("", `COPY ${options.distribution.reportOutputFile} ${DISTRIBUTION_REPORT_IMAGE_PATH}`, ...
|
|
145
|
+
lines.push("", `COPY ${options.distribution.reportOutputFile} ${DISTRIBUTION_REPORT_IMAGE_PATH}`, ...(options.distribution.worldBindingsOutputFile
|
|
146
|
+
? [
|
|
147
|
+
`COPY ${options.distribution.worldBindingsOutputFile} ${WORLD_BINDINGS_IMAGE_PATH}`,
|
|
148
|
+
`RUN chmod 600 ${WORLD_BINDINGS_IMAGE_PATH} && chown spawnfile:spawnfile ${WORLD_BINDINGS_IMAGE_PATH}`
|
|
149
|
+
]
|
|
150
|
+
: []), ...Object.entries(options.distribution.labels)
|
|
200
151
|
.sort(([left], [right]) => left.localeCompare(right))
|
|
201
152
|
.map(([name, value]) => `LABEL ${name}=${shellQuote(value)}`));
|
|
202
153
|
}
|
|
@@ -213,11 +164,19 @@ export const createRootfsFiles = (runtimePlans) => runtimePlans.flatMap((plan) =
|
|
|
213
164
|
return {
|
|
214
165
|
content: file.content
|
|
215
166
|
.replaceAll(WORKSPACE_PLACEHOLDER, plan.instancePaths.workspacePath)
|
|
167
|
+
.replaceAll(RUNTIME_ROOT_PLACEHOLDER, plan.runtimeRoot)
|
|
216
168
|
.replaceAll(`"${GATEWAY_PORT_PLACEHOLDER}"`, plan.port ? String(plan.port) : "0")
|
|
217
169
|
.replaceAll(GATEWAY_PORT_PLACEHOLDER, plan.port ? String(plan.port) : ""),
|
|
218
170
|
path: `${CONTAINER_ROOTFS_ROOT}${plan.instancePaths.configPath}`
|
|
219
171
|
};
|
|
220
172
|
}
|
|
173
|
+
if (file.path.startsWith("runtime/")) {
|
|
174
|
+
const relativeRuntimePath = file.path.slice("runtime/".length);
|
|
175
|
+
return {
|
|
176
|
+
content: file.content,
|
|
177
|
+
path: `${CONTAINER_ROOTFS_ROOT}${path.posix.join(plan.runtimeRoot, relativeRuntimePath)}`
|
|
178
|
+
};
|
|
179
|
+
}
|
|
221
180
|
if (file.path.startsWith("workspace/")) {
|
|
222
181
|
const relativeWorkspacePath = file.path.slice("workspace/".length);
|
|
223
182
|
return {
|
|
@@ -14,6 +14,9 @@ export interface ContainerEnvVariable {
|
|
|
14
14
|
}
|
|
15
15
|
export interface RuntimeTargetPlan {
|
|
16
16
|
configEnvBindings?: RuntimeContainerConfigEnvBinding[];
|
|
17
|
+
/** Passthrough of `ContainerTarget.engineByNodeId` (see `runtime/types.ts`), for
|
|
18
|
+
* `containerArtifacts.ts` to stamp onto `ContainerRuntimeInstanceReport.engine_by_node_id`. */
|
|
19
|
+
engineByNodeId?: Record<string, string>;
|
|
17
20
|
packages?: ResolvedPackage[];
|
|
18
21
|
envFiles: Array<{
|
|
19
22
|
envName: string;
|
|
@@ -31,12 +34,21 @@ export interface RuntimeTargetPlan {
|
|
|
31
34
|
modelSecretsRequired: string[];
|
|
32
35
|
port?: number;
|
|
33
36
|
publishedPort?: number;
|
|
37
|
+
/**
|
|
38
|
+
* Per-run container environment carried by this target's
|
|
39
|
+
* RuntimeInstallRecipe (see src/runtime/container.ts). Sourced only from
|
|
40
|
+
* the host/compile process environment (e.g. NOOPOLIS_RUN_ID), never
|
|
41
|
+
* model output. Rendered into the container RUN-time env surface
|
|
42
|
+
* (entrypoint exec env), never baked into the Dockerfile build layer.
|
|
43
|
+
*/
|
|
44
|
+
recipeEnv?: Record<string, string>;
|
|
34
45
|
resources?: WorkspaceResourcePlan[];
|
|
35
46
|
runtimeName: string;
|
|
36
47
|
runtimeRoot: string;
|
|
37
48
|
sourceIds?: string[];
|
|
38
49
|
targetConfigEnvBindings?: RuntimeContainerConfigEnvBinding[];
|
|
39
50
|
targetFiles: EmittedFile[];
|
|
51
|
+
worldTokenEnvNames?: string[];
|
|
40
52
|
}
|
|
41
53
|
export interface CompiledNodeArtifact {
|
|
42
54
|
emittedFiles: EmittedFile[];
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
const shellQuote = (value) => `'${value.replace(/'/g, `'\"'\"'`)}'`;
|
|
2
|
+
export const createConfigEnvWrites = (plan) => (plan.configEnvBindings ?? []).map((binding) => `apply_json_env_value ${shellQuote(plan.instancePaths.configPath)} ${shellQuote(binding.envName)} ${shellQuote(typeof binding.jsonPath === "string" ? binding.jsonPath : JSON.stringify(binding.jsonPath))}${binding.transform ? ` ${shellQuote(binding.transform)}` : ""}`);
|
|
3
|
+
export const createConfigEnvMaterializationFunction = () => [
|
|
4
|
+
"apply_json_env_value() {",
|
|
5
|
+
' local target="$1"',
|
|
6
|
+
' local name="$2"',
|
|
7
|
+
' local json_path="$3"',
|
|
8
|
+
' local transform="${4:-}"',
|
|
9
|
+
' if [ -z "${!name:-}" ]; then',
|
|
10
|
+
" return",
|
|
11
|
+
" fi",
|
|
12
|
+
' python3 - "$target" "$name" "$json_path" "$transform" <<\'PY\'',
|
|
13
|
+
"import json",
|
|
14
|
+
"import os",
|
|
15
|
+
"import sys",
|
|
16
|
+
"",
|
|
17
|
+
"target_path = sys.argv[1]",
|
|
18
|
+
"env_name = sys.argv[2]",
|
|
19
|
+
"json_path_arg = sys.argv[3]",
|
|
20
|
+
"json_path = json.loads(json_path_arg) if json_path_arg.startswith('[') else json_path_arg.split('.')",
|
|
21
|
+
"transform = sys.argv[4] if len(sys.argv) > 4 else ''",
|
|
22
|
+
"value = os.environ.get(env_name)",
|
|
23
|
+
"if value is None:",
|
|
24
|
+
" raise SystemExit(0)",
|
|
25
|
+
"if transform == 'bearer':",
|
|
26
|
+
" value = f'Bearer {value}'",
|
|
27
|
+
"elif transform:",
|
|
28
|
+
" raise SystemExit(f'Unsupported config env transform: {transform}')",
|
|
29
|
+
"",
|
|
30
|
+
"with open(target_path, encoding='utf-8') as handle:",
|
|
31
|
+
" data = json.load(handle)",
|
|
32
|
+
"",
|
|
33
|
+
"cursor = data",
|
|
34
|
+
"for part in json_path[:-1]:",
|
|
35
|
+
" if isinstance(cursor, list):",
|
|
36
|
+
" cursor = cursor[int(part)]",
|
|
37
|
+
" continue",
|
|
38
|
+
" child = cursor.get(part)",
|
|
39
|
+
" if not isinstance(child, (dict, list)):",
|
|
40
|
+
" child = {}",
|
|
41
|
+
" cursor[part] = child",
|
|
42
|
+
" cursor = child",
|
|
43
|
+
"",
|
|
44
|
+
"if isinstance(cursor, list):",
|
|
45
|
+
" cursor[int(json_path[-1])] = value",
|
|
46
|
+
"else:",
|
|
47
|
+
" cursor[json_path[-1]] = value",
|
|
48
|
+
"",
|
|
49
|
+
"with open(target_path, 'w', encoding='utf-8') as handle:",
|
|
50
|
+
" json.dump(data, handle, indent=2)",
|
|
51
|
+
" handle.write('\\n')",
|
|
52
|
+
"PY",
|
|
53
|
+
"}",
|
|
54
|
+
];
|
|
@@ -4,6 +4,7 @@ export interface EntrypointOptions {
|
|
|
4
4
|
hasMoltnet?: boolean;
|
|
5
5
|
hasStagedMoltnetBinaries?: boolean;
|
|
6
6
|
moltnet?: {
|
|
7
|
+
externalParticipantArtifacts?: NonNullable<MoltnetArtifacts["externalParticipantArtifacts"]>;
|
|
7
8
|
nodePlans: MoltnetArtifacts["nodePlans"];
|
|
8
9
|
serverPlans: MoltnetArtifacts["serverPlans"];
|
|
9
10
|
};
|
|
@@ -1,17 +1,31 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
import { resolveMoltnetStorePath } from "./moltnetConfigLowering.js";
|
|
2
|
+
import { createMoltnetCausalEventsPath, resolveMoltnetStorePath } from "./moltnetConfigLowering.js";
|
|
3
3
|
import { networkUrlEnvName } from "./networkBinding.js";
|
|
4
4
|
import { createWorkspaceResourceCommands, createWorkspaceResourceShellFunctions } from "./containerWorkspaceResourceRender.js";
|
|
5
|
+
import { createConfigEnvMaterializationFunction, createConfigEnvWrites } from "./containerConfigEnvRender.js";
|
|
6
|
+
import { CLI_CREDENTIAL_SECRET_NAME, modelAuthMethodNeedsCliCredential } from "./modelEnv.js";
|
|
7
|
+
import { createCliCredentialMaterialization, createRecipeEnvAssignments, mergeRecipeEnv, shellQuote } from "./containerEntrypointShell.js";
|
|
5
8
|
const MOLTNET_SERVER_DATA_DIRECTORY = "/var/lib/spawnfile/moltnet/servers";
|
|
6
|
-
|
|
9
|
+
// moltnet reads this path from MOLTNET_CAUSAL_EVENTS_PATH
|
|
10
|
+
// (internal/app/config_load.go's mergeEnvConfig) and, when set, stamps
|
|
11
|
+
// every message.accepted/message.denied causal event there via
|
|
12
|
+
// internal/observability/causal.go's CausalWriter (nil/no-op otherwise).
|
|
13
|
+
// Always set, independent of the network's own store.kind (a memory-store
|
|
14
|
+
// network — e.g. office-sim's fixture — still gets a causal log). Points
|
|
15
|
+
// into a dedicated `causal/` subdirectory of the server's data directory
|
|
16
|
+
// (see createMoltnetCausalDirectory/createMoltnetCausalEventsPath) that
|
|
17
|
+
// moltnetArtifacts.ts registers as its own persistent mount, so it survives
|
|
18
|
+
// container teardown/restart via a host-backed named docker volume instead
|
|
19
|
+
// of only being recoverable through a live-container `docker cp` (the
|
|
20
|
+
// previous e2e-capture-only precedent).
|
|
21
|
+
const moltnetCausalEventsPath = createMoltnetCausalEventsPath;
|
|
7
22
|
const createEnvironmentAssignments = (plan) => {
|
|
8
23
|
const envAssignments = [];
|
|
9
24
|
if (plan.instancePaths.homePath) {
|
|
10
25
|
envAssignments.push(`HOME=${shellQuote(plan.instancePaths.homePath)}`);
|
|
11
26
|
}
|
|
12
27
|
if (plan.instancePaths.homePath &&
|
|
13
|
-
plan.
|
|
14
|
-
plan.modelAuthMethods.openai === "codex") {
|
|
28
|
+
Object.values(plan.modelAuthMethods).some(modelAuthMethodNeedsCliCredential)) {
|
|
15
29
|
envAssignments.push(`CODEX_HOME=${shellQuote(path.posix.join(plan.instancePaths.homePath, ".codex"))}`);
|
|
16
30
|
}
|
|
17
31
|
if (plan.meta.homeEnv && plan.instancePaths.homePath) {
|
|
@@ -26,10 +40,10 @@ const createEnvironmentAssignments = (plan) => {
|
|
|
26
40
|
for (const [name, value] of Object.entries(plan.meta.staticEnv ?? {}).sort(([left], [right]) => left.localeCompare(right))) {
|
|
27
41
|
envAssignments.push(`${name}=${shellQuote(value)}`);
|
|
28
42
|
}
|
|
43
|
+
envAssignments.push(...createRecipeEnvAssignments(plan.recipeEnv));
|
|
29
44
|
return envAssignments;
|
|
30
45
|
};
|
|
31
46
|
const createEnvFileWrites = (plan) => plan.envFiles.map((binding) => `write_env_file ${shellQuote(binding.envName)} ${shellQuote(binding.filePath)}`);
|
|
32
|
-
const createConfigEnvWrites = (plan) => (plan.configEnvBindings ?? []).map((binding) => `apply_json_env_value ${shellQuote(plan.instancePaths.configPath)} ${shellQuote(binding.envName)} ${shellQuote(binding.jsonPath)}`);
|
|
33
47
|
const createMoltnetStorePrepareCommands = (serverPlan) => {
|
|
34
48
|
const server = serverPlan.server;
|
|
35
49
|
if (server.mode !== "managed" || server.store.kind === "memory" || server.store.kind === "postgres") {
|
|
@@ -43,11 +57,14 @@ const createMoltnetStorePrepareCommands = (serverPlan) => {
|
|
|
43
57
|
};
|
|
44
58
|
const resolveStartCommand = (plan) => plan.meta.startCommand
|
|
45
59
|
.map((token) => token
|
|
60
|
+
.replaceAll("<config-path>", plan.instancePaths.configPath)
|
|
61
|
+
.replaceAll("<home-path>", plan.instancePaths.homePath ?? "")
|
|
46
62
|
.replaceAll("<runtime-root>", plan.runtimeRoot)
|
|
63
|
+
.replaceAll("<workspace-path>", plan.instancePaths.workspacePath)
|
|
47
64
|
.replaceAll("<port>", plan.port ? String(plan.port) : ""))
|
|
48
65
|
.filter((token) => token.length > 0);
|
|
49
66
|
const createRuntimeReadinessWait = (plan) => {
|
|
50
|
-
if (plan.runtimeName
|
|
67
|
+
if (!["openclaw", "pi"].includes(plan.runtimeName) || !plan.port) {
|
|
51
68
|
return [];
|
|
52
69
|
}
|
|
53
70
|
return [
|
|
@@ -64,6 +81,13 @@ const createRuntimeReadinessWait = (plan) => {
|
|
|
64
81
|
];
|
|
65
82
|
};
|
|
66
83
|
export const renderEntrypoint = (runtimePlans, requiredSecrets, options = {}) => {
|
|
84
|
+
const cliCredentialMaterialization = createCliCredentialMaterialization(runtimePlans);
|
|
85
|
+
const renderedRequiredSecrets = [
|
|
86
|
+
...new Set([
|
|
87
|
+
...requiredSecrets,
|
|
88
|
+
...(cliCredentialMaterialization.length > 0 ? [CLI_CREDENTIAL_SECRET_NAME] : [])
|
|
89
|
+
])
|
|
90
|
+
];
|
|
67
91
|
const lines = [
|
|
68
92
|
"#!/usr/bin/env bash",
|
|
69
93
|
"set -euo pipefail",
|
|
@@ -94,61 +118,21 @@ export const renderEntrypoint = (runtimePlans, requiredSecrets, options = {}) =>
|
|
|
94
118
|
' printf %s \"${!name:-}\" > \"$target\"',
|
|
95
119
|
"}",
|
|
96
120
|
"",
|
|
97
|
-
|
|
98
|
-
' local target=\"$1\"',
|
|
99
|
-
' local name=\"$2\"',
|
|
100
|
-
' local json_path=\"$3\"',
|
|
101
|
-
' if [ -z \"${!name:-}\" ]; then',
|
|
102
|
-
" return",
|
|
103
|
-
" fi",
|
|
104
|
-
" python3 - \"$target\" \"$name\" \"$json_path\" <<'PY'",
|
|
105
|
-
"import json",
|
|
106
|
-
"import os",
|
|
107
|
-
"import sys",
|
|
108
|
-
"",
|
|
109
|
-
"target_path = sys.argv[1]",
|
|
110
|
-
"env_name = sys.argv[2]",
|
|
111
|
-
"json_path = sys.argv[3].split('.')",
|
|
112
|
-
"value = os.environ.get(env_name)",
|
|
113
|
-
"if value is None:",
|
|
114
|
-
" raise SystemExit(0)",
|
|
115
|
-
"",
|
|
116
|
-
"with open(target_path, encoding='utf-8') as handle:",
|
|
117
|
-
" data = json.load(handle)",
|
|
118
|
-
"",
|
|
119
|
-
"cursor = data",
|
|
120
|
-
"for part in json_path[:-1]:",
|
|
121
|
-
" if isinstance(cursor, list):",
|
|
122
|
-
" cursor = cursor[int(part)]",
|
|
123
|
-
" continue",
|
|
124
|
-
" child = cursor.get(part)",
|
|
125
|
-
" if not isinstance(child, (dict, list)):",
|
|
126
|
-
" child = {}",
|
|
127
|
-
" cursor[part] = child",
|
|
128
|
-
" cursor = child",
|
|
129
|
-
"",
|
|
130
|
-
"if isinstance(cursor, list):",
|
|
131
|
-
" cursor[int(json_path[-1])] = value",
|
|
132
|
-
"else:",
|
|
133
|
-
" cursor[json_path[-1]] = value",
|
|
134
|
-
"",
|
|
135
|
-
"with open(target_path, 'w', encoding='utf-8') as handle:",
|
|
136
|
-
" json.dump(data, handle, indent=2)",
|
|
137
|
-
" handle.write('\\n')",
|
|
138
|
-
"PY",
|
|
139
|
-
"}",
|
|
121
|
+
...createConfigEnvMaterializationFunction(),
|
|
140
122
|
"",
|
|
141
123
|
...createWorkspaceResourceShellFunctions()
|
|
142
124
|
];
|
|
143
125
|
lines.push('if [ -n "${OPENCLAW_GATEWAY_TOKEN:-}" ] && [ -z "${OPENCLAW_HOOKS_TOKEN:-}" ]; then', ' export OPENCLAW_HOOKS_TOKEN="hooks-${OPENCLAW_GATEWAY_TOKEN}"', "fi", "");
|
|
144
|
-
for (const secretName of
|
|
126
|
+
for (const secretName of renderedRequiredSecrets) {
|
|
145
127
|
lines.push(`require_env ${shellQuote(secretName)}`);
|
|
146
128
|
}
|
|
147
|
-
if (
|
|
129
|
+
if (renderedRequiredSecrets.length > 0) {
|
|
148
130
|
lines.push("");
|
|
149
131
|
}
|
|
132
|
+
lines.push(...cliCredentialMaterialization);
|
|
150
133
|
const moltnetServerPlans = options.moltnet?.serverPlans ?? [];
|
|
151
134
|
const moltnetNodePlans = options.moltnet?.nodePlans ?? [];
|
|
135
|
+
const moltnetExternalParticipants = options.moltnet?.externalParticipantArtifacts ?? [];
|
|
152
136
|
if (runtimePlans.length === 1 &&
|
|
153
137
|
moltnetServerPlans.length === 0 &&
|
|
154
138
|
moltnetNodePlans.length === 0) {
|
|
@@ -159,6 +143,8 @@ export const renderEntrypoint = (runtimePlans, requiredSecrets, options = {}) =>
|
|
|
159
143
|
return `${lines.join("\n").trimEnd()}\n`;
|
|
160
144
|
}
|
|
161
145
|
lines.push("PIDS=()", "", "terminate_children() {", ' for pid in "${PIDS[@]:-}"; do', ' kill "$pid" 2>/dev/null || true', " done", "}", "", "trap terminate_children INT TERM EXIT", "");
|
|
146
|
+
const recipeEnvAssignments = createRecipeEnvAssignments(mergeRecipeEnv(runtimePlans));
|
|
147
|
+
const recipeEnvPrefix = recipeEnvAssignments.length > 0 ? `${recipeEnvAssignments.join(" ")} ` : "";
|
|
162
148
|
const managedMoltnetServerPlans = moltnetServerPlans.filter((serverPlan) => serverPlan.mode === "managed");
|
|
163
149
|
if (managedMoltnetServerPlans.length > 0) {
|
|
164
150
|
lines.push(`mkdir -p ${shellQuote(MOLTNET_SERVER_DATA_DIRECTORY)}`, "");
|
|
@@ -172,10 +158,31 @@ export const renderEntrypoint = (runtimePlans, requiredSecrets, options = {}) =>
|
|
|
172
158
|
for (const patch of serverPlan.secretPatches) {
|
|
173
159
|
serverLines.push(`apply_json_env_value ${shellQuote(serverPlan.configPath)} ${shellQuote(patch.envName)} ${shellQuote(patch.jsonPath)}`);
|
|
174
160
|
}
|
|
175
|
-
|
|
161
|
+
const causalEventsPath = moltnetCausalEventsPath(serverPlan.configPath);
|
|
162
|
+
serverLines.push(...createMoltnetStorePrepareCommands(serverPlan), `MOLTNET_CONFIG=${shellQuote(serverPlan.configPath)} MOLTNET_CAUSAL_EVENTS_PATH=${shellQuote(causalEventsPath)} ${recipeEnvPrefix}/usr/local/bin/moltnet &`, 'PIDS+=("$!")');
|
|
176
163
|
if (serverPlan.port) {
|
|
177
164
|
serverLines.push(`until curl -sf ${shellQuote(`http://127.0.0.1:${serverPlan.port}/healthz`)} >/dev/null; do sleep 1; done`);
|
|
178
165
|
}
|
|
166
|
+
const externalParticipants = moltnetExternalParticipants.filter((artifact) => artifact.network.id === serverPlan.networkId);
|
|
167
|
+
if (externalParticipants.length > 0) {
|
|
168
|
+
const clientTokenId = serverPlan.server.auth.client?.token_id;
|
|
169
|
+
const clientToken = serverPlan.server.auth.tokens?.find((token) => token.id === clientTokenId);
|
|
170
|
+
if (!serverPlan.port || !clientToken?.secret) {
|
|
171
|
+
throw new Error(`Managed Moltnet external participant topology for ${serverPlan.networkId} requires an operator token and port`);
|
|
172
|
+
}
|
|
173
|
+
for (const artifact of externalParticipants) {
|
|
174
|
+
for (const directMessage of artifact.direct_messages) {
|
|
175
|
+
serverLines.push([
|
|
176
|
+
"/usr/local/bin/moltnet admin dm ensure",
|
|
177
|
+
`--sender ${shellQuote(artifact.participant.member_id)}`,
|
|
178
|
+
...directMessage.members.map((member) => `--member ${shellQuote(member)}`),
|
|
179
|
+
`--base-url ${shellQuote(`http://127.0.0.1:${serverPlan.port}`)}`,
|
|
180
|
+
`--token-env ${shellQuote(clientToken.secret)}`,
|
|
181
|
+
">/dev/null"
|
|
182
|
+
].join(" "));
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
179
186
|
// Suppress the in-image managed server when an external endpoint is bound.
|
|
180
187
|
lines.push(`if [ -z "\${${urlEnv}:-}" ]; then`, ...serverLines.map((line) => ` ${line}`), "fi", "");
|
|
181
188
|
}
|
|
@@ -188,7 +195,7 @@ export const renderEntrypoint = (runtimePlans, requiredSecrets, options = {}) =>
|
|
|
188
195
|
const urlEnv = networkUrlEnvName(nodePlan.networkId);
|
|
189
196
|
lines.push(
|
|
190
197
|
// Rebind the bridge endpoint when an external network URL is provided.
|
|
191
|
-
`if [ -n "\${${urlEnv}:-}" ]; then`, ` apply_json_env_value ${shellQuote(nodePlan.configPath)} ${shellQuote(urlEnv)} ${shellQuote("moltnet.base_url")}`, "fi",
|
|
198
|
+
`if [ -n "\${${urlEnv}:-}" ]; then`, ` apply_json_env_value ${shellQuote(nodePlan.configPath)} ${shellQuote(urlEnv)} ${shellQuote("moltnet.base_url")}`, "fi", `${recipeEnvPrefix}/usr/local/bin/moltnet node ${shellQuote(nodePlan.configPath)} &`, 'PIDS+=("$!")', "");
|
|
192
199
|
}
|
|
193
200
|
lines.push('if [ "${#PIDS[@]}" -eq 0 ]; then', ' echo "No runtime targets were generated for this compile output" >&2', " exit 1", "fi", "", "status=0", 'for pid in "${PIDS[@]}"; do', ' if ! wait "$pid"; then', " status=1", " fi", "done", "", 'exit "$status"');
|
|
194
201
|
return `${lines.join("\n").trimEnd()}\n`;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { RuntimeTargetPlan } from "./containerArtifactsTypes.js";
|
|
2
|
+
export declare const shellQuote: (value: string) => string;
|
|
3
|
+
export declare const createRecipeEnvAssignments: (recipeEnv: Record<string, string> | undefined) => string[];
|
|
4
|
+
export declare const mergeRecipeEnv: (runtimePlans: RuntimeTargetPlan[]) => Record<string, string>;
|
|
5
|
+
export declare const createCliCredentialMaterialization: (runtimePlans: RuntimeTargetPlan[]) => string[];
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { CLI_CREDENTIAL_SECRET_NAME, modelAuthMethodNeedsCliCredential } from "./modelEnv.js";
|
|
3
|
+
export const shellQuote = (value) => `'${value.replace(/'/g, `'"'"'`)}'`;
|
|
4
|
+
export const createRecipeEnvAssignments = (recipeEnv) => Object.entries(recipeEnv ?? {})
|
|
5
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
6
|
+
.map(([name, value]) => `${name}=${shellQuote(value)}`);
|
|
7
|
+
export const mergeRecipeEnv = (runtimePlans) => runtimePlans.reduce((merged, plan) => ({ ...merged, ...(plan.recipeEnv ?? {}) }), {});
|
|
8
|
+
export const createCliCredentialMaterialization = (runtimePlans) => {
|
|
9
|
+
const homePaths = [...new Set(runtimePlans
|
|
10
|
+
.filter((plan) => plan.instancePaths.homePath &&
|
|
11
|
+
Object.values(plan.modelAuthMethods).some(modelAuthMethodNeedsCliCredential))
|
|
12
|
+
.map((plan) => path.posix.join(plan.instancePaths.homePath, ".codex")))];
|
|
13
|
+
if (homePaths.length === 0)
|
|
14
|
+
return [];
|
|
15
|
+
return [
|
|
16
|
+
"# SPAWNFILE_CLI_AUTH_JSON persists in Config.Env for the container's lifetime.",
|
|
17
|
+
"# unset removes it from runtime processes' environments but cannot remove it from the container definition.",
|
|
18
|
+
"# Anyone with docker access on the host can read it, and every docker exec inherits it.",
|
|
19
|
+
"# This is accepted because the target host is single-user and the container is destroyed each run;",
|
|
20
|
+
"# a non-env delivery route is the fix if this ever runs anywhere shared.",
|
|
21
|
+
...homePaths.flatMap((homePath) => [
|
|
22
|
+
`mkdir -m 700 -p ${shellQuote(homePath)}`,
|
|
23
|
+
`printf %s "\${${CLI_CREDENTIAL_SECRET_NAME}}" > ${shellQuote(path.posix.join(homePath, "auth.json"))}`,
|
|
24
|
+
`chmod 600 ${shellQuote(path.posix.join(homePath, "auth.json"))}`
|
|
25
|
+
]),
|
|
26
|
+
`unset ${CLI_CREDENTIAL_SECRET_NAME}`,
|
|
27
|
+
""
|
|
28
|
+
];
|
|
29
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { RuntimeContainerPackageOverrides } from "../runtime/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Compile-time-only request map: runtime install npm package name (e.g.
|
|
4
|
+
* "@noopolis/daimon") to the absolute local package directory that should
|
|
5
|
+
* be packed and installed into the generated container instead of the
|
|
6
|
+
* pinned registry version. Only opt-in local/E2E compiles set this (see
|
|
7
|
+
* src/e2e/AGENTS.md); a standard compile passes no overrides and the
|
|
8
|
+
* generated Dockerfile install line is byte-identical to before this
|
|
9
|
+
* mechanism existed.
|
|
10
|
+
*/
|
|
11
|
+
export type RuntimePackageOverrideRequest = Record<string, string>;
|
|
12
|
+
/**
|
|
13
|
+
* Packs each overridden runtime install package's local directory into the
|
|
14
|
+
* generated container's build context (`<outputDirectory>/container/vendor`)
|
|
15
|
+
* via `npm pack`, so `renderDockerfile` (containerArtifactsRender.ts) can
|
|
16
|
+
* COPY the tarball into the image and `createRuntimeInstallRecipe`
|
|
17
|
+
* (src/runtime/container.ts) can install from it instead of the registry.
|
|
18
|
+
* Mirrors how `stageMoltnetBinaries` (moltnetBinaries.ts) stages binaries
|
|
19
|
+
* directly onto disk outside the EmittedFile pipeline — a `.tgz` cannot
|
|
20
|
+
* round-trip through EmittedFile's string `content`.
|
|
21
|
+
*
|
|
22
|
+
* The caller is responsible for ensuring each override's `dist` is already
|
|
23
|
+
* built (see `assertRuntimePackageOverrideDistsBuilt` in
|
|
24
|
+
* src/e2e/runtimePackageOverrides.ts) — this function only packs, it never
|
|
25
|
+
* builds.
|
|
26
|
+
*/
|
|
27
|
+
export declare const stageRuntimePackageOverrides: (outputDirectory: string, overrides: RuntimePackageOverrideRequest | undefined) => Promise<RuntimeContainerPackageOverrides | undefined>;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { execFile as execFileCallback } from "node:child_process";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { promisify } from "node:util";
|
|
4
|
+
import { ensureDirectory } from "../filesystem/index.js";
|
|
5
|
+
import { VENDOR_BUILD_CONTEXT_DIR } from "../runtime/index.js";
|
|
6
|
+
import { SpawnfileError } from "../shared/index.js";
|
|
7
|
+
const execFile = promisify(execFileCallback);
|
|
8
|
+
const packOverride = async (packageName, packageDirectory, vendorDirectory) => {
|
|
9
|
+
try {
|
|
10
|
+
const { stdout } = await execFile("npm", [
|
|
11
|
+
"pack",
|
|
12
|
+
"--json",
|
|
13
|
+
// Every caller (assertRuntimePackageOverrideDistsBuilt in
|
|
14
|
+
// src/e2e/runtimePackageOverrides.ts) already asserts the
|
|
15
|
+
// override directory's dist is built before packing, so a `prepack`
|
|
16
|
+
// lifecycle script here would only redundantly rebuild it — and, since
|
|
17
|
+
// several packages' own `prepack` runs `rm -rf dist && tsc`, doing so
|
|
18
|
+
// is actively unsafe when two compiles pack the same shared source
|
|
19
|
+
// directory concurrently (one's `rm -rf` can race another's dist read).
|
|
20
|
+
"--ignore-scripts",
|
|
21
|
+
"--pack-destination",
|
|
22
|
+
vendorDirectory,
|
|
23
|
+
packageDirectory
|
|
24
|
+
]);
|
|
25
|
+
const entries = JSON.parse(stdout);
|
|
26
|
+
const filename = entries[0]?.filename;
|
|
27
|
+
if (!filename) {
|
|
28
|
+
throw new Error("npm pack did not report a packed filename");
|
|
29
|
+
}
|
|
30
|
+
return { filename };
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
34
|
+
throw new SpawnfileError("compile_error", `Unable to pack local override for ${packageName} from ${packageDirectory}: ${reason}`);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Packs each overridden runtime install package's local directory into the
|
|
39
|
+
* generated container's build context (`<outputDirectory>/container/vendor`)
|
|
40
|
+
* via `npm pack`, so `renderDockerfile` (containerArtifactsRender.ts) can
|
|
41
|
+
* COPY the tarball into the image and `createRuntimeInstallRecipe`
|
|
42
|
+
* (src/runtime/container.ts) can install from it instead of the registry.
|
|
43
|
+
* Mirrors how `stageMoltnetBinaries` (moltnetBinaries.ts) stages binaries
|
|
44
|
+
* directly onto disk outside the EmittedFile pipeline — a `.tgz` cannot
|
|
45
|
+
* round-trip through EmittedFile's string `content`.
|
|
46
|
+
*
|
|
47
|
+
* The caller is responsible for ensuring each override's `dist` is already
|
|
48
|
+
* built (see `assertRuntimePackageOverrideDistsBuilt` in
|
|
49
|
+
* src/e2e/runtimePackageOverrides.ts) — this function only packs, it never
|
|
50
|
+
* builds.
|
|
51
|
+
*/
|
|
52
|
+
export const stageRuntimePackageOverrides = async (outputDirectory, overrides) => {
|
|
53
|
+
if (!overrides || Object.keys(overrides).length === 0) {
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
const vendorDirectory = path.join(outputDirectory, VENDOR_BUILD_CONTEXT_DIR);
|
|
57
|
+
await ensureDirectory(vendorDirectory);
|
|
58
|
+
const resolved = {};
|
|
59
|
+
for (const [packageName, packageDirectory] of Object.entries(overrides)) {
|
|
60
|
+
resolved[packageName] = await packOverride(packageName, packageDirectory, vendorDirectory);
|
|
61
|
+
}
|
|
62
|
+
return resolved;
|
|
63
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { RuntimeTargetPlan } from "./containerArtifactsTypes.js";
|
|
2
|
+
import type { ResolvedPackage } from "./types.js";
|
|
3
|
+
export interface PackagesByManager {
|
|
4
|
+
apt: ResolvedPackage[];
|
|
5
|
+
npm: ResolvedPackage[];
|
|
6
|
+
pipx: ResolvedPackage[];
|
|
7
|
+
}
|
|
8
|
+
export declare const createPackageInstallCommand: (packages: string[]) => string;
|
|
9
|
+
export declare const createNpmPackageInstallCommand: (packages: string[]) => string;
|
|
10
|
+
export declare const createPipxPackageInstallCommand: (packages: string[]) => string;
|
|
11
|
+
export declare const createAptPackageInstallItem: (pkg: ResolvedPackage) => string;
|
|
12
|
+
export declare const createNpmPackageInstallItem: (pkg: ResolvedPackage) => string;
|
|
13
|
+
export declare const createPipxPackageInstallItem: (pkg: ResolvedPackage) => string;
|
|
14
|
+
export declare const getNpmInstallItemName: (item: string) => string;
|
|
15
|
+
export declare const collectPackagesByManager: (runtimePlans: RuntimeTargetPlan[]) => PackagesByManager;
|