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.
Files changed (598) hide show
  1. package/README.md +50 -11
  2. package/dist/audit/auditCli.d.ts +19 -0
  3. package/dist/audit/auditCli.js +63 -0
  4. package/dist/audit/checks.d.ts +100 -0
  5. package/dist/audit/checks.js +279 -0
  6. package/dist/audit/checksShared.d.ts +74 -0
  7. package/dist/audit/checksShared.js +37 -0
  8. package/dist/audit/generateAudit.d.ts +19 -0
  9. package/dist/audit/generateAudit.js +122 -0
  10. package/dist/audit/index.d.ts +4 -0
  11. package/dist/audit/index.js +4 -0
  12. package/dist/audit/readAudit.d.ts +50 -0
  13. package/dist/audit/readAudit.js +59 -0
  14. package/dist/audit/types.d.ts +40 -0
  15. package/dist/audit/types.js +8 -0
  16. package/dist/auth/credentialEnvFile.d.ts +11 -0
  17. package/dist/auth/credentialEnvFile.js +60 -0
  18. package/dist/auth/credentialProvisioning.d.ts +15 -0
  19. package/dist/auth/credentialProvisioning.js +75 -0
  20. package/dist/auth/credentialProvisioningReceipt.d.ts +28 -0
  21. package/dist/auth/credentialProvisioningReceipt.js +70 -0
  22. package/dist/auth/credentialProvisioningRequest.d.ts +51 -0
  23. package/dist/auth/credentialProvisioningRequest.js +169 -0
  24. package/dist/auth/credentialWorldBindings.d.ts +21 -0
  25. package/dist/auth/credentialWorldBindings.js +104 -0
  26. package/dist/auth/index.d.ts +7 -0
  27. package/dist/auth/index.js +7 -0
  28. package/dist/auth/paths.d.ts +11 -0
  29. package/dist/auth/paths.js +21 -0
  30. package/dist/auth/targetSecretSourceAuthor.d.ts +18 -0
  31. package/dist/auth/targetSecretSourceAuthor.js +52 -0
  32. package/dist/auth/targetSecretSourceFsPublish.d.ts +15 -0
  33. package/dist/auth/targetSecretSourceFsPublish.js +49 -0
  34. package/dist/auth/targetSecretSourceFsPublishImmutable.d.ts +16 -0
  35. package/dist/auth/targetSecretSourceFsPublishImmutable.js +435 -0
  36. package/dist/auth/targetSecretSourceFsRead.d.ts +14 -0
  37. package/dist/auth/targetSecretSourceFsRead.js +198 -0
  38. package/dist/auth/targetSecretSourceGrant.d.ts +16 -0
  39. package/dist/auth/targetSecretSourceGrant.js +99 -0
  40. package/dist/auth/targetSecretSourceGrantRecords.d.ts +84 -0
  41. package/dist/auth/targetSecretSourceGrantRecords.js +214 -0
  42. package/dist/auth/targetSecretSourceLifecycle.d.ts +30 -0
  43. package/dist/auth/targetSecretSourceLifecycle.js +52 -0
  44. package/dist/auth/targetSecretSourceOwnerEntropy.d.ts +6 -0
  45. package/dist/auth/targetSecretSourceOwnerEntropy.js +28 -0
  46. package/dist/auth/targetSecretSourceRecordCommon.d.ts +14 -0
  47. package/dist/auth/targetSecretSourceRecordCommon.js +100 -0
  48. package/dist/auth/targetSecretSourceRecordPublish.d.ts +10 -0
  49. package/dist/auth/targetSecretSourceRecordPublish.js +104 -0
  50. package/dist/auth/targetSecretSourceResolver.d.ts +10 -0
  51. package/dist/auth/targetSecretSourceResolver.js +137 -0
  52. package/dist/auth/targetSecretSourceRevoke.d.ts +20 -0
  53. package/dist/auth/targetSecretSourceRevoke.js +92 -0
  54. package/dist/auth/targetSecretSourceRotate.d.ts +19 -0
  55. package/dist/auth/targetSecretSourceRotate.js +121 -0
  56. package/dist/auth/targetSecretSourceVersionRecords.d.ts +49 -0
  57. package/dist/auth/targetSecretSourceVersionRecords.js +166 -0
  58. package/dist/cli/artifactsCommands.d.ts +27 -0
  59. package/dist/cli/artifactsCommands.js +132 -0
  60. package/dist/cli/authCommands.d.ts +5 -0
  61. package/dist/cli/authCommands.js +221 -0
  62. package/dist/cli/compileBuildCommands.d.ts +3 -0
  63. package/dist/cli/compileBuildCommands.js +35 -0
  64. package/dist/cli/containerBundleCommand.d.ts +6 -0
  65. package/dist/cli/containerBundleCommand.js +116 -0
  66. package/dist/cli/downCommand.d.ts +25 -0
  67. package/dist/cli/downCommand.js +134 -0
  68. package/dist/cli/index.js +6 -3
  69. package/dist/cli/lifecycleCommands.d.ts +1 -1
  70. package/dist/cli/lifecycleCommands.js +11 -181
  71. package/dist/cli/lifecycleMachine.d.ts +19 -0
  72. package/dist/cli/lifecycleMachine.js +78 -0
  73. package/dist/cli/lifecyclePlan.d.ts +35 -0
  74. package/dist/cli/lifecyclePlan.js +240 -0
  75. package/dist/cli/lifecyclePlanningCommands.d.ts +3 -0
  76. package/dist/cli/lifecyclePlanningCommands.js +30 -0
  77. package/dist/cli/runCli.d.ts +9 -2
  78. package/dist/cli/runCli.js +27 -71
  79. package/dist/cli/runPublishCommands.d.ts +3 -0
  80. package/dist/cli/runPublishCommands.js +70 -0
  81. package/dist/cli/statusCommand.d.ts +3 -33
  82. package/dist/cli/statusCommand.js +19 -249
  83. package/dist/cli/statusCommandLive.d.ts +20 -0
  84. package/dist/cli/statusCommandLive.js +188 -0
  85. package/dist/cli/statusCommandOptions.d.ts +40 -0
  86. package/dist/cli/statusCommandOptions.js +42 -0
  87. package/dist/cli/targetCliRoute.d.ts +2 -0
  88. package/dist/cli/targetCliRoute.js +30 -0
  89. package/dist/cli/targetCommands.d.ts +33 -0
  90. package/dist/cli/targetCommands.js +257 -0
  91. package/dist/cli/targetComposedPreparationCommand.d.ts +6 -0
  92. package/dist/cli/targetComposedPreparationCommand.js +39 -0
  93. package/dist/cli/targetDefaultArtifactAuthority.d.ts +5 -0
  94. package/dist/cli/targetDefaultArtifactAuthority.js +28 -0
  95. package/dist/cli/targetDefaultAuthorities.d.ts +53 -0
  96. package/dist/cli/targetDefaultAuthorities.js +210 -0
  97. package/dist/cli/targetDefaultConfig.d.ts +68 -0
  98. package/dist/cli/targetDefaultConfig.js +317 -0
  99. package/dist/cli/targetDefaultConfigStdin.d.ts +13 -0
  100. package/dist/cli/targetDefaultConfigStdin.js +215 -0
  101. package/dist/cli/targetDefaultEnvelope.d.ts +1 -0
  102. package/dist/cli/targetDefaultEnvelope.js +13 -0
  103. package/dist/cli/targetDefaultHandlerFactory.d.ts +28 -0
  104. package/dist/cli/targetDefaultHandlerFactory.js +247 -0
  105. package/dist/cli/targetDefaultHandlers.d.ts +21 -0
  106. package/dist/cli/targetDefaultHandlers.js +72 -0
  107. package/dist/cli/targetDefaultJournalAuthority.d.ts +35 -0
  108. package/dist/cli/targetDefaultJournalAuthority.js +135 -0
  109. package/dist/cli/targetDefaultWorldClock.d.ts +4 -0
  110. package/dist/cli/targetDefaultWorldClock.js +14 -0
  111. package/dist/cli/targetDefaultWorldQueries.d.ts +5 -0
  112. package/dist/cli/targetDefaultWorldQueries.js +11 -0
  113. package/dist/cli/targetDefaultWorldReadiness.d.ts +4 -0
  114. package/dist/cli/targetDefaultWorldReadiness.js +17 -0
  115. package/dist/cli/targetEvidenceHelperResolution.d.ts +14 -0
  116. package/dist/cli/targetEvidenceHelperResolution.js +23 -0
  117. package/dist/cli/targetLookupCli.d.ts +3 -0
  118. package/dist/cli/targetLookupCli.js +31 -0
  119. package/dist/cli/targetLookupCommands.d.ts +12 -0
  120. package/dist/cli/targetLookupCommands.js +69 -0
  121. package/dist/cli/targetOperationDispatch.d.ts +58 -0
  122. package/dist/cli/targetOperationDispatch.js +21 -0
  123. package/dist/cli/targetReceiptOutput.d.ts +14 -0
  124. package/dist/cli/targetReceiptOutput.js +21 -0
  125. package/dist/cli/targetRequestFile.d.ts +14 -0
  126. package/dist/cli/targetRequestFile.js +63 -0
  127. package/dist/cli/targetSecretSourceInput.d.ts +28 -0
  128. package/dist/cli/targetSecretSourceInput.js +121 -0
  129. package/dist/cli/targetWorldClockCommand.d.ts +10 -0
  130. package/dist/cli/targetWorldClockCommand.js +42 -0
  131. package/dist/cli/targetWorldClockCrossProcess.test-helper.d.ts +13 -0
  132. package/dist/cli/targetWorldClockCrossProcess.test-helper.js +109 -0
  133. package/dist/cli/targetWorldReadinessCommand.d.ts +10 -0
  134. package/dist/cli/targetWorldReadinessCommand.js +43 -0
  135. package/dist/cli/upCommand.d.ts +3 -0
  136. package/dist/cli/upCommand.js +133 -0
  137. package/dist/cli/upImageCommand.d.ts +11 -0
  138. package/dist/cli/upImageCommand.js +41 -0
  139. package/dist/cli/upLifecycleInvocation.d.ts +41 -0
  140. package/dist/cli/upLifecycleInvocation.js +48 -0
  141. package/dist/cli/upLifecycleRecovery.d.ts +4 -0
  142. package/dist/cli/upLifecycleRecovery.js +53 -0
  143. package/dist/compiler/agentNodeMerge.d.ts +2 -0
  144. package/dist/compiler/agentNodeMerge.js +79 -0
  145. package/dist/compiler/agentSurfaces.js +11 -1
  146. package/dist/compiler/buildCompilePlan.js +17 -0
  147. package/dist/compiler/buildCompilePlanAgent.d.ts +11 -0
  148. package/dist/compiler/buildCompilePlanAgent.js +56 -0
  149. package/dist/compiler/buildCompilePlanTeams.d.ts +1 -0
  150. package/dist/compiler/buildCompilePlanTeams.js +4 -1
  151. package/dist/compiler/buildCompilePlanTraversal.js +75 -82
  152. package/dist/compiler/buildProject.d.ts +11 -0
  153. package/dist/compiler/buildProject.js +77 -2
  154. package/dist/compiler/compilePlanHelpers.js +2 -0
  155. package/dist/compiler/compileProject.d.ts +13 -0
  156. package/dist/compiler/compileProject.js +26 -74
  157. package/dist/compiler/compileProjectPolicy.d.ts +5 -0
  158. package/dist/compiler/compileProjectPolicy.js +21 -0
  159. package/dist/compiler/compileProjectReports.d.ts +9 -0
  160. package/dist/compiler/compileProjectReports.js +52 -0
  161. package/dist/compiler/containerArtifactSummaries.d.ts +7 -0
  162. package/dist/compiler/containerArtifactSummaries.js +138 -0
  163. package/dist/compiler/containerArtifacts.d.ts +10 -0
  164. package/dist/compiler/containerArtifacts.js +126 -125
  165. package/dist/compiler/containerArtifactsPlans.d.ts +5 -3
  166. package/dist/compiler/containerArtifactsPlans.js +31 -118
  167. package/dist/compiler/containerArtifactsRender.d.ts +3 -1
  168. package/dist/compiler/containerArtifactsRender.js +15 -12
  169. package/dist/compiler/containerArtifactsTypes.d.ts +12 -0
  170. package/dist/compiler/containerConfigEnvRender.d.ts +3 -0
  171. package/dist/compiler/containerConfigEnvRender.js +54 -0
  172. package/dist/compiler/containerEntrypointRender.d.ts +1 -0
  173. package/dist/compiler/containerEntrypointRender.js +56 -52
  174. package/dist/compiler/containerEntrypointShell.d.ts +5 -0
  175. package/dist/compiler/containerEntrypointShell.js +29 -0
  176. package/dist/compiler/containerPackageOverrides.d.ts +27 -0
  177. package/dist/compiler/containerPackageOverrides.js +63 -0
  178. package/dist/compiler/containerTargetPlanResolution.d.ts +20 -0
  179. package/dist/compiler/containerTargetPlanResolution.js +97 -0
  180. package/dist/compiler/daimonTelemetryArtifacts.d.ts +22 -0
  181. package/dist/compiler/daimonTelemetryArtifacts.js +61 -0
  182. package/dist/compiler/dockerBuildContext.d.ts +16 -0
  183. package/dist/compiler/dockerBuildContext.js +159 -0
  184. package/dist/compiler/dockerBuildSkip.d.ts +30 -0
  185. package/dist/compiler/dockerBuildSkip.js +81 -0
  186. package/dist/compiler/index.d.ts +4 -0
  187. package/dist/compiler/index.js +4 -0
  188. package/dist/compiler/memoryArtifacts.d.ts +26 -0
  189. package/dist/compiler/memoryArtifacts.js +134 -0
  190. package/dist/compiler/memoryResolution.d.ts +4 -0
  191. package/dist/compiler/memoryResolution.js +147 -0
  192. package/dist/compiler/modelEnv.d.ts +2 -0
  193. package/dist/compiler/modelEnv.js +6 -0
  194. package/dist/compiler/moltnetAllowedWakeSendersValidation.d.ts +2 -0
  195. package/dist/compiler/moltnetAllowedWakeSendersValidation.js +42 -0
  196. package/dist/compiler/moltnetArtifactPaths.d.ts +26 -0
  197. package/dist/compiler/moltnetArtifactPaths.js +49 -0
  198. package/dist/compiler/moltnetArtifactTypes.d.ts +46 -0
  199. package/dist/compiler/moltnetArtifactTypes.js +1 -0
  200. package/dist/compiler/moltnetArtifacts.d.ts +2 -40
  201. package/dist/compiler/moltnetArtifacts.js +43 -97
  202. package/dist/compiler/moltnetBinaries.d.ts +21 -4
  203. package/dist/compiler/moltnetBinaries.js +134 -27
  204. package/dist/compiler/moltnetClientConfig.js +7 -2
  205. package/dist/compiler/moltnetConfigLowering.d.ts +16 -1
  206. package/dist/compiler/moltnetConfigLowering.js +67 -5
  207. package/dist/compiler/moltnetExternalParticipantArtifact.d.ts +38 -0
  208. package/dist/compiler/moltnetExternalParticipantArtifact.js +188 -0
  209. package/dist/compiler/moltnetNodeConfig.js +7 -2
  210. package/dist/compiler/moltnetReleaseAuthority.d.ts +17 -0
  211. package/dist/compiler/moltnetReleaseAuthority.js +73 -0
  212. package/dist/compiler/moltnetReleaseDownload.d.ts +12 -0
  213. package/dist/compiler/moltnetReleaseDownload.js +85 -0
  214. package/dist/compiler/moltnetRepresentativeResolution.d.ts +1 -0
  215. package/dist/compiler/moltnetRepresentativeResolution.js +16 -2
  216. package/dist/compiler/moltnetResolution.js +72 -20
  217. package/dist/compiler/moltnetRoomMemberships.js +37 -9
  218. package/dist/compiler/moltnetServerPlans.d.ts +9 -0
  219. package/dist/compiler/moltnetServerPlans.js +132 -0
  220. package/dist/compiler/organizationIdentity.d.ts +27 -0
  221. package/dist/compiler/organizationIdentity.js +297 -0
  222. package/dist/compiler/organizationReadyEvidence.d.ts +49 -0
  223. package/dist/compiler/organizationReadyEvidence.js +261 -0
  224. package/dist/compiler/projectManifestGraph.d.ts +4 -0
  225. package/dist/compiler/projectManifestGraph.js +24 -0
  226. package/dist/compiler/runProject.d.ts +4 -0
  227. package/dist/compiler/runProject.js +30 -21
  228. package/dist/compiler/runProjectAuth.d.ts +7 -1
  229. package/dist/compiler/runProjectAuth.js +87 -9
  230. package/dist/compiler/runProjectDocker.d.ts +7 -0
  231. package/dist/compiler/runProjectDocker.js +31 -8
  232. package/dist/compiler/runProjectLifecycle.d.ts +7 -0
  233. package/dist/compiler/runProjectLifecycle.js +40 -0
  234. package/dist/compiler/syncProjectAuth.js +4 -1
  235. package/dist/compiler/teamContextActiveEnvironments.d.ts +13 -0
  236. package/dist/compiler/teamContextActiveEnvironments.js +255 -0
  237. package/dist/compiler/teamContextSupport.js +32 -40
  238. package/dist/compiler/teamContextTypes.d.ts +2 -0
  239. package/dist/compiler/types.d.ts +82 -1
  240. package/dist/compiler/upProject.d.ts +5 -0
  241. package/dist/compiler/upProject.js +256 -20
  242. package/dist/compiler/upReceipt.d.ts +36 -0
  243. package/dist/compiler/upReceipt.js +82 -0
  244. package/dist/compiler/updateProjectModels.js +42 -60
  245. package/dist/compiler/updateProjectRuntime.js +22 -35
  246. package/dist/compiler/updateProjectSurfaces.js +53 -47
  247. package/dist/compiler/worldBindings.d.ts +39 -0
  248. package/dist/compiler/worldBindings.js +247 -0
  249. package/dist/compiler/worldBindingsFile.d.ts +5 -0
  250. package/dist/compiler/worldBindingsFile.js +162 -0
  251. package/dist/deployment/artifactsExport.d.ts +49 -0
  252. package/dist/deployment/artifactsExport.js +217 -0
  253. package/dist/deployment/artifactsExportDocker.d.ts +48 -0
  254. package/dist/deployment/artifactsExportDocker.js +91 -0
  255. package/dist/deployment/artifactsExportPlan.d.ts +24 -0
  256. package/dist/deployment/artifactsExportPlan.js +135 -0
  257. package/dist/deployment/artifactsExportTypes.d.ts +50 -0
  258. package/dist/deployment/artifactsExportTypes.js +52 -0
  259. package/dist/deployment/buildImageCacheStore.d.ts +23 -0
  260. package/dist/deployment/buildImageCacheStore.js +54 -0
  261. package/dist/deployment/deploymentLifecycleCorrelation.d.ts +11 -0
  262. package/dist/deployment/deploymentLifecycleCorrelation.js +33 -0
  263. package/dist/deployment/dockerInspect.d.ts +9 -0
  264. package/dist/deployment/dockerInspect.js +24 -1
  265. package/dist/deployment/dockerLabels.d.ts +2 -0
  266. package/dist/deployment/dockerLabels.js +2 -0
  267. package/dist/deployment/dockerLogs.js +2 -10
  268. package/dist/deployment/dockerManager.d.ts +51 -0
  269. package/dist/deployment/dockerManager.js +118 -1
  270. package/dist/deployment/dockerProbeGateway.js +64 -5
  271. package/dist/deployment/dockerRecover.js +9 -1
  272. package/dist/deployment/dockerTeardown.d.ts +32 -0
  273. package/dist/deployment/dockerTeardown.js +61 -0
  274. package/dist/deployment/downDeployment.d.ts +34 -0
  275. package/dist/deployment/downDeployment.js +147 -0
  276. package/dist/deployment/downReceiptTypes.d.ts +21 -0
  277. package/dist/deployment/downReceiptTypes.js +30 -0
  278. package/dist/deployment/index.d.ts +16 -0
  279. package/dist/deployment/index.js +17 -0
  280. package/dist/deployment/lifecycleCompletion.d.ts +37 -0
  281. package/dist/deployment/lifecycleCompletion.js +236 -0
  282. package/dist/deployment/lifecycleCompletionContracts.d.ts +158 -0
  283. package/dist/deployment/lifecycleCompletionContracts.js +106 -0
  284. package/dist/deployment/lifecycleCompletionHeartbeat.d.ts +2 -0
  285. package/dist/deployment/lifecycleCompletionHeartbeat.js +50 -0
  286. package/dist/deployment/lifecycleCompletionLookup.d.ts +18 -0
  287. package/dist/deployment/lifecycleCompletionLookup.js +88 -0
  288. package/dist/deployment/lifecycleCompletionOwner.d.ts +8 -0
  289. package/dist/deployment/lifecycleCompletionOwner.js +31 -0
  290. package/dist/deployment/lifecycleCompletionParsing.d.ts +12 -0
  291. package/dist/deployment/lifecycleCompletionParsing.js +108 -0
  292. package/dist/deployment/lifecycleCompletionPaths.d.ts +9 -0
  293. package/dist/deployment/lifecycleCompletionPaths.js +16 -0
  294. package/dist/deployment/lifecycleCompletionPublication.d.ts +5 -0
  295. package/dist/deployment/lifecycleCompletionPublication.js +35 -0
  296. package/dist/deployment/lifecycleCompletionRecovery.d.ts +21 -0
  297. package/dist/deployment/lifecycleCompletionRecovery.js +56 -0
  298. package/dist/deployment/lifecycleCompletionRoot.d.ts +21 -0
  299. package/dist/deployment/lifecycleCompletionRoot.js +243 -0
  300. package/dist/deployment/lifecycleCompletionStore.d.ts +6 -0
  301. package/dist/deployment/lifecycleCompletionStore.js +151 -0
  302. package/dist/deployment/organizationHandoffAuthorityFsClient.d.ts +17 -0
  303. package/dist/deployment/organizationHandoffAuthorityFsClient.js +132 -0
  304. package/dist/deployment/organizationHandoffAuthorityFsWorker.d.ts +1 -0
  305. package/dist/deployment/organizationHandoffAuthorityFsWorker.js +285 -0
  306. package/dist/deployment/organizationHandoffAuthorityFsWorkerParent.fixture.d.ts +1 -0
  307. package/dist/deployment/organizationHandoffAuthorityFsWorkerParent.fixture.js +26 -0
  308. package/dist/deployment/organizationHandoffAuthorityStore.d.ts +41 -0
  309. package/dist/deployment/organizationHandoffAuthorityStore.js +348 -0
  310. package/dist/deployment/organizationHandoffAuthorityTypes.d.ts +76 -0
  311. package/dist/deployment/organizationHandoffAuthorityTypes.js +148 -0
  312. package/dist/deployment/organizationHandoffTypes.d.ts +29 -0
  313. package/dist/deployment/organizationHandoffTypes.js +80 -0
  314. package/dist/deployment/organizationReady.d.ts +52 -0
  315. package/dist/deployment/organizationReady.js +200 -0
  316. package/dist/deployment/privateArtifactsExport.d.ts +18 -0
  317. package/dist/deployment/privateArtifactsExport.js +80 -0
  318. package/dist/deployment/providerRuntimeBoundaryScanner.test-helper.d.ts +8 -0
  319. package/dist/deployment/providerRuntimeBoundaryScanner.test-helper.js +60 -0
  320. package/dist/deployment/record.d.ts +26 -1
  321. package/dist/deployment/record.js +49 -4
  322. package/dist/deployment/simfileFixtureBoundary.test-helper.d.ts +8 -0
  323. package/dist/deployment/simfileFixtureBoundary.test-helper.js +103 -0
  324. package/dist/deployment/target.d.ts +1 -35
  325. package/dist/deployment/target.js +1 -96
  326. package/dist/deployment/upReceiptTypes.d.ts +111 -0
  327. package/dist/deployment/upReceiptTypes.js +164 -0
  328. package/dist/dev/project.js +15 -9
  329. package/dist/distribution/buildDistributionReport.d.ts +2 -1
  330. package/dist/distribution/buildDistributionReport.js +2 -1
  331. package/dist/distribution/distributionReportSchema.d.ts +5 -0
  332. package/dist/distribution/distributionReportSchema.js +7 -2
  333. package/dist/distribution/index.d.ts +2 -2
  334. package/dist/distribution/index.js +1 -1
  335. package/dist/distribution/types.d.ts +7 -0
  336. package/dist/distribution/types.js +1 -0
  337. package/dist/filesystem/paths.js +10 -1
  338. package/dist/ledger/causalConformanceCli.d.ts +1 -0
  339. package/dist/ledger/causalConformanceCli.js +41 -0
  340. package/dist/ledger/causeNamespace.d.ts +8 -0
  341. package/dist/ledger/causeNamespace.js +24 -0
  342. package/dist/ledger/conformance.d.ts +83 -0
  343. package/dist/ledger/conformance.js +259 -0
  344. package/dist/ledger/emitters.d.ts +76 -0
  345. package/dist/ledger/emitters.js +188 -0
  346. package/dist/ledger/index.d.ts +4 -0
  347. package/dist/ledger/index.js +4 -0
  348. package/dist/ledger/principal.d.ts +96 -0
  349. package/dist/ledger/principal.js +121 -0
  350. package/dist/manifest/externalParticipantSchemas.d.ts +18 -0
  351. package/dist/manifest/externalParticipantSchemas.js +17 -0
  352. package/dist/manifest/index.d.ts +1 -0
  353. package/dist/manifest/index.js +1 -0
  354. package/dist/manifest/inlineAgentMember.d.ts +2 -0
  355. package/dist/manifest/inlineAgentMember.js +9 -0
  356. package/dist/manifest/loadManifest.js +14 -8
  357. package/dist/manifest/mcpSchemas.d.ts +17 -0
  358. package/dist/manifest/mcpSchemas.js +41 -0
  359. package/dist/manifest/memorySchemas.d.ts +245 -0
  360. package/dist/manifest/memorySchemas.js +148 -0
  361. package/dist/manifest/renderSpawnfile.js +22 -131
  362. package/dist/manifest/renderSpawnfileNetworks.js +9 -2
  363. package/dist/manifest/renderSpawnfileSurfaces.d.ts +2 -0
  364. package/dist/manifest/renderSpawnfileSurfaces.js +134 -0
  365. package/dist/manifest/schemas.d.ts +1868 -99
  366. package/dist/manifest/schemas.js +78 -32
  367. package/dist/manifest/surfaceSchemas.d.ts +17 -0
  368. package/dist/manifest/surfaceSchemas.js +24 -1
  369. package/dist/manifest/teamNetworkAccessSchemas.d.ts +1 -1
  370. package/dist/manifest/teamNetworkAuthSchemas.d.ts +48 -0
  371. package/dist/manifest/teamNetworkAuthSchemas.js +103 -0
  372. package/dist/manifest/teamNetworkSchemas.d.ts +8 -187
  373. package/dist/manifest/teamNetworkSchemas.js +3 -317
  374. package/dist/manifest/teamNetworkServerSchemas.d.ts +150 -0
  375. package/dist/manifest/teamNetworkServerSchemas.js +199 -0
  376. package/dist/ownership/siblingBuildFreshness.d.ts +20 -0
  377. package/dist/ownership/siblingBuildFreshness.js +20 -0
  378. package/dist/ownership/simfileRunOperatorInputs.d.ts +103 -0
  379. package/dist/ownership/simfileRunOperatorInputs.js +139 -0
  380. package/dist/report/types.d.ts +142 -0
  381. package/dist/runtime/common.d.ts +35 -0
  382. package/dist/runtime/common.js +55 -0
  383. package/dist/runtime/container.d.ts +28 -1
  384. package/dist/runtime/container.js +38 -5
  385. package/dist/runtime/containerPackageOverrides.d.ts +37 -0
  386. package/dist/runtime/containerPackageOverrides.js +33 -0
  387. package/dist/runtime/index.d.ts +2 -0
  388. package/dist/runtime/index.js +2 -0
  389. package/dist/runtime/mnemeMcp.d.ts +15 -0
  390. package/dist/runtime/mnemeMcp.js +109 -0
  391. package/dist/runtime/openclaw/adapter.js +15 -4
  392. package/dist/runtime/openclaw/mcp.d.ts +10 -0
  393. package/dist/runtime/openclaw/mcp.js +69 -0
  394. package/dist/runtime/openclaw/runAuth.js +2 -2
  395. package/dist/runtime/openclaw/scaffold.js +1 -1
  396. package/dist/runtime/openclaw/schedules.d.ts +38 -0
  397. package/dist/runtime/openclaw/schedules.js +74 -0
  398. package/dist/runtime/pi/adapter.d.ts +1 -1
  399. package/dist/runtime/pi/adapter.js +86 -53
  400. package/dist/runtime/pi/appActivitySource.js +114 -2
  401. package/dist/runtime/pi/appAgentConfig.d.ts +11 -0
  402. package/dist/runtime/pi/appAgentConfig.js +264 -0
  403. package/dist/runtime/pi/appCliEnginesSource.d.ts +1 -0
  404. package/dist/runtime/pi/appCliEnginesSource.js +183 -0
  405. package/dist/runtime/pi/appCliSource.d.ts +1 -0
  406. package/dist/runtime/pi/appCliSource.js +353 -0
  407. package/dist/runtime/pi/appControlSource.d.ts +1 -0
  408. package/dist/runtime/pi/appControlSource.js +390 -0
  409. package/dist/runtime/pi/appControlWakeIdentitySource.d.ts +1 -0
  410. package/dist/runtime/pi/appControlWakeIdentitySource.js +19 -0
  411. package/dist/runtime/pi/appCoreSource.d.ts +4 -1
  412. package/dist/runtime/pi/appCoreSource.js +104 -214
  413. package/dist/runtime/pi/appPreludeSource.js +140 -52
  414. package/dist/runtime/pi/appScheduleSource.d.ts +1 -0
  415. package/dist/runtime/pi/appScheduleSource.js +80 -0
  416. package/dist/runtime/pi/appScriptedEngine.d.ts +31 -0
  417. package/dist/runtime/pi/appScriptedEngine.js +42 -0
  418. package/dist/runtime/pi/appSource.d.ts +4 -1
  419. package/dist/runtime/pi/appSource.js +6 -2
  420. package/dist/runtime/pi/appTemplate.d.ts +8 -22
  421. package/dist/runtime/pi/appTemplate.js +9 -126
  422. package/dist/runtime/pi/appTemplateTypes.d.ts +64 -0
  423. package/dist/runtime/pi/appTemplateTypes.js +18 -0
  424. package/dist/runtime/pi/appWakeContextSource.d.ts +1 -0
  425. package/dist/runtime/pi/appWakeContextSource.js +398 -0
  426. package/dist/runtime/pi/containerTargets.d.ts +4 -0
  427. package/dist/runtime/pi/containerTargets.js +57 -0
  428. package/dist/runtime/pi/runAuth.js +126 -9
  429. package/dist/runtime/pi/testHelpers.d.ts +2 -0
  430. package/dist/runtime/pi/testHelpers.js +40 -0
  431. package/dist/runtime/picoclaw/adapter.js +23 -27
  432. package/dist/runtime/picoclaw/mcp.d.ts +4 -0
  433. package/dist/runtime/picoclaw/mcp.js +43 -0
  434. package/dist/runtime/picoclaw/memory.d.ts +7 -0
  435. package/dist/runtime/picoclaw/memory.js +17 -0
  436. package/dist/runtime/picoclaw/runAuth.js +1 -1
  437. package/dist/runtime/picoclaw/scaffold.js +1 -1
  438. package/dist/runtime/picoclaw/schedules.d.ts +26 -0
  439. package/dist/runtime/picoclaw/schedules.js +62 -3
  440. package/dist/runtime/scheduleUtils.d.ts +2 -0
  441. package/dist/runtime/scheduleUtils.js +15 -0
  442. package/dist/runtime/types.d.ts +25 -2
  443. package/dist/shared/errors.d.ts +1 -1
  444. package/dist/shared/errors.js +2 -2
  445. package/dist/shared/index.d.ts +1 -0
  446. package/dist/shared/index.js +1 -0
  447. package/dist/shared/redaction.d.ts +2 -0
  448. package/dist/shared/redaction.js +10 -0
  449. package/dist/status/buildStatus.d.ts +1 -0
  450. package/dist/status/buildStatus.js +2 -0
  451. package/dist/status/compileReport.d.ts +22 -0
  452. package/dist/status/compileReport.js +16 -2
  453. package/dist/status/compiledProbeCollection.d.ts +21 -0
  454. package/dist/status/compiledProbeCollection.js +27 -0
  455. package/dist/status/imageStatusReport.js +6 -0
  456. package/dist/status/index.d.ts +3 -0
  457. package/dist/status/index.js +3 -0
  458. package/dist/status/lifecycleProbes.d.ts +19 -0
  459. package/dist/status/lifecycleProbes.js +174 -0
  460. package/dist/status/moltnetProbes.d.ts +7 -8
  461. package/dist/status/moltnetProbes.js +27 -198
  462. package/dist/status/moltnetWiringProbes.d.ts +19 -0
  463. package/dist/status/moltnetWiringProbes.js +178 -0
  464. package/dist/target/cleanupRun.d.ts +41 -0
  465. package/dist/target/cleanupRun.js +139 -0
  466. package/dist/target/cleanupRunDocker.d.ts +16 -0
  467. package/dist/target/cleanupRunDocker.js +66 -0
  468. package/dist/target/cleanupRunDocker.test-helper.d.ts +67 -0
  469. package/dist/target/cleanupRunDocker.test-helper.js +238 -0
  470. package/dist/target/cleanupRunDockerPreflight.d.ts +17 -0
  471. package/dist/target/cleanupRunDockerPreflight.js +224 -0
  472. package/dist/target/composedPreparation.d.ts +205 -0
  473. package/dist/target/composedPreparation.js +223 -0
  474. package/dist/target/containerBundle.d.ts +82 -0
  475. package/dist/target/containerBundle.js +243 -0
  476. package/dist/target/containerBundleArchive.d.ts +31 -0
  477. package/dist/target/containerBundleArchive.js +140 -0
  478. package/dist/target/containerBundleAuthority.d.ts +25 -0
  479. package/dist/target/containerBundleAuthority.js +65 -0
  480. package/dist/target/containerBundleContracts.d.ts +114 -0
  481. package/dist/target/containerBundleContracts.js +173 -0
  482. package/dist/target/containerBundleFilesystemStore.d.ts +3 -0
  483. package/dist/target/containerBundleFilesystemStore.js +247 -0
  484. package/dist/target/containerBundlePolicy.d.ts +33 -0
  485. package/dist/target/containerBundlePolicy.js +64 -0
  486. package/dist/target/containerBundleStore.d.ts +127 -0
  487. package/dist/target/containerBundleStore.js +284 -0
  488. package/dist/target/contracts.d.ts +538 -0
  489. package/dist/target/contracts.js +373 -0
  490. package/dist/target/dockerArtifactIdentityTypes.d.ts +56 -0
  491. package/dist/target/dockerArtifactIdentityTypes.js +1 -0
  492. package/dist/target/dockerArtifactInspection.d.ts +40 -0
  493. package/dist/target/dockerArtifactInspection.js +125 -0
  494. package/dist/target/dockerArtifacts.d.ts +21 -0
  495. package/dist/target/dockerArtifacts.js +110 -0
  496. package/dist/target/dockerArtifactsProvider.d.ts +41 -0
  497. package/dist/target/dockerArtifactsProvider.js +449 -0
  498. package/dist/target/dockerCommandExecutor.d.ts +27 -0
  499. package/dist/target/dockerCommandExecutor.js +200 -0
  500. package/dist/target/dockerCommandExecutorCore.d.ts +34 -0
  501. package/dist/target/dockerCommandExecutorCore.js +273 -0
  502. package/dist/target/dockerContainerBundleBuilder.d.ts +8 -0
  503. package/dist/target/dockerContainerBundleBuilder.js +256 -0
  504. package/dist/target/dockerContextSnapshot.d.ts +21 -0
  505. package/dist/target/dockerContextSnapshot.js +158 -0
  506. package/dist/target/dockerEndpointFingerprint.d.ts +1 -0
  507. package/dist/target/dockerEndpointFingerprint.js +9 -0
  508. package/dist/target/dockerPreparedArtifact.d.ts +48 -0
  509. package/dist/target/dockerPreparedArtifact.js +131 -0
  510. package/dist/target/dockerProjectionJson.d.ts +1 -0
  511. package/dist/target/dockerProjectionJson.js +80 -0
  512. package/dist/target/dockerPublicArtifactSnapshot.d.ts +17 -0
  513. package/dist/target/dockerPublicArtifactSnapshot.js +99 -0
  514. package/dist/target/dockerResources.d.ts +26 -0
  515. package/dist/target/dockerResources.js +162 -0
  516. package/dist/target/dockerResourcesProvider.d.ts +44 -0
  517. package/dist/target/dockerResourcesProvider.js +207 -0
  518. package/dist/target/dockerSecrets.d.ts +39 -0
  519. package/dist/target/dockerSecrets.js +249 -0
  520. package/dist/target/dockerSecretsAuthority.d.ts +26 -0
  521. package/dist/target/dockerSecretsAuthority.js +216 -0
  522. package/dist/target/dockerSecretsLifecycle.d.ts +25 -0
  523. package/dist/target/dockerSecretsLifecycle.js +133 -0
  524. package/dist/target/dockerSecretsProvider.d.ts +68 -0
  525. package/dist/target/dockerSecretsProvider.js +329 -0
  526. package/dist/target/dockerTarget.d.ts +52 -0
  527. package/dist/target/dockerTarget.js +48 -0
  528. package/dist/target/dockerTargetBinding.d.ts +14 -0
  529. package/dist/target/dockerTargetBinding.js +96 -0
  530. package/dist/target/dockerWorldClock.d.ts +17 -0
  531. package/dist/target/dockerWorldClock.js +111 -0
  532. package/dist/target/dockerWorldReadiness.d.ts +17 -0
  533. package/dist/target/dockerWorldReadiness.js +119 -0
  534. package/dist/target/dockerWorldService.d.ts +23 -0
  535. package/dist/target/dockerWorldService.js +216 -0
  536. package/dist/target/dockerWorldServiceAuthority.d.ts +80 -0
  537. package/dist/target/dockerWorldServiceAuthority.js +182 -0
  538. package/dist/target/dockerWorldServiceLifecycle.d.ts +41 -0
  539. package/dist/target/dockerWorldServiceLifecycle.js +275 -0
  540. package/dist/target/dockerWorldServiceProvider.d.ts +60 -0
  541. package/dist/target/dockerWorldServiceProvider.js +318 -0
  542. package/dist/target/dockerWorldServiceStore.d.ts +73 -0
  543. package/dist/target/dockerWorldServiceStore.js +367 -0
  544. package/dist/target/evidenceExport.d.ts +55 -0
  545. package/dist/target/evidenceExport.js +518 -0
  546. package/dist/target/evidenceExportArchive.d.ts +10 -0
  547. package/dist/target/evidenceExportArchive.js +302 -0
  548. package/dist/target/evidenceExportContract.d.ts +27 -0
  549. package/dist/target/evidenceExportContract.js +40 -0
  550. package/dist/target/evidenceExportOperationsTestKit.d.ts +87 -0
  551. package/dist/target/evidenceExportOperationsTestKit.js +312 -0
  552. package/dist/target/evidenceExportProvider.d.ts +85 -0
  553. package/dist/target/evidenceExportProvider.js +187 -0
  554. package/dist/target/evidenceExportPublicationTypes.d.ts +16 -0
  555. package/dist/target/evidenceExportPublicationTypes.js +1 -0
  556. package/dist/target/evidenceExportStore.d.ts +70 -0
  557. package/dist/target/evidenceExportStore.js +498 -0
  558. package/dist/target/evidenceExportStorePublication.d.ts +7 -0
  559. package/dist/target/evidenceExportStorePublication.js +395 -0
  560. package/dist/target/handles.d.ts +20 -0
  561. package/dist/target/handles.js +56 -0
  562. package/dist/target/index.d.ts +12 -0
  563. package/dist/target/index.js +11 -0
  564. package/dist/target/journal.d.ts +59 -0
  565. package/dist/target/journal.js +529 -0
  566. package/dist/target/journalFilesystem.d.ts +3 -0
  567. package/dist/target/journalFilesystem.js +111 -0
  568. package/dist/target/journalRoot.d.ts +4 -0
  569. package/dist/target/journalRoot.js +6 -0
  570. package/dist/target/organizationAttachment.d.ts +23 -0
  571. package/dist/target/organizationAttachment.js +263 -0
  572. package/dist/target/organizationAttachmentAuthority.d.ts +65 -0
  573. package/dist/target/organizationAttachmentAuthority.js +161 -0
  574. package/dist/target/organizationAttachmentLifecycle.d.ts +17 -0
  575. package/dist/target/organizationAttachmentLifecycle.js +101 -0
  576. package/dist/target/organizationAttachmentProvider.d.ts +76 -0
  577. package/dist/target/organizationAttachmentProvider.js +289 -0
  578. package/dist/target/organizationAttachmentStore.d.ts +51 -0
  579. package/dist/target/organizationAttachmentStore.js +316 -0
  580. package/dist/target/publicArtifactSnapshot.d.ts +41 -0
  581. package/dist/target/publicArtifactSnapshot.js +150 -0
  582. package/dist/target/topologyActivation.d.ts +51 -0
  583. package/dist/target/topologyActivation.js +149 -0
  584. package/dist/target/topologyAttestation.d.ts +37 -0
  585. package/dist/target/topologyAttestation.js +300 -0
  586. package/dist/target/topologyAttestationErrors.d.ts +1 -0
  587. package/dist/target/topologyAttestationErrors.js +1 -0
  588. package/dist/target/worldClock.d.ts +60 -0
  589. package/dist/target/worldClock.js +129 -0
  590. package/dist/target/worldReadiness.d.ts +103 -0
  591. package/dist/target/worldReadiness.js +153 -0
  592. package/moltnet-releases.json +20 -0
  593. package/package.json +27 -11
  594. package/runtimes.yaml +8 -23
  595. package/dist/runtime/openclaw/scaffold-assets/CLAUDE.md +0 -5
  596. package/dist/runtime/picoclaw/scaffold-assets/CLAUDE.md +0 -5
  597. /package/dist/runtime/openclaw/scaffold-assets/{AGENTS.md → WORKSPACE_AGENTS.md} +0 -0
  598. /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(memberships
53
- .filter((membership) => membership.declaringTeamSource === teamNode.source
54
- && membership.networkId === networkId
55
- && membership.roomId === room.id)
56
- .map((membership) => membership.concreteMemberId))
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;