spawnfile 0.1.12 → 0.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -12
- package/dist/audit/auditCli.d.ts +19 -0
- package/dist/audit/auditCli.js +63 -0
- package/dist/audit/checks.d.ts +100 -0
- package/dist/audit/checks.js +279 -0
- package/dist/audit/checksShared.d.ts +74 -0
- package/dist/audit/checksShared.js +37 -0
- package/dist/audit/generateAudit.d.ts +19 -0
- package/dist/audit/generateAudit.js +122 -0
- package/dist/audit/index.d.ts +4 -0
- package/dist/audit/index.js +4 -0
- package/dist/audit/readAudit.d.ts +50 -0
- package/dist/audit/readAudit.js +59 -0
- package/dist/audit/types.d.ts +40 -0
- package/dist/audit/types.js +8 -0
- package/dist/auth/credentialEnvFile.d.ts +11 -0
- package/dist/auth/credentialEnvFile.js +60 -0
- package/dist/auth/credentialProvisioning.d.ts +15 -0
- package/dist/auth/credentialProvisioning.js +75 -0
- package/dist/auth/credentialProvisioningReceipt.d.ts +28 -0
- package/dist/auth/credentialProvisioningReceipt.js +70 -0
- package/dist/auth/credentialProvisioningRequest.d.ts +51 -0
- package/dist/auth/credentialProvisioningRequest.js +169 -0
- package/dist/auth/credentialWorldBindings.d.ts +21 -0
- package/dist/auth/credentialWorldBindings.js +104 -0
- package/dist/auth/index.d.ts +7 -0
- package/dist/auth/index.js +7 -0
- package/dist/auth/paths.d.ts +11 -0
- package/dist/auth/paths.js +21 -0
- package/dist/auth/runtimeCredentials.js +18 -2
- package/dist/auth/targetSecretSourceAuthor.d.ts +18 -0
- package/dist/auth/targetSecretSourceAuthor.js +52 -0
- package/dist/auth/targetSecretSourceFsPublish.d.ts +15 -0
- package/dist/auth/targetSecretSourceFsPublish.js +49 -0
- package/dist/auth/targetSecretSourceFsPublishImmutable.d.ts +16 -0
- package/dist/auth/targetSecretSourceFsPublishImmutable.js +435 -0
- package/dist/auth/targetSecretSourceFsRead.d.ts +14 -0
- package/dist/auth/targetSecretSourceFsRead.js +198 -0
- package/dist/auth/targetSecretSourceGrant.d.ts +16 -0
- package/dist/auth/targetSecretSourceGrant.js +99 -0
- package/dist/auth/targetSecretSourceGrantRecords.d.ts +84 -0
- package/dist/auth/targetSecretSourceGrantRecords.js +214 -0
- package/dist/auth/targetSecretSourceLifecycle.d.ts +30 -0
- package/dist/auth/targetSecretSourceLifecycle.js +52 -0
- package/dist/auth/targetSecretSourceOwnerEntropy.d.ts +6 -0
- package/dist/auth/targetSecretSourceOwnerEntropy.js +28 -0
- package/dist/auth/targetSecretSourceRecordCommon.d.ts +14 -0
- package/dist/auth/targetSecretSourceRecordCommon.js +100 -0
- package/dist/auth/targetSecretSourceRecordPublish.d.ts +10 -0
- package/dist/auth/targetSecretSourceRecordPublish.js +104 -0
- package/dist/auth/targetSecretSourceResolver.d.ts +10 -0
- package/dist/auth/targetSecretSourceResolver.js +137 -0
- package/dist/auth/targetSecretSourceRevoke.d.ts +20 -0
- package/dist/auth/targetSecretSourceRevoke.js +92 -0
- package/dist/auth/targetSecretSourceRotate.d.ts +19 -0
- package/dist/auth/targetSecretSourceRotate.js +121 -0
- package/dist/auth/targetSecretSourceVersionRecords.d.ts +49 -0
- package/dist/auth/targetSecretSourceVersionRecords.js +166 -0
- package/dist/cli/artifactsCommands.d.ts +27 -0
- package/dist/cli/artifactsCommands.js +132 -0
- package/dist/cli/authCommands.d.ts +5 -0
- package/dist/cli/authCommands.js +221 -0
- package/dist/cli/compileBuildCommands.d.ts +3 -0
- package/dist/cli/compileBuildCommands.js +35 -0
- package/dist/cli/containerBundleCommand.d.ts +6 -0
- package/dist/cli/containerBundleCommand.js +116 -0
- package/dist/cli/devCommands.d.ts +3 -0
- package/dist/cli/devCommands.js +115 -0
- package/dist/cli/downCommand.d.ts +25 -0
- package/dist/cli/downCommand.js +134 -0
- package/dist/cli/index.js +6 -3
- package/dist/cli/lifecycleCommands.d.ts +1 -1
- package/dist/cli/lifecycleCommands.js +11 -179
- package/dist/cli/lifecycleMachine.d.ts +19 -0
- package/dist/cli/lifecycleMachine.js +78 -0
- package/dist/cli/lifecyclePlan.d.ts +35 -0
- package/dist/cli/lifecyclePlan.js +240 -0
- package/dist/cli/lifecyclePlanningCommands.d.ts +3 -0
- package/dist/cli/lifecyclePlanningCommands.js +30 -0
- package/dist/cli/runCli.d.ts +15 -2
- package/dist/cli/runCli.js +31 -71
- package/dist/cli/runPublishCommands.d.ts +3 -0
- package/dist/cli/runPublishCommands.js +70 -0
- package/dist/cli/statusCommand.d.ts +3 -32
- package/dist/cli/statusCommand.js +37 -233
- package/dist/cli/statusCommandLive.d.ts +20 -0
- package/dist/cli/statusCommandLive.js +188 -0
- package/dist/cli/statusCommandOptions.d.ts +40 -0
- package/dist/cli/statusCommandOptions.js +42 -0
- package/dist/cli/targetCliRoute.d.ts +2 -0
- package/dist/cli/targetCliRoute.js +30 -0
- package/dist/cli/targetCommands.d.ts +33 -0
- package/dist/cli/targetCommands.js +257 -0
- package/dist/cli/targetComposedPreparationCommand.d.ts +6 -0
- package/dist/cli/targetComposedPreparationCommand.js +39 -0
- package/dist/cli/targetDefaultArtifactAuthority.d.ts +5 -0
- package/dist/cli/targetDefaultArtifactAuthority.js +28 -0
- package/dist/cli/targetDefaultAuthorities.d.ts +53 -0
- package/dist/cli/targetDefaultAuthorities.js +210 -0
- package/dist/cli/targetDefaultConfig.d.ts +68 -0
- package/dist/cli/targetDefaultConfig.js +317 -0
- package/dist/cli/targetDefaultConfigStdin.d.ts +13 -0
- package/dist/cli/targetDefaultConfigStdin.js +215 -0
- package/dist/cli/targetDefaultEnvelope.d.ts +1 -0
- package/dist/cli/targetDefaultEnvelope.js +13 -0
- package/dist/cli/targetDefaultHandlerFactory.d.ts +28 -0
- package/dist/cli/targetDefaultHandlerFactory.js +247 -0
- package/dist/cli/targetDefaultHandlers.d.ts +21 -0
- package/dist/cli/targetDefaultHandlers.js +72 -0
- package/dist/cli/targetDefaultJournalAuthority.d.ts +35 -0
- package/dist/cli/targetDefaultJournalAuthority.js +135 -0
- package/dist/cli/targetDefaultWorldClock.d.ts +4 -0
- package/dist/cli/targetDefaultWorldClock.js +14 -0
- package/dist/cli/targetDefaultWorldQueries.d.ts +5 -0
- package/dist/cli/targetDefaultWorldQueries.js +11 -0
- package/dist/cli/targetDefaultWorldReadiness.d.ts +4 -0
- package/dist/cli/targetDefaultWorldReadiness.js +17 -0
- package/dist/cli/targetEvidenceHelperResolution.d.ts +14 -0
- package/dist/cli/targetEvidenceHelperResolution.js +23 -0
- package/dist/cli/targetLookupCli.d.ts +3 -0
- package/dist/cli/targetLookupCli.js +31 -0
- package/dist/cli/targetLookupCommands.d.ts +12 -0
- package/dist/cli/targetLookupCommands.js +69 -0
- package/dist/cli/targetOperationDispatch.d.ts +58 -0
- package/dist/cli/targetOperationDispatch.js +21 -0
- package/dist/cli/targetReceiptOutput.d.ts +14 -0
- package/dist/cli/targetReceiptOutput.js +21 -0
- package/dist/cli/targetRequestFile.d.ts +14 -0
- package/dist/cli/targetRequestFile.js +63 -0
- package/dist/cli/targetSecretSourceInput.d.ts +28 -0
- package/dist/cli/targetSecretSourceInput.js +121 -0
- package/dist/cli/targetWorldClockCommand.d.ts +10 -0
- package/dist/cli/targetWorldClockCommand.js +42 -0
- package/dist/cli/targetWorldClockCrossProcess.test-helper.d.ts +13 -0
- package/dist/cli/targetWorldClockCrossProcess.test-helper.js +109 -0
- package/dist/cli/targetWorldReadinessCommand.d.ts +10 -0
- package/dist/cli/targetWorldReadinessCommand.js +43 -0
- package/dist/cli/upCommand.d.ts +3 -0
- package/dist/cli/upCommand.js +133 -0
- package/dist/cli/upImageCommand.d.ts +11 -0
- package/dist/cli/upImageCommand.js +41 -0
- package/dist/cli/upLifecycleInvocation.d.ts +41 -0
- package/dist/cli/upLifecycleInvocation.js +48 -0
- package/dist/cli/upLifecycleRecovery.d.ts +4 -0
- package/dist/cli/upLifecycleRecovery.js +53 -0
- package/dist/compiler/agentNodeMerge.d.ts +2 -0
- package/dist/compiler/agentNodeMerge.js +79 -0
- package/dist/compiler/agentSurfaces.js +11 -1
- package/dist/compiler/buildCompilePlan.js +17 -0
- package/dist/compiler/buildCompilePlanAgent.d.ts +11 -0
- package/dist/compiler/buildCompilePlanAgent.js +56 -0
- package/dist/compiler/buildCompilePlanTeams.d.ts +1 -0
- package/dist/compiler/buildCompilePlanTeams.js +4 -1
- package/dist/compiler/buildCompilePlanTraversal.js +75 -82
- package/dist/compiler/buildProject.d.ts +20 -1
- package/dist/compiler/buildProject.js +121 -7
- package/dist/compiler/compilePlanHelpers.js +2 -0
- package/dist/compiler/compileProject.d.ts +15 -0
- package/dist/compiler/compileProject.js +29 -75
- package/dist/compiler/compileProjectPolicy.d.ts +5 -0
- package/dist/compiler/compileProjectPolicy.js +21 -0
- package/dist/compiler/compileProjectReports.d.ts +9 -0
- package/dist/compiler/compileProjectReports.js +52 -0
- package/dist/compiler/containerArtifactSummaries.d.ts +7 -0
- package/dist/compiler/containerArtifactSummaries.js +138 -0
- package/dist/compiler/containerArtifacts.d.ts +10 -0
- package/dist/compiler/containerArtifacts.js +126 -125
- package/dist/compiler/containerArtifactsPlans.d.ts +5 -3
- package/dist/compiler/containerArtifactsPlans.js +31 -118
- package/dist/compiler/containerArtifactsRender.d.ts +3 -1
- package/dist/compiler/containerArtifactsRender.js +40 -81
- package/dist/compiler/containerArtifactsTypes.d.ts +12 -0
- package/dist/compiler/containerConfigEnvRender.d.ts +3 -0
- package/dist/compiler/containerConfigEnvRender.js +54 -0
- package/dist/compiler/containerEntrypointRender.d.ts +1 -0
- package/dist/compiler/containerEntrypointRender.js +60 -53
- package/dist/compiler/containerEntrypointShell.d.ts +5 -0
- package/dist/compiler/containerEntrypointShell.js +29 -0
- package/dist/compiler/containerPackageOverrides.d.ts +27 -0
- package/dist/compiler/containerPackageOverrides.js +63 -0
- package/dist/compiler/containerPackageRender.d.ts +15 -0
- package/dist/compiler/containerPackageRender.js +63 -0
- package/dist/compiler/containerTargetPlanResolution.d.ts +20 -0
- package/dist/compiler/containerTargetPlanResolution.js +97 -0
- package/dist/compiler/containerTargetResources.js +3 -1
- package/dist/compiler/daimonTelemetryArtifacts.d.ts +22 -0
- package/dist/compiler/daimonTelemetryArtifacts.js +61 -0
- package/dist/compiler/dockerBuildContext.d.ts +16 -0
- package/dist/compiler/dockerBuildContext.js +159 -0
- package/dist/compiler/dockerBuildSkip.d.ts +30 -0
- package/dist/compiler/dockerBuildSkip.js +81 -0
- package/dist/compiler/index.d.ts +4 -0
- package/dist/compiler/index.js +4 -0
- package/dist/compiler/memoryArtifacts.d.ts +26 -0
- package/dist/compiler/memoryArtifacts.js +134 -0
- package/dist/compiler/memoryResolution.d.ts +4 -0
- package/dist/compiler/memoryResolution.js +147 -0
- package/dist/compiler/modelEnv.d.ts +2 -0
- package/dist/compiler/modelEnv.js +6 -0
- package/dist/compiler/moltnetAllowedWakeSendersValidation.d.ts +2 -0
- package/dist/compiler/moltnetAllowedWakeSendersValidation.js +42 -0
- package/dist/compiler/moltnetArtifactPaths.d.ts +26 -0
- package/dist/compiler/moltnetArtifactPaths.js +49 -0
- package/dist/compiler/moltnetArtifactTypes.d.ts +46 -0
- package/dist/compiler/moltnetArtifactTypes.js +1 -0
- package/dist/compiler/moltnetArtifacts.d.ts +2 -40
- package/dist/compiler/moltnetArtifacts.js +56 -95
- package/dist/compiler/moltnetBinaries.d.ts +21 -1
- package/dist/compiler/moltnetBinaries.js +156 -28
- package/dist/compiler/moltnetClientConfig.js +18 -2
- package/dist/compiler/moltnetConfigLowering.d.ts +16 -1
- package/dist/compiler/moltnetConfigLowering.js +67 -5
- package/dist/compiler/moltnetExternalParticipantArtifact.d.ts +38 -0
- package/dist/compiler/moltnetExternalParticipantArtifact.js +188 -0
- package/dist/compiler/moltnetNodeConfig.js +7 -2
- package/dist/compiler/moltnetReleaseAuthority.d.ts +17 -0
- package/dist/compiler/moltnetReleaseAuthority.js +73 -0
- package/dist/compiler/moltnetReleaseDownload.d.ts +12 -0
- package/dist/compiler/moltnetReleaseDownload.js +85 -0
- package/dist/compiler/moltnetRepresentativeResolution.d.ts +1 -0
- package/dist/compiler/moltnetRepresentativeResolution.js +16 -2
- package/dist/compiler/moltnetResolution.js +72 -20
- package/dist/compiler/moltnetRoomMemberships.js +37 -9
- package/dist/compiler/moltnetRuntimeConfig.js +11 -0
- package/dist/compiler/moltnetServerPlans.d.ts +9 -0
- package/dist/compiler/moltnetServerPlans.js +132 -0
- package/dist/compiler/organizationIdentity.d.ts +27 -0
- package/dist/compiler/organizationIdentity.js +297 -0
- package/dist/compiler/organizationReadyEvidence.d.ts +49 -0
- package/dist/compiler/organizationReadyEvidence.js +261 -0
- package/dist/compiler/projectManifestGraph.d.ts +4 -0
- package/dist/compiler/projectManifestGraph.js +24 -0
- package/dist/compiler/runProject.d.ts +4 -0
- package/dist/compiler/runProject.js +37 -22
- package/dist/compiler/runProjectAuth.d.ts +7 -1
- package/dist/compiler/runProjectAuth.js +87 -9
- package/dist/compiler/runProjectDocker.d.ts +7 -0
- package/dist/compiler/runProjectDocker.js +187 -19
- package/dist/compiler/runProjectLifecycle.d.ts +7 -0
- package/dist/compiler/runProjectLifecycle.js +40 -0
- package/dist/compiler/syncProjectAuth.js +4 -1
- package/dist/compiler/teamContextActiveEnvironments.d.ts +13 -0
- package/dist/compiler/teamContextActiveEnvironments.js +255 -0
- package/dist/compiler/teamContextSupport.js +32 -40
- package/dist/compiler/teamContextTypes.d.ts +2 -0
- package/dist/compiler/types.d.ts +82 -1
- package/dist/compiler/upProject.d.ts +5 -0
- package/dist/compiler/upProject.js +257 -20
- package/dist/compiler/upReceipt.d.ts +36 -0
- package/dist/compiler/upReceipt.js +82 -0
- package/dist/compiler/updateProjectModels.js +42 -60
- package/dist/compiler/updateProjectRuntime.js +22 -35
- package/dist/compiler/updateProjectSurfaces.js +53 -47
- package/dist/compiler/worldBindings.d.ts +39 -0
- package/dist/compiler/worldBindings.js +247 -0
- package/dist/compiler/worldBindingsFile.d.ts +5 -0
- package/dist/compiler/worldBindingsFile.js +162 -0
- package/dist/deployment/artifactsExport.d.ts +49 -0
- package/dist/deployment/artifactsExport.js +217 -0
- package/dist/deployment/artifactsExportDocker.d.ts +48 -0
- package/dist/deployment/artifactsExportDocker.js +91 -0
- package/dist/deployment/artifactsExportPlan.d.ts +24 -0
- package/dist/deployment/artifactsExportPlan.js +135 -0
- package/dist/deployment/artifactsExportTypes.d.ts +50 -0
- package/dist/deployment/artifactsExportTypes.js +52 -0
- package/dist/deployment/buildImageCacheStore.d.ts +23 -0
- package/dist/deployment/buildImageCacheStore.js +54 -0
- package/dist/deployment/deploymentLifecycleCorrelation.d.ts +11 -0
- package/dist/deployment/deploymentLifecycleCorrelation.js +33 -0
- package/dist/deployment/dockerInspect.d.ts +9 -0
- package/dist/deployment/dockerInspect.js +24 -1
- package/dist/deployment/dockerLabels.d.ts +2 -0
- package/dist/deployment/dockerLabels.js +2 -0
- package/dist/deployment/dockerLogs.js +2 -10
- package/dist/deployment/dockerManager.d.ts +51 -0
- package/dist/deployment/dockerManager.js +118 -1
- package/dist/deployment/dockerProbeGateway.js +64 -5
- package/dist/deployment/dockerRecover.d.ts +17 -0
- package/dist/deployment/dockerRecover.js +137 -0
- package/dist/deployment/dockerTeardown.d.ts +32 -0
- package/dist/deployment/dockerTeardown.js +61 -0
- package/dist/deployment/downDeployment.d.ts +34 -0
- package/dist/deployment/downDeployment.js +147 -0
- package/dist/deployment/downReceiptTypes.d.ts +21 -0
- package/dist/deployment/downReceiptTypes.js +30 -0
- package/dist/deployment/index.d.ts +17 -0
- package/dist/deployment/index.js +18 -0
- package/dist/deployment/lifecycleCompletion.d.ts +37 -0
- package/dist/deployment/lifecycleCompletion.js +236 -0
- package/dist/deployment/lifecycleCompletionContracts.d.ts +158 -0
- package/dist/deployment/lifecycleCompletionContracts.js +106 -0
- package/dist/deployment/lifecycleCompletionHeartbeat.d.ts +2 -0
- package/dist/deployment/lifecycleCompletionHeartbeat.js +50 -0
- package/dist/deployment/lifecycleCompletionLookup.d.ts +18 -0
- package/dist/deployment/lifecycleCompletionLookup.js +88 -0
- package/dist/deployment/lifecycleCompletionOwner.d.ts +8 -0
- package/dist/deployment/lifecycleCompletionOwner.js +31 -0
- package/dist/deployment/lifecycleCompletionParsing.d.ts +12 -0
- package/dist/deployment/lifecycleCompletionParsing.js +108 -0
- package/dist/deployment/lifecycleCompletionPaths.d.ts +9 -0
- package/dist/deployment/lifecycleCompletionPaths.js +16 -0
- package/dist/deployment/lifecycleCompletionPublication.d.ts +5 -0
- package/dist/deployment/lifecycleCompletionPublication.js +35 -0
- package/dist/deployment/lifecycleCompletionRecovery.d.ts +21 -0
- package/dist/deployment/lifecycleCompletionRecovery.js +56 -0
- package/dist/deployment/lifecycleCompletionRoot.d.ts +21 -0
- package/dist/deployment/lifecycleCompletionRoot.js +243 -0
- package/dist/deployment/lifecycleCompletionStore.d.ts +6 -0
- package/dist/deployment/lifecycleCompletionStore.js +151 -0
- package/dist/deployment/organizationHandoffAuthorityFsClient.d.ts +17 -0
- package/dist/deployment/organizationHandoffAuthorityFsClient.js +132 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorker.d.ts +1 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorker.js +285 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorkerParent.fixture.d.ts +1 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorkerParent.fixture.js +26 -0
- package/dist/deployment/organizationHandoffAuthorityStore.d.ts +41 -0
- package/dist/deployment/organizationHandoffAuthorityStore.js +348 -0
- package/dist/deployment/organizationHandoffAuthorityTypes.d.ts +76 -0
- package/dist/deployment/organizationHandoffAuthorityTypes.js +148 -0
- package/dist/deployment/organizationHandoffTypes.d.ts +29 -0
- package/dist/deployment/organizationHandoffTypes.js +80 -0
- package/dist/deployment/organizationReady.d.ts +52 -0
- package/dist/deployment/organizationReady.js +200 -0
- package/dist/deployment/privateArtifactsExport.d.ts +18 -0
- package/dist/deployment/privateArtifactsExport.js +80 -0
- package/dist/deployment/providerRuntimeBoundaryScanner.test-helper.d.ts +8 -0
- package/dist/deployment/providerRuntimeBoundaryScanner.test-helper.js +60 -0
- package/dist/deployment/record.d.ts +26 -1
- package/dist/deployment/record.js +49 -4
- package/dist/deployment/simfileFixtureBoundary.test-helper.d.ts +8 -0
- package/dist/deployment/simfileFixtureBoundary.test-helper.js +103 -0
- package/dist/deployment/target.d.ts +1 -35
- package/dist/deployment/target.js +1 -96
- package/dist/deployment/upReceiptTypes.d.ts +111 -0
- package/dist/deployment/upReceiptTypes.js +164 -0
- package/dist/dev/activity.d.ts +14 -0
- package/dist/dev/activity.js +48 -0
- package/dist/dev/docker.d.ts +16 -0
- package/dist/dev/docker.js +71 -0
- package/dist/dev/index.d.ts +2 -0
- package/dist/dev/index.js +2 -0
- package/dist/dev/project.d.ts +35 -0
- package/dist/dev/project.js +170 -0
- package/dist/distribution/buildDistributionReport.d.ts +2 -1
- package/dist/distribution/buildDistributionReport.js +2 -1
- package/dist/distribution/distributionReportSchema.d.ts +5 -0
- package/dist/distribution/distributionReportSchema.js +7 -2
- package/dist/distribution/index.d.ts +2 -2
- package/dist/distribution/index.js +1 -1
- package/dist/distribution/types.d.ts +7 -0
- package/dist/distribution/types.js +1 -0
- package/dist/filesystem/paths.js +10 -1
- package/dist/ledger/causalConformanceCli.d.ts +1 -0
- package/dist/ledger/causalConformanceCli.js +41 -0
- package/dist/ledger/causeNamespace.d.ts +8 -0
- package/dist/ledger/causeNamespace.js +24 -0
- package/dist/ledger/conformance.d.ts +83 -0
- package/dist/ledger/conformance.js +259 -0
- package/dist/ledger/emitters.d.ts +76 -0
- package/dist/ledger/emitters.js +188 -0
- package/dist/ledger/index.d.ts +4 -0
- package/dist/ledger/index.js +4 -0
- package/dist/ledger/principal.d.ts +96 -0
- package/dist/ledger/principal.js +121 -0
- package/dist/manifest/externalParticipantSchemas.d.ts +18 -0
- package/dist/manifest/externalParticipantSchemas.js +17 -0
- package/dist/manifest/index.d.ts +1 -0
- package/dist/manifest/index.js +1 -0
- package/dist/manifest/inlineAgentMember.d.ts +2 -0
- package/dist/manifest/inlineAgentMember.js +9 -0
- package/dist/manifest/loadManifest.js +14 -8
- package/dist/manifest/mcpSchemas.d.ts +17 -0
- package/dist/manifest/mcpSchemas.js +41 -0
- package/dist/manifest/memorySchemas.d.ts +245 -0
- package/dist/manifest/memorySchemas.js +148 -0
- package/dist/manifest/renderSpawnfile.js +22 -131
- package/dist/manifest/renderSpawnfileNetworks.js +9 -2
- package/dist/manifest/renderSpawnfileSurfaces.d.ts +2 -0
- package/dist/manifest/renderSpawnfileSurfaces.js +134 -0
- package/dist/manifest/schemas.d.ts +1868 -99
- package/dist/manifest/schemas.js +78 -32
- package/dist/manifest/surfaceSchemas.d.ts +17 -0
- package/dist/manifest/surfaceSchemas.js +24 -1
- package/dist/manifest/teamNetworkAccessSchemas.d.ts +1 -1
- package/dist/manifest/teamNetworkAuthSchemas.d.ts +48 -0
- package/dist/manifest/teamNetworkAuthSchemas.js +103 -0
- package/dist/manifest/teamNetworkSchemas.d.ts +8 -187
- package/dist/manifest/teamNetworkSchemas.js +3 -317
- package/dist/manifest/teamNetworkServerSchemas.d.ts +150 -0
- package/dist/manifest/teamNetworkServerSchemas.js +199 -0
- package/dist/ownership/siblingBuildFreshness.d.ts +20 -0
- package/dist/ownership/siblingBuildFreshness.js +20 -0
- package/dist/ownership/simfileRunOperatorInputs.d.ts +103 -0
- package/dist/ownership/simfileRunOperatorInputs.js +139 -0
- package/dist/report/types.d.ts +142 -0
- package/dist/runtime/common.d.ts +37 -0
- package/dist/runtime/common.js +56 -1
- package/dist/runtime/container.d.ts +29 -1
- package/dist/runtime/container.js +127 -11
- package/dist/runtime/containerPackageOverrides.d.ts +37 -0
- package/dist/runtime/containerPackageOverrides.js +33 -0
- package/dist/runtime/index.d.ts +2 -0
- package/dist/runtime/index.js +2 -0
- package/dist/runtime/install.d.ts +1 -1
- package/dist/runtime/install.js +43 -1
- package/dist/runtime/mnemeMcp.d.ts +15 -0
- package/dist/runtime/mnemeMcp.js +109 -0
- package/dist/runtime/openclaw/adapter.js +15 -4
- package/dist/runtime/openclaw/mcp.d.ts +10 -0
- package/dist/runtime/openclaw/mcp.js +69 -0
- package/dist/runtime/openclaw/runAuth.js +2 -2
- package/dist/runtime/openclaw/scaffold.js +1 -1
- package/dist/runtime/openclaw/schedules.d.ts +38 -0
- package/dist/runtime/openclaw/schedules.js +74 -0
- package/dist/runtime/pi/adapter.d.ts +4 -0
- package/dist/runtime/pi/adapter.js +231 -0
- package/dist/runtime/pi/appActivitySource.d.ts +1 -0
- package/dist/runtime/pi/appActivitySource.js +199 -0
- package/dist/runtime/pi/appAgentConfig.d.ts +11 -0
- package/dist/runtime/pi/appAgentConfig.js +264 -0
- package/dist/runtime/pi/appCliEnginesSource.d.ts +1 -0
- package/dist/runtime/pi/appCliEnginesSource.js +183 -0
- package/dist/runtime/pi/appCliSource.d.ts +1 -0
- package/dist/runtime/pi/appCliSource.js +353 -0
- package/dist/runtime/pi/appControlSource.d.ts +1 -0
- package/dist/runtime/pi/appControlSource.js +390 -0
- package/dist/runtime/pi/appControlWakeIdentitySource.d.ts +1 -0
- package/dist/runtime/pi/appControlWakeIdentitySource.js +19 -0
- package/dist/runtime/pi/appCoreSource.d.ts +4 -0
- package/dist/runtime/pi/appCoreSource.js +244 -0
- package/dist/runtime/pi/appPreludeSource.d.ts +1 -0
- package/dist/runtime/pi/appPreludeSource.js +191 -0
- package/dist/runtime/pi/appScheduleSource.d.ts +1 -0
- package/dist/runtime/pi/appScheduleSource.js +80 -0
- package/dist/runtime/pi/appScriptedEngine.d.ts +31 -0
- package/dist/runtime/pi/appScriptedEngine.js +42 -0
- package/dist/runtime/pi/appSource.d.ts +4 -0
- package/dist/runtime/pi/appSource.js +12 -0
- package/dist/runtime/pi/appTemplate.d.ts +14 -0
- package/dist/runtime/pi/appTemplate.js +27 -0
- package/dist/runtime/pi/appTemplateTypes.d.ts +64 -0
- package/dist/runtime/pi/appTemplateTypes.js +18 -0
- package/dist/runtime/pi/appWakeContextSource.d.ts +1 -0
- package/dist/runtime/pi/appWakeContextSource.js +398 -0
- package/dist/runtime/pi/containerTargets.d.ts +4 -0
- package/dist/runtime/pi/containerTargets.js +57 -0
- package/dist/runtime/pi/runAuth.d.ts +2 -0
- package/dist/runtime/pi/runAuth.js +185 -0
- package/dist/runtime/pi/testHelpers.d.ts +2 -0
- package/dist/runtime/pi/testHelpers.js +40 -0
- package/dist/runtime/picoclaw/adapter.js +23 -27
- package/dist/runtime/picoclaw/mcp.d.ts +4 -0
- package/dist/runtime/picoclaw/mcp.js +43 -0
- package/dist/runtime/picoclaw/memory.d.ts +7 -0
- package/dist/runtime/picoclaw/memory.js +17 -0
- package/dist/runtime/picoclaw/runAuth.js +1 -1
- package/dist/runtime/picoclaw/scaffold.js +1 -1
- package/dist/runtime/picoclaw/schedules.d.ts +26 -0
- package/dist/runtime/picoclaw/schedules.js +62 -3
- package/dist/runtime/registry.js +3 -0
- package/dist/runtime/scheduleUtils.d.ts +2 -0
- package/dist/runtime/scheduleUtils.js +15 -0
- package/dist/runtime/types.d.ts +26 -2
- package/dist/shared/errors.d.ts +1 -1
- package/dist/shared/errors.js +2 -2
- package/dist/shared/index.d.ts +1 -0
- package/dist/shared/index.js +1 -0
- package/dist/shared/redaction.d.ts +2 -0
- package/dist/shared/redaction.js +10 -0
- package/dist/status/buildStatus.d.ts +1 -0
- package/dist/status/buildStatus.js +2 -0
- package/dist/status/compileReport.d.ts +22 -0
- package/dist/status/compileReport.js +16 -2
- package/dist/status/compiledProbeCollection.d.ts +21 -0
- package/dist/status/compiledProbeCollection.js +27 -0
- package/dist/status/deployments.js +5 -12
- package/dist/status/imageStatusReport.js +6 -0
- package/dist/status/index.d.ts +3 -0
- package/dist/status/index.js +3 -0
- package/dist/status/lifecycleProbes.d.ts +19 -0
- package/dist/status/lifecycleProbes.js +174 -0
- package/dist/status/moltnetProbes.d.ts +7 -8
- package/dist/status/moltnetProbes.js +27 -198
- package/dist/status/moltnetWiringProbes.d.ts +19 -0
- package/dist/status/moltnetWiringProbes.js +178 -0
- package/dist/target/cleanupRun.d.ts +41 -0
- package/dist/target/cleanupRun.js +139 -0
- package/dist/target/cleanupRunDocker.d.ts +16 -0
- package/dist/target/cleanupRunDocker.js +66 -0
- package/dist/target/cleanupRunDocker.test-helper.d.ts +67 -0
- package/dist/target/cleanupRunDocker.test-helper.js +238 -0
- package/dist/target/cleanupRunDockerPreflight.d.ts +17 -0
- package/dist/target/cleanupRunDockerPreflight.js +224 -0
- package/dist/target/composedPreparation.d.ts +205 -0
- package/dist/target/composedPreparation.js +223 -0
- package/dist/target/containerBundle.d.ts +82 -0
- package/dist/target/containerBundle.js +243 -0
- package/dist/target/containerBundleArchive.d.ts +31 -0
- package/dist/target/containerBundleArchive.js +140 -0
- package/dist/target/containerBundleAuthority.d.ts +25 -0
- package/dist/target/containerBundleAuthority.js +65 -0
- package/dist/target/containerBundleContracts.d.ts +114 -0
- package/dist/target/containerBundleContracts.js +173 -0
- package/dist/target/containerBundleFilesystemStore.d.ts +3 -0
- package/dist/target/containerBundleFilesystemStore.js +247 -0
- package/dist/target/containerBundlePolicy.d.ts +33 -0
- package/dist/target/containerBundlePolicy.js +64 -0
- package/dist/target/containerBundleStore.d.ts +127 -0
- package/dist/target/containerBundleStore.js +284 -0
- package/dist/target/contracts.d.ts +538 -0
- package/dist/target/contracts.js +373 -0
- package/dist/target/dockerArtifactIdentityTypes.d.ts +56 -0
- package/dist/target/dockerArtifactIdentityTypes.js +1 -0
- package/dist/target/dockerArtifactInspection.d.ts +40 -0
- package/dist/target/dockerArtifactInspection.js +125 -0
- package/dist/target/dockerArtifacts.d.ts +21 -0
- package/dist/target/dockerArtifacts.js +110 -0
- package/dist/target/dockerArtifactsProvider.d.ts +41 -0
- package/dist/target/dockerArtifactsProvider.js +449 -0
- package/dist/target/dockerCommandExecutor.d.ts +27 -0
- package/dist/target/dockerCommandExecutor.js +200 -0
- package/dist/target/dockerCommandExecutorCore.d.ts +34 -0
- package/dist/target/dockerCommandExecutorCore.js +273 -0
- package/dist/target/dockerContainerBundleBuilder.d.ts +8 -0
- package/dist/target/dockerContainerBundleBuilder.js +256 -0
- package/dist/target/dockerContextSnapshot.d.ts +21 -0
- package/dist/target/dockerContextSnapshot.js +158 -0
- package/dist/target/dockerEndpointFingerprint.d.ts +1 -0
- package/dist/target/dockerEndpointFingerprint.js +9 -0
- package/dist/target/dockerPreparedArtifact.d.ts +48 -0
- package/dist/target/dockerPreparedArtifact.js +131 -0
- package/dist/target/dockerProjectionJson.d.ts +1 -0
- package/dist/target/dockerProjectionJson.js +80 -0
- package/dist/target/dockerPublicArtifactSnapshot.d.ts +17 -0
- package/dist/target/dockerPublicArtifactSnapshot.js +99 -0
- package/dist/target/dockerResources.d.ts +26 -0
- package/dist/target/dockerResources.js +162 -0
- package/dist/target/dockerResourcesProvider.d.ts +44 -0
- package/dist/target/dockerResourcesProvider.js +207 -0
- package/dist/target/dockerSecrets.d.ts +39 -0
- package/dist/target/dockerSecrets.js +249 -0
- package/dist/target/dockerSecretsAuthority.d.ts +26 -0
- package/dist/target/dockerSecretsAuthority.js +216 -0
- package/dist/target/dockerSecretsLifecycle.d.ts +25 -0
- package/dist/target/dockerSecretsLifecycle.js +133 -0
- package/dist/target/dockerSecretsProvider.d.ts +68 -0
- package/dist/target/dockerSecretsProvider.js +329 -0
- package/dist/target/dockerTarget.d.ts +52 -0
- package/dist/target/dockerTarget.js +48 -0
- package/dist/target/dockerTargetBinding.d.ts +14 -0
- package/dist/target/dockerTargetBinding.js +96 -0
- package/dist/target/dockerWorldClock.d.ts +17 -0
- package/dist/target/dockerWorldClock.js +111 -0
- package/dist/target/dockerWorldReadiness.d.ts +17 -0
- package/dist/target/dockerWorldReadiness.js +119 -0
- package/dist/target/dockerWorldService.d.ts +23 -0
- package/dist/target/dockerWorldService.js +216 -0
- package/dist/target/dockerWorldServiceAuthority.d.ts +80 -0
- package/dist/target/dockerWorldServiceAuthority.js +182 -0
- package/dist/target/dockerWorldServiceLifecycle.d.ts +41 -0
- package/dist/target/dockerWorldServiceLifecycle.js +275 -0
- package/dist/target/dockerWorldServiceProvider.d.ts +60 -0
- package/dist/target/dockerWorldServiceProvider.js +318 -0
- package/dist/target/dockerWorldServiceStore.d.ts +73 -0
- package/dist/target/dockerWorldServiceStore.js +367 -0
- package/dist/target/evidenceExport.d.ts +55 -0
- package/dist/target/evidenceExport.js +518 -0
- package/dist/target/evidenceExportArchive.d.ts +10 -0
- package/dist/target/evidenceExportArchive.js +302 -0
- package/dist/target/evidenceExportContract.d.ts +27 -0
- package/dist/target/evidenceExportContract.js +40 -0
- package/dist/target/evidenceExportOperationsTestKit.d.ts +87 -0
- package/dist/target/evidenceExportOperationsTestKit.js +312 -0
- package/dist/target/evidenceExportProvider.d.ts +85 -0
- package/dist/target/evidenceExportProvider.js +187 -0
- package/dist/target/evidenceExportPublicationTypes.d.ts +16 -0
- package/dist/target/evidenceExportPublicationTypes.js +1 -0
- package/dist/target/evidenceExportStore.d.ts +70 -0
- package/dist/target/evidenceExportStore.js +498 -0
- package/dist/target/evidenceExportStorePublication.d.ts +7 -0
- package/dist/target/evidenceExportStorePublication.js +395 -0
- package/dist/target/handles.d.ts +20 -0
- package/dist/target/handles.js +56 -0
- package/dist/target/index.d.ts +12 -0
- package/dist/target/index.js +11 -0
- package/dist/target/journal.d.ts +59 -0
- package/dist/target/journal.js +529 -0
- package/dist/target/journalFilesystem.d.ts +3 -0
- package/dist/target/journalFilesystem.js +111 -0
- package/dist/target/journalRoot.d.ts +4 -0
- package/dist/target/journalRoot.js +6 -0
- package/dist/target/organizationAttachment.d.ts +23 -0
- package/dist/target/organizationAttachment.js +263 -0
- package/dist/target/organizationAttachmentAuthority.d.ts +65 -0
- package/dist/target/organizationAttachmentAuthority.js +161 -0
- package/dist/target/organizationAttachmentLifecycle.d.ts +17 -0
- package/dist/target/organizationAttachmentLifecycle.js +101 -0
- package/dist/target/organizationAttachmentProvider.d.ts +76 -0
- package/dist/target/organizationAttachmentProvider.js +289 -0
- package/dist/target/organizationAttachmentStore.d.ts +51 -0
- package/dist/target/organizationAttachmentStore.js +316 -0
- package/dist/target/publicArtifactSnapshot.d.ts +41 -0
- package/dist/target/publicArtifactSnapshot.js +150 -0
- package/dist/target/topologyActivation.d.ts +51 -0
- package/dist/target/topologyActivation.js +149 -0
- package/dist/target/topologyAttestation.d.ts +37 -0
- package/dist/target/topologyAttestation.js +300 -0
- package/dist/target/topologyAttestationErrors.d.ts +1 -0
- package/dist/target/topologyAttestationErrors.js +1 -0
- package/dist/target/worldClock.d.ts +60 -0
- package/dist/target/worldClock.js +129 -0
- package/dist/target/worldReadiness.d.ts +103 -0
- package/dist/target/worldReadiness.js +153 -0
- package/moltnet-releases.json +20 -0
- package/package.json +29 -8
- package/runtimes.yaml +28 -27
- package/dist/runtime/openclaw/scaffold-assets/CLAUDE.md +0 -5
- package/dist/runtime/picoclaw/scaffold-assets/CLAUDE.md +0 -5
- /package/dist/runtime/openclaw/scaffold-assets/{AGENTS.md → WORKSPACE_AGENTS.md} +0 -0
- /package/dist/runtime/picoclaw/scaffold-assets/{AGENTS.md → WORKSPACE_AGENTS.md} +0 -0
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { normalizeProjectLabelSlug } from "../distribution/projectName.js";
|
|
3
|
+
import { createDistributionFingerprint } from "../distribution/fingerprint.js";
|
|
4
|
+
import { WORLD_BINDINGS_IMAGE_PATH } from "../distribution/types.js";
|
|
5
|
+
import { SpawnfileError } from "../shared/index.js";
|
|
6
|
+
import { MAX_ORGANIZATION_AGENT_MEMBERS, ORGANIZATION_MEMBER_ID_PATTERN_SOURCE, resolveCanonicalAgentMemberId } from "./organizationIdentity.js";
|
|
7
|
+
export const ORGANIZATION_READINESS_EVIDENCE_VERSION = "spawnfile.organization-ready-evidence.v1";
|
|
8
|
+
const fail = (message) => {
|
|
9
|
+
throw new SpawnfileError("compile_error", `organization readiness evidence is inconsistent: ${message}`);
|
|
10
|
+
};
|
|
11
|
+
const sha256 = (content) => `sha256:${createHash("sha256").update(content).digest("hex")}`;
|
|
12
|
+
const compareAscii = (left, right) => left < right ? -1 : left > right ? 1 : 0;
|
|
13
|
+
const sort = (values, key) => [...values].sort((left, right) => compareAscii(key(left), key(right)));
|
|
14
|
+
const assertUnique = (values, key, label) => {
|
|
15
|
+
const seen = new Set();
|
|
16
|
+
for (const value of values) {
|
|
17
|
+
const valueKey = key(value);
|
|
18
|
+
if (seen.has(valueKey))
|
|
19
|
+
fail(`duplicate ${label}: ${valueKey}`);
|
|
20
|
+
seen.add(valueKey);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
const freeze = (value, seen = new WeakSet()) => {
|
|
24
|
+
if (value && typeof value === "object") {
|
|
25
|
+
if (seen.has(value))
|
|
26
|
+
return value;
|
|
27
|
+
seen.add(value);
|
|
28
|
+
Object.freeze(value);
|
|
29
|
+
for (const child of Object.values(value))
|
|
30
|
+
freeze(child, seen);
|
|
31
|
+
}
|
|
32
|
+
return value;
|
|
33
|
+
};
|
|
34
|
+
const ID = /^[A-Za-z0-9][A-Za-z0-9_.:-]{0,127}$/u;
|
|
35
|
+
const MEMBER_ID = new RegExp(ORGANIZATION_MEMBER_ID_PATTERN_SOURCE, "u");
|
|
36
|
+
const FINGERPRINT = /^sf1:[a-f0-9]{12}$/u;
|
|
37
|
+
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
38
|
+
const CONFIG_PATH = /^\/var\/lib\/spawnfile\/moltnet\/nodes\/[A-Za-z0-9_.-]+\.json$/u;
|
|
39
|
+
const nodeByMember = (plan) => {
|
|
40
|
+
const members = plan.organizationIdentity?.agentMembers ?? [];
|
|
41
|
+
if (members.length > MAX_ORGANIZATION_AGENT_MEMBERS)
|
|
42
|
+
fail("organization member cardinality exceeds bounds");
|
|
43
|
+
assertUnique(members, (member) => member.memberId, "organization member");
|
|
44
|
+
const result = new Map();
|
|
45
|
+
for (const node of plan.nodes) {
|
|
46
|
+
if (node.kind !== "agent")
|
|
47
|
+
continue;
|
|
48
|
+
assertId(node.id, "organization node id");
|
|
49
|
+
const memberId = resolveCanonicalAgentMemberId(plan, node.value.source);
|
|
50
|
+
if (!memberId)
|
|
51
|
+
continue;
|
|
52
|
+
if (!members.some((member) => member.memberId === memberId) || result.has(memberId)) {
|
|
53
|
+
fail(`organization member ${memberId} does not resolve to exactly one node`);
|
|
54
|
+
}
|
|
55
|
+
result.set(memberId, node.id);
|
|
56
|
+
}
|
|
57
|
+
if (result.size !== members.length)
|
|
58
|
+
fail("organization member cardinality mismatch");
|
|
59
|
+
return result;
|
|
60
|
+
};
|
|
61
|
+
const emittedConfigContent = (artifacts, configPath) => {
|
|
62
|
+
const emittedPath = `container/rootfs${configPath}`;
|
|
63
|
+
const matches = artifacts.files.filter((file) => file.path === emittedPath);
|
|
64
|
+
if (matches.length !== 1)
|
|
65
|
+
fail(`node config ${configPath} is not emitted exactly once`);
|
|
66
|
+
return matches[0].content;
|
|
67
|
+
};
|
|
68
|
+
const attachmentRecords = (plan) => {
|
|
69
|
+
const records = [];
|
|
70
|
+
for (const node of plan.nodes) {
|
|
71
|
+
if (node.kind !== "agent")
|
|
72
|
+
continue;
|
|
73
|
+
const agent = node.value;
|
|
74
|
+
for (const attachment of agent.surfaces?.moltnet ?? []) {
|
|
75
|
+
const memberId = attachment.memberId ?? fail(`Moltnet attachment on ${node.id} has no member`);
|
|
76
|
+
assertId(attachment.network, "Moltnet attachment network id");
|
|
77
|
+
assertMemberId(memberId, "Moltnet attachment member id");
|
|
78
|
+
records.push({
|
|
79
|
+
memberId,
|
|
80
|
+
networkId: attachment.network,
|
|
81
|
+
nodeId: node.id,
|
|
82
|
+
rooms: Object.keys(attachment.rooms ?? {})
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
assertUnique(records, (record) => `${record.networkId}\u0000${record.memberId}`, "Moltnet attachment member");
|
|
87
|
+
assertUnique(records, (record) => `${record.networkId}\u0000${record.nodeId}`, "Moltnet attachment node");
|
|
88
|
+
return records;
|
|
89
|
+
};
|
|
90
|
+
const assertId = (value, label) => {
|
|
91
|
+
if (!ID.test(value)) {
|
|
92
|
+
fail(`${label} is unbounded or noncanonical`);
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
const assertMemberId = (value, label) => {
|
|
96
|
+
if (!MEMBER_ID.test(value))
|
|
97
|
+
fail(`${label} is unbounded or noncanonical`);
|
|
98
|
+
};
|
|
99
|
+
const assertConfigPath = (value) => {
|
|
100
|
+
if (value.length > 255 || !CONFIG_PATH.test(value)) {
|
|
101
|
+
fail(`Moltnet config path is noncanonical: ${value}`);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
const validateMoltnet = (artifacts, plan) => {
|
|
105
|
+
const servers = artifacts?.serverPlans ?? [];
|
|
106
|
+
const nodePlans = artifacts?.nodePlans ?? [];
|
|
107
|
+
const attachments = attachmentRecords(plan);
|
|
108
|
+
assertUnique(servers, (server) => server.networkId, "Moltnet network");
|
|
109
|
+
assertUnique(servers, (server) => server.id, "Moltnet server");
|
|
110
|
+
assertUnique(nodePlans, (node) => node.configPath, "Moltnet node config");
|
|
111
|
+
assertUnique(nodePlans, (node) => `${node.networkId}\u0000${node.memberId ?? ""}`, "Moltnet node member");
|
|
112
|
+
if (!artifacts && attachments.length > 0)
|
|
113
|
+
fail("Moltnet attachments exist without artifacts");
|
|
114
|
+
if (servers.length > MAX_ORGANIZATION_AGENT_MEMBERS || nodePlans.length > MAX_ORGANIZATION_AGENT_MEMBERS
|
|
115
|
+
|| attachments.length > MAX_ORGANIZATION_AGENT_MEMBERS)
|
|
116
|
+
fail("Moltnet topology exceeds organization bounds");
|
|
117
|
+
const serverByNetwork = new Map(servers.map((server) => [server.networkId, server]));
|
|
118
|
+
const attachmentByKey = new Map(attachments.map((attachment) => [
|
|
119
|
+
`${attachment.networkId}\u0000${attachment.memberId}`, attachment
|
|
120
|
+
]));
|
|
121
|
+
const nodeByKey = new Map(nodePlans.map((node) => [
|
|
122
|
+
`${node.networkId}\u0000${node.memberId ?? ""}`, node
|
|
123
|
+
]));
|
|
124
|
+
for (const attachment of attachments) {
|
|
125
|
+
const server = serverByNetwork.get(attachment.networkId)
|
|
126
|
+
?? fail(`Moltnet attachment references nonexistent network ${attachment.networkId}`);
|
|
127
|
+
const rooms = new Map(server.rooms.map((room) => [room.id, room]));
|
|
128
|
+
for (const roomId of attachment.rooms) {
|
|
129
|
+
const room = rooms.get(roomId);
|
|
130
|
+
if (!room || !room.members.includes(attachment.memberId)) {
|
|
131
|
+
fail(`Moltnet attachment room ${attachment.networkId}/${roomId} lacks ${attachment.memberId}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (!nodeByKey.has(`${attachment.networkId}\u0000${attachment.memberId}`)) {
|
|
135
|
+
fail(`Moltnet attachment ${attachment.networkId}/${attachment.memberId} has no node plan`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
for (const node of nodePlans) {
|
|
139
|
+
const memberId = node.memberId ?? fail(`Moltnet node ${node.configPath} has no member`);
|
|
140
|
+
assertConfigPath(node.configPath);
|
|
141
|
+
assertId(node.networkId, "Moltnet node network id");
|
|
142
|
+
assertMemberId(memberId, "Moltnet node member id");
|
|
143
|
+
if (!serverByNetwork.has(node.networkId))
|
|
144
|
+
fail(`Moltnet node references nonexistent network ${node.networkId}`);
|
|
145
|
+
if (!attachmentByKey.has(`${node.networkId}\u0000${node.memberId}`)) {
|
|
146
|
+
fail(`Moltnet node ${node.networkId}/${node.memberId} has no attachment`);
|
|
147
|
+
}
|
|
148
|
+
emittedConfigContent(artifacts, node.configPath);
|
|
149
|
+
}
|
|
150
|
+
for (const membership of plan.moltnetRoomMemberships ?? []) {
|
|
151
|
+
const server = serverByNetwork.get(membership.networkId);
|
|
152
|
+
const room = server?.rooms.filter((candidate) => candidate.id === membership.roomId);
|
|
153
|
+
if (!server || room?.length !== 1 || !room[0].members.includes(membership.concreteMemberId)) {
|
|
154
|
+
fail(`Moltnet room membership ${membership.networkId}/${membership.roomId} lacks ${membership.concreteMemberId}`);
|
|
155
|
+
}
|
|
156
|
+
const attachment = attachmentByKey.get(`${membership.networkId}\u0000${membership.concreteMemberId}`);
|
|
157
|
+
if (!attachment || attachment.nodeId === "" || !attachment.rooms.includes(membership.roomId)) {
|
|
158
|
+
fail(`Moltnet room membership has no concrete attachment`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return sort(servers.map((server) => {
|
|
162
|
+
assertId(server.networkId, "Moltnet network id");
|
|
163
|
+
assertId(server.id, "Moltnet server id");
|
|
164
|
+
if (server.mode === "managed" && (!Number.isInteger(server.port) || server.port < 1 || server.port > 65535)) {
|
|
165
|
+
fail(`Moltnet managed port is invalid for ${server.networkId}`);
|
|
166
|
+
}
|
|
167
|
+
const rooms = sort(server.rooms.map((room) => {
|
|
168
|
+
assertId(room.id, "Moltnet room id");
|
|
169
|
+
assertUnique(room.members, (member) => member, `Moltnet room member on ${server.networkId}/${room.id}`);
|
|
170
|
+
for (const member of room.members)
|
|
171
|
+
assertMemberId(member, `Moltnet room member on ${server.networkId}/${room.id}`);
|
|
172
|
+
return { id: room.id, members: sort(room.members, (member) => member) };
|
|
173
|
+
}), (room) => room.id);
|
|
174
|
+
assertUnique(rooms, (room) => room.id, `Moltnet room on ${server.networkId}`);
|
|
175
|
+
const nodes = sort(nodePlans.filter((node) => node.networkId === server.networkId).map((node) => {
|
|
176
|
+
const attachment = attachmentByKey.get(`${node.networkId}\u0000${node.memberId}`);
|
|
177
|
+
return { configPath: node.configPath, memberId: node.memberId, nodeId: attachment.nodeId,
|
|
178
|
+
sha256: sha256(emittedConfigContent(artifacts, node.configPath)) };
|
|
179
|
+
}), (node) => `${node.memberId}\u0000${node.nodeId}`);
|
|
180
|
+
return { id: server.networkId, internalPort: server.mode === "managed" ? server.port : null,
|
|
181
|
+
mode: server.mode, nodes, rooms };
|
|
182
|
+
}), (network) => network.id);
|
|
183
|
+
};
|
|
184
|
+
export const createOrganizationReadinessEvidence = (input) => {
|
|
185
|
+
const { containerArtifacts, moltnetArtifacts, plan, worldBindings } = input;
|
|
186
|
+
const distribution = containerArtifacts.distribution.report;
|
|
187
|
+
if (input.compileVersion !== "0.1")
|
|
188
|
+
fail("compile version is invalid");
|
|
189
|
+
const { compile_fingerprint: fingerprint, generated_at: _generatedAt, ...distributionBody } = distribution;
|
|
190
|
+
if (!FINGERPRINT.test(fingerprint) || containerArtifacts.distribution.fingerprint !== fingerprint
|
|
191
|
+
|| createDistributionFingerprint(distributionBody) !== fingerprint) {
|
|
192
|
+
fail("compile fingerprint disagrees with canonical distribution report");
|
|
193
|
+
}
|
|
194
|
+
const memberNodes = nodeByMember(plan);
|
|
195
|
+
const organizationMembers = sort([...memberNodes.entries()].map(([memberId, nodeId]) => ({ memberId, nodeId })), (member) => member.memberId);
|
|
196
|
+
assertUnique(organizationMembers, (member) => member.nodeId, "organization node assignment");
|
|
197
|
+
for (const member of organizationMembers) {
|
|
198
|
+
assertMemberId(member.memberId, "organization member id");
|
|
199
|
+
assertId(member.nodeId, "organization node id");
|
|
200
|
+
}
|
|
201
|
+
const worldBindingEvidence = distribution.world_bindings;
|
|
202
|
+
let projectedWorldBindings = null;
|
|
203
|
+
if (worldBindings) {
|
|
204
|
+
const distributionBinding = worldBindingEvidence
|
|
205
|
+
?? fail("distribution world-binding evidence is missing or incompatible");
|
|
206
|
+
if (distributionBinding.artifact_path !== WORLD_BINDINGS_IMAGE_PATH
|
|
207
|
+
|| distributionBinding.schema !== "simfile.world-bindings.v1") {
|
|
208
|
+
fail("distribution world-binding evidence is missing or incompatible");
|
|
209
|
+
}
|
|
210
|
+
const digest = sha256(worldBindings.canonicalBytes);
|
|
211
|
+
if (!DIGEST.test(distributionBinding.digest) || distributionBinding.digest !== digest) {
|
|
212
|
+
fail("distribution world-binding digest disagrees with resolved bindings");
|
|
213
|
+
}
|
|
214
|
+
const assignments = sort(worldBindings.assignments.map((assignment) => ({
|
|
215
|
+
memberId: assignment.binding.member.id,
|
|
216
|
+
nodeId: assignment.nodeId
|
|
217
|
+
})), (assignment) => assignment.memberId);
|
|
218
|
+
assertUnique(assignments, (assignment) => assignment.memberId, "world-binding member");
|
|
219
|
+
assertUnique(assignments, (assignment) => assignment.nodeId, "world-binding node");
|
|
220
|
+
for (const assignment of assignments) {
|
|
221
|
+
assertMemberId(assignment.memberId, "world-binding member id");
|
|
222
|
+
assertId(assignment.nodeId, "world-binding node id");
|
|
223
|
+
}
|
|
224
|
+
if (assignments.length !== organizationMembers.length
|
|
225
|
+
|| assignments.some((assignment, index) => assignment.memberId !== organizationMembers[index]?.memberId
|
|
226
|
+
|| assignment.nodeId !== organizationMembers[index]?.nodeId)) {
|
|
227
|
+
fail("world-binding assignments disagree with resolved organization members");
|
|
228
|
+
}
|
|
229
|
+
projectedWorldBindings = {
|
|
230
|
+
artifactPath: WORLD_BINDINGS_IMAGE_PATH,
|
|
231
|
+
assignments,
|
|
232
|
+
digest,
|
|
233
|
+
schema: "simfile.world-bindings.v1"
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
else if (worldBindingEvidence) {
|
|
237
|
+
fail("distribution contains world-binding evidence without resolved bindings");
|
|
238
|
+
}
|
|
239
|
+
const networks = validateMoltnet(moltnetArtifacts, plan);
|
|
240
|
+
const distributionNetworks = sort(distribution.moltnet.networks, (network) => network.id);
|
|
241
|
+
assertUnique(distributionNetworks, (network) => network.id, "distribution Moltnet network");
|
|
242
|
+
if (distributionNetworks.length !== networks.length || networks.some((network, index) => {
|
|
243
|
+
const distributionNetwork = distributionNetworks[index];
|
|
244
|
+
return distributionNetwork?.id !== network.id || distributionNetwork.server_mode !== network.mode;
|
|
245
|
+
})) {
|
|
246
|
+
fail("distribution Moltnet networks disagree with emitted topology");
|
|
247
|
+
}
|
|
248
|
+
const projectLabel = normalizeProjectLabelSlug(distribution.organization.project);
|
|
249
|
+
if (projectLabel.length > 128 || !ID.test(projectLabel))
|
|
250
|
+
fail("project label is unbounded or noncanonical");
|
|
251
|
+
return freeze({
|
|
252
|
+
compileFingerprint: fingerprint,
|
|
253
|
+
compileVersion: input.compileVersion,
|
|
254
|
+
hasExternalMoltnet: networks.some((network) => network.mode === "external"),
|
|
255
|
+
networks,
|
|
256
|
+
organizationMembers,
|
|
257
|
+
projectLabel,
|
|
258
|
+
version: ORGANIZATION_READINESS_EVIDENCE_VERSION,
|
|
259
|
+
worldBindings: projectedWorldBindings
|
|
260
|
+
});
|
|
261
|
+
};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type InlineAgentMember, type TeamManifest } from "../manifest/index.js";
|
|
2
|
+
export declare const createInlineAgentSource: (teamSource: string, memberId: string) => string;
|
|
3
|
+
export declare const collectProjectManifestPaths: (manifestPath: string, recursive: boolean, visited?: Set<string>) => Promise<string[]>;
|
|
4
|
+
export declare const rewriteInlineAgentMembers: (manifest: TeamManifest, mutate: (member: InlineAgentMember) => InlineAgentMember) => TeamManifest;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { getCanonicalManifestPath, getManifestPath, getProjectRoot } from "../filesystem/index.js";
|
|
3
|
+
import { isReferencedMember, loadManifest } from "../manifest/index.js";
|
|
4
|
+
export const createInlineAgentSource = (teamSource, memberId) => `${teamSource}#member=${encodeURIComponent(memberId)}`;
|
|
5
|
+
export const collectProjectManifestPaths = async (manifestPath, recursive, visited = new Set()) => {
|
|
6
|
+
const canonicalPath = getCanonicalManifestPath(manifestPath);
|
|
7
|
+
if (visited.has(canonicalPath)) {
|
|
8
|
+
return [];
|
|
9
|
+
}
|
|
10
|
+
visited.add(canonicalPath);
|
|
11
|
+
if (!recursive) {
|
|
12
|
+
return [canonicalPath];
|
|
13
|
+
}
|
|
14
|
+
const loadedManifest = await loadManifest(canonicalPath);
|
|
15
|
+
const childRefs = loadedManifest.manifest.kind === "team"
|
|
16
|
+
? loadedManifest.manifest.members.filter(isReferencedMember).map((member) => member.ref)
|
|
17
|
+
: (loadedManifest.manifest.subagents ?? []).map((subagent) => subagent.ref);
|
|
18
|
+
const nestedPaths = await Promise.all(childRefs.map((ref) => collectProjectManifestPaths(getManifestPath(path.resolve(getProjectRoot(canonicalPath), ref)), true, visited)));
|
|
19
|
+
return [canonicalPath, ...nestedPaths.flat()];
|
|
20
|
+
};
|
|
21
|
+
export const rewriteInlineAgentMembers = (manifest, mutate) => ({
|
|
22
|
+
...manifest,
|
|
23
|
+
members: manifest.members.map((member) => isReferencedMember(member) ? member : mutate(member))
|
|
24
|
+
});
|
|
@@ -25,6 +25,10 @@ export interface RunProjectResult extends CompileProjectResult {
|
|
|
25
25
|
}
|
|
26
26
|
export declare const createDockerRunInvocation: (compileResult: CompileProjectResult, imageTag: string, options?: {
|
|
27
27
|
authProfile?: ResolvedAuthProfile | null;
|
|
28
|
+
cliCredential?: {
|
|
29
|
+
name: string;
|
|
30
|
+
value: string;
|
|
31
|
+
};
|
|
28
32
|
containerName?: string;
|
|
29
33
|
detach?: boolean;
|
|
30
34
|
deploymentName?: string;
|
|
@@ -5,11 +5,13 @@ import { requireAuthProfile } from "../auth/index.js";
|
|
|
5
5
|
import { ensureDirectory, fileExists, removeDirectory, writeUtf8File } from "../filesystem/index.js";
|
|
6
6
|
import { appendDockerLabelArgs, createDockerDeploymentLabels, createDockerDeploymentUnitId, createDockerProjectLabel, dockerContextNameForTarget, dockerHostValueForTarget, normalizeDeploymentName, readDeploymentRecordFromOutput, resolveDeploymentRecordPath, verifyDockerDeploymentTarget, writeDockerDeploymentRecordForRun } from "../deployment/index.js";
|
|
7
7
|
import { DEFAULT_OUTPUT_DIRECTORY, SpawnfileError } from "../shared/index.js";
|
|
8
|
+
import { ensureNoopolisRunId, resolveNoopolisRunId } from "../runtime/index.js";
|
|
8
9
|
import { compileProject } from "./compileProject.js";
|
|
9
|
-
import { createDefaultImageTag } from "./buildProject.js";
|
|
10
|
+
import { createDefaultImageTag, resolveDockerBuildArchitecture } from "./buildProject.js";
|
|
10
11
|
import { slugify } from "./helpers.js";
|
|
11
12
|
import { runDockerContainer } from "./runProjectDocker.js";
|
|
12
|
-
import {
|
|
13
|
+
import { executeDockerRunWithSupportCleanup } from "./runProjectLifecycle.js";
|
|
14
|
+
import { assertDeclaredModelAuthSatisfied, assertMoltnetCredentialValuesDistinct, assertRunEnvironmentSatisfied, prepareRuntimeAuthMounts, readRunEnvFile, renderDockerEnvFile, resolveAuthMountArgs, resolveRunEnvironment } from "./runProjectAuth.js";
|
|
13
15
|
export { runDockerContainer };
|
|
14
16
|
const resolveImageTagRoot = (inputPath) => {
|
|
15
17
|
const resolvedPath = path.resolve(inputPath);
|
|
@@ -29,10 +31,14 @@ export const createDockerRunInvocation = async (compileResult, imageTag, options
|
|
|
29
31
|
const supportDirectory = await mkdtemp(path.join(os.tmpdir(), "spawnfile-run-"));
|
|
30
32
|
const envFilePath = path.join(supportDirectory, "run.env");
|
|
31
33
|
try {
|
|
32
|
-
assertDeclaredModelAuthSatisfied(containerReport, options.authProfile ?? null);
|
|
33
|
-
const env = resolveRunEnvironment(containerReport, options.authProfile ?? null,
|
|
34
|
+
assertDeclaredModelAuthSatisfied(containerReport, options.authProfile ?? null, options.cliCredential !== undefined);
|
|
35
|
+
const env = resolveRunEnvironment(containerReport, options.authProfile ?? null, {
|
|
36
|
+
...(await readRunEnvFile(options.envFilePath)),
|
|
37
|
+
...(options.cliCredential ? { [options.cliCredential.name]: options.cliCredential.value } : {})
|
|
38
|
+
});
|
|
34
39
|
const preparedRuntimeAuth = await prepareRuntimeAuthMounts(compileResult.outputDirectory, containerReport, options.authProfile ?? null, env, supportDirectory);
|
|
35
40
|
assertRunEnvironmentSatisfied(containerReport, env, preparedRuntimeAuth.coveredModelSecrets);
|
|
41
|
+
assertMoltnetCredentialValuesDistinct(containerReport, env);
|
|
36
42
|
await ensureDirectory(supportDirectory);
|
|
37
43
|
await writeUtf8File(envFilePath, renderDockerEnvFile(env));
|
|
38
44
|
const deploymentName = options.deploymentName
|
|
@@ -59,16 +65,17 @@ export const createDockerRunInvocation = async (compileResult, imageTag, options
|
|
|
59
65
|
for (const mount of containerReport.persistent_mounts ?? []) {
|
|
60
66
|
args.push("-v", `${mount.volume_name}:${mount.mount_path}`);
|
|
61
67
|
}
|
|
62
|
-
|
|
68
|
+
const deploymentLabels = options.detach && deploymentName ? (() => {
|
|
63
69
|
const compileFingerprint = compileResult.report.compile_fingerprint ?? "sf1:unknown";
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
deployment
|
|
70
|
+
const runId = resolveNoopolisRunId(process.env);
|
|
71
|
+
if (!runId)
|
|
72
|
+
throw new SpawnfileError("runtime_error", "Detached deployment requires a run id for deployment labels");
|
|
73
|
+
return createDockerDeploymentLabels({ compileFingerprint, deployment: deploymentName,
|
|
67
74
|
project: createDockerProjectLabel(compileResult.report.root, compileResult.report.project_name),
|
|
68
|
-
unit: createDockerDeploymentUnitId(deploymentName),
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
75
|
+
runId, unit: createDockerDeploymentUnitId(deploymentName), version: compileResult.report.spawnfile_version });
|
|
76
|
+
})() : undefined;
|
|
77
|
+
if (deploymentLabels)
|
|
78
|
+
appendDockerLabelArgs(args, deploymentLabels);
|
|
72
79
|
args.push("--env-file", envFilePath);
|
|
73
80
|
args.push(...(await resolveAuthMountArgs(containerReport, options.authProfile ?? null)));
|
|
74
81
|
args.push(...preparedRuntimeAuth.mountArgs);
|
|
@@ -80,6 +87,7 @@ export const createDockerRunInvocation = async (compileResult, imageTag, options
|
|
|
80
87
|
cwd: compileResult.outputDirectory,
|
|
81
88
|
detach: options.detach ?? false,
|
|
82
89
|
deploymentName,
|
|
90
|
+
...(deploymentLabels ? { deploymentLabels } : {}),
|
|
83
91
|
dockerContext: options.dockerContext ?? null,
|
|
84
92
|
dockerHost: options.dockerHost ?? null,
|
|
85
93
|
envFilePath,
|
|
@@ -142,9 +150,24 @@ export const runProject = async (inputPath, options = {}) => {
|
|
|
142
150
|
imageTag: options.imageTag,
|
|
143
151
|
targetExecFile: options.targetExecFile
|
|
144
152
|
});
|
|
153
|
+
const targetArchitecture = options.containerArchitecture ??
|
|
154
|
+
await resolveDockerBuildArchitecture({
|
|
155
|
+
dockerCommand: options.dockerCommand,
|
|
156
|
+
dockerContext: resolvedOptions.dockerContext
|
|
157
|
+
});
|
|
158
|
+
// Every authority container compiled for this run must stamp causal
|
|
159
|
+
// events under the same real run id (see specs/CAUSAL.md). compileProject
|
|
160
|
+
// itself stays a deterministic function of the host env; this only fills
|
|
161
|
+
// in a generated id when the host did not already provide one, before the
|
|
162
|
+
// compile step that bakes it into the entrypoint/recipe env.
|
|
163
|
+
ensureNoopolisRunId();
|
|
145
164
|
const compileResult = await compileProject(inputPath, {
|
|
146
165
|
clean: options.clean,
|
|
147
|
-
|
|
166
|
+
containerArchitecture: targetArchitecture,
|
|
167
|
+
outputDirectory: options.outputDirectory,
|
|
168
|
+
...(options.worldBindingsPath !== undefined
|
|
169
|
+
? { worldBindingsPath: options.worldBindingsPath }
|
|
170
|
+
: {})
|
|
148
171
|
});
|
|
149
172
|
const imageTag = resolvedOptions.imageTag ?? createDefaultImageTag(resolveImageTagRoot(inputPath));
|
|
150
173
|
const authProfile = resolvedOptions.authProfile
|
|
@@ -160,15 +183,7 @@ export const runProject = async (inputPath, options = {}) => {
|
|
|
160
183
|
dockerHost: resolvedOptions.dockerHost,
|
|
161
184
|
envFilePath: resolvedOptions.envFilePath
|
|
162
185
|
});
|
|
163
|
-
|
|
164
|
-
try {
|
|
165
|
-
runMetadata = await (options.runRunner ?? runDockerContainer)(invocation);
|
|
166
|
-
}
|
|
167
|
-
finally {
|
|
168
|
-
if (!invocation.detach) {
|
|
169
|
-
await removeDirectory(invocation.supportDirectory);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
186
|
+
const runMetadata = await executeDockerRunWithSupportCleanup(invocation, options.runRunner ?? runDockerContainer);
|
|
172
187
|
const deploymentRecordPath = invocation.detach && invocation.deploymentName
|
|
173
188
|
? await writeDockerDeploymentRecordForRun({
|
|
174
189
|
authProfileName: authProfile?.name ?? null,
|
|
@@ -4,10 +4,16 @@ interface PreparedRunAuth {
|
|
|
4
4
|
coveredModelSecrets: Set<string>;
|
|
5
5
|
mountArgs: string[];
|
|
6
6
|
}
|
|
7
|
+
export declare const resolveHostCliCredential: (containerReport: ContainerReport) => Promise<{
|
|
8
|
+
name: string;
|
|
9
|
+
sourcePath: string;
|
|
10
|
+
value: string;
|
|
11
|
+
} | null>;
|
|
7
12
|
export declare const prepareRuntimeAuthMounts: (outputDirectory: string, containerReport: ContainerReport, authProfile: ResolvedAuthProfile | null, env: Record<string, string>, tempRoot: string) => Promise<PreparedRunAuth>;
|
|
8
|
-
export declare const assertDeclaredModelAuthSatisfied: (containerReport: ContainerReport, authProfile: ResolvedAuthProfile | null) => void;
|
|
13
|
+
export declare const assertDeclaredModelAuthSatisfied: (containerReport: ContainerReport, authProfile: ResolvedAuthProfile | null, cliCredentialProvided?: boolean) => void;
|
|
9
14
|
export declare const resolveRunEnvironment: (containerReport: ContainerReport, authProfile: ResolvedAuthProfile | null, envFileEnv?: Record<string, string>) => Record<string, string>;
|
|
10
15
|
export declare const assertRunEnvironmentSatisfied: (containerReport: ContainerReport, env: Record<string, string>, coveredModelSecrets: Set<string>) => void;
|
|
16
|
+
export declare const assertMoltnetCredentialValuesDistinct: (containerReport: ContainerReport, env: Record<string, string>) => void;
|
|
11
17
|
export declare const renderDockerEnvFile: (env: Record<string, string>) => string;
|
|
12
18
|
export declare const readRunEnvFile: (envFilePath: string | undefined) => Promise<Record<string, string>>;
|
|
13
19
|
export declare const resolveAuthMountArgs: (containerReport: ContainerReport, authProfile: ResolvedAuthProfile | null) => Promise<string[]>;
|
|
@@ -1,24 +1,57 @@
|
|
|
1
|
+
import os from "node:os";
|
|
1
2
|
import path from "node:path";
|
|
2
3
|
import { randomBytes } from "node:crypto";
|
|
3
4
|
import { parseEnvFile } from "../auth/index.js";
|
|
4
5
|
import { fileExists, readUtf8File } from "../filesystem/index.js";
|
|
5
6
|
import { SpawnfileError } from "../shared/index.js";
|
|
6
7
|
import { getRuntimeAdapter } from "../runtime/index.js";
|
|
8
|
+
import { CLI_CREDENTIAL_SECRET_NAME, modelAuthMethodNeedsCliCredential } from "./modelEnv.js";
|
|
7
9
|
const MODEL_AUTH_IMPORT_KINDS = {
|
|
8
10
|
api_key: null,
|
|
9
11
|
"claude-code": "claude-code",
|
|
10
12
|
codex: "codex",
|
|
11
13
|
none: null
|
|
12
14
|
};
|
|
15
|
+
export const resolveHostCliCredential = async (containerReport) => {
|
|
16
|
+
const needsCredential = containerReport.runtime_instances.some((instance) => Object.values(instance.model_auth_methods).some(modelAuthMethodNeedsCliCredential));
|
|
17
|
+
if (!needsCredential) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
const codexHome = process.env.CODEX_HOME || path.join(os.homedir(), ".codex");
|
|
21
|
+
const sourcePath = path.join(codexHome, "auth.json");
|
|
22
|
+
if (!await fileExists(sourcePath)) {
|
|
23
|
+
throw new SpawnfileError("validation_error", `Missing ${CLI_CREDENTIAL_SECRET_NAME}; host CLI credential source does not exist: ${sourcePath}`);
|
|
24
|
+
}
|
|
25
|
+
let value;
|
|
26
|
+
try {
|
|
27
|
+
value = await readUtf8File(sourcePath);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
throw new SpawnfileError("validation_error", `Unable to read ${CLI_CREDENTIAL_SECRET_NAME} from host CLI credential source ${sourcePath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
31
|
+
}
|
|
32
|
+
if (value.trim().length === 0) {
|
|
33
|
+
throw new SpawnfileError("validation_error", `Missing ${CLI_CREDENTIAL_SECRET_NAME}; host CLI credential source is empty: ${sourcePath}`);
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
return { name: CLI_CREDENTIAL_SECRET_NAME, sourcePath, value: JSON.stringify(JSON.parse(value)) };
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
throw new SpawnfileError("validation_error", `Unable to read ${CLI_CREDENTIAL_SECRET_NAME} from host CLI credential source ${sourcePath}: invalid JSON (${error instanceof Error ? error.message : String(error)})`);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
13
42
|
const addCoveredModelSecrets = (coveredModelSecrets, instanceId, secretNames) => {
|
|
14
43
|
for (const secretName of secretNames) {
|
|
15
44
|
coveredModelSecrets.add(`${instanceId}:${secretName}`);
|
|
16
45
|
}
|
|
17
46
|
};
|
|
18
47
|
export const prepareRuntimeAuthMounts = async (outputDirectory, containerReport, authProfile, env, tempRoot) => {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
48
|
+
// No early return when `authProfile` is null: an adapter's
|
|
49
|
+
// `prepareRuntimeAuth` may still have host-credential staging to do that
|
|
50
|
+
// does not depend on an imported Spawnfile auth profile (e.g. the Pi
|
|
51
|
+
// adapter mounting the host's `~/.grok`/`~/.codex`/antigravity CLI homes
|
|
52
|
+
// for a real-engine org — see `src/runtime/pi/runAuth.ts`). Each adapter is
|
|
53
|
+
// responsible for treating a `null` `authProfile` as "no profile-derived
|
|
54
|
+
// imports available" rather than failing.
|
|
22
55
|
const coveredModelSecrets = new Set();
|
|
23
56
|
const mountArgs = [];
|
|
24
57
|
for (const instance of containerReport.runtime_instances) {
|
|
@@ -38,7 +71,7 @@ export const prepareRuntimeAuthMounts = async (outputDirectory, containerReport,
|
|
|
38
71
|
}
|
|
39
72
|
return { coveredModelSecrets, mountArgs };
|
|
40
73
|
};
|
|
41
|
-
export const assertDeclaredModelAuthSatisfied = (containerReport, authProfile) => {
|
|
74
|
+
export const assertDeclaredModelAuthSatisfied = (containerReport, authProfile, cliCredentialProvided = false) => {
|
|
42
75
|
const requiredImportKinds = new Set();
|
|
43
76
|
for (const instance of containerReport.runtime_instances) {
|
|
44
77
|
for (const method of Object.values(instance.model_auth_methods)) {
|
|
@@ -51,9 +84,15 @@ export const assertDeclaredModelAuthSatisfied = (containerReport, authProfile) =
|
|
|
51
84
|
if (requiredImportKinds.size === 0) {
|
|
52
85
|
return;
|
|
53
86
|
}
|
|
54
|
-
if (!authProfile) {
|
|
87
|
+
if (!authProfile && !cliCredentialProvided) {
|
|
55
88
|
throw new SpawnfileError("validation_error", `Auth profile is required for declared model auth methods: ${[...requiredImportKinds].sort().join(", ")}`);
|
|
56
89
|
}
|
|
90
|
+
if (cliCredentialProvided) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (!authProfile) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
57
96
|
const missingImportKinds = [...requiredImportKinds]
|
|
58
97
|
.filter((kind) => !authProfile.imports[kind])
|
|
59
98
|
.sort();
|
|
@@ -62,10 +101,13 @@ export const assertDeclaredModelAuthSatisfied = (containerReport, authProfile) =
|
|
|
62
101
|
}
|
|
63
102
|
};
|
|
64
103
|
const getImportMountTargetName = (kind) => kind === "claude-code" ? ".claude" : ".codex";
|
|
65
|
-
const createGeneratedRuntimeSecret = (secretName) => {
|
|
104
|
+
const createGeneratedRuntimeSecret = (secretName, generatedMoltnetSecrets) => {
|
|
66
105
|
if (secretName === "OPENCLAW_GATEWAY_TOKEN" || secretName === "OPENCLAW_HOOKS_TOKEN") {
|
|
67
106
|
return randomBytes(24).toString("hex");
|
|
68
107
|
}
|
|
108
|
+
if (generatedMoltnetSecrets.has(secretName)) {
|
|
109
|
+
return randomBytes(32).toString("base64url");
|
|
110
|
+
}
|
|
69
111
|
return null;
|
|
70
112
|
};
|
|
71
113
|
const hasEnvValue = (env, name) => typeof env[name] === "string" && env[name].length > 0;
|
|
@@ -93,17 +135,23 @@ export const resolveRunEnvironment = (containerReport, authProfile, envFileEnv =
|
|
|
93
135
|
...(authProfile?.env ?? {}),
|
|
94
136
|
...envFileEnv
|
|
95
137
|
};
|
|
138
|
+
const generatedMoltnetSecrets = new Set((containerReport.moltnet?.server_plans ?? [])
|
|
139
|
+
.filter((server) => server.mode === "managed" && server.auth_mode === "bearer")
|
|
140
|
+
.flatMap((server) => (server.auth_tokens ?? []).map((token) => token.secret)));
|
|
96
141
|
for (const name of new Set([...Object.keys(env), ...containerReport.secrets_required])) {
|
|
97
142
|
const processValue = process.env[name];
|
|
98
143
|
if (typeof processValue === "string" && processValue.length > 0) {
|
|
99
144
|
env[name] = processValue;
|
|
100
145
|
}
|
|
101
146
|
}
|
|
102
|
-
for (const name of
|
|
147
|
+
for (const name of new Set([
|
|
148
|
+
...containerReport.runtime_secrets_required,
|
|
149
|
+
...generatedMoltnetSecrets
|
|
150
|
+
])) {
|
|
103
151
|
if (hasEnvValue(env, name)) {
|
|
104
152
|
continue;
|
|
105
153
|
}
|
|
106
|
-
const generatedValue = createGeneratedRuntimeSecret(name);
|
|
154
|
+
const generatedValue = createGeneratedRuntimeSecret(name, generatedMoltnetSecrets);
|
|
107
155
|
if (generatedValue) {
|
|
108
156
|
env[name] = generatedValue;
|
|
109
157
|
}
|
|
@@ -121,6 +169,27 @@ export const assertRunEnvironmentSatisfied = (containerReport, env, coveredModel
|
|
|
121
169
|
throw new SpawnfileError("validation_error", `Missing required runtime env: ${missing.sort().join(", ")}`);
|
|
122
170
|
}
|
|
123
171
|
};
|
|
172
|
+
export const assertMoltnetCredentialValuesDistinct = (containerReport, env) => {
|
|
173
|
+
for (const server of containerReport.moltnet?.server_plans ?? []) {
|
|
174
|
+
if (server.mode !== "managed" || server.auth_mode !== "bearer") {
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
const secretNames = (server.auth_tokens ?? []).map((token) => token.secret);
|
|
178
|
+
const normalizedValues = secretNames.map((name) => {
|
|
179
|
+
const value = env[name];
|
|
180
|
+
if (typeof value !== "string" || value.trim().length === 0) {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
if (value !== value.trim()) {
|
|
184
|
+
throw new SpawnfileError("validation_error", `Moltnet credential ${name} must not contain leading or trailing whitespace`);
|
|
185
|
+
}
|
|
186
|
+
return value;
|
|
187
|
+
}).filter((value) => value !== null);
|
|
188
|
+
if (new Set(normalizedValues).size !== normalizedValues.length) {
|
|
189
|
+
throw new SpawnfileError("validation_error", `Moltnet network ${server.network_id} requires distinct credential values`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
};
|
|
124
193
|
export const renderDockerEnvFile = (env) => `${Object.entries(env)
|
|
125
194
|
.sort(([left], [right]) => left.localeCompare(right))
|
|
126
195
|
.map(([name, value]) => `${name}=${value}`)
|
|
@@ -142,6 +211,15 @@ export const resolveAuthMountArgs = async (containerReport, authProfile) => {
|
|
|
142
211
|
return [];
|
|
143
212
|
}
|
|
144
213
|
const args = [];
|
|
214
|
+
// Pi owns its model and CLI-engine auth projection in preparePiRuntimeAuth.
|
|
215
|
+
// Mounting the generic imported home onto the same destination would create
|
|
216
|
+
// duplicate Docker mount points and bypass the adapter's minimal-file staging.
|
|
217
|
+
const piRuntimeHomes = new Set(containerReport.runtime_instances
|
|
218
|
+
.filter((instance) => instance.runtime === "pi" || instance.runtime === "daimon")
|
|
219
|
+
.map((instance) => instance.home_path)
|
|
220
|
+
.filter((homePath) => homePath !== null));
|
|
221
|
+
const genericRuntimeHomes = containerReport.runtime_homes
|
|
222
|
+
.filter((runtimeHome) => !piRuntimeHomes.has(runtimeHome));
|
|
145
223
|
for (const [kind, entry] of Object.entries(authProfile.imports)) {
|
|
146
224
|
if (!entry) {
|
|
147
225
|
continue;
|
|
@@ -149,7 +227,7 @@ export const resolveAuthMountArgs = async (containerReport, authProfile) => {
|
|
|
149
227
|
if (!(await fileExists(entry.path))) {
|
|
150
228
|
throw new SpawnfileError("validation_error", `Imported auth path for ${kind} does not exist: ${entry.path}`);
|
|
151
229
|
}
|
|
152
|
-
for (const runtimeHome of
|
|
230
|
+
for (const runtimeHome of genericRuntimeHomes) {
|
|
153
231
|
args.push("-v", `${entry.path}:${path.posix.join(runtimeHome, getImportMountTargetName(kind))}`);
|
|
154
232
|
}
|
|
155
233
|
}
|
|
@@ -5,15 +5,22 @@ export interface DockerRunInvocation {
|
|
|
5
5
|
cwd: string;
|
|
6
6
|
detach: boolean;
|
|
7
7
|
deploymentName?: string | null;
|
|
8
|
+
deploymentLabels?: Readonly<Record<string, string>>;
|
|
8
9
|
dockerContext?: string | null;
|
|
9
10
|
dockerHost?: string | null;
|
|
10
11
|
envFilePath: string;
|
|
11
12
|
imageTag: string;
|
|
13
|
+
onDetachedStarted?: (result: {
|
|
14
|
+
containerId: string;
|
|
15
|
+
}) => Promise<void>;
|
|
12
16
|
supportDirectory: string;
|
|
13
17
|
}
|
|
14
18
|
export interface DockerRunResult {
|
|
15
19
|
containerId?: string;
|
|
20
|
+
deploymentLabels?: Readonly<Record<string, string>>;
|
|
16
21
|
imageId?: string;
|
|
17
22
|
}
|
|
18
23
|
export type DockerRunRunner = (invocation: DockerRunInvocation) => Promise<DockerRunResult | void>;
|
|
24
|
+
export declare const createDetachedContainerInspectArgs: (invocation: DockerRunInvocation, containerId: string) => string[];
|
|
25
|
+
export declare const parseDetachedContainerInspect: (stdout: string, expectedContainerId: string, expectedLabels?: Readonly<Record<string, string>>) => DockerRunResult;
|
|
19
26
|
export declare const runDockerContainer: DockerRunRunner;
|