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
|
@@ -1,69 +1,10 @@
|
|
|
1
|
-
import path from "node:path";
|
|
2
1
|
import { createRuntimeInstallRecipe, getRuntimeAdapter } from "../runtime/index.js";
|
|
3
|
-
import { SpawnfileError } from "../shared/index.js";
|
|
4
2
|
import { listAgentSurfaceSecretNames } from "./agentSurfaces.js";
|
|
5
|
-
import { listExecutionModelSecretNames, resolveExecutionModelAuthMethods } from "./modelEnv.js";
|
|
6
3
|
import { resolveTargetResources } from "./containerTargetResources.js";
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
id: `${input.kind}-${input.slug}`,
|
|
12
|
-
sourceIds: [input.id]
|
|
13
|
-
}));
|
|
14
|
-
const resolveTargetEnvFiles = (configPath, target) => (target.envFiles ?? []).map((binding) => ({
|
|
15
|
-
envName: binding.envName,
|
|
16
|
-
filePath: path.posix.join(path.posix.dirname(configPath), binding.relativePath)
|
|
17
|
-
}));
|
|
18
|
-
const resolveTargetConfigEnvBindings = (meta, target) => [...(meta.configEnvBindings ?? []), ...(target.configEnvBindings ?? [])];
|
|
19
|
-
const assertTargetHasConfig = (runtimeName, targetId, meta, files) => {
|
|
20
|
-
if (!files.some((file) => file.path === meta.configFileName)) {
|
|
21
|
-
throw new SpawnfileError("runtime_error", `Container target ${targetId} for ${runtimeName} is missing ${meta.configFileName}`);
|
|
22
|
-
}
|
|
23
|
-
};
|
|
24
|
-
const createPackageIdentity = (pkg) => `${pkg.manager}\u0000${pkg.name}\u0000${pkg.version ?? ""}\u0000${pkg.scope ?? ""}`;
|
|
25
|
-
const createPackageConflictIdentity = (pkg) => `${pkg.manager}\u0000${pkg.name}`;
|
|
26
|
-
const createPackageLabel = (pkg) => `${pkg.manager} package ${pkg.name}`;
|
|
27
|
-
const resolveTargetPackages = (target, inputs) => {
|
|
28
|
-
const sourceIds = new Set(target.sourceIds ?? []);
|
|
29
|
-
if (sourceIds.size === 0) {
|
|
30
|
-
return [];
|
|
31
|
-
}
|
|
32
|
-
const byIdentity = new Map();
|
|
33
|
-
for (const input of inputs) {
|
|
34
|
-
if (!sourceIds.has(input.id) || input.value.kind !== "agent") {
|
|
35
|
-
continue;
|
|
36
|
-
}
|
|
37
|
-
const candidatePackages = input.value.packages ?? [];
|
|
38
|
-
for (const currentPackage of candidatePackages) {
|
|
39
|
-
const conflictIdentity = createPackageConflictIdentity(currentPackage);
|
|
40
|
-
const existingPackage = byIdentity.get(conflictIdentity);
|
|
41
|
-
if (!existingPackage) {
|
|
42
|
-
byIdentity.set(conflictIdentity, currentPackage);
|
|
43
|
-
continue;
|
|
44
|
-
}
|
|
45
|
-
if (createPackageIdentity(existingPackage) !== createPackageIdentity(currentPackage)) {
|
|
46
|
-
throw new SpawnfileError("validation_error", `Container target ${target.id} declares conflicting package definitions for ${createPackageLabel(currentPackage)}`);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
return [...byIdentity.values()].sort((left, right) => createPackageIdentity(left).localeCompare(createPackageIdentity(right)));
|
|
51
|
-
};
|
|
52
|
-
const replaceContainerPathTemplate = (template, instanceRoot, configFileName) => template
|
|
53
|
-
.replaceAll(INSTANCE_ROOT_PLACEHOLDER, instanceRoot)
|
|
54
|
-
.replaceAll(CONFIG_FILE_PLACEHOLDER, configFileName);
|
|
55
|
-
const resolveInstancePaths = (runtimeName, targetId, meta) => {
|
|
56
|
-
const instanceRoot = `/var/lib/spawnfile/instances/${runtimeName}/${targetId}`;
|
|
57
|
-
return {
|
|
58
|
-
configPath: replaceContainerPathTemplate(meta.instancePaths.configPathTemplate, instanceRoot, meta.configFileName),
|
|
59
|
-
homePath: meta.instancePaths.homePathTemplate
|
|
60
|
-
? replaceContainerPathTemplate(meta.instancePaths.homePathTemplate, instanceRoot, meta.configFileName)
|
|
61
|
-
: undefined,
|
|
62
|
-
instanceRoot,
|
|
63
|
-
workspacePath: replaceContainerPathTemplate(meta.instancePaths.workspacePathTemplate, instanceRoot, meta.configFileName)
|
|
64
|
-
};
|
|
65
|
-
};
|
|
66
|
-
export const createEnvVariableMap = (compiledNodes, runtimePlans) => {
|
|
4
|
+
import { assertTargetHasConfig, createDefaultTargets, resolveInstancePaths, resolveTargetConfigEnvBindings, resolveTargetEnvFiles, resolveTargetExposure, resolveTargetModelAuthMethods, resolveTargetModelSecrets, resolveTargetPackages } from "./containerTargetPlanResolution.js";
|
|
5
|
+
import { listExecutionModelSecretNames } from "./modelEnv.js";
|
|
6
|
+
import { findWorldBindingForNode } from "./worldBindings.js";
|
|
7
|
+
export const createEnvVariableMap = (compiledNodes, runtimePlans, moltnet) => {
|
|
67
8
|
const variables = new Map();
|
|
68
9
|
const register = (name, required, description, category, generated = false) => {
|
|
69
10
|
const current = variables.get(name);
|
|
@@ -89,9 +30,8 @@ export const createEnvVariableMap = (compiledNodes, runtimePlans) => {
|
|
|
89
30
|
};
|
|
90
31
|
for (const node of compiledNodes) {
|
|
91
32
|
if (node.value.kind === "agent") {
|
|
92
|
-
for (const secret of node.value.secrets)
|
|
33
|
+
for (const secret of node.value.secrets)
|
|
93
34
|
registerSecret(secret);
|
|
94
|
-
}
|
|
95
35
|
for (const secretName of listExecutionModelSecretNames(node.value.execution)) {
|
|
96
36
|
register(secretName, true, `Model provider auth for ${secretName}`, "model");
|
|
97
37
|
}
|
|
@@ -100,9 +40,8 @@ export const createEnvVariableMap = (compiledNodes, runtimePlans) => {
|
|
|
100
40
|
}
|
|
101
41
|
continue;
|
|
102
42
|
}
|
|
103
|
-
for (const secret of node.value.shared.secrets)
|
|
43
|
+
for (const secret of node.value.shared.secrets)
|
|
104
44
|
registerSecret(secret);
|
|
105
|
-
}
|
|
106
45
|
}
|
|
107
46
|
for (const runtimePlan of runtimePlans) {
|
|
108
47
|
for (const variable of runtimePlan.meta.env ?? []) {
|
|
@@ -112,52 +51,14 @@ export const createEnvVariableMap = (compiledNodes, runtimePlans) => {
|
|
|
112
51
|
register(binding.envName, true, `Injected into ${runtimePlan.runtimeName} runtime config`, "runtime", binding.generated ?? false);
|
|
113
52
|
}
|
|
114
53
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
const sourceIds = new Set(target.sourceIds ?? []);
|
|
119
|
-
if (sourceIds.size === 0) {
|
|
120
|
-
return [];
|
|
121
|
-
}
|
|
122
|
-
const secretNames = new Set();
|
|
123
|
-
for (const input of inputs) {
|
|
124
|
-
if (!sourceIds.has(input.id) || input.value.kind !== "agent") {
|
|
125
|
-
continue;
|
|
126
|
-
}
|
|
127
|
-
for (const secretName of listExecutionModelSecretNames(input.value.execution)) {
|
|
128
|
-
secretNames.add(secretName);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
return [...secretNames].sort();
|
|
132
|
-
};
|
|
133
|
-
const resolveTargetModelAuthMethods = (target, inputs) => {
|
|
134
|
-
const sourceIds = new Set(target.sourceIds ?? []);
|
|
135
|
-
if (sourceIds.size === 0) {
|
|
136
|
-
return {};
|
|
137
|
-
}
|
|
138
|
-
const methods = new Map();
|
|
139
|
-
for (const input of inputs) {
|
|
140
|
-
if (!sourceIds.has(input.id) || input.value.kind !== "agent") {
|
|
141
|
-
continue;
|
|
142
|
-
}
|
|
143
|
-
for (const [provider, method] of Object.entries(resolveExecutionModelAuthMethods(input.value.execution))) {
|
|
144
|
-
const existingMethod = methods.get(provider);
|
|
145
|
-
if (existingMethod && existingMethod !== method) {
|
|
146
|
-
throw new SpawnfileError("validation_error", `Container target ${target.id} declares conflicting auth methods for provider ${provider}`);
|
|
147
|
-
}
|
|
148
|
-
methods.set(provider, method);
|
|
54
|
+
for (const serverPlan of moltnet?.serverPlans ?? []) {
|
|
55
|
+
for (const patch of serverPlan.secretPatches) {
|
|
56
|
+
register(patch.envName, true, `Managed Moltnet secret for ${serverPlan.networkId}`, "surface");
|
|
149
57
|
}
|
|
150
58
|
}
|
|
151
|
-
return
|
|
152
|
-
};
|
|
153
|
-
const resolveTargetExposure = (target, inputs) => {
|
|
154
|
-
const sourceIds = new Set(target.sourceIds ?? []);
|
|
155
|
-
if (sourceIds.size === 0) {
|
|
156
|
-
return false;
|
|
157
|
-
}
|
|
158
|
-
return inputs.some((input) => sourceIds.has(input.id) && input.value.kind === "agent" && input.value.expose === true);
|
|
59
|
+
return variables;
|
|
159
60
|
};
|
|
160
|
-
export const createRuntimeTargetPlans = async (plan, compiledNodes) => {
|
|
61
|
+
export const createRuntimeTargetPlans = async (plan, compiledNodes, worldBindings) => {
|
|
161
62
|
const runtimeNames = Object.keys(plan.runtimes).sort();
|
|
162
63
|
const runtimePlans = [];
|
|
163
64
|
for (const runtimeName of runtimeNames) {
|
|
@@ -165,13 +66,20 @@ export const createRuntimeTargetPlans = async (plan, compiledNodes) => {
|
|
|
165
66
|
const recipe = await createRuntimeInstallRecipe(runtimeName);
|
|
166
67
|
const targetInputs = compiledNodes
|
|
167
68
|
.filter((node) => node.runtimeName === runtimeName && node.emittedFiles.length > 0)
|
|
168
|
-
.map((node) =>
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
69
|
+
.map((node) => {
|
|
70
|
+
const id = node.id ?? `${node.kind}:${node.slug}`;
|
|
71
|
+
const worldBinding = node.kind === "agent"
|
|
72
|
+
? findWorldBindingForNode(worldBindings, id)
|
|
73
|
+
: undefined;
|
|
74
|
+
return {
|
|
75
|
+
emittedFiles: node.emittedFiles,
|
|
76
|
+
id,
|
|
77
|
+
kind: node.kind,
|
|
78
|
+
slug: node.slug,
|
|
79
|
+
value: node.value,
|
|
80
|
+
...(worldBinding ? { worldBinding } : {})
|
|
81
|
+
};
|
|
82
|
+
});
|
|
175
83
|
const targets = (await adapter.createContainerTargets?.(targetInputs)) ??
|
|
176
84
|
createDefaultTargets(targetInputs);
|
|
177
85
|
targets.forEach((target, index) => {
|
|
@@ -180,6 +88,7 @@ export const createRuntimeTargetPlans = async (plan, compiledNodes) => {
|
|
|
180
88
|
const portStride = adapter.container.portStride ?? 1;
|
|
181
89
|
runtimePlans.push({
|
|
182
90
|
configEnvBindings: resolveTargetConfigEnvBindings(adapter.container, target) ?? [],
|
|
91
|
+
...(target.engineByNodeId ? { engineByNodeId: target.engineByNodeId } : {}),
|
|
183
92
|
envFiles: resolveTargetEnvFiles(instancePaths.configPath, target),
|
|
184
93
|
packages: resolveTargetPackages(target, targetInputs),
|
|
185
94
|
id: target.id,
|
|
@@ -191,12 +100,16 @@ export const createRuntimeTargetPlans = async (plan, compiledNodes) => {
|
|
|
191
100
|
publishedPort: resolveTargetExposure(target, targetInputs) && adapter.container.port
|
|
192
101
|
? adapter.container.port + (index * portStride)
|
|
193
102
|
: undefined,
|
|
103
|
+
recipeEnv: recipe.env,
|
|
194
104
|
resources: resolveTargetResources(target, targetInputs, instancePaths, adapter.container),
|
|
195
105
|
runtimeName,
|
|
196
106
|
runtimeRoot: recipe.runtimeRoot,
|
|
197
107
|
sourceIds: [...(target.sourceIds ?? [])].sort(),
|
|
198
108
|
targetConfigEnvBindings: target.configEnvBindings,
|
|
199
|
-
targetFiles: target.files
|
|
109
|
+
targetFiles: target.files,
|
|
110
|
+
...(target.worldTokenEnvNames
|
|
111
|
+
? { worldTokenEnvNames: target.worldTokenEnvNames }
|
|
112
|
+
: {})
|
|
200
113
|
});
|
|
201
114
|
});
|
|
202
115
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { EmittedFile } from "../runtime/index.js";
|
|
1
|
+
import type { EmittedFile, RuntimeContainerPackageOverrides } from "../runtime/index.js";
|
|
2
2
|
import type { ContainerEnvVariable, RuntimeTargetPlan } from "./containerArtifactsTypes.js";
|
|
3
3
|
import type { EntrypointOptions } from "./containerEntrypointRender.js";
|
|
4
4
|
export { renderEntrypoint } from "./containerEntrypointRender.js";
|
|
@@ -7,8 +7,10 @@ export declare const renderEnvExample: (variables: ContainerEnvVariable[]) => st
|
|
|
7
7
|
export interface DockerfileDistributionOptions {
|
|
8
8
|
labels: Record<string, string>;
|
|
9
9
|
reportOutputFile: string;
|
|
10
|
+
worldBindingsOutputFile?: string;
|
|
10
11
|
}
|
|
11
12
|
export declare const renderDockerfile: (runtimePlans: RuntimeTargetPlan[], options?: EntrypointOptions & {
|
|
12
13
|
distribution?: DockerfileDistributionOptions;
|
|
14
|
+
runtimePackageOverrides?: RuntimeContainerPackageOverrides;
|
|
13
15
|
}) => Promise<string>;
|
|
14
16
|
export declare const createRootfsFiles: (runtimePlans: RuntimeTargetPlan[]) => EmittedFile[];
|
|
@@ -1,5 +1,5 @@
|
|
|
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";
|
|
@@ -7,8 +7,6 @@ import { MOLTNET_BIN_DIRECTORY, MOLTNET_BINARY_NAMES } from "./moltnetBinaries.j
|
|
|
7
7
|
import { collectPackagesByManager, createAptPackageInstallItem, createNpmPackageInstallCommand, createNpmPackageInstallItem, createPackageInstallCommand, createPipxPackageInstallCommand, createPipxPackageInstallItem, getNpmInstallItemName } from "./containerPackageRender.js";
|
|
8
8
|
const CONTAINER_ROOTFS_ROOT = "container/rootfs";
|
|
9
9
|
const GATEWAY_PORT_PLACEHOLDER = "<gateway-port>";
|
|
10
|
-
const MOLTNET_INSTALL_SCRIPT_URL = "https://moltnet.dev/install.sh";
|
|
11
|
-
const MOLTNET_RELEASE_METADATA_URL = "https://api.github.com/repos/noopolis/moltnet/releases/latest";
|
|
12
10
|
const WORKSPACE_PLACEHOLDER = "<workspace-path>";
|
|
13
11
|
const RUNTIME_ROOT_PLACEHOLDER = "<runtime-root>";
|
|
14
12
|
const shellQuote = (value) => `'${value.replace(/'/g, `'\"'\"'`)}'`;
|
|
@@ -72,19 +70,22 @@ export const renderEnvExample = (variables) => {
|
|
|
72
70
|
return `${lines.join("\n").trimEnd()}\n`;
|
|
73
71
|
};
|
|
74
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
|
+
}
|
|
75
76
|
const runtimeNames = [...new Set(runtimePlans.map((plan) => plan.runtimeName))];
|
|
76
|
-
const runtimeRecipes = await Promise.all(runtimeNames.map((runtimeName) => createRuntimeInstallRecipe(runtimeName)));
|
|
77
|
+
const runtimeRecipes = await Promise.all(runtimeNames.map((runtimeName) => createRuntimeInstallRecipe(runtimeName, { packageOverrides: options.runtimePackageOverrides })));
|
|
77
78
|
const recipeByRuntimeName = new Map(runtimeRecipes.map((recipe) => [recipe.runtimeName, recipe]));
|
|
78
79
|
const baseImage = selectBaseImage(runtimePlans, runtimeRecipes);
|
|
79
|
-
const needsJsonEnvWriter = runtimePlans.some((plan) => (plan.configEnvBindings?.length ?? 0) > 0)
|
|
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);
|
|
80
84
|
const needsGit = runtimePlans.some((plan) => (plan.resources ?? []).some((resource) => resource.kind === "git"));
|
|
81
85
|
const systemDeps = [
|
|
82
86
|
...new Set([
|
|
83
87
|
...runtimePlans.flatMap((plan) => recipeByRuntimeName.get(plan.runtimeName)?.baseImage ? [] : plan.meta.systemDeps),
|
|
84
88
|
...(needsGit ? ["git"] : []),
|
|
85
|
-
...(options.hasMoltnet && !options.hasStagedMoltnetBinaries
|
|
86
|
-
? ["ca-certificates", "curl", "tar"]
|
|
87
|
-
: []),
|
|
88
89
|
...(needsJsonEnvWriter ? ["python3"] : [])
|
|
89
90
|
])
|
|
90
91
|
].sort();
|
|
@@ -123,9 +124,6 @@ export const renderDockerfile = async (runtimePlans, options = {}) => {
|
|
|
123
124
|
if (options.hasMoltnet && options.hasStagedMoltnetBinaries) {
|
|
124
125
|
lines.push(`COPY ${MOLTNET_BIN_DIRECTORY}/ /usr/local/bin/`, `RUN chmod +x ${MOLTNET_BINARY_NAMES.map((binaryName) => `/usr/local/bin/${binaryName}`).join(" ")}`, "");
|
|
125
126
|
}
|
|
126
|
-
else if (options.hasMoltnet) {
|
|
127
|
-
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`)}`, "");
|
|
128
|
-
}
|
|
129
127
|
for (const recipe of runtimeRecipes) {
|
|
130
128
|
for (const copyCommand of recipe.copyCommands) {
|
|
131
129
|
lines.push(copyCommand);
|
|
@@ -144,7 +142,12 @@ export const renderDockerfile = async (runtimePlans, options = {}) => {
|
|
|
144
142
|
lines.push(`RUN ${command}`);
|
|
145
143
|
}
|
|
146
144
|
if (options.distribution) {
|
|
147
|
-
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)
|
|
148
151
|
.sort(([left], [right]) => left.localeCompare(right))
|
|
149
152
|
.map(([name, value]) => `LABEL ${name}=${shellQuote(value)}`));
|
|
150
153
|
}
|
|
@@ -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") {
|
|
@@ -67,6 +81,13 @@ const createRuntimeReadinessWait = (plan) => {
|
|
|
67
81
|
];
|
|
68
82
|
};
|
|
69
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
|
+
];
|
|
70
91
|
const lines = [
|
|
71
92
|
"#!/usr/bin/env bash",
|
|
72
93
|
"set -euo pipefail",
|
|
@@ -97,61 +118,21 @@ export const renderEntrypoint = (runtimePlans, requiredSecrets, options = {}) =>
|
|
|
97
118
|
' printf %s \"${!name:-}\" > \"$target\"',
|
|
98
119
|
"}",
|
|
99
120
|
"",
|
|
100
|
-
|
|
101
|
-
' local target=\"$1\"',
|
|
102
|
-
' local name=\"$2\"',
|
|
103
|
-
' local json_path=\"$3\"',
|
|
104
|
-
' if [ -z \"${!name:-}\" ]; then',
|
|
105
|
-
" return",
|
|
106
|
-
" fi",
|
|
107
|
-
" python3 - \"$target\" \"$name\" \"$json_path\" <<'PY'",
|
|
108
|
-
"import json",
|
|
109
|
-
"import os",
|
|
110
|
-
"import sys",
|
|
111
|
-
"",
|
|
112
|
-
"target_path = sys.argv[1]",
|
|
113
|
-
"env_name = sys.argv[2]",
|
|
114
|
-
"json_path = sys.argv[3].split('.')",
|
|
115
|
-
"value = os.environ.get(env_name)",
|
|
116
|
-
"if value is None:",
|
|
117
|
-
" raise SystemExit(0)",
|
|
118
|
-
"",
|
|
119
|
-
"with open(target_path, encoding='utf-8') as handle:",
|
|
120
|
-
" data = json.load(handle)",
|
|
121
|
-
"",
|
|
122
|
-
"cursor = data",
|
|
123
|
-
"for part in json_path[:-1]:",
|
|
124
|
-
" if isinstance(cursor, list):",
|
|
125
|
-
" cursor = cursor[int(part)]",
|
|
126
|
-
" continue",
|
|
127
|
-
" child = cursor.get(part)",
|
|
128
|
-
" if not isinstance(child, (dict, list)):",
|
|
129
|
-
" child = {}",
|
|
130
|
-
" cursor[part] = child",
|
|
131
|
-
" cursor = child",
|
|
132
|
-
"",
|
|
133
|
-
"if isinstance(cursor, list):",
|
|
134
|
-
" cursor[int(json_path[-1])] = value",
|
|
135
|
-
"else:",
|
|
136
|
-
" cursor[json_path[-1]] = value",
|
|
137
|
-
"",
|
|
138
|
-
"with open(target_path, 'w', encoding='utf-8') as handle:",
|
|
139
|
-
" json.dump(data, handle, indent=2)",
|
|
140
|
-
" handle.write('\\n')",
|
|
141
|
-
"PY",
|
|
142
|
-
"}",
|
|
121
|
+
...createConfigEnvMaterializationFunction(),
|
|
143
122
|
"",
|
|
144
123
|
...createWorkspaceResourceShellFunctions()
|
|
145
124
|
];
|
|
146
125
|
lines.push('if [ -n "${OPENCLAW_GATEWAY_TOKEN:-}" ] && [ -z "${OPENCLAW_HOOKS_TOKEN:-}" ]; then', ' export OPENCLAW_HOOKS_TOKEN="hooks-${OPENCLAW_GATEWAY_TOKEN}"', "fi", "");
|
|
147
|
-
for (const secretName of
|
|
126
|
+
for (const secretName of renderedRequiredSecrets) {
|
|
148
127
|
lines.push(`require_env ${shellQuote(secretName)}`);
|
|
149
128
|
}
|
|
150
|
-
if (
|
|
129
|
+
if (renderedRequiredSecrets.length > 0) {
|
|
151
130
|
lines.push("");
|
|
152
131
|
}
|
|
132
|
+
lines.push(...cliCredentialMaterialization);
|
|
153
133
|
const moltnetServerPlans = options.moltnet?.serverPlans ?? [];
|
|
154
134
|
const moltnetNodePlans = options.moltnet?.nodePlans ?? [];
|
|
135
|
+
const moltnetExternalParticipants = options.moltnet?.externalParticipantArtifacts ?? [];
|
|
155
136
|
if (runtimePlans.length === 1 &&
|
|
156
137
|
moltnetServerPlans.length === 0 &&
|
|
157
138
|
moltnetNodePlans.length === 0) {
|
|
@@ -162,6 +143,8 @@ export const renderEntrypoint = (runtimePlans, requiredSecrets, options = {}) =>
|
|
|
162
143
|
return `${lines.join("\n").trimEnd()}\n`;
|
|
163
144
|
}
|
|
164
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(" ")} ` : "";
|
|
165
148
|
const managedMoltnetServerPlans = moltnetServerPlans.filter((serverPlan) => serverPlan.mode === "managed");
|
|
166
149
|
if (managedMoltnetServerPlans.length > 0) {
|
|
167
150
|
lines.push(`mkdir -p ${shellQuote(MOLTNET_SERVER_DATA_DIRECTORY)}`, "");
|
|
@@ -175,10 +158,31 @@ export const renderEntrypoint = (runtimePlans, requiredSecrets, options = {}) =>
|
|
|
175
158
|
for (const patch of serverPlan.secretPatches) {
|
|
176
159
|
serverLines.push(`apply_json_env_value ${shellQuote(serverPlan.configPath)} ${shellQuote(patch.envName)} ${shellQuote(patch.jsonPath)}`);
|
|
177
160
|
}
|
|
178
|
-
|
|
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+=("$!")');
|
|
179
163
|
if (serverPlan.port) {
|
|
180
164
|
serverLines.push(`until curl -sf ${shellQuote(`http://127.0.0.1:${serverPlan.port}/healthz`)} >/dev/null; do sleep 1; done`);
|
|
181
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
|
+
}
|
|
182
186
|
// Suppress the in-image managed server when an external endpoint is bound.
|
|
183
187
|
lines.push(`if [ -z "\${${urlEnv}:-}" ]; then`, ...serverLines.map((line) => ` ${line}`), "fi", "");
|
|
184
188
|
}
|
|
@@ -191,7 +195,7 @@ export const renderEntrypoint = (runtimePlans, requiredSecrets, options = {}) =>
|
|
|
191
195
|
const urlEnv = networkUrlEnvName(nodePlan.networkId);
|
|
192
196
|
lines.push(
|
|
193
197
|
// Rebind the bridge endpoint when an external network URL is provided.
|
|
194
|
-
`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+=("$!")', "");
|
|
195
199
|
}
|
|
196
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"');
|
|
197
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>;
|