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
@@ -1,18 +1,17 @@
1
1
  import path from "node:path";
2
- import { createHash } from "node:crypto";
3
2
  import { rm } from "node:fs/promises";
4
- import { createOrganizationReadinessPending, createDockerOrganizationHandoffSession, createDockerDeploymentRecord, initializeOrganizationHandoffAuthorityStore, parseCanonicalSha256Digest, probeDockerOrganizationReadiness, readDeploymentRecord, resolveDockerDeploymentTarget, resolveDeploymentRecordPath, writeDeploymentRecord, writeDockerDeploymentRecordForRun } from "../deployment/index.js";
5
- import { createCanonicalSelectedTargetReceiptBytes, parseOpaqueTargetHandle, parseRunId, parseSelectedTargetReceipt, selectTarget } from "../target/index.js";
3
+ import { createOrganizationReadinessPending, createDockerDeploymentRecord, probeDockerOrganizationReadiness, readDeploymentRecord, resolveDockerDeploymentTarget, resolveDeploymentRecordPath, writeDeploymentRecord, writeDockerDeploymentRecordForRun, } from "../deployment/index.js";
6
4
  import { buildProject } from "./buildProject.js";
7
5
  import { createDockerRunInvocation, resolveDetachedDeploymentOptions, runDockerContainer } from "./runProject.js";
8
6
  import { executeDockerRunWithSupportCleanup } from "./runProjectLifecycle.js";
9
7
  import { requireAuthProfile } from "../auth/index.js";
10
8
  import { DEFAULT_OUTPUT_DIRECTORY, SpawnfileError } from "../shared/index.js";
9
+ import { assertNoDeclaredVolumeNames, resolveDeploymentLineage } from "./deploymentLineage.js";
11
10
  import { ensureNoopolisRunId, resolveNoopolisRunId } from "../runtime/index.js";
12
11
  import { fileExists } from "../filesystem/index.js";
13
12
  import { resolveHostCliCredential } from "./runProjectAuth.js";
14
- const handoffInputError = () => new SpawnfileError("validation_error", "Organization handoff requires authorized run id, selected target receipt, descriptor digest, selected target receipt digest, network attachment handle, and world bindings");
15
- const handoffRecoveryIncompleteError = () => new SpawnfileError("runtime_error", "Organization handoff recovery is incomplete; redeploy with explicit authorization");
13
+ import { defaultDockerTargetExecFile } from "../target/dockerTargetExecFile.js";
14
+ import { compileOrganizationHandoff, executeOrganizationHandoff, organizationHandoffInputError, resolveRequestedOrganizationHandoff, verifyRequestedOrganizationHandoffTarget, } from "./upProjectHandoff.js";
16
15
  const stableRecord = (record) => {
17
16
  const { created_at: _createdAt, export_index: _exportIndex, organization_ready: _organizationReady, ...stable } = record;
18
17
  return stable;
@@ -26,85 +25,17 @@ const canonicalJson = (value) => {
26
25
  }
27
26
  const serialized = JSON.stringify(value);
28
27
  if (serialized === undefined)
29
- throw handoffInputError();
28
+ throw organizationHandoffInputError();
30
29
  return serialized;
31
30
  };
32
- const resolveRequestedHandoff = (options) => {
33
- const values = [
34
- options.descriptorDigest,
35
- options.organizationHandoffRunId,
36
- options.selectedTargetReceiptDigest,
37
- options.selectedTargetReceipt,
38
- options.networkAttachmentHandle,
39
- options.worldBindingsPath
40
- ];
41
- if (values.every((value) => value === undefined))
42
- return null;
43
- if (values.some((value) => value === undefined) || !options.detach)
44
- throw handoffInputError();
45
- try {
46
- const selectedTarget = parseSelectedTargetReceipt(options.selectedTargetReceipt);
47
- const selectedDigest = parseCanonicalSha256Digest(options.selectedTargetReceiptDigest, "selected_target_receipt_digest");
48
- const computedDigest = `sha256:${createHash("sha256").update(createCanonicalSelectedTargetReceiptBytes(selectedTarget), "utf8").digest("hex")}`;
49
- if (selectedDigest !== computedDigest)
50
- throw new Error("selected receipt digest mismatch");
51
- return {
52
- descriptorDigest: parseCanonicalSha256Digest(options.descriptorDigest, "descriptor_digest"),
53
- runId: parseRunId(options.organizationHandoffRunId),
54
- networkAttachmentHandle: parseOpaqueTargetHandle(options.networkAttachmentHandle),
55
- selectedTarget,
56
- selectedTargetReceiptDigest: selectedDigest
57
- };
58
- }
59
- catch {
60
- throw handoffInputError();
61
- }
62
- };
63
- const verifyRequestedHandoffTarget = async (requested, resolved, options) => {
64
- if (!requested)
65
- return;
66
- if (typeof resolved.dockerContext !== "string" || resolved.dockerContext.length === 0
67
- || resolved.dockerHost != null || process.env.DOCKER_HOST != null)
68
- throw handoffInputError();
69
- try {
70
- const actual = await selectTarget({
71
- context: resolved.dockerContext,
72
- dockerCommand: options.dockerCommand,
73
- execFile: options.targetExecFile
74
- });
75
- if (createCanonicalSelectedTargetReceiptBytes(actual)
76
- !== createCanonicalSelectedTargetReceiptBytes(requested.selectedTarget))
77
- throw new Error("target mismatch");
78
- }
79
- catch {
80
- throw handoffInputError();
81
- }
82
- };
83
- const resolveCompiledHandoff = (requested, buildResult) => {
84
- if (!requested)
85
- return undefined;
86
- try {
87
- const bindingDigest = buildResult.organizationReadinessEvidence.worldBindings?.digest;
88
- if (!bindingDigest)
89
- throw new Error("missing compiled binding evidence");
90
- const bindingDigestParsed = parseCanonicalSha256Digest(bindingDigest, "binding_digest");
91
- return { authority: { ...requested, bindingDigest: bindingDigestParsed }, organizationHandoff: {
92
- bindingDigest: bindingDigestParsed, networkAttachmentHandle: requested.networkAttachmentHandle,
93
- selectedTargetReceiptDigest: requested.selectedTargetReceiptDigest
94
- } };
95
- }
96
- catch {
97
- throw handoffInputError();
98
- }
99
- };
100
31
  export const upProject = async (inputPath, options = {}) => {
101
32
  // Parse caller authority before any target or build work. Target identity is
102
33
  // verified below from the resolved detached options, including exact record reuse.
103
- const requestedHandoff = resolveRequestedHandoff(options);
34
+ const requestedHandoff = resolveRequestedOrganizationHandoff(options);
104
35
  // Handoff reservation identity must survive a process crash. Unlike an
105
36
  // ordinary deployment run, it may never silently mint a fresh run id.
106
37
  if (requestedHandoff && resolveNoopolisRunId(process.env) !== requestedHandoff.runId)
107
- throw handoffInputError();
38
+ throw organizationHandoffInputError();
108
39
  const resolvedOptions = await resolveDetachedDeploymentOptions(path.resolve(options.outputDirectory ?? DEFAULT_OUTPUT_DIRECTORY), {
109
40
  authProfile: options.authProfile,
110
41
  containerName: options.containerName,
@@ -117,7 +48,7 @@ export const upProject = async (inputPath, options = {}) => {
117
48
  imageTag: options.imageTag,
118
49
  targetExecFile: options.targetExecFile
119
50
  });
120
- await verifyRequestedHandoffTarget(requestedHandoff, resolvedOptions, options);
51
+ await verifyRequestedOrganizationHandoffTarget(requestedHandoff, resolvedOptions, options);
121
52
  // Every authority container compiled for this deployment must stamp
122
53
  // causal events under the same real run id (see specs/CAUSAL.md).
123
54
  // buildProject/compileProject stay deterministic functions of the host
@@ -132,6 +63,7 @@ export const upProject = async (inputPath, options = {}) => {
132
63
  containerArchitecture: options.containerArchitecture,
133
64
  dockerContext: resolvedOptions.dockerContext,
134
65
  dockerCommand: options.dockerCommand,
66
+ deploymentLineage: resolveDeploymentLineage(resolvedOptions.deploymentName ?? "default", options.deploymentLineageNamespace),
135
67
  imageTag: resolvedOptions.imageTag,
136
68
  outputDirectory: options.outputDirectory,
137
69
  runtimePackageOverrides: options.runtimePackageOverrides,
@@ -139,7 +71,12 @@ export const upProject = async (inputPath, options = {}) => {
139
71
  ? { worldBindingsPath: options.worldBindingsPath }
140
72
  : {})
141
73
  });
142
- const handoff = resolveCompiledHandoff(requestedHandoff, buildResult);
74
+ // Before anything starts: a namespaced (dev) deployment must not silently
75
+ // attach production's author-declared volumes by name.
76
+ if (options.deploymentLineageNamespace && !options.allowDeclaredVolumeNames) {
77
+ assertNoDeclaredVolumeNames(buildResult.report.container?.persistent_mounts ?? []);
78
+ }
79
+ const handoff = compileOrganizationHandoff(requestedHandoff, buildResult);
143
80
  const authProfile = resolvedOptions.authProfile
144
81
  ? await requireAuthProfile(resolvedOptions.authProfile)
145
82
  : null;
@@ -156,124 +93,113 @@ export const upProject = async (inputPath, options = {}) => {
156
93
  dockerHost: resolvedOptions.dockerHost,
157
94
  envFilePath: resolvedOptions.envFilePath
158
95
  });
159
- let authority;
96
+ if (options.onDetachedStarted) {
97
+ const started = options.onDetachedStarted;
98
+ invocation.onDetachedStarted = async (result) => {
99
+ if (!result.containerId || !result.containerName || !result.imageId || !result.deploymentLabels) {
100
+ throw new SpawnfileError("runtime_error", "Detached deployment metadata is incomplete");
101
+ }
102
+ await started({ ...result, containerId: result.containerId, containerName: result.containerName, imageId: result.imageId, deploymentLabels: result.deploymentLabels });
103
+ };
104
+ }
160
105
  let deploymentRecordPath;
161
- let recovered = false;
162
- let dockerLifecycleInvoked = false;
163
- try {
164
- let pending;
165
- if (handoff) {
166
- if (!invocation.deploymentLabels || !invocation.containerName)
167
- throw handoffInputError();
168
- const session = createDockerOrganizationHandoffSession({
169
- bindingDigest: handoff.authority.bindingDigest,
106
+ if (handoff) {
107
+ const executed = await executeOrganizationHandoff({
108
+ dockerCommand: options.dockerCommand,
109
+ handoff,
110
+ invocation,
111
+ lifecycleRecovery: options.lifecycleRecovery,
112
+ onDetachedReservation: options.onDetachedReservation,
113
+ runRunner: options.runRunner ?? runDockerContainer,
114
+ targetExecFile: options.targetExecFile,
115
+ });
116
+ const { organizationHandoffHandle, runMetadata } = executed;
117
+ const existingRecordPath = invocation.detach && invocation.deploymentName
118
+ ? resolveDeploymentRecordPath(buildResult.outputDirectory, invocation.deploymentName)
119
+ : null;
120
+ if (existingRecordPath && await fileExists(existingRecordPath)) {
121
+ const existing = await readDeploymentRecord(existingRecordPath);
122
+ const target = await resolveDockerDeploymentTarget({
123
+ context: invocation.dockerContext ?? undefined,
124
+ dockerCommand: invocation.command,
125
+ dockerHost: invocation.dockerHost ?? undefined,
126
+ execFile: options.targetExecFile,
127
+ });
128
+ const expected = createDockerDeploymentRecord({
129
+ authProfileName: authProfile?.name ?? null,
130
+ compileFingerprint: buildResult.report.compile_fingerprint ?? "",
170
131
  containerName: invocation.containerName,
171
- deploymentLabels: invocation.deploymentLabels,
172
- descriptorDigest: handoff.authority.descriptorDigest,
132
+ deploymentName: invocation.deploymentName ?? undefined,
133
+ envFilePath: resolvedOptions.envFilePath,
134
+ imageTag,
135
+ networkIds: buildResult.report.container?.moltnet?.server_plans
136
+ .filter((server) => server.mode === "managed").map((server) => server.network_id),
137
+ nodes: buildResult.report.nodes,
173
138
  organizationHandoff: handoff.organizationHandoff,
139
+ organizationHandoffHandle,
140
+ outputDirectory: buildResult.outputDirectory,
141
+ projectRoot: buildResult.report.root,
174
142
  runId: handoff.authority.runId,
175
- selectedTarget: handoff.authority.selectedTarget,
176
- selectedTargetReceiptDigest: handoff.authority.selectedTargetReceiptDigest
143
+ runMetadata,
144
+ runtimeInstanceIds: buildResult.report.container?.runtime_instances.map((instance) => instance.id) ?? [],
145
+ target,
177
146
  });
178
- authority = await initializeOrganizationHandoffAuthorityStore();
179
- const begun = await authority.begin(session.authorityInput);
180
- pending = begun.pending;
181
- recovered = !begun.created;
182
- }
183
- let runMetadata = undefined;
184
- if (!recovered) {
185
- dockerLifecycleInvoked = true;
186
- runMetadata = await executeDockerRunWithSupportCleanup(invocation, options.runRunner ?? runDockerContainer);
147
+ if (canonicalJson(stableRecord(existing)) !== canonicalJson(stableRecord(expected))) {
148
+ throw organizationHandoffInputError();
149
+ }
150
+ deploymentRecordPath = existingRecordPath;
187
151
  }
188
- const observed = recovered && authority && pending
189
- ? await authority.readDockerMutation(pending.pending_key)
190
- : undefined;
191
- if (recovered && !observed)
192
- throw handoffRecoveryIncompleteError();
193
- const recoveredMetadata = observed
194
- ? { containerId: observed.container_id, deploymentLabels: observed.deployment_labels, imageId: observed.image_id }
195
- : undefined;
196
- const exactRunMetadata = runMetadata ?? recoveredMetadata;
197
- let organizationHandoffHandle;
198
- if (handoff) {
199
- if (!exactRunMetadata?.containerId || !exactRunMetadata.deploymentLabels || !exactRunMetadata.imageId || !authority || !pending)
200
- throw handoffInputError();
201
- if (!recovered)
202
- await authority.observeDockerMutation(pending.pending_key, {
203
- containerId: exactRunMetadata.containerId, deploymentLabels: exactRunMetadata.deploymentLabels, imageId: exactRunMetadata.imageId
204
- });
205
- const finalized = await authority.finalize(pending.pending_key, { containerId: exactRunMetadata.containerId, deploymentLabels: exactRunMetadata.deploymentLabels });
206
- organizationHandoffHandle = finalized.organization_handoff_handle;
207
- const existingRecordPath = invocation.detach && invocation.deploymentName
208
- ? resolveDeploymentRecordPath(buildResult.outputDirectory, invocation.deploymentName)
209
- : null;
210
- if (existingRecordPath && await fileExists(existingRecordPath)) {
211
- const existing = await readDeploymentRecord(existingRecordPath);
212
- const target = await resolveDockerDeploymentTarget({
213
- context: invocation.dockerContext ?? undefined,
214
- dockerCommand: invocation.command,
215
- dockerHost: invocation.dockerHost ?? undefined,
216
- execFile: options.targetExecFile
217
- });
218
- const expected = createDockerDeploymentRecord({
152
+ else {
153
+ deploymentRecordPath = invocation.detach && invocation.deploymentName
154
+ ? await writeDockerDeploymentRecordForRun({
219
155
  authProfileName: authProfile?.name ?? null,
220
- compileFingerprint: buildResult.report.compile_fingerprint ?? "",
221
- containerName: invocation.containerName,
222
- deploymentName: invocation.deploymentName ?? undefined,
223
156
  envFilePath: resolvedOptions.envFilePath,
224
157
  imageTag,
225
- networkIds: buildResult.report.container?.moltnet?.server_plans
226
- .filter((server) => server.mode === "managed").map((server) => server.network_id),
227
- nodes: buildResult.report.nodes,
158
+ invocation,
228
159
  organizationHandoff: handoff.organizationHandoff,
229
160
  organizationHandoffHandle,
230
161
  outputDirectory: buildResult.outputDirectory,
231
- projectRoot: buildResult.report.root,
232
- runId: handoff.authority.runId,
233
- runMetadata: exactRunMetadata,
234
- runtimeInstanceIds: buildResult.report.container?.runtime_instances.map((instance) => instance.id) ?? [],
235
- target
162
+ report: buildResult.report,
163
+ runMetadata,
164
+ targetExecFile: options.targetExecFile,
165
+ })
166
+ : null;
167
+ }
168
+ }
169
+ else {
170
+ let dockerLifecycleInvoked = false;
171
+ try {
172
+ if (options.onDetachedReservation) {
173
+ if (!invocation.detach || !invocation.containerName || !invocation.deploymentLabels) {
174
+ throw new SpawnfileError("runtime_error", "Detached deployment authority is incomplete");
175
+ }
176
+ await options.onDetachedReservation({
177
+ containerName: invocation.containerName,
178
+ deploymentLabels: invocation.deploymentLabels,
179
+ dockerCommand: invocation.command,
180
+ dockerContext: invocation.dockerContext ?? null,
236
181
  });
237
- if (canonicalJson(stableRecord(existing)) !== canonicalJson(stableRecord(expected)))
238
- throw handoffInputError();
239
- deploymentRecordPath = existingRecordPath;
240
182
  }
241
- else
242
- deploymentRecordPath = invocation.detach && invocation.deploymentName
243
- ? await writeDockerDeploymentRecordForRun({ authProfileName: authProfile?.name ?? null, envFilePath: resolvedOptions.envFilePath,
244
- imageTag, invocation, outputDirectory: buildResult.outputDirectory,
245
- organizationHandoff: handoff.organizationHandoff, organizationHandoffHandle, report: buildResult.report,
246
- runMetadata: exactRunMetadata, targetExecFile: options.targetExecFile })
247
- : null;
248
- }
249
- else
183
+ dockerLifecycleInvoked = true;
184
+ const runMetadata = await executeDockerRunWithSupportCleanup(invocation, options.runRunner ?? runDockerContainer);
250
185
  deploymentRecordPath = invocation.detach && invocation.deploymentName
251
- ? await writeDockerDeploymentRecordForRun({ authProfileName: authProfile?.name ?? null, envFilePath: resolvedOptions.envFilePath,
252
- imageTag, invocation, outputDirectory: buildResult.outputDirectory, report: buildResult.report,
253
- runMetadata: runMetadata ?? undefined, targetExecFile: options.targetExecFile })
186
+ ? await writeDockerDeploymentRecordForRun({
187
+ authProfileName: authProfile?.name ?? null,
188
+ envFilePath: resolvedOptions.envFilePath,
189
+ imageTag,
190
+ invocation,
191
+ outputDirectory: buildResult.outputDirectory,
192
+ report: buildResult.report,
193
+ runMetadata: runMetadata ?? undefined,
194
+ targetExecFile: options.targetExecFile,
195
+ })
254
196
  : null;
255
- }
256
- finally {
257
- // Replay creates a fresh support directory but does not invoke the normal
258
- // Docker lifecycle wrapper. Preserve its detached credential cleanup
259
- // semantics without deleting bind-mount support files.
260
- let cleanupError;
261
- try {
262
- if (invocation.detach && !dockerLifecycleInvoked)
263
- await rm(invocation.envFilePath, { force: true });
264
- }
265
- catch (error) {
266
- cleanupError = error;
267
197
  }
268
- try {
269
- await authority?.dispose();
270
- }
271
- catch (error) {
272
- if (cleanupError === undefined)
273
- throw error;
198
+ finally {
199
+ if (invocation.detach && !dockerLifecycleInvoked) {
200
+ await rm(invocation.envFilePath, { force: true });
201
+ }
274
202
  }
275
- if (cleanupError !== undefined)
276
- throw cleanupError;
277
203
  }
278
204
  if (deploymentRecordPath && buildResult.organizationReadinessEvidence) {
279
205
  const record = await readDeploymentRecord(deploymentRecordPath);
@@ -292,6 +218,19 @@ export const upProject = async (inputPath, options = {}) => {
292
218
  execFile: options.targetExecFile,
293
219
  record: pendingRecord
294
220
  });
221
+ if (organizationReady.state === "failed" || organizationReady.state === "cancelled") {
222
+ const unit = record.units[0];
223
+ const reference = unit?.container_id ?? unit?.container_name;
224
+ if (reference) {
225
+ const prefix = invocation.dockerContext
226
+ ? ["--context", invocation.dockerContext]
227
+ : invocation.dockerHost ? ["--host", invocation.dockerHost] : [];
228
+ await (options.targetExecFile ?? defaultDockerTargetExecFile)(invocation.command, [...prefix, "container", "rm", "--force", reference], { timeout: 30_000 });
229
+ }
230
+ await rm(invocation.supportDirectory, { recursive: true, force: true });
231
+ await rm(deploymentRecordPath, { force: true });
232
+ throw new SpawnfileError("runtime_error", "Detached deployment failed organization readiness and was rolled back");
233
+ }
295
234
  await writeDeploymentRecord(buildResult.outputDirectory, {
296
235
  ...pendingRecord,
297
236
  organization_ready: organizationReady
@@ -0,0 +1,62 @@
1
+ import { type DockerTargetExecFile, type OrganizationHandoffInput } from "../deployment/index.js";
2
+ import { type OpaqueTargetHandle, type SelectedTargetReceipt } from "../target/index.js";
3
+ import type { UpLifecycleRecovery } from "../deployment/upLifecycleRecoveryState.js";
4
+ import { SpawnfileError } from "../shared/index.js";
5
+ import type { BuildProjectResult } from "./buildProject.js";
6
+ import { type DockerRunInvocation, type DockerRunResult, type DockerRunRunner } from "./runProject.js";
7
+ export interface OrganizationHandoffRequestOptions {
8
+ readonly descriptorDigest?: string;
9
+ readonly detach?: boolean;
10
+ readonly networkAttachmentHandle?: string;
11
+ readonly organizationHandoffRunId?: string;
12
+ readonly selectedTargetReceipt?: unknown;
13
+ readonly selectedTargetReceiptDigest?: string;
14
+ readonly worldBindingsPath?: string;
15
+ }
16
+ export interface RequestedOrganizationHandoff extends Omit<OrganizationHandoffInput, "bindingDigest"> {
17
+ readonly descriptorDigest: string;
18
+ readonly runId: string;
19
+ readonly selectedTarget: SelectedTargetReceipt;
20
+ }
21
+ export interface CompiledOrganizationHandoff {
22
+ readonly authority: RequestedOrganizationHandoff & {
23
+ readonly bindingDigest: string;
24
+ };
25
+ readonly organizationHandoff: OrganizationHandoffInput;
26
+ }
27
+ export interface DetachedReservation {
28
+ readonly containerName: string;
29
+ readonly deploymentLabels: Readonly<Record<string, string>>;
30
+ readonly dockerCommand: string;
31
+ readonly dockerContext: string | null;
32
+ }
33
+ export declare const organizationHandoffInputError: () => SpawnfileError;
34
+ export declare const resolveRequestedOrganizationHandoff: (options: OrganizationHandoffRequestOptions) => RequestedOrganizationHandoff | null;
35
+ export declare const verifyRequestedOrganizationHandoffTarget: (requested: RequestedOrganizationHandoff | null, resolved: {
36
+ readonly dockerContext?: string | null;
37
+ readonly dockerHost?: string | null;
38
+ }, options: Pick<OrganizationHandoffExecutionOptions, "dockerCommand" | "targetExecFile">) => Promise<void>;
39
+ export declare const compileOrganizationHandoff: (requested: RequestedOrganizationHandoff | null, buildResult: BuildProjectResult) => CompiledOrganizationHandoff | undefined;
40
+ interface OrganizationHandoffExecutionOptions {
41
+ readonly dockerCommand?: string;
42
+ readonly lifecycleRecovery?: UpLifecycleRecovery;
43
+ readonly targetExecFile?: DockerTargetExecFile;
44
+ }
45
+ export interface ExecuteOrganizationHandoffOptions extends OrganizationHandoffExecutionOptions {
46
+ readonly handoff: CompiledOrganizationHandoff;
47
+ readonly invocation: DockerRunInvocation;
48
+ readonly onDetachedReservation?: (authority: DetachedReservation) => Promise<void>;
49
+ readonly runRunner: DockerRunRunner;
50
+ }
51
+ interface ExactRunMetadata extends DockerRunResult {
52
+ readonly containerId: string;
53
+ readonly containerName: string;
54
+ readonly deploymentLabels: Readonly<Record<string, string>>;
55
+ readonly imageId: string;
56
+ }
57
+ /** Resumes only lifecycle-verified state, never stale authority observations. */
58
+ export declare const executeOrganizationHandoff: (input: ExecuteOrganizationHandoffOptions) => Promise<{
59
+ readonly organizationHandoffHandle: OpaqueTargetHandle;
60
+ readonly runMetadata: ExactRunMetadata;
61
+ }>;
62
+ export {};
@@ -0,0 +1,204 @@
1
+ import { createHash } from "node:crypto";
2
+ import { rm } from "node:fs/promises";
3
+ import { createDockerOrganizationHandoffSession, initializeOrganizationHandoffAuthorityStore, parseCanonicalSha256Digest, } from "../deployment/index.js";
4
+ import { createCanonicalSelectedTargetReceiptBytes, parseOpaqueTargetHandle, parseRunId, parseSelectedTargetReceipt, selectTarget, } from "../target/index.js";
5
+ import { isTrustedUpLifecycleRecovery } from "../deployment/upLifecycleRecoveryState.js";
6
+ import { SpawnfileError } from "../shared/index.js";
7
+ import { executeDockerRunWithSupportCleanup } from "./runProjectLifecycle.js";
8
+ import { recoverDetachedDockerRun, } from "./runProject.js";
9
+ export const organizationHandoffInputError = () => new SpawnfileError("validation_error", "Organization handoff requires authorized run id, selected target receipt, descriptor digest, selected target receipt digest, network attachment handle, and world bindings");
10
+ const recoveryError = () => new SpawnfileError("runtime_error", "Organization handoff recovery is incomplete; redeploy with explicit authorization");
11
+ export const resolveRequestedOrganizationHandoff = (options) => {
12
+ const values = [
13
+ options.descriptorDigest,
14
+ options.organizationHandoffRunId,
15
+ options.selectedTargetReceiptDigest,
16
+ options.selectedTargetReceipt,
17
+ options.networkAttachmentHandle,
18
+ options.worldBindingsPath,
19
+ ];
20
+ if (values.every((value) => value === undefined))
21
+ return null;
22
+ if (values.some((value) => value === undefined) || !options.detach)
23
+ throw organizationHandoffInputError();
24
+ try {
25
+ const selectedTarget = parseSelectedTargetReceipt(options.selectedTargetReceipt);
26
+ const selectedDigest = parseCanonicalSha256Digest(options.selectedTargetReceiptDigest, "selected_target_receipt_digest");
27
+ const computedDigest = `sha256:${createHash("sha256").update(createCanonicalSelectedTargetReceiptBytes(selectedTarget), "utf8").digest("hex")}`;
28
+ if (selectedDigest !== computedDigest)
29
+ throw new Error("selected receipt digest mismatch");
30
+ return {
31
+ descriptorDigest: parseCanonicalSha256Digest(options.descriptorDigest, "descriptor_digest"),
32
+ runId: parseRunId(options.organizationHandoffRunId),
33
+ networkAttachmentHandle: parseOpaqueTargetHandle(options.networkAttachmentHandle),
34
+ selectedTarget,
35
+ selectedTargetReceiptDigest: selectedDigest,
36
+ };
37
+ }
38
+ catch {
39
+ throw organizationHandoffInputError();
40
+ }
41
+ };
42
+ export const verifyRequestedOrganizationHandoffTarget = async (requested, resolved, options) => {
43
+ if (!requested)
44
+ return;
45
+ if (typeof resolved.dockerContext !== "string" || resolved.dockerContext.length === 0
46
+ || resolved.dockerHost != null || process.env.DOCKER_HOST != null)
47
+ throw organizationHandoffInputError();
48
+ try {
49
+ const actual = await selectTarget({
50
+ context: resolved.dockerContext,
51
+ dockerCommand: options.dockerCommand,
52
+ execFile: options.targetExecFile,
53
+ });
54
+ if (createCanonicalSelectedTargetReceiptBytes(actual)
55
+ !== createCanonicalSelectedTargetReceiptBytes(requested.selectedTarget))
56
+ throw new Error("target mismatch");
57
+ }
58
+ catch {
59
+ throw organizationHandoffInputError();
60
+ }
61
+ };
62
+ export const compileOrganizationHandoff = (requested, buildResult) => {
63
+ if (!requested)
64
+ return undefined;
65
+ try {
66
+ const bindingDigest = buildResult.organizationReadinessEvidence.worldBindings?.digest;
67
+ if (!bindingDigest)
68
+ throw new Error("missing compiled binding evidence");
69
+ const parsedBindingDigest = parseCanonicalSha256Digest(bindingDigest, "binding_digest");
70
+ return {
71
+ authority: { ...requested, bindingDigest: parsedBindingDigest },
72
+ organizationHandoff: {
73
+ bindingDigest: parsedBindingDigest,
74
+ networkAttachmentHandle: requested.networkAttachmentHandle,
75
+ selectedTargetReceiptDigest: requested.selectedTargetReceiptDigest,
76
+ },
77
+ };
78
+ }
79
+ catch {
80
+ throw organizationHandoffInputError();
81
+ }
82
+ };
83
+ const canonical = (value) => value === null || typeof value !== "object"
84
+ ? JSON.stringify(value)
85
+ : Array.isArray(value) ? `[${value.map(canonical).join(",")}]`
86
+ : `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`).join(",")}}`;
87
+ const same = (left, right) => canonical(left) === canonical(right);
88
+ const exactRunMetadata = (value) => {
89
+ if (!value?.containerId || !value.containerName || !value.imageId || !value.deploymentLabels) {
90
+ throw organizationHandoffInputError();
91
+ }
92
+ return value;
93
+ };
94
+ const reattestRecoveredRun = async (invocation, expected) => {
95
+ const actual = exactRunMetadata(await recoverDetachedDockerRun(invocation, expected.containerId));
96
+ if (actual.containerName !== expected.containerName || actual.imageId !== expected.imageId
97
+ || !same(actual.deploymentLabels, expected.deploymentLabels))
98
+ throw recoveryError();
99
+ return actual;
100
+ };
101
+ const recovery = (value) => {
102
+ if (value !== undefined && !isTrustedUpLifecycleRecovery(value))
103
+ throw organizationHandoffInputError();
104
+ return value;
105
+ };
106
+ const reserveDetachedRun = async (invocation, reserve) => {
107
+ if (!reserve)
108
+ return;
109
+ if (!invocation.detach || !invocation.containerName || !invocation.deploymentLabels) {
110
+ throw new SpawnfileError("runtime_error", "Detached deployment authority is incomplete");
111
+ }
112
+ await reserve({
113
+ containerName: invocation.containerName,
114
+ deploymentLabels: invocation.deploymentLabels,
115
+ dockerCommand: invocation.command,
116
+ dockerContext: invocation.dockerContext ?? null,
117
+ });
118
+ };
119
+ /** Resumes only lifecycle-verified state, never stale authority observations. */
120
+ export const executeOrganizationHandoff = async (input) => {
121
+ const { handoff, invocation } = input;
122
+ if (!invocation.deploymentLabels || !invocation.containerName)
123
+ throw organizationHandoffInputError();
124
+ const lifecycleRecovery = recovery(input.lifecycleRecovery);
125
+ const session = createDockerOrganizationHandoffSession({
126
+ bindingDigest: handoff.authority.bindingDigest,
127
+ containerName: invocation.containerName,
128
+ deploymentLabels: invocation.deploymentLabels,
129
+ descriptorDigest: handoff.authority.descriptorDigest,
130
+ organizationHandoff: handoff.organizationHandoff,
131
+ runId: handoff.authority.runId,
132
+ selectedTarget: handoff.authority.selectedTarget,
133
+ selectedTargetReceiptDigest: handoff.authority.selectedTargetReceiptDigest,
134
+ });
135
+ let authority;
136
+ let dockerLifecycleInvoked = false;
137
+ try {
138
+ // Persist the lifecycle reservation first. A post-begin crash can then be
139
+ // distinguished as no-start, exact-container, or ambiguous on restart.
140
+ if (lifecycleRecovery?.kind !== "deployment_record") {
141
+ await reserveDetachedRun(invocation, input.onDetachedReservation);
142
+ }
143
+ authority = await initializeOrganizationHandoffAuthorityStore();
144
+ const begun = await authority.begin(session.authorityInput);
145
+ let runMetadata;
146
+ if (begun.created) {
147
+ if (lifecycleRecovery?.kind === "detached_container"
148
+ || lifecycleRecovery?.kind === "deployment_record")
149
+ throw recoveryError();
150
+ dockerLifecycleInvoked = true;
151
+ runMetadata = exactRunMetadata(await executeDockerRunWithSupportCleanup(invocation, input.runRunner));
152
+ }
153
+ else {
154
+ const observed = await authority.readDockerMutation(begun.pending.pending_key);
155
+ if (observed) {
156
+ if (lifecycleRecovery?.kind === "no_docker_mutation")
157
+ throw recoveryError();
158
+ const expected = {
159
+ containerId: observed.container_id,
160
+ containerName: invocation.containerName,
161
+ deploymentLabels: observed.deployment_labels,
162
+ imageId: observed.image_id,
163
+ };
164
+ if (lifecycleRecovery?.kind === "detached_container" && (lifecycleRecovery.containerId !== expected.containerId
165
+ || lifecycleRecovery.containerName !== expected.containerName
166
+ || lifecycleRecovery.imageId !== expected.imageId
167
+ || !same(lifecycleRecovery.deploymentLabels, expected.deploymentLabels)))
168
+ throw recoveryError();
169
+ runMetadata = await reattestRecoveredRun(invocation, expected);
170
+ }
171
+ else if (lifecycleRecovery?.kind === "detached_container") {
172
+ runMetadata = await reattestRecoveredRun(invocation, lifecycleRecovery);
173
+ }
174
+ else if (lifecycleRecovery?.kind === "no_docker_mutation") {
175
+ dockerLifecycleInvoked = true;
176
+ runMetadata = exactRunMetadata(await executeDockerRunWithSupportCleanup(invocation, input.runRunner));
177
+ }
178
+ else
179
+ throw recoveryError();
180
+ }
181
+ await authority.observeDockerMutation(begun.pending.pending_key, runMetadata);
182
+ const finalized = await authority.finalize(begun.pending.pending_key, runMetadata);
183
+ return { organizationHandoffHandle: finalized.organization_handoff_handle, runMetadata };
184
+ }
185
+ finally {
186
+ let cleanupError;
187
+ try {
188
+ if (invocation.detach && !dockerLifecycleInvoked)
189
+ await rm(invocation.envFilePath, { force: true });
190
+ }
191
+ catch (error) {
192
+ cleanupError = error;
193
+ }
194
+ try {
195
+ await authority?.dispose();
196
+ }
197
+ catch (error) {
198
+ if (cleanupError === undefined)
199
+ throw error;
200
+ }
201
+ if (cleanupError !== undefined)
202
+ throw cleanupError;
203
+ }
204
+ };