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,5 +1,7 @@
|
|
|
1
1
|
import { SpawnfileError } from "../shared/index.js";
|
|
2
2
|
import { resolveTeamRepresentatives } from "./moltnetRepresentativeResolution.js";
|
|
3
|
+
import { resolveCanonicalAgentMemberId } from "./organizationIdentity.js";
|
|
4
|
+
import { isAttachedExternalRoomMember } from "./buildCompilePlanTeams.js";
|
|
3
5
|
const hasOwn = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
4
6
|
const findAgentBySource = (plan, source) => {
|
|
5
7
|
const node = plan.nodes.find((entry) => entry.kind === "agent" && entry.value.source === source);
|
|
@@ -18,6 +20,19 @@ const findTeamBySource = (plan, source) => {
|
|
|
18
20
|
const clonePolicy = (policy) => ({
|
|
19
21
|
...(policy.wake ? { wake: policy.wake } : {})
|
|
20
22
|
});
|
|
23
|
+
const defaultNestedRepresentativePolicy = () => ({
|
|
24
|
+
wake: "mentions"
|
|
25
|
+
});
|
|
26
|
+
const resolveConcreteMemberId = (plan, agentSource, authoredMemberId) => {
|
|
27
|
+
if (!plan.organizationIdentity)
|
|
28
|
+
return authoredMemberId;
|
|
29
|
+
const canonicalMemberId = resolveCanonicalAgentMemberId(plan, agentSource);
|
|
30
|
+
if (!canonicalMemberId ||
|
|
31
|
+
plan.organizationIdentity.agentMembers.filter((member) => member.memberId === canonicalMemberId).length !== 1) {
|
|
32
|
+
throw new SpawnfileError("validation_error", `Unable to resolve exactly one canonical Moltnet member id for ${agentSource}`);
|
|
33
|
+
}
|
|
34
|
+
return canonicalMemberId;
|
|
35
|
+
};
|
|
21
36
|
const findDirectRoomPolicy = (plan, teamNode, agentSource, memberId, networkId, roomId) => {
|
|
22
37
|
const agentNode = findAgentBySource(plan, agentSource);
|
|
23
38
|
for (const attachment of agentNode.surfaces?.moltnet ?? []) {
|
|
@@ -47,23 +62,31 @@ const compareRoomMemberships = (left, right) => [
|
|
|
47
62
|
left.agentSource.localeCompare(right.agentSource)
|
|
48
63
|
].find((result) => result !== 0) ?? 0;
|
|
49
64
|
export const listConcreteMoltnetRoomMemberIds = (plan, teamNode, networkId, room, memberships = plan.moltnetRoomMemberships) => {
|
|
65
|
+
const externalMembers = room.members.filter((memberId) => isAttachedExternalRoomMember(teamNode, networkId, memberId));
|
|
50
66
|
if (memberships) {
|
|
51
67
|
return [
|
|
52
|
-
...new Set(
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
68
|
+
...new Set([
|
|
69
|
+
...memberships
|
|
70
|
+
.filter((membership) => membership.declaringTeamSource === teamNode.source
|
|
71
|
+
&& membership.networkId === networkId
|
|
72
|
+
&& membership.roomId === room.id)
|
|
73
|
+
.map((membership) => membership.concreteMemberId),
|
|
74
|
+
...externalMembers
|
|
75
|
+
])
|
|
57
76
|
].sort();
|
|
58
77
|
}
|
|
59
78
|
const concreteMembers = [];
|
|
60
79
|
for (const declaredSlot of room.members) {
|
|
61
80
|
const member = teamNode.members.find((entry) => entry.id === declaredSlot);
|
|
62
81
|
if (!member) {
|
|
82
|
+
if (isAttachedExternalRoomMember(teamNode, networkId, declaredSlot)) {
|
|
83
|
+
concreteMembers.push(declaredSlot);
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
63
86
|
throw new SpawnfileError("validation_error", `Team ${teamNode.name} Moltnet room ${room.id} references unknown member ${declaredSlot}`);
|
|
64
87
|
}
|
|
65
88
|
if (member.kind === "agent") {
|
|
66
|
-
concreteMembers.push(member.id);
|
|
89
|
+
concreteMembers.push(resolveConcreteMemberId(plan, member.nodeSource, member.id));
|
|
67
90
|
continue;
|
|
68
91
|
}
|
|
69
92
|
const childTeam = findTeamBySource(plan, member.nodeSource);
|
|
@@ -71,7 +94,7 @@ export const listConcreteMoltnetRoomMemberIds = (plan, teamNode, networkId, room
|
|
|
71
94
|
if (representatives.length === 0) {
|
|
72
95
|
throw new SpawnfileError("validation_error", `Team ${childTeam.name} has no concrete representative for Moltnet room ${room.id} on ${teamNode.name}`);
|
|
73
96
|
}
|
|
74
|
-
concreteMembers.push(...representatives.map((representative) => representative.memberId));
|
|
97
|
+
concreteMembers.push(...representatives.map((representative) => resolveConcreteMemberId(plan, representative.agentSource, representative.memberId)));
|
|
75
98
|
}
|
|
76
99
|
return [...new Set(concreteMembers)].sort();
|
|
77
100
|
};
|
|
@@ -87,6 +110,9 @@ export const resolveMoltnetRoomMemberships = (plan) => {
|
|
|
87
110
|
for (const declaredSlot of room.members) {
|
|
88
111
|
const declaredMember = teamNode.members.find((member) => member.id === declaredSlot);
|
|
89
112
|
if (!declaredMember) {
|
|
113
|
+
if (isAttachedExternalRoomMember(teamNode, network.id, declaredSlot)) {
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
90
116
|
throw new SpawnfileError("validation_error", `Team ${teamNode.name} Moltnet room ${room.id} references unknown member ${declaredSlot}`);
|
|
91
117
|
}
|
|
92
118
|
if (declaredMember.kind === "agent") {
|
|
@@ -95,7 +121,7 @@ export const resolveMoltnetRoomMemberships = (plan) => {
|
|
|
95
121
|
memberships.push({
|
|
96
122
|
agentName: agentNode.name,
|
|
97
123
|
agentSource: agentNode.source,
|
|
98
|
-
concreteMemberId: declaredSlot,
|
|
124
|
+
concreteMemberId: resolveConcreteMemberId(plan, agentNode.source, declaredSlot),
|
|
99
125
|
declaredSlot,
|
|
100
126
|
declaringTeamName: teamNode.name,
|
|
101
127
|
declaringTeamSource: teamNode.source,
|
|
@@ -114,10 +140,11 @@ export const resolveMoltnetRoomMemberships = (plan) => {
|
|
|
114
140
|
}
|
|
115
141
|
for (const representative of representatives) {
|
|
116
142
|
const agentNode = findAgentBySource(plan, representative.agentSource);
|
|
143
|
+
const policy = findDirectRoomPolicy(plan, teamNode, agentNode.source, representative.memberId, network.id, room.id) ?? defaultNestedRepresentativePolicy();
|
|
117
144
|
memberships.push({
|
|
118
145
|
agentName: agentNode.name,
|
|
119
146
|
agentSource: agentNode.source,
|
|
120
|
-
concreteMemberId: representative.memberId,
|
|
147
|
+
concreteMemberId: resolveConcreteMemberId(plan, representative.agentSource, representative.memberId),
|
|
121
148
|
declaredSlot,
|
|
122
149
|
declaringTeamName: teamNode.name,
|
|
123
150
|
declaringTeamSource: teamNode.source,
|
|
@@ -128,6 +155,7 @@ export const resolveMoltnetRoomMemberships = (plan) => {
|
|
|
128
155
|
representedTeamName: childTeam.name,
|
|
129
156
|
representedTeamSource: childTeam.source,
|
|
130
157
|
representativePath: [declaredSlot, ...representative.path],
|
|
158
|
+
...(policy ? { policy } : {}),
|
|
131
159
|
roomId: room.id
|
|
132
160
|
});
|
|
133
161
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { MoltnetServerPlan } from "./moltnetArtifactTypes.js";
|
|
2
|
+
import type { CompilePlan, ResolvedTeamNode } from "./types.js";
|
|
3
|
+
interface TeamPlanNode {
|
|
4
|
+
id: string;
|
|
5
|
+
slug: string;
|
|
6
|
+
value: ResolvedTeamNode;
|
|
7
|
+
}
|
|
8
|
+
export declare const resolveMoltnetServerPlans: (plan: CompilePlan, teamNodes: readonly TeamPlanNode[]) => Map<string, MoltnetServerPlan>;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { SpawnfileError } from "../shared/index.js";
|
|
2
|
+
import { createMoltnetServerConfigPath, resolveMoltnetBaseUrl } from "./moltnetConfigLowering.js";
|
|
3
|
+
import { listConcreteMoltnetRoomMemberIds } from "./moltnetRoomMemberships.js";
|
|
4
|
+
import { assertCompatibleMoltnetNetworkName, assertCompatibleMoltnetRoomPolicy, assertCompatibleMoltnetServer } from "./moltnetRoomPolicyCompatibility.js";
|
|
5
|
+
import { resolveNetworkPort, toContainerRootfsPath } from "./moltnetArtifactPaths.js";
|
|
6
|
+
const DEFAULT_MOLTNET_PORT = 8787;
|
|
7
|
+
const orderedDeclarations = (teamNodes) => [...teamNodes]
|
|
8
|
+
.sort((left, right) => left.value.source.localeCompare(right.value.source))
|
|
9
|
+
.flatMap((team) => [...(team.value.networks ?? [])]
|
|
10
|
+
.sort((left, right) => left.id.localeCompare(right.id))
|
|
11
|
+
.map((network) => ({ network, team })));
|
|
12
|
+
const organizationTeamIds = (plan) => {
|
|
13
|
+
const root = plan.nodes.find((node) => node.kind === "team" && node.value.source === plan.root);
|
|
14
|
+
if (!root)
|
|
15
|
+
return new Set();
|
|
16
|
+
const ids = new Set([root.id]);
|
|
17
|
+
const pending = [root.id];
|
|
18
|
+
while (pending.length > 0) {
|
|
19
|
+
const parent = pending.shift();
|
|
20
|
+
for (const edge of plan.edges.filter((entry) => entry.kind === "team_member" && entry.from === parent)) {
|
|
21
|
+
const child = plan.nodes.find((node) => node.id === edge.to);
|
|
22
|
+
if (!child || child.kind !== "team" || ids.has(child.id))
|
|
23
|
+
continue;
|
|
24
|
+
ids.add(child.id);
|
|
25
|
+
pending.push(child.id);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return ids;
|
|
29
|
+
};
|
|
30
|
+
const assertCompatibleOwner = (existing, declaration) => {
|
|
31
|
+
const { network } = declaration;
|
|
32
|
+
const server = network.server;
|
|
33
|
+
if (!server)
|
|
34
|
+
return;
|
|
35
|
+
if (existing.baseUrl !== resolveMoltnetBaseUrl(server)) {
|
|
36
|
+
throw new SpawnfileError("validation_error", `Duplicate Moltnet network ${network.id} declares conflicting server URL`);
|
|
37
|
+
}
|
|
38
|
+
assertCompatibleMoltnetNetworkName(network.id, existing.name, network.name);
|
|
39
|
+
assertCompatibleMoltnetServer(network.id, existing.server, server);
|
|
40
|
+
};
|
|
41
|
+
const createOwnedPlan = (declaration, fallbackPort) => {
|
|
42
|
+
const { network, team } = declaration;
|
|
43
|
+
const server = network.server;
|
|
44
|
+
if (!server) {
|
|
45
|
+
throw new SpawnfileError("validation_error", `Moltnet network ${network.id} must declare server`);
|
|
46
|
+
}
|
|
47
|
+
const port = server.mode === "managed"
|
|
48
|
+
? resolveNetworkPort(network, fallbackPort)
|
|
49
|
+
: undefined;
|
|
50
|
+
const serverId = `${team.slug}-${network.id}`;
|
|
51
|
+
return {
|
|
52
|
+
baseUrl: resolveMoltnetBaseUrl(server),
|
|
53
|
+
...(server.mode === "managed"
|
|
54
|
+
? { configPath: toContainerRootfsPath(createMoltnetServerConfigPath(serverId)) }
|
|
55
|
+
: {}),
|
|
56
|
+
id: serverId,
|
|
57
|
+
mode: server.mode,
|
|
58
|
+
name: network.name,
|
|
59
|
+
networkId: network.id,
|
|
60
|
+
...(port ? { port } : {}),
|
|
61
|
+
rooms: [],
|
|
62
|
+
server,
|
|
63
|
+
secretPatches: [],
|
|
64
|
+
teamSource: team.value.source
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
const mergeRooms = (plan, serverPlan, declaration) => {
|
|
68
|
+
const { network, team } = declaration;
|
|
69
|
+
for (const room of network.rooms) {
|
|
70
|
+
const concreteMembers = listConcreteMoltnetRoomMemberIds(plan, team.value, network.id, room);
|
|
71
|
+
const existingRoom = serverPlan.rooms.find((entry) => entry.id === room.id);
|
|
72
|
+
if (!existingRoom) {
|
|
73
|
+
serverPlan.rooms.push({
|
|
74
|
+
id: room.id,
|
|
75
|
+
members: concreteMembers,
|
|
76
|
+
...(room.name ? { name: room.name } : {}),
|
|
77
|
+
...(room.visibility ? { visibility: room.visibility } : {}),
|
|
78
|
+
...(room.write_policy ? { write_policy: room.write_policy } : {})
|
|
79
|
+
});
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
existingRoom.members = [
|
|
83
|
+
...new Set([...existingRoom.members, ...concreteMembers])
|
|
84
|
+
].sort();
|
|
85
|
+
assertCompatibleMoltnetRoomPolicy(network.id, room.id, "visibility", existingRoom.visibility, room.visibility);
|
|
86
|
+
assertCompatibleMoltnetRoomPolicy(network.id, room.id, "write_policy", existingRoom.write_policy, room.write_policy);
|
|
87
|
+
existingRoom.visibility ??= room.visibility;
|
|
88
|
+
existingRoom.write_policy ??= room.write_policy;
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
export const resolveMoltnetServerPlans = (plan, teamNodes) => {
|
|
92
|
+
const organizationIds = plan.organizationIdentity
|
|
93
|
+
? organizationTeamIds(plan)
|
|
94
|
+
: undefined;
|
|
95
|
+
const declarations = orderedDeclarations(organizationIds
|
|
96
|
+
? teamNodes.filter((team) => organizationIds.has(team.id))
|
|
97
|
+
: teamNodes);
|
|
98
|
+
const ownerlessRoot = declarations.find((declaration) => declaration.team.value.source === plan.root && !declaration.network.server);
|
|
99
|
+
if (ownerlessRoot) {
|
|
100
|
+
throw new SpawnfileError("validation_error", `Root Moltnet network ${ownerlessRoot.network.id} must declare a server owner`);
|
|
101
|
+
}
|
|
102
|
+
const serverPlans = new Map();
|
|
103
|
+
let nextPort = DEFAULT_MOLTNET_PORT;
|
|
104
|
+
for (const declaration of declarations) {
|
|
105
|
+
if (!declaration.network.server)
|
|
106
|
+
continue;
|
|
107
|
+
const existing = serverPlans.get(declaration.network.id);
|
|
108
|
+
if (existing) {
|
|
109
|
+
assertCompatibleOwner(existing, declaration);
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const serverPlan = createOwnedPlan(declaration, nextPort);
|
|
113
|
+
serverPlans.set(declaration.network.id, serverPlan);
|
|
114
|
+
if (serverPlan.port)
|
|
115
|
+
nextPort = Math.max(nextPort, serverPlan.port + 1);
|
|
116
|
+
}
|
|
117
|
+
const declarationCounts = new Map();
|
|
118
|
+
for (const declaration of declarations) {
|
|
119
|
+
const networkId = declaration.network.id;
|
|
120
|
+
const serverPlan = serverPlans.get(networkId);
|
|
121
|
+
if (!serverPlan) {
|
|
122
|
+
throw new SpawnfileError("validation_error", `Moltnet network ${networkId} must resolve to at least one server owner`);
|
|
123
|
+
}
|
|
124
|
+
declarationCounts.set(networkId, (declarationCounts.get(networkId) ?? 0) + 1);
|
|
125
|
+
mergeRooms(plan, serverPlan, declaration);
|
|
126
|
+
}
|
|
127
|
+
for (const [networkId, count] of declarationCounts) {
|
|
128
|
+
if (count > 1)
|
|
129
|
+
serverPlans.get(networkId)?.rooms.sort((left, right) => left.id.localeCompare(right.id));
|
|
130
|
+
}
|
|
131
|
+
return serverPlans;
|
|
132
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { CompilePlan, MoltnetExternalParticipantIntent } from "./types.js";
|
|
2
|
+
export declare const ORGANIZATION_ID_SEGMENT_PATTERN_SOURCE = "^[a-z][a-z0-9-]{0,62}$";
|
|
3
|
+
export declare const ORGANIZATION_MEMBER_ID_PATTERN_SOURCE = "^[a-z][a-z0-9-]{0,62}(\\.[a-z][a-z0-9-]{0,62}){0,7}$";
|
|
4
|
+
export declare const MAX_ORGANIZATION_MEMBER_DEPTH = 8;
|
|
5
|
+
export declare const MAX_ORGANIZATION_MEMBER_ID_BYTES = 255;
|
|
6
|
+
export declare const MAX_ORGANIZATION_AGENT_MEMBERS = 128;
|
|
7
|
+
export declare const MAX_EXTERNAL_PARTICIPANTS = 32;
|
|
8
|
+
export interface ResolvedOrganizationAgentMember {
|
|
9
|
+
readonly authoredMemberKey: string;
|
|
10
|
+
readonly kind: "agent";
|
|
11
|
+
readonly memberId: string;
|
|
12
|
+
readonly principalId: string;
|
|
13
|
+
}
|
|
14
|
+
export interface ResolvedExternalParticipant {
|
|
15
|
+
readonly authoredParticipantKey: string;
|
|
16
|
+
readonly kind: "service";
|
|
17
|
+
readonly memberId: string;
|
|
18
|
+
readonly principalId: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ResolvedOrganizationIdentity {
|
|
21
|
+
readonly agentMembers: readonly ResolvedOrganizationAgentMember[];
|
|
22
|
+
readonly externalParticipants: readonly ResolvedExternalParticipant[];
|
|
23
|
+
}
|
|
24
|
+
export declare const resolveCanonicalAgentMemberId: (plan: CompilePlan, agentSource: string) => string | undefined;
|
|
25
|
+
export declare const resolveOrganizationIdentity: (plan: CompilePlan) => ResolvedOrganizationIdentity | undefined;
|
|
26
|
+
export declare const validateB31MoltnetAuth: (plan: CompilePlan) => void;
|
|
27
|
+
export declare const resolveMoltnetExternalParticipantIntents: (plan: CompilePlan) => MoltnetExternalParticipantIntent[];
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import { SpawnfileError } from "../shared/index.js";
|
|
2
|
+
export const ORGANIZATION_ID_SEGMENT_PATTERN_SOURCE = "^[a-z][a-z0-9-]{0,62}$";
|
|
3
|
+
export const ORGANIZATION_MEMBER_ID_PATTERN_SOURCE = "^[a-z][a-z0-9-]{0,62}(\\.[a-z][a-z0-9-]{0,62}){0,7}$";
|
|
4
|
+
export const MAX_ORGANIZATION_MEMBER_DEPTH = 8;
|
|
5
|
+
export const MAX_ORGANIZATION_MEMBER_ID_BYTES = 255;
|
|
6
|
+
export const MAX_ORGANIZATION_AGENT_MEMBERS = 128;
|
|
7
|
+
export const MAX_EXTERNAL_PARTICIPANTS = 32;
|
|
8
|
+
const segment = new RegExp(ORGANIZATION_ID_SEGMENT_PATTERN_SOURCE, "u");
|
|
9
|
+
const memberIdPattern = new RegExp(ORGANIZATION_MEMBER_ID_PATTERN_SOURCE, "u");
|
|
10
|
+
const fail = (message) => { throw new SpawnfileError("validation_error", message); };
|
|
11
|
+
const required = (value, message) => value == null ? fail(message) : value;
|
|
12
|
+
const assertSegment = (value, label) => {
|
|
13
|
+
if (!segment.test(value))
|
|
14
|
+
fail(`${label} must match ${ORGANIZATION_ID_SEGMENT_PATTERN_SOURCE}`);
|
|
15
|
+
};
|
|
16
|
+
const freeze = (value) => {
|
|
17
|
+
if (value && typeof value === "object") {
|
|
18
|
+
Object.freeze(value);
|
|
19
|
+
for (const child of Object.values(value))
|
|
20
|
+
freeze(child);
|
|
21
|
+
}
|
|
22
|
+
return value;
|
|
23
|
+
};
|
|
24
|
+
const byAscii = (left, right) => left < right ? -1 : left > right ? 1 : 0;
|
|
25
|
+
const exact = (actual, expected) => actual?.length === expected.length && actual.every((value, index) => value === expected[index]);
|
|
26
|
+
const teamNodes = (plan) => new Map(plan.nodes.filter((node) => node.kind === "team").map((node) => [node.value.source, node.value]));
|
|
27
|
+
const rootTeam = (plan) => {
|
|
28
|
+
const node = plan.nodes.find((entry) => entry.id === plan.root || entry.value.source === plan.root);
|
|
29
|
+
return node?.value.kind === "team" ? node.value : undefined;
|
|
30
|
+
};
|
|
31
|
+
const pathsToAgents = (plan) => {
|
|
32
|
+
const teams = teamNodes(plan);
|
|
33
|
+
const edges = plan.edges.filter((edge) => edge.kind === "team_member");
|
|
34
|
+
const paths = new Map();
|
|
35
|
+
const teamPaths = new Map();
|
|
36
|
+
const visitedNodeIds = new Set();
|
|
37
|
+
const walk = (source, prefix, seen) => {
|
|
38
|
+
if (seen.has(source))
|
|
39
|
+
fail(`organization member graph cycle at ${source}`);
|
|
40
|
+
const team = teams.get(source);
|
|
41
|
+
if (!team)
|
|
42
|
+
return;
|
|
43
|
+
const priorTeamPath = teamPaths.get(source);
|
|
44
|
+
if (priorTeamPath)
|
|
45
|
+
fail(`team is reached through multiple organization paths: ${source}`);
|
|
46
|
+
teamPaths.set(source, prefix);
|
|
47
|
+
const node = plan.nodes.find((entry) => entry.value.source === source);
|
|
48
|
+
if (!node || node.kind !== "team")
|
|
49
|
+
return fail(`organization graph references missing team ${source}`);
|
|
50
|
+
const resolvedNode = node;
|
|
51
|
+
visitedNodeIds.add(resolvedNode.id);
|
|
52
|
+
const outgoing = edges
|
|
53
|
+
.filter((entry) => entry.from === resolvedNode.id)
|
|
54
|
+
.sort((left, right) => byAscii(left.label, right.label));
|
|
55
|
+
const memberSlots = new Set(team.members.map((member) => member.id));
|
|
56
|
+
if (memberSlots.size !== team.members.length || outgoing.length !== team.members.length) {
|
|
57
|
+
fail(`organization graph cardinality mismatch for team ${team.name}`);
|
|
58
|
+
}
|
|
59
|
+
const localSlots = new Set();
|
|
60
|
+
for (const edge of outgoing) {
|
|
61
|
+
if (localSlots.has(edge.label))
|
|
62
|
+
fail(`duplicate organization member slot: ${edge.label}`);
|
|
63
|
+
localSlots.add(edge.label);
|
|
64
|
+
assertSegment(edge.label, "organization member slot");
|
|
65
|
+
const next = [...prefix, edge.label];
|
|
66
|
+
if (next.length > MAX_ORGANIZATION_MEMBER_DEPTH)
|
|
67
|
+
fail("organization member depth exceeds 8");
|
|
68
|
+
const child = plan.nodes.find((node) => node.id === edge.to);
|
|
69
|
+
if (!child)
|
|
70
|
+
throw new SpawnfileError("validation_error", `organization graph references missing node ${edge.to}`);
|
|
71
|
+
const resolvedChild = child;
|
|
72
|
+
const member = team.members.find((entry) => entry.id === edge.label);
|
|
73
|
+
if (!member || member.kind !== resolvedChild.kind || member.nodeSource !== resolvedChild.value.source) {
|
|
74
|
+
fail(`organization graph member edge mismatch: ${edge.label}`);
|
|
75
|
+
}
|
|
76
|
+
if (resolvedChild.kind === "agent") {
|
|
77
|
+
const previous = paths.get(resolvedChild.value.source);
|
|
78
|
+
if (previous)
|
|
79
|
+
fail(`agent source is reached through multiple organization paths: ${resolvedChild.value.source}`);
|
|
80
|
+
paths.set(resolvedChild.value.source, next);
|
|
81
|
+
visitedNodeIds.add(resolvedChild.id);
|
|
82
|
+
}
|
|
83
|
+
else
|
|
84
|
+
walk(resolvedChild.value.source, next, new Set([...seen, source]));
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
walk(plan.root, [], new Set());
|
|
88
|
+
const rootNode = plan.nodes.find((node) => node.value.source === plan.root);
|
|
89
|
+
const organizationNodeIds = new Set(rootNode ? [rootNode.id] : []);
|
|
90
|
+
for (const edge of edges) {
|
|
91
|
+
organizationNodeIds.add(edge.from);
|
|
92
|
+
organizationNodeIds.add(edge.to);
|
|
93
|
+
}
|
|
94
|
+
const extra = plan.nodes.find((node) => organizationNodeIds.has(node.id) && !visitedNodeIds.has(node.id));
|
|
95
|
+
if (extra)
|
|
96
|
+
fail(`unreachable organization graph node: ${extra.id}`);
|
|
97
|
+
return paths;
|
|
98
|
+
};
|
|
99
|
+
export const resolveCanonicalAgentMemberId = (plan, agentSource) => {
|
|
100
|
+
const identity = plan.organizationIdentity;
|
|
101
|
+
if (!identity)
|
|
102
|
+
return undefined;
|
|
103
|
+
const path = pathsToAgents(plan).get(agentSource);
|
|
104
|
+
return path?.join(".");
|
|
105
|
+
};
|
|
106
|
+
export const resolveOrganizationIdentity = (plan) => {
|
|
107
|
+
const root = rootTeam(plan);
|
|
108
|
+
const declaredTeams = plan.nodes.filter((node) => node.kind === "team" && node.value.externalParticipants !== undefined);
|
|
109
|
+
if (declaredTeams.some((node) => node.value.source !== root?.source)) {
|
|
110
|
+
fail("external_participants may only be declared on the root team");
|
|
111
|
+
}
|
|
112
|
+
if (!root?.externalParticipants)
|
|
113
|
+
return undefined;
|
|
114
|
+
const paths = pathsToAgents(plan);
|
|
115
|
+
const agents = [];
|
|
116
|
+
const agentIds = new Set();
|
|
117
|
+
for (const node of plan.nodes.filter((entry) => entry.kind === "agent")) {
|
|
118
|
+
const path = paths.get(node.value.source);
|
|
119
|
+
if (!path)
|
|
120
|
+
continue;
|
|
121
|
+
if (path.length > MAX_ORGANIZATION_MEMBER_DEPTH)
|
|
122
|
+
fail("organization member depth exceeds 8");
|
|
123
|
+
path.forEach((part) => assertSegment(part, "organization member slot"));
|
|
124
|
+
const memberId = path.join(".");
|
|
125
|
+
if (!memberIdPattern.test(memberId) || Buffer.byteLength(memberId, "ascii") > MAX_ORGANIZATION_MEMBER_ID_BYTES)
|
|
126
|
+
fail(`invalid organization member id: ${memberId}`);
|
|
127
|
+
if (agentIds.has(memberId))
|
|
128
|
+
fail(`duplicate organization member id: ${memberId}`);
|
|
129
|
+
agentIds.add(memberId);
|
|
130
|
+
agents.push({ authoredMemberKey: path.at(-1), kind: "agent", memberId, principalId: `agent:${memberId}` });
|
|
131
|
+
}
|
|
132
|
+
if (agents.length > MAX_ORGANIZATION_AGENT_MEMBERS)
|
|
133
|
+
fail("organization has too many agent members");
|
|
134
|
+
const seen = new Set();
|
|
135
|
+
const externalParticipants = root.externalParticipants.map((service) => {
|
|
136
|
+
assertSegment(service.id, "external participant id");
|
|
137
|
+
if (seen.has(service.id))
|
|
138
|
+
fail(`organization member collision: ${service.id}`);
|
|
139
|
+
seen.add(service.id);
|
|
140
|
+
return { authoredParticipantKey: service.id, kind: "service", memberId: service.id, principalId: `system:${service.id}` };
|
|
141
|
+
});
|
|
142
|
+
for (const agent of agents)
|
|
143
|
+
if (seen.has(agent.memberId))
|
|
144
|
+
fail(`organization member collision: ${agent.memberId}`);
|
|
145
|
+
if (externalParticipants.length > MAX_EXTERNAL_PARTICIPANTS)
|
|
146
|
+
fail("too many external participants");
|
|
147
|
+
const result = { agentMembers: agents.sort((a, b) => byAscii(a.memberId, b.memberId)), externalParticipants: externalParticipants.sort((a, b) => byAscii(a.memberId, b.memberId)) };
|
|
148
|
+
return freeze(structuredClone(result));
|
|
149
|
+
};
|
|
150
|
+
const actorTokenFor = (server, tokenId, memberId, allowObserve = false) => {
|
|
151
|
+
const token = server.auth.tokens?.filter((entry) => entry.id === tokenId);
|
|
152
|
+
if (token?.length !== 1)
|
|
153
|
+
fail(`Moltnet actor token ${tokenId} must exist exactly once`);
|
|
154
|
+
const selected = required(token?.[0], `Moltnet actor token ${tokenId} must exist exactly once`);
|
|
155
|
+
const validScopes = exact(selected.scopes, ["attach", "write"])
|
|
156
|
+
|| allowObserve && exact(selected.scopes, ["attach", "observe", "write"]);
|
|
157
|
+
if (!validScopes || !exact(selected.agents, [memberId])) {
|
|
158
|
+
fail(`Moltnet actor token ${tokenId} has invalid scopes or agents for ${memberId}`);
|
|
159
|
+
}
|
|
160
|
+
return selected;
|
|
161
|
+
};
|
|
162
|
+
export const validateB31MoltnetAuth = (plan) => {
|
|
163
|
+
const root = rootTeam(plan);
|
|
164
|
+
if (!root?.externalParticipants)
|
|
165
|
+
return;
|
|
166
|
+
const identity = plan.organizationIdentity;
|
|
167
|
+
const resolvedIdentity = required(identity, "B31 organization identity is missing");
|
|
168
|
+
const paths = pathsToAgents(plan);
|
|
169
|
+
const agentBySource = new Map(resolvedIdentity.agentMembers.map((member) => {
|
|
170
|
+
const source = [...paths.entries()].find(([, path]) => path.join(".") === member.memberId)?.[0];
|
|
171
|
+
return [source, member];
|
|
172
|
+
}));
|
|
173
|
+
const networkIds = new Set(root.externalParticipants.flatMap((service) => service.surfaces.moltnet.map((attachment) => attachment.network)));
|
|
174
|
+
for (const network of root.networks ?? []) {
|
|
175
|
+
if (!root.externalParticipants.some((service) => service.surfaces.moltnet.some((attachment) => attachment.network === network.id)))
|
|
176
|
+
continue;
|
|
177
|
+
assertSegment(network.id, "B31 network id");
|
|
178
|
+
if (network.server?.mode !== "managed" || network.server.auth.mode !== "bearer" || network.server.direct_messages !== true) {
|
|
179
|
+
fail(`B31 network ${network.id} requires managed bearer direct_messages`);
|
|
180
|
+
}
|
|
181
|
+
const server = network.server;
|
|
182
|
+
const managedServer = required(server, `B31 network ${network.id} requires a managed server`);
|
|
183
|
+
if (JSON.stringify(managedServer.auth.client) !== JSON.stringify({ token_id: "operator" })) {
|
|
184
|
+
fail(`B31 network ${network.id} requires auth.client token_id operator`);
|
|
185
|
+
}
|
|
186
|
+
const tokens = managedServer.auth.tokens ?? [];
|
|
187
|
+
const operator = tokens.find((token) => token.id === "operator");
|
|
188
|
+
if (tokens.filter((token) => token.id === "operator").length !== 1 || !operator || operator.agents !== undefined || !exact(operator.scopes, ["admin", "observe", "write"])) {
|
|
189
|
+
fail(`B31 network ${network.id} has invalid operator token`);
|
|
190
|
+
}
|
|
191
|
+
const operatorSecret = operator?.secret;
|
|
192
|
+
const usedTokenIds = new Set();
|
|
193
|
+
const usedEnvNames = new Set();
|
|
194
|
+
for (const token of tokens) {
|
|
195
|
+
assertSegment(token.id, "Moltnet token id");
|
|
196
|
+
if (!/^[A-Z_][A-Z0-9_]{0,127}$/u.test(token.secret))
|
|
197
|
+
fail(`invalid Moltnet token env name ${token.secret}`);
|
|
198
|
+
if (usedTokenIds.has(token.id) || usedEnvNames.has(token.secret))
|
|
199
|
+
fail(`duplicate Moltnet token identity ${token.id}`);
|
|
200
|
+
usedTokenIds.add(token.id);
|
|
201
|
+
usedEnvNames.add(token.secret);
|
|
202
|
+
if (token.id !== "operator" && token.secret === operatorSecret)
|
|
203
|
+
fail("operator and actor token env identities must differ");
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
const selectedByNetwork = new Map();
|
|
207
|
+
const selectedActorKeys = new Set();
|
|
208
|
+
for (const member of resolvedIdentity.agentMembers) {
|
|
209
|
+
const source = [...agentBySource.entries()].find(([, value]) => value.memberId === member.memberId)?.[0];
|
|
210
|
+
const node = plan.nodes.find((entry) => entry.kind === "agent" && entry.value.source === source);
|
|
211
|
+
const attachments = node?.value?.surfaces?.moltnet ?? [];
|
|
212
|
+
for (const attachment of attachments.filter((entry) => networkIds.has(entry.network))) {
|
|
213
|
+
const network = root.networks?.find((entry) => entry.id === attachment.network);
|
|
214
|
+
const selectedTokenId = required(attachment.auth?.tokenId, `B31 agent ${member.memberId} must select auth.token_id`);
|
|
215
|
+
const actorKey = `${attachment.network}\u0000${member.memberId}`;
|
|
216
|
+
if (selectedActorKeys.has(actorKey))
|
|
217
|
+
fail(`B31 actor ${member.memberId} selects more than one token on ${attachment.network}`);
|
|
218
|
+
selectedActorKeys.add(actorKey);
|
|
219
|
+
if (network?.server?.mode === "managed") {
|
|
220
|
+
const token = actorTokenFor(network.server, selectedTokenId, member.memberId);
|
|
221
|
+
const selected = selectedByNetwork.get(attachment.network) ?? new Map();
|
|
222
|
+
const previous = selected.get(selectedTokenId);
|
|
223
|
+
if (previous)
|
|
224
|
+
fail(`Moltnet actor token ${selectedTokenId} is shared by ${previous} and ${member.memberId}`);
|
|
225
|
+
selected.set(selectedTokenId, member.memberId);
|
|
226
|
+
selectedByNetwork.set(attachment.network, selected);
|
|
227
|
+
if (token.id === "operator")
|
|
228
|
+
fail(`B31 actor ${member.memberId} must not use operator token`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
for (const service of root.externalParticipants) {
|
|
233
|
+
for (const attachment of service.surfaces.moltnet) {
|
|
234
|
+
const network = root.networks?.find((entry) => entry.id === attachment.network);
|
|
235
|
+
if (network?.server?.mode !== "managed")
|
|
236
|
+
continue;
|
|
237
|
+
const token = actorTokenFor(network.server, attachment.auth.token_id, service.id, true);
|
|
238
|
+
if (token.id === "operator")
|
|
239
|
+
fail(`B31 external participant ${service.id} must not use operator token`);
|
|
240
|
+
const selected = selectedByNetwork.get(attachment.network) ?? new Map();
|
|
241
|
+
const previous = selected.get(token.id);
|
|
242
|
+
if (previous)
|
|
243
|
+
fail(`Moltnet actor token ${token.id} is shared by ${previous} and ${service.id}`);
|
|
244
|
+
selected.set(token.id, service.id);
|
|
245
|
+
selectedByNetwork.set(attachment.network, selected);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
for (const network of root.networks ?? []) {
|
|
249
|
+
const selected = selectedByNetwork.get(network.id);
|
|
250
|
+
if (network.server?.mode === "managed" && selected) {
|
|
251
|
+
for (const token of network.server.auth.tokens ?? []) {
|
|
252
|
+
if (token.id !== "operator" && !selected.has(token.id)) {
|
|
253
|
+
fail(`Moltnet actor token ${token.id} is not selected by exactly one actor`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
export const resolveMoltnetExternalParticipantIntents = (plan) => {
|
|
260
|
+
const identity = plan.organizationIdentity;
|
|
261
|
+
const root = rootTeam(plan);
|
|
262
|
+
if (!identity || !root?.externalParticipants)
|
|
263
|
+
return [];
|
|
264
|
+
const paths = pathsToAgents(plan);
|
|
265
|
+
const agents = new Map(identity.agentMembers.map((member) => [member.memberId, member]));
|
|
266
|
+
const networkIds = new Set((root.networks ?? []).map((network) => network.id));
|
|
267
|
+
const result = [];
|
|
268
|
+
for (const service of root.externalParticipants) {
|
|
269
|
+
const participant = identity.externalParticipants.find((entry) => entry.memberId === service.id);
|
|
270
|
+
if (!participant)
|
|
271
|
+
throw new SpawnfileError("validation_error", `missing external participant identity: ${service.id}`);
|
|
272
|
+
const resolvedParticipant = participant;
|
|
273
|
+
for (const attachment of service.surfaces.moltnet) {
|
|
274
|
+
if (!networkIds.has(attachment.network))
|
|
275
|
+
fail(`external participant ${service.id} references unknown network ${attachment.network}`);
|
|
276
|
+
const peers = [];
|
|
277
|
+
for (const [memberId, agent] of agents) {
|
|
278
|
+
const node = plan.nodes.find((entry) => entry.kind === "agent" && paths.get(entry.value.source)?.join(".") === memberId);
|
|
279
|
+
const authored = node?.value?.surfaces?.moltnet ?? [];
|
|
280
|
+
const eligible = authored.filter((entry) => entry.network === attachment.network && entry.dms?.enabled === true);
|
|
281
|
+
if (eligible.length > 1)
|
|
282
|
+
fail(`duplicate eligible Moltnet peer for ${service.id}/${attachment.network}`);
|
|
283
|
+
if (eligible.length === 1)
|
|
284
|
+
peers.push(agent.memberId);
|
|
285
|
+
}
|
|
286
|
+
if (new Set(peers).size !== peers.length)
|
|
287
|
+
fail(`duplicate eligible Moltnet peer for ${service.id}/${attachment.network}`);
|
|
288
|
+
if (peers.length === 0)
|
|
289
|
+
fail(`external participant ${service.id}/${attachment.network} has no eligible direct-message peers`);
|
|
290
|
+
peers.sort(byAscii);
|
|
291
|
+
const network = root.networks?.find((entry) => entry.id === attachment.network);
|
|
292
|
+
const token = network?.server?.mode === "managed" ? actorTokenFor(network.server, attachment.auth.token_id, service.id, true) : undefined;
|
|
293
|
+
result.push({ participant: resolvedParticipant, networkId: attachment.network, tokenId: attachment.auth.token_id, tokenEnv: token?.secret ?? "", directMessagePeers: peers });
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return result;
|
|
297
|
+
};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { WORLD_BINDINGS_IMAGE_PATH } from "../distribution/types.js";
|
|
2
|
+
import type { GeneratedContainerArtifacts } from "./containerArtifacts.js";
|
|
3
|
+
import type { MoltnetArtifacts } from "./moltnetArtifacts.js";
|
|
4
|
+
import type { CompilePlan } from "./types.js";
|
|
5
|
+
import type { ResolvedWorldBindings } from "./worldBindings.js";
|
|
6
|
+
export declare const ORGANIZATION_READINESS_EVIDENCE_VERSION: "spawnfile.organization-ready-evidence.v1";
|
|
7
|
+
export interface OrganizationReadinessEvidence {
|
|
8
|
+
readonly version: typeof ORGANIZATION_READINESS_EVIDENCE_VERSION;
|
|
9
|
+
readonly compileFingerprint: string;
|
|
10
|
+
readonly compileVersion: string;
|
|
11
|
+
readonly projectLabel: string;
|
|
12
|
+
readonly organizationMembers: readonly {
|
|
13
|
+
readonly memberId: string;
|
|
14
|
+
readonly nodeId: string;
|
|
15
|
+
}[];
|
|
16
|
+
readonly worldBindings: {
|
|
17
|
+
readonly schema: "simfile.world-bindings.v1";
|
|
18
|
+
readonly artifactPath: typeof WORLD_BINDINGS_IMAGE_PATH;
|
|
19
|
+
readonly digest: string;
|
|
20
|
+
readonly assignments: readonly {
|
|
21
|
+
readonly memberId: string;
|
|
22
|
+
readonly nodeId: string;
|
|
23
|
+
}[];
|
|
24
|
+
} | null;
|
|
25
|
+
readonly networks: readonly {
|
|
26
|
+
readonly id: string;
|
|
27
|
+
readonly mode: "external" | "managed";
|
|
28
|
+
readonly internalPort: number | null;
|
|
29
|
+
readonly rooms: readonly {
|
|
30
|
+
readonly id: string;
|
|
31
|
+
readonly members: readonly string[];
|
|
32
|
+
}[];
|
|
33
|
+
readonly nodes: readonly {
|
|
34
|
+
readonly nodeId: string;
|
|
35
|
+
readonly memberId: string;
|
|
36
|
+
readonly configPath: string;
|
|
37
|
+
readonly sha256: string;
|
|
38
|
+
}[];
|
|
39
|
+
}[];
|
|
40
|
+
readonly hasExternalMoltnet: boolean;
|
|
41
|
+
}
|
|
42
|
+
export interface CreateOrganizationReadinessEvidenceInput {
|
|
43
|
+
compileVersion: string;
|
|
44
|
+
containerArtifacts: GeneratedContainerArtifacts;
|
|
45
|
+
moltnetArtifacts: MoltnetArtifacts | null;
|
|
46
|
+
plan: CompilePlan;
|
|
47
|
+
worldBindings?: ResolvedWorldBindings;
|
|
48
|
+
}
|
|
49
|
+
export declare const createOrganizationReadinessEvidence: (input: CreateOrganizationReadinessEvidenceInput) => OrganizationReadinessEvidence;
|