spawnfile 0.1.13 → 0.1.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (598) hide show
  1. package/README.md +50 -11
  2. package/dist/audit/auditCli.d.ts +19 -0
  3. package/dist/audit/auditCli.js +63 -0
  4. package/dist/audit/checks.d.ts +100 -0
  5. package/dist/audit/checks.js +279 -0
  6. package/dist/audit/checksShared.d.ts +74 -0
  7. package/dist/audit/checksShared.js +37 -0
  8. package/dist/audit/generateAudit.d.ts +19 -0
  9. package/dist/audit/generateAudit.js +122 -0
  10. package/dist/audit/index.d.ts +4 -0
  11. package/dist/audit/index.js +4 -0
  12. package/dist/audit/readAudit.d.ts +50 -0
  13. package/dist/audit/readAudit.js +59 -0
  14. package/dist/audit/types.d.ts +40 -0
  15. package/dist/audit/types.js +8 -0
  16. package/dist/auth/credentialEnvFile.d.ts +11 -0
  17. package/dist/auth/credentialEnvFile.js +60 -0
  18. package/dist/auth/credentialProvisioning.d.ts +15 -0
  19. package/dist/auth/credentialProvisioning.js +75 -0
  20. package/dist/auth/credentialProvisioningReceipt.d.ts +28 -0
  21. package/dist/auth/credentialProvisioningReceipt.js +70 -0
  22. package/dist/auth/credentialProvisioningRequest.d.ts +51 -0
  23. package/dist/auth/credentialProvisioningRequest.js +169 -0
  24. package/dist/auth/credentialWorldBindings.d.ts +21 -0
  25. package/dist/auth/credentialWorldBindings.js +104 -0
  26. package/dist/auth/index.d.ts +7 -0
  27. package/dist/auth/index.js +7 -0
  28. package/dist/auth/paths.d.ts +11 -0
  29. package/dist/auth/paths.js +21 -0
  30. package/dist/auth/targetSecretSourceAuthor.d.ts +18 -0
  31. package/dist/auth/targetSecretSourceAuthor.js +52 -0
  32. package/dist/auth/targetSecretSourceFsPublish.d.ts +15 -0
  33. package/dist/auth/targetSecretSourceFsPublish.js +49 -0
  34. package/dist/auth/targetSecretSourceFsPublishImmutable.d.ts +16 -0
  35. package/dist/auth/targetSecretSourceFsPublishImmutable.js +435 -0
  36. package/dist/auth/targetSecretSourceFsRead.d.ts +14 -0
  37. package/dist/auth/targetSecretSourceFsRead.js +198 -0
  38. package/dist/auth/targetSecretSourceGrant.d.ts +16 -0
  39. package/dist/auth/targetSecretSourceGrant.js +99 -0
  40. package/dist/auth/targetSecretSourceGrantRecords.d.ts +84 -0
  41. package/dist/auth/targetSecretSourceGrantRecords.js +214 -0
  42. package/dist/auth/targetSecretSourceLifecycle.d.ts +30 -0
  43. package/dist/auth/targetSecretSourceLifecycle.js +52 -0
  44. package/dist/auth/targetSecretSourceOwnerEntropy.d.ts +6 -0
  45. package/dist/auth/targetSecretSourceOwnerEntropy.js +28 -0
  46. package/dist/auth/targetSecretSourceRecordCommon.d.ts +14 -0
  47. package/dist/auth/targetSecretSourceRecordCommon.js +100 -0
  48. package/dist/auth/targetSecretSourceRecordPublish.d.ts +10 -0
  49. package/dist/auth/targetSecretSourceRecordPublish.js +104 -0
  50. package/dist/auth/targetSecretSourceResolver.d.ts +10 -0
  51. package/dist/auth/targetSecretSourceResolver.js +137 -0
  52. package/dist/auth/targetSecretSourceRevoke.d.ts +20 -0
  53. package/dist/auth/targetSecretSourceRevoke.js +92 -0
  54. package/dist/auth/targetSecretSourceRotate.d.ts +19 -0
  55. package/dist/auth/targetSecretSourceRotate.js +121 -0
  56. package/dist/auth/targetSecretSourceVersionRecords.d.ts +49 -0
  57. package/dist/auth/targetSecretSourceVersionRecords.js +166 -0
  58. package/dist/cli/artifactsCommands.d.ts +27 -0
  59. package/dist/cli/artifactsCommands.js +132 -0
  60. package/dist/cli/authCommands.d.ts +5 -0
  61. package/dist/cli/authCommands.js +221 -0
  62. package/dist/cli/compileBuildCommands.d.ts +3 -0
  63. package/dist/cli/compileBuildCommands.js +35 -0
  64. package/dist/cli/containerBundleCommand.d.ts +6 -0
  65. package/dist/cli/containerBundleCommand.js +116 -0
  66. package/dist/cli/downCommand.d.ts +25 -0
  67. package/dist/cli/downCommand.js +134 -0
  68. package/dist/cli/index.js +6 -3
  69. package/dist/cli/lifecycleCommands.d.ts +1 -1
  70. package/dist/cli/lifecycleCommands.js +11 -181
  71. package/dist/cli/lifecycleMachine.d.ts +19 -0
  72. package/dist/cli/lifecycleMachine.js +78 -0
  73. package/dist/cli/lifecyclePlan.d.ts +35 -0
  74. package/dist/cli/lifecyclePlan.js +240 -0
  75. package/dist/cli/lifecyclePlanningCommands.d.ts +3 -0
  76. package/dist/cli/lifecyclePlanningCommands.js +30 -0
  77. package/dist/cli/runCli.d.ts +9 -2
  78. package/dist/cli/runCli.js +27 -71
  79. package/dist/cli/runPublishCommands.d.ts +3 -0
  80. package/dist/cli/runPublishCommands.js +70 -0
  81. package/dist/cli/statusCommand.d.ts +3 -33
  82. package/dist/cli/statusCommand.js +19 -249
  83. package/dist/cli/statusCommandLive.d.ts +20 -0
  84. package/dist/cli/statusCommandLive.js +188 -0
  85. package/dist/cli/statusCommandOptions.d.ts +40 -0
  86. package/dist/cli/statusCommandOptions.js +42 -0
  87. package/dist/cli/targetCliRoute.d.ts +2 -0
  88. package/dist/cli/targetCliRoute.js +30 -0
  89. package/dist/cli/targetCommands.d.ts +33 -0
  90. package/dist/cli/targetCommands.js +257 -0
  91. package/dist/cli/targetComposedPreparationCommand.d.ts +6 -0
  92. package/dist/cli/targetComposedPreparationCommand.js +39 -0
  93. package/dist/cli/targetDefaultArtifactAuthority.d.ts +5 -0
  94. package/dist/cli/targetDefaultArtifactAuthority.js +28 -0
  95. package/dist/cli/targetDefaultAuthorities.d.ts +53 -0
  96. package/dist/cli/targetDefaultAuthorities.js +210 -0
  97. package/dist/cli/targetDefaultConfig.d.ts +68 -0
  98. package/dist/cli/targetDefaultConfig.js +317 -0
  99. package/dist/cli/targetDefaultConfigStdin.d.ts +13 -0
  100. package/dist/cli/targetDefaultConfigStdin.js +215 -0
  101. package/dist/cli/targetDefaultEnvelope.d.ts +1 -0
  102. package/dist/cli/targetDefaultEnvelope.js +13 -0
  103. package/dist/cli/targetDefaultHandlerFactory.d.ts +28 -0
  104. package/dist/cli/targetDefaultHandlerFactory.js +247 -0
  105. package/dist/cli/targetDefaultHandlers.d.ts +21 -0
  106. package/dist/cli/targetDefaultHandlers.js +72 -0
  107. package/dist/cli/targetDefaultJournalAuthority.d.ts +35 -0
  108. package/dist/cli/targetDefaultJournalAuthority.js +135 -0
  109. package/dist/cli/targetDefaultWorldClock.d.ts +4 -0
  110. package/dist/cli/targetDefaultWorldClock.js +14 -0
  111. package/dist/cli/targetDefaultWorldQueries.d.ts +5 -0
  112. package/dist/cli/targetDefaultWorldQueries.js +11 -0
  113. package/dist/cli/targetDefaultWorldReadiness.d.ts +4 -0
  114. package/dist/cli/targetDefaultWorldReadiness.js +17 -0
  115. package/dist/cli/targetEvidenceHelperResolution.d.ts +14 -0
  116. package/dist/cli/targetEvidenceHelperResolution.js +23 -0
  117. package/dist/cli/targetLookupCli.d.ts +3 -0
  118. package/dist/cli/targetLookupCli.js +31 -0
  119. package/dist/cli/targetLookupCommands.d.ts +12 -0
  120. package/dist/cli/targetLookupCommands.js +69 -0
  121. package/dist/cli/targetOperationDispatch.d.ts +58 -0
  122. package/dist/cli/targetOperationDispatch.js +21 -0
  123. package/dist/cli/targetReceiptOutput.d.ts +14 -0
  124. package/dist/cli/targetReceiptOutput.js +21 -0
  125. package/dist/cli/targetRequestFile.d.ts +14 -0
  126. package/dist/cli/targetRequestFile.js +63 -0
  127. package/dist/cli/targetSecretSourceInput.d.ts +28 -0
  128. package/dist/cli/targetSecretSourceInput.js +121 -0
  129. package/dist/cli/targetWorldClockCommand.d.ts +10 -0
  130. package/dist/cli/targetWorldClockCommand.js +42 -0
  131. package/dist/cli/targetWorldClockCrossProcess.test-helper.d.ts +13 -0
  132. package/dist/cli/targetWorldClockCrossProcess.test-helper.js +109 -0
  133. package/dist/cli/targetWorldReadinessCommand.d.ts +10 -0
  134. package/dist/cli/targetWorldReadinessCommand.js +43 -0
  135. package/dist/cli/upCommand.d.ts +3 -0
  136. package/dist/cli/upCommand.js +133 -0
  137. package/dist/cli/upImageCommand.d.ts +11 -0
  138. package/dist/cli/upImageCommand.js +41 -0
  139. package/dist/cli/upLifecycleInvocation.d.ts +41 -0
  140. package/dist/cli/upLifecycleInvocation.js +48 -0
  141. package/dist/cli/upLifecycleRecovery.d.ts +4 -0
  142. package/dist/cli/upLifecycleRecovery.js +53 -0
  143. package/dist/compiler/agentNodeMerge.d.ts +2 -0
  144. package/dist/compiler/agentNodeMerge.js +79 -0
  145. package/dist/compiler/agentSurfaces.js +11 -1
  146. package/dist/compiler/buildCompilePlan.js +17 -0
  147. package/dist/compiler/buildCompilePlanAgent.d.ts +11 -0
  148. package/dist/compiler/buildCompilePlanAgent.js +56 -0
  149. package/dist/compiler/buildCompilePlanTeams.d.ts +1 -0
  150. package/dist/compiler/buildCompilePlanTeams.js +4 -1
  151. package/dist/compiler/buildCompilePlanTraversal.js +75 -82
  152. package/dist/compiler/buildProject.d.ts +11 -0
  153. package/dist/compiler/buildProject.js +77 -2
  154. package/dist/compiler/compilePlanHelpers.js +2 -0
  155. package/dist/compiler/compileProject.d.ts +13 -0
  156. package/dist/compiler/compileProject.js +26 -74
  157. package/dist/compiler/compileProjectPolicy.d.ts +5 -0
  158. package/dist/compiler/compileProjectPolicy.js +21 -0
  159. package/dist/compiler/compileProjectReports.d.ts +9 -0
  160. package/dist/compiler/compileProjectReports.js +52 -0
  161. package/dist/compiler/containerArtifactSummaries.d.ts +7 -0
  162. package/dist/compiler/containerArtifactSummaries.js +138 -0
  163. package/dist/compiler/containerArtifacts.d.ts +10 -0
  164. package/dist/compiler/containerArtifacts.js +126 -125
  165. package/dist/compiler/containerArtifactsPlans.d.ts +5 -3
  166. package/dist/compiler/containerArtifactsPlans.js +31 -118
  167. package/dist/compiler/containerArtifactsRender.d.ts +3 -1
  168. package/dist/compiler/containerArtifactsRender.js +15 -12
  169. package/dist/compiler/containerArtifactsTypes.d.ts +12 -0
  170. package/dist/compiler/containerConfigEnvRender.d.ts +3 -0
  171. package/dist/compiler/containerConfigEnvRender.js +54 -0
  172. package/dist/compiler/containerEntrypointRender.d.ts +1 -0
  173. package/dist/compiler/containerEntrypointRender.js +56 -52
  174. package/dist/compiler/containerEntrypointShell.d.ts +5 -0
  175. package/dist/compiler/containerEntrypointShell.js +29 -0
  176. package/dist/compiler/containerPackageOverrides.d.ts +27 -0
  177. package/dist/compiler/containerPackageOverrides.js +63 -0
  178. package/dist/compiler/containerTargetPlanResolution.d.ts +20 -0
  179. package/dist/compiler/containerTargetPlanResolution.js +97 -0
  180. package/dist/compiler/daimonTelemetryArtifacts.d.ts +22 -0
  181. package/dist/compiler/daimonTelemetryArtifacts.js +61 -0
  182. package/dist/compiler/dockerBuildContext.d.ts +16 -0
  183. package/dist/compiler/dockerBuildContext.js +159 -0
  184. package/dist/compiler/dockerBuildSkip.d.ts +30 -0
  185. package/dist/compiler/dockerBuildSkip.js +81 -0
  186. package/dist/compiler/index.d.ts +4 -0
  187. package/dist/compiler/index.js +4 -0
  188. package/dist/compiler/memoryArtifacts.d.ts +26 -0
  189. package/dist/compiler/memoryArtifacts.js +134 -0
  190. package/dist/compiler/memoryResolution.d.ts +4 -0
  191. package/dist/compiler/memoryResolution.js +147 -0
  192. package/dist/compiler/modelEnv.d.ts +2 -0
  193. package/dist/compiler/modelEnv.js +6 -0
  194. package/dist/compiler/moltnetAllowedWakeSendersValidation.d.ts +2 -0
  195. package/dist/compiler/moltnetAllowedWakeSendersValidation.js +42 -0
  196. package/dist/compiler/moltnetArtifactPaths.d.ts +26 -0
  197. package/dist/compiler/moltnetArtifactPaths.js +49 -0
  198. package/dist/compiler/moltnetArtifactTypes.d.ts +46 -0
  199. package/dist/compiler/moltnetArtifactTypes.js +1 -0
  200. package/dist/compiler/moltnetArtifacts.d.ts +2 -40
  201. package/dist/compiler/moltnetArtifacts.js +43 -97
  202. package/dist/compiler/moltnetBinaries.d.ts +21 -4
  203. package/dist/compiler/moltnetBinaries.js +134 -27
  204. package/dist/compiler/moltnetClientConfig.js +7 -2
  205. package/dist/compiler/moltnetConfigLowering.d.ts +16 -1
  206. package/dist/compiler/moltnetConfigLowering.js +67 -5
  207. package/dist/compiler/moltnetExternalParticipantArtifact.d.ts +38 -0
  208. package/dist/compiler/moltnetExternalParticipantArtifact.js +188 -0
  209. package/dist/compiler/moltnetNodeConfig.js +7 -2
  210. package/dist/compiler/moltnetReleaseAuthority.d.ts +17 -0
  211. package/dist/compiler/moltnetReleaseAuthority.js +73 -0
  212. package/dist/compiler/moltnetReleaseDownload.d.ts +12 -0
  213. package/dist/compiler/moltnetReleaseDownload.js +85 -0
  214. package/dist/compiler/moltnetRepresentativeResolution.d.ts +1 -0
  215. package/dist/compiler/moltnetRepresentativeResolution.js +16 -2
  216. package/dist/compiler/moltnetResolution.js +72 -20
  217. package/dist/compiler/moltnetRoomMemberships.js +37 -9
  218. package/dist/compiler/moltnetServerPlans.d.ts +9 -0
  219. package/dist/compiler/moltnetServerPlans.js +132 -0
  220. package/dist/compiler/organizationIdentity.d.ts +27 -0
  221. package/dist/compiler/organizationIdentity.js +297 -0
  222. package/dist/compiler/organizationReadyEvidence.d.ts +49 -0
  223. package/dist/compiler/organizationReadyEvidence.js +261 -0
  224. package/dist/compiler/projectManifestGraph.d.ts +4 -0
  225. package/dist/compiler/projectManifestGraph.js +24 -0
  226. package/dist/compiler/runProject.d.ts +4 -0
  227. package/dist/compiler/runProject.js +30 -21
  228. package/dist/compiler/runProjectAuth.d.ts +7 -1
  229. package/dist/compiler/runProjectAuth.js +87 -9
  230. package/dist/compiler/runProjectDocker.d.ts +7 -0
  231. package/dist/compiler/runProjectDocker.js +31 -8
  232. package/dist/compiler/runProjectLifecycle.d.ts +7 -0
  233. package/dist/compiler/runProjectLifecycle.js +40 -0
  234. package/dist/compiler/syncProjectAuth.js +4 -1
  235. package/dist/compiler/teamContextActiveEnvironments.d.ts +13 -0
  236. package/dist/compiler/teamContextActiveEnvironments.js +255 -0
  237. package/dist/compiler/teamContextSupport.js +32 -40
  238. package/dist/compiler/teamContextTypes.d.ts +2 -0
  239. package/dist/compiler/types.d.ts +82 -1
  240. package/dist/compiler/upProject.d.ts +5 -0
  241. package/dist/compiler/upProject.js +256 -20
  242. package/dist/compiler/upReceipt.d.ts +36 -0
  243. package/dist/compiler/upReceipt.js +82 -0
  244. package/dist/compiler/updateProjectModels.js +42 -60
  245. package/dist/compiler/updateProjectRuntime.js +22 -35
  246. package/dist/compiler/updateProjectSurfaces.js +53 -47
  247. package/dist/compiler/worldBindings.d.ts +39 -0
  248. package/dist/compiler/worldBindings.js +247 -0
  249. package/dist/compiler/worldBindingsFile.d.ts +5 -0
  250. package/dist/compiler/worldBindingsFile.js +162 -0
  251. package/dist/deployment/artifactsExport.d.ts +49 -0
  252. package/dist/deployment/artifactsExport.js +217 -0
  253. package/dist/deployment/artifactsExportDocker.d.ts +48 -0
  254. package/dist/deployment/artifactsExportDocker.js +91 -0
  255. package/dist/deployment/artifactsExportPlan.d.ts +24 -0
  256. package/dist/deployment/artifactsExportPlan.js +135 -0
  257. package/dist/deployment/artifactsExportTypes.d.ts +50 -0
  258. package/dist/deployment/artifactsExportTypes.js +52 -0
  259. package/dist/deployment/buildImageCacheStore.d.ts +23 -0
  260. package/dist/deployment/buildImageCacheStore.js +54 -0
  261. package/dist/deployment/deploymentLifecycleCorrelation.d.ts +11 -0
  262. package/dist/deployment/deploymentLifecycleCorrelation.js +33 -0
  263. package/dist/deployment/dockerInspect.d.ts +9 -0
  264. package/dist/deployment/dockerInspect.js +24 -1
  265. package/dist/deployment/dockerLabels.d.ts +2 -0
  266. package/dist/deployment/dockerLabels.js +2 -0
  267. package/dist/deployment/dockerLogs.js +2 -10
  268. package/dist/deployment/dockerManager.d.ts +51 -0
  269. package/dist/deployment/dockerManager.js +118 -1
  270. package/dist/deployment/dockerProbeGateway.js +64 -5
  271. package/dist/deployment/dockerRecover.js +9 -1
  272. package/dist/deployment/dockerTeardown.d.ts +32 -0
  273. package/dist/deployment/dockerTeardown.js +61 -0
  274. package/dist/deployment/downDeployment.d.ts +34 -0
  275. package/dist/deployment/downDeployment.js +147 -0
  276. package/dist/deployment/downReceiptTypes.d.ts +21 -0
  277. package/dist/deployment/downReceiptTypes.js +30 -0
  278. package/dist/deployment/index.d.ts +16 -0
  279. package/dist/deployment/index.js +17 -0
  280. package/dist/deployment/lifecycleCompletion.d.ts +37 -0
  281. package/dist/deployment/lifecycleCompletion.js +236 -0
  282. package/dist/deployment/lifecycleCompletionContracts.d.ts +158 -0
  283. package/dist/deployment/lifecycleCompletionContracts.js +106 -0
  284. package/dist/deployment/lifecycleCompletionHeartbeat.d.ts +2 -0
  285. package/dist/deployment/lifecycleCompletionHeartbeat.js +50 -0
  286. package/dist/deployment/lifecycleCompletionLookup.d.ts +18 -0
  287. package/dist/deployment/lifecycleCompletionLookup.js +88 -0
  288. package/dist/deployment/lifecycleCompletionOwner.d.ts +8 -0
  289. package/dist/deployment/lifecycleCompletionOwner.js +31 -0
  290. package/dist/deployment/lifecycleCompletionParsing.d.ts +12 -0
  291. package/dist/deployment/lifecycleCompletionParsing.js +108 -0
  292. package/dist/deployment/lifecycleCompletionPaths.d.ts +9 -0
  293. package/dist/deployment/lifecycleCompletionPaths.js +16 -0
  294. package/dist/deployment/lifecycleCompletionPublication.d.ts +5 -0
  295. package/dist/deployment/lifecycleCompletionPublication.js +35 -0
  296. package/dist/deployment/lifecycleCompletionRecovery.d.ts +21 -0
  297. package/dist/deployment/lifecycleCompletionRecovery.js +56 -0
  298. package/dist/deployment/lifecycleCompletionRoot.d.ts +21 -0
  299. package/dist/deployment/lifecycleCompletionRoot.js +243 -0
  300. package/dist/deployment/lifecycleCompletionStore.d.ts +6 -0
  301. package/dist/deployment/lifecycleCompletionStore.js +151 -0
  302. package/dist/deployment/organizationHandoffAuthorityFsClient.d.ts +17 -0
  303. package/dist/deployment/organizationHandoffAuthorityFsClient.js +132 -0
  304. package/dist/deployment/organizationHandoffAuthorityFsWorker.d.ts +1 -0
  305. package/dist/deployment/organizationHandoffAuthorityFsWorker.js +285 -0
  306. package/dist/deployment/organizationHandoffAuthorityFsWorkerParent.fixture.d.ts +1 -0
  307. package/dist/deployment/organizationHandoffAuthorityFsWorkerParent.fixture.js +26 -0
  308. package/dist/deployment/organizationHandoffAuthorityStore.d.ts +41 -0
  309. package/dist/deployment/organizationHandoffAuthorityStore.js +348 -0
  310. package/dist/deployment/organizationHandoffAuthorityTypes.d.ts +76 -0
  311. package/dist/deployment/organizationHandoffAuthorityTypes.js +148 -0
  312. package/dist/deployment/organizationHandoffTypes.d.ts +29 -0
  313. package/dist/deployment/organizationHandoffTypes.js +80 -0
  314. package/dist/deployment/organizationReady.d.ts +52 -0
  315. package/dist/deployment/organizationReady.js +200 -0
  316. package/dist/deployment/privateArtifactsExport.d.ts +18 -0
  317. package/dist/deployment/privateArtifactsExport.js +80 -0
  318. package/dist/deployment/providerRuntimeBoundaryScanner.test-helper.d.ts +8 -0
  319. package/dist/deployment/providerRuntimeBoundaryScanner.test-helper.js +60 -0
  320. package/dist/deployment/record.d.ts +26 -1
  321. package/dist/deployment/record.js +49 -4
  322. package/dist/deployment/simfileFixtureBoundary.test-helper.d.ts +8 -0
  323. package/dist/deployment/simfileFixtureBoundary.test-helper.js +103 -0
  324. package/dist/deployment/target.d.ts +1 -35
  325. package/dist/deployment/target.js +1 -96
  326. package/dist/deployment/upReceiptTypes.d.ts +111 -0
  327. package/dist/deployment/upReceiptTypes.js +164 -0
  328. package/dist/dev/project.js +15 -9
  329. package/dist/distribution/buildDistributionReport.d.ts +2 -1
  330. package/dist/distribution/buildDistributionReport.js +2 -1
  331. package/dist/distribution/distributionReportSchema.d.ts +5 -0
  332. package/dist/distribution/distributionReportSchema.js +7 -2
  333. package/dist/distribution/index.d.ts +2 -2
  334. package/dist/distribution/index.js +1 -1
  335. package/dist/distribution/types.d.ts +7 -0
  336. package/dist/distribution/types.js +1 -0
  337. package/dist/filesystem/paths.js +10 -1
  338. package/dist/ledger/causalConformanceCli.d.ts +1 -0
  339. package/dist/ledger/causalConformanceCli.js +41 -0
  340. package/dist/ledger/causeNamespace.d.ts +8 -0
  341. package/dist/ledger/causeNamespace.js +24 -0
  342. package/dist/ledger/conformance.d.ts +83 -0
  343. package/dist/ledger/conformance.js +259 -0
  344. package/dist/ledger/emitters.d.ts +76 -0
  345. package/dist/ledger/emitters.js +188 -0
  346. package/dist/ledger/index.d.ts +4 -0
  347. package/dist/ledger/index.js +4 -0
  348. package/dist/ledger/principal.d.ts +96 -0
  349. package/dist/ledger/principal.js +121 -0
  350. package/dist/manifest/externalParticipantSchemas.d.ts +18 -0
  351. package/dist/manifest/externalParticipantSchemas.js +17 -0
  352. package/dist/manifest/index.d.ts +1 -0
  353. package/dist/manifest/index.js +1 -0
  354. package/dist/manifest/inlineAgentMember.d.ts +2 -0
  355. package/dist/manifest/inlineAgentMember.js +9 -0
  356. package/dist/manifest/loadManifest.js +14 -8
  357. package/dist/manifest/mcpSchemas.d.ts +17 -0
  358. package/dist/manifest/mcpSchemas.js +41 -0
  359. package/dist/manifest/memorySchemas.d.ts +245 -0
  360. package/dist/manifest/memorySchemas.js +148 -0
  361. package/dist/manifest/renderSpawnfile.js +22 -131
  362. package/dist/manifest/renderSpawnfileNetworks.js +9 -2
  363. package/dist/manifest/renderSpawnfileSurfaces.d.ts +2 -0
  364. package/dist/manifest/renderSpawnfileSurfaces.js +134 -0
  365. package/dist/manifest/schemas.d.ts +1868 -99
  366. package/dist/manifest/schemas.js +78 -32
  367. package/dist/manifest/surfaceSchemas.d.ts +17 -0
  368. package/dist/manifest/surfaceSchemas.js +24 -1
  369. package/dist/manifest/teamNetworkAccessSchemas.d.ts +1 -1
  370. package/dist/manifest/teamNetworkAuthSchemas.d.ts +48 -0
  371. package/dist/manifest/teamNetworkAuthSchemas.js +103 -0
  372. package/dist/manifest/teamNetworkSchemas.d.ts +8 -187
  373. package/dist/manifest/teamNetworkSchemas.js +3 -317
  374. package/dist/manifest/teamNetworkServerSchemas.d.ts +150 -0
  375. package/dist/manifest/teamNetworkServerSchemas.js +199 -0
  376. package/dist/ownership/siblingBuildFreshness.d.ts +20 -0
  377. package/dist/ownership/siblingBuildFreshness.js +20 -0
  378. package/dist/ownership/simfileRunOperatorInputs.d.ts +103 -0
  379. package/dist/ownership/simfileRunOperatorInputs.js +139 -0
  380. package/dist/report/types.d.ts +142 -0
  381. package/dist/runtime/common.d.ts +35 -0
  382. package/dist/runtime/common.js +55 -0
  383. package/dist/runtime/container.d.ts +28 -1
  384. package/dist/runtime/container.js +38 -5
  385. package/dist/runtime/containerPackageOverrides.d.ts +37 -0
  386. package/dist/runtime/containerPackageOverrides.js +33 -0
  387. package/dist/runtime/index.d.ts +2 -0
  388. package/dist/runtime/index.js +2 -0
  389. package/dist/runtime/mnemeMcp.d.ts +15 -0
  390. package/dist/runtime/mnemeMcp.js +109 -0
  391. package/dist/runtime/openclaw/adapter.js +15 -4
  392. package/dist/runtime/openclaw/mcp.d.ts +10 -0
  393. package/dist/runtime/openclaw/mcp.js +69 -0
  394. package/dist/runtime/openclaw/runAuth.js +2 -2
  395. package/dist/runtime/openclaw/scaffold.js +1 -1
  396. package/dist/runtime/openclaw/schedules.d.ts +38 -0
  397. package/dist/runtime/openclaw/schedules.js +74 -0
  398. package/dist/runtime/pi/adapter.d.ts +1 -1
  399. package/dist/runtime/pi/adapter.js +86 -53
  400. package/dist/runtime/pi/appActivitySource.js +114 -2
  401. package/dist/runtime/pi/appAgentConfig.d.ts +11 -0
  402. package/dist/runtime/pi/appAgentConfig.js +264 -0
  403. package/dist/runtime/pi/appCliEnginesSource.d.ts +1 -0
  404. package/dist/runtime/pi/appCliEnginesSource.js +183 -0
  405. package/dist/runtime/pi/appCliSource.d.ts +1 -0
  406. package/dist/runtime/pi/appCliSource.js +353 -0
  407. package/dist/runtime/pi/appControlSource.d.ts +1 -0
  408. package/dist/runtime/pi/appControlSource.js +390 -0
  409. package/dist/runtime/pi/appControlWakeIdentitySource.d.ts +1 -0
  410. package/dist/runtime/pi/appControlWakeIdentitySource.js +19 -0
  411. package/dist/runtime/pi/appCoreSource.d.ts +4 -1
  412. package/dist/runtime/pi/appCoreSource.js +104 -214
  413. package/dist/runtime/pi/appPreludeSource.js +140 -52
  414. package/dist/runtime/pi/appScheduleSource.d.ts +1 -0
  415. package/dist/runtime/pi/appScheduleSource.js +80 -0
  416. package/dist/runtime/pi/appScriptedEngine.d.ts +31 -0
  417. package/dist/runtime/pi/appScriptedEngine.js +42 -0
  418. package/dist/runtime/pi/appSource.d.ts +4 -1
  419. package/dist/runtime/pi/appSource.js +6 -2
  420. package/dist/runtime/pi/appTemplate.d.ts +8 -22
  421. package/dist/runtime/pi/appTemplate.js +9 -126
  422. package/dist/runtime/pi/appTemplateTypes.d.ts +64 -0
  423. package/dist/runtime/pi/appTemplateTypes.js +18 -0
  424. package/dist/runtime/pi/appWakeContextSource.d.ts +1 -0
  425. package/dist/runtime/pi/appWakeContextSource.js +398 -0
  426. package/dist/runtime/pi/containerTargets.d.ts +4 -0
  427. package/dist/runtime/pi/containerTargets.js +57 -0
  428. package/dist/runtime/pi/runAuth.js +126 -9
  429. package/dist/runtime/pi/testHelpers.d.ts +2 -0
  430. package/dist/runtime/pi/testHelpers.js +40 -0
  431. package/dist/runtime/picoclaw/adapter.js +23 -27
  432. package/dist/runtime/picoclaw/mcp.d.ts +4 -0
  433. package/dist/runtime/picoclaw/mcp.js +43 -0
  434. package/dist/runtime/picoclaw/memory.d.ts +7 -0
  435. package/dist/runtime/picoclaw/memory.js +17 -0
  436. package/dist/runtime/picoclaw/runAuth.js +1 -1
  437. package/dist/runtime/picoclaw/scaffold.js +1 -1
  438. package/dist/runtime/picoclaw/schedules.d.ts +26 -0
  439. package/dist/runtime/picoclaw/schedules.js +62 -3
  440. package/dist/runtime/scheduleUtils.d.ts +2 -0
  441. package/dist/runtime/scheduleUtils.js +15 -0
  442. package/dist/runtime/types.d.ts +25 -2
  443. package/dist/shared/errors.d.ts +1 -1
  444. package/dist/shared/errors.js +2 -2
  445. package/dist/shared/index.d.ts +1 -0
  446. package/dist/shared/index.js +1 -0
  447. package/dist/shared/redaction.d.ts +2 -0
  448. package/dist/shared/redaction.js +10 -0
  449. package/dist/status/buildStatus.d.ts +1 -0
  450. package/dist/status/buildStatus.js +2 -0
  451. package/dist/status/compileReport.d.ts +22 -0
  452. package/dist/status/compileReport.js +16 -2
  453. package/dist/status/compiledProbeCollection.d.ts +21 -0
  454. package/dist/status/compiledProbeCollection.js +27 -0
  455. package/dist/status/imageStatusReport.js +6 -0
  456. package/dist/status/index.d.ts +3 -0
  457. package/dist/status/index.js +3 -0
  458. package/dist/status/lifecycleProbes.d.ts +19 -0
  459. package/dist/status/lifecycleProbes.js +174 -0
  460. package/dist/status/moltnetProbes.d.ts +7 -8
  461. package/dist/status/moltnetProbes.js +27 -198
  462. package/dist/status/moltnetWiringProbes.d.ts +19 -0
  463. package/dist/status/moltnetWiringProbes.js +178 -0
  464. package/dist/target/cleanupRun.d.ts +41 -0
  465. package/dist/target/cleanupRun.js +139 -0
  466. package/dist/target/cleanupRunDocker.d.ts +16 -0
  467. package/dist/target/cleanupRunDocker.js +66 -0
  468. package/dist/target/cleanupRunDocker.test-helper.d.ts +67 -0
  469. package/dist/target/cleanupRunDocker.test-helper.js +238 -0
  470. package/dist/target/cleanupRunDockerPreflight.d.ts +17 -0
  471. package/dist/target/cleanupRunDockerPreflight.js +224 -0
  472. package/dist/target/composedPreparation.d.ts +205 -0
  473. package/dist/target/composedPreparation.js +223 -0
  474. package/dist/target/containerBundle.d.ts +82 -0
  475. package/dist/target/containerBundle.js +243 -0
  476. package/dist/target/containerBundleArchive.d.ts +31 -0
  477. package/dist/target/containerBundleArchive.js +140 -0
  478. package/dist/target/containerBundleAuthority.d.ts +25 -0
  479. package/dist/target/containerBundleAuthority.js +65 -0
  480. package/dist/target/containerBundleContracts.d.ts +114 -0
  481. package/dist/target/containerBundleContracts.js +173 -0
  482. package/dist/target/containerBundleFilesystemStore.d.ts +3 -0
  483. package/dist/target/containerBundleFilesystemStore.js +247 -0
  484. package/dist/target/containerBundlePolicy.d.ts +33 -0
  485. package/dist/target/containerBundlePolicy.js +64 -0
  486. package/dist/target/containerBundleStore.d.ts +127 -0
  487. package/dist/target/containerBundleStore.js +284 -0
  488. package/dist/target/contracts.d.ts +538 -0
  489. package/dist/target/contracts.js +373 -0
  490. package/dist/target/dockerArtifactIdentityTypes.d.ts +56 -0
  491. package/dist/target/dockerArtifactIdentityTypes.js +1 -0
  492. package/dist/target/dockerArtifactInspection.d.ts +40 -0
  493. package/dist/target/dockerArtifactInspection.js +125 -0
  494. package/dist/target/dockerArtifacts.d.ts +21 -0
  495. package/dist/target/dockerArtifacts.js +110 -0
  496. package/dist/target/dockerArtifactsProvider.d.ts +41 -0
  497. package/dist/target/dockerArtifactsProvider.js +449 -0
  498. package/dist/target/dockerCommandExecutor.d.ts +27 -0
  499. package/dist/target/dockerCommandExecutor.js +200 -0
  500. package/dist/target/dockerCommandExecutorCore.d.ts +34 -0
  501. package/dist/target/dockerCommandExecutorCore.js +273 -0
  502. package/dist/target/dockerContainerBundleBuilder.d.ts +8 -0
  503. package/dist/target/dockerContainerBundleBuilder.js +256 -0
  504. package/dist/target/dockerContextSnapshot.d.ts +21 -0
  505. package/dist/target/dockerContextSnapshot.js +158 -0
  506. package/dist/target/dockerEndpointFingerprint.d.ts +1 -0
  507. package/dist/target/dockerEndpointFingerprint.js +9 -0
  508. package/dist/target/dockerPreparedArtifact.d.ts +48 -0
  509. package/dist/target/dockerPreparedArtifact.js +131 -0
  510. package/dist/target/dockerProjectionJson.d.ts +1 -0
  511. package/dist/target/dockerProjectionJson.js +80 -0
  512. package/dist/target/dockerPublicArtifactSnapshot.d.ts +17 -0
  513. package/dist/target/dockerPublicArtifactSnapshot.js +99 -0
  514. package/dist/target/dockerResources.d.ts +26 -0
  515. package/dist/target/dockerResources.js +162 -0
  516. package/dist/target/dockerResourcesProvider.d.ts +44 -0
  517. package/dist/target/dockerResourcesProvider.js +207 -0
  518. package/dist/target/dockerSecrets.d.ts +39 -0
  519. package/dist/target/dockerSecrets.js +249 -0
  520. package/dist/target/dockerSecretsAuthority.d.ts +26 -0
  521. package/dist/target/dockerSecretsAuthority.js +216 -0
  522. package/dist/target/dockerSecretsLifecycle.d.ts +25 -0
  523. package/dist/target/dockerSecretsLifecycle.js +133 -0
  524. package/dist/target/dockerSecretsProvider.d.ts +68 -0
  525. package/dist/target/dockerSecretsProvider.js +329 -0
  526. package/dist/target/dockerTarget.d.ts +52 -0
  527. package/dist/target/dockerTarget.js +48 -0
  528. package/dist/target/dockerTargetBinding.d.ts +14 -0
  529. package/dist/target/dockerTargetBinding.js +96 -0
  530. package/dist/target/dockerWorldClock.d.ts +17 -0
  531. package/dist/target/dockerWorldClock.js +111 -0
  532. package/dist/target/dockerWorldReadiness.d.ts +17 -0
  533. package/dist/target/dockerWorldReadiness.js +119 -0
  534. package/dist/target/dockerWorldService.d.ts +23 -0
  535. package/dist/target/dockerWorldService.js +216 -0
  536. package/dist/target/dockerWorldServiceAuthority.d.ts +80 -0
  537. package/dist/target/dockerWorldServiceAuthority.js +182 -0
  538. package/dist/target/dockerWorldServiceLifecycle.d.ts +41 -0
  539. package/dist/target/dockerWorldServiceLifecycle.js +275 -0
  540. package/dist/target/dockerWorldServiceProvider.d.ts +60 -0
  541. package/dist/target/dockerWorldServiceProvider.js +318 -0
  542. package/dist/target/dockerWorldServiceStore.d.ts +73 -0
  543. package/dist/target/dockerWorldServiceStore.js +367 -0
  544. package/dist/target/evidenceExport.d.ts +55 -0
  545. package/dist/target/evidenceExport.js +518 -0
  546. package/dist/target/evidenceExportArchive.d.ts +10 -0
  547. package/dist/target/evidenceExportArchive.js +302 -0
  548. package/dist/target/evidenceExportContract.d.ts +27 -0
  549. package/dist/target/evidenceExportContract.js +40 -0
  550. package/dist/target/evidenceExportOperationsTestKit.d.ts +87 -0
  551. package/dist/target/evidenceExportOperationsTestKit.js +312 -0
  552. package/dist/target/evidenceExportProvider.d.ts +85 -0
  553. package/dist/target/evidenceExportProvider.js +187 -0
  554. package/dist/target/evidenceExportPublicationTypes.d.ts +16 -0
  555. package/dist/target/evidenceExportPublicationTypes.js +1 -0
  556. package/dist/target/evidenceExportStore.d.ts +70 -0
  557. package/dist/target/evidenceExportStore.js +498 -0
  558. package/dist/target/evidenceExportStorePublication.d.ts +7 -0
  559. package/dist/target/evidenceExportStorePublication.js +395 -0
  560. package/dist/target/handles.d.ts +20 -0
  561. package/dist/target/handles.js +56 -0
  562. package/dist/target/index.d.ts +12 -0
  563. package/dist/target/index.js +11 -0
  564. package/dist/target/journal.d.ts +59 -0
  565. package/dist/target/journal.js +529 -0
  566. package/dist/target/journalFilesystem.d.ts +3 -0
  567. package/dist/target/journalFilesystem.js +111 -0
  568. package/dist/target/journalRoot.d.ts +4 -0
  569. package/dist/target/journalRoot.js +6 -0
  570. package/dist/target/organizationAttachment.d.ts +23 -0
  571. package/dist/target/organizationAttachment.js +263 -0
  572. package/dist/target/organizationAttachmentAuthority.d.ts +65 -0
  573. package/dist/target/organizationAttachmentAuthority.js +161 -0
  574. package/dist/target/organizationAttachmentLifecycle.d.ts +17 -0
  575. package/dist/target/organizationAttachmentLifecycle.js +101 -0
  576. package/dist/target/organizationAttachmentProvider.d.ts +76 -0
  577. package/dist/target/organizationAttachmentProvider.js +289 -0
  578. package/dist/target/organizationAttachmentStore.d.ts +51 -0
  579. package/dist/target/organizationAttachmentStore.js +316 -0
  580. package/dist/target/publicArtifactSnapshot.d.ts +41 -0
  581. package/dist/target/publicArtifactSnapshot.js +150 -0
  582. package/dist/target/topologyActivation.d.ts +51 -0
  583. package/dist/target/topologyActivation.js +149 -0
  584. package/dist/target/topologyAttestation.d.ts +37 -0
  585. package/dist/target/topologyAttestation.js +300 -0
  586. package/dist/target/topologyAttestationErrors.d.ts +1 -0
  587. package/dist/target/topologyAttestationErrors.js +1 -0
  588. package/dist/target/worldClock.d.ts +60 -0
  589. package/dist/target/worldClock.js +129 -0
  590. package/dist/target/worldReadiness.d.ts +103 -0
  591. package/dist/target/worldReadiness.js +153 -0
  592. package/moltnet-releases.json +20 -0
  593. package/package.json +27 -11
  594. package/runtimes.yaml +8 -23
  595. package/dist/runtime/openclaw/scaffold-assets/CLAUDE.md +0 -5
  596. package/dist/runtime/picoclaw/scaffold-assets/CLAUDE.md +0 -5
  597. /package/dist/runtime/openclaw/scaffold-assets/{AGENTS.md → WORKSPACE_AGENTS.md} +0 -0
  598. /package/dist/runtime/picoclaw/scaffold-assets/{AGENTS.md → WORKSPACE_AGENTS.md} +0 -0
@@ -0,0 +1,37 @@
1
+ import { type LifecycleAmbiguousReason, type LifecycleCompletion, type LifecycleInvocation, type LifecycleOwnerCapability } from "./lifecycleCompletionContracts.js";
2
+ import { resolveLifecycleCompletionDirectory, resolveLifecycleCompletionPath } from "./lifecycleCompletionStore.js";
3
+ export { LIFECYCLE_COMPLETION_VERSION, LIFECYCLE_INVOCATION_VERSION, LIFECYCLE_LOOKUP_VERSION, type LifecycleCompletion, type LifecycleInvocation, type LifecycleLookup, type LifecycleOwnerCapability, } from "./lifecycleCompletionContracts.js";
4
+ export { resolveLifecycleCompletionDirectory, resolveLifecycleCompletionPath };
5
+ export declare const findLifecycleInvocation: (id: string) => Promise<{
6
+ correlation: Record<string, string | number | boolean | null>;
7
+ id: string;
8
+ operation: "down" | "up" | "artifacts_export";
9
+ request_policy: Record<string, string | number | boolean | null>;
10
+ version: "spawnfile.lifecycle-invocation.v1";
11
+ } | null>;
12
+ /**
13
+ * Durably reserves one exact effect-free lifecycle plan. Execution later
14
+ * promotes the same bytes to an admission or refuses id drift.
15
+ */
16
+ export declare const admitLifecyclePlan: (raw: LifecycleInvocation) => Promise<LifecycleInvocation>;
17
+ export declare const findExactLifecycleCompletion: (invocation: LifecycleInvocation) => Promise<LifecycleCompletion | null>;
18
+ export declare const claimLifecycleInvocation: (raw: LifecycleInvocation) => Promise<{
19
+ readonly capability: {
20
+ readonly epoch: string;
21
+ readonly role: "initial";
22
+ };
23
+ readonly status: "owner";
24
+ } | {
25
+ readonly status: "pending" | "replay";
26
+ readonly capability?: undefined;
27
+ }>;
28
+ export declare const claimLifecycleRecovery: (raw: LifecycleInvocation) => Promise<import("./lifecycleCompletionRecovery.js").LifecycleRecoveryClaim>;
29
+ export declare const renewLifecycleOwner: (raw: LifecycleInvocation, capability: LifecycleOwnerCapability) => Promise<void>;
30
+ export declare const recordLifecycleOutcomeEvidence: (raw: LifecycleInvocation, outcomeBytes: string, capability: LifecycleOwnerCapability, deploymentInstanceDigest: string) => Promise<void>;
31
+ export declare const findLifecycleOutcomeEvidence: (raw: LifecycleInvocation) => Promise<{
32
+ completion: LifecycleCompletion;
33
+ deployment_instance_digest: string;
34
+ } | null>;
35
+ export declare const completeLifecycleInvocation: (raw: LifecycleInvocation, outcomeBytes: string, capability: LifecycleOwnerCapability) => Promise<LifecycleCompletion>;
36
+ export declare const markLifecycleAmbiguous: (raw: LifecycleInvocation, reasonCode: LifecycleAmbiguousReason, capability: LifecycleOwnerCapability) => Promise<void>;
37
+ export declare const lookupLifecycleCompletion: (id: string) => Promise<import("./lifecycleCompletionContracts.js").LifecycleLookup>;
@@ -0,0 +1,236 @@
1
+ import path from "node:path";
2
+ import { readSettledLifecycleRecord } from "./lifecycleCompletionPublication.js";
3
+ import { canonicalLifecycleJson, lifecycleIdSchema, LIFECYCLE_COMPLETION_VERSION, LIFECYCLE_TERMINAL_VERSION, } from "./lifecycleCompletionContracts.js";
4
+ import { findLifecycleInvocationRecord, lookupLifecycleCompletionRecord, } from "./lifecycleCompletionLookup.js";
5
+ import { writeLifecycleHeartbeat } from "./lifecycleCompletionHeartbeat.js";
6
+ import { assertLifecycleOwnerCapability, createLifecycleAdmission, } from "./lifecycleCompletionOwner.js";
7
+ import { parseLifecycleAdmission, parseLifecycleCompletedTerminal, parseLifecycleCompletion, parseLifecycleHeartbeat, parseLifecycleInvocation, } from "./lifecycleCompletionParsing.js";
8
+ import { claimLifecycleRecoveryRecord, markLifecycleAmbiguousRecord, } from "./lifecycleCompletionRecovery.js";
9
+ import { admissionPath, evidencePath, existingLifecycleRoot as existingRoot, failLifecycleStore as fail, heartbeatPath, lifecycleRecordName as name, lifecycleRoot as root, planPath, publishLifecycleRecord as publish, readLifecycleRecord as read, recoveryPath, resolveLifecycleCompletionDirectory, resolveLifecycleCompletionPath, syncLifecycleDirectory as sync, } from "./lifecycleCompletionStore.js";
10
+ export { LIFECYCLE_COMPLETION_VERSION, LIFECYCLE_INVOCATION_VERSION, LIFECYCLE_LOOKUP_VERSION, } from "./lifecycleCompletionContracts.js";
11
+ const canonical = canonicalLifecycleJson;
12
+ export { resolveLifecycleCompletionDirectory, resolveLifecycleCompletionPath };
13
+ const exactAdmission = async (invocation) => {
14
+ const text = await readSettledLifecycleRecord(admissionPath(invocation.id), read);
15
+ if (text === null)
16
+ return null;
17
+ const stored = parseLifecycleAdmission(text);
18
+ if (canonical(stored.invocation) !== canonical(invocation))
19
+ fail("invocation id drift");
20
+ return stored;
21
+ };
22
+ const exactCompletion = async (invocation) => {
23
+ const text = await readSettledLifecycleRecord(resolveLifecycleCompletionPath(invocation.id), read);
24
+ if (text === null)
25
+ return null;
26
+ const stored = parseLifecycleCompletedTerminal(text);
27
+ if (canonical(stored.invocation) !== canonical(invocation))
28
+ fail("invocation id drift");
29
+ return stored;
30
+ };
31
+ export const findLifecycleInvocation = (id) => (async () => {
32
+ const parsed = lifecycleIdSchema.safeParse(id);
33
+ if (!parsed.success)
34
+ fail("invalid invocation id");
35
+ if ((await existingRoot()) === null)
36
+ return null;
37
+ const value = parsed.data;
38
+ const admitted = await findLifecycleInvocationRecord(value, {
39
+ admissionPath,
40
+ existingRoot,
41
+ read: (file) => readSettledLifecycleRecord(file, read),
42
+ });
43
+ if (admitted)
44
+ return admitted;
45
+ const text = await readSettledLifecycleRecord(planPath(value), read);
46
+ if (text === null)
47
+ return null;
48
+ let raw;
49
+ try {
50
+ raw = JSON.parse(text);
51
+ }
52
+ catch {
53
+ fail("corrupt lifecycle plan");
54
+ }
55
+ const planned = parseLifecycleInvocation(raw);
56
+ if (`${canonical(planned)}\n` !== text)
57
+ fail("corrupt lifecycle plan");
58
+ return planned;
59
+ })();
60
+ const exactPlan = async (invocation) => {
61
+ const text = await readSettledLifecycleRecord(planPath(invocation.id), read);
62
+ if (text === null)
63
+ return null;
64
+ let raw;
65
+ try {
66
+ raw = JSON.parse(text);
67
+ }
68
+ catch {
69
+ fail("corrupt lifecycle plan");
70
+ }
71
+ const stored = parseLifecycleInvocation(raw);
72
+ if (`${canonical(stored)}\n` !== text ||
73
+ canonical(stored) !== canonical(invocation))
74
+ fail("invocation id drift");
75
+ return stored;
76
+ };
77
+ /**
78
+ * Durably reserves one exact effect-free lifecycle plan. Execution later
79
+ * promotes the same bytes to an admission or refuses id drift.
80
+ */
81
+ export const admitLifecyclePlan = async (raw) => {
82
+ const invocation = parseLifecycleInvocation(raw);
83
+ const directory = await root();
84
+ const admitted = await exactAdmission(invocation);
85
+ const completed = await exactCompletion(invocation);
86
+ if (completed && !admitted)
87
+ fail("completion without admission");
88
+ if (admitted)
89
+ return invocation;
90
+ const content = `${canonical(invocation)}\n`;
91
+ await publish(directory, name(invocation.id, "plan"), content);
92
+ await exactPlan(invocation);
93
+ // Close the plan-vs-execution race: an admission published concurrently is
94
+ // authoritative and must contain the same invocation bytes.
95
+ await exactAdmission(invocation);
96
+ return invocation;
97
+ };
98
+ export const findExactLifecycleCompletion = async (invocation) => {
99
+ const parsed = parseLifecycleInvocation(invocation);
100
+ await root();
101
+ const admission = await exactAdmission(parsed);
102
+ const completion = await exactCompletion(parsed);
103
+ if (completion && !admission)
104
+ fail("completion without admission");
105
+ return completion;
106
+ };
107
+ export const claimLifecycleInvocation = async (raw) => {
108
+ const invocation = parseLifecycleInvocation(raw);
109
+ const directory = await root();
110
+ const admission = await exactAdmission(invocation);
111
+ // An existing admission is authoritative. Otherwise a prior read-only plan
112
+ // reserves this id and must match before we publish the first effect owner.
113
+ if (!admission)
114
+ await exactPlan(invocation);
115
+ const completion = await exactCompletion(invocation);
116
+ if (completion && !admission)
117
+ fail("completion without admission");
118
+ if (completion)
119
+ return { status: "replay" };
120
+ const createdAdmission = createLifecycleAdmission(invocation);
121
+ const content = `${canonical(createdAdmission)}\n`;
122
+ const created = await publish(directory, name(invocation.id, "admission"), content, "ignore");
123
+ if (created)
124
+ return {
125
+ capability: { epoch: createdAdmission.owner.epoch, role: "initial" },
126
+ status: "owner",
127
+ };
128
+ await exactAdmission(invocation);
129
+ return {
130
+ status: (await exactCompletion(invocation)) ? "replay" : "pending",
131
+ };
132
+ };
133
+ export const claimLifecycleRecovery = async (raw) => {
134
+ const invocation = parseLifecycleInvocation(raw);
135
+ const directory = await root();
136
+ return claimLifecycleRecoveryRecord(invocation, {
137
+ exactAdmission,
138
+ exactCompletion,
139
+ publish: (value, kind, content) => publish(directory, name(value.id, kind), content, kind === "recovery" ? "ignore" : "match"),
140
+ readRecovery: (value) => readSettledLifecycleRecord(recoveryPath(value.id), read),
141
+ readHeartbeat: async (value) => {
142
+ const text = await readSettledLifecycleRecord(heartbeatPath(value.id), read);
143
+ return text ? parseLifecycleHeartbeat(text) : null;
144
+ },
145
+ });
146
+ };
147
+ export const renewLifecycleOwner = async (raw, capability) => {
148
+ const invocation = parseLifecycleInvocation(raw);
149
+ const directory = await root();
150
+ const admitted = await exactAdmission(invocation);
151
+ const exactAdmitted = admitted ?? fail("missing admission");
152
+ const recoveryText = await readSettledLifecycleRecord(recoveryPath(invocation.id), read);
153
+ const recovered = recoveryText ? parseLifecycleAdmission(recoveryText) : null;
154
+ assertLifecycleOwnerCapability(invocation, exactAdmitted, recovered, capability);
155
+ await writeLifecycleHeartbeat(directory, path.basename(heartbeatPath(invocation.id)), capability.epoch, sync);
156
+ };
157
+ const assertActiveCapability = async (invocation, capability) => {
158
+ const admitted = await exactAdmission(invocation);
159
+ const exactAdmitted = admitted ?? fail("missing admission");
160
+ const recoveryText = await readSettledLifecycleRecord(recoveryPath(invocation.id), read);
161
+ const recovered = recoveryText ? parseLifecycleAdmission(recoveryText) : null;
162
+ assertLifecycleOwnerCapability(invocation, exactAdmitted, recovered, capability);
163
+ };
164
+ export const recordLifecycleOutcomeEvidence = async (raw, outcomeBytes, capability, deploymentInstanceDigest) => {
165
+ const invocation = parseLifecycleInvocation(raw);
166
+ const directory = await root();
167
+ await assertActiveCapability(invocation, capability);
168
+ const evidence = parseLifecycleCompletion(`${canonical({
169
+ invocation,
170
+ outcome_bytes: outcomeBytes,
171
+ version: LIFECYCLE_COMPLETION_VERSION,
172
+ })}\n`);
173
+ await publish(directory, name(invocation.id, "evidence"), `${canonical({
174
+ completion: evidence,
175
+ deployment_instance_digest: deploymentInstanceDigest,
176
+ version: "spawnfile.lifecycle-evidence.v1",
177
+ })}\n`);
178
+ };
179
+ export const findLifecycleOutcomeEvidence = async (raw) => {
180
+ const invocation = parseLifecycleInvocation(raw);
181
+ await root();
182
+ await exactAdmission(invocation);
183
+ const text = await readSettledLifecycleRecord(evidencePath(invocation.id), read);
184
+ if (text === null)
185
+ return null;
186
+ const rawEvidence = JSON.parse(text);
187
+ if (rawEvidence.version !== "spawnfile.lifecycle-evidence.v1" ||
188
+ typeof rawEvidence.deployment_instance_digest !== "string")
189
+ fail("invalid outcome evidence");
190
+ const deploymentInstanceDigest = rawEvidence.deployment_instance_digest;
191
+ const evidence = parseLifecycleCompletion(`${canonical(rawEvidence.completion)}\n`);
192
+ if (`${canonical(rawEvidence)}\n` !== text ||
193
+ canonical(evidence.invocation) !== canonical(invocation))
194
+ fail("invocation id drift");
195
+ return {
196
+ completion: evidence,
197
+ deployment_instance_digest: deploymentInstanceDigest,
198
+ };
199
+ };
200
+ export const completeLifecycleInvocation = async (raw, outcomeBytes, capability) => {
201
+ const invocation = parseLifecycleInvocation(raw);
202
+ const directory = await root();
203
+ await assertActiveCapability(invocation, capability);
204
+ const completion = parseLifecycleCompletion(`${canonical({ invocation, outcome_bytes: outcomeBytes, version: LIFECYCLE_COMPLETION_VERSION })}\n`);
205
+ await publish(directory, name(invocation.id, "completion"), `${canonical({
206
+ completion,
207
+ status: "completed",
208
+ version: LIFECYCLE_TERMINAL_VERSION,
209
+ })}\n`);
210
+ const stored = await exactCompletion(invocation);
211
+ if (!stored)
212
+ fail("missing completion");
213
+ return parseLifecycleCompletion(`${canonical(stored)}\n`);
214
+ };
215
+ export const markLifecycleAmbiguous = async (raw, reasonCode, capability) => {
216
+ const invocation = parseLifecycleInvocation(raw);
217
+ const directory = await root();
218
+ await markLifecycleAmbiguousRecord(invocation, reasonCode, capability, {
219
+ exactAdmission,
220
+ exactCompletion,
221
+ publish: (value, kind, content) => publish(directory, name(value.id, kind), content),
222
+ readRecovery: (value) => readSettledLifecycleRecord(recoveryPath(value.id), read),
223
+ readHeartbeat: async (value) => {
224
+ const text = await readSettledLifecycleRecord(heartbeatPath(value.id), read);
225
+ return text ? parseLifecycleHeartbeat(text) : null;
226
+ },
227
+ });
228
+ };
229
+ export const lookupLifecycleCompletion = (id) => lookupLifecycleCompletionRecord(id, {
230
+ admissionPath,
231
+ completionPath: resolveLifecycleCompletionPath,
232
+ existingRoot,
233
+ heartbeatPath,
234
+ read: (file) => readSettledLifecycleRecord(file, read),
235
+ recoveryPath,
236
+ });
@@ -0,0 +1,158 @@
1
+ import { z } from "zod";
2
+ export declare const LIFECYCLE_INVOCATION_VERSION: "spawnfile.lifecycle-invocation.v1";
3
+ export declare const LIFECYCLE_COMPLETION_VERSION: "spawnfile.lifecycle-completion.v1";
4
+ export declare const LIFECYCLE_LOOKUP_VERSION: "spawnfile.lifecycle-lookup.v1";
5
+ export declare const LIFECYCLE_OWNER_VERSION: "spawnfile.lifecycle-owner.v1";
6
+ export declare const LIFECYCLE_ADMISSION_VERSION: "spawnfile.lifecycle-admission.v1";
7
+ export declare const LIFECYCLE_AMBIGUOUS_VERSION: "spawnfile.lifecycle-ambiguous.v1";
8
+ export declare const LIFECYCLE_TERMINAL_VERSION: "spawnfile.lifecycle-terminal.v1";
9
+ export declare const LIFECYCLE_RECORD_MAX_BYTES = 1000000;
10
+ export declare const lifecycleIdSchema: z.ZodString;
11
+ export declare const lifecycleInvocationSchema: z.ZodObject<{
12
+ correlation: z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber, z.ZodNull]>>;
13
+ id: z.ZodString;
14
+ operation: z.ZodEnum<{
15
+ down: "down";
16
+ up: "up";
17
+ artifacts_export: "artifacts_export";
18
+ }>;
19
+ request_policy: z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber, z.ZodNull]>>;
20
+ version: z.ZodLiteral<"spawnfile.lifecycle-invocation.v1">;
21
+ }, z.core.$strict>;
22
+ export type LifecycleInvocation = z.infer<typeof lifecycleInvocationSchema>;
23
+ export declare const lifecycleOwnerSchema: z.ZodObject<{
24
+ epoch: z.ZodString;
25
+ lease_expires_at: z.ZodNumber;
26
+ pid: z.ZodNumber;
27
+ version: z.ZodLiteral<"spawnfile.lifecycle-owner.v1">;
28
+ }, z.core.$strict>;
29
+ export type LifecycleOwner = z.infer<typeof lifecycleOwnerSchema>;
30
+ export declare const LIFECYCLE_HEARTBEAT_VERSION: "spawnfile.lifecycle-heartbeat.v1";
31
+ export declare const lifecycleHeartbeatSchema: z.ZodObject<{
32
+ epoch: z.ZodString;
33
+ lease_expires_at: z.ZodNumber;
34
+ version: z.ZodLiteral<"spawnfile.lifecycle-heartbeat.v1">;
35
+ }, z.core.$strict>;
36
+ export type LifecycleHeartbeat = z.infer<typeof lifecycleHeartbeatSchema>;
37
+ export interface LifecycleOwnerCapability {
38
+ epoch: string;
39
+ role: "initial" | "recovery";
40
+ }
41
+ export type LifecycleClaim = {
42
+ capability: LifecycleOwnerCapability;
43
+ status: "owner";
44
+ } | {
45
+ status: "pending" | "replay";
46
+ };
47
+ export declare const lifecycleAdmissionSchema: z.ZodObject<{
48
+ invocation: z.ZodObject<{
49
+ correlation: z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber, z.ZodNull]>>;
50
+ id: z.ZodString;
51
+ operation: z.ZodEnum<{
52
+ down: "down";
53
+ up: "up";
54
+ artifacts_export: "artifacts_export";
55
+ }>;
56
+ request_policy: z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber, z.ZodNull]>>;
57
+ version: z.ZodLiteral<"spawnfile.lifecycle-invocation.v1">;
58
+ }, z.core.$strict>;
59
+ owner: z.ZodObject<{
60
+ epoch: z.ZodString;
61
+ lease_expires_at: z.ZodNumber;
62
+ pid: z.ZodNumber;
63
+ version: z.ZodLiteral<"spawnfile.lifecycle-owner.v1">;
64
+ }, z.core.$strict>;
65
+ version: z.ZodLiteral<"spawnfile.lifecycle-admission.v1">;
66
+ }, z.core.$strict>;
67
+ export type LifecycleAdmission = z.infer<typeof lifecycleAdmissionSchema>;
68
+ export declare const lifecycleAmbiguousReasonSchema: z.ZodEnum<{
69
+ reconciliation_ambiguous: "reconciliation_ambiguous";
70
+ recovery_owner_died: "recovery_owner_died";
71
+ }>;
72
+ export type LifecycleAmbiguousReason = z.infer<typeof lifecycleAmbiguousReasonSchema>;
73
+ export declare const lifecycleAmbiguousSchema: z.ZodObject<{
74
+ invocation_digest: z.ZodString;
75
+ reason_code: z.ZodEnum<{
76
+ reconciliation_ambiguous: "reconciliation_ambiguous";
77
+ recovery_owner_died: "recovery_owner_died";
78
+ }>;
79
+ version: z.ZodLiteral<"spawnfile.lifecycle-ambiguous.v1">;
80
+ }, z.core.$strict>;
81
+ export declare const lifecycleCompletionSchema: z.ZodObject<{
82
+ invocation: z.ZodObject<{
83
+ correlation: z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber, z.ZodNull]>>;
84
+ id: z.ZodString;
85
+ operation: z.ZodEnum<{
86
+ down: "down";
87
+ up: "up";
88
+ artifacts_export: "artifacts_export";
89
+ }>;
90
+ request_policy: z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber, z.ZodNull]>>;
91
+ version: z.ZodLiteral<"spawnfile.lifecycle-invocation.v1">;
92
+ }, z.core.$strict>;
93
+ outcome_bytes: z.ZodString;
94
+ version: z.ZodLiteral<"spawnfile.lifecycle-completion.v1">;
95
+ }, z.core.$strict>;
96
+ export type LifecycleCompletion = z.infer<typeof lifecycleCompletionSchema>;
97
+ export declare const lifecycleTerminalSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
98
+ completion: z.ZodObject<{
99
+ invocation: z.ZodObject<{
100
+ correlation: z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber, z.ZodNull]>>;
101
+ id: z.ZodString;
102
+ operation: z.ZodEnum<{
103
+ down: "down";
104
+ up: "up";
105
+ artifacts_export: "artifacts_export";
106
+ }>;
107
+ request_policy: z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber, z.ZodNull]>>;
108
+ version: z.ZodLiteral<"spawnfile.lifecycle-invocation.v1">;
109
+ }, z.core.$strict>;
110
+ outcome_bytes: z.ZodString;
111
+ version: z.ZodLiteral<"spawnfile.lifecycle-completion.v1">;
112
+ }, z.core.$strict>;
113
+ status: z.ZodLiteral<"completed">;
114
+ version: z.ZodLiteral<"spawnfile.lifecycle-terminal.v1">;
115
+ }, z.core.$strict>, z.ZodObject<{
116
+ ambiguous: z.ZodObject<{
117
+ invocation_digest: z.ZodString;
118
+ reason_code: z.ZodEnum<{
119
+ reconciliation_ambiguous: "reconciliation_ambiguous";
120
+ recovery_owner_died: "recovery_owner_died";
121
+ }>;
122
+ version: z.ZodLiteral<"spawnfile.lifecycle-ambiguous.v1">;
123
+ }, z.core.$strict>;
124
+ status: z.ZodLiteral<"ambiguous">;
125
+ version: z.ZodLiteral<"spawnfile.lifecycle-terminal.v1">;
126
+ }, z.core.$strict>], "status">;
127
+ export type LifecycleTerminal = z.infer<typeof lifecycleTerminalSchema>;
128
+ export declare const lifecycleExportOutcomeSchema: z.ZodObject<{
129
+ deployment: z.ZodString;
130
+ failed_files: z.ZodArray<z.ZodString>;
131
+ index: z.ZodUnknown;
132
+ index_path: z.ZodString;
133
+ missing_optional_files: z.ZodArray<z.ZodString>;
134
+ }, z.core.$strict>;
135
+ export type LifecycleLookup = {
136
+ invocation_id: string;
137
+ status: "not_applied";
138
+ version: typeof LIFECYCLE_LOOKUP_VERSION;
139
+ } | {
140
+ invocation_digest: string;
141
+ operation: LifecycleInvocation["operation"];
142
+ outcome_bytes: string;
143
+ status: "completed";
144
+ version: typeof LIFECYCLE_LOOKUP_VERSION;
145
+ } | {
146
+ invocation_digest: string;
147
+ operation: LifecycleInvocation["operation"];
148
+ status: "pending";
149
+ version: typeof LIFECYCLE_LOOKUP_VERSION;
150
+ } | {
151
+ invocation_digest: string;
152
+ operation: LifecycleInvocation["operation"];
153
+ reason_code: LifecycleAmbiguousReason;
154
+ status: "ambiguous";
155
+ version: typeof LIFECYCLE_LOOKUP_VERSION;
156
+ };
157
+ export declare const canonicalLifecycleJson: (value: unknown) => string;
158
+ export declare const lifecycleDigest: (value: unknown) => string;
@@ -0,0 +1,106 @@
1
+ import { createHash } from "node:crypto";
2
+ import { z } from "zod";
3
+ export const LIFECYCLE_INVOCATION_VERSION = "spawnfile.lifecycle-invocation.v1";
4
+ export const LIFECYCLE_COMPLETION_VERSION = "spawnfile.lifecycle-completion.v1";
5
+ export const LIFECYCLE_LOOKUP_VERSION = "spawnfile.lifecycle-lookup.v1";
6
+ export const LIFECYCLE_OWNER_VERSION = "spawnfile.lifecycle-owner.v1";
7
+ export const LIFECYCLE_ADMISSION_VERSION = "spawnfile.lifecycle-admission.v1";
8
+ export const LIFECYCLE_AMBIGUOUS_VERSION = "spawnfile.lifecycle-ambiguous.v1";
9
+ export const LIFECYCLE_TERMINAL_VERSION = "spawnfile.lifecycle-terminal.v1";
10
+ export const LIFECYCLE_RECORD_MAX_BYTES = 1_000_000;
11
+ export const lifecycleIdSchema = z
12
+ .string()
13
+ .regex(/^lci_[a-z0-9][a-z0-9_-]{15,127}$/u);
14
+ const scalar = z.union([
15
+ z.string().max(512),
16
+ z.boolean(),
17
+ z.number().finite(),
18
+ z.null(),
19
+ ]);
20
+ const binding = z
21
+ .record(z.string().min(1).max(64), scalar)
22
+ .refine((value) => Object.keys(value).length <= 32);
23
+ export const lifecycleInvocationSchema = z
24
+ .object({
25
+ correlation: binding,
26
+ id: lifecycleIdSchema,
27
+ operation: z.enum(["up", "artifacts_export", "down"]),
28
+ request_policy: binding,
29
+ version: z.literal(LIFECYCLE_INVOCATION_VERSION),
30
+ })
31
+ .strict();
32
+ export const lifecycleOwnerSchema = z
33
+ .object({
34
+ epoch: z.string().uuid(),
35
+ lease_expires_at: z.number().int().positive(),
36
+ pid: z.number().int().positive(),
37
+ version: z.literal(LIFECYCLE_OWNER_VERSION),
38
+ })
39
+ .strict();
40
+ export const LIFECYCLE_HEARTBEAT_VERSION = "spawnfile.lifecycle-heartbeat.v1";
41
+ export const lifecycleHeartbeatSchema = z
42
+ .object({
43
+ epoch: z.string().uuid(),
44
+ lease_expires_at: z.number().int().positive(),
45
+ version: z.literal(LIFECYCLE_HEARTBEAT_VERSION),
46
+ })
47
+ .strict();
48
+ export const lifecycleAdmissionSchema = z
49
+ .object({
50
+ invocation: lifecycleInvocationSchema,
51
+ owner: lifecycleOwnerSchema,
52
+ version: z.literal(LIFECYCLE_ADMISSION_VERSION),
53
+ })
54
+ .strict();
55
+ export const lifecycleAmbiguousReasonSchema = z.enum([
56
+ "reconciliation_ambiguous",
57
+ "recovery_owner_died",
58
+ ]);
59
+ export const lifecycleAmbiguousSchema = z
60
+ .object({
61
+ invocation_digest: z.string().regex(/^sha256:[a-f0-9]{64}$/u),
62
+ reason_code: lifecycleAmbiguousReasonSchema,
63
+ version: z.literal(LIFECYCLE_AMBIGUOUS_VERSION),
64
+ })
65
+ .strict();
66
+ export const lifecycleCompletionSchema = z
67
+ .object({
68
+ invocation: lifecycleInvocationSchema,
69
+ outcome_bytes: z.string().min(1).max(LIFECYCLE_RECORD_MAX_BYTES),
70
+ version: z.literal(LIFECYCLE_COMPLETION_VERSION),
71
+ })
72
+ .strict();
73
+ export const lifecycleTerminalSchema = z.discriminatedUnion("status", [
74
+ z
75
+ .object({
76
+ completion: lifecycleCompletionSchema,
77
+ status: z.literal("completed"),
78
+ version: z.literal(LIFECYCLE_TERMINAL_VERSION),
79
+ })
80
+ .strict(),
81
+ z
82
+ .object({
83
+ ambiguous: lifecycleAmbiguousSchema,
84
+ status: z.literal("ambiguous"),
85
+ version: z.literal(LIFECYCLE_TERMINAL_VERSION),
86
+ })
87
+ .strict(),
88
+ ]);
89
+ export const lifecycleExportOutcomeSchema = z
90
+ .object({
91
+ deployment: z.string().min(1).max(128),
92
+ failed_files: z.array(z.string().min(1).max(512)).max(10_000),
93
+ index: z.unknown(),
94
+ index_path: z.string().min(1).max(4096),
95
+ missing_optional_files: z.array(z.string().min(1).max(512)).max(10_000),
96
+ })
97
+ .strict();
98
+ export const canonicalLifecycleJson = (value) => value === null || typeof value !== "object"
99
+ ? JSON.stringify(value)
100
+ : Array.isArray(value)
101
+ ? `[${value.map(canonicalLifecycleJson).join(",")}]`
102
+ : `{${Object.keys(value)
103
+ .sort()
104
+ .map((key) => `${JSON.stringify(key)}:${canonicalLifecycleJson(value[key])}`)
105
+ .join(",")}}`;
106
+ export const lifecycleDigest = (value) => `sha256:${createHash("sha256").update(canonicalLifecycleJson(value)).digest("hex")}`;
@@ -0,0 +1,2 @@
1
+ import { type LifecycleHeartbeat } from "./lifecycleCompletionContracts.js";
2
+ export declare const writeLifecycleHeartbeat: (directory: string, file: string, epoch: string, syncDirectory: (directory: string) => Promise<void>) => Promise<LifecycleHeartbeat>;
@@ -0,0 +1,50 @@
1
+ import { constants } from "node:fs";
2
+ import { lstat, open, rename, unlink } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { randomUUID } from "node:crypto";
5
+ import { SpawnfileError } from "../shared/index.js";
6
+ import { canonicalLifecycleJson, lifecycleHeartbeatSchema, LIFECYCLE_HEARTBEAT_VERSION, } from "./lifecycleCompletionContracts.js";
7
+ import { LIFECYCLE_LEASE_MS } from "./lifecycleCompletionOwner.js";
8
+ const refuse = (message) => {
9
+ throw new SpawnfileError("runtime_error", `Lifecycle completion store refused: ${message}`);
10
+ };
11
+ export const writeLifecycleHeartbeat = async (directory, file, epoch, syncDirectory) => {
12
+ const heartbeat = lifecycleHeartbeatSchema.parse({
13
+ epoch,
14
+ lease_expires_at: Date.now() + LIFECYCLE_LEASE_MS,
15
+ version: LIFECYCLE_HEARTBEAT_VERSION,
16
+ });
17
+ const final = path.join(directory, file);
18
+ const prior = await lstat(final).catch((error) => {
19
+ if (error.code !== "ENOENT")
20
+ refuse("unsafe heartbeat");
21
+ return null;
22
+ });
23
+ if (prior &&
24
+ (!prior.isFile() ||
25
+ prior.isSymbolicLink() ||
26
+ prior.nlink !== 1 ||
27
+ prior.uid !== (process.getuid?.() ?? -1) ||
28
+ (prior.mode & 0o777) !== 0o600))
29
+ refuse("unsafe heartbeat");
30
+ const temp = path.join(directory, `.${file}.${process.pid}.${randomUUID()}.tmp`);
31
+ const handle = await open(temp, constants.O_CREAT |
32
+ constants.O_EXCL |
33
+ constants.O_WRONLY |
34
+ constants.O_NOFOLLOW, 0o600);
35
+ try {
36
+ await handle.writeFile(`${canonicalLifecycleJson(heartbeat)}\n`, "utf8");
37
+ await handle.sync();
38
+ }
39
+ finally {
40
+ await handle.close();
41
+ }
42
+ try {
43
+ await rename(temp, final);
44
+ await syncDirectory(directory);
45
+ }
46
+ finally {
47
+ await unlink(temp).catch(() => undefined);
48
+ }
49
+ return heartbeat;
50
+ };
@@ -0,0 +1,18 @@
1
+ import { type LifecycleLookup } from "./lifecycleCompletionContracts.js";
2
+ interface LookupStorage {
3
+ admissionPath: (id: string) => string;
4
+ completionPath: (id: string) => string;
5
+ existingRoot: () => Promise<string | null>;
6
+ read: (file: string) => Promise<string | null>;
7
+ heartbeatPath: (id: string) => string;
8
+ recoveryPath: (id: string) => string;
9
+ }
10
+ export declare const findLifecycleInvocationRecord: (id: string, storage: Pick<LookupStorage, "admissionPath" | "existingRoot" | "read">) => Promise<{
11
+ correlation: Record<string, string | number | boolean | null>;
12
+ id: string;
13
+ operation: "down" | "up" | "artifacts_export";
14
+ request_policy: Record<string, string | number | boolean | null>;
15
+ version: "spawnfile.lifecycle-invocation.v1";
16
+ } | null>;
17
+ export declare const lookupLifecycleCompletionRecord: (id: string, storage: LookupStorage) => Promise<LifecycleLookup>;
18
+ export {};