spawnfile 0.1.14 → 0.1.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. package/README.md +60 -159
  2. package/dist/audit/checksShared.d.ts +1 -1
  3. package/dist/auth/importers.d.ts +10 -0
  4. package/dist/auth/importers.js +29 -4
  5. package/dist/auth/index.d.ts +2 -0
  6. package/dist/auth/index.js +1 -0
  7. package/dist/auth/paths.d.ts +1 -1
  8. package/dist/auth/profileStore.js +9 -9
  9. package/dist/auth/targetSecretSourceFsIdentity.d.ts +40 -0
  10. package/dist/auth/targetSecretSourceFsIdentity.js +42 -0
  11. package/dist/auth/targetSecretSourceFsPublish.d.ts +2 -0
  12. package/dist/auth/targetSecretSourceFsPublish.js +3 -1
  13. package/dist/auth/targetSecretSourceFsPublishImmutable.d.ts +2 -1
  14. package/dist/auth/targetSecretSourceFsPublishImmutable.js +104 -71
  15. package/dist/auth/targetSecretSourceFsRead.js +5 -14
  16. package/dist/auth/trainingAuth.d.ts +21 -0
  17. package/dist/auth/trainingAuth.js +86 -0
  18. package/dist/auth/types.d.ts +1 -1
  19. package/dist/cli/authCommands.d.ts +1 -1
  20. package/dist/cli/authCommands.js +9 -0
  21. package/dist/cli/canaryCutoverCommand.d.ts +2 -0
  22. package/dist/cli/canaryCutoverCommand.js +30 -0
  23. package/dist/cli/capabilitiesCommand.d.ts +3 -0
  24. package/dist/cli/capabilitiesCommand.js +12 -0
  25. package/dist/cli/capabilitiesReceipt.d.ts +56 -0
  26. package/dist/cli/capabilitiesReceipt.js +56 -0
  27. package/dist/cli/compileBuildCommands.js +13 -0
  28. package/dist/cli/composedLifecycleContractSet.d.ts +21 -0
  29. package/dist/cli/composedLifecycleContractSet.js +204 -0
  30. package/dist/cli/devCommands.js +2 -0
  31. package/dist/cli/downCommand.js +19 -8
  32. package/dist/cli/evidenceExportHelperCommand.d.ts +13 -0
  33. package/dist/cli/evidenceExportHelperCommand.js +51 -0
  34. package/dist/cli/index.js +12 -3
  35. package/dist/cli/lifecycleMachine.d.ts +7 -1
  36. package/dist/cli/lifecycleMachine.js +2 -2
  37. package/dist/cli/paideiaDelegation.d.ts +17 -0
  38. package/dist/cli/paideiaDelegation.js +210 -0
  39. package/dist/cli/paideiaSupervisor.d.ts +17 -0
  40. package/dist/cli/paideiaSupervisor.js +48 -0
  41. package/dist/cli/productStateCloneCommand.d.ts +2 -0
  42. package/dist/cli/productStateCloneCommand.js +34 -0
  43. package/dist/cli/runCli.d.ts +13 -3
  44. package/dist/cli/runCli.js +37 -9
  45. package/dist/cli/targetCommands.d.ts +4 -7
  46. package/dist/cli/targetCommands.js +16 -46
  47. package/dist/cli/targetConfigPreparedPlan.d.ts +3 -0
  48. package/dist/cli/targetConfigPreparedPlan.js +74 -0
  49. package/dist/cli/targetConfigResolver.d.ts +3 -0
  50. package/dist/cli/targetConfigResolver.js +111 -0
  51. package/dist/cli/targetConfigResolverCommand.d.ts +6 -0
  52. package/dist/cli/targetConfigResolverCommand.js +43 -0
  53. package/dist/cli/targetConfigResolverContracts.d.ts +56 -0
  54. package/dist/cli/targetConfigResolverContracts.js +30 -0
  55. package/dist/cli/targetConfigResolverDocker.d.ts +4 -0
  56. package/dist/cli/targetConfigResolverDocker.js +47 -0
  57. package/dist/cli/targetConfigResolverValidation.d.ts +10 -0
  58. package/dist/cli/targetConfigResolverValidation.js +94 -0
  59. package/dist/cli/targetDefaultAuthorities.d.ts +2 -0
  60. package/dist/cli/targetDefaultAuthorities.js +3 -0
  61. package/dist/cli/targetDefaultConfig.d.ts +7 -0
  62. package/dist/cli/targetDefaultConfig.js +22 -5
  63. package/dist/cli/targetDefaultConfigStdin.js +7 -1
  64. package/dist/cli/targetDefaultHandlerFactory.js +23 -2
  65. package/dist/cli/targetDefaultHandlers.d.ts +2 -2
  66. package/dist/cli/targetProductionCommands.d.ts +5 -0
  67. package/dist/cli/targetProductionCommands.js +45 -0
  68. package/dist/cli/trainCommand.d.ts +3 -0
  69. package/dist/cli/trainCommand.js +61 -0
  70. package/dist/cli/upCommand.js +35 -6
  71. package/dist/cli/upLifecycleRecovery.d.ts +2 -2
  72. package/dist/cli/upLifecycleRecovery.js +188 -44
  73. package/dist/cli/usageCommand.d.ts +40 -0
  74. package/dist/cli/usageCommand.js +284 -0
  75. package/dist/cli/usageCommandLive.d.ts +84 -0
  76. package/dist/cli/usageCommandLive.js +95 -0
  77. package/dist/cli/usageDeploymentSource.d.ts +9 -0
  78. package/dist/cli/usageDeploymentSource.js +22 -0
  79. package/dist/cli/workspaceResourceMigrationCommand.d.ts +8 -0
  80. package/dist/cli/workspaceResourceMigrationCommand.js +36 -0
  81. package/dist/compiler/buildCompilePlanTeams.d.ts +1 -1
  82. package/dist/compiler/buildCompilePlanTeams.js +6 -1
  83. package/dist/compiler/compilePlanHelpers.js +3 -0
  84. package/dist/compiler/compileProject.d.ts +2 -0
  85. package/dist/compiler/compileProject.js +5 -1
  86. package/dist/compiler/compileProjectSupport.js +9 -0
  87. package/dist/compiler/containerArtifacts.d.ts +3 -1
  88. package/dist/compiler/containerArtifacts.js +92 -40
  89. package/dist/compiler/containerArtifactsPlans.d.ts +1 -1
  90. package/dist/compiler/containerArtifactsPlans.js +24 -7
  91. package/dist/compiler/containerArtifactsRender.d.ts +2 -1
  92. package/dist/compiler/containerArtifactsRender.js +91 -58
  93. package/dist/compiler/containerArtifactsTypes.d.ts +8 -0
  94. package/dist/compiler/containerBackedMountRender.d.ts +56 -0
  95. package/dist/compiler/containerBackedMountRender.js +101 -0
  96. package/dist/compiler/containerDaimonBrokerRender.d.ts +112 -0
  97. package/dist/compiler/containerDaimonBrokerRender.js +191 -0
  98. package/dist/compiler/containerDaimonGrokWorkerProvisioning.d.ts +38 -0
  99. package/dist/compiler/containerDaimonGrokWorkerProvisioning.js +108 -0
  100. package/dist/compiler/containerDaimonGrokWorkerRender.d.ts +172 -0
  101. package/dist/compiler/containerDaimonGrokWorkerRender.js +268 -0
  102. package/dist/compiler/containerDaimonOwnershipGuardRender.d.ts +12 -0
  103. package/dist/compiler/containerDaimonOwnershipGuardRender.js +191 -0
  104. package/dist/compiler/containerDaimonUidEntrypointRender.d.ts +24 -0
  105. package/dist/compiler/containerDaimonUidEntrypointRender.js +297 -0
  106. package/dist/compiler/containerEntrypointRender.d.ts +7 -0
  107. package/dist/compiler/containerEntrypointRender.js +28 -22
  108. package/dist/compiler/containerPersistentMounts.d.ts +30 -0
  109. package/dist/compiler/containerPersistentMounts.js +66 -0
  110. package/dist/compiler/containerReadinessPaths.d.ts +1 -0
  111. package/dist/compiler/containerReadinessPaths.js +1 -0
  112. package/dist/compiler/containerRuntimeLinkMaterializer.d.ts +2 -0
  113. package/dist/compiler/containerRuntimeLinkMaterializer.js +12 -0
  114. package/dist/compiler/containerRuntimeReadinessRender.d.ts +7 -0
  115. package/dist/compiler/containerRuntimeReadinessRender.js +40 -0
  116. package/dist/compiler/containerStateOwnershipRender.d.ts +4 -0
  117. package/dist/compiler/containerStateOwnershipRender.js +75 -0
  118. package/dist/compiler/containerTargetResources.d.ts +22 -1
  119. package/dist/compiler/containerTargetResources.js +94 -2
  120. package/dist/compiler/containerVolumeBootstrap.d.ts +3 -0
  121. package/dist/compiler/containerVolumeBootstrap.js +3 -0
  122. package/dist/compiler/containerWorkspaceResourceRender.js +49 -1
  123. package/dist/compiler/daimonTelemetryArtifacts.d.ts +2 -2
  124. package/dist/compiler/daimonTelemetryArtifacts.js +5 -10
  125. package/dist/compiler/deploymentLineage.d.ts +40 -0
  126. package/dist/compiler/deploymentLineage.js +50 -0
  127. package/dist/compiler/index.d.ts +3 -0
  128. package/dist/compiler/index.js +3 -0
  129. package/dist/compiler/initProject.d.ts +2 -0
  130. package/dist/compiler/initProject.js +39 -1
  131. package/dist/compiler/localMoltnetAuthority.d.ts +64 -0
  132. package/dist/compiler/localMoltnetAuthority.js +177 -0
  133. package/dist/compiler/memoryArtifacts.d.ts +1 -1
  134. package/dist/compiler/memoryArtifacts.js +108 -32
  135. package/dist/compiler/modelEnv.d.ts +5 -0
  136. package/dist/compiler/modelEnv.js +8 -2
  137. package/dist/compiler/moltnetArtifactPaths.d.ts +17 -12
  138. package/dist/compiler/moltnetArtifactPaths.js +17 -15
  139. package/dist/compiler/moltnetArtifactTypes.d.ts +10 -0
  140. package/dist/compiler/moltnetArtifacts.d.ts +1 -1
  141. package/dist/compiler/moltnetArtifacts.js +52 -12
  142. package/dist/compiler/moltnetBinaries.d.ts +16 -4
  143. package/dist/compiler/moltnetBinaries.js +46 -6
  144. package/dist/compiler/moltnetClientConfig.js +1 -1
  145. package/dist/compiler/moltnetConfigLowering.d.ts +3 -1
  146. package/dist/compiler/moltnetConfigLowering.js +30 -6
  147. package/dist/compiler/moltnetNodeConfig.js +1 -1
  148. package/dist/compiler/moltnetReleaseAuthority.d.ts +24 -1
  149. package/dist/compiler/moltnetReleaseAuthority.js +33 -4
  150. package/dist/compiler/moltnetRepresentativeResolution.d.ts +1 -1
  151. package/dist/compiler/moltnetRepresentativeResolution.js +2 -2
  152. package/dist/compiler/moltnetResolution.js +9 -15
  153. package/dist/compiler/moltnetRoomMemberships.js +20 -5
  154. package/dist/compiler/moltnetRoomPolicyCompatibility.d.ts +1 -1
  155. package/dist/compiler/moltnetRoomPolicyCompatibility.js +3 -1
  156. package/dist/compiler/moltnetRuntimeConfig.d.ts +1 -1
  157. package/dist/compiler/moltnetRuntimeConfig.js +22 -2
  158. package/dist/compiler/moltnetServerPlans.js +19 -0
  159. package/dist/compiler/organizationExternalParticipants.d.ts +3 -0
  160. package/dist/compiler/organizationExternalParticipants.js +176 -0
  161. package/dist/compiler/organizationIdentity.d.ts +3 -9
  162. package/dist/compiler/organizationIdentity.js +37 -270
  163. package/dist/compiler/organizationIdentityGraph.d.ts +15 -0
  164. package/dist/compiler/organizationIdentityGraph.js +115 -0
  165. package/dist/compiler/organizationReadyEvidence.d.ts +8 -0
  166. package/dist/compiler/organizationReadyEvidence.js +23 -3
  167. package/dist/compiler/runProject.d.ts +4 -2
  168. package/dist/compiler/runProject.js +32 -6
  169. package/dist/compiler/runProjectAuth.d.ts +3 -1
  170. package/dist/compiler/runProjectAuth.js +19 -3
  171. package/dist/compiler/runProjectDaimonCodexDocker.d.ts +3 -0
  172. package/dist/compiler/runProjectDaimonCodexDocker.js +36 -0
  173. package/dist/compiler/runProjectDocker.d.ts +8 -4
  174. package/dist/compiler/runProjectDocker.js +43 -18
  175. package/dist/compiler/runProjectDockerDaimonGuards.d.ts +15 -0
  176. package/dist/compiler/runProjectDockerDaimonGuards.js +122 -0
  177. package/dist/compiler/runProjectDockerReservation.d.ts +3 -0
  178. package/dist/compiler/runProjectDockerReservation.js +118 -0
  179. package/dist/compiler/runProjectLifecycle.js +1 -1
  180. package/dist/compiler/training/broker/declaration.d.ts +45 -0
  181. package/dist/compiler/training/broker/declaration.js +55 -0
  182. package/dist/compiler/training/broker/entrypoint.d.ts +39 -0
  183. package/dist/compiler/training/broker/entrypoint.js +111 -0
  184. package/dist/compiler/training/broker/index.d.ts +10 -0
  185. package/dist/compiler/training/broker/index.js +10 -0
  186. package/dist/compiler/training/broker/main.d.ts +2 -0
  187. package/dist/compiler/training/broker/main.js +14 -0
  188. package/dist/compiler/training/broker/paths.d.ts +196 -0
  189. package/dist/compiler/training/broker/paths.js +241 -0
  190. package/dist/compiler/training/broker/processes.d.ts +42 -0
  191. package/dist/compiler/training/broker/processes.js +99 -0
  192. package/dist/compiler/training/broker/projection.d.ts +51 -0
  193. package/dist/compiler/training/broker/projection.js +76 -0
  194. package/dist/compiler/training/broker/provisioning.d.ts +87 -0
  195. package/dist/compiler/training/broker/provisioning.js +213 -0
  196. package/dist/compiler/training/broker/receipt.d.ts +77 -0
  197. package/dist/compiler/training/broker/receipt.js +110 -0
  198. package/dist/compiler/training/broker/registration.d.ts +41 -0
  199. package/dist/compiler/training/broker/registration.js +102 -0
  200. package/dist/compiler/training/broker/runtime.d.ts +25 -0
  201. package/dist/compiler/training/broker/runtime.js +173 -0
  202. package/dist/compiler/training/broker/seccompRoutes.d.ts +31 -0
  203. package/dist/compiler/training/broker/seccompRoutes.js +36 -0
  204. package/dist/compiler/training/broker/supervisor.d.ts +109 -0
  205. package/dist/compiler/training/broker/supervisor.js +173 -0
  206. package/dist/compiler/training/container/contract.d.ts +31 -0
  207. package/dist/compiler/training/container/contract.js +33 -0
  208. package/dist/compiler/training/container/index.d.ts +4 -0
  209. package/dist/compiler/training/container/index.js +2 -0
  210. package/dist/compiler/training/container/launch.d.ts +18 -0
  211. package/dist/compiler/training/container/launch.js +173 -0
  212. package/dist/compiler/training/container/prepare.d.ts +8 -0
  213. package/dist/compiler/training/container/prepare.js +80 -0
  214. package/dist/compiler/training/container/process.d.ts +14 -0
  215. package/dist/compiler/training/container/process.js +70 -0
  216. package/dist/compiler/training/container/security.d.ts +36 -0
  217. package/dist/compiler/training/container/security.js +58 -0
  218. package/dist/compiler/training/context.d.ts +7 -0
  219. package/dist/compiler/training/context.js +93 -0
  220. package/dist/compiler/training/contract.d.ts +142 -0
  221. package/dist/compiler/training/contract.js +34 -0
  222. package/dist/compiler/training/index.d.ts +4 -0
  223. package/dist/compiler/training/index.js +3 -0
  224. package/dist/compiler/training/preparation/assets/Dockerfile +98 -0
  225. package/dist/compiler/training/preparation/assets/package-lock.json +3787 -0
  226. package/dist/compiler/training/preparation/broker.d.ts +21 -0
  227. package/dist/compiler/training/preparation/broker.js +43 -0
  228. package/dist/compiler/training/preparation/contextModes.d.ts +12 -0
  229. package/dist/compiler/training/preparation/contextModes.js +38 -0
  230. package/dist/compiler/training/preparation/contract.d.ts +182 -0
  231. package/dist/compiler/training/preparation/contract.js +94 -0
  232. package/dist/compiler/training/preparation/copyAssets.d.ts +1 -0
  233. package/dist/compiler/training/preparation/copyAssets.js +8 -0
  234. package/dist/compiler/training/preparation/daimonParent.d.ts +42 -0
  235. package/dist/compiler/training/preparation/daimonParent.js +114 -0
  236. package/dist/compiler/training/preparation/files.d.ts +25 -0
  237. package/dist/compiler/training/preparation/files.js +85 -0
  238. package/dist/compiler/training/preparation/image.d.ts +28 -0
  239. package/dist/compiler/training/preparation/image.js +102 -0
  240. package/dist/compiler/training/preparation/index.d.ts +3 -0
  241. package/dist/compiler/training/preparation/index.js +2 -0
  242. package/dist/compiler/training/preparation/inputs.d.ts +23 -0
  243. package/dist/compiler/training/preparation/inputs.js +93 -0
  244. package/dist/compiler/training/preparation/prepare.d.ts +33 -0
  245. package/dist/compiler/training/preparation/prepare.js +186 -0
  246. package/dist/compiler/training/preparation/scratch.d.ts +19 -0
  247. package/dist/compiler/training/preparation/scratch.js +48 -0
  248. package/dist/compiler/training/repair/compatibility.d.ts +11 -0
  249. package/dist/compiler/training/repair/compatibility.js +34 -0
  250. package/dist/compiler/training/repair/contract.d.ts +506 -0
  251. package/dist/compiler/training/repair/contract.js +31 -0
  252. package/dist/compiler/training/repair/index.d.ts +3 -0
  253. package/dist/compiler/training/repair/index.js +3 -0
  254. package/dist/compiler/training/repair/prepare.d.ts +230 -0
  255. package/dist/compiler/training/repair/prepare.js +74 -0
  256. package/dist/compiler/training/repair/witness.d.ts +203 -0
  257. package/dist/compiler/training/repair/witness.js +42 -0
  258. package/dist/compiler/types.d.ts +2 -0
  259. package/dist/compiler/upProject.d.ts +26 -1
  260. package/dist/compiler/upProject.js +117 -178
  261. package/dist/compiler/upProjectHandoff.d.ts +62 -0
  262. package/dist/compiler/upProjectHandoff.js +204 -0
  263. package/dist/compiler/upReceipt.js +49 -4
  264. package/dist/compiler/updateProjectModels.js +1 -0
  265. package/dist/compiler/view/types.d.ts +1 -1
  266. package/dist/compiler/workspaceBundleArtifacts.d.ts +3 -0
  267. package/dist/compiler/workspaceBundleArtifacts.js +106 -0
  268. package/dist/compiler/workspaceResources.d.ts +4 -1
  269. package/dist/compiler/workspaceResources.js +12 -7
  270. package/dist/deployment/artifactsExportPlan.js +51 -1
  271. package/dist/deployment/canaryCutover.d.ts +42 -0
  272. package/dist/deployment/canaryCutover.js +140 -0
  273. package/dist/deployment/candidateDiagnostics.d.ts +15 -0
  274. package/dist/deployment/candidateDiagnostics.js +90 -0
  275. package/dist/deployment/dockerLogs.js +4 -1
  276. package/dist/deployment/dockerManager.js +9 -3
  277. package/dist/deployment/dockerProbeGateway.d.ts +17 -0
  278. package/dist/deployment/dockerProbeGateway.js +17 -2
  279. package/dist/deployment/downDeployment.d.ts +5 -0
  280. package/dist/deployment/downDeployment.js +109 -8
  281. package/dist/deployment/downReceiptTypes.d.ts +17 -2
  282. package/dist/deployment/downReceiptTypes.js +17 -2
  283. package/dist/deployment/index.d.ts +4 -0
  284. package/dist/deployment/index.js +4 -0
  285. package/dist/deployment/lifecycleCompletionContracts.d.ts +66 -0
  286. package/dist/deployment/lifecycleCompletionContracts.js +34 -0
  287. package/dist/deployment/lifecycleCompletionPaths.d.ts +4 -1
  288. package/dist/deployment/lifecycleCompletionPaths.js +3 -0
  289. package/dist/deployment/lifecycleCompletionPublication.d.ts +2 -0
  290. package/dist/deployment/lifecycleCompletionPublication.js +18 -4
  291. package/dist/deployment/lifecycleCompletionStore.d.ts +1 -1
  292. package/dist/deployment/lifecycleCompletionStore.js +7 -7
  293. package/dist/deployment/lifecycleUpRecords.d.ts +11 -0
  294. package/dist/deployment/lifecycleUpRecords.js +127 -0
  295. package/dist/deployment/native/AGENTS.md +11 -0
  296. package/dist/deployment/native/rename-noreplace-arm64 +0 -0
  297. package/dist/deployment/native/rename-noreplace-arm64.provenance.json +1 -0
  298. package/dist/deployment/native/rename-noreplace-x64 +0 -0
  299. package/dist/deployment/native/rename-noreplace-x64.provenance.json +1 -0
  300. package/dist/deployment/noReplaceActivation.d.ts +17 -0
  301. package/dist/deployment/noReplaceActivation.js +50 -0
  302. package/dist/deployment/organizationHandoffAuthorityFsBudget.d.ts +110 -0
  303. package/dist/deployment/organizationHandoffAuthorityFsBudget.js +156 -0
  304. package/dist/deployment/organizationHandoffAuthorityFsClient.js +82 -27
  305. package/dist/deployment/organizationHandoffAuthorityFsElection.d.ts +21 -0
  306. package/dist/deployment/organizationHandoffAuthorityFsElection.js +57 -0
  307. package/dist/deployment/organizationHandoffAuthorityFsWorker.js +254 -108
  308. package/dist/deployment/organizationHandoffAuthorityFsWorkerStall.fixture.d.ts +1 -0
  309. package/dist/deployment/organizationHandoffAuthorityFsWorkerStall.fixture.js +16 -0
  310. package/dist/deployment/organizationHandoffAuthorityStore.js +14 -7
  311. package/dist/deployment/organizationHandoffAuthorityTypes.d.ts +2 -2
  312. package/dist/deployment/organizationHandoffAuthorityTypes.js +2 -1
  313. package/dist/deployment/organizationReady.d.ts +2 -0
  314. package/dist/deployment/organizationReady.js +36 -4
  315. package/dist/deployment/productStateClone.d.ts +43 -0
  316. package/dist/deployment/productStateClone.js +319 -0
  317. package/dist/deployment/upLifecycleRecoveryState.d.ts +23 -0
  318. package/dist/deployment/upLifecycleRecoveryState.js +12 -0
  319. package/dist/deployment/upReceiptTypes.d.ts +32 -6
  320. package/dist/deployment/upReceiptTypes.js +29 -2
  321. package/dist/deployment/workspaceResourceMigration.d.ts +55 -0
  322. package/dist/deployment/workspaceResourceMigration.js +315 -0
  323. package/dist/dev/project.d.ts +7 -0
  324. package/dist/dev/project.js +9 -0
  325. package/dist/distribution/consumeImage.d.ts +2 -0
  326. package/dist/distribution/consumeImage.js +98 -73
  327. package/dist/distribution/consumeImageDaimonDocker.d.ts +3 -0
  328. package/dist/distribution/consumeImageDaimonDocker.js +45 -0
  329. package/dist/distribution/consumeImageLifecycle.d.ts +17 -0
  330. package/dist/distribution/consumeImageLifecycle.js +231 -0
  331. package/dist/distribution/consumeImageSupport.d.ts +12 -0
  332. package/dist/distribution/consumeImageSupport.js +15 -0
  333. package/dist/distribution/distributionReportSchema.d.ts +11 -1
  334. package/dist/distribution/distributionReportSchema.js +15 -2
  335. package/dist/distribution/dockerRunner.d.ts +6 -1
  336. package/dist/distribution/dockerRunner.js +31 -4
  337. package/dist/distribution/imageRuntimeAuth.d.ts +9 -1
  338. package/dist/distribution/imageRuntimeAuth.js +70 -1
  339. package/dist/distribution/index.d.ts +1 -1
  340. package/dist/distribution/index.js +1 -1
  341. package/dist/distribution/preflight.js +5 -1
  342. package/dist/distribution/types.d.ts +14 -1
  343. package/dist/distribution/types.js +3 -0
  344. package/dist/evidenceExportHelper/boundedExecutor.d.ts +3 -0
  345. package/dist/evidenceExportHelper/boundedExecutor.js +33 -0
  346. package/dist/evidenceExportHelper/helperProgram.mjs +156 -0
  347. package/dist/evidenceExportHelper/index.d.ts +4 -0
  348. package/dist/evidenceExportHelper/index.js +4 -0
  349. package/dist/evidenceExportHelper/preparedAuthority.d.ts +64 -0
  350. package/dist/evidenceExportHelper/preparedAuthority.js +228 -0
  351. package/dist/evidenceExportHelper/preparedBuilder.d.ts +10 -0
  352. package/dist/evidenceExportHelper/preparedBuilder.js +183 -0
  353. package/dist/evidenceExportHelper/preparedBuilderTypes.d.ts +19 -0
  354. package/dist/evidenceExportHelper/preparedBuilderTypes.js +1 -0
  355. package/dist/evidenceExportHelper/recipe.d.ts +7 -0
  356. package/dist/evidenceExportHelper/recipe.js +83 -0
  357. package/dist/filesystem/io.d.ts +2 -0
  358. package/dist/filesystem/io.js +16 -1
  359. package/dist/manifest/executionSchemas.d.ts +27 -0
  360. package/dist/manifest/executionSchemas.js +21 -2
  361. package/dist/manifest/mcpSchemas.d.ts +1 -0
  362. package/dist/manifest/mcpSchemas.js +3 -0
  363. package/dist/manifest/renderSpawnfileNetworks.js +11 -0
  364. package/dist/manifest/renderSpawnfileWorkspace.js +5 -0
  365. package/dist/manifest/scheduleSchemas.d.ts +3 -1
  366. package/dist/manifest/scheduleSchemas.js +91 -5
  367. package/dist/manifest/schemas.d.ts +237 -12
  368. package/dist/manifest/schemas.js +5 -2
  369. package/dist/manifest/teamNetworkAccessSchemas.d.ts +5 -1
  370. package/dist/manifest/teamNetworkAccessSchemas.js +11 -0
  371. package/dist/manifest/teamNetworkAuthSchemas.d.ts +1 -1
  372. package/dist/manifest/teamNetworkSchemas.d.ts +17 -3
  373. package/dist/manifest/teamNetworkSchemas.js +19 -1
  374. package/dist/manifest/teamNetworkServerSchemas.d.ts +8 -3
  375. package/dist/manifest/teamNetworkServerSchemas.js +18 -2
  376. package/dist/manifest/workspaceSchemas.d.ts +16 -0
  377. package/dist/manifest/workspaceSchemas.js +11 -0
  378. package/dist/report/types.d.ts +34 -4
  379. package/dist/runtime/common.d.ts +28 -1
  380. package/dist/runtime/common.js +33 -3
  381. package/dist/runtime/container.js +49 -33
  382. package/dist/runtime/daimon/adapter.d.ts +14 -0
  383. package/dist/runtime/daimon/adapter.js +243 -0
  384. package/dist/runtime/daimon/attention.d.ts +8 -0
  385. package/dist/runtime/daimon/attention.js +32 -0
  386. package/dist/runtime/daimon/config.d.ts +25 -0
  387. package/dist/runtime/daimon/config.js +272 -0
  388. package/dist/runtime/daimon/contractManifest.d.ts +295 -0
  389. package/dist/runtime/daimon/contractManifest.js +319 -0
  390. package/dist/runtime/daimon/grokModel.d.ts +19 -0
  391. package/dist/runtime/daimon/grokModel.js +33 -0
  392. package/dist/runtime/daimon/grokWorkerConfigBytes.d.ts +26 -0
  393. package/dist/runtime/daimon/grokWorkerConfigBytes.js +36 -0
  394. package/dist/runtime/daimon/grokWorkerContract.d.ts +22 -0
  395. package/dist/runtime/daimon/grokWorkerContract.js +48 -0
  396. package/dist/runtime/daimon/memory.d.ts +57 -0
  397. package/dist/runtime/daimon/memory.js +125 -0
  398. package/dist/runtime/daimon/runAuth.d.ts +51 -0
  399. package/dist/runtime/daimon/runAuth.js +279 -0
  400. package/dist/runtime/daimon/runtimeIdentity.d.ts +22 -0
  401. package/dist/runtime/daimon/runtimeIdentity.js +22 -0
  402. package/dist/runtime/daimon/scheduleAuthority.d.ts +3 -0
  403. package/dist/runtime/daimon/scheduleAuthority.js +17 -0
  404. package/dist/runtime/index.d.ts +4 -0
  405. package/dist/runtime/index.js +4 -0
  406. package/dist/runtime/install.d.ts +3 -0
  407. package/dist/runtime/install.js +3 -0
  408. package/dist/runtime/localDaimonAuthority.d.ts +11 -0
  409. package/dist/runtime/localDaimonAuthority.js +77 -0
  410. package/dist/runtime/mnemeMcp.d.ts +13 -0
  411. package/dist/runtime/mnemeMcp.js +26 -0
  412. package/dist/runtime/openclaw/adapter.js +2 -2
  413. package/dist/runtime/pi/adapter.d.ts +0 -1
  414. package/dist/runtime/pi/adapter.js +2 -6
  415. package/dist/runtime/pi/appCliSource.js +1 -1
  416. package/dist/runtime/pi/appScheduleSource.js +6 -2
  417. package/dist/runtime/pi/appTemplateTypes.d.ts +1 -1
  418. package/dist/runtime/picoclaw/adapter.js +2 -2
  419. package/dist/runtime/registry.d.ts +3 -0
  420. package/dist/runtime/registry.js +19 -2
  421. package/dist/runtime/scheduleUtils.d.ts +1 -0
  422. package/dist/runtime/scheduleUtils.js +5 -1
  423. package/dist/runtime/types.d.ts +25 -0
  424. package/dist/runtime/usageLedger.d.ts +158 -0
  425. package/dist/runtime/usageLedger.js +269 -0
  426. package/dist/runtime/usageLedgerRead.d.ts +48 -0
  427. package/dist/runtime/usageLedgerRead.js +102 -0
  428. package/dist/runtime/usageRequestLedger.d.ts +42 -0
  429. package/dist/runtime/usageRequestLedger.js +72 -0
  430. package/dist/shared/daimonCodexDocker.d.ts +32 -0
  431. package/dist/shared/daimonCodexDocker.js +120 -0
  432. package/dist/shared/daimonGrokSeccompProfile.d.ts +10 -0
  433. package/dist/shared/daimonGrokSeccompProfile.js +11 -0
  434. package/dist/shared/index.d.ts +2 -0
  435. package/dist/shared/index.js +2 -0
  436. package/dist/shared/types.d.ts +1 -1
  437. package/dist/shared/volumeNames.d.ts +6 -0
  438. package/dist/shared/volumeNames.js +14 -0
  439. package/dist/target/dockerArtifactsProvider.js +34 -7
  440. package/dist/target/dockerBaseImage.d.ts +2 -0
  441. package/dist/target/dockerBaseImage.js +11 -0
  442. package/dist/target/dockerCommandExecutor.d.ts +11 -0
  443. package/dist/target/dockerCommandExecutor.js +53 -2
  444. package/dist/target/dockerCommandExecutorCore.d.ts +2 -1
  445. package/dist/target/dockerCommandExecutorCore.js +4 -2
  446. package/dist/target/dockerPublicArtifactSnapshot.d.ts +3 -3
  447. package/dist/target/dockerPublicArtifactSnapshot.js +17 -33
  448. package/dist/target/dockerTarget.d.ts +1 -0
  449. package/dist/target/dockerTargetBinding.d.ts +1 -2
  450. package/dist/target/dockerTargetBinding.js +2 -3
  451. package/dist/target/dockerTargetExecFile.d.ts +19 -0
  452. package/dist/target/dockerTargetExecFile.js +194 -0
  453. package/dist/target/dockerWorldServiceProvider.d.ts +4 -0
  454. package/dist/target/dockerWorldServiceProvider.js +13 -1
  455. package/dist/target/evidenceExport.d.ts +3 -1
  456. package/dist/target/evidenceExport.js +12 -3
  457. package/dist/target/evidenceExportOperationsTestKit.js +3 -3
  458. package/dist/target/evidenceExportProvider.d.ts +2 -0
  459. package/dist/target/evidenceExportProvider.js +15 -5
  460. package/dist/target/publicArtifactSnapshot.d.ts +31 -0
  461. package/dist/target/publicArtifactSnapshot.js +37 -3
  462. package/examples/README.md +45 -0
  463. package/examples/agent-with-subagents/AGENTS.md +3 -0
  464. package/examples/agent-with-subagents/Spawnfile +30 -0
  465. package/examples/agent-with-subagents/subagents/critic/AGENTS.md +3 -0
  466. package/examples/agent-with-subagents/subagents/critic/Spawnfile +15 -0
  467. package/examples/agent-with-subagents/subagents/researcher/AGENTS.md +3 -0
  468. package/examples/agent-with-subagents/subagents/researcher/Spawnfile +17 -0
  469. package/examples/daimon-org/Spawnfile +68 -0
  470. package/examples/daimon-org/TEAM.md +4 -0
  471. package/examples/daimon-org/agents/mapper/AGENTS.md +4 -0
  472. package/examples/daimon-org/agents/mapper/Spawnfile +37 -0
  473. package/examples/daimon-org/shared/skills/file-note/SKILL.md +9 -0
  474. package/examples/daimon-org/teams/review/Spawnfile +53 -0
  475. package/examples/daimon-org/teams/review/agents/reviewer/AGENTS.md +4 -0
  476. package/examples/daimon-org/teams/review/agents/reviewer/Spawnfile +37 -0
  477. package/examples/daimon-public-host/AGENTS.md +3 -0
  478. package/examples/daimon-public-host/Spawnfile +21 -0
  479. package/examples/distribution-org/Spawnfile +43 -0
  480. package/examples/distribution-org/TEAM.md +4 -0
  481. package/examples/distribution-org/agents/coordinator/AGENTS.md +1 -0
  482. package/examples/distribution-org/agents/coordinator/Spawnfile +20 -0
  483. package/examples/distribution-org/agents/researcher/AGENTS.md +1 -0
  484. package/examples/distribution-org/agents/researcher/Spawnfile +20 -0
  485. package/examples/jungian-daimon-org/Spawnfile +41 -0
  486. package/examples/jungian-daimon-org/TEAM.md +21 -0
  487. package/examples/jungian-daimon-org/teams/luna/Spawnfile +47 -0
  488. package/examples/jungian-daimon-org/teams/luna/TEAM.md +4 -0
  489. package/examples/jungian-daimon-org/teams/luna/agents/animus/AGENTS.md +10 -0
  490. package/examples/jungian-daimon-org/teams/luna/agents/animus/Spawnfile +33 -0
  491. package/examples/jungian-daimon-org/teams/luna/agents/representative/AGENTS.md +21 -0
  492. package/examples/jungian-daimon-org/teams/luna/agents/representative/Spawnfile +30 -0
  493. package/examples/jungian-daimon-org/teams/luna/agents/shadow/AGENTS.md +10 -0
  494. package/examples/jungian-daimon-org/teams/luna/agents/shadow/Spawnfile +33 -0
  495. package/examples/jungian-daimon-org/teams/selene/Spawnfile +47 -0
  496. package/examples/jungian-daimon-org/teams/selene/TEAM.md +4 -0
  497. package/examples/jungian-daimon-org/teams/selene/agents/animus/AGENTS.md +10 -0
  498. package/examples/jungian-daimon-org/teams/selene/agents/animus/Spawnfile +33 -0
  499. package/examples/jungian-daimon-org/teams/selene/agents/representative/AGENTS.md +19 -0
  500. package/examples/jungian-daimon-org/teams/selene/agents/representative/Spawnfile +33 -0
  501. package/examples/jungian-daimon-org/teams/selene/agents/shadow/AGENTS.md +10 -0
  502. package/examples/jungian-daimon-org/teams/selene/agents/shadow/Spawnfile +30 -0
  503. package/examples/mixed-runtime-org/Spawnfile +71 -0
  504. package/examples/mixed-runtime-org/TEAM.md +8 -0
  505. package/examples/mixed-runtime-org/agents/analyst/AGENTS.md +8 -0
  506. package/examples/mixed-runtime-org/agents/analyst/Spawnfile +27 -0
  507. package/examples/mixed-runtime-org/agents/conductor/AGENTS.md +8 -0
  508. package/examples/mixed-runtime-org/agents/conductor/Spawnfile +27 -0
  509. package/examples/mixed-runtime-org/agents/localist/AGENTS.md +7 -0
  510. package/examples/mixed-runtime-org/agents/localist/Spawnfile +50 -0
  511. package/examples/moltnet-team-chat/Spawnfile +43 -0
  512. package/examples/moltnet-team-chat/TEAM.md +5 -0
  513. package/examples/moltnet-team-chat/agents/coordinator/AGENTS.md +9 -0
  514. package/examples/moltnet-team-chat/agents/coordinator/Spawnfile +26 -0
  515. package/examples/moltnet-team-chat/teams/analysis/Spawnfile +23 -0
  516. package/examples/moltnet-team-chat/teams/analysis/TEAM.md +3 -0
  517. package/examples/moltnet-team-chat/teams/analysis/agents/observer/AGENTS.md +5 -0
  518. package/examples/moltnet-team-chat/teams/analysis/agents/observer/Spawnfile +19 -0
  519. package/examples/moltnet-team-chat/teams/analysis/agents/representative/AGENTS.md +5 -0
  520. package/examples/moltnet-team-chat/teams/analysis/agents/representative/Spawnfile +19 -0
  521. package/examples/moltnet-team-chat/teams/field/Spawnfile +41 -0
  522. package/examples/moltnet-team-chat/teams/field/TEAM.md +3 -0
  523. package/examples/moltnet-team-chat/teams/field/agents/observer/AGENTS.md +5 -0
  524. package/examples/moltnet-team-chat/teams/field/agents/observer/Spawnfile +26 -0
  525. package/examples/moltnet-team-chat/teams/field/agents/representative/AGENTS.md +11 -0
  526. package/examples/moltnet-team-chat/teams/field/agents/representative/Spawnfile +26 -0
  527. package/examples/single-agent/AGENTS.md +3 -0
  528. package/examples/single-agent/HEARTBEAT.md +3 -0
  529. package/examples/single-agent/IDENTITY.md +3 -0
  530. package/examples/single-agent/MEMORY.md +3 -0
  531. package/examples/single-agent/SOUL.md +3 -0
  532. package/examples/single-agent/Spawnfile +41 -0
  533. package/examples/single-agent/skills/web_search/SKILL.md +6 -0
  534. package/moltnet-releases.json +5 -4
  535. package/package.json +36 -9
  536. package/runtimes.yaml +5 -2
  537. package/dist/cli/targetWorldClockCrossProcess.test-helper.d.ts +0 -13
  538. package/dist/cli/targetWorldClockCrossProcess.test-helper.js +0 -109
  539. package/dist/deployment/providerRuntimeBoundaryScanner.test-helper.d.ts +0 -8
  540. package/dist/deployment/providerRuntimeBoundaryScanner.test-helper.js +0 -60
  541. package/dist/deployment/simfileFixtureBoundary.test-helper.d.ts +0 -8
  542. package/dist/deployment/simfileFixtureBoundary.test-helper.js +0 -103
  543. package/dist/ownership/simfileRunOperatorInputs.d.ts +0 -103
  544. package/dist/ownership/simfileRunOperatorInputs.js +0 -139
  545. package/dist/target/cleanupRunDocker.test-helper.d.ts +0 -67
  546. package/dist/target/cleanupRunDocker.test-helper.js +0 -238
@@ -0,0 +1,17 @@
1
+ import type { DockerCommandRunner } from "./dockerRunner.js";
2
+ import type { DistributionReport } from "./types.js";
3
+ export interface ContainerSnapshot {
4
+ readonly id: string;
5
+ readonly name: string;
6
+ readonly running: boolean;
7
+ }
8
+ export interface ExclusiveVolumeReservation {
9
+ release(): Promise<void>;
10
+ }
11
+ export declare const inspectContainerSnapshot: (runDocker: DockerCommandRunner, reference: string) => Promise<ContainerSnapshot | null>;
12
+ export declare const assertExclusiveVolumesAvailable: (report: DistributionReport, deploymentLineage: string, deploymentContainerName: string, runDocker: DockerCommandRunner) => Promise<void>;
13
+ export declare const acquireExclusiveVolumeReservations: (report: DistributionReport, deploymentLineage: string, deploymentContainerName: string, imageReference: string, runDocker: DockerCommandRunner) => Promise<ExclusiveVolumeReservation>;
14
+ export declare const assertCandidateContainerReady: (runDocker: DockerCommandRunner, candidateId: string, expectedName: string) => Promise<void>;
15
+ export declare const assertContainerStopped: (runDocker: DockerCommandRunner, reference: string, expectedId: string) => Promise<void>;
16
+ export declare const restorePreviousContainer: (runDocker: DockerCommandRunner, previous: ContainerSnapshot, backupName: string, deploymentName: string) => Promise<void>;
17
+ export declare const rollbackCandidateContainer: (runDocker: DockerCommandRunner, candidateId: string | undefined, candidateName: string, previous: ContainerSnapshot | null, backupName: string) => Promise<void>;
@@ -0,0 +1,231 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { setTimeout as delay } from "node:timers/promises";
3
+ import { SpawnfileError } from "../shared/index.js";
4
+ import { derivePersistentMountVolumeName } from "./consumeImageSupport.js";
5
+ const dockerId = /^[a-f0-9]{64}$/u;
6
+ const missingContainer = /(?:No such (?:container|object)|container .* not found)/iu;
7
+ const snapshotFormat = "{{json .Id}}\n{{json .Name}}\n{{json .State.Running}}";
8
+ const reservationFormat = "{{json .Id}}\n{{json .Config.Labels}}";
9
+ const reservationVersionLabel = "com.spawnfile.exclusive-volume-reservation";
10
+ const reservationOwnerLabel = "com.spawnfile.exclusive-volume-owner";
11
+ const reservationVolumeLabel = "com.spawnfile.exclusive-volume-digest";
12
+ const parseSnapshot = (raw) => {
13
+ try {
14
+ const [idRaw, nameRaw, runningRaw, ...extra] = raw.toString("utf8").trim().split("\n");
15
+ if (!idRaw || !nameRaw || !runningRaw || extra.length > 0)
16
+ throw new Error("shape");
17
+ const id = JSON.parse(idRaw);
18
+ const name = JSON.parse(nameRaw);
19
+ const running = JSON.parse(runningRaw);
20
+ if (typeof id !== "string" || !dockerId.test(id)
21
+ || typeof name !== "string" || !name.startsWith("/") || name.length < 2
22
+ || typeof running !== "boolean")
23
+ throw new Error("values");
24
+ return { id, name: name.slice(1), running };
25
+ }
26
+ catch {
27
+ throw new SpawnfileError("runtime_error", "Container returned invalid identity state");
28
+ }
29
+ };
30
+ export const inspectContainerSnapshot = async (runDocker, reference) => {
31
+ try {
32
+ return parseSnapshot(await runDocker([
33
+ "container", "inspect", "--format", snapshotFormat, reference
34
+ ]));
35
+ }
36
+ catch (error) {
37
+ if (error instanceof SpawnfileError && error.message === "Container returned invalid identity state")
38
+ throw error;
39
+ const message = error instanceof Error ? error.message : String(error);
40
+ if (missingContainer.test(message))
41
+ return null;
42
+ throw new SpawnfileError("runtime_error", "Unable to determine container identity state");
43
+ }
44
+ };
45
+ export const assertExclusiveVolumesAvailable = async (report, deploymentLineage, deploymentContainerName, runDocker) => {
46
+ for (const mount of report.persistent_mounts.filter((candidate) => candidate.lifecycle === "exclusive-reattach")) {
47
+ const volume = derivePersistentMountVolumeName(deploymentLineage, mount);
48
+ const occupants = (await runDocker([
49
+ "ps", "--filter", `volume=${volume}`, "--format", "{{.Names}}"
50
+ ])).toString("utf8").split("\n").map((name) => name.trim()).filter(Boolean);
51
+ if (occupants.some((name) => name !== deploymentContainerName)) {
52
+ throw new SpawnfileError("runtime_error", `Exclusive persistent mount ${mount.id} is attached to another running deployment; stop that deployment before reattaching the realm`);
53
+ }
54
+ }
55
+ };
56
+ const reservationName = (volumeDigest) => `spawnfile-volume-reservation-${volumeDigest.slice("sha256:".length, 24 + "sha256:".length)}`;
57
+ const inspectReservation = async (runDocker, record) => {
58
+ try {
59
+ const output = (await runDocker([
60
+ "container", "inspect", "--format", reservationFormat, record.id
61
+ ])).toString("utf8").trim().split("\n");
62
+ if (output.length !== 2)
63
+ throw new Error("shape");
64
+ const id = JSON.parse(output[0]);
65
+ const labels = JSON.parse(output[1]);
66
+ if (id !== record.id || !labels || typeof labels !== "object" || Array.isArray(labels))
67
+ throw new Error("identity");
68
+ const values = labels;
69
+ if (values[reservationVersionLabel] !== "v1"
70
+ || values[reservationOwnerLabel] !== record.owner
71
+ || values[reservationVolumeLabel] !== record.volumeDigest)
72
+ throw new Error("authority");
73
+ }
74
+ catch {
75
+ throw new SpawnfileError("runtime_error", "Exclusive persistent mount reservation identity is unavailable");
76
+ }
77
+ };
78
+ const releaseReservations = async (runDocker, records) => {
79
+ let failed = false;
80
+ for (const record of [...records].reverse()) {
81
+ try {
82
+ await inspectReservation(runDocker, record);
83
+ await runDocker(["container", "rm", record.id]);
84
+ }
85
+ catch {
86
+ failed = true;
87
+ }
88
+ }
89
+ if (failed)
90
+ throw new SpawnfileError("runtime_error", "Unable to release exclusive persistent mount reservation");
91
+ };
92
+ export const acquireExclusiveVolumeReservations = async (report, deploymentLineage, deploymentContainerName, imageReference, runDocker) => {
93
+ const volumes = report.persistent_mounts
94
+ .filter((mount) => mount.lifecycle === "exclusive-reattach")
95
+ .map((mount) => derivePersistentMountVolumeName(deploymentLineage, mount))
96
+ .sort();
97
+ const records = [];
98
+ try {
99
+ for (const volume of volumes) {
100
+ const volumeDigest = `sha256:${createHash("sha256").update(volume).digest("hex")}`;
101
+ const owner = randomUUID();
102
+ const name = reservationName(volumeDigest);
103
+ let id;
104
+ try {
105
+ id = (await runDocker([
106
+ "container", "create", "--name", name,
107
+ "--label", `${reservationVersionLabel}=v1`,
108
+ "--label", `${reservationOwnerLabel}=${owner}`,
109
+ "--label", `${reservationVolumeLabel}=${volumeDigest}`,
110
+ imageReference
111
+ ])).toString("utf8").trim();
112
+ }
113
+ catch {
114
+ throw new SpawnfileError("runtime_error", "Exclusive persistent mount reservation is already held");
115
+ }
116
+ if (!dockerId.test(id))
117
+ throw new SpawnfileError("runtime_error", "Exclusive persistent mount reservation returned invalid identity");
118
+ const record = { id, name, owner, volumeDigest };
119
+ records.push(record);
120
+ await inspectReservation(runDocker, record);
121
+ }
122
+ await assertExclusiveVolumesAvailable(report, deploymentLineage, deploymentContainerName, runDocker);
123
+ }
124
+ catch (error) {
125
+ if (records.length > 0)
126
+ await releaseReservations(runDocker, records);
127
+ throw error;
128
+ }
129
+ let released = false;
130
+ return {
131
+ release: async () => {
132
+ if (released)
133
+ return;
134
+ await releaseReservations(runDocker, records);
135
+ released = true;
136
+ }
137
+ };
138
+ };
139
+ const parseCandidateState = (raw) => {
140
+ try {
141
+ const [idRaw, nameRaw, stateRaw, ...extra] = raw.toString("utf8").trim().split("\n");
142
+ if (!idRaw || !nameRaw || !stateRaw || extra.length > 0)
143
+ throw new Error("shape");
144
+ const id = JSON.parse(idRaw);
145
+ const name = JSON.parse(nameRaw);
146
+ const state = JSON.parse(stateRaw);
147
+ if (typeof id !== "string" || !dockerId.test(id)
148
+ || typeof name !== "string" || !name.startsWith("/") || name.length < 2
149
+ || !state || typeof state !== "object" || typeof state.Running !== "boolean")
150
+ throw new Error("values");
151
+ return { snapshot: { id, name: name.slice(1), running: state.Running }, state };
152
+ }
153
+ catch {
154
+ throw new SpawnfileError("runtime_error", "Candidate container returned invalid readiness state");
155
+ }
156
+ };
157
+ const candidateReadinessTimeoutMs = 120_000;
158
+ const candidateReadinessPollMs = 1_000;
159
+ export const assertCandidateContainerReady = async (runDocker, candidateId, expectedName) => {
160
+ if (!dockerId.test(candidateId))
161
+ throw new SpawnfileError("runtime_error", "Candidate container returned invalid identity");
162
+ const deadline = Date.now() + candidateReadinessTimeoutMs;
163
+ for (;;) {
164
+ const { snapshot, state } = parseCandidateState(await runDocker([
165
+ "container", "inspect", "--format", "{{json .Id}}\n{{json .Name}}\n{{json .State}}", candidateId
166
+ ]));
167
+ if (snapshot.id !== candidateId || snapshot.name !== expectedName) {
168
+ throw new SpawnfileError("runtime_error", "Candidate container identity did not match detached run");
169
+ }
170
+ const health = state.Health?.Status;
171
+ if (state.Running === true && (health === undefined || health === "healthy"))
172
+ return;
173
+ // Docker may exhaust its health retries while a live process is still
174
+ // initializing. Honor our full readiness budget; only healthy can pass.
175
+ if (state.Running !== true || (health !== "starting" && health !== "unhealthy"))
176
+ break;
177
+ const remainingMs = deadline - Date.now();
178
+ if (remainingMs <= 0)
179
+ break;
180
+ await delay(Math.min(candidateReadinessPollMs, remainingMs));
181
+ }
182
+ throw new SpawnfileError("runtime_error", "Candidate container did not become ready");
183
+ };
184
+ export const assertContainerStopped = async (runDocker, reference, expectedId) => {
185
+ const observed = await inspectContainerSnapshot(runDocker, reference);
186
+ if (observed === null || observed.id !== expectedId || observed.running) {
187
+ throw new SpawnfileError("runtime_error", "Prior container did not reach a verified stopped state");
188
+ }
189
+ };
190
+ export const restorePreviousContainer = async (runDocker, previous, backupName, deploymentName) => {
191
+ const backup = await inspectContainerSnapshot(runDocker, backupName);
192
+ if (backup === null || backup.id !== previous.id) {
193
+ throw new SpawnfileError("runtime_error", "Prior container rollback identity is unavailable");
194
+ }
195
+ await runDocker(["rename", backupName, deploymentName]);
196
+ if (previous.running !== backup.running) {
197
+ await runDocker([previous.running ? "start" : "stop", previous.id]);
198
+ }
199
+ const restored = await inspectContainerSnapshot(runDocker, previous.id);
200
+ if (restored === null || restored.id !== previous.id || restored.name !== deploymentName
201
+ || restored.running !== previous.running) {
202
+ throw new SpawnfileError("runtime_error", "Prior container rollback state could not be verified");
203
+ }
204
+ };
205
+ export const rollbackCandidateContainer = async (runDocker, candidateId, candidateName, previous, backupName) => {
206
+ const failed = [];
207
+ if (candidateId !== undefined) {
208
+ try {
209
+ const candidate = await inspectContainerSnapshot(runDocker, candidateId);
210
+ if (candidate !== null) {
211
+ if (candidate.id !== candidateId || candidate.name !== candidateName)
212
+ throw new Error("identity");
213
+ await runDocker(["rm", "-f", candidateId]);
214
+ }
215
+ }
216
+ catch {
217
+ failed.push("candidate cleanup");
218
+ }
219
+ }
220
+ if (previous !== null) {
221
+ try {
222
+ await restorePreviousContainer(runDocker, previous, backupName, candidateName);
223
+ }
224
+ catch {
225
+ failed.push("prior restore");
226
+ }
227
+ }
228
+ if (failed.length > 0) {
229
+ throw new SpawnfileError("runtime_error", `Candidate deployment failed and rollback was incomplete (${failed.join(", ")})`);
230
+ }
231
+ };
@@ -1,9 +1,21 @@
1
1
  import type { ParsedImageReference } from "./imageRef.js";
2
2
  import type { DistributionReport } from "./types.js";
3
+ import type { DistributionPersistentMount } from "./types.js";
3
4
  /** Derives a kebab-case deployment name from the image repository component. */
4
5
  export declare const deriveDeploymentName: (ref: ParsedImageReference) => string;
5
6
  /** Per-deployment volume name so two deployments never share a store. */
6
7
  export declare const deriveVolumeName: (deploymentName: string, mountId: string) => string;
8
+ /**
9
+ * An author-declared name wins over any derivation, in image mode exactly as
10
+ * in project mode. Without this, an operator who pre-created
11
+ * `clank-newsroom-store` and deployed the published image silently got
12
+ * `spawnfile-exclusive-<id>-<hash>` — a brand-new empty volume — while the
13
+ * spec promised the declared name verbatim.
14
+ *
15
+ * Only a DECLARED name travels in the report; an undeclared mount is still
16
+ * named per deployment so two deployments of one image never share state.
17
+ */
18
+ export declare const derivePersistentMountVolumeName: (deploymentName: string, mount: DistributionPersistentMount) => string;
7
19
  export interface ResolveImageEnvironmentInput {
8
20
  authValues: Record<string, string>;
9
21
  envFileEnv?: Record<string, string>;
@@ -1,4 +1,5 @@
1
1
  import { randomBytes } from "node:crypto";
2
+ import { createExclusiveReattachVolumeName } from "../shared/index.js";
2
3
  const GENERATED_RUNTIME_SECRET_NAMES = new Set([
3
4
  "OPENCLAW_GATEWAY_TOKEN",
4
5
  "OPENCLAW_HOOKS_TOKEN"
@@ -17,6 +18,20 @@ export const deriveVolumeName = (deploymentName, mountId) => {
17
18
  const safeMount = mountId.replace(/[^A-Za-z0-9_.-]+/g, "-");
18
19
  return `spawnfile_${deploymentName}_${safeMount}`;
19
20
  };
21
+ /**
22
+ * An author-declared name wins over any derivation, in image mode exactly as
23
+ * in project mode. Without this, an operator who pre-created
24
+ * `clank-newsroom-store` and deployed the published image silently got
25
+ * `spawnfile-exclusive-<id>-<hash>` — a brand-new empty volume — while the
26
+ * spec promised the declared name verbatim.
27
+ *
28
+ * Only a DECLARED name travels in the report; an undeclared mount is still
29
+ * named per deployment so two deployments of one image never share state.
30
+ */
31
+ export const derivePersistentMountVolumeName = (deploymentName, mount) => mount.declared_volume_name?.trim()
32
+ || (mount.lifecycle === "exclusive-reattach"
33
+ ? createExclusiveReattachVolumeName(deploymentName, mount.id)
34
+ : deriveVolumeName(deploymentName, mount.id));
20
35
  /**
21
36
  * Builds the container environment for a sourceless deployment: auth-profile
22
37
  * and env-file values, process-env overrides for declared secrets, and
@@ -27,9 +27,11 @@ export declare const distributionReportSchema: z.ZodObject<{
27
27
  }, z.core.$strict>>;
28
28
  }, z.core.$strict>;
29
29
  persistent_mounts: z.ZodArray<z.ZodObject<{
30
+ declared_volume_name: z.ZodOptional<z.ZodString>;
30
31
  durability: z.ZodLiteral<"persistent">;
31
32
  id: z.ZodString;
32
33
  kind: z.ZodLiteral<"volume">;
34
+ lifecycle: z.ZodOptional<z.ZodLiteral<"exclusive-reattach">>;
33
35
  target: z.ZodString;
34
36
  }, z.core.$strict>>;
35
37
  port_mappings: z.ZodArray<z.ZodObject<{
@@ -39,7 +41,7 @@ export declare const distributionReportSchema: z.ZodObject<{
39
41
  ports: z.ZodArray<z.ZodNumber>;
40
42
  resources: z.ZodArray<z.ZodObject<{
41
43
  id: z.ZodString;
42
- kind: z.ZodUnion<readonly [z.ZodLiteral<"git">, z.ZodLiteral<"volume">]>;
44
+ kind: z.ZodUnion<readonly [z.ZodLiteral<"bundle">, z.ZodLiteral<"git">, z.ZodLiteral<"volume">]>;
43
45
  link_path: z.ZodString;
44
46
  mode: z.ZodUnion<readonly [z.ZodLiteral<"mutable">, z.ZodLiteral<"readonly">]>;
45
47
  mount: z.ZodString;
@@ -47,6 +49,14 @@ export declare const distributionReportSchema: z.ZodObject<{
47
49
  }, z.core.$strict>>;
48
50
  runtime_instances: z.ZodArray<z.ZodObject<{
49
51
  config_path: z.ZodString;
52
+ engine_by_node_id: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodEnum<{
53
+ codex: "codex";
54
+ grok: "grok";
55
+ agy: "agy";
56
+ claude: "claude";
57
+ pi: "pi";
58
+ scripted: "scripted";
59
+ }>>>;
50
60
  home_path: z.ZodNullable<z.ZodString>;
51
61
  id: z.ZodString;
52
62
  internal_port: z.ZodNullable<z.ZodNumber>;
@@ -1,6 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import { SpawnfileError } from "../shared/index.js";
3
- import { DISTRIBUTION_REPORT_VERSION, WORLD_BINDINGS_IMAGE_PATH } from "./types.js";
3
+ import { DISTRIBUTION_ENGINE_KINDS, DISTRIBUTION_REPORT_VERSION, WORLD_BINDINGS_IMAGE_PATH } from "./types.js";
4
4
  const secretEntrySchema = z.object({
5
5
  generated: z.boolean(),
6
6
  name: z.string().min(1),
@@ -32,6 +32,7 @@ const instanceIdSchema = z
32
32
  });
33
33
  const runtimeInstanceSchema = z.object({
34
34
  config_path: containerPathSchema,
35
+ engine_by_node_id: z.record(z.string().min(1), z.enum(DISTRIBUTION_ENGINE_KINDS)).optional(),
35
36
  home_path: containerPathSchema.nullable(),
36
37
  id: instanceIdSchema,
37
38
  internal_port: portSchema.nullable(),
@@ -69,11 +70,23 @@ export const distributionReportSchema = z.object({
69
70
  }).strict())
70
71
  }).strict(),
71
72
  persistent_mounts: z.array(z.object({
73
+ // Used verbatim as a docker volume name by `consumeImage`, so it is
74
+ // constrained to docker's own volume-name charset here (defence in depth,
75
+ // exactly as `id` is).
76
+ declared_volume_name: z
77
+ .string()
78
+ .min(1)
79
+ .max(255)
80
+ .refine((value) => /^[A-Za-z0-9][A-Za-z0-9_.-]*$/.test(value) && !value.includes(".."), {
81
+ message: "must be a docker volume name (letters, digits, '_', '.', '-'; no '/', ':', whitespace, or '..')"
82
+ })
83
+ .optional(),
72
84
  durability: z.literal("persistent"),
73
85
  // Sanitized by deriveVolumeName before use, but constrained here too so the
74
86
  // schema alone keeps the volume-name source clean (defense in depth).
75
87
  id: instanceIdSchema,
76
88
  kind: z.literal("volume"),
89
+ lifecycle: z.literal("exclusive-reattach").optional(),
77
90
  target: containerPathSchema
78
91
  }).strict()),
79
92
  port_mappings: z.array(z.object({
@@ -83,7 +96,7 @@ export const distributionReportSchema = z.object({
83
96
  ports: z.array(portSchema),
84
97
  resources: z.array(z.object({
85
98
  id: z.string().min(1),
86
- kind: z.union([z.literal("git"), z.literal("volume")]),
99
+ kind: z.union([z.literal("bundle"), z.literal("git"), z.literal("volume")]),
87
100
  link_path: z.string(),
88
101
  mode: z.union([z.literal("mutable"), z.literal("readonly")]),
89
102
  mount: z.string(),
@@ -1,5 +1,10 @@
1
1
  export interface DockerCommandRunner {
2
2
  /** Runs docker with args; resolves stdout as a Buffer. Rejects on non-zero exit. */
3
- (args: string[]): Promise<Buffer>;
3
+ (args: string[], options?: DockerCommandOptions): Promise<Buffer>;
4
+ }
5
+ export interface DockerCommandOptions {
6
+ captureStderr?: boolean;
7
+ maxOutputBytes?: number;
8
+ timeoutMs?: number;
4
9
  }
5
10
  export declare const createConsumerDockerRunner: (dockerCommand: string, baseArgs: string[]) => DockerCommandRunner;
@@ -1,6 +1,6 @@
1
1
  import { spawn } from "node:child_process";
2
2
  import { SpawnfileError } from "../shared/index.js";
3
- export const createConsumerDockerRunner = (dockerCommand, baseArgs) => async (args) => new Promise((resolve, reject) => {
3
+ export const createConsumerDockerRunner = (dockerCommand, baseArgs) => async (args, options = {}) => new Promise((resolve, reject) => {
4
4
  const finalArgs = [...baseArgs, ...args];
5
5
  const child = spawn(dockerCommand, finalArgs, {
6
6
  env: { ...process.env },
@@ -8,10 +8,37 @@ export const createConsumerDockerRunner = (dockerCommand, baseArgs) => async (ar
8
8
  });
9
9
  const stdout = [];
10
10
  const stderr = [];
11
- child.stdout.on("data", (chunk) => stdout.push(chunk));
12
- child.stderr.on("data", (chunk) => stderr.push(String(chunk)));
13
- child.on("error", reject);
11
+ let bytes = 0;
12
+ let stopped = false;
13
+ const stop = (reason) => {
14
+ stopped = true;
15
+ child.kill("SIGKILL");
16
+ reject(new SpawnfileError("runtime_error", reason));
17
+ };
18
+ const timer = options.timeoutMs === undefined ? undefined
19
+ : setTimeout(() => stop("Docker diagnostic command timed out"), options.timeoutMs);
20
+ const clearTimer = () => { if (timer)
21
+ clearTimeout(timer); };
22
+ const collect = (chunk, isStderr) => {
23
+ if (stopped)
24
+ return;
25
+ bytes += chunk.length;
26
+ if (options.maxOutputBytes !== undefined && bytes > options.maxOutputBytes) {
27
+ stop("Docker diagnostic output exceeded its byte limit");
28
+ return;
29
+ }
30
+ if (isStderr)
31
+ stderr.push(chunk.toString("utf8"));
32
+ if (!isStderr || options.captureStderr)
33
+ stdout.push(chunk);
34
+ };
35
+ child.stdout.on("data", (chunk) => collect(chunk, false));
36
+ child.stderr.on("data", (chunk) => collect(chunk, true));
37
+ child.on("error", (error) => { clearTimer(); reject(error); });
14
38
  child.on("close", (code) => {
39
+ clearTimer();
40
+ if (stopped)
41
+ return;
15
42
  if (code === 0) {
16
43
  resolve(Buffer.concat(stdout));
17
44
  return;
@@ -1,14 +1,22 @@
1
1
  import type { ResolvedAuthProfile } from "../auth/index.js";
2
2
  import type { DistributionReport } from "./types.js";
3
3
  export interface ImageRuntimeAuthInput {
4
- authProfile: ResolvedAuthProfile;
4
+ authProfile: ResolvedAuthProfile | null;
5
+ /**
6
+ * The uid the deployed Daimon image reads its credential leaves as. Defaults
7
+ * to the compiled image's organization uid; only override it against an image
8
+ * known to run under a different identity.
9
+ */
10
+ daimonContainerCredentialUid?: number;
5
11
  report: DistributionReport;
12
+ sourceEnvironment?: Record<string, string | undefined>;
6
13
  tempRoot: string;
7
14
  }
8
15
  export interface ImageRuntimeAuthResult {
9
16
  coveredModelSecrets: Set<string>;
10
17
  mountArgs: string[];
11
18
  }
19
+ export declare const prepareDaimonImageAuthMounts: (instance: DistributionReport["runtime_instances"][number], environment: Record<string, string | undefined>, authProfile: ResolvedAuthProfile | null, containerCredentialUid?: number) => Promise<string[]>;
12
20
  /**
13
21
  * Builds the credential mounts for a sourceless image deployment that uses
14
22
  * import-based model auth. The OAuth-mode config is already baked into the
@@ -2,8 +2,71 @@ import path from "node:path";
2
2
  import { loadImportedClaudeCodeCredential, loadImportedCodexCredential } from "../auth/index.js";
3
3
  import { fileExists } from "../filesystem/index.js";
4
4
  import { getRuntimeAdapter } from "../runtime/index.js";
5
+ import { DAIMON_AGY_SUBSCRIPTION_REALM, DAIMON_ENGINE_CREDENTIALS, DAIMON_GROK_SUBSCRIPTION_REALM } from "../runtime/daimon/contractManifest.js";
6
+ import { assertDaimonCredentialContainerOwner, assertSafeDaimonSourceFile, DAIMON_AGY_UNLOCK_SOURCE_ENV, DAIMON_CREDENTIAL_CONTAINER_UID, daimonSourcePathForEngine } from "../runtime/daimon/runAuth.js";
5
7
  import { SpawnfileError } from "../shared/index.js";
6
8
  const importMountTargetName = (kind) => kind === "claude-code" ? ".claude" : ".codex";
9
+ const daimonNodeSlug = (nodeId) => nodeId.replace(/^agent:/u, "").toLowerCase()
10
+ .replace(/[^a-z0-9]+/gu, "-").replace(/^-+|-+$/gu, "");
11
+ const daimonInstanceRoot = (instance) => {
12
+ const root = path.posix.join("/var/lib/spawnfile/instances/daimon", instance.id);
13
+ if (instance.config_path !== path.posix.join(root, "daimon/daimon-organization-runtime.json")
14
+ || instance.workspace_path !== path.posix.join(root, "workspace")) {
15
+ throw new SpawnfileError("validation_error", "Daimon image runtime paths are not canonical");
16
+ }
17
+ return root;
18
+ };
19
+ export const prepareDaimonImageAuthMounts = async (instance, environment, authProfile, containerCredentialUid = DAIMON_CREDENTIAL_CONTAINER_UID) => {
20
+ const engines = Object.entries(instance.engine_by_node_id ?? {}).sort(([left], [right]) => left.localeCompare(right));
21
+ if (engines.length === 0) {
22
+ throw new SpawnfileError("validation_error", "Daimon image report is missing its engine map");
23
+ }
24
+ const engineNodeIds = engines.map(([nodeId]) => nodeId);
25
+ if (JSON.stringify(engineNodeIds) !== JSON.stringify([...instance.node_ids].sort())) {
26
+ throw new SpawnfileError("validation_error", "Daimon image engine map does not match its declared agents");
27
+ }
28
+ if (engines.some(([, engine]) => engine !== "agy" && engine !== "codex" && engine !== "grok")) {
29
+ throw new SpawnfileError("validation_error", "Daimon image report declares an unsupported engine");
30
+ }
31
+ const root = daimonInstanceRoot(instance);
32
+ const mounts = [];
33
+ const slugs = new Map();
34
+ for (const [nodeId] of engines) {
35
+ const slug = daimonNodeSlug(nodeId);
36
+ if (!slug || slugs.has(slug))
37
+ throw new SpawnfileError("validation_error", "Daimon image report has an unsafe agent id");
38
+ slugs.set(slug, nodeId);
39
+ }
40
+ const codexSource = engines.some(([, engine]) => engine === "codex")
41
+ ? daimonSourcePathForEngine("codex", environment, authProfile) : null;
42
+ if (codexSource) {
43
+ const ownerUid = await assertSafeDaimonSourceFile(codexSource, "codex", 64 * 1024, "codex");
44
+ assertDaimonCredentialContainerOwner(ownerUid, "codex", containerCredentialUid);
45
+ }
46
+ for (const [nodeId, engine] of engines) {
47
+ if (engine !== "codex")
48
+ continue;
49
+ const slug = daimonNodeSlug(nodeId);
50
+ const target = path.posix.join(root, "runtime-homes", slug, DAIMON_ENGINE_CREDENTIALS.codex.sourceRelativePath);
51
+ mounts.push("-v", `${codexSource}:${target}:ro`);
52
+ }
53
+ // The Grok bootstrap leaf is deliberately exempt from the container-owner
54
+ // assertion; see the matching note in runAuth.ts.
55
+ if (engines.some(([, engine]) => engine === "grok")) {
56
+ const source = daimonSourcePathForEngine("grok", environment);
57
+ await assertSafeDaimonSourceFile(source, "grok", DAIMON_GROK_SUBSCRIPTION_REALM.maxCredentialBytes, "grok");
58
+ mounts.push("-v", `${source}:${DAIMON_GROK_SUBSCRIPTION_REALM.bootstrapMountPath}:ro`);
59
+ }
60
+ if (engines.some(([, engine]) => engine === "agy")) {
61
+ const source = environment[DAIMON_AGY_UNLOCK_SOURCE_ENV]?.trim();
62
+ if (!source)
63
+ throw new SpawnfileError("validation_error", "Daimon runtime auth is missing the operator-authorized AGY realm unlock artifact");
64
+ const ownerUid = await assertSafeDaimonSourceFile(source, "AGY realm unlock", DAIMON_AGY_SUBSCRIPTION_REALM.maxUnlockBytes);
65
+ assertDaimonCredentialContainerOwner(ownerUid, "AGY realm unlock", containerCredentialUid);
66
+ mounts.push("-v", `${source}:${DAIMON_AGY_SUBSCRIPTION_REALM.unlockMountPath}:ro`);
67
+ }
68
+ return mounts;
69
+ };
7
70
  /**
8
71
  * Builds the credential mounts for a sourceless image deployment that uses
9
72
  * import-based model auth. The OAuth-mode config is already baked into the
@@ -19,6 +82,12 @@ export const prepareImageRuntimeAuthMounts = async (input) => {
19
82
  if (instance.home_path) {
20
83
  runtimeHomes.add(instance.home_path);
21
84
  }
85
+ if (instance.runtime === "daimon") {
86
+ mountArgs.push(...await prepareDaimonImageAuthMounts(instance, input.sourceEnvironment ?? process.env, input.authProfile, input.daimonContainerCredentialUid ?? DAIMON_CREDENTIAL_CONTAINER_UID));
87
+ continue;
88
+ }
89
+ if (!input.authProfile)
90
+ continue;
22
91
  const adapter = getRuntimeAdapter(instance.runtime);
23
92
  if (!adapter.prepareRuntimeAuth) {
24
93
  continue;
@@ -45,7 +114,7 @@ export const prepareImageRuntimeAuthMounts = async (input) => {
45
114
  // Mount the raw credential import directories into each runtime home so the
46
115
  // runtime's OAuth client can read them (e.g. ~/.claude, ~/.codex).
47
116
  for (const kind of ["claude-code", "codex"]) {
48
- const entry = input.authProfile.imports[kind];
117
+ const entry = input.authProfile?.imports[kind];
49
118
  if (!entry) {
50
119
  continue;
51
120
  }
@@ -6,7 +6,7 @@ export type { DockerCommandRunner, ExtractImageOptions, ImageInspection } from "
6
6
  export { parseDistributionReport } from "./distributionReportSchema.js";
7
7
  export { consumeImageUp } from "./consumeImage.js";
8
8
  export type { ConsumeImageUpOptions, ConsumeImageUpResult } from "./consumeImage.js";
9
- export { deriveDeploymentName, deriveVolumeName, renderEnvFileContent, resolveImageEnvironment } from "./consumeImageSupport.js";
9
+ export { deriveDeploymentName, derivePersistentMountVolumeName, deriveVolumeName, renderEnvFileContent, resolveImageEnvironment } from "./consumeImageSupport.js";
10
10
  export { createConsumerDockerRunner } from "./dockerRunner.js";
11
11
  export { prepareImageRuntimeAuthMounts } from "./imageRuntimeAuth.js";
12
12
  export { runImagePreflight } from "./preflight.js";
@@ -3,7 +3,7 @@ export { createDistributionFingerprint } from "./fingerprint.js";
3
3
  export { extractImageReport, resolveDockerBaseArgs } from "./extractImage.js";
4
4
  export { parseDistributionReport } from "./distributionReportSchema.js";
5
5
  export { consumeImageUp } from "./consumeImage.js";
6
- export { deriveDeploymentName, deriveVolumeName, renderEnvFileContent, resolveImageEnvironment } from "./consumeImageSupport.js";
6
+ export { deriveDeploymentName, derivePersistentMountVolumeName, deriveVolumeName, renderEnvFileContent, resolveImageEnvironment } from "./consumeImageSupport.js";
7
7
  export { createConsumerDockerRunner } from "./dockerRunner.js";
8
8
  export { prepareImageRuntimeAuthMounts } from "./imageRuntimeAuth.js";
9
9
  export { runImagePreflight } from "./preflight.js";
@@ -1,5 +1,9 @@
1
1
  import { SpawnfileError } from "../shared/index.js";
2
2
  const ENV_BASED_AUTH_METHODS = new Set(["api_key", "none"]);
3
+ // Satisfied by the runtime's own credential slot (the Daimon Grok broker's
4
+ // bootstrap realm, checked by `imageRuntimeAuth.ts`), never by an env value
5
+ // or a host CLI import.
6
+ const RUNTIME_OWNED_AUTH_METHODS = new Set(["grok"]);
3
7
  // Import-based auth methods are satisfiable sourceless when the consumer has the
4
8
  // matching local credential import (their logged-in Claude Code / Codex session).
5
9
  const IMPORT_AUTH_METHOD_KINDS = {
@@ -10,7 +14,7 @@ const collectUnsupportedAuth = (report, availableImports) => {
10
14
  const unsupported = [];
11
15
  for (const instance of report.runtime_instances) {
12
16
  for (const [provider, method] of Object.entries(instance.model_auth_methods)) {
13
- if (ENV_BASED_AUTH_METHODS.has(method)) {
17
+ if (ENV_BASED_AUTH_METHODS.has(method) || RUNTIME_OWNED_AUTH_METHODS.has(method)) {
14
18
  continue;
15
19
  }
16
20
  const importKind = IMPORT_AUTH_METHOD_KINDS[method];
@@ -22,14 +22,24 @@ export interface DistributionOrganizationSummary {
22
22
  teams: DistributionTeamSummary[];
23
23
  }
24
24
  export interface DistributionPersistentMount {
25
+ /**
26
+ * The author's own volume name for this mount, when the manifest declared
27
+ * one. The report never carries a compiler-DERIVED name — that encodes the
28
+ * creator's plan root and deployment lineage and stays private to that host
29
+ * — but a declared name belongs to the published declaration and a consumer
30
+ * honours it verbatim, so an operator who pre-created that volume attaches
31
+ * it instead of silently getting an empty one.
32
+ */
33
+ declared_volume_name?: string;
25
34
  durability: "persistent";
26
35
  id: string;
27
36
  kind: "volume";
37
+ lifecycle?: "exclusive-reattach";
28
38
  target: string;
29
39
  }
30
40
  export interface DistributionWorkspaceResource {
31
41
  id: string;
32
- kind: "git" | "volume";
42
+ kind: "bundle" | "git" | "volume";
33
43
  link_path: string;
34
44
  mode: "mutable" | "readonly";
35
45
  mount: string;
@@ -37,6 +47,7 @@ export interface DistributionWorkspaceResource {
37
47
  }
38
48
  export interface DistributionRuntimeInstance {
39
49
  config_path: string;
50
+ engine_by_node_id?: Record<string, string>;
40
51
  home_path: string | null;
41
52
  id: string;
42
53
  internal_port: number | null;
@@ -47,6 +58,8 @@ export interface DistributionRuntimeInstance {
47
58
  runtime: string;
48
59
  workspace_path: string;
49
60
  }
61
+ export declare const DISTRIBUTION_ENGINE_KINDS: readonly ["agy", "claude", "codex", "grok", "pi", "scripted"];
62
+ export type DistributionEngineKind = typeof DISTRIBUTION_ENGINE_KINDS[number];
50
63
  export interface DistributionMoltnetNetwork {
51
64
  binding: "env";
52
65
  id: string;
@@ -1,3 +1,6 @@
1
+ export const DISTRIBUTION_ENGINE_KINDS = [
2
+ "agy", "claude", "codex", "grok", "pi", "scripted"
3
+ ];
1
4
  export const DISTRIBUTION_REPORT_VERSION = "spawnfile.distribution-report.v1";
2
5
  export const DISTRIBUTION_REPORT_IMAGE_PATH = "/spawnfile/spawnfile-report.json";
3
6
  export const DISTRIBUTION_REPORT_OUTPUT_FILE = "distribution-report.json";