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
@@ -0,0 +1,261 @@
1
+ import { createHash } from "node:crypto";
2
+ import { normalizeProjectLabelSlug } from "../distribution/projectName.js";
3
+ import { createDistributionFingerprint } from "../distribution/fingerprint.js";
4
+ import { WORLD_BINDINGS_IMAGE_PATH } from "../distribution/types.js";
5
+ import { SpawnfileError } from "../shared/index.js";
6
+ import { MAX_ORGANIZATION_AGENT_MEMBERS, ORGANIZATION_MEMBER_ID_PATTERN_SOURCE, resolveCanonicalAgentMemberId } from "./organizationIdentity.js";
7
+ export const ORGANIZATION_READINESS_EVIDENCE_VERSION = "spawnfile.organization-ready-evidence.v1";
8
+ const fail = (message) => {
9
+ throw new SpawnfileError("compile_error", `organization readiness evidence is inconsistent: ${message}`);
10
+ };
11
+ const sha256 = (content) => `sha256:${createHash("sha256").update(content).digest("hex")}`;
12
+ const compareAscii = (left, right) => left < right ? -1 : left > right ? 1 : 0;
13
+ const sort = (values, key) => [...values].sort((left, right) => compareAscii(key(left), key(right)));
14
+ const assertUnique = (values, key, label) => {
15
+ const seen = new Set();
16
+ for (const value of values) {
17
+ const valueKey = key(value);
18
+ if (seen.has(valueKey))
19
+ fail(`duplicate ${label}: ${valueKey}`);
20
+ seen.add(valueKey);
21
+ }
22
+ };
23
+ const freeze = (value, seen = new WeakSet()) => {
24
+ if (value && typeof value === "object") {
25
+ if (seen.has(value))
26
+ return value;
27
+ seen.add(value);
28
+ Object.freeze(value);
29
+ for (const child of Object.values(value))
30
+ freeze(child, seen);
31
+ }
32
+ return value;
33
+ };
34
+ const ID = /^[A-Za-z0-9][A-Za-z0-9_.:-]{0,127}$/u;
35
+ const MEMBER_ID = new RegExp(ORGANIZATION_MEMBER_ID_PATTERN_SOURCE, "u");
36
+ const FINGERPRINT = /^sf1:[a-f0-9]{12}$/u;
37
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
38
+ const CONFIG_PATH = /^\/var\/lib\/spawnfile\/moltnet\/nodes\/[A-Za-z0-9_.-]+\.json$/u;
39
+ const nodeByMember = (plan) => {
40
+ const members = plan.organizationIdentity?.agentMembers ?? [];
41
+ if (members.length > MAX_ORGANIZATION_AGENT_MEMBERS)
42
+ fail("organization member cardinality exceeds bounds");
43
+ assertUnique(members, (member) => member.memberId, "organization member");
44
+ const result = new Map();
45
+ for (const node of plan.nodes) {
46
+ if (node.kind !== "agent")
47
+ continue;
48
+ assertId(node.id, "organization node id");
49
+ const memberId = resolveCanonicalAgentMemberId(plan, node.value.source);
50
+ if (!memberId)
51
+ continue;
52
+ if (!members.some((member) => member.memberId === memberId) || result.has(memberId)) {
53
+ fail(`organization member ${memberId} does not resolve to exactly one node`);
54
+ }
55
+ result.set(memberId, node.id);
56
+ }
57
+ if (result.size !== members.length)
58
+ fail("organization member cardinality mismatch");
59
+ return result;
60
+ };
61
+ const emittedConfigContent = (artifacts, configPath) => {
62
+ const emittedPath = `container/rootfs${configPath}`;
63
+ const matches = artifacts.files.filter((file) => file.path === emittedPath);
64
+ if (matches.length !== 1)
65
+ fail(`node config ${configPath} is not emitted exactly once`);
66
+ return matches[0].content;
67
+ };
68
+ const attachmentRecords = (plan) => {
69
+ const records = [];
70
+ for (const node of plan.nodes) {
71
+ if (node.kind !== "agent")
72
+ continue;
73
+ const agent = node.value;
74
+ for (const attachment of agent.surfaces?.moltnet ?? []) {
75
+ const memberId = attachment.memberId ?? fail(`Moltnet attachment on ${node.id} has no member`);
76
+ assertId(attachment.network, "Moltnet attachment network id");
77
+ assertMemberId(memberId, "Moltnet attachment member id");
78
+ records.push({
79
+ memberId,
80
+ networkId: attachment.network,
81
+ nodeId: node.id,
82
+ rooms: Object.keys(attachment.rooms ?? {})
83
+ });
84
+ }
85
+ }
86
+ assertUnique(records, (record) => `${record.networkId}\u0000${record.memberId}`, "Moltnet attachment member");
87
+ assertUnique(records, (record) => `${record.networkId}\u0000${record.nodeId}`, "Moltnet attachment node");
88
+ return records;
89
+ };
90
+ const assertId = (value, label) => {
91
+ if (!ID.test(value)) {
92
+ fail(`${label} is unbounded or noncanonical`);
93
+ }
94
+ };
95
+ const assertMemberId = (value, label) => {
96
+ if (!MEMBER_ID.test(value))
97
+ fail(`${label} is unbounded or noncanonical`);
98
+ };
99
+ const assertConfigPath = (value) => {
100
+ if (value.length > 255 || !CONFIG_PATH.test(value)) {
101
+ fail(`Moltnet config path is noncanonical: ${value}`);
102
+ }
103
+ };
104
+ const validateMoltnet = (artifacts, plan) => {
105
+ const servers = artifacts?.serverPlans ?? [];
106
+ const nodePlans = artifacts?.nodePlans ?? [];
107
+ const attachments = attachmentRecords(plan);
108
+ assertUnique(servers, (server) => server.networkId, "Moltnet network");
109
+ assertUnique(servers, (server) => server.id, "Moltnet server");
110
+ assertUnique(nodePlans, (node) => node.configPath, "Moltnet node config");
111
+ assertUnique(nodePlans, (node) => `${node.networkId}\u0000${node.memberId ?? ""}`, "Moltnet node member");
112
+ if (!artifacts && attachments.length > 0)
113
+ fail("Moltnet attachments exist without artifacts");
114
+ if (servers.length > MAX_ORGANIZATION_AGENT_MEMBERS || nodePlans.length > MAX_ORGANIZATION_AGENT_MEMBERS
115
+ || attachments.length > MAX_ORGANIZATION_AGENT_MEMBERS)
116
+ fail("Moltnet topology exceeds organization bounds");
117
+ const serverByNetwork = new Map(servers.map((server) => [server.networkId, server]));
118
+ const attachmentByKey = new Map(attachments.map((attachment) => [
119
+ `${attachment.networkId}\u0000${attachment.memberId}`, attachment
120
+ ]));
121
+ const nodeByKey = new Map(nodePlans.map((node) => [
122
+ `${node.networkId}\u0000${node.memberId ?? ""}`, node
123
+ ]));
124
+ for (const attachment of attachments) {
125
+ const server = serverByNetwork.get(attachment.networkId)
126
+ ?? fail(`Moltnet attachment references nonexistent network ${attachment.networkId}`);
127
+ const rooms = new Map(server.rooms.map((room) => [room.id, room]));
128
+ for (const roomId of attachment.rooms) {
129
+ const room = rooms.get(roomId);
130
+ if (!room || !room.members.includes(attachment.memberId)) {
131
+ fail(`Moltnet attachment room ${attachment.networkId}/${roomId} lacks ${attachment.memberId}`);
132
+ }
133
+ }
134
+ if (!nodeByKey.has(`${attachment.networkId}\u0000${attachment.memberId}`)) {
135
+ fail(`Moltnet attachment ${attachment.networkId}/${attachment.memberId} has no node plan`);
136
+ }
137
+ }
138
+ for (const node of nodePlans) {
139
+ const memberId = node.memberId ?? fail(`Moltnet node ${node.configPath} has no member`);
140
+ assertConfigPath(node.configPath);
141
+ assertId(node.networkId, "Moltnet node network id");
142
+ assertMemberId(memberId, "Moltnet node member id");
143
+ if (!serverByNetwork.has(node.networkId))
144
+ fail(`Moltnet node references nonexistent network ${node.networkId}`);
145
+ if (!attachmentByKey.has(`${node.networkId}\u0000${node.memberId}`)) {
146
+ fail(`Moltnet node ${node.networkId}/${node.memberId} has no attachment`);
147
+ }
148
+ emittedConfigContent(artifacts, node.configPath);
149
+ }
150
+ for (const membership of plan.moltnetRoomMemberships ?? []) {
151
+ const server = serverByNetwork.get(membership.networkId);
152
+ const room = server?.rooms.filter((candidate) => candidate.id === membership.roomId);
153
+ if (!server || room?.length !== 1 || !room[0].members.includes(membership.concreteMemberId)) {
154
+ fail(`Moltnet room membership ${membership.networkId}/${membership.roomId} lacks ${membership.concreteMemberId}`);
155
+ }
156
+ const attachment = attachmentByKey.get(`${membership.networkId}\u0000${membership.concreteMemberId}`);
157
+ if (!attachment || attachment.nodeId === "" || !attachment.rooms.includes(membership.roomId)) {
158
+ fail(`Moltnet room membership has no concrete attachment`);
159
+ }
160
+ }
161
+ return sort(servers.map((server) => {
162
+ assertId(server.networkId, "Moltnet network id");
163
+ assertId(server.id, "Moltnet server id");
164
+ if (server.mode === "managed" && (!Number.isInteger(server.port) || server.port < 1 || server.port > 65535)) {
165
+ fail(`Moltnet managed port is invalid for ${server.networkId}`);
166
+ }
167
+ const rooms = sort(server.rooms.map((room) => {
168
+ assertId(room.id, "Moltnet room id");
169
+ assertUnique(room.members, (member) => member, `Moltnet room member on ${server.networkId}/${room.id}`);
170
+ for (const member of room.members)
171
+ assertMemberId(member, `Moltnet room member on ${server.networkId}/${room.id}`);
172
+ return { id: room.id, members: sort(room.members, (member) => member) };
173
+ }), (room) => room.id);
174
+ assertUnique(rooms, (room) => room.id, `Moltnet room on ${server.networkId}`);
175
+ const nodes = sort(nodePlans.filter((node) => node.networkId === server.networkId).map((node) => {
176
+ const attachment = attachmentByKey.get(`${node.networkId}\u0000${node.memberId}`);
177
+ return { configPath: node.configPath, memberId: node.memberId, nodeId: attachment.nodeId,
178
+ sha256: sha256(emittedConfigContent(artifacts, node.configPath)) };
179
+ }), (node) => `${node.memberId}\u0000${node.nodeId}`);
180
+ return { id: server.networkId, internalPort: server.mode === "managed" ? server.port : null,
181
+ mode: server.mode, nodes, rooms };
182
+ }), (network) => network.id);
183
+ };
184
+ export const createOrganizationReadinessEvidence = (input) => {
185
+ const { containerArtifacts, moltnetArtifacts, plan, worldBindings } = input;
186
+ const distribution = containerArtifacts.distribution.report;
187
+ if (input.compileVersion !== "0.1")
188
+ fail("compile version is invalid");
189
+ const { compile_fingerprint: fingerprint, generated_at: _generatedAt, ...distributionBody } = distribution;
190
+ if (!FINGERPRINT.test(fingerprint) || containerArtifacts.distribution.fingerprint !== fingerprint
191
+ || createDistributionFingerprint(distributionBody) !== fingerprint) {
192
+ fail("compile fingerprint disagrees with canonical distribution report");
193
+ }
194
+ const memberNodes = nodeByMember(plan);
195
+ const organizationMembers = sort([...memberNodes.entries()].map(([memberId, nodeId]) => ({ memberId, nodeId })), (member) => member.memberId);
196
+ assertUnique(organizationMembers, (member) => member.nodeId, "organization node assignment");
197
+ for (const member of organizationMembers) {
198
+ assertMemberId(member.memberId, "organization member id");
199
+ assertId(member.nodeId, "organization node id");
200
+ }
201
+ const worldBindingEvidence = distribution.world_bindings;
202
+ let projectedWorldBindings = null;
203
+ if (worldBindings) {
204
+ const distributionBinding = worldBindingEvidence
205
+ ?? fail("distribution world-binding evidence is missing or incompatible");
206
+ if (distributionBinding.artifact_path !== WORLD_BINDINGS_IMAGE_PATH
207
+ || distributionBinding.schema !== "simfile.world-bindings.v1") {
208
+ fail("distribution world-binding evidence is missing or incompatible");
209
+ }
210
+ const digest = sha256(worldBindings.canonicalBytes);
211
+ if (!DIGEST.test(distributionBinding.digest) || distributionBinding.digest !== digest) {
212
+ fail("distribution world-binding digest disagrees with resolved bindings");
213
+ }
214
+ const assignments = sort(worldBindings.assignments.map((assignment) => ({
215
+ memberId: assignment.binding.member.id,
216
+ nodeId: assignment.nodeId
217
+ })), (assignment) => assignment.memberId);
218
+ assertUnique(assignments, (assignment) => assignment.memberId, "world-binding member");
219
+ assertUnique(assignments, (assignment) => assignment.nodeId, "world-binding node");
220
+ for (const assignment of assignments) {
221
+ assertMemberId(assignment.memberId, "world-binding member id");
222
+ assertId(assignment.nodeId, "world-binding node id");
223
+ }
224
+ if (assignments.length !== organizationMembers.length
225
+ || assignments.some((assignment, index) => assignment.memberId !== organizationMembers[index]?.memberId
226
+ || assignment.nodeId !== organizationMembers[index]?.nodeId)) {
227
+ fail("world-binding assignments disagree with resolved organization members");
228
+ }
229
+ projectedWorldBindings = {
230
+ artifactPath: WORLD_BINDINGS_IMAGE_PATH,
231
+ assignments,
232
+ digest,
233
+ schema: "simfile.world-bindings.v1"
234
+ };
235
+ }
236
+ else if (worldBindingEvidence) {
237
+ fail("distribution contains world-binding evidence without resolved bindings");
238
+ }
239
+ const networks = validateMoltnet(moltnetArtifacts, plan);
240
+ const distributionNetworks = sort(distribution.moltnet.networks, (network) => network.id);
241
+ assertUnique(distributionNetworks, (network) => network.id, "distribution Moltnet network");
242
+ if (distributionNetworks.length !== networks.length || networks.some((network, index) => {
243
+ const distributionNetwork = distributionNetworks[index];
244
+ return distributionNetwork?.id !== network.id || distributionNetwork.server_mode !== network.mode;
245
+ })) {
246
+ fail("distribution Moltnet networks disagree with emitted topology");
247
+ }
248
+ const projectLabel = normalizeProjectLabelSlug(distribution.organization.project);
249
+ if (projectLabel.length > 128 || !ID.test(projectLabel))
250
+ fail("project label is unbounded or noncanonical");
251
+ return freeze({
252
+ compileFingerprint: fingerprint,
253
+ compileVersion: input.compileVersion,
254
+ hasExternalMoltnet: networks.some((network) => network.mode === "external"),
255
+ networks,
256
+ organizationMembers,
257
+ projectLabel,
258
+ version: ORGANIZATION_READINESS_EVIDENCE_VERSION,
259
+ worldBindings: projectedWorldBindings
260
+ });
261
+ };
@@ -0,0 +1,4 @@
1
+ import { type InlineAgentMember, type TeamManifest } from "../manifest/index.js";
2
+ export declare const createInlineAgentSource: (teamSource: string, memberId: string) => string;
3
+ export declare const collectProjectManifestPaths: (manifestPath: string, recursive: boolean, visited?: Set<string>) => Promise<string[]>;
4
+ export declare const rewriteInlineAgentMembers: (manifest: TeamManifest, mutate: (member: InlineAgentMember) => InlineAgentMember) => TeamManifest;
@@ -0,0 +1,24 @@
1
+ import path from "node:path";
2
+ import { getCanonicalManifestPath, getManifestPath, getProjectRoot } from "../filesystem/index.js";
3
+ import { isReferencedMember, loadManifest } from "../manifest/index.js";
4
+ export const createInlineAgentSource = (teamSource, memberId) => `${teamSource}#member=${encodeURIComponent(memberId)}`;
5
+ export const collectProjectManifestPaths = async (manifestPath, recursive, visited = new Set()) => {
6
+ const canonicalPath = getCanonicalManifestPath(manifestPath);
7
+ if (visited.has(canonicalPath)) {
8
+ return [];
9
+ }
10
+ visited.add(canonicalPath);
11
+ if (!recursive) {
12
+ return [canonicalPath];
13
+ }
14
+ const loadedManifest = await loadManifest(canonicalPath);
15
+ const childRefs = loadedManifest.manifest.kind === "team"
16
+ ? loadedManifest.manifest.members.filter(isReferencedMember).map((member) => member.ref)
17
+ : (loadedManifest.manifest.subagents ?? []).map((subagent) => subagent.ref);
18
+ const nestedPaths = await Promise.all(childRefs.map((ref) => collectProjectManifestPaths(getManifestPath(path.resolve(getProjectRoot(canonicalPath), ref)), true, visited)));
19
+ return [canonicalPath, ...nestedPaths.flat()];
20
+ };
21
+ export const rewriteInlineAgentMembers = (manifest, mutate) => ({
22
+ ...manifest,
23
+ members: manifest.members.map((member) => isReferencedMember(member) ? member : mutate(member))
24
+ });
@@ -25,6 +25,10 @@ export interface RunProjectResult extends CompileProjectResult {
25
25
  }
26
26
  export declare const createDockerRunInvocation: (compileResult: CompileProjectResult, imageTag: string, options?: {
27
27
  authProfile?: ResolvedAuthProfile | null;
28
+ cliCredential?: {
29
+ name: string;
30
+ value: string;
31
+ };
28
32
  containerName?: string;
29
33
  detach?: boolean;
30
34
  deploymentName?: string;
@@ -5,11 +5,13 @@ import { requireAuthProfile } from "../auth/index.js";
5
5
  import { ensureDirectory, fileExists, removeDirectory, writeUtf8File } from "../filesystem/index.js";
6
6
  import { appendDockerLabelArgs, createDockerDeploymentLabels, createDockerDeploymentUnitId, createDockerProjectLabel, dockerContextNameForTarget, dockerHostValueForTarget, normalizeDeploymentName, readDeploymentRecordFromOutput, resolveDeploymentRecordPath, verifyDockerDeploymentTarget, writeDockerDeploymentRecordForRun } from "../deployment/index.js";
7
7
  import { DEFAULT_OUTPUT_DIRECTORY, SpawnfileError } from "../shared/index.js";
8
+ import { ensureNoopolisRunId, resolveNoopolisRunId } from "../runtime/index.js";
8
9
  import { compileProject } from "./compileProject.js";
9
10
  import { createDefaultImageTag, resolveDockerBuildArchitecture } from "./buildProject.js";
10
11
  import { slugify } from "./helpers.js";
11
12
  import { runDockerContainer } from "./runProjectDocker.js";
12
- import { assertDeclaredModelAuthSatisfied, assertRunEnvironmentSatisfied, prepareRuntimeAuthMounts, readRunEnvFile, renderDockerEnvFile, resolveAuthMountArgs, resolveRunEnvironment } from "./runProjectAuth.js";
13
+ import { executeDockerRunWithSupportCleanup } from "./runProjectLifecycle.js";
14
+ import { assertDeclaredModelAuthSatisfied, assertMoltnetCredentialValuesDistinct, assertRunEnvironmentSatisfied, prepareRuntimeAuthMounts, readRunEnvFile, renderDockerEnvFile, resolveAuthMountArgs, resolveRunEnvironment } from "./runProjectAuth.js";
13
15
  export { runDockerContainer };
14
16
  const resolveImageTagRoot = (inputPath) => {
15
17
  const resolvedPath = path.resolve(inputPath);
@@ -29,10 +31,14 @@ export const createDockerRunInvocation = async (compileResult, imageTag, options
29
31
  const supportDirectory = await mkdtemp(path.join(os.tmpdir(), "spawnfile-run-"));
30
32
  const envFilePath = path.join(supportDirectory, "run.env");
31
33
  try {
32
- assertDeclaredModelAuthSatisfied(containerReport, options.authProfile ?? null);
33
- const env = resolveRunEnvironment(containerReport, options.authProfile ?? null, await readRunEnvFile(options.envFilePath));
34
+ assertDeclaredModelAuthSatisfied(containerReport, options.authProfile ?? null, options.cliCredential !== undefined);
35
+ const env = resolveRunEnvironment(containerReport, options.authProfile ?? null, {
36
+ ...(await readRunEnvFile(options.envFilePath)),
37
+ ...(options.cliCredential ? { [options.cliCredential.name]: options.cliCredential.value } : {})
38
+ });
34
39
  const preparedRuntimeAuth = await prepareRuntimeAuthMounts(compileResult.outputDirectory, containerReport, options.authProfile ?? null, env, supportDirectory);
35
40
  assertRunEnvironmentSatisfied(containerReport, env, preparedRuntimeAuth.coveredModelSecrets);
41
+ assertMoltnetCredentialValuesDistinct(containerReport, env);
36
42
  await ensureDirectory(supportDirectory);
37
43
  await writeUtf8File(envFilePath, renderDockerEnvFile(env));
38
44
  const deploymentName = options.deploymentName
@@ -59,16 +65,17 @@ export const createDockerRunInvocation = async (compileResult, imageTag, options
59
65
  for (const mount of containerReport.persistent_mounts ?? []) {
60
66
  args.push("-v", `${mount.volume_name}:${mount.mount_path}`);
61
67
  }
62
- if (options.detach && deploymentName) {
68
+ const deploymentLabels = options.detach && deploymentName ? (() => {
63
69
  const compileFingerprint = compileResult.report.compile_fingerprint ?? "sf1:unknown";
64
- appendDockerLabelArgs(args, createDockerDeploymentLabels({
65
- compileFingerprint,
66
- deployment: deploymentName,
70
+ const runId = resolveNoopolisRunId(process.env);
71
+ if (!runId)
72
+ throw new SpawnfileError("runtime_error", "Detached deployment requires a run id for deployment labels");
73
+ return createDockerDeploymentLabels({ compileFingerprint, deployment: deploymentName,
67
74
  project: createDockerProjectLabel(compileResult.report.root, compileResult.report.project_name),
68
- unit: createDockerDeploymentUnitId(deploymentName),
69
- version: compileResult.report.spawnfile_version
70
- }));
71
- }
75
+ runId, unit: createDockerDeploymentUnitId(deploymentName), version: compileResult.report.spawnfile_version });
76
+ })() : undefined;
77
+ if (deploymentLabels)
78
+ appendDockerLabelArgs(args, deploymentLabels);
72
79
  args.push("--env-file", envFilePath);
73
80
  args.push(...(await resolveAuthMountArgs(containerReport, options.authProfile ?? null)));
74
81
  args.push(...preparedRuntimeAuth.mountArgs);
@@ -80,6 +87,7 @@ export const createDockerRunInvocation = async (compileResult, imageTag, options
80
87
  cwd: compileResult.outputDirectory,
81
88
  detach: options.detach ?? false,
82
89
  deploymentName,
90
+ ...(deploymentLabels ? { deploymentLabels } : {}),
83
91
  dockerContext: options.dockerContext ?? null,
84
92
  dockerHost: options.dockerHost ?? null,
85
93
  envFilePath,
@@ -147,10 +155,19 @@ export const runProject = async (inputPath, options = {}) => {
147
155
  dockerCommand: options.dockerCommand,
148
156
  dockerContext: resolvedOptions.dockerContext
149
157
  });
158
+ // Every authority container compiled for this run must stamp causal
159
+ // events under the same real run id (see specs/CAUSAL.md). compileProject
160
+ // itself stays a deterministic function of the host env; this only fills
161
+ // in a generated id when the host did not already provide one, before the
162
+ // compile step that bakes it into the entrypoint/recipe env.
163
+ ensureNoopolisRunId();
150
164
  const compileResult = await compileProject(inputPath, {
151
165
  clean: options.clean,
152
166
  containerArchitecture: targetArchitecture,
153
- outputDirectory: options.outputDirectory
167
+ outputDirectory: options.outputDirectory,
168
+ ...(options.worldBindingsPath !== undefined
169
+ ? { worldBindingsPath: options.worldBindingsPath }
170
+ : {})
154
171
  });
155
172
  const imageTag = resolvedOptions.imageTag ?? createDefaultImageTag(resolveImageTagRoot(inputPath));
156
173
  const authProfile = resolvedOptions.authProfile
@@ -166,15 +183,7 @@ export const runProject = async (inputPath, options = {}) => {
166
183
  dockerHost: resolvedOptions.dockerHost,
167
184
  envFilePath: resolvedOptions.envFilePath
168
185
  });
169
- let runMetadata;
170
- try {
171
- runMetadata = await (options.runRunner ?? runDockerContainer)(invocation);
172
- }
173
- finally {
174
- if (!invocation.detach) {
175
- await removeDirectory(invocation.supportDirectory);
176
- }
177
- }
186
+ const runMetadata = await executeDockerRunWithSupportCleanup(invocation, options.runRunner ?? runDockerContainer);
178
187
  const deploymentRecordPath = invocation.detach && invocation.deploymentName
179
188
  ? await writeDockerDeploymentRecordForRun({
180
189
  authProfileName: authProfile?.name ?? null,
@@ -4,10 +4,16 @@ interface PreparedRunAuth {
4
4
  coveredModelSecrets: Set<string>;
5
5
  mountArgs: string[];
6
6
  }
7
+ export declare const resolveHostCliCredential: (containerReport: ContainerReport) => Promise<{
8
+ name: string;
9
+ sourcePath: string;
10
+ value: string;
11
+ } | null>;
7
12
  export declare const prepareRuntimeAuthMounts: (outputDirectory: string, containerReport: ContainerReport, authProfile: ResolvedAuthProfile | null, env: Record<string, string>, tempRoot: string) => Promise<PreparedRunAuth>;
8
- export declare const assertDeclaredModelAuthSatisfied: (containerReport: ContainerReport, authProfile: ResolvedAuthProfile | null) => void;
13
+ export declare const assertDeclaredModelAuthSatisfied: (containerReport: ContainerReport, authProfile: ResolvedAuthProfile | null, cliCredentialProvided?: boolean) => void;
9
14
  export declare const resolveRunEnvironment: (containerReport: ContainerReport, authProfile: ResolvedAuthProfile | null, envFileEnv?: Record<string, string>) => Record<string, string>;
10
15
  export declare const assertRunEnvironmentSatisfied: (containerReport: ContainerReport, env: Record<string, string>, coveredModelSecrets: Set<string>) => void;
16
+ export declare const assertMoltnetCredentialValuesDistinct: (containerReport: ContainerReport, env: Record<string, string>) => void;
11
17
  export declare const renderDockerEnvFile: (env: Record<string, string>) => string;
12
18
  export declare const readRunEnvFile: (envFilePath: string | undefined) => Promise<Record<string, string>>;
13
19
  export declare const resolveAuthMountArgs: (containerReport: ContainerReport, authProfile: ResolvedAuthProfile | null) => Promise<string[]>;
@@ -1,24 +1,57 @@
1
+ import os from "node:os";
1
2
  import path from "node:path";
2
3
  import { randomBytes } from "node:crypto";
3
4
  import { parseEnvFile } from "../auth/index.js";
4
5
  import { fileExists, readUtf8File } from "../filesystem/index.js";
5
6
  import { SpawnfileError } from "../shared/index.js";
6
7
  import { getRuntimeAdapter } from "../runtime/index.js";
8
+ import { CLI_CREDENTIAL_SECRET_NAME, modelAuthMethodNeedsCliCredential } from "./modelEnv.js";
7
9
  const MODEL_AUTH_IMPORT_KINDS = {
8
10
  api_key: null,
9
11
  "claude-code": "claude-code",
10
12
  codex: "codex",
11
13
  none: null
12
14
  };
15
+ export const resolveHostCliCredential = async (containerReport) => {
16
+ const needsCredential = containerReport.runtime_instances.some((instance) => Object.values(instance.model_auth_methods).some(modelAuthMethodNeedsCliCredential));
17
+ if (!needsCredential) {
18
+ return null;
19
+ }
20
+ const codexHome = process.env.CODEX_HOME || path.join(os.homedir(), ".codex");
21
+ const sourcePath = path.join(codexHome, "auth.json");
22
+ if (!await fileExists(sourcePath)) {
23
+ throw new SpawnfileError("validation_error", `Missing ${CLI_CREDENTIAL_SECRET_NAME}; host CLI credential source does not exist: ${sourcePath}`);
24
+ }
25
+ let value;
26
+ try {
27
+ value = await readUtf8File(sourcePath);
28
+ }
29
+ catch (error) {
30
+ throw new SpawnfileError("validation_error", `Unable to read ${CLI_CREDENTIAL_SECRET_NAME} from host CLI credential source ${sourcePath}: ${error instanceof Error ? error.message : String(error)}`);
31
+ }
32
+ if (value.trim().length === 0) {
33
+ throw new SpawnfileError("validation_error", `Missing ${CLI_CREDENTIAL_SECRET_NAME}; host CLI credential source is empty: ${sourcePath}`);
34
+ }
35
+ try {
36
+ return { name: CLI_CREDENTIAL_SECRET_NAME, sourcePath, value: JSON.stringify(JSON.parse(value)) };
37
+ }
38
+ catch (error) {
39
+ throw new SpawnfileError("validation_error", `Unable to read ${CLI_CREDENTIAL_SECRET_NAME} from host CLI credential source ${sourcePath}: invalid JSON (${error instanceof Error ? error.message : String(error)})`);
40
+ }
41
+ };
13
42
  const addCoveredModelSecrets = (coveredModelSecrets, instanceId, secretNames) => {
14
43
  for (const secretName of secretNames) {
15
44
  coveredModelSecrets.add(`${instanceId}:${secretName}`);
16
45
  }
17
46
  };
18
47
  export const prepareRuntimeAuthMounts = async (outputDirectory, containerReport, authProfile, env, tempRoot) => {
19
- if (!authProfile) {
20
- return { coveredModelSecrets: new Set(), mountArgs: [] };
21
- }
48
+ // No early return when `authProfile` is null: an adapter's
49
+ // `prepareRuntimeAuth` may still have host-credential staging to do that
50
+ // does not depend on an imported Spawnfile auth profile (e.g. the Pi
51
+ // adapter mounting the host's `~/.grok`/`~/.codex`/antigravity CLI homes
52
+ // for a real-engine org — see `src/runtime/pi/runAuth.ts`). Each adapter is
53
+ // responsible for treating a `null` `authProfile` as "no profile-derived
54
+ // imports available" rather than failing.
22
55
  const coveredModelSecrets = new Set();
23
56
  const mountArgs = [];
24
57
  for (const instance of containerReport.runtime_instances) {
@@ -38,7 +71,7 @@ export const prepareRuntimeAuthMounts = async (outputDirectory, containerReport,
38
71
  }
39
72
  return { coveredModelSecrets, mountArgs };
40
73
  };
41
- export const assertDeclaredModelAuthSatisfied = (containerReport, authProfile) => {
74
+ export const assertDeclaredModelAuthSatisfied = (containerReport, authProfile, cliCredentialProvided = false) => {
42
75
  const requiredImportKinds = new Set();
43
76
  for (const instance of containerReport.runtime_instances) {
44
77
  for (const method of Object.values(instance.model_auth_methods)) {
@@ -51,9 +84,15 @@ export const assertDeclaredModelAuthSatisfied = (containerReport, authProfile) =
51
84
  if (requiredImportKinds.size === 0) {
52
85
  return;
53
86
  }
54
- if (!authProfile) {
87
+ if (!authProfile && !cliCredentialProvided) {
55
88
  throw new SpawnfileError("validation_error", `Auth profile is required for declared model auth methods: ${[...requiredImportKinds].sort().join(", ")}`);
56
89
  }
90
+ if (cliCredentialProvided) {
91
+ return;
92
+ }
93
+ if (!authProfile) {
94
+ return;
95
+ }
57
96
  const missingImportKinds = [...requiredImportKinds]
58
97
  .filter((kind) => !authProfile.imports[kind])
59
98
  .sort();
@@ -62,10 +101,13 @@ export const assertDeclaredModelAuthSatisfied = (containerReport, authProfile) =
62
101
  }
63
102
  };
64
103
  const getImportMountTargetName = (kind) => kind === "claude-code" ? ".claude" : ".codex";
65
- const createGeneratedRuntimeSecret = (secretName) => {
104
+ const createGeneratedRuntimeSecret = (secretName, generatedMoltnetSecrets) => {
66
105
  if (secretName === "OPENCLAW_GATEWAY_TOKEN" || secretName === "OPENCLAW_HOOKS_TOKEN") {
67
106
  return randomBytes(24).toString("hex");
68
107
  }
108
+ if (generatedMoltnetSecrets.has(secretName)) {
109
+ return randomBytes(32).toString("base64url");
110
+ }
69
111
  return null;
70
112
  };
71
113
  const hasEnvValue = (env, name) => typeof env[name] === "string" && env[name].length > 0;
@@ -93,17 +135,23 @@ export const resolveRunEnvironment = (containerReport, authProfile, envFileEnv =
93
135
  ...(authProfile?.env ?? {}),
94
136
  ...envFileEnv
95
137
  };
138
+ const generatedMoltnetSecrets = new Set((containerReport.moltnet?.server_plans ?? [])
139
+ .filter((server) => server.mode === "managed" && server.auth_mode === "bearer")
140
+ .flatMap((server) => (server.auth_tokens ?? []).map((token) => token.secret)));
96
141
  for (const name of new Set([...Object.keys(env), ...containerReport.secrets_required])) {
97
142
  const processValue = process.env[name];
98
143
  if (typeof processValue === "string" && processValue.length > 0) {
99
144
  env[name] = processValue;
100
145
  }
101
146
  }
102
- for (const name of containerReport.runtime_secrets_required) {
147
+ for (const name of new Set([
148
+ ...containerReport.runtime_secrets_required,
149
+ ...generatedMoltnetSecrets
150
+ ])) {
103
151
  if (hasEnvValue(env, name)) {
104
152
  continue;
105
153
  }
106
- const generatedValue = createGeneratedRuntimeSecret(name);
154
+ const generatedValue = createGeneratedRuntimeSecret(name, generatedMoltnetSecrets);
107
155
  if (generatedValue) {
108
156
  env[name] = generatedValue;
109
157
  }
@@ -121,6 +169,27 @@ export const assertRunEnvironmentSatisfied = (containerReport, env, coveredModel
121
169
  throw new SpawnfileError("validation_error", `Missing required runtime env: ${missing.sort().join(", ")}`);
122
170
  }
123
171
  };
172
+ export const assertMoltnetCredentialValuesDistinct = (containerReport, env) => {
173
+ for (const server of containerReport.moltnet?.server_plans ?? []) {
174
+ if (server.mode !== "managed" || server.auth_mode !== "bearer") {
175
+ continue;
176
+ }
177
+ const secretNames = (server.auth_tokens ?? []).map((token) => token.secret);
178
+ const normalizedValues = secretNames.map((name) => {
179
+ const value = env[name];
180
+ if (typeof value !== "string" || value.trim().length === 0) {
181
+ return null;
182
+ }
183
+ if (value !== value.trim()) {
184
+ throw new SpawnfileError("validation_error", `Moltnet credential ${name} must not contain leading or trailing whitespace`);
185
+ }
186
+ return value;
187
+ }).filter((value) => value !== null);
188
+ if (new Set(normalizedValues).size !== normalizedValues.length) {
189
+ throw new SpawnfileError("validation_error", `Moltnet network ${server.network_id} requires distinct credential values`);
190
+ }
191
+ }
192
+ };
124
193
  export const renderDockerEnvFile = (env) => `${Object.entries(env)
125
194
  .sort(([left], [right]) => left.localeCompare(right))
126
195
  .map(([name, value]) => `${name}=${value}`)
@@ -142,6 +211,15 @@ export const resolveAuthMountArgs = async (containerReport, authProfile) => {
142
211
  return [];
143
212
  }
144
213
  const args = [];
214
+ // Pi owns its model and CLI-engine auth projection in preparePiRuntimeAuth.
215
+ // Mounting the generic imported home onto the same destination would create
216
+ // duplicate Docker mount points and bypass the adapter's minimal-file staging.
217
+ const piRuntimeHomes = new Set(containerReport.runtime_instances
218
+ .filter((instance) => instance.runtime === "pi" || instance.runtime === "daimon")
219
+ .map((instance) => instance.home_path)
220
+ .filter((homePath) => homePath !== null));
221
+ const genericRuntimeHomes = containerReport.runtime_homes
222
+ .filter((runtimeHome) => !piRuntimeHomes.has(runtimeHome));
145
223
  for (const [kind, entry] of Object.entries(authProfile.imports)) {
146
224
  if (!entry) {
147
225
  continue;
@@ -149,7 +227,7 @@ export const resolveAuthMountArgs = async (containerReport, authProfile) => {
149
227
  if (!(await fileExists(entry.path))) {
150
228
  throw new SpawnfileError("validation_error", `Imported auth path for ${kind} does not exist: ${entry.path}`);
151
229
  }
152
- for (const runtimeHome of containerReport.runtime_homes) {
230
+ for (const runtimeHome of genericRuntimeHomes) {
153
231
  args.push("-v", `${entry.path}:${path.posix.join(runtimeHome, getImportMountTargetName(kind))}`);
154
232
  }
155
233
  }
@@ -5,15 +5,22 @@ export interface DockerRunInvocation {
5
5
  cwd: string;
6
6
  detach: boolean;
7
7
  deploymentName?: string | null;
8
+ deploymentLabels?: Readonly<Record<string, string>>;
8
9
  dockerContext?: string | null;
9
10
  dockerHost?: string | null;
10
11
  envFilePath: string;
11
12
  imageTag: string;
13
+ onDetachedStarted?: (result: {
14
+ containerId: string;
15
+ }) => Promise<void>;
12
16
  supportDirectory: string;
13
17
  }
14
18
  export interface DockerRunResult {
15
19
  containerId?: string;
20
+ deploymentLabels?: Readonly<Record<string, string>>;
16
21
  imageId?: string;
17
22
  }
18
23
  export type DockerRunRunner = (invocation: DockerRunInvocation) => Promise<DockerRunResult | void>;
24
+ export declare const createDetachedContainerInspectArgs: (invocation: DockerRunInvocation, containerId: string) => string[];
25
+ export declare const parseDetachedContainerInspect: (stdout: string, expectedContainerId: string, expectedLabels?: Readonly<Record<string, string>>) => DockerRunResult;
19
26
  export declare const runDockerContainer: DockerRunRunner;