spawnfile 0.1.14 → 0.1.17
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 +60 -159
- package/dist/audit/checksShared.d.ts +1 -1
- package/dist/auth/importers.d.ts +10 -0
- package/dist/auth/importers.js +29 -4
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.js +1 -0
- package/dist/auth/paths.d.ts +1 -1
- package/dist/auth/profileStore.js +9 -9
- package/dist/auth/targetSecretSourceFsIdentity.d.ts +40 -0
- package/dist/auth/targetSecretSourceFsIdentity.js +42 -0
- package/dist/auth/targetSecretSourceFsPublish.d.ts +2 -0
- package/dist/auth/targetSecretSourceFsPublish.js +3 -1
- package/dist/auth/targetSecretSourceFsPublishImmutable.d.ts +2 -1
- package/dist/auth/targetSecretSourceFsPublishImmutable.js +104 -71
- package/dist/auth/targetSecretSourceFsRead.js +5 -14
- package/dist/auth/trainingAuth.d.ts +21 -0
- package/dist/auth/trainingAuth.js +86 -0
- package/dist/auth/types.d.ts +1 -1
- package/dist/cli/authCommands.d.ts +1 -1
- package/dist/cli/authCommands.js +9 -0
- package/dist/cli/canaryCutoverCommand.d.ts +2 -0
- package/dist/cli/canaryCutoverCommand.js +30 -0
- package/dist/cli/capabilitiesCommand.d.ts +3 -0
- package/dist/cli/capabilitiesCommand.js +12 -0
- package/dist/cli/capabilitiesReceipt.d.ts +56 -0
- package/dist/cli/capabilitiesReceipt.js +56 -0
- package/dist/cli/compileBuildCommands.js +13 -0
- package/dist/cli/composedLifecycleContractSet.d.ts +21 -0
- package/dist/cli/composedLifecycleContractSet.js +204 -0
- package/dist/cli/devCommands.js +2 -0
- package/dist/cli/downCommand.js +19 -8
- package/dist/cli/evidenceExportHelperCommand.d.ts +13 -0
- package/dist/cli/evidenceExportHelperCommand.js +51 -0
- package/dist/cli/index.js +12 -3
- package/dist/cli/lifecycleMachine.d.ts +7 -1
- package/dist/cli/lifecycleMachine.js +2 -2
- package/dist/cli/paideiaDelegation.d.ts +17 -0
- package/dist/cli/paideiaDelegation.js +210 -0
- package/dist/cli/paideiaSupervisor.d.ts +17 -0
- package/dist/cli/paideiaSupervisor.js +48 -0
- package/dist/cli/productStateCloneCommand.d.ts +2 -0
- package/dist/cli/productStateCloneCommand.js +34 -0
- package/dist/cli/runCli.d.ts +13 -3
- package/dist/cli/runCli.js +37 -9
- package/dist/cli/targetCommands.d.ts +4 -7
- package/dist/cli/targetCommands.js +16 -46
- package/dist/cli/targetConfigPreparedPlan.d.ts +3 -0
- package/dist/cli/targetConfigPreparedPlan.js +74 -0
- package/dist/cli/targetConfigResolver.d.ts +3 -0
- package/dist/cli/targetConfigResolver.js +111 -0
- package/dist/cli/targetConfigResolverCommand.d.ts +6 -0
- package/dist/cli/targetConfigResolverCommand.js +43 -0
- package/dist/cli/targetConfigResolverContracts.d.ts +56 -0
- package/dist/cli/targetConfigResolverContracts.js +30 -0
- package/dist/cli/targetConfigResolverDocker.d.ts +4 -0
- package/dist/cli/targetConfigResolverDocker.js +47 -0
- package/dist/cli/targetConfigResolverValidation.d.ts +10 -0
- package/dist/cli/targetConfigResolverValidation.js +94 -0
- package/dist/cli/targetDefaultAuthorities.d.ts +2 -0
- package/dist/cli/targetDefaultAuthorities.js +3 -0
- package/dist/cli/targetDefaultConfig.d.ts +7 -0
- package/dist/cli/targetDefaultConfig.js +22 -5
- package/dist/cli/targetDefaultConfigStdin.js +7 -1
- package/dist/cli/targetDefaultHandlerFactory.js +23 -2
- package/dist/cli/targetDefaultHandlers.d.ts +2 -2
- package/dist/cli/targetProductionCommands.d.ts +5 -0
- package/dist/cli/targetProductionCommands.js +45 -0
- package/dist/cli/trainCommand.d.ts +3 -0
- package/dist/cli/trainCommand.js +61 -0
- package/dist/cli/upCommand.js +35 -6
- package/dist/cli/upLifecycleRecovery.d.ts +2 -2
- package/dist/cli/upLifecycleRecovery.js +188 -44
- package/dist/cli/usageCommand.d.ts +40 -0
- package/dist/cli/usageCommand.js +284 -0
- package/dist/cli/usageCommandLive.d.ts +84 -0
- package/dist/cli/usageCommandLive.js +95 -0
- package/dist/cli/usageDeploymentSource.d.ts +9 -0
- package/dist/cli/usageDeploymentSource.js +22 -0
- package/dist/cli/workspaceResourceMigrationCommand.d.ts +8 -0
- package/dist/cli/workspaceResourceMigrationCommand.js +36 -0
- package/dist/compiler/buildCompilePlanTeams.d.ts +1 -1
- package/dist/compiler/buildCompilePlanTeams.js +6 -1
- package/dist/compiler/compilePlanHelpers.js +3 -0
- package/dist/compiler/compileProject.d.ts +2 -0
- package/dist/compiler/compileProject.js +5 -1
- package/dist/compiler/compileProjectSupport.js +9 -0
- package/dist/compiler/containerArtifacts.d.ts +3 -1
- package/dist/compiler/containerArtifacts.js +92 -40
- package/dist/compiler/containerArtifactsPlans.d.ts +1 -1
- package/dist/compiler/containerArtifactsPlans.js +24 -7
- package/dist/compiler/containerArtifactsRender.d.ts +2 -1
- package/dist/compiler/containerArtifactsRender.js +91 -58
- package/dist/compiler/containerArtifactsTypes.d.ts +8 -0
- package/dist/compiler/containerBackedMountRender.d.ts +56 -0
- package/dist/compiler/containerBackedMountRender.js +101 -0
- package/dist/compiler/containerDaimonBrokerRender.d.ts +112 -0
- package/dist/compiler/containerDaimonBrokerRender.js +191 -0
- package/dist/compiler/containerDaimonGrokWorkerProvisioning.d.ts +38 -0
- package/dist/compiler/containerDaimonGrokWorkerProvisioning.js +108 -0
- package/dist/compiler/containerDaimonGrokWorkerRender.d.ts +172 -0
- package/dist/compiler/containerDaimonGrokWorkerRender.js +268 -0
- package/dist/compiler/containerDaimonOwnershipGuardRender.d.ts +12 -0
- package/dist/compiler/containerDaimonOwnershipGuardRender.js +191 -0
- package/dist/compiler/containerDaimonUidEntrypointRender.d.ts +24 -0
- package/dist/compiler/containerDaimonUidEntrypointRender.js +297 -0
- package/dist/compiler/containerEntrypointRender.d.ts +7 -0
- package/dist/compiler/containerEntrypointRender.js +28 -22
- package/dist/compiler/containerPersistentMounts.d.ts +30 -0
- package/dist/compiler/containerPersistentMounts.js +66 -0
- package/dist/compiler/containerReadinessPaths.d.ts +1 -0
- package/dist/compiler/containerReadinessPaths.js +1 -0
- package/dist/compiler/containerRuntimeLinkMaterializer.d.ts +2 -0
- package/dist/compiler/containerRuntimeLinkMaterializer.js +12 -0
- package/dist/compiler/containerRuntimeReadinessRender.d.ts +7 -0
- package/dist/compiler/containerRuntimeReadinessRender.js +40 -0
- package/dist/compiler/containerStateOwnershipRender.d.ts +4 -0
- package/dist/compiler/containerStateOwnershipRender.js +75 -0
- package/dist/compiler/containerTargetResources.d.ts +22 -1
- package/dist/compiler/containerTargetResources.js +94 -2
- package/dist/compiler/containerVolumeBootstrap.d.ts +3 -0
- package/dist/compiler/containerVolumeBootstrap.js +3 -0
- package/dist/compiler/containerWorkspaceResourceRender.js +49 -1
- package/dist/compiler/daimonTelemetryArtifacts.d.ts +2 -2
- package/dist/compiler/daimonTelemetryArtifacts.js +5 -10
- package/dist/compiler/deploymentLineage.d.ts +40 -0
- package/dist/compiler/deploymentLineage.js +50 -0
- package/dist/compiler/index.d.ts +3 -0
- package/dist/compiler/index.js +3 -0
- package/dist/compiler/initProject.d.ts +2 -0
- package/dist/compiler/initProject.js +39 -1
- package/dist/compiler/localMoltnetAuthority.d.ts +64 -0
- package/dist/compiler/localMoltnetAuthority.js +177 -0
- package/dist/compiler/memoryArtifacts.d.ts +1 -1
- package/dist/compiler/memoryArtifacts.js +108 -32
- package/dist/compiler/modelEnv.d.ts +5 -0
- package/dist/compiler/modelEnv.js +8 -2
- package/dist/compiler/moltnetArtifactPaths.d.ts +17 -12
- package/dist/compiler/moltnetArtifactPaths.js +17 -15
- package/dist/compiler/moltnetArtifactTypes.d.ts +10 -0
- package/dist/compiler/moltnetArtifacts.d.ts +1 -1
- package/dist/compiler/moltnetArtifacts.js +52 -12
- package/dist/compiler/moltnetBinaries.d.ts +16 -4
- package/dist/compiler/moltnetBinaries.js +46 -6
- package/dist/compiler/moltnetClientConfig.js +1 -1
- package/dist/compiler/moltnetConfigLowering.d.ts +3 -1
- package/dist/compiler/moltnetConfigLowering.js +30 -6
- package/dist/compiler/moltnetNodeConfig.js +1 -1
- package/dist/compiler/moltnetReleaseAuthority.d.ts +24 -1
- package/dist/compiler/moltnetReleaseAuthority.js +33 -4
- package/dist/compiler/moltnetRepresentativeResolution.d.ts +1 -1
- package/dist/compiler/moltnetRepresentativeResolution.js +2 -2
- package/dist/compiler/moltnetResolution.js +9 -15
- package/dist/compiler/moltnetRoomMemberships.js +20 -5
- package/dist/compiler/moltnetRoomPolicyCompatibility.d.ts +1 -1
- package/dist/compiler/moltnetRoomPolicyCompatibility.js +3 -1
- package/dist/compiler/moltnetRuntimeConfig.d.ts +1 -1
- package/dist/compiler/moltnetRuntimeConfig.js +22 -2
- package/dist/compiler/moltnetServerPlans.js +19 -0
- package/dist/compiler/organizationExternalParticipants.d.ts +3 -0
- package/dist/compiler/organizationExternalParticipants.js +176 -0
- package/dist/compiler/organizationIdentity.d.ts +3 -9
- package/dist/compiler/organizationIdentity.js +37 -270
- package/dist/compiler/organizationIdentityGraph.d.ts +15 -0
- package/dist/compiler/organizationIdentityGraph.js +115 -0
- package/dist/compiler/organizationReadyEvidence.d.ts +8 -0
- package/dist/compiler/organizationReadyEvidence.js +23 -3
- package/dist/compiler/runProject.d.ts +4 -2
- package/dist/compiler/runProject.js +32 -6
- package/dist/compiler/runProjectAuth.d.ts +3 -1
- package/dist/compiler/runProjectAuth.js +19 -3
- package/dist/compiler/runProjectDaimonCodexDocker.d.ts +3 -0
- package/dist/compiler/runProjectDaimonCodexDocker.js +36 -0
- package/dist/compiler/runProjectDocker.d.ts +8 -4
- package/dist/compiler/runProjectDocker.js +43 -18
- package/dist/compiler/runProjectDockerDaimonGuards.d.ts +15 -0
- package/dist/compiler/runProjectDockerDaimonGuards.js +122 -0
- package/dist/compiler/runProjectDockerReservation.d.ts +3 -0
- package/dist/compiler/runProjectDockerReservation.js +118 -0
- package/dist/compiler/runProjectLifecycle.js +1 -1
- package/dist/compiler/training/broker/declaration.d.ts +45 -0
- package/dist/compiler/training/broker/declaration.js +55 -0
- package/dist/compiler/training/broker/entrypoint.d.ts +39 -0
- package/dist/compiler/training/broker/entrypoint.js +111 -0
- package/dist/compiler/training/broker/index.d.ts +10 -0
- package/dist/compiler/training/broker/index.js +10 -0
- package/dist/compiler/training/broker/main.d.ts +2 -0
- package/dist/compiler/training/broker/main.js +14 -0
- package/dist/compiler/training/broker/paths.d.ts +196 -0
- package/dist/compiler/training/broker/paths.js +241 -0
- package/dist/compiler/training/broker/processes.d.ts +42 -0
- package/dist/compiler/training/broker/processes.js +99 -0
- package/dist/compiler/training/broker/projection.d.ts +51 -0
- package/dist/compiler/training/broker/projection.js +76 -0
- package/dist/compiler/training/broker/provisioning.d.ts +87 -0
- package/dist/compiler/training/broker/provisioning.js +213 -0
- package/dist/compiler/training/broker/receipt.d.ts +77 -0
- package/dist/compiler/training/broker/receipt.js +110 -0
- package/dist/compiler/training/broker/registration.d.ts +41 -0
- package/dist/compiler/training/broker/registration.js +102 -0
- package/dist/compiler/training/broker/runtime.d.ts +25 -0
- package/dist/compiler/training/broker/runtime.js +173 -0
- package/dist/compiler/training/broker/seccompRoutes.d.ts +31 -0
- package/dist/compiler/training/broker/seccompRoutes.js +36 -0
- package/dist/compiler/training/broker/supervisor.d.ts +109 -0
- package/dist/compiler/training/broker/supervisor.js +173 -0
- package/dist/compiler/training/container/contract.d.ts +31 -0
- package/dist/compiler/training/container/contract.js +33 -0
- package/dist/compiler/training/container/index.d.ts +4 -0
- package/dist/compiler/training/container/index.js +2 -0
- package/dist/compiler/training/container/launch.d.ts +18 -0
- package/dist/compiler/training/container/launch.js +173 -0
- package/dist/compiler/training/container/prepare.d.ts +8 -0
- package/dist/compiler/training/container/prepare.js +80 -0
- package/dist/compiler/training/container/process.d.ts +14 -0
- package/dist/compiler/training/container/process.js +70 -0
- package/dist/compiler/training/container/security.d.ts +36 -0
- package/dist/compiler/training/container/security.js +58 -0
- package/dist/compiler/training/context.d.ts +7 -0
- package/dist/compiler/training/context.js +93 -0
- package/dist/compiler/training/contract.d.ts +142 -0
- package/dist/compiler/training/contract.js +34 -0
- package/dist/compiler/training/index.d.ts +4 -0
- package/dist/compiler/training/index.js +3 -0
- package/dist/compiler/training/preparation/assets/Dockerfile +98 -0
- package/dist/compiler/training/preparation/assets/package-lock.json +3787 -0
- package/dist/compiler/training/preparation/broker.d.ts +21 -0
- package/dist/compiler/training/preparation/broker.js +43 -0
- package/dist/compiler/training/preparation/contextModes.d.ts +12 -0
- package/dist/compiler/training/preparation/contextModes.js +38 -0
- package/dist/compiler/training/preparation/contract.d.ts +182 -0
- package/dist/compiler/training/preparation/contract.js +94 -0
- package/dist/compiler/training/preparation/copyAssets.d.ts +1 -0
- package/dist/compiler/training/preparation/copyAssets.js +8 -0
- package/dist/compiler/training/preparation/daimonParent.d.ts +42 -0
- package/dist/compiler/training/preparation/daimonParent.js +114 -0
- package/dist/compiler/training/preparation/files.d.ts +25 -0
- package/dist/compiler/training/preparation/files.js +85 -0
- package/dist/compiler/training/preparation/image.d.ts +28 -0
- package/dist/compiler/training/preparation/image.js +102 -0
- package/dist/compiler/training/preparation/index.d.ts +3 -0
- package/dist/compiler/training/preparation/index.js +2 -0
- package/dist/compiler/training/preparation/inputs.d.ts +23 -0
- package/dist/compiler/training/preparation/inputs.js +93 -0
- package/dist/compiler/training/preparation/prepare.d.ts +33 -0
- package/dist/compiler/training/preparation/prepare.js +186 -0
- package/dist/compiler/training/preparation/scratch.d.ts +19 -0
- package/dist/compiler/training/preparation/scratch.js +48 -0
- package/dist/compiler/training/repair/compatibility.d.ts +11 -0
- package/dist/compiler/training/repair/compatibility.js +34 -0
- package/dist/compiler/training/repair/contract.d.ts +506 -0
- package/dist/compiler/training/repair/contract.js +31 -0
- package/dist/compiler/training/repair/index.d.ts +3 -0
- package/dist/compiler/training/repair/index.js +3 -0
- package/dist/compiler/training/repair/prepare.d.ts +230 -0
- package/dist/compiler/training/repair/prepare.js +74 -0
- package/dist/compiler/training/repair/witness.d.ts +203 -0
- package/dist/compiler/training/repair/witness.js +42 -0
- package/dist/compiler/types.d.ts +2 -0
- package/dist/compiler/upProject.d.ts +26 -1
- package/dist/compiler/upProject.js +117 -178
- package/dist/compiler/upProjectHandoff.d.ts +62 -0
- package/dist/compiler/upProjectHandoff.js +204 -0
- package/dist/compiler/upReceipt.js +49 -4
- package/dist/compiler/updateProjectModels.js +1 -0
- package/dist/compiler/view/types.d.ts +1 -1
- package/dist/compiler/workspaceBundleArtifacts.d.ts +3 -0
- package/dist/compiler/workspaceBundleArtifacts.js +106 -0
- package/dist/compiler/workspaceResources.d.ts +4 -1
- package/dist/compiler/workspaceResources.js +12 -7
- package/dist/deployment/artifactsExportPlan.js +51 -1
- package/dist/deployment/canaryCutover.d.ts +42 -0
- package/dist/deployment/canaryCutover.js +140 -0
- package/dist/deployment/candidateDiagnostics.d.ts +15 -0
- package/dist/deployment/candidateDiagnostics.js +90 -0
- package/dist/deployment/dockerLogs.js +4 -1
- package/dist/deployment/dockerManager.js +9 -3
- package/dist/deployment/dockerProbeGateway.d.ts +17 -0
- package/dist/deployment/dockerProbeGateway.js +17 -2
- package/dist/deployment/downDeployment.d.ts +5 -0
- package/dist/deployment/downDeployment.js +109 -8
- package/dist/deployment/downReceiptTypes.d.ts +17 -2
- package/dist/deployment/downReceiptTypes.js +17 -2
- package/dist/deployment/index.d.ts +4 -0
- package/dist/deployment/index.js +4 -0
- package/dist/deployment/lifecycleCompletionContracts.d.ts +66 -0
- package/dist/deployment/lifecycleCompletionContracts.js +34 -0
- package/dist/deployment/lifecycleCompletionPaths.d.ts +4 -1
- package/dist/deployment/lifecycleCompletionPaths.js +3 -0
- package/dist/deployment/lifecycleCompletionPublication.d.ts +2 -0
- package/dist/deployment/lifecycleCompletionPublication.js +18 -4
- package/dist/deployment/lifecycleCompletionStore.d.ts +1 -1
- package/dist/deployment/lifecycleCompletionStore.js +7 -7
- package/dist/deployment/lifecycleUpRecords.d.ts +11 -0
- package/dist/deployment/lifecycleUpRecords.js +127 -0
- package/dist/deployment/native/AGENTS.md +11 -0
- package/dist/deployment/native/rename-noreplace-arm64 +0 -0
- package/dist/deployment/native/rename-noreplace-arm64.provenance.json +1 -0
- package/dist/deployment/native/rename-noreplace-x64 +0 -0
- package/dist/deployment/native/rename-noreplace-x64.provenance.json +1 -0
- package/dist/deployment/noReplaceActivation.d.ts +17 -0
- package/dist/deployment/noReplaceActivation.js +50 -0
- package/dist/deployment/organizationHandoffAuthorityFsBudget.d.ts +110 -0
- package/dist/deployment/organizationHandoffAuthorityFsBudget.js +156 -0
- package/dist/deployment/organizationHandoffAuthorityFsClient.js +82 -27
- package/dist/deployment/organizationHandoffAuthorityFsElection.d.ts +21 -0
- package/dist/deployment/organizationHandoffAuthorityFsElection.js +57 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorker.js +254 -108
- package/dist/deployment/organizationHandoffAuthorityFsWorkerStall.fixture.d.ts +1 -0
- package/dist/deployment/organizationHandoffAuthorityFsWorkerStall.fixture.js +16 -0
- package/dist/deployment/organizationHandoffAuthorityStore.js +14 -7
- package/dist/deployment/organizationHandoffAuthorityTypes.d.ts +2 -2
- package/dist/deployment/organizationHandoffAuthorityTypes.js +2 -1
- package/dist/deployment/organizationReady.d.ts +2 -0
- package/dist/deployment/organizationReady.js +36 -4
- package/dist/deployment/productStateClone.d.ts +43 -0
- package/dist/deployment/productStateClone.js +319 -0
- package/dist/deployment/upLifecycleRecoveryState.d.ts +23 -0
- package/dist/deployment/upLifecycleRecoveryState.js +12 -0
- package/dist/deployment/upReceiptTypes.d.ts +32 -6
- package/dist/deployment/upReceiptTypes.js +29 -2
- package/dist/deployment/workspaceResourceMigration.d.ts +55 -0
- package/dist/deployment/workspaceResourceMigration.js +315 -0
- package/dist/dev/project.d.ts +7 -0
- package/dist/dev/project.js +9 -0
- package/dist/distribution/consumeImage.d.ts +2 -0
- package/dist/distribution/consumeImage.js +98 -73
- package/dist/distribution/consumeImageDaimonDocker.d.ts +3 -0
- package/dist/distribution/consumeImageDaimonDocker.js +45 -0
- package/dist/distribution/consumeImageLifecycle.d.ts +17 -0
- package/dist/distribution/consumeImageLifecycle.js +231 -0
- package/dist/distribution/consumeImageSupport.d.ts +12 -0
- package/dist/distribution/consumeImageSupport.js +15 -0
- package/dist/distribution/distributionReportSchema.d.ts +11 -1
- package/dist/distribution/distributionReportSchema.js +15 -2
- package/dist/distribution/dockerRunner.d.ts +6 -1
- package/dist/distribution/dockerRunner.js +31 -4
- package/dist/distribution/imageRuntimeAuth.d.ts +9 -1
- package/dist/distribution/imageRuntimeAuth.js +70 -1
- package/dist/distribution/index.d.ts +1 -1
- package/dist/distribution/index.js +1 -1
- package/dist/distribution/preflight.js +5 -1
- package/dist/distribution/types.d.ts +14 -1
- package/dist/distribution/types.js +3 -0
- package/dist/evidenceExportHelper/boundedExecutor.d.ts +3 -0
- package/dist/evidenceExportHelper/boundedExecutor.js +33 -0
- package/dist/evidenceExportHelper/helperProgram.mjs +156 -0
- package/dist/evidenceExportHelper/index.d.ts +4 -0
- package/dist/evidenceExportHelper/index.js +4 -0
- package/dist/evidenceExportHelper/preparedAuthority.d.ts +64 -0
- package/dist/evidenceExportHelper/preparedAuthority.js +228 -0
- package/dist/evidenceExportHelper/preparedBuilder.d.ts +10 -0
- package/dist/evidenceExportHelper/preparedBuilder.js +183 -0
- package/dist/evidenceExportHelper/preparedBuilderTypes.d.ts +19 -0
- package/dist/evidenceExportHelper/preparedBuilderTypes.js +1 -0
- package/dist/evidenceExportHelper/recipe.d.ts +7 -0
- package/dist/evidenceExportHelper/recipe.js +83 -0
- package/dist/filesystem/io.d.ts +2 -0
- package/dist/filesystem/io.js +16 -1
- package/dist/manifest/executionSchemas.d.ts +27 -0
- package/dist/manifest/executionSchemas.js +21 -2
- package/dist/manifest/mcpSchemas.d.ts +1 -0
- package/dist/manifest/mcpSchemas.js +3 -0
- package/dist/manifest/renderSpawnfileNetworks.js +11 -0
- package/dist/manifest/renderSpawnfileWorkspace.js +5 -0
- package/dist/manifest/scheduleSchemas.d.ts +3 -1
- package/dist/manifest/scheduleSchemas.js +91 -5
- package/dist/manifest/schemas.d.ts +237 -12
- package/dist/manifest/schemas.js +5 -2
- package/dist/manifest/teamNetworkAccessSchemas.d.ts +5 -1
- package/dist/manifest/teamNetworkAccessSchemas.js +11 -0
- package/dist/manifest/teamNetworkAuthSchemas.d.ts +1 -1
- package/dist/manifest/teamNetworkSchemas.d.ts +17 -3
- package/dist/manifest/teamNetworkSchemas.js +19 -1
- package/dist/manifest/teamNetworkServerSchemas.d.ts +8 -3
- package/dist/manifest/teamNetworkServerSchemas.js +18 -2
- package/dist/manifest/workspaceSchemas.d.ts +16 -0
- package/dist/manifest/workspaceSchemas.js +11 -0
- package/dist/report/types.d.ts +34 -4
- package/dist/runtime/common.d.ts +28 -1
- package/dist/runtime/common.js +33 -3
- package/dist/runtime/container.js +49 -33
- package/dist/runtime/daimon/adapter.d.ts +14 -0
- package/dist/runtime/daimon/adapter.js +243 -0
- package/dist/runtime/daimon/attention.d.ts +8 -0
- package/dist/runtime/daimon/attention.js +32 -0
- package/dist/runtime/daimon/config.d.ts +25 -0
- package/dist/runtime/daimon/config.js +272 -0
- package/dist/runtime/daimon/contractManifest.d.ts +295 -0
- package/dist/runtime/daimon/contractManifest.js +319 -0
- package/dist/runtime/daimon/grokModel.d.ts +19 -0
- package/dist/runtime/daimon/grokModel.js +33 -0
- package/dist/runtime/daimon/grokWorkerConfigBytes.d.ts +26 -0
- package/dist/runtime/daimon/grokWorkerConfigBytes.js +36 -0
- package/dist/runtime/daimon/grokWorkerContract.d.ts +22 -0
- package/dist/runtime/daimon/grokWorkerContract.js +48 -0
- package/dist/runtime/daimon/memory.d.ts +57 -0
- package/dist/runtime/daimon/memory.js +125 -0
- package/dist/runtime/daimon/runAuth.d.ts +51 -0
- package/dist/runtime/daimon/runAuth.js +279 -0
- package/dist/runtime/daimon/runtimeIdentity.d.ts +22 -0
- package/dist/runtime/daimon/runtimeIdentity.js +22 -0
- package/dist/runtime/daimon/scheduleAuthority.d.ts +3 -0
- package/dist/runtime/daimon/scheduleAuthority.js +17 -0
- package/dist/runtime/index.d.ts +4 -0
- package/dist/runtime/index.js +4 -0
- package/dist/runtime/install.d.ts +3 -0
- package/dist/runtime/install.js +3 -0
- package/dist/runtime/localDaimonAuthority.d.ts +11 -0
- package/dist/runtime/localDaimonAuthority.js +77 -0
- package/dist/runtime/mnemeMcp.d.ts +13 -0
- package/dist/runtime/mnemeMcp.js +26 -0
- package/dist/runtime/openclaw/adapter.js +2 -2
- package/dist/runtime/pi/adapter.d.ts +0 -1
- package/dist/runtime/pi/adapter.js +2 -6
- package/dist/runtime/pi/appCliSource.js +1 -1
- package/dist/runtime/pi/appScheduleSource.js +6 -2
- package/dist/runtime/pi/appTemplateTypes.d.ts +1 -1
- package/dist/runtime/picoclaw/adapter.js +2 -2
- package/dist/runtime/registry.d.ts +3 -0
- package/dist/runtime/registry.js +19 -2
- package/dist/runtime/scheduleUtils.d.ts +1 -0
- package/dist/runtime/scheduleUtils.js +5 -1
- package/dist/runtime/types.d.ts +25 -0
- package/dist/runtime/usageLedger.d.ts +158 -0
- package/dist/runtime/usageLedger.js +269 -0
- package/dist/runtime/usageLedgerRead.d.ts +48 -0
- package/dist/runtime/usageLedgerRead.js +102 -0
- package/dist/runtime/usageRequestLedger.d.ts +42 -0
- package/dist/runtime/usageRequestLedger.js +72 -0
- package/dist/shared/daimonCodexDocker.d.ts +32 -0
- package/dist/shared/daimonCodexDocker.js +120 -0
- package/dist/shared/daimonGrokSeccompProfile.d.ts +10 -0
- package/dist/shared/daimonGrokSeccompProfile.js +11 -0
- package/dist/shared/index.d.ts +2 -0
- package/dist/shared/index.js +2 -0
- package/dist/shared/types.d.ts +1 -1
- package/dist/shared/volumeNames.d.ts +6 -0
- package/dist/shared/volumeNames.js +14 -0
- package/dist/target/dockerArtifactsProvider.js +34 -7
- package/dist/target/dockerBaseImage.d.ts +2 -0
- package/dist/target/dockerBaseImage.js +11 -0
- package/dist/target/dockerCommandExecutor.d.ts +11 -0
- package/dist/target/dockerCommandExecutor.js +53 -2
- package/dist/target/dockerCommandExecutorCore.d.ts +2 -1
- package/dist/target/dockerCommandExecutorCore.js +4 -2
- package/dist/target/dockerPublicArtifactSnapshot.d.ts +3 -3
- package/dist/target/dockerPublicArtifactSnapshot.js +17 -33
- package/dist/target/dockerTarget.d.ts +1 -0
- package/dist/target/dockerTargetBinding.d.ts +1 -2
- package/dist/target/dockerTargetBinding.js +2 -3
- package/dist/target/dockerTargetExecFile.d.ts +19 -0
- package/dist/target/dockerTargetExecFile.js +194 -0
- package/dist/target/dockerWorldServiceProvider.d.ts +4 -0
- package/dist/target/dockerWorldServiceProvider.js +13 -1
- package/dist/target/evidenceExport.d.ts +3 -1
- package/dist/target/evidenceExport.js +12 -3
- package/dist/target/evidenceExportOperationsTestKit.js +3 -3
- package/dist/target/evidenceExportProvider.d.ts +2 -0
- package/dist/target/evidenceExportProvider.js +15 -5
- package/dist/target/publicArtifactSnapshot.d.ts +31 -0
- package/dist/target/publicArtifactSnapshot.js +37 -3
- package/examples/README.md +45 -0
- package/examples/agent-with-subagents/AGENTS.md +3 -0
- package/examples/agent-with-subagents/Spawnfile +30 -0
- package/examples/agent-with-subagents/subagents/critic/AGENTS.md +3 -0
- package/examples/agent-with-subagents/subagents/critic/Spawnfile +15 -0
- package/examples/agent-with-subagents/subagents/researcher/AGENTS.md +3 -0
- package/examples/agent-with-subagents/subagents/researcher/Spawnfile +17 -0
- package/examples/daimon-org/Spawnfile +68 -0
- package/examples/daimon-org/TEAM.md +4 -0
- package/examples/daimon-org/agents/mapper/AGENTS.md +4 -0
- package/examples/daimon-org/agents/mapper/Spawnfile +37 -0
- package/examples/daimon-org/shared/skills/file-note/SKILL.md +9 -0
- package/examples/daimon-org/teams/review/Spawnfile +53 -0
- package/examples/daimon-org/teams/review/agents/reviewer/AGENTS.md +4 -0
- package/examples/daimon-org/teams/review/agents/reviewer/Spawnfile +37 -0
- package/examples/daimon-public-host/AGENTS.md +3 -0
- package/examples/daimon-public-host/Spawnfile +21 -0
- package/examples/distribution-org/Spawnfile +43 -0
- package/examples/distribution-org/TEAM.md +4 -0
- package/examples/distribution-org/agents/coordinator/AGENTS.md +1 -0
- package/examples/distribution-org/agents/coordinator/Spawnfile +20 -0
- package/examples/distribution-org/agents/researcher/AGENTS.md +1 -0
- package/examples/distribution-org/agents/researcher/Spawnfile +20 -0
- package/examples/jungian-daimon-org/Spawnfile +41 -0
- package/examples/jungian-daimon-org/TEAM.md +21 -0
- package/examples/jungian-daimon-org/teams/luna/Spawnfile +47 -0
- package/examples/jungian-daimon-org/teams/luna/TEAM.md +4 -0
- package/examples/jungian-daimon-org/teams/luna/agents/animus/AGENTS.md +10 -0
- package/examples/jungian-daimon-org/teams/luna/agents/animus/Spawnfile +33 -0
- package/examples/jungian-daimon-org/teams/luna/agents/representative/AGENTS.md +21 -0
- package/examples/jungian-daimon-org/teams/luna/agents/representative/Spawnfile +30 -0
- package/examples/jungian-daimon-org/teams/luna/agents/shadow/AGENTS.md +10 -0
- package/examples/jungian-daimon-org/teams/luna/agents/shadow/Spawnfile +33 -0
- package/examples/jungian-daimon-org/teams/selene/Spawnfile +47 -0
- package/examples/jungian-daimon-org/teams/selene/TEAM.md +4 -0
- package/examples/jungian-daimon-org/teams/selene/agents/animus/AGENTS.md +10 -0
- package/examples/jungian-daimon-org/teams/selene/agents/animus/Spawnfile +33 -0
- package/examples/jungian-daimon-org/teams/selene/agents/representative/AGENTS.md +19 -0
- package/examples/jungian-daimon-org/teams/selene/agents/representative/Spawnfile +33 -0
- package/examples/jungian-daimon-org/teams/selene/agents/shadow/AGENTS.md +10 -0
- package/examples/jungian-daimon-org/teams/selene/agents/shadow/Spawnfile +30 -0
- package/examples/mixed-runtime-org/Spawnfile +71 -0
- package/examples/mixed-runtime-org/TEAM.md +8 -0
- package/examples/mixed-runtime-org/agents/analyst/AGENTS.md +8 -0
- package/examples/mixed-runtime-org/agents/analyst/Spawnfile +27 -0
- package/examples/mixed-runtime-org/agents/conductor/AGENTS.md +8 -0
- package/examples/mixed-runtime-org/agents/conductor/Spawnfile +27 -0
- package/examples/mixed-runtime-org/agents/localist/AGENTS.md +7 -0
- package/examples/mixed-runtime-org/agents/localist/Spawnfile +50 -0
- package/examples/moltnet-team-chat/Spawnfile +43 -0
- package/examples/moltnet-team-chat/TEAM.md +5 -0
- package/examples/moltnet-team-chat/agents/coordinator/AGENTS.md +9 -0
- package/examples/moltnet-team-chat/agents/coordinator/Spawnfile +26 -0
- package/examples/moltnet-team-chat/teams/analysis/Spawnfile +23 -0
- package/examples/moltnet-team-chat/teams/analysis/TEAM.md +3 -0
- package/examples/moltnet-team-chat/teams/analysis/agents/observer/AGENTS.md +5 -0
- package/examples/moltnet-team-chat/teams/analysis/agents/observer/Spawnfile +19 -0
- package/examples/moltnet-team-chat/teams/analysis/agents/representative/AGENTS.md +5 -0
- package/examples/moltnet-team-chat/teams/analysis/agents/representative/Spawnfile +19 -0
- package/examples/moltnet-team-chat/teams/field/Spawnfile +41 -0
- package/examples/moltnet-team-chat/teams/field/TEAM.md +3 -0
- package/examples/moltnet-team-chat/teams/field/agents/observer/AGENTS.md +5 -0
- package/examples/moltnet-team-chat/teams/field/agents/observer/Spawnfile +26 -0
- package/examples/moltnet-team-chat/teams/field/agents/representative/AGENTS.md +11 -0
- package/examples/moltnet-team-chat/teams/field/agents/representative/Spawnfile +26 -0
- package/examples/single-agent/AGENTS.md +3 -0
- package/examples/single-agent/HEARTBEAT.md +3 -0
- package/examples/single-agent/IDENTITY.md +3 -0
- package/examples/single-agent/MEMORY.md +3 -0
- package/examples/single-agent/SOUL.md +3 -0
- package/examples/single-agent/Spawnfile +41 -0
- package/examples/single-agent/skills/web_search/SKILL.md +6 -0
- package/moltnet-releases.json +5 -4
- package/package.json +36 -9
- package/runtimes.yaml +5 -2
- package/dist/cli/targetWorldClockCrossProcess.test-helper.d.ts +0 -13
- package/dist/cli/targetWorldClockCrossProcess.test-helper.js +0 -109
- package/dist/deployment/providerRuntimeBoundaryScanner.test-helper.d.ts +0 -8
- package/dist/deployment/providerRuntimeBoundaryScanner.test-helper.js +0 -60
- package/dist/deployment/simfileFixtureBoundary.test-helper.d.ts +0 -8
- package/dist/deployment/simfileFixtureBoundary.test-helper.js +0 -103
- package/dist/ownership/simfileRunOperatorInputs.d.ts +0 -103
- package/dist/ownership/simfileRunOperatorInputs.js +0 -139
- package/dist/target/cleanupRunDocker.test-helper.d.ts +0 -67
- package/dist/target/cleanupRunDocker.test-helper.js +0 -238
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { SpawnfileError } from "../shared/index.js";
|
|
2
|
+
import { assertOrganizationSegment, compareOrganizationIds, exactOrganizationStrings, organizationAgentPaths, organizationIdentityFail, requiredOrganizationIdentity, rootOrganizationTeam, } from "./organizationIdentityGraph.js";
|
|
3
|
+
const actorTokenFor = (server, tokenId, memberId, observePolicy = "forbid") => {
|
|
4
|
+
const token = server.auth.tokens?.filter((entry) => entry.id === tokenId);
|
|
5
|
+
if (token?.length !== 1) {
|
|
6
|
+
organizationIdentityFail(`Moltnet actor token ${tokenId} must exist exactly once`);
|
|
7
|
+
}
|
|
8
|
+
const selected = requiredOrganizationIdentity(token?.[0], `Moltnet actor token ${tokenId} must exist exactly once`);
|
|
9
|
+
const validScopes = (observePolicy !== "require" && exactOrganizationStrings(selected.scopes, ["attach", "write"])) || (observePolicy !== "forbid"
|
|
10
|
+
&& exactOrganizationStrings(selected.scopes, ["attach", "observe", "write"]));
|
|
11
|
+
if (!validScopes || !exactOrganizationStrings(selected.agents, [memberId])) {
|
|
12
|
+
organizationIdentityFail(`Moltnet actor token ${tokenId} has invalid scopes or agents for ${memberId}`);
|
|
13
|
+
}
|
|
14
|
+
return selected;
|
|
15
|
+
};
|
|
16
|
+
const isPairingAuthToken = (server, token) => token.agents === undefined
|
|
17
|
+
&& exactOrganizationStrings(token.scopes, ["pair"])
|
|
18
|
+
&& (server.pairings ?? []).filter((pairing) => pairing.id === token.id && pairing.token_secret === token.secret).length === 1;
|
|
19
|
+
const isObserveOnlyConsoleToken = (token) => token.agents === undefined && exactOrganizationStrings(token.scopes, ["observe"]);
|
|
20
|
+
const validateB31Networks = (plan) => {
|
|
21
|
+
const root = requiredOrganizationIdentity(rootOrganizationTeam(plan), "B31 root team is missing");
|
|
22
|
+
const services = requiredOrganizationIdentity(root.externalParticipants, "B31 participants are missing");
|
|
23
|
+
const networkIds = new Set(services.flatMap((service) => service.surfaces.moltnet.map((attachment) => attachment.network)));
|
|
24
|
+
for (const network of root.networks ?? []) {
|
|
25
|
+
if (!networkIds.has(network.id))
|
|
26
|
+
continue;
|
|
27
|
+
assertOrganizationSegment(network.id, "B31 network id");
|
|
28
|
+
if (network.server?.mode !== "managed" || network.server.auth.mode !== "bearer"
|
|
29
|
+
|| network.server.direct_messages !== true) {
|
|
30
|
+
organizationIdentityFail(`B31 network ${network.id} requires managed bearer direct_messages`);
|
|
31
|
+
}
|
|
32
|
+
const server = requiredOrganizationIdentity(network.server, `B31 network ${network.id} requires a managed server`);
|
|
33
|
+
if (JSON.stringify(server.auth.client) !== JSON.stringify({ token_id: "operator" })) {
|
|
34
|
+
organizationIdentityFail(`B31 network ${network.id} requires auth.client token_id operator`);
|
|
35
|
+
}
|
|
36
|
+
const tokens = server.auth.tokens ?? [];
|
|
37
|
+
const operator = tokens.find((token) => token.id === "operator");
|
|
38
|
+
if (tokens.filter((token) => token.id === "operator").length !== 1 || !operator
|
|
39
|
+
|| operator.agents !== undefined
|
|
40
|
+
|| !exactOrganizationStrings(operator.scopes, ["admin", "observe", "write"])) {
|
|
41
|
+
organizationIdentityFail(`B31 network ${network.id} has invalid operator token`);
|
|
42
|
+
}
|
|
43
|
+
const resolvedOperator = requiredOrganizationIdentity(operator, `B31 network ${network.id} has invalid operator token`);
|
|
44
|
+
const usedTokenIds = new Set();
|
|
45
|
+
const usedEnvNames = new Set();
|
|
46
|
+
for (const token of tokens) {
|
|
47
|
+
assertOrganizationSegment(token.id, "Moltnet token id");
|
|
48
|
+
if (!/^[A-Z_][A-Z0-9_]{0,127}$/u.test(token.secret)) {
|
|
49
|
+
organizationIdentityFail(`invalid Moltnet token env name ${token.secret}`);
|
|
50
|
+
}
|
|
51
|
+
if (usedTokenIds.has(token.id) || usedEnvNames.has(token.secret)) {
|
|
52
|
+
organizationIdentityFail(`duplicate Moltnet token identity ${token.id}`);
|
|
53
|
+
}
|
|
54
|
+
usedTokenIds.add(token.id);
|
|
55
|
+
usedEnvNames.add(token.secret);
|
|
56
|
+
if (token.id !== "operator" && token.secret === resolvedOperator.secret) {
|
|
57
|
+
organizationIdentityFail("operator and actor token env identities must differ");
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return networkIds;
|
|
62
|
+
};
|
|
63
|
+
export const validateB31MoltnetAuth = (plan) => {
|
|
64
|
+
const root = rootOrganizationTeam(plan);
|
|
65
|
+
if (!root?.externalParticipants?.length)
|
|
66
|
+
return;
|
|
67
|
+
const identity = requiredOrganizationIdentity(plan.organizationIdentity, "B31 organization identity is missing");
|
|
68
|
+
const paths = organizationAgentPaths(plan);
|
|
69
|
+
const networkIds = validateB31Networks(plan);
|
|
70
|
+
const selectedByNetwork = new Map();
|
|
71
|
+
const selectedActorKeys = new Set();
|
|
72
|
+
for (const member of identity.agentMembers) {
|
|
73
|
+
const source = [...paths.entries()].find(([, path]) => path.join(".") === member.memberId)?.[0];
|
|
74
|
+
const node = plan.nodes.find((entry) => entry.kind === "agent"
|
|
75
|
+
&& entry.value.source === source);
|
|
76
|
+
const attachments = node?.value?.surfaces?.moltnet ?? [];
|
|
77
|
+
for (const attachment of attachments.filter((entry) => networkIds.has(entry.network))) {
|
|
78
|
+
const network = root.networks?.find((entry) => entry.id === attachment.network);
|
|
79
|
+
const selectedTokenId = requiredOrganizationIdentity(attachment.auth?.tokenId, `B31 agent ${member.memberId} must select auth.token_id`);
|
|
80
|
+
const actorKey = `${attachment.network}\u0000${member.memberId}`;
|
|
81
|
+
if (selectedActorKeys.has(actorKey)) {
|
|
82
|
+
organizationIdentityFail(`B31 actor ${member.memberId} selects more than one token on ${attachment.network}`);
|
|
83
|
+
}
|
|
84
|
+
selectedActorKeys.add(actorKey);
|
|
85
|
+
if (network?.server?.mode === "managed") {
|
|
86
|
+
const token = actorTokenFor(network.server, selectedTokenId, member.memberId, node?.runtimeName === "daimon" ? "require" : "forbid");
|
|
87
|
+
const selected = selectedByNetwork.get(attachment.network) ?? new Map();
|
|
88
|
+
const previous = selected.get(selectedTokenId);
|
|
89
|
+
if (previous) {
|
|
90
|
+
organizationIdentityFail(`Moltnet actor token ${selectedTokenId} is shared by ${previous} and ${member.memberId}`);
|
|
91
|
+
}
|
|
92
|
+
selected.set(selectedTokenId, member.memberId);
|
|
93
|
+
selectedByNetwork.set(attachment.network, selected);
|
|
94
|
+
if (token.id === "operator") {
|
|
95
|
+
organizationIdentityFail(`B31 actor ${member.memberId} must not use operator token`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
for (const service of root.externalParticipants) {
|
|
101
|
+
for (const attachment of service.surfaces.moltnet) {
|
|
102
|
+
const network = root.networks?.find((entry) => entry.id === attachment.network);
|
|
103
|
+
if (network?.server?.mode !== "managed")
|
|
104
|
+
continue;
|
|
105
|
+
const token = actorTokenFor(network.server, attachment.auth.token_id, service.id, "allow");
|
|
106
|
+
if (token.id === "operator") {
|
|
107
|
+
organizationIdentityFail(`B31 external participant ${service.id} must not use operator token`);
|
|
108
|
+
}
|
|
109
|
+
const selected = selectedByNetwork.get(attachment.network) ?? new Map();
|
|
110
|
+
const previous = selected.get(token.id);
|
|
111
|
+
if (previous)
|
|
112
|
+
organizationIdentityFail(`Moltnet actor token ${token.id} is shared by ${previous} and ${service.id}`);
|
|
113
|
+
selected.set(token.id, service.id);
|
|
114
|
+
selectedByNetwork.set(attachment.network, selected);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
for (const network of root.networks ?? []) {
|
|
118
|
+
const selected = selectedByNetwork.get(network.id);
|
|
119
|
+
if (network.server?.mode !== "managed" || !selected)
|
|
120
|
+
continue;
|
|
121
|
+
for (const token of network.server.auth.tokens ?? []) {
|
|
122
|
+
if (token.id !== "operator" && !selected.has(token.id)
|
|
123
|
+
&& !isPairingAuthToken(network.server, token)
|
|
124
|
+
&& !isObserveOnlyConsoleToken(token)) {
|
|
125
|
+
organizationIdentityFail(`Moltnet actor token ${token.id} is not selected by exactly one actor`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
export const resolveMoltnetExternalParticipantIntents = (plan) => {
|
|
131
|
+
const identity = plan.organizationIdentity;
|
|
132
|
+
const root = rootOrganizationTeam(plan);
|
|
133
|
+
if (!identity || !root?.externalParticipants?.length)
|
|
134
|
+
return [];
|
|
135
|
+
const paths = organizationAgentPaths(plan);
|
|
136
|
+
const agents = new Map(identity.agentMembers.map((member) => [member.memberId, member]));
|
|
137
|
+
const networkIds = new Set((root.networks ?? []).map((network) => network.id));
|
|
138
|
+
const result = [];
|
|
139
|
+
for (const service of root.externalParticipants) {
|
|
140
|
+
const participant = identity.externalParticipants.find((entry) => entry.memberId === service.id);
|
|
141
|
+
if (!participant) {
|
|
142
|
+
throw new SpawnfileError("validation_error", `missing external participant identity: ${service.id}`);
|
|
143
|
+
}
|
|
144
|
+
for (const attachment of service.surfaces.moltnet) {
|
|
145
|
+
if (!networkIds.has(attachment.network)) {
|
|
146
|
+
organizationIdentityFail(`external participant ${service.id} references unknown network ${attachment.network}`);
|
|
147
|
+
}
|
|
148
|
+
const peers = [];
|
|
149
|
+
for (const [memberId, agent] of agents) {
|
|
150
|
+
const node = plan.nodes.find((entry) => entry.kind === "agent"
|
|
151
|
+
&& paths.get(entry.value.source)?.join(".") === memberId);
|
|
152
|
+
const authored = node?.value?.surfaces?.moltnet ?? [];
|
|
153
|
+
const eligible = authored.filter((entry) => entry.network === attachment.network && entry.dms?.enabled === true);
|
|
154
|
+
if (eligible.length > 1) {
|
|
155
|
+
organizationIdentityFail(`duplicate eligible Moltnet peer for ${service.id}/${attachment.network}`);
|
|
156
|
+
}
|
|
157
|
+
if (eligible.length === 1)
|
|
158
|
+
peers.push(agent.memberId);
|
|
159
|
+
}
|
|
160
|
+
if (new Set(peers).size !== peers.length) {
|
|
161
|
+
organizationIdentityFail(`duplicate eligible Moltnet peer for ${service.id}/${attachment.network}`);
|
|
162
|
+
}
|
|
163
|
+
if (peers.length === 0) {
|
|
164
|
+
organizationIdentityFail(`external participant ${service.id}/${attachment.network} has no eligible direct-message peers`);
|
|
165
|
+
}
|
|
166
|
+
peers.sort(compareOrganizationIds);
|
|
167
|
+
const network = root.networks?.find((entry) => entry.id === attachment.network);
|
|
168
|
+
const token = network?.server?.mode === "managed"
|
|
169
|
+
? actorTokenFor(network.server, attachment.auth.token_id, service.id, "allow")
|
|
170
|
+
: undefined;
|
|
171
|
+
result.push({ participant, networkId: attachment.network, tokenId: attachment.auth.token_id,
|
|
172
|
+
tokenEnv: token?.secret ?? "", directMessagePeers: peers });
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return result;
|
|
176
|
+
};
|
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
import type { CompilePlan
|
|
2
|
-
export
|
|
3
|
-
export
|
|
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;
|
|
1
|
+
import type { CompilePlan } from "./types.js";
|
|
2
|
+
export { MAX_EXTERNAL_PARTICIPANTS, MAX_ORGANIZATION_AGENT_MEMBERS, MAX_ORGANIZATION_MEMBER_DEPTH, MAX_ORGANIZATION_MEMBER_ID_BYTES, ORGANIZATION_ID_SEGMENT_PATTERN_SOURCE, ORGANIZATION_MEMBER_ID_PATTERN_SOURCE, } from "./organizationIdentityGraph.js";
|
|
3
|
+
export { resolveMoltnetExternalParticipantIntents, validateB31MoltnetAuth, } from "./organizationExternalParticipants.js";
|
|
8
4
|
export interface ResolvedOrganizationAgentMember {
|
|
9
5
|
readonly authoredMemberKey: string;
|
|
10
6
|
readonly kind: "agent";
|
|
@@ -23,5 +19,3 @@ export interface ResolvedOrganizationIdentity {
|
|
|
23
19
|
}
|
|
24
20
|
export declare const resolveCanonicalAgentMemberId: (plan: CompilePlan, agentSource: string) => string | undefined;
|
|
25
21
|
export declare const resolveOrganizationIdentity: (plan: CompilePlan) => ResolvedOrganizationIdentity | undefined;
|
|
26
|
-
export declare const validateB31MoltnetAuth: (plan: CompilePlan) => void;
|
|
27
|
-
export declare const resolveMoltnetExternalParticipantIntents: (plan: CompilePlan) => MoltnetExternalParticipantIntent[];
|
|
@@ -1,297 +1,64 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export
|
|
3
|
-
export
|
|
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");
|
|
1
|
+
import { assertOrganizationSegment, compareOrganizationIds, freezeOrganizationIdentity, MAX_EXTERNAL_PARTICIPANTS, MAX_ORGANIZATION_AGENT_MEMBERS, MAX_ORGANIZATION_MEMBER_DEPTH, MAX_ORGANIZATION_MEMBER_ID_BYTES, ORGANIZATION_MEMBER_ID_PATTERN_SOURCE, organizationAgentPaths, organizationIdentityFail, rootOrganizationTeam, } from "./organizationIdentityGraph.js";
|
|
2
|
+
export { MAX_EXTERNAL_PARTICIPANTS, MAX_ORGANIZATION_AGENT_MEMBERS, MAX_ORGANIZATION_MEMBER_DEPTH, MAX_ORGANIZATION_MEMBER_ID_BYTES, ORGANIZATION_ID_SEGMENT_PATTERN_SOURCE, ORGANIZATION_MEMBER_ID_PATTERN_SOURCE, } from "./organizationIdentityGraph.js";
|
|
3
|
+
export { resolveMoltnetExternalParticipantIntents, validateB31MoltnetAuth, } from "./organizationExternalParticipants.js";
|
|
9
4
|
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
5
|
export const resolveCanonicalAgentMemberId = (plan, agentSource) => {
|
|
100
|
-
|
|
101
|
-
if (!identity)
|
|
6
|
+
if (!plan.organizationIdentity)
|
|
102
7
|
return undefined;
|
|
103
|
-
|
|
104
|
-
return path?.join(".");
|
|
8
|
+
return organizationAgentPaths(plan).get(agentSource)?.join(".");
|
|
105
9
|
};
|
|
106
10
|
export const resolveOrganizationIdentity = (plan) => {
|
|
107
|
-
const root =
|
|
108
|
-
const declaredTeams = plan.nodes.filter((node) => node.kind === "team"
|
|
11
|
+
const root = rootOrganizationTeam(plan);
|
|
12
|
+
const declaredTeams = plan.nodes.filter((node) => node.kind === "team"
|
|
13
|
+
&& (node.value.externalParticipants?.length ?? 0) > 0);
|
|
109
14
|
if (declaredTeams.some((node) => node.value.source !== root?.source)) {
|
|
110
|
-
|
|
15
|
+
organizationIdentityFail("external_participants may only be declared on the root team");
|
|
111
16
|
}
|
|
112
|
-
if (!root
|
|
17
|
+
if (!root)
|
|
113
18
|
return undefined;
|
|
114
|
-
const paths =
|
|
19
|
+
const paths = organizationAgentPaths(plan);
|
|
115
20
|
const agents = [];
|
|
116
21
|
const agentIds = new Set();
|
|
117
22
|
for (const node of plan.nodes.filter((entry) => entry.kind === "agent")) {
|
|
118
23
|
const path = paths.get(node.value.source);
|
|
119
24
|
if (!path)
|
|
120
25
|
continue;
|
|
121
|
-
if (path.length > MAX_ORGANIZATION_MEMBER_DEPTH)
|
|
122
|
-
|
|
123
|
-
|
|
26
|
+
if (path.length > MAX_ORGANIZATION_MEMBER_DEPTH) {
|
|
27
|
+
organizationIdentityFail("organization member depth exceeds 8");
|
|
28
|
+
}
|
|
29
|
+
path.forEach((part) => assertOrganizationSegment(part, "organization member slot"));
|
|
124
30
|
const memberId = path.join(".");
|
|
125
|
-
if (!memberIdPattern.test(memberId)
|
|
126
|
-
|
|
31
|
+
if (!memberIdPattern.test(memberId)
|
|
32
|
+
|| Buffer.byteLength(memberId, "ascii") > MAX_ORGANIZATION_MEMBER_ID_BYTES) {
|
|
33
|
+
organizationIdentityFail(`invalid organization member id: ${memberId}`);
|
|
34
|
+
}
|
|
127
35
|
if (agentIds.has(memberId))
|
|
128
|
-
|
|
36
|
+
organizationIdentityFail(`duplicate organization member id: ${memberId}`);
|
|
129
37
|
agentIds.add(memberId);
|
|
130
38
|
agents.push({ authoredMemberKey: path.at(-1), kind: "agent", memberId, principalId: `agent:${memberId}` });
|
|
131
39
|
}
|
|
132
|
-
if (agents.length > MAX_ORGANIZATION_AGENT_MEMBERS)
|
|
133
|
-
|
|
40
|
+
if (agents.length > MAX_ORGANIZATION_AGENT_MEMBERS) {
|
|
41
|
+
organizationIdentityFail("organization has too many agent members");
|
|
42
|
+
}
|
|
134
43
|
const seen = new Set();
|
|
135
|
-
const externalParticipants = root.externalParticipants.map((service) => {
|
|
136
|
-
|
|
44
|
+
const externalParticipants = (root.externalParticipants ?? []).map((service) => {
|
|
45
|
+
assertOrganizationSegment(service.id, "external participant id");
|
|
137
46
|
if (seen.has(service.id))
|
|
138
|
-
|
|
47
|
+
organizationIdentityFail(`organization member collision: ${service.id}`);
|
|
139
48
|
seen.add(service.id);
|
|
140
|
-
return { authoredParticipantKey: service.id, kind: "service",
|
|
49
|
+
return { authoredParticipantKey: service.id, kind: "service",
|
|
50
|
+
memberId: service.id, principalId: `system:${service.id}` };
|
|
141
51
|
});
|
|
142
|
-
for (const agent of agents)
|
|
52
|
+
for (const agent of agents) {
|
|
143
53
|
if (seen.has(agent.memberId))
|
|
144
|
-
|
|
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}`);
|
|
54
|
+
organizationIdentityFail(`organization member collision: ${agent.memberId}`);
|
|
159
55
|
}
|
|
160
|
-
|
|
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
|
-
}
|
|
56
|
+
if (externalParticipants.length > MAX_EXTERNAL_PARTICIPANTS) {
|
|
57
|
+
organizationIdentityFail("too many external participants");
|
|
257
58
|
}
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
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;
|
|
59
|
+
const result = {
|
|
60
|
+
agentMembers: agents.sort((a, b) => compareOrganizationIds(a.memberId, b.memberId)),
|
|
61
|
+
externalParticipants: externalParticipants.sort((a, b) => compareOrganizationIds(a.memberId, b.memberId)),
|
|
62
|
+
};
|
|
63
|
+
return freezeOrganizationIdentity(structuredClone(result));
|
|
297
64
|
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { CompilePlan, ResolvedTeamNode } 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 declare const organizationIdentityFail: (message: string) => never;
|
|
9
|
+
export declare const requiredOrganizationIdentity: <T>(value: T, message: string) => NonNullable<T>;
|
|
10
|
+
export declare const assertOrganizationSegment: (value: string, label: string) => void;
|
|
11
|
+
export declare const freezeOrganizationIdentity: <T>(value: T) => T;
|
|
12
|
+
export declare const compareOrganizationIds: (left: string, right: string) => number;
|
|
13
|
+
export declare const exactOrganizationStrings: (actual: readonly string[] | undefined, expected: readonly string[]) => boolean;
|
|
14
|
+
export declare const rootOrganizationTeam: (plan: CompilePlan) => ResolvedTeamNode | undefined;
|
|
15
|
+
export declare const organizationAgentPaths: (plan: CompilePlan) => Map<string, string[]>;
|