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,88 @@
1
+ import { SpawnfileError } from "../shared/index.js";
2
+ import { canonicalLifecycleJson, lifecycleDigest, lifecycleIdSchema, LIFECYCLE_LOOKUP_VERSION, } from "./lifecycleCompletionContracts.js";
3
+ import { lifecycleOwnerIsAlive } from "./lifecycleCompletionOwner.js";
4
+ import { parseLifecycleAdmission, parseLifecycleHeartbeat, parseLifecycleTerminal, } from "./lifecycleCompletionParsing.js";
5
+ export const findLifecycleInvocationRecord = async (id, storage) => {
6
+ const parsed = lifecycleIdSchema.safeParse(id);
7
+ if (!parsed.success)
8
+ refuse("invalid invocation id");
9
+ if ((await storage.existingRoot()) === null)
10
+ return null;
11
+ const text = await storage.read(storage.admissionPath(parsed.data));
12
+ return text === null ? null : parseLifecycleAdmission(text).invocation;
13
+ };
14
+ const refuse = (message) => {
15
+ throw new SpawnfileError("runtime_error", `Lifecycle completion store refused: ${message}`);
16
+ };
17
+ export const lookupLifecycleCompletionRecord = async (id, storage) => {
18
+ const parsed = lifecycleIdSchema.safeParse(id);
19
+ if (!parsed.success)
20
+ refuse("invalid invocation id");
21
+ const value = parsed.data;
22
+ if ((await storage.existingRoot()) === null)
23
+ return {
24
+ invocation_id: value,
25
+ status: "not_applied",
26
+ version: LIFECYCLE_LOOKUP_VERSION,
27
+ };
28
+ const admissionText = await storage.read(storage.admissionPath(value));
29
+ const completionText = await storage.read(storage.completionPath(value));
30
+ const recoveryText = await storage.read(storage.recoveryPath(value));
31
+ const heartbeatText = await storage.read(storage.heartbeatPath(value));
32
+ if (admissionText === null &&
33
+ (completionText !== null || recoveryText !== null))
34
+ refuse("completion without admission");
35
+ if (admissionText === null)
36
+ return {
37
+ invocation_id: value,
38
+ status: "not_applied",
39
+ version: LIFECYCLE_LOOKUP_VERSION,
40
+ };
41
+ const admission = parseLifecycleAdmission(admissionText);
42
+ if (completionText !== null) {
43
+ const terminal = parseLifecycleTerminal(completionText);
44
+ if (terminal.status === "completed") {
45
+ if (canonicalLifecycleJson(terminal.completion.invocation) !==
46
+ canonicalLifecycleJson(admission.invocation))
47
+ refuse("completion admission drift");
48
+ return {
49
+ invocation_digest: lifecycleDigest(terminal.completion.invocation),
50
+ operation: terminal.completion.invocation.operation,
51
+ outcome_bytes: terminal.completion.outcome_bytes,
52
+ status: "completed",
53
+ version: LIFECYCLE_LOOKUP_VERSION,
54
+ };
55
+ }
56
+ const ambiguous = terminal.ambiguous;
57
+ if (ambiguous.invocation_digest !== lifecycleDigest(admission.invocation))
58
+ refuse("corrupt ambiguous record");
59
+ return {
60
+ invocation_digest: ambiguous.invocation_digest,
61
+ operation: admission.invocation.operation,
62
+ reason_code: ambiguous.reason_code,
63
+ status: "ambiguous",
64
+ version: LIFECYCLE_LOOKUP_VERSION,
65
+ };
66
+ }
67
+ if (recoveryText !== null) {
68
+ const recovery = parseLifecycleAdmission(recoveryText);
69
+ if (canonicalLifecycleJson(recovery.invocation) !==
70
+ canonicalLifecycleJson(admission.invocation))
71
+ refuse("invocation id drift");
72
+ if (!lifecycleOwnerIsAlive(recovery.owner, heartbeatText ? parseLifecycleHeartbeat(heartbeatText) : null)) {
73
+ return {
74
+ invocation_digest: lifecycleDigest(admission.invocation),
75
+ operation: admission.invocation.operation,
76
+ reason_code: "recovery_owner_died",
77
+ status: "ambiguous",
78
+ version: LIFECYCLE_LOOKUP_VERSION,
79
+ };
80
+ }
81
+ }
82
+ return {
83
+ invocation_digest: lifecycleDigest(admission.invocation),
84
+ operation: admission.invocation.operation,
85
+ status: "pending",
86
+ version: LIFECYCLE_LOOKUP_VERSION,
87
+ };
88
+ };
@@ -0,0 +1,8 @@
1
+ import { type LifecycleAdmission, type LifecycleInvocation, type LifecycleOwnerCapability } from "./lifecycleCompletionContracts.js";
2
+ export declare const LIFECYCLE_LEASE_MS = 30000;
3
+ export declare const createLifecycleAdmission: (invocation: LifecycleInvocation) => LifecycleAdmission;
4
+ export declare const lifecycleOwnerIsAlive: (owner: LifecycleAdmission["owner"], heartbeat?: {
5
+ epoch: string;
6
+ lease_expires_at: number;
7
+ } | null) => boolean;
8
+ export declare const assertLifecycleOwnerCapability: (invocation: LifecycleInvocation, admitted: LifecycleAdmission, recovered: LifecycleAdmission | null, capability: LifecycleOwnerCapability) => void;
@@ -0,0 +1,31 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { LIFECYCLE_ADMISSION_VERSION, LIFECYCLE_OWNER_VERSION, canonicalLifecycleJson, } from "./lifecycleCompletionContracts.js";
3
+ import { SpawnfileError } from "../shared/index.js";
4
+ export const LIFECYCLE_LEASE_MS = 30_000;
5
+ export const createLifecycleAdmission = (invocation) => ({
6
+ invocation,
7
+ owner: {
8
+ epoch: randomUUID(),
9
+ lease_expires_at: Date.now() + LIFECYCLE_LEASE_MS,
10
+ pid: process.pid,
11
+ version: LIFECYCLE_OWNER_VERSION,
12
+ },
13
+ version: LIFECYCLE_ADMISSION_VERSION,
14
+ });
15
+ export const lifecycleOwnerIsAlive = (owner, heartbeat) => {
16
+ const expiry = heartbeat?.epoch === owner.epoch
17
+ ? heartbeat.lease_expires_at
18
+ : owner.lease_expires_at;
19
+ return expiry > Date.now();
20
+ };
21
+ export const assertLifecycleOwnerCapability = (invocation, admitted, recovered, capability) => {
22
+ if (recovered &&
23
+ canonicalLifecycleJson(recovered.invocation) !==
24
+ canonicalLifecycleJson(invocation))
25
+ throw new SpawnfileError("runtime_error", "Lifecycle invocation id drift");
26
+ const active = recovered
27
+ ? { epoch: recovered.owner.epoch, role: "recovery" }
28
+ : { epoch: admitted.owner.epoch, role: "initial" };
29
+ if (capability?.epoch !== active.epoch || capability?.role !== active.role)
30
+ throw new SpawnfileError("runtime_error", "Lifecycle completion store refused: invalid owner capability");
31
+ };
@@ -0,0 +1,12 @@
1
+ import { type LifecycleCompletion, type LifecycleAdmission, type LifecycleAmbiguousReason, type LifecycleTerminal, type LifecycleInvocation, type LifecycleHeartbeat } from "./lifecycleCompletionContracts.js";
2
+ export declare const parseLifecycleInvocation: (raw: unknown) => LifecycleInvocation;
3
+ export declare const parseLifecycleHeartbeat: (text: string) => LifecycleHeartbeat;
4
+ export declare const parseLifecycleAdmission: (text: string) => LifecycleAdmission;
5
+ export declare const parseLifecycleCompletion: (text: string) => LifecycleCompletion;
6
+ export declare const parseLifecycleAmbiguous: (text: string) => {
7
+ invocation_digest: string;
8
+ reason_code: LifecycleAmbiguousReason;
9
+ version: "spawnfile.lifecycle-ambiguous.v1";
10
+ };
11
+ export declare const parseLifecycleTerminal: (text: string) => LifecycleTerminal;
12
+ export declare const parseLifecycleCompletedTerminal: (text: string) => LifecycleCompletion;
@@ -0,0 +1,108 @@
1
+ import { SpawnfileError } from "../shared/index.js";
2
+ import { parseExportIndex } from "./artifactsExportTypes.js";
3
+ import { parseDownReceipt } from "./downReceiptTypes.js";
4
+ import { canonicalLifecycleJson, lifecycleAdmissionSchema, lifecycleAmbiguousSchema, lifecycleCompletionSchema, lifecycleExportOutcomeSchema, lifecycleHeartbeatSchema, lifecycleInvocationSchema, lifecycleTerminalSchema, } from "./lifecycleCompletionContracts.js";
5
+ import { parseUpReceipt } from "./upReceiptTypes.js";
6
+ const refuse = (message) => {
7
+ throw new SpawnfileError("runtime_error", `Lifecycle completion store refused: ${message}`);
8
+ };
9
+ export const parseLifecycleInvocation = (raw) => {
10
+ const parsed = lifecycleInvocationSchema.safeParse(raw);
11
+ if (!parsed.success)
12
+ refuse("invalid invocation contract");
13
+ return parsed.data;
14
+ };
15
+ export const parseLifecycleHeartbeat = (text) => {
16
+ let raw;
17
+ try {
18
+ raw = JSON.parse(text);
19
+ }
20
+ catch {
21
+ refuse("corrupt heartbeat");
22
+ }
23
+ const parsed = lifecycleHeartbeatSchema.safeParse(raw);
24
+ if (!parsed.success || `${canonicalLifecycleJson(parsed.data)}\n` !== text)
25
+ refuse("corrupt heartbeat");
26
+ return parsed.data;
27
+ };
28
+ export const parseLifecycleAdmission = (text) => {
29
+ let raw;
30
+ try {
31
+ raw = JSON.parse(text);
32
+ }
33
+ catch {
34
+ refuse("corrupt admission");
35
+ }
36
+ const parsed = lifecycleAdmissionSchema.safeParse(raw);
37
+ if (!parsed.success || `${canonicalLifecycleJson(parsed.data)}\n` !== text)
38
+ refuse("noncanonical admission");
39
+ return parsed.data;
40
+ };
41
+ export const parseLifecycleCompletion = (text) => {
42
+ let raw;
43
+ try {
44
+ raw = JSON.parse(text);
45
+ }
46
+ catch {
47
+ refuse("corrupt completion");
48
+ }
49
+ const parsed = lifecycleCompletionSchema.safeParse(raw);
50
+ if (!parsed.success || `${canonicalLifecycleJson(parsed.data)}\n` !== text)
51
+ refuse("corrupt completion");
52
+ const value = parsed.data;
53
+ let outcome;
54
+ try {
55
+ outcome = JSON.parse(value.outcome_bytes);
56
+ }
57
+ catch {
58
+ refuse("corrupt outcome");
59
+ }
60
+ if (JSON.stringify(outcome, null, 2) !== value.outcome_bytes)
61
+ refuse("noncanonical outcome");
62
+ try {
63
+ if (value.invocation.operation === "up")
64
+ parseUpReceipt(outcome);
65
+ else if (value.invocation.operation === "down")
66
+ parseDownReceipt(outcome);
67
+ else
68
+ parseExportIndex(lifecycleExportOutcomeSchema.parse(outcome).index);
69
+ }
70
+ catch {
71
+ refuse("outcome operation mismatch");
72
+ }
73
+ return value;
74
+ };
75
+ export const parseLifecycleAmbiguous = (text) => {
76
+ let raw;
77
+ try {
78
+ raw = JSON.parse(text);
79
+ }
80
+ catch {
81
+ refuse("corrupt ambiguous record");
82
+ }
83
+ const parsed = lifecycleAmbiguousSchema.safeParse(raw);
84
+ if (!parsed.success || `${canonicalLifecycleJson(parsed.data)}\n` !== text)
85
+ refuse("corrupt ambiguous record");
86
+ return parsed.data;
87
+ };
88
+ export const parseLifecycleTerminal = (text) => {
89
+ let raw;
90
+ try {
91
+ raw = JSON.parse(text);
92
+ }
93
+ catch {
94
+ refuse("corrupt terminal record");
95
+ }
96
+ const parsed = lifecycleTerminalSchema.safeParse(raw);
97
+ if (!parsed.success || `${canonicalLifecycleJson(parsed.data)}\n` !== text)
98
+ refuse("corrupt terminal record");
99
+ if (parsed.data.status === "completed")
100
+ parseLifecycleCompletion(`${canonicalLifecycleJson(parsed.data.completion)}\n`);
101
+ return parsed.data;
102
+ };
103
+ export const parseLifecycleCompletedTerminal = (text) => {
104
+ const terminal = parseLifecycleTerminal(text);
105
+ if (terminal.status !== "completed")
106
+ refuse("ambiguous terminal");
107
+ return terminal.completion;
108
+ };
@@ -0,0 +1,9 @@
1
+ export declare const failLifecycleStore: (message: string) => never;
2
+ export declare const resolveLifecycleCompletionDirectory: () => string;
3
+ export declare const lifecycleRecordName: (id: string, kind: "admission" | "completion" | "evidence" | "plan" | "recovery") => string;
4
+ export declare const resolveLifecycleCompletionPath: (id: string) => string;
5
+ export declare const admissionPath: (id: string) => string;
6
+ export declare const planPath: (id: string) => string;
7
+ export declare const recoveryPath: (id: string) => string;
8
+ export declare const evidencePath: (id: string) => string;
9
+ export declare const heartbeatPath: (id: string) => string;
@@ -0,0 +1,16 @@
1
+ import path from "node:path";
2
+ import { resolveSpawnfileHome } from "../auth/index.js";
3
+ import { SpawnfileError } from "../shared/index.js";
4
+ import { lifecycleIdSchema } from "./lifecycleCompletionContracts.js";
5
+ export const failLifecycleStore = (message) => {
6
+ throw new SpawnfileError("runtime_error", `Lifecycle completion store refused: ${message}`);
7
+ };
8
+ export const resolveLifecycleCompletionDirectory = () => path.join(resolveSpawnfileHome(), "lifecycle-completions");
9
+ export const lifecycleRecordName = (id, kind) => `${lifecycleIdSchema.parse(id)}.${kind}`;
10
+ const lifecyclePath = (id, kind) => path.join(resolveLifecycleCompletionDirectory(), lifecycleRecordName(id, kind));
11
+ export const resolveLifecycleCompletionPath = (id) => lifecyclePath(id, "completion");
12
+ export const admissionPath = (id) => lifecyclePath(id, "admission");
13
+ export const planPath = (id) => lifecyclePath(id, "plan");
14
+ export const recoveryPath = (id) => lifecyclePath(id, "recovery");
15
+ export const evidencePath = (id) => lifecyclePath(id, "evidence");
16
+ export const heartbeatPath = (id) => path.join(resolveLifecycleCompletionDirectory(), `${lifecycleIdSchema.parse(id)}.heartbeat`);
@@ -0,0 +1,5 @@
1
+ type RecordReader = (file: string, links?: readonly number[]) => Promise<string | null>;
2
+ export declare const settleLifecyclePublication: (file: string) => Promise<void>;
3
+ export declare const readSettledLifecycleRecord: (file: string, read: RecordReader) => Promise<string | null>;
4
+ export declare const matchesSettledLifecyclePublication: (file: string, expected: string, read: RecordReader) => Promise<boolean>;
5
+ export {};
@@ -0,0 +1,35 @@
1
+ import { lstat } from "node:fs/promises";
2
+ import { SpawnfileError } from "../shared/index.js";
3
+ const refuse = (message) => {
4
+ throw new SpawnfileError("runtime_error", `Lifecycle completion store refused: ${message}`);
5
+ };
6
+ export const settleLifecyclePublication = async (file) => {
7
+ for (let attempt = 0; attempt < 16; attempt += 1) {
8
+ const info = await lstat(file).catch(() => refuse("publication changed"));
9
+ if (info.nlink === 1)
10
+ return;
11
+ await new Promise((resolve) => setImmediate(resolve));
12
+ }
13
+ refuse("publication did not settle");
14
+ };
15
+ export const readSettledLifecycleRecord = async (file, read) => {
16
+ const text = await read(file, [1, 2]);
17
+ if (text === null)
18
+ return null;
19
+ const info = await lstat(file).catch(() => refuse("publication changed"));
20
+ if (info.nlink === 2) {
21
+ await settleLifecyclePublication(file);
22
+ return read(file);
23
+ }
24
+ if (info.nlink !== 1)
25
+ refuse("unsafe record");
26
+ return text;
27
+ };
28
+ export const matchesSettledLifecyclePublication = async (file, expected, read) => {
29
+ const prior = await readSettledLifecycleRecord(file, read);
30
+ if (prior === null)
31
+ return false;
32
+ if (prior !== expected)
33
+ refuse("divergent immutable record");
34
+ return true;
35
+ };
@@ -0,0 +1,21 @@
1
+ import { type LifecycleAdmission, type LifecycleAmbiguousReason, type LifecycleCompletion, type LifecycleInvocation, type LifecycleOwnerCapability } from "./lifecycleCompletionContracts.js";
2
+ interface RecoveryStorage {
3
+ exactAdmission: (invocation: LifecycleInvocation) => Promise<LifecycleAdmission | null>;
4
+ exactCompletion: (invocation: LifecycleInvocation) => Promise<LifecycleCompletion | null>;
5
+ publish: (invocation: LifecycleInvocation, kind: "completion" | "recovery", content: string) => Promise<boolean>;
6
+ readRecovery: (invocation: LifecycleInvocation) => Promise<string | null>;
7
+ readHeartbeat: (invocation: LifecycleInvocation) => Promise<{
8
+ epoch: string;
9
+ lease_expires_at: number;
10
+ } | null>;
11
+ }
12
+ export type LifecycleRecoveryClaim = {
13
+ capability: LifecycleOwnerCapability;
14
+ status: "owner";
15
+ } | {
16
+ status: "ambiguous" | "pending" | "replay";
17
+ };
18
+ export declare const materializeDeadRecoveryAmbiguous: (invocation: LifecycleInvocation, publish: RecoveryStorage["publish"]) => Promise<void>;
19
+ export declare const claimLifecycleRecoveryRecord: (invocation: LifecycleInvocation, storage: RecoveryStorage) => Promise<LifecycleRecoveryClaim>;
20
+ export declare const markLifecycleAmbiguousRecord: (invocation: LifecycleInvocation, reasonCode: LifecycleAmbiguousReason, capability: LifecycleOwnerCapability, storage: RecoveryStorage) => Promise<void>;
21
+ export {};
@@ -0,0 +1,56 @@
1
+ import { canonicalLifecycleJson, lifecycleAmbiguousSchema, lifecycleDigest, LIFECYCLE_TERMINAL_VERSION, } from "./lifecycleCompletionContracts.js";
2
+ import { assertLifecycleOwnerCapability, createLifecycleAdmission, lifecycleOwnerIsAlive, } from "./lifecycleCompletionOwner.js";
3
+ import { parseLifecycleAdmission } from "./lifecycleCompletionParsing.js";
4
+ const ambiguousTerminal = (invocation, reasonCode) => {
5
+ const ambiguous = lifecycleAmbiguousSchema.parse({
6
+ invocation_digest: lifecycleDigest(invocation),
7
+ reason_code: reasonCode,
8
+ version: "spawnfile.lifecycle-ambiguous.v1",
9
+ });
10
+ return `${canonicalLifecycleJson({
11
+ ambiguous,
12
+ status: "ambiguous",
13
+ version: LIFECYCLE_TERMINAL_VERSION,
14
+ })}\n`;
15
+ };
16
+ export const materializeDeadRecoveryAmbiguous = async (invocation, publish) => {
17
+ await publish(invocation, "completion", ambiguousTerminal(invocation, "recovery_owner_died"));
18
+ };
19
+ export const claimLifecycleRecoveryRecord = async (invocation, storage) => {
20
+ const stored = await storage.exactAdmission(invocation);
21
+ const completion = await storage.exactCompletion(invocation);
22
+ if (!stored)
23
+ throw new Error("missing admission");
24
+ if (completion)
25
+ return { status: "replay" };
26
+ if (lifecycleOwnerIsAlive(stored.owner, await storage.readHeartbeat(invocation)))
27
+ return { status: "pending" };
28
+ const recovery = createLifecycleAdmission(invocation);
29
+ if (await storage.publish(invocation, "recovery", `${canonicalLifecycleJson(recovery)}\n`))
30
+ return {
31
+ capability: { epoch: recovery.owner.epoch, role: "recovery" },
32
+ status: "owner",
33
+ };
34
+ const text = await storage.readRecovery(invocation);
35
+ if (text === null)
36
+ throw new Error("missing recovery owner");
37
+ const prior = parseLifecycleAdmission(text);
38
+ if (canonicalLifecycleJson(prior.invocation) !==
39
+ canonicalLifecycleJson(invocation))
40
+ throw new Error("invocation id drift");
41
+ if (lifecycleOwnerIsAlive(prior.owner, await storage.readHeartbeat(invocation)))
42
+ return { status: "pending" };
43
+ await materializeDeadRecoveryAmbiguous(invocation, storage.publish);
44
+ return { status: "ambiguous" };
45
+ };
46
+ export const markLifecycleAmbiguousRecord = async (invocation, reasonCode, capability, storage) => {
47
+ const admitted = await storage.exactAdmission(invocation);
48
+ if (!admitted)
49
+ throw new Error("missing admission");
50
+ const recoveryText = await storage.readRecovery(invocation);
51
+ const recovered = recoveryText ? parseLifecycleAdmission(recoveryText) : null;
52
+ assertLifecycleOwnerCapability(invocation, admitted, recovered, capability);
53
+ if (capability.role !== "recovery")
54
+ throw new Error("invalid owner capability");
55
+ await storage.publish(invocation, "completion", ambiguousTerminal(invocation, reasonCode));
56
+ };
@@ -0,0 +1,21 @@
1
+ import { open } from "node:fs/promises";
2
+ interface PathIdentity {
3
+ readonly dev: number;
4
+ readonly ino: number;
5
+ readonly path: string;
6
+ }
7
+ export interface LifecycleRootAuthority {
8
+ readonly canonicalHome: string;
9
+ readonly configuredHome: string;
10
+ readonly identities: readonly PathIdentity[];
11
+ readonly root: string;
12
+ }
13
+ export declare const revalidateLifecycleRootAuthority: (authority: LifecycleRootAuthority) => Promise<void>;
14
+ export declare const validateLifecycleRoot: (create: boolean) => Promise<LifecycleRootAuthority | null>;
15
+ export declare const lifecycleRoot: () => Promise<string>;
16
+ export declare const existingLifecycleRoot: () => Promise<string | null>;
17
+ export declare const requireLifecycleRootAuthority: () => Promise<LifecycleRootAuthority>;
18
+ export declare const openLifecycleAuthorityRoot: (authority: LifecycleRootAuthority) => Promise<import("fs/promises").FileHandle>;
19
+ export declare const revalidateHeldLifecycleRoot: (authority: LifecycleRootAuthority, handle: Awaited<ReturnType<typeof open>>) => Promise<void>;
20
+ export declare const syncLifecycleDirectory: (directory: string) => Promise<void>;
21
+ export {};
@@ -0,0 +1,243 @@
1
+ import { constants } from "node:fs";
2
+ import { lstat, mkdir, open, realpath } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { resolveSpawnfileHome } from "../auth/index.js";
5
+ import { failLifecycleStore } from "./lifecycleCompletionPaths.js";
6
+ const OWNER = process.getuid?.() ?? -1;
7
+ const authorities = new Map();
8
+ const chain = (value) => {
9
+ const parsed = path.parse(value);
10
+ const result = [parsed.root];
11
+ let current = parsed.root;
12
+ for (const part of value.slice(parsed.root.length).split(path.sep).filter(Boolean)) {
13
+ current = path.join(current, part);
14
+ result.push(current);
15
+ }
16
+ return result;
17
+ };
18
+ const isKnownDarwinAlias = async (value) => {
19
+ if (process.platform !== "darwin" || (value !== "/var" && value !== "/tmp"))
20
+ return false;
21
+ const resolved = await realpath(value).catch(() => "");
22
+ return resolved === (value === "/var" ? "/private/var" : "/private/tmp");
23
+ };
24
+ const validateConfiguredAliases = async (configuredHome, canonicalHome) => {
25
+ for (const value of chain(configuredHome)) {
26
+ const info = await lstat(value).catch(() => failLifecycleStore("unsafe root"));
27
+ if (info.isSymbolicLink()) {
28
+ if (info.uid !== 0 || (info.mode & 0o022) !== 0 || !(await isKnownDarwinAlias(value))) {
29
+ failLifecycleStore("unsafe root");
30
+ }
31
+ }
32
+ else if (!info.isDirectory()) {
33
+ failLifecycleStore("unsafe root");
34
+ }
35
+ }
36
+ if ((await realpath(configuredHome).catch(() => "")) !== canonicalHome) {
37
+ failLifecycleStore("root changed");
38
+ }
39
+ };
40
+ const captureCanonicalChain = async (canonicalHome, root) => {
41
+ const identities = [];
42
+ for (const value of chain(root)) {
43
+ const info = await lstat(value).catch(() => failLifecycleStore("unsafe root"));
44
+ const writable = (info.mode & 0o022) !== 0;
45
+ const stickyRootTemp = info.uid === 0 && writable && (info.mode & 0o1000) !== 0;
46
+ if (!info.isDirectory() ||
47
+ info.isSymbolicLink() ||
48
+ (info.uid !== OWNER && info.uid !== 0) ||
49
+ (writable && !stickyRootTemp))
50
+ failLifecycleStore("unsafe root");
51
+ if ((value === canonicalHome || value === root) &&
52
+ (info.uid !== OWNER || (info.mode & 0o777) !== 0o700))
53
+ failLifecycleStore("unsafe root");
54
+ identities.push({ dev: info.dev, ino: info.ino, path: value });
55
+ }
56
+ return identities;
57
+ };
58
+ const revalidateIdentities = async (identities) => {
59
+ for (const expected of identities) {
60
+ const current = await lstat(expected.path).catch(() => failLifecycleStore("root changed"));
61
+ const writable = (current.mode & 0o022) !== 0;
62
+ const stickyRootTemp = current.uid === 0 && writable && (current.mode & 0o1000) !== 0;
63
+ if (!current.isDirectory() ||
64
+ current.isSymbolicLink() ||
65
+ (current.uid !== OWNER && current.uid !== 0) ||
66
+ (writable && !stickyRootTemp))
67
+ failLifecycleStore("unsafe root");
68
+ if (current.dev !== expected.dev || current.ino !== expected.ino) {
69
+ failLifecycleStore("root changed");
70
+ }
71
+ }
72
+ };
73
+ const captureSafeExistingChain = async (value) => {
74
+ const identities = [];
75
+ for (const current of chain(value)) {
76
+ const info = await lstat(current).catch(() => failLifecycleStore("unsafe root"));
77
+ const writable = (info.mode & 0o022) !== 0;
78
+ const stickyRootTemp = info.uid === 0 && writable && (info.mode & 0o1000) !== 0;
79
+ if (!info.isDirectory() ||
80
+ info.isSymbolicLink() ||
81
+ (info.uid !== OWNER && info.uid !== 0) ||
82
+ (writable && !stickyRootTemp))
83
+ failLifecycleStore("unsafe root");
84
+ identities.push({ dev: info.dev, ino: info.ino, path: current });
85
+ }
86
+ return identities;
87
+ };
88
+ const resolveOrCreateConfiguredHome = async (configuredHome, create) => {
89
+ const logical = chain(configuredHome);
90
+ let existing = logical[0];
91
+ let missingAt = logical.length;
92
+ for (let index = 0; index < logical.length; index += 1) {
93
+ const current = logical[index];
94
+ let info;
95
+ try {
96
+ info = await lstat(current);
97
+ }
98
+ catch (error) {
99
+ if (error.code !== "ENOENT")
100
+ failLifecycleStore("unsafe root");
101
+ missingAt = index;
102
+ break;
103
+ }
104
+ if (info.isSymbolicLink()) {
105
+ if (info.uid !== 0 || (info.mode & 0o022) !== 0 || !(await isKnownDarwinAlias(current))) {
106
+ failLifecycleStore("unsafe root");
107
+ }
108
+ }
109
+ else if (!info.isDirectory()) {
110
+ failLifecycleStore("unsafe root");
111
+ }
112
+ existing = current;
113
+ }
114
+ if (missingAt === logical.length) {
115
+ return realpath(configuredHome).catch(() => failLifecycleStore("unsafe root"));
116
+ }
117
+ if (!create)
118
+ return null;
119
+ let canonicalParent = await realpath(existing).catch(() => failLifecycleStore("unsafe root"));
120
+ let identities = await captureSafeExistingChain(canonicalParent);
121
+ for (let index = missingAt; index < logical.length; index += 1) {
122
+ const name = path.basename(logical[index]);
123
+ const next = path.join(canonicalParent, name);
124
+ await revalidateIdentities(identities);
125
+ await mkdir(next, { mode: 0o700 }).catch((error) => {
126
+ if (error.code !== "EEXIST")
127
+ failLifecycleStore("unsafe root");
128
+ });
129
+ await revalidateIdentities(identities);
130
+ const created = await lstat(next).catch(() => failLifecycleStore("unsafe root"));
131
+ if (!created.isDirectory() ||
132
+ created.isSymbolicLink() ||
133
+ created.uid !== OWNER ||
134
+ (created.mode & 0o777) !== 0o700)
135
+ failLifecycleStore("unsafe root");
136
+ canonicalParent = next;
137
+ identities = [...identities, { dev: created.dev, ino: created.ino, path: next }];
138
+ }
139
+ return canonicalParent;
140
+ };
141
+ export const revalidateLifecycleRootAuthority = async (authority) => {
142
+ await validateConfiguredAliases(authority.configuredHome, authority.canonicalHome);
143
+ for (const expected of authority.identities) {
144
+ const current = await lstat(expected.path).catch(() => failLifecycleStore("root changed"));
145
+ const writable = (current.mode & 0o022) !== 0;
146
+ const stickyRootTemp = current.uid === 0 && writable && (current.mode & 0o1000) !== 0;
147
+ if (!current.isDirectory() ||
148
+ current.isSymbolicLink() ||
149
+ (current.uid !== OWNER && current.uid !== 0) ||
150
+ (writable && !stickyRootTemp) ||
151
+ ((expected.path === authority.canonicalHome || expected.path === authority.root) &&
152
+ (current.uid !== OWNER || (current.mode & 0o777) !== 0o700)))
153
+ failLifecycleStore("unsafe root");
154
+ if (current.dev !== expected.dev || current.ino !== expected.ino) {
155
+ failLifecycleStore("root changed");
156
+ }
157
+ }
158
+ };
159
+ export const validateLifecycleRoot = async (create) => {
160
+ const configuredHome = resolveSpawnfileHome();
161
+ const cached = authorities.get(configuredHome);
162
+ if (cached) {
163
+ await revalidateLifecycleRootAuthority(cached);
164
+ return cached;
165
+ }
166
+ const canonicalHome = await resolveOrCreateConfiguredHome(configuredHome, create);
167
+ if (canonicalHome === null)
168
+ return null;
169
+ await validateConfiguredAliases(configuredHome, canonicalHome);
170
+ const homeIdentities = await captureSafeExistingChain(canonicalHome);
171
+ const homeInfo = await lstat(canonicalHome).catch(() => failLifecycleStore("unsafe root"));
172
+ if (homeInfo.uid !== OWNER || (homeInfo.mode & 0o777) !== 0o700) {
173
+ failLifecycleStore("unsafe root");
174
+ }
175
+ const root = path.join(canonicalHome, "lifecycle-completions");
176
+ if (create) {
177
+ await revalidateIdentities(homeIdentities);
178
+ await mkdir(root, { mode: 0o700 }).catch((error) => {
179
+ if (error.code !== "EEXIST")
180
+ failLifecycleStore("unsafe root");
181
+ });
182
+ await revalidateIdentities(homeIdentities);
183
+ }
184
+ else {
185
+ try {
186
+ await lstat(root);
187
+ }
188
+ catch (error) {
189
+ if (error.code === "ENOENT")
190
+ return null;
191
+ failLifecycleStore("unsafe root");
192
+ }
193
+ }
194
+ const authority = {
195
+ canonicalHome,
196
+ configuredHome,
197
+ identities: await captureCanonicalChain(canonicalHome, root),
198
+ root
199
+ };
200
+ const prior = authorities.get(configuredHome);
201
+ if (prior) {
202
+ await revalidateLifecycleRootAuthority(prior);
203
+ return prior;
204
+ }
205
+ authorities.set(configuredHome, authority);
206
+ return authority;
207
+ };
208
+ export const lifecycleRoot = async () => (await validateLifecycleRoot(true))?.root ?? failLifecycleStore("unsafe root");
209
+ export const existingLifecycleRoot = async () => (await validateLifecycleRoot(false))?.root ?? null;
210
+ export const requireLifecycleRootAuthority = async () => (await validateLifecycleRoot(true)) ?? failLifecycleStore("unsafe root");
211
+ export const openLifecycleAuthorityRoot = async (authority) => {
212
+ await revalidateLifecycleRootAuthority(authority);
213
+ const handle = await open(authority.root, constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW).catch(() => failLifecycleStore("root changed"));
214
+ const expected = authority.identities.at(-1);
215
+ const info = await handle.stat();
216
+ if (info.dev !== expected.dev || info.ino !== expected.ino) {
217
+ await handle.close().catch(() => undefined);
218
+ failLifecycleStore("root changed");
219
+ }
220
+ return handle;
221
+ };
222
+ export const revalidateHeldLifecycleRoot = async (authority, handle) => {
223
+ const expected = authority.identities.at(-1);
224
+ const info = await handle.stat();
225
+ if (info.dev !== expected.dev || info.ino !== expected.ino)
226
+ failLifecycleStore("root changed");
227
+ await revalidateLifecycleRootAuthority(authority);
228
+ };
229
+ export const syncLifecycleDirectory = async (directory) => {
230
+ const authority = await requireLifecycleRootAuthority();
231
+ if (path.resolve(directory) !== authority.root)
232
+ failLifecycleStore("unsafe root");
233
+ const handle = await openLifecycleAuthorityRoot(authority);
234
+ try {
235
+ await revalidateHeldLifecycleRoot(authority, handle);
236
+ await handle.sync();
237
+ await revalidateHeldLifecycleRoot(authority, handle);
238
+ }
239
+ finally {
240
+ await handle.close();
241
+ }
242
+ await revalidateLifecycleRootAuthority(authority);
243
+ };