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,529 @@
1
+ import { constants } from "node:fs";
2
+ import { link, lstat, open, rename, unlink } from "node:fs/promises";
3
+ import { randomUUID } from "node:crypto";
4
+ import path from "node:path";
5
+ import { SpawnfileError } from "../shared/index.js";
6
+ import { SELECTED_TARGET_VERSION, TARGET_JOURNAL_VERSION, TARGET_OPERATION_LOOKUP_VERSION, parseOpaqueTargetHandle, parseRunId, parseSelectedTargetReceipt, parseTargetResourceJournal, parseTargetResourceReceipt, parseTargetOperationLookup, parseTargetResourceRequest } from "./contracts.js";
7
+ import { createCanonicalTargetReceiptBytes, createPendingReceiptDigest, createTargetJournalIdentity, createTargetOperationHandle, createTargetReceiptDigest, createTargetRequestDigest } from "./handles.js";
8
+ import { findExistingTargetJournalRoot, prepareTargetJournalRoot, readTargetJournalFile } from "./journalFilesystem.js";
9
+ import { resolveTargetJournalRoot } from "./journalRoot.js";
10
+ const PRIVATE_VERSION = "spawnfile.target-resource.private-journal.v1";
11
+ const JOURNAL_ERROR = "Target journal failed";
12
+ const MAX_STORE_BYTES = 524_288;
13
+ const CONTEXT_PATTERN = /^[a-z][a-z0-9_-]{0,63}$/u;
14
+ const nativeFilesystem = { syncDirectory: async (directory) => { const handle = await open(directory, constants.O_RDONLY); try {
15
+ await handle.sync();
16
+ }
17
+ finally {
18
+ await handle.close();
19
+ } } };
20
+ let filesystem = nativeFilesystem;
21
+ /** Test seam for observing the required post-replacement directory sync. */
22
+ export const setTargetJournalFilesystemForTests = (replacement) => {
23
+ const previous = filesystem;
24
+ filesystem = replacement;
25
+ return () => { filesystem = previous; };
26
+ };
27
+ const fail = () => { throw new SpawnfileError("runtime_error", JOURNAL_ERROR); };
28
+ const isRecord = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
29
+ const exactKeys = (value, keys) => { const actual = Object.keys(value).sort(); return actual.length === keys.length && actual.every((key, index) => key === keys[index]); };
30
+ const digest = (value) => typeof value === "string" && /^sha256:[a-f0-9]{64}$/u.test(value);
31
+ const same = (left, right) => JSON.stringify(left) === JSON.stringify(right);
32
+ const directoryOf = (filePath) => path.dirname(filePath);
33
+ const checkedRead = async (filePath) => {
34
+ try {
35
+ return await readTargetJournalFile(filePath, MAX_STORE_BYTES);
36
+ }
37
+ catch {
38
+ return fail();
39
+ }
40
+ };
41
+ const roleForOperation = {
42
+ attach_organization: "organization_attachment", create_data_network: "data_network",
43
+ create_evidence_volume: "evidence_volume", create_world_service: "world_service",
44
+ prepare_secret_bindings: "secret_bindings", resolve_world_artifact: "world_artifact"
45
+ };
46
+ const requiredHandles = (request) => {
47
+ switch (request.operation) {
48
+ case "attach_organization": return [{ handle: request.data_network_handle, role: "data_network" }];
49
+ case "create_world_service": return [{ handle: request.data_network_handle, role: "data_network" }, { handle: request.evidence_volume_handle, role: "evidence_volume" }, { handle: request.secret_bindings_handle, role: "secret_bindings" }, { handle: request.world_artifact_handle, role: "world_artifact" }];
50
+ case "start_world_service":
51
+ case "stop_world_service": return [{ handle: request.world_service_handle, role: "world_service" }];
52
+ case "detach_organization": return [{ handle: request.data_network_handle, role: "data_network" }, { handle: request.organization_attachment_handle, role: "organization_attachment" }];
53
+ case "export_evidence_volume": return [{ handle: request.evidence_volume_handle, role: "evidence_volume" }];
54
+ case "revoke_secret_bindings": return [{ handle: request.secret_bindings_handle, role: "secret_bindings" }];
55
+ case "cleanup_run": return [request.evidence_volume_handle && { handle: request.evidence_volume_handle, role: "evidence_volume" }, request.organization_attachment_handle && { handle: request.organization_attachment_handle, role: "organization_attachment" }, request.secret_bindings_handle && { handle: request.secret_bindings_handle, role: "secret_bindings" }, request.world_service_handle && { handle: request.world_service_handle, role: "world_service" }].filter((item) => Boolean(item));
56
+ default: return [];
57
+ }
58
+ };
59
+ const receiptFrom = (claim) => {
60
+ if (claim.state !== "completed" || typeof claim.receipt_bytes !== "string")
61
+ return fail();
62
+ let receipt;
63
+ try {
64
+ receipt = parseTargetResourceReceipt(JSON.parse(claim.receipt_bytes));
65
+ }
66
+ catch {
67
+ return fail();
68
+ }
69
+ if (createCanonicalTargetReceiptBytes(receipt) !== claim.receipt_bytes || receipt.receipt_digest !== createTargetReceiptDigest(receipt))
70
+ fail();
71
+ return receipt;
72
+ };
73
+ const parseStore = (text) => {
74
+ if (Buffer.byteLength(text, "utf8") > MAX_STORE_BYTES)
75
+ fail();
76
+ try {
77
+ const raw = JSON.parse(text);
78
+ if (!isRecord(raw))
79
+ fail();
80
+ const record = raw;
81
+ if (!exactKeys(record, ["adapter", "claims", "journal", "version"]) || record.version !== PRIVATE_VERSION || !isRecord(record.adapter) || !Array.isArray(record.claims) || record.claims.length > 128)
82
+ fail();
83
+ const adapter = record.adapter;
84
+ const claimsRaw = record.claims;
85
+ if (!exactKeys(adapter, ["context"]) || typeof adapter.context !== "string" || !CONTEXT_PATTERN.test(adapter.context))
86
+ fail();
87
+ const context = adapter.context;
88
+ const journal = parseTargetResourceJournal(record.journal);
89
+ const claims = claimsRaw.map((value, index) => {
90
+ if (!isRecord(value))
91
+ return fail();
92
+ const claim = value;
93
+ if (!exactKeys(claim, Object.prototype.hasOwnProperty.call(claim, "receipt_bytes") ? ["idempotency_key", "operation", "operation_handle", "receipt_bytes", "request_digest", "state"] : ["idempotency_key", "operation", "operation_handle", "request_digest", "state"]) || typeof claim.idempotency_key !== "string" || !/^idem_[a-z0-9]{16,64}$/u.test(claim.idempotency_key) || typeof claim.operation !== "string" || !digest(claim.request_digest) || (claim.state !== "pending" && claim.state !== "completed") || (claim.receipt_bytes !== undefined && typeof claim.receipt_bytes !== "string"))
94
+ return fail();
95
+ const entry = journal.entries[index];
96
+ if (!entry || entry.operation !== claim.operation || entry.operation_handle !== claim.operation_handle || entry.request_digest !== claim.request_digest || entry.state !== claim.state)
97
+ return fail();
98
+ return { idempotency_key: claim.idempotency_key, operation: entry.operation, operation_handle: parseOpaqueTargetHandle(claim.operation_handle), ...(typeof claim.receipt_bytes === "string" ? { receipt_bytes: claim.receipt_bytes } : {}), request_digest: claim.request_digest, state: claim.state };
99
+ });
100
+ if (claims.length !== journal.entries.length || new Set(claims.map((claim) => claim.idempotency_key)).size !== claims.length || new Set(claims.map((claim) => claim.operation_handle)).size !== claims.length)
101
+ fail();
102
+ let completed = 0;
103
+ let pending = 0;
104
+ for (const [index, claim] of claims.entries()) {
105
+ const entry = journal.entries[index];
106
+ if (claim.state === "pending") {
107
+ pending += 1;
108
+ if (claim.receipt_bytes !== undefined || entry.receipt_digest !== createPendingReceiptDigest(claim.operation_handle, claim.request_digest) || index !== claims.length - 1)
109
+ fail();
110
+ continue;
111
+ }
112
+ completed += 1;
113
+ const receipt = receiptFrom(claim);
114
+ if (entry.receipt_digest !== receipt.receipt_digest || receipt.operation !== claim.operation || receipt.operation_handle !== claim.operation_handle || receipt.request_digest !== claim.request_digest || receipt.run_id !== journal.run_id || !same(receipt.selected_target, journal.selected_target) || receipt.descriptor_digest !== journal.descriptor_digest || receipt.resulting_revision !== index + 1)
115
+ fail();
116
+ }
117
+ if (pending > 1 || journal.revision !== completed)
118
+ fail();
119
+ return { adapter: { context }, claims, journal, version: PRIVATE_VERSION };
120
+ }
121
+ catch {
122
+ return fail();
123
+ }
124
+ };
125
+ const writeStore = async (filePath, store, createOnly = false) => {
126
+ const content = JSON.stringify(store);
127
+ if (Buffer.byteLength(content, "utf8") > MAX_STORE_BYTES)
128
+ fail();
129
+ parseStore(content);
130
+ const temporaryPath = `${filePath}.store.${process.pid}.${randomUUID()}.tmp`;
131
+ let handle;
132
+ try {
133
+ await unlink(temporaryPath).catch((error) => { if (error.code !== "ENOENT")
134
+ throw error; });
135
+ handle = await open(temporaryPath, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY | constants.O_NOFOLLOW, 0o600);
136
+ await handle.writeFile(content, "utf8");
137
+ await handle.sync();
138
+ await handle.close();
139
+ handle = undefined;
140
+ if (createOnly && await checkedRead(filePath) !== null)
141
+ fail();
142
+ await rename(temporaryPath, filePath);
143
+ await filesystem.syncDirectory(directoryOf(filePath));
144
+ }
145
+ catch {
146
+ if (handle)
147
+ await handle.close().catch(() => undefined);
148
+ await unlink(temporaryPath).catch(() => undefined);
149
+ return fail();
150
+ }
151
+ };
152
+ const inspectLock = async (lockPath) => {
153
+ let stats;
154
+ try {
155
+ stats = await lstat(lockPath);
156
+ }
157
+ catch (error) {
158
+ if (error.code === "ENOENT")
159
+ return "missing";
160
+ return fail();
161
+ }
162
+ if (!stats.isFile() || stats.isSymbolicLink() || stats.size > 32)
163
+ fail();
164
+ if (stats.size === 0)
165
+ return "stale";
166
+ let handle;
167
+ try {
168
+ handle = await open(lockPath, constants.O_RDONLY | constants.O_NOFOLLOW);
169
+ }
170
+ catch (error) {
171
+ if (error.code === "ENOENT")
172
+ return "missing";
173
+ return fail();
174
+ }
175
+ let text;
176
+ try {
177
+ text = await handle.readFile({ encoding: "utf8" });
178
+ }
179
+ catch {
180
+ return fail();
181
+ }
182
+ finally {
183
+ await handle.close().catch(() => undefined);
184
+ }
185
+ if (!/^[1-9][0-9]{0,9}\n$/u.test(text))
186
+ fail();
187
+ try {
188
+ process.kill(Number(text.slice(0, -1)), 0);
189
+ return "live";
190
+ }
191
+ catch (error) {
192
+ return error.code === "ESRCH" ? "stale" : "live";
193
+ }
194
+ };
195
+ const placeLock = async (lockPath) => {
196
+ const temporaryPath = `${lockPath}.tmp.${process.pid}.${randomUUID()}`;
197
+ let handle;
198
+ try {
199
+ await unlink(temporaryPath).catch((error) => { if (error.code !== "ENOENT")
200
+ throw error; });
201
+ handle = await open(temporaryPath, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY | constants.O_NOFOLLOW, 0o600);
202
+ await handle.writeFile(`${process.pid}\n`, "utf8");
203
+ await handle.sync();
204
+ await handle.close();
205
+ handle = undefined;
206
+ try {
207
+ await link(temporaryPath, lockPath);
208
+ }
209
+ catch (error) {
210
+ if (error.code === "EEXIST")
211
+ return false;
212
+ throw error;
213
+ }
214
+ await filesystem.syncDirectory(directoryOf(lockPath));
215
+ return true;
216
+ }
217
+ catch {
218
+ return fail();
219
+ }
220
+ finally {
221
+ if (handle)
222
+ await handle.close().catch(() => undefined);
223
+ await unlink(temporaryPath).catch(() => undefined);
224
+ }
225
+ };
226
+ const releaseLock = async (lockPath) => { await unlink(lockPath).catch(fail); await filesystem.syncDirectory(directoryOf(lockPath)).catch(fail); };
227
+ const pause = async () => new Promise((resolve) => setTimeout(resolve, 2));
228
+ const recoverStaleLock = async (lockPath) => {
229
+ const recoveryPath = `${lockPath}.recover`;
230
+ if (!await placeLock(recoveryPath)) {
231
+ await pause();
232
+ return;
233
+ }
234
+ try {
235
+ if (await inspectLock(lockPath) === "stale") {
236
+ await unlink(lockPath).catch(fail);
237
+ await filesystem.syncDirectory(directoryOf(lockPath));
238
+ }
239
+ }
240
+ finally {
241
+ await releaseLock(recoveryPath);
242
+ }
243
+ };
244
+ const withLock = async (filePath, action) => {
245
+ const lockPath = `${filePath}.lock`;
246
+ for (let attempt = 0; attempt < 200; attempt += 1) {
247
+ if (await placeLock(lockPath)) {
248
+ try {
249
+ return await action();
250
+ }
251
+ catch (error) {
252
+ if (error instanceof SpawnfileError)
253
+ throw error;
254
+ return fail();
255
+ }
256
+ finally {
257
+ await releaseLock(lockPath);
258
+ }
259
+ }
260
+ if (await inspectLock(lockPath) === "stale")
261
+ await recoverStaleLock(lockPath);
262
+ else
263
+ await pause();
264
+ }
265
+ return fail();
266
+ };
267
+ const mutation = (request) => { if (request.operation === "select_target")
268
+ fail(); return request; };
269
+ const journalMatches = (store, identity, input) => {
270
+ const selectedTarget = { fingerprint: input.selected.fingerprint, handle: input.selected.handle };
271
+ if (createTargetJournalIdentity({ context: input.context, descriptor_digest: input.descriptor, run_id: input.runId, selected_target: input.selected }) !== identity || store.adapter.context !== input.context || store.journal.descriptor_digest !== input.descriptor || store.journal.run_id !== input.runId || !same(store.journal.selected_target, selectedTarget))
272
+ fail();
273
+ };
274
+ const priorHandlesMatch = (store, request) => {
275
+ const provenance = new Map();
276
+ for (const claim of store.claims)
277
+ if (claim.state === "completed") {
278
+ const role = roleForOperation[claim.operation];
279
+ const result = receiptFrom(claim).result_handle;
280
+ if (role && result !== null)
281
+ provenance.set(result, [...(provenance.get(result) ?? []), role]);
282
+ }
283
+ return requiredHandles(request).every(({ handle, role }) => { const roles = provenance.get(handle); return roles?.length === 1 && roles[0] === role; });
284
+ };
285
+ class TargetJournalStoreImpl {
286
+ #filePath;
287
+ #identity;
288
+ #input;
289
+ constructor(filePath, identity, input) { this.#filePath = filePath; this.#identity = identity; this.#input = input; }
290
+ async read() { const store = parseStore((await checkedRead(this.#filePath)) ?? fail()); journalMatches(store, this.#identity, this.#input); return store.journal; }
291
+ async lookup(raw) {
292
+ let request;
293
+ try {
294
+ request = mutation(parseTargetResourceRequest(raw));
295
+ }
296
+ catch {
297
+ return fail();
298
+ }
299
+ const requestDigest = createTargetRequestDigest(request);
300
+ const store = parseStore((await checkedRead(this.#filePath)) ?? fail());
301
+ journalMatches(store, this.#identity, this.#input);
302
+ if (request.run_id !== store.journal.run_id
303
+ || request.descriptor_digest !== store.journal.descriptor_digest
304
+ || !same(request.selected_target, store.journal.selected_target))
305
+ return fail();
306
+ const base = {
307
+ idempotency_key: request.idempotency_key,
308
+ operation: request.operation,
309
+ request_digest: requestDigest,
310
+ version: TARGET_OPERATION_LOOKUP_VERSION
311
+ };
312
+ const found = store.claims.find((claim) => claim.idempotency_key === request.idempotency_key);
313
+ if (!found)
314
+ return parseTargetOperationLookup({ ...base, status: "not_applied" });
315
+ if (found.operation !== request.operation
316
+ || found.request_digest !== requestDigest)
317
+ return fail();
318
+ if (found.state === "pending")
319
+ return parseTargetOperationLookup({
320
+ ...base, operation_handle: found.operation_handle, status: "pending"
321
+ });
322
+ const receipt = receiptFrom(found);
323
+ if (receipt.resulting_revision !== request.expected_revision + 1)
324
+ return fail();
325
+ return parseTargetOperationLookup({
326
+ ...base,
327
+ operation_handle: found.operation_handle,
328
+ receipt,
329
+ status: "completed"
330
+ });
331
+ }
332
+ async resolveCompletedReceipt(claim) {
333
+ try {
334
+ parseOpaqueTargetHandle(claim.operationHandle);
335
+ createPendingReceiptDigest(claim.operationHandle, claim.requestDigest);
336
+ }
337
+ catch {
338
+ return fail();
339
+ }
340
+ const store = parseStore((await checkedRead(this.#filePath)) ?? fail());
341
+ journalMatches(store, this.#identity, this.#input);
342
+ const found = store.claims.find((item) => item.operation_handle === claim.operationHandle && item.request_digest === claim.requestDigest);
343
+ return !found || found.state !== "completed" ? null : { receipt: receiptFrom(found), receiptBytes: found.receipt_bytes };
344
+ }
345
+ /** A separate lock deliberately permits the journal's short reserve/complete locks to nest. */
346
+ async withLifecycleLease(action) {
347
+ return withLock(`${this.#filePath}.lifecycle`, action);
348
+ }
349
+ async reserve(raw) {
350
+ let request;
351
+ try {
352
+ request = mutation(parseTargetResourceRequest(raw));
353
+ }
354
+ catch {
355
+ return fail();
356
+ }
357
+ const requestDigest = createTargetRequestDigest(request);
358
+ return withLock(this.#filePath, async () => {
359
+ const store = parseStore((await checkedRead(this.#filePath)) ?? fail());
360
+ journalMatches(store, this.#identity, this.#input);
361
+ if (request.operation === "recover_operation")
362
+ return this.recoverParsed(store, request);
363
+ if (request.run_id !== store.journal.run_id || !same(request.selected_target, store.journal.selected_target) || request.descriptor_digest !== store.journal.descriptor_digest)
364
+ fail();
365
+ const found = store.claims.find((claim) => claim.idempotency_key === request.idempotency_key);
366
+ if (found) {
367
+ if (found.request_digest !== requestDigest)
368
+ fail();
369
+ const claim = { operationHandle: found.operation_handle, requestDigest: found.request_digest };
370
+ return found.state === "pending" ? { kind: "pending", claim } : { kind: "replay", receipt: receiptFrom(found), receiptBytes: found.receipt_bytes };
371
+ }
372
+ if (request.expected_revision !== store.journal.revision || store.claims.some((claim) => claim.state === "pending") || store.claims.length >= 128 || !priorHandlesMatch(store, request))
373
+ fail();
374
+ const operationHandle = createTargetOperationHandle(this.#identity, request);
375
+ const claim = { idempotency_key: request.idempotency_key, operation: request.operation, operation_handle: operationHandle, request_digest: requestDigest, state: "pending" };
376
+ const entry = { operation: request.operation, operation_handle: operationHandle, receipt_digest: createPendingReceiptDigest(operationHandle, requestDigest), request_digest: requestDigest, state: "pending" };
377
+ await writeStore(this.#filePath, { ...store, claims: [...store.claims, claim], journal: { ...store.journal, entries: [...store.journal.entries, entry] } });
378
+ return { kind: "owner", claim: { operationHandle, requestDigest } };
379
+ });
380
+ }
381
+ recoverParsed(store, request) {
382
+ if (request.run_id !== store.journal.run_id || !same(request.selected_target, store.journal.selected_target) || request.descriptor_digest !== store.journal.descriptor_digest || request.expected_revision !== store.journal.revision)
383
+ fail();
384
+ const found = store.claims.find((claim) => claim.operation_handle === request.operation_handle);
385
+ if (!found || found.state !== "pending")
386
+ return fail();
387
+ return { kind: "pending", claim: { operationHandle: found.operation_handle, requestDigest: found.request_digest } };
388
+ }
389
+ async complete(claim, raw) {
390
+ try {
391
+ parseOpaqueTargetHandle(claim.operationHandle);
392
+ createPendingReceiptDigest(claim.operationHandle, claim.requestDigest);
393
+ }
394
+ catch {
395
+ return fail();
396
+ }
397
+ let receipt;
398
+ let receiptBytes;
399
+ try {
400
+ receipt = parseTargetResourceReceipt(raw);
401
+ receiptBytes = createCanonicalTargetReceiptBytes(receipt);
402
+ }
403
+ catch {
404
+ return fail();
405
+ }
406
+ return withLock(this.#filePath, async () => {
407
+ const store = parseStore((await checkedRead(this.#filePath)) ?? fail());
408
+ journalMatches(store, this.#identity, this.#input);
409
+ const found = store.claims.find((item) => item.operation_handle === claim.operationHandle && item.request_digest === claim.requestDigest);
410
+ if (!found)
411
+ return fail();
412
+ if (found.state === "completed") {
413
+ if (found.receipt_bytes !== receiptBytes)
414
+ fail();
415
+ return { receipt: receiptFrom(found), receiptBytes };
416
+ }
417
+ const resultingRevision = receipt.resulting_revision;
418
+ if (resultingRevision === null || resultingRevision !== store.journal.revision + 1 || receipt.operation !== found.operation || receipt.operation_handle !== found.operation_handle || receipt.request_digest !== found.request_digest || receipt.receipt_digest !== createTargetReceiptDigest(receipt) || receipt.run_id !== store.journal.run_id || !same(receipt.selected_target, store.journal.selected_target) || receipt.descriptor_digest !== store.journal.descriptor_digest)
419
+ return fail();
420
+ const claims = store.claims.map((item) => item === found ? { ...item, receipt_bytes: receiptBytes, state: "completed" } : item);
421
+ const entries = store.journal.entries.map((item) => item.operation_handle === found.operation_handle ? { ...item, receipt_digest: receipt.receipt_digest, state: "completed" } : item);
422
+ await writeStore(this.#filePath, { ...store, claims, journal: { ...store.journal, entries, revision: resultingRevision } });
423
+ return { receipt, receiptBytes };
424
+ });
425
+ }
426
+ }
427
+ export const initializeTargetJournal = async (options) => {
428
+ try {
429
+ const selected = parseSelectedTargetReceipt(options.selectedTarget);
430
+ if (typeof options.context !== "string" || !digest(options.descriptorDigest))
431
+ fail();
432
+ const context = options.context;
433
+ const descriptor = options.descriptorDigest;
434
+ if (!CONTEXT_PATTERN.test(context))
435
+ fail();
436
+ const runId = parseRunId(options.runId);
437
+ const root = await prepareTargetJournalRoot(options.root ?? resolveTargetJournalRoot());
438
+ const input = { context, descriptor, runId, selected };
439
+ const identity = createTargetJournalIdentity({ context, descriptor_digest: descriptor, run_id: runId, selected_target: selected });
440
+ const filePath = path.join(root, `${identity.slice("sha256:".length)}.json`);
441
+ const session = new TargetJournalStoreImpl(filePath, identity, input);
442
+ await withLock(filePath, async () => { const existing = await checkedRead(filePath); if (existing !== null) {
443
+ journalMatches(parseStore(existing), identity, input);
444
+ return;
445
+ } const journal = parseTargetResourceJournal({ descriptor_digest: descriptor, entries: [], revision: 0, run_id: runId, selected_target: { fingerprint: selected.fingerprint, handle: selected.handle }, version: TARGET_JOURNAL_VERSION }); await writeStore(filePath, { adapter: { context }, claims: [], journal, version: PRIVATE_VERSION }, true); });
446
+ return session;
447
+ }
448
+ catch {
449
+ return fail();
450
+ }
451
+ };
452
+ const openExistingTargetJournalStore = async (options) => {
453
+ try {
454
+ const selected = parseSelectedTargetReceipt(options.selectedTarget);
455
+ if (typeof options.context !== "string" || !digest(options.descriptorDigest))
456
+ fail();
457
+ const context = options.context;
458
+ const descriptor = options.descriptorDigest;
459
+ if (!CONTEXT_PATTERN.test(context))
460
+ fail();
461
+ const runId = parseRunId(options.runId);
462
+ const root = await findExistingTargetJournalRoot(options.root ?? resolveTargetJournalRoot());
463
+ if (root === null)
464
+ return fail();
465
+ const input = { context, descriptor, runId, selected };
466
+ const identity = createTargetJournalIdentity({ context, descriptor_digest: descriptor, run_id: runId, selected_target: selected });
467
+ const filePath = path.join(root, `${identity.slice("sha256:".length)}.json`);
468
+ const content = await checkedRead(filePath);
469
+ if (content === null)
470
+ return fail();
471
+ journalMatches(parseStore(content), identity, input);
472
+ return new TargetJournalStoreImpl(filePath, identity, input);
473
+ }
474
+ catch {
475
+ return fail();
476
+ }
477
+ };
478
+ /** Internal full authority for target-owned lifecycle recovery. Not barrel-exported. */
479
+ export const openExistingTargetJournalAuthority = (options) => openExistingTargetJournalStore(options);
480
+ /** Public read-only facade over one already-existing journal. */
481
+ export const openExistingTargetJournal = async (options) => {
482
+ const store = await openExistingTargetJournalStore(options);
483
+ return Object.freeze({ lookup: (raw) => store.lookup(raw) });
484
+ };
485
+ /** Looks up one exact original mutation without creating, locking, or modifying owner state. */
486
+ export const lookupTargetOperation = async (options) => {
487
+ try {
488
+ const request = mutation(parseTargetResourceRequest(options.request));
489
+ if (typeof options.context !== "string" || !CONTEXT_PATTERN.test(options.context))
490
+ fail();
491
+ const context = options.context;
492
+ const requestDigest = createTargetRequestDigest(request);
493
+ const base = {
494
+ idempotency_key: request.idempotency_key,
495
+ operation: request.operation,
496
+ request_digest: requestDigest,
497
+ version: TARGET_OPERATION_LOOKUP_VERSION
498
+ };
499
+ const root = await findExistingTargetJournalRoot(options.root ?? resolveTargetJournalRoot());
500
+ if (root === null)
501
+ return parseTargetOperationLookup({
502
+ ...base, status: "not_applied"
503
+ });
504
+ const selected = parseSelectedTargetReceipt({
505
+ ...request.selected_target, version: SELECTED_TARGET_VERSION
506
+ });
507
+ const identity = createTargetJournalIdentity({
508
+ context,
509
+ descriptor_digest: request.descriptor_digest,
510
+ run_id: request.run_id,
511
+ selected_target: selected
512
+ });
513
+ if (await checkedRead(path.join(root, `${identity.slice("sha256:".length)}.json`)) === null) {
514
+ return parseTargetOperationLookup({ ...base, status: "not_applied" });
515
+ }
516
+ const journal = await openExistingTargetJournal({
517
+ context,
518
+ descriptorDigest: request.descriptor_digest,
519
+ root,
520
+ runId: request.run_id,
521
+ selectedTarget: selected
522
+ });
523
+ return journal.lookup(request);
524
+ }
525
+ catch {
526
+ return fail();
527
+ }
528
+ };
529
+ export const openTargetJournal = initializeTargetJournal;
@@ -0,0 +1,3 @@
1
+ export declare const prepareTargetJournalRoot: (raw: unknown) => Promise<string>;
2
+ export declare const findExistingTargetJournalRoot: (raw: unknown) => Promise<string | null>;
3
+ export declare const readTargetJournalFile: (filePath: string, maxBytes: number) => Promise<string | null>;
@@ -0,0 +1,111 @@
1
+ import { constants } from "node:fs";
2
+ import { chmod, lstat, mkdir, open } from "node:fs/promises";
3
+ import path from "node:path";
4
+ const ERROR = "Target journal filesystem failed";
5
+ const MAX_PATH_BYTES = 4_096;
6
+ const fail = () => { throw new TypeError(ERROR); };
7
+ const owner = () => process.getuid?.();
8
+ const pathInput = (raw) => {
9
+ if (typeof raw !== "string" || raw.length === 0
10
+ || Buffer.byteLength(raw, "utf8") > MAX_PATH_BYTES)
11
+ return fail();
12
+ return path.resolve(raw);
13
+ };
14
+ const ownedDirectory = (stats) => stats.isDirectory()
15
+ && !stats.isSymbolicLink()
16
+ && (owner() === undefined || stats.uid === owner());
17
+ export const prepareTargetJournalRoot = async (raw) => {
18
+ const root = pathInput(raw);
19
+ const parsed = path.parse(root);
20
+ let current = parsed.root;
21
+ for (const part of root.slice(parsed.root.length).split(path.sep).filter(Boolean)) {
22
+ current = path.join(current, part);
23
+ let stats;
24
+ try {
25
+ stats = await lstat(current);
26
+ }
27
+ catch (error) {
28
+ if (error.code !== "ENOENT")
29
+ return fail();
30
+ await mkdir(current, { mode: 0o700 }).catch(fail);
31
+ stats = await lstat(current).catch(fail);
32
+ }
33
+ if (!stats.isDirectory() || stats.isSymbolicLink())
34
+ return fail();
35
+ }
36
+ await chmod(root, 0o700).catch(fail);
37
+ const final = await lstat(root).catch(fail);
38
+ if (!ownedDirectory(final) || (final.mode & 0o777) !== 0o700)
39
+ return fail();
40
+ return root;
41
+ };
42
+ export const findExistingTargetJournalRoot = async (raw) => {
43
+ const root = pathInput(raw);
44
+ const parsed = path.parse(root);
45
+ let current = parsed.root;
46
+ for (const part of root.slice(parsed.root.length).split(path.sep).filter(Boolean)) {
47
+ current = path.join(current, part);
48
+ let stats;
49
+ try {
50
+ stats = await lstat(current);
51
+ }
52
+ catch (error) {
53
+ if (error.code === "ENOENT")
54
+ return null;
55
+ return fail();
56
+ }
57
+ if (!stats.isDirectory() || stats.isSymbolicLink())
58
+ return fail();
59
+ }
60
+ const final = await lstat(root).catch(fail);
61
+ if (!ownedDirectory(final) || (final.mode & 0o777) !== 0o700)
62
+ return fail();
63
+ return root;
64
+ };
65
+ const validFile = (stats, maxBytes) => stats.isFile()
66
+ && stats.size <= maxBytes
67
+ && stats.nlink === 1
68
+ && (stats.mode & 0o777) === 0o600
69
+ && (owner() === undefined || stats.uid === owner());
70
+ export const readTargetJournalFile = async (filePath, maxBytes) => {
71
+ let pathStats;
72
+ try {
73
+ pathStats = await lstat(filePath);
74
+ }
75
+ catch (error) {
76
+ if (error.code === "ENOENT")
77
+ return null;
78
+ return fail();
79
+ }
80
+ if (pathStats.isSymbolicLink() || !validFile(pathStats, maxBytes))
81
+ return fail();
82
+ let handle;
83
+ try {
84
+ handle = await open(filePath, constants.O_RDONLY | constants.O_NOFOLLOW);
85
+ }
86
+ catch {
87
+ return fail();
88
+ }
89
+ try {
90
+ const before = await handle.stat();
91
+ if (!validFile(before, maxBytes)
92
+ || before.dev !== pathStats.dev || before.ino !== pathStats.ino
93
+ || before.size !== pathStats.size)
94
+ return fail();
95
+ const text = await handle.readFile({ encoding: "utf8" });
96
+ const after = await handle.stat();
97
+ if (!validFile(after, maxBytes)
98
+ || after.dev !== before.dev || after.ino !== before.ino
99
+ || after.size !== before.size || after.mtimeMs !== before.mtimeMs
100
+ || after.ctimeMs !== before.ctimeMs
101
+ || Buffer.byteLength(text, "utf8") !== after.size)
102
+ return fail();
103
+ return text;
104
+ }
105
+ catch {
106
+ return fail();
107
+ }
108
+ finally {
109
+ await handle.close().catch(() => undefined);
110
+ }
111
+ };
@@ -0,0 +1,4 @@
1
+ /** Legacy provider-neutral journal root used by the public journal API. */
2
+ export declare const resolveTargetJournalRoot: () => string;
3
+ /** Production target-owner journal root, resolved without loading provider configuration. */
4
+ export declare const resolveTargetDefaultJournalRoot: () => string;
@@ -0,0 +1,6 @@
1
+ import path from "node:path";
2
+ import { resolveSpawnfileHome } from "../auth/paths.js";
3
+ /** Legacy provider-neutral journal root used by the public journal API. */
4
+ export const resolveTargetJournalRoot = () => path.join(resolveSpawnfileHome(), "target-journals");
5
+ /** Production target-owner journal root, resolved without loading provider configuration. */
6
+ export const resolveTargetDefaultJournalRoot = () => path.join(resolveSpawnfileHome(), "target", "journals");