@smthrs/engine-store 0.0.0-stage → 1.0.0-rc.4

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 (787) hide show
  1. package/CHANGELOG.md +247 -0
  2. package/LICENSE +21 -0
  3. package/README.md +146 -2
  4. package/dist/cjs/ArtifactGc.d.ts +235 -0
  5. package/dist/cjs/ArtifactGc.d.ts.map +1 -0
  6. package/dist/cjs/ArtifactGc.js +183 -0
  7. package/dist/cjs/ArtifactGc.js.map +7 -0
  8. package/dist/cjs/ArtifactSync.d.ts +164 -0
  9. package/dist/cjs/ArtifactSync.d.ts.map +1 -0
  10. package/dist/cjs/ArtifactSync.js +144 -0
  11. package/dist/cjs/ArtifactSync.js.map +7 -0
  12. package/dist/cjs/CacheSync.d.ts +112 -0
  13. package/dist/cjs/CacheSync.d.ts.map +1 -0
  14. package/dist/cjs/CacheSync.js +64 -0
  15. package/dist/cjs/CacheSync.js.map +7 -0
  16. package/dist/cjs/DeferredClockFold.d.ts +354 -0
  17. package/dist/cjs/DeferredClockFold.d.ts.map +1 -0
  18. package/dist/cjs/DeferredClockFold.js +335 -0
  19. package/dist/cjs/DeferredClockFold.js.map +7 -0
  20. package/dist/cjs/DisasterRecovery.d.ts +431 -0
  21. package/dist/cjs/DisasterRecovery.d.ts.map +1 -0
  22. package/dist/cjs/DisasterRecovery.js +453 -0
  23. package/dist/cjs/DisasterRecovery.js.map +7 -0
  24. package/dist/cjs/DurableEngineState.d.ts +776 -0
  25. package/dist/cjs/DurableEngineState.d.ts.map +1 -0
  26. package/dist/cjs/DurableEngineState.js +1536 -0
  27. package/dist/cjs/DurableEngineState.js.map +7 -0
  28. package/dist/cjs/EngineStore.d.ts +158 -0
  29. package/dist/cjs/EngineStore.d.ts.map +1 -0
  30. package/dist/cjs/EngineStore.js +398 -0
  31. package/dist/cjs/EngineStore.js.map +7 -0
  32. package/dist/cjs/EngineStoreMetrics.d.ts +276 -0
  33. package/dist/cjs/EngineStoreMetrics.d.ts.map +1 -0
  34. package/dist/cjs/EngineStoreMetrics.js +135 -0
  35. package/dist/cjs/EngineStoreMetrics.js.map +7 -0
  36. package/dist/cjs/Errors.d.ts +22 -0
  37. package/dist/cjs/Errors.d.ts.map +1 -0
  38. package/dist/cjs/Errors.js +39 -0
  39. package/dist/cjs/Errors.js.map +7 -0
  40. package/dist/cjs/EventTypes.d.ts +27 -0
  41. package/dist/cjs/EventTypes.d.ts.map +1 -0
  42. package/dist/cjs/EventTypes.js +37 -0
  43. package/dist/cjs/EventTypes.js.map +7 -0
  44. package/dist/cjs/ExecutionFacts.d.ts +59 -0
  45. package/dist/cjs/ExecutionFacts.d.ts.map +1 -0
  46. package/dist/cjs/ExecutionFacts.js +123 -0
  47. package/dist/cjs/ExecutionFacts.js.map +7 -0
  48. package/dist/cjs/ExecutionSnapshot.d.ts +117 -0
  49. package/dist/cjs/ExecutionSnapshot.d.ts.map +1 -0
  50. package/dist/cjs/ExecutionSnapshot.js +111 -0
  51. package/dist/cjs/ExecutionSnapshot.js.map +7 -0
  52. package/dist/cjs/Inconsistency.d.ts +154 -0
  53. package/dist/cjs/Inconsistency.d.ts.map +1 -0
  54. package/dist/cjs/Inconsistency.js +135 -0
  55. package/dist/cjs/Inconsistency.js.map +7 -0
  56. package/dist/cjs/Migrations.d.ts +56 -0
  57. package/dist/cjs/Migrations.d.ts.map +1 -0
  58. package/dist/cjs/Migrations.js +78 -0
  59. package/dist/cjs/Migrations.js.map +7 -0
  60. package/dist/cjs/OwnerIdentity.d.ts +91 -0
  61. package/dist/cjs/OwnerIdentity.d.ts.map +1 -0
  62. package/dist/cjs/OwnerIdentity.js +65 -0
  63. package/dist/cjs/OwnerIdentity.js.map +7 -0
  64. package/dist/cjs/PlanInputStore.d.ts +110 -0
  65. package/dist/cjs/PlanInputStore.d.ts.map +1 -0
  66. package/dist/cjs/PlanInputStore.js +224 -0
  67. package/dist/cjs/PlanInputStore.js.map +7 -0
  68. package/dist/cjs/PlanMergeStore.d.ts +113 -0
  69. package/dist/cjs/PlanMergeStore.d.ts.map +1 -0
  70. package/dist/cjs/PlanMergeStore.js +255 -0
  71. package/dist/cjs/PlanMergeStore.js.map +7 -0
  72. package/dist/cjs/PlanScheduler.d.ts +363 -0
  73. package/dist/cjs/PlanScheduler.d.ts.map +1 -0
  74. package/dist/cjs/PlanScheduler.js +1090 -0
  75. package/dist/cjs/PlanScheduler.js.map +7 -0
  76. package/dist/cjs/Reconciliation.d.ts +175 -0
  77. package/dist/cjs/Reconciliation.d.ts.map +1 -0
  78. package/dist/cjs/Reconciliation.js +119 -0
  79. package/dist/cjs/Reconciliation.js.map +7 -0
  80. package/dist/cjs/ReplayOnly.d.ts +91 -0
  81. package/dist/cjs/ReplayOnly.d.ts.map +1 -0
  82. package/dist/cjs/ReplayOnly.js +52 -0
  83. package/dist/cjs/ReplayOnly.js.map +7 -0
  84. package/dist/cjs/Retention.d.ts +113 -0
  85. package/dist/cjs/Retention.d.ts.map +1 -0
  86. package/dist/cjs/Retention.js +99 -0
  87. package/dist/cjs/Retention.js.map +7 -0
  88. package/dist/cjs/RunCatalogRead.d.ts +17 -0
  89. package/dist/cjs/RunCatalogRead.d.ts.map +1 -0
  90. package/dist/cjs/RunCatalogRead.js +33 -0
  91. package/dist/cjs/RunCatalogRead.js.map +7 -0
  92. package/dist/cjs/RunChangeFeed.d.ts +75 -0
  93. package/dist/cjs/RunChangeFeed.d.ts.map +1 -0
  94. package/dist/cjs/RunChangeFeed.js +96 -0
  95. package/dist/cjs/RunChangeFeed.js.map +7 -0
  96. package/dist/cjs/RunState.d.ts +116 -0
  97. package/dist/cjs/RunState.d.ts.map +1 -0
  98. package/dist/cjs/RunState.js +76 -0
  99. package/dist/cjs/RunState.js.map +7 -0
  100. package/dist/cjs/Selection.d.ts +495 -0
  101. package/dist/cjs/Selection.d.ts.map +1 -0
  102. package/dist/cjs/Selection.js +288 -0
  103. package/dist/cjs/Selection.js.map +7 -0
  104. package/dist/cjs/SelectionStore.d.ts +141 -0
  105. package/dist/cjs/SelectionStore.d.ts.map +1 -0
  106. package/dist/cjs/SelectionStore.js +229 -0
  107. package/dist/cjs/SelectionStore.js.map +7 -0
  108. package/dist/cjs/StepBoundary.d.ts +501 -0
  109. package/dist/cjs/StepBoundary.d.ts.map +1 -0
  110. package/dist/cjs/StepBoundary.js +619 -0
  111. package/dist/cjs/StepBoundary.js.map +7 -0
  112. package/dist/cjs/StepCacheFold.d.ts +148 -0
  113. package/dist/cjs/StepCacheFold.d.ts.map +1 -0
  114. package/dist/cjs/StepCacheFold.js +131 -0
  115. package/dist/cjs/StepCacheFold.js.map +7 -0
  116. package/dist/cjs/StepSandbox.d.ts +78 -0
  117. package/dist/cjs/StepSandbox.d.ts.map +1 -0
  118. package/dist/cjs/StepSandbox.js +75 -0
  119. package/dist/cjs/StepSandbox.js.map +7 -0
  120. package/dist/cjs/WakeBus.d.ts +116 -0
  121. package/dist/cjs/WakeBus.d.ts.map +1 -0
  122. package/dist/cjs/WakeBus.js +89 -0
  123. package/dist/cjs/WakeBus.js.map +7 -0
  124. package/dist/cjs/WorkspaceSandbox.d.ts +619 -0
  125. package/dist/cjs/WorkspaceSandbox.d.ts.map +1 -0
  126. package/dist/cjs/WorkspaceSandbox.js +711 -0
  127. package/dist/cjs/WorkspaceSandbox.js.map +7 -0
  128. package/dist/cjs/index.d.ts +157 -0
  129. package/dist/cjs/index.d.ts.map +1 -0
  130. package/dist/cjs/index.js +95 -0
  131. package/dist/cjs/index.js.map +7 -0
  132. package/dist/cjs/internal/ActionPersistence.d.ts +276 -0
  133. package/dist/cjs/internal/ActionPersistence.d.ts.map +1 -0
  134. package/dist/cjs/internal/ActionPersistence.js +1395 -0
  135. package/dist/cjs/internal/ActionPersistence.js.map +7 -0
  136. package/dist/cjs/internal/ArtifactRoots.d.ts +38 -0
  137. package/dist/cjs/internal/ArtifactRoots.d.ts.map +1 -0
  138. package/dist/cjs/internal/ArtifactRoots.js +89 -0
  139. package/dist/cjs/internal/ArtifactRoots.js.map +7 -0
  140. package/dist/cjs/internal/AttemptAdmission.d.ts +53 -0
  141. package/dist/cjs/internal/AttemptAdmission.d.ts.map +1 -0
  142. package/dist/cjs/internal/AttemptAdmission.js +52 -0
  143. package/dist/cjs/internal/AttemptAdmission.js.map +7 -0
  144. package/dist/cjs/internal/AttemptLifecycle.d.ts +245 -0
  145. package/dist/cjs/internal/AttemptLifecycle.d.ts.map +1 -0
  146. package/dist/cjs/internal/AttemptLifecycle.js +112 -0
  147. package/dist/cjs/internal/AttemptLifecycle.js.map +7 -0
  148. package/dist/cjs/internal/AttemptProbe.d.ts +53 -0
  149. package/dist/cjs/internal/AttemptProbe.d.ts.map +1 -0
  150. package/dist/cjs/internal/AttemptProbe.js +66 -0
  151. package/dist/cjs/internal/AttemptProbe.js.map +7 -0
  152. package/dist/cjs/internal/CacheAdmission.d.ts +79 -0
  153. package/dist/cjs/internal/CacheAdmission.d.ts.map +1 -0
  154. package/dist/cjs/internal/CacheAdmission.js +71 -0
  155. package/dist/cjs/internal/CacheAdmission.js.map +7 -0
  156. package/dist/cjs/internal/CacheAgeHistory.d.ts +27 -0
  157. package/dist/cjs/internal/CacheAgeHistory.d.ts.map +1 -0
  158. package/dist/cjs/internal/CacheAgeHistory.js +61 -0
  159. package/dist/cjs/internal/CacheAgeHistory.js.map +7 -0
  160. package/dist/cjs/internal/CacheAgeVerdicts.d.ts +15 -0
  161. package/dist/cjs/internal/CacheAgeVerdicts.d.ts.map +1 -0
  162. package/dist/cjs/internal/CacheAgeVerdicts.js +73 -0
  163. package/dist/cjs/internal/CacheAgeVerdicts.js.map +7 -0
  164. package/dist/cjs/internal/CacheOutputPolicy.d.ts +24 -0
  165. package/dist/cjs/internal/CacheOutputPolicy.d.ts.map +1 -0
  166. package/dist/cjs/internal/CacheOutputPolicy.js +75 -0
  167. package/dist/cjs/internal/CacheOutputPolicy.js.map +7 -0
  168. package/dist/cjs/internal/CachePublication.d.ts +97 -0
  169. package/dist/cjs/internal/CachePublication.d.ts.map +1 -0
  170. package/dist/cjs/internal/CachePublication.js +80 -0
  171. package/dist/cjs/internal/CachePublication.js.map +7 -0
  172. package/dist/cjs/internal/CallFacts.d.ts +15 -0
  173. package/dist/cjs/internal/CallFacts.d.ts.map +1 -0
  174. package/dist/cjs/internal/CallFacts.js +97 -0
  175. package/dist/cjs/internal/CallFacts.js.map +7 -0
  176. package/dist/cjs/internal/CopiedRecord.d.ts +61 -0
  177. package/dist/cjs/internal/CopiedRecord.d.ts.map +1 -0
  178. package/dist/cjs/internal/CopiedRecord.js +134 -0
  179. package/dist/cjs/internal/CopiedRecord.js.map +7 -0
  180. package/dist/cjs/internal/DeferredPersistence.d.ts +108 -0
  181. package/dist/cjs/internal/DeferredPersistence.d.ts.map +1 -0
  182. package/dist/cjs/internal/DeferredPersistence.js +270 -0
  183. package/dist/cjs/internal/DeferredPersistence.js.map +7 -0
  184. package/dist/cjs/internal/EffectRecords.d.ts +92 -0
  185. package/dist/cjs/internal/EffectRecords.d.ts.map +1 -0
  186. package/dist/cjs/internal/EffectRecords.js +63 -0
  187. package/dist/cjs/internal/EffectRecords.js.map +7 -0
  188. package/dist/cjs/internal/EngineJj.d.ts +30 -0
  189. package/dist/cjs/internal/EngineJj.d.ts.map +1 -0
  190. package/dist/cjs/internal/EngineJj.js +42 -0
  191. package/dist/cjs/internal/EngineJj.js.map +7 -0
  192. package/dist/cjs/internal/EngineStateSchema.d.ts +68 -0
  193. package/dist/cjs/internal/EngineStateSchema.d.ts.map +1 -0
  194. package/dist/cjs/internal/EngineStateSchema.js +58 -0
  195. package/dist/cjs/internal/EngineStateSchema.js.map +7 -0
  196. package/dist/cjs/internal/ExecutionSnapshotRead.d.ts +162 -0
  197. package/dist/cjs/internal/ExecutionSnapshotRead.d.ts.map +1 -0
  198. package/dist/cjs/internal/ExecutionSnapshotRead.js +201 -0
  199. package/dist/cjs/internal/ExecutionSnapshotRead.js.map +7 -0
  200. package/dist/cjs/internal/ExecutionSnapshotRelations.d.ts +39 -0
  201. package/dist/cjs/internal/ExecutionSnapshotRelations.d.ts.map +1 -0
  202. package/dist/cjs/internal/ExecutionSnapshotRelations.js +105 -0
  203. package/dist/cjs/internal/ExecutionSnapshotRelations.js.map +7 -0
  204. package/dist/cjs/internal/ExitEncoding.d.ts +180 -0
  205. package/dist/cjs/internal/ExitEncoding.d.ts.map +1 -0
  206. package/dist/cjs/internal/ExitEncoding.js +236 -0
  207. package/dist/cjs/internal/ExitEncoding.js.map +7 -0
  208. package/dist/cjs/internal/FileBoundarySnapshot.d.ts +14 -0
  209. package/dist/cjs/internal/FileBoundarySnapshot.d.ts.map +1 -0
  210. package/dist/cjs/internal/FileBoundarySnapshot.js +51 -0
  211. package/dist/cjs/internal/FileBoundarySnapshot.js.map +7 -0
  212. package/dist/cjs/internal/FileEnumeration.d.ts +127 -0
  213. package/dist/cjs/internal/FileEnumeration.d.ts.map +1 -0
  214. package/dist/cjs/internal/FileEnumeration.js +194 -0
  215. package/dist/cjs/internal/FileEnumeration.js.map +7 -0
  216. package/dist/cjs/internal/HostReflection.d.ts +80 -0
  217. package/dist/cjs/internal/HostReflection.d.ts.map +1 -0
  218. package/dist/cjs/internal/HostReflection.js +43 -0
  219. package/dist/cjs/internal/HostReflection.js.map +7 -0
  220. package/dist/cjs/internal/JournalRecords.d.ts +325 -0
  221. package/dist/cjs/internal/JournalRecords.d.ts.map +1 -0
  222. package/dist/cjs/internal/JournalRecords.js +122 -0
  223. package/dist/cjs/internal/JournalRecords.js.map +7 -0
  224. package/dist/cjs/internal/NodeJournal.d.ts +157 -0
  225. package/dist/cjs/internal/NodeJournal.d.ts.map +1 -0
  226. package/dist/cjs/internal/NodeJournal.js +192 -0
  227. package/dist/cjs/internal/NodeJournal.js.map +7 -0
  228. package/dist/cjs/internal/Ordering.d.ts +14 -0
  229. package/dist/cjs/internal/Ordering.d.ts.map +1 -0
  230. package/dist/cjs/internal/Ordering.js +25 -0
  231. package/dist/cjs/internal/Ordering.js.map +7 -0
  232. package/dist/cjs/internal/PlanInputs.d.ts +14 -0
  233. package/dist/cjs/internal/PlanInputs.d.ts.map +1 -0
  234. package/dist/cjs/internal/PlanInputs.js +78 -0
  235. package/dist/cjs/internal/PlanInputs.js.map +7 -0
  236. package/dist/cjs/internal/PlanMerges.d.ts +178 -0
  237. package/dist/cjs/internal/PlanMerges.d.ts.map +1 -0
  238. package/dist/cjs/internal/PlanMerges.js +125 -0
  239. package/dist/cjs/internal/PlanMerges.js.map +7 -0
  240. package/dist/cjs/internal/ProvenanceSlot.d.ts +30 -0
  241. package/dist/cjs/internal/ProvenanceSlot.d.ts.map +1 -0
  242. package/dist/cjs/internal/ProvenanceSlot.js +53 -0
  243. package/dist/cjs/internal/ProvenanceSlot.js.map +7 -0
  244. package/dist/cjs/internal/ResultEnvelope.d.ts +88 -0
  245. package/dist/cjs/internal/ResultEnvelope.d.ts.map +1 -0
  246. package/dist/cjs/internal/ResultEnvelope.js +90 -0
  247. package/dist/cjs/internal/ResultEnvelope.js.map +7 -0
  248. package/dist/cjs/internal/RetentionOps.d.ts +414 -0
  249. package/dist/cjs/internal/RetentionOps.d.ts.map +1 -0
  250. package/dist/cjs/internal/RetentionOps.js +354 -0
  251. package/dist/cjs/internal/RetentionOps.js.map +7 -0
  252. package/dist/cjs/internal/RunCatalogOps.d.ts +118 -0
  253. package/dist/cjs/internal/RunCatalogOps.d.ts.map +1 -0
  254. package/dist/cjs/internal/RunCatalogOps.js +85 -0
  255. package/dist/cjs/internal/RunCatalogOps.js.map +7 -0
  256. package/dist/cjs/internal/RunCoordinator.d.ts +78 -0
  257. package/dist/cjs/internal/RunCoordinator.d.ts.map +1 -0
  258. package/dist/cjs/internal/RunCoordinator.js +123 -0
  259. package/dist/cjs/internal/RunCoordinator.js.map +7 -0
  260. package/dist/cjs/internal/RunDriver.d.ts +192 -0
  261. package/dist/cjs/internal/RunDriver.d.ts.map +1 -0
  262. package/dist/cjs/internal/RunDriver.js +1586 -0
  263. package/dist/cjs/internal/RunDriver.js.map +7 -0
  264. package/dist/cjs/internal/RunLifecycle.d.ts +22 -0
  265. package/dist/cjs/internal/RunLifecycle.d.ts.map +1 -0
  266. package/dist/cjs/internal/RunLifecycle.js +63 -0
  267. package/dist/cjs/internal/RunLifecycle.js.map +7 -0
  268. package/dist/cjs/internal/RunListing.d.ts +78 -0
  269. package/dist/cjs/internal/RunListing.d.ts.map +1 -0
  270. package/dist/cjs/internal/RunListing.js +171 -0
  271. package/dist/cjs/internal/RunListing.js.map +7 -0
  272. package/dist/cjs/internal/RunListingError.d.ts +35 -0
  273. package/dist/cjs/internal/RunListingError.d.ts.map +1 -0
  274. package/dist/cjs/internal/RunListingError.js +47 -0
  275. package/dist/cjs/internal/RunListingError.js.map +7 -0
  276. package/dist/cjs/internal/RuntimeGraph.d.ts +73 -0
  277. package/dist/cjs/internal/RuntimeGraph.d.ts.map +1 -0
  278. package/dist/cjs/internal/RuntimeGraph.js +180 -0
  279. package/dist/cjs/internal/RuntimeGraph.js.map +7 -0
  280. package/dist/cjs/internal/SandboxedExecution.d.ts +80 -0
  281. package/dist/cjs/internal/SandboxedExecution.d.ts.map +1 -0
  282. package/dist/cjs/internal/SandboxedExecution.js +104 -0
  283. package/dist/cjs/internal/SandboxedExecution.js.map +7 -0
  284. package/dist/cjs/internal/StateTransaction.d.ts +44 -0
  285. package/dist/cjs/internal/StateTransaction.d.ts.map +1 -0
  286. package/dist/cjs/internal/StateTransaction.js +52 -0
  287. package/dist/cjs/internal/StateTransaction.js.map +7 -0
  288. package/dist/cjs/internal/StepFacts.d.ts +14 -0
  289. package/dist/cjs/internal/StepFacts.d.ts.map +1 -0
  290. package/dist/cjs/internal/StepFacts.js +58 -0
  291. package/dist/cjs/internal/StepFacts.js.map +7 -0
  292. package/dist/cjs/internal/TypedEvents.d.ts +14 -0
  293. package/dist/cjs/internal/TypedEvents.d.ts.map +1 -0
  294. package/dist/cjs/internal/TypedEvents.js +37 -0
  295. package/dist/cjs/internal/TypedEvents.js.map +7 -0
  296. package/dist/cjs/migrations/0001_initial.d.ts +17 -0
  297. package/dist/cjs/migrations/0001_initial.d.ts.map +1 -0
  298. package/dist/cjs/migrations/0001_initial.js +61 -0
  299. package/dist/cjs/migrations/0001_initial.js.map +7 -0
  300. package/dist/cjs/migrations/0002_selection_store.d.ts +15 -0
  301. package/dist/cjs/migrations/0002_selection_store.d.ts.map +1 -0
  302. package/dist/cjs/migrations/0002_selection_store.js +56 -0
  303. package/dist/cjs/migrations/0002_selection_store.js.map +7 -0
  304. package/dist/cjs/migrations/0003_plan_inputs.d.ts +13 -0
  305. package/dist/cjs/migrations/0003_plan_inputs.d.ts.map +1 -0
  306. package/dist/cjs/migrations/0003_plan_inputs.js +90 -0
  307. package/dist/cjs/migrations/0003_plan_inputs.js.map +7 -0
  308. package/dist/cjs/migrations/0004_plan_environment.d.ts +14 -0
  309. package/dist/cjs/migrations/0004_plan_environment.d.ts.map +1 -0
  310. package/dist/cjs/migrations/0004_plan_environment.js +56 -0
  311. package/dist/cjs/migrations/0004_plan_environment.js.map +7 -0
  312. package/dist/cjs/migrations/0005_plan_merges.d.ts +14 -0
  313. package/dist/cjs/migrations/0005_plan_merges.d.ts.map +1 -0
  314. package/dist/cjs/migrations/0005_plan_merges.js +82 -0
  315. package/dist/cjs/migrations/0005_plan_merges.js.map +7 -0
  316. package/dist/cjs/migrations/0006_execution_listing.d.ts +15 -0
  317. package/dist/cjs/migrations/0006_execution_listing.d.ts.map +1 -0
  318. package/dist/cjs/migrations/0006_execution_listing.js +101 -0
  319. package/dist/cjs/migrations/0006_execution_listing.js.map +7 -0
  320. package/dist/cjs/migrations/0007_run_parent_sequence.d.ts +15 -0
  321. package/dist/cjs/migrations/0007_run_parent_sequence.d.ts.map +1 -0
  322. package/dist/cjs/migrations/0007_run_parent_sequence.js +40 -0
  323. package/dist/cjs/migrations/0007_run_parent_sequence.js.map +7 -0
  324. package/dist/cjs/migrations/0008_deferred_consumption.d.ts +16 -0
  325. package/dist/cjs/migrations/0008_deferred_consumption.d.ts.map +1 -0
  326. package/dist/cjs/migrations/0008_deferred_consumption.js +45 -0
  327. package/dist/cjs/migrations/0008_deferred_consumption.js.map +7 -0
  328. package/dist/cjs/migrations/0009_deferred_clock_facts.d.ts +24 -0
  329. package/dist/cjs/migrations/0009_deferred_clock_facts.d.ts.map +1 -0
  330. package/dist/cjs/migrations/0009_deferred_clock_facts.js +141 -0
  331. package/dist/cjs/migrations/0009_deferred_clock_facts.js.map +7 -0
  332. package/dist/cjs/migrations/0010_pending_cancellation.d.ts +15 -0
  333. package/dist/cjs/migrations/0010_pending_cancellation.d.ts.map +1 -0
  334. package/dist/cjs/migrations/0010_pending_cancellation.js +41 -0
  335. package/dist/cjs/migrations/0010_pending_cancellation.js.map +7 -0
  336. package/dist/cjs/package.json +1 -0
  337. package/dist/cjs/test/TestStores.d.ts +89 -0
  338. package/dist/cjs/test/TestStores.d.ts.map +1 -0
  339. package/dist/cjs/test/TestStores.js +98 -0
  340. package/dist/cjs/test/TestStores.js.map +7 -0
  341. package/dist/esm/ArtifactGc.d.ts +235 -0
  342. package/dist/esm/ArtifactGc.d.ts.map +1 -0
  343. package/dist/esm/ArtifactGc.js +268 -0
  344. package/dist/esm/ArtifactGc.js.map +1 -0
  345. package/dist/esm/ArtifactSync.d.ts +164 -0
  346. package/dist/esm/ArtifactSync.d.ts.map +1 -0
  347. package/dist/esm/ArtifactSync.js +176 -0
  348. package/dist/esm/ArtifactSync.js.map +1 -0
  349. package/dist/esm/CacheSync.d.ts +112 -0
  350. package/dist/esm/CacheSync.d.ts.map +1 -0
  351. package/dist/esm/CacheSync.js +94 -0
  352. package/dist/esm/CacheSync.js.map +1 -0
  353. package/dist/esm/DeferredClockFold.d.ts +354 -0
  354. package/dist/esm/DeferredClockFold.d.ts.map +1 -0
  355. package/dist/esm/DeferredClockFold.js +472 -0
  356. package/dist/esm/DeferredClockFold.js.map +1 -0
  357. package/dist/esm/DisasterRecovery.d.ts +431 -0
  358. package/dist/esm/DisasterRecovery.d.ts.map +1 -0
  359. package/dist/esm/DisasterRecovery.js +523 -0
  360. package/dist/esm/DisasterRecovery.js.map +1 -0
  361. package/dist/esm/DurableEngineState.d.ts +776 -0
  362. package/dist/esm/DurableEngineState.d.ts.map +1 -0
  363. package/dist/esm/DurableEngineState.js +1648 -0
  364. package/dist/esm/DurableEngineState.js.map +1 -0
  365. package/dist/esm/EngineStore.d.ts +158 -0
  366. package/dist/esm/EngineStore.d.ts.map +1 -0
  367. package/dist/esm/EngineStore.js +403 -0
  368. package/dist/esm/EngineStore.js.map +1 -0
  369. package/dist/esm/EngineStoreMetrics.d.ts +276 -0
  370. package/dist/esm/EngineStoreMetrics.d.ts.map +1 -0
  371. package/dist/esm/EngineStoreMetrics.js +260 -0
  372. package/dist/esm/EngineStoreMetrics.js.map +1 -0
  373. package/dist/esm/Errors.d.ts +22 -0
  374. package/dist/esm/Errors.d.ts.map +1 -0
  375. package/dist/esm/Errors.js +22 -0
  376. package/dist/esm/Errors.js.map +1 -0
  377. package/dist/esm/EventTypes.d.ts +27 -0
  378. package/dist/esm/EventTypes.d.ts.map +1 -0
  379. package/dist/esm/EventTypes.js +27 -0
  380. package/dist/esm/EventTypes.js.map +1 -0
  381. package/dist/esm/ExecutionFacts.d.ts +59 -0
  382. package/dist/esm/ExecutionFacts.d.ts.map +1 -0
  383. package/dist/esm/ExecutionFacts.js +96 -0
  384. package/dist/esm/ExecutionFacts.js.map +1 -0
  385. package/dist/esm/ExecutionSnapshot.d.ts +117 -0
  386. package/dist/esm/ExecutionSnapshot.d.ts.map +1 -0
  387. package/dist/esm/ExecutionSnapshot.js +95 -0
  388. package/dist/esm/ExecutionSnapshot.js.map +1 -0
  389. package/dist/esm/Inconsistency.d.ts +154 -0
  390. package/dist/esm/Inconsistency.d.ts.map +1 -0
  391. package/dist/esm/Inconsistency.js +133 -0
  392. package/dist/esm/Inconsistency.js.map +1 -0
  393. package/dist/esm/Migrations.d.ts +56 -0
  394. package/dist/esm/Migrations.d.ts.map +1 -0
  395. package/dist/esm/Migrations.js +91 -0
  396. package/dist/esm/Migrations.js.map +1 -0
  397. package/dist/esm/OwnerIdentity.d.ts +91 -0
  398. package/dist/esm/OwnerIdentity.d.ts.map +1 -0
  399. package/dist/esm/OwnerIdentity.js +99 -0
  400. package/dist/esm/OwnerIdentity.js.map +1 -0
  401. package/dist/esm/PlanInputStore.d.ts +110 -0
  402. package/dist/esm/PlanInputStore.d.ts.map +1 -0
  403. package/dist/esm/PlanInputStore.js +207 -0
  404. package/dist/esm/PlanInputStore.js.map +1 -0
  405. package/dist/esm/PlanMergeStore.d.ts +113 -0
  406. package/dist/esm/PlanMergeStore.d.ts.map +1 -0
  407. package/dist/esm/PlanMergeStore.js +244 -0
  408. package/dist/esm/PlanMergeStore.js.map +1 -0
  409. package/dist/esm/PlanScheduler.d.ts +363 -0
  410. package/dist/esm/PlanScheduler.d.ts.map +1 -0
  411. package/dist/esm/PlanScheduler.js +1321 -0
  412. package/dist/esm/PlanScheduler.js.map +1 -0
  413. package/dist/esm/Reconciliation.d.ts +175 -0
  414. package/dist/esm/Reconciliation.d.ts.map +1 -0
  415. package/dist/esm/Reconciliation.js +175 -0
  416. package/dist/esm/Reconciliation.js.map +1 -0
  417. package/dist/esm/ReplayOnly.d.ts +91 -0
  418. package/dist/esm/ReplayOnly.d.ts.map +1 -0
  419. package/dist/esm/ReplayOnly.js +59 -0
  420. package/dist/esm/ReplayOnly.js.map +1 -0
  421. package/dist/esm/Retention.d.ts +113 -0
  422. package/dist/esm/Retention.d.ts.map +1 -0
  423. package/dist/esm/Retention.js +139 -0
  424. package/dist/esm/Retention.js.map +1 -0
  425. package/dist/esm/RunCatalogRead.d.ts +17 -0
  426. package/dist/esm/RunCatalogRead.d.ts.map +1 -0
  427. package/dist/esm/RunCatalogRead.js +17 -0
  428. package/dist/esm/RunCatalogRead.js.map +1 -0
  429. package/dist/esm/RunChangeFeed.d.ts +75 -0
  430. package/dist/esm/RunChangeFeed.d.ts.map +1 -0
  431. package/dist/esm/RunChangeFeed.js +81 -0
  432. package/dist/esm/RunChangeFeed.js.map +1 -0
  433. package/dist/esm/RunState.d.ts +116 -0
  434. package/dist/esm/RunState.d.ts.map +1 -0
  435. package/dist/esm/RunState.js +109 -0
  436. package/dist/esm/RunState.js.map +1 -0
  437. package/dist/esm/Selection.d.ts +495 -0
  438. package/dist/esm/Selection.d.ts.map +1 -0
  439. package/dist/esm/Selection.js +482 -0
  440. package/dist/esm/Selection.js.map +1 -0
  441. package/dist/esm/SelectionStore.d.ts +141 -0
  442. package/dist/esm/SelectionStore.d.ts.map +1 -0
  443. package/dist/esm/SelectionStore.js +215 -0
  444. package/dist/esm/SelectionStore.js.map +1 -0
  445. package/dist/esm/StepBoundary.d.ts +501 -0
  446. package/dist/esm/StepBoundary.d.ts.map +1 -0
  447. package/dist/esm/StepBoundary.js +919 -0
  448. package/dist/esm/StepBoundary.js.map +1 -0
  449. package/dist/esm/StepCacheFold.d.ts +148 -0
  450. package/dist/esm/StepCacheFold.d.ts.map +1 -0
  451. package/dist/esm/StepCacheFold.js +201 -0
  452. package/dist/esm/StepCacheFold.js.map +1 -0
  453. package/dist/esm/StepSandbox.d.ts +78 -0
  454. package/dist/esm/StepSandbox.d.ts.map +1 -0
  455. package/dist/esm/StepSandbox.js +70 -0
  456. package/dist/esm/StepSandbox.js.map +1 -0
  457. package/dist/esm/WakeBus.d.ts +116 -0
  458. package/dist/esm/WakeBus.d.ts.map +1 -0
  459. package/dist/esm/WakeBus.js +121 -0
  460. package/dist/esm/WakeBus.js.map +1 -0
  461. package/dist/esm/WorkspaceSandbox.d.ts +619 -0
  462. package/dist/esm/WorkspaceSandbox.d.ts.map +1 -0
  463. package/dist/esm/WorkspaceSandbox.js +985 -0
  464. package/dist/esm/WorkspaceSandbox.js.map +1 -0
  465. package/dist/esm/index.d.ts +157 -0
  466. package/dist/esm/index.d.ts.map +1 -0
  467. package/dist/esm/index.js +157 -0
  468. package/dist/esm/index.js.map +1 -0
  469. package/dist/esm/internal/ActionPersistence.d.ts +276 -0
  470. package/dist/esm/internal/ActionPersistence.d.ts.map +1 -0
  471. package/dist/esm/internal/ActionPersistence.js +2306 -0
  472. package/dist/esm/internal/ActionPersistence.js.map +1 -0
  473. package/dist/esm/internal/ArtifactRoots.d.ts +38 -0
  474. package/dist/esm/internal/ArtifactRoots.d.ts.map +1 -0
  475. package/dist/esm/internal/ArtifactRoots.js +76 -0
  476. package/dist/esm/internal/ArtifactRoots.js.map +1 -0
  477. package/dist/esm/internal/AttemptAdmission.d.ts +53 -0
  478. package/dist/esm/internal/AttemptAdmission.d.ts.map +1 -0
  479. package/dist/esm/internal/AttemptAdmission.js +52 -0
  480. package/dist/esm/internal/AttemptAdmission.js.map +1 -0
  481. package/dist/esm/internal/AttemptLifecycle.d.ts +245 -0
  482. package/dist/esm/internal/AttemptLifecycle.d.ts.map +1 -0
  483. package/dist/esm/internal/AttemptLifecycle.js +104 -0
  484. package/dist/esm/internal/AttemptLifecycle.js.map +1 -0
  485. package/dist/esm/internal/AttemptProbe.d.ts +53 -0
  486. package/dist/esm/internal/AttemptProbe.d.ts.map +1 -0
  487. package/dist/esm/internal/AttemptProbe.js +83 -0
  488. package/dist/esm/internal/AttemptProbe.js.map +1 -0
  489. package/dist/esm/internal/CacheAdmission.d.ts +79 -0
  490. package/dist/esm/internal/CacheAdmission.d.ts.map +1 -0
  491. package/dist/esm/internal/CacheAdmission.js +72 -0
  492. package/dist/esm/internal/CacheAdmission.js.map +1 -0
  493. package/dist/esm/internal/CacheAgeHistory.d.ts +27 -0
  494. package/dist/esm/internal/CacheAgeHistory.d.ts.map +1 -0
  495. package/dist/esm/internal/CacheAgeHistory.js +49 -0
  496. package/dist/esm/internal/CacheAgeHistory.js.map +1 -0
  497. package/dist/esm/internal/CacheAgeVerdicts.d.ts +15 -0
  498. package/dist/esm/internal/CacheAgeVerdicts.d.ts.map +1 -0
  499. package/dist/esm/internal/CacheAgeVerdicts.js +54 -0
  500. package/dist/esm/internal/CacheAgeVerdicts.js.map +1 -0
  501. package/dist/esm/internal/CacheOutputPolicy.d.ts +24 -0
  502. package/dist/esm/internal/CacheOutputPolicy.d.ts.map +1 -0
  503. package/dist/esm/internal/CacheOutputPolicy.js +73 -0
  504. package/dist/esm/internal/CacheOutputPolicy.js.map +1 -0
  505. package/dist/esm/internal/CachePublication.d.ts +97 -0
  506. package/dist/esm/internal/CachePublication.d.ts.map +1 -0
  507. package/dist/esm/internal/CachePublication.js +116 -0
  508. package/dist/esm/internal/CachePublication.js.map +1 -0
  509. package/dist/esm/internal/CallFacts.d.ts +15 -0
  510. package/dist/esm/internal/CallFacts.d.ts.map +1 -0
  511. package/dist/esm/internal/CallFacts.js +83 -0
  512. package/dist/esm/internal/CallFacts.js.map +1 -0
  513. package/dist/esm/internal/CopiedRecord.d.ts +61 -0
  514. package/dist/esm/internal/CopiedRecord.d.ts.map +1 -0
  515. package/dist/esm/internal/CopiedRecord.js +165 -0
  516. package/dist/esm/internal/CopiedRecord.js.map +1 -0
  517. package/dist/esm/internal/DeferredPersistence.d.ts +108 -0
  518. package/dist/esm/internal/DeferredPersistence.d.ts.map +1 -0
  519. package/dist/esm/internal/DeferredPersistence.js +240 -0
  520. package/dist/esm/internal/DeferredPersistence.js.map +1 -0
  521. package/dist/esm/internal/EffectRecords.d.ts +92 -0
  522. package/dist/esm/internal/EffectRecords.d.ts.map +1 -0
  523. package/dist/esm/internal/EffectRecords.js +94 -0
  524. package/dist/esm/internal/EffectRecords.js.map +1 -0
  525. package/dist/esm/internal/EngineJj.d.ts +30 -0
  526. package/dist/esm/internal/EngineJj.d.ts.map +1 -0
  527. package/dist/esm/internal/EngineJj.js +29 -0
  528. package/dist/esm/internal/EngineJj.js.map +1 -0
  529. package/dist/esm/internal/EngineStateSchema.d.ts +68 -0
  530. package/dist/esm/internal/EngineStateSchema.d.ts.map +1 -0
  531. package/dist/esm/internal/EngineStateSchema.js +53 -0
  532. package/dist/esm/internal/EngineStateSchema.js.map +1 -0
  533. package/dist/esm/internal/ExecutionSnapshotRead.d.ts +162 -0
  534. package/dist/esm/internal/ExecutionSnapshotRead.d.ts.map +1 -0
  535. package/dist/esm/internal/ExecutionSnapshotRead.js +218 -0
  536. package/dist/esm/internal/ExecutionSnapshotRead.js.map +1 -0
  537. package/dist/esm/internal/ExecutionSnapshotRelations.d.ts +39 -0
  538. package/dist/esm/internal/ExecutionSnapshotRelations.d.ts.map +1 -0
  539. package/dist/esm/internal/ExecutionSnapshotRelations.js +81 -0
  540. package/dist/esm/internal/ExecutionSnapshotRelations.js.map +1 -0
  541. package/dist/esm/internal/ExitEncoding.d.ts +180 -0
  542. package/dist/esm/internal/ExitEncoding.d.ts.map +1 -0
  543. package/dist/esm/internal/ExitEncoding.js +361 -0
  544. package/dist/esm/internal/ExitEncoding.js.map +1 -0
  545. package/dist/esm/internal/FileBoundarySnapshot.d.ts +14 -0
  546. package/dist/esm/internal/FileBoundarySnapshot.d.ts.map +1 -0
  547. package/dist/esm/internal/FileBoundarySnapshot.js +29 -0
  548. package/dist/esm/internal/FileBoundarySnapshot.js.map +1 -0
  549. package/dist/esm/internal/FileEnumeration.d.ts +127 -0
  550. package/dist/esm/internal/FileEnumeration.d.ts.map +1 -0
  551. package/dist/esm/internal/FileEnumeration.js +236 -0
  552. package/dist/esm/internal/FileEnumeration.js.map +1 -0
  553. package/dist/esm/internal/HostReflection.d.ts +80 -0
  554. package/dist/esm/internal/HostReflection.d.ts.map +1 -0
  555. package/dist/esm/internal/HostReflection.js +98 -0
  556. package/dist/esm/internal/HostReflection.js.map +1 -0
  557. package/dist/esm/internal/JournalRecords.d.ts +325 -0
  558. package/dist/esm/internal/JournalRecords.d.ts.map +1 -0
  559. package/dist/esm/internal/JournalRecords.js +306 -0
  560. package/dist/esm/internal/JournalRecords.js.map +1 -0
  561. package/dist/esm/internal/NodeJournal.d.ts +157 -0
  562. package/dist/esm/internal/NodeJournal.d.ts.map +1 -0
  563. package/dist/esm/internal/NodeJournal.js +298 -0
  564. package/dist/esm/internal/NodeJournal.js.map +1 -0
  565. package/dist/esm/internal/Ordering.d.ts +14 -0
  566. package/dist/esm/internal/Ordering.d.ts.map +1 -0
  567. package/dist/esm/internal/Ordering.js +14 -0
  568. package/dist/esm/internal/Ordering.js.map +1 -0
  569. package/dist/esm/internal/PlanInputs.d.ts +14 -0
  570. package/dist/esm/internal/PlanInputs.d.ts.map +1 -0
  571. package/dist/esm/internal/PlanInputs.js +57 -0
  572. package/dist/esm/internal/PlanInputs.js.map +1 -0
  573. package/dist/esm/internal/PlanMerges.d.ts +178 -0
  574. package/dist/esm/internal/PlanMerges.d.ts.map +1 -0
  575. package/dist/esm/internal/PlanMerges.js +113 -0
  576. package/dist/esm/internal/PlanMerges.js.map +1 -0
  577. package/dist/esm/internal/ProvenanceSlot.d.ts +30 -0
  578. package/dist/esm/internal/ProvenanceSlot.d.ts.map +1 -0
  579. package/dist/esm/internal/ProvenanceSlot.js +39 -0
  580. package/dist/esm/internal/ProvenanceSlot.js.map +1 -0
  581. package/dist/esm/internal/ResultEnvelope.d.ts +88 -0
  582. package/dist/esm/internal/ResultEnvelope.d.ts.map +1 -0
  583. package/dist/esm/internal/ResultEnvelope.js +83 -0
  584. package/dist/esm/internal/ResultEnvelope.js.map +1 -0
  585. package/dist/esm/internal/RetentionOps.d.ts +414 -0
  586. package/dist/esm/internal/RetentionOps.d.ts.map +1 -0
  587. package/dist/esm/internal/RetentionOps.js +576 -0
  588. package/dist/esm/internal/RetentionOps.js.map +1 -0
  589. package/dist/esm/internal/RunCatalogOps.d.ts +118 -0
  590. package/dist/esm/internal/RunCatalogOps.d.ts.map +1 -0
  591. package/dist/esm/internal/RunCatalogOps.js +120 -0
  592. package/dist/esm/internal/RunCatalogOps.js.map +1 -0
  593. package/dist/esm/internal/RunCoordinator.d.ts +78 -0
  594. package/dist/esm/internal/RunCoordinator.d.ts.map +1 -0
  595. package/dist/esm/internal/RunCoordinator.js +115 -0
  596. package/dist/esm/internal/RunCoordinator.js.map +1 -0
  597. package/dist/esm/internal/RunDriver.d.ts +192 -0
  598. package/dist/esm/internal/RunDriver.d.ts.map +1 -0
  599. package/dist/esm/internal/RunDriver.js +2334 -0
  600. package/dist/esm/internal/RunDriver.js.map +1 -0
  601. package/dist/esm/internal/RunLifecycle.d.ts +22 -0
  602. package/dist/esm/internal/RunLifecycle.d.ts.map +1 -0
  603. package/dist/esm/internal/RunLifecycle.js +49 -0
  604. package/dist/esm/internal/RunLifecycle.js.map +1 -0
  605. package/dist/esm/internal/RunListing.d.ts +78 -0
  606. package/dist/esm/internal/RunListing.d.ts.map +1 -0
  607. package/dist/esm/internal/RunListing.js +146 -0
  608. package/dist/esm/internal/RunListing.js.map +1 -0
  609. package/dist/esm/internal/RunListingError.d.ts +35 -0
  610. package/dist/esm/internal/RunListingError.d.ts.map +1 -0
  611. package/dist/esm/internal/RunListingError.js +27 -0
  612. package/dist/esm/internal/RunListingError.js.map +1 -0
  613. package/dist/esm/internal/RuntimeGraph.d.ts +73 -0
  614. package/dist/esm/internal/RuntimeGraph.d.ts.map +1 -0
  615. package/dist/esm/internal/RuntimeGraph.js +182 -0
  616. package/dist/esm/internal/RuntimeGraph.js.map +1 -0
  617. package/dist/esm/internal/SandboxedExecution.d.ts +80 -0
  618. package/dist/esm/internal/SandboxedExecution.d.ts.map +1 -0
  619. package/dist/esm/internal/SandboxedExecution.js +107 -0
  620. package/dist/esm/internal/SandboxedExecution.js.map +1 -0
  621. package/dist/esm/internal/StateTransaction.d.ts +44 -0
  622. package/dist/esm/internal/StateTransaction.d.ts.map +1 -0
  623. package/dist/esm/internal/StateTransaction.js +54 -0
  624. package/dist/esm/internal/StateTransaction.js.map +1 -0
  625. package/dist/esm/internal/StepFacts.d.ts +14 -0
  626. package/dist/esm/internal/StepFacts.d.ts.map +1 -0
  627. package/dist/esm/internal/StepFacts.js +35 -0
  628. package/dist/esm/internal/StepFacts.js.map +1 -0
  629. package/dist/esm/internal/TypedEvents.d.ts +14 -0
  630. package/dist/esm/internal/TypedEvents.d.ts.map +1 -0
  631. package/dist/esm/internal/TypedEvents.js +14 -0
  632. package/dist/esm/internal/TypedEvents.js.map +1 -0
  633. package/dist/esm/migrations/0001_initial.d.ts +17 -0
  634. package/dist/esm/migrations/0001_initial.d.ts.map +1 -0
  635. package/dist/esm/migrations/0001_initial.js +41 -0
  636. package/dist/esm/migrations/0001_initial.js.map +1 -0
  637. package/dist/esm/migrations/0002_selection_store.d.ts +15 -0
  638. package/dist/esm/migrations/0002_selection_store.d.ts.map +1 -0
  639. package/dist/esm/migrations/0002_selection_store.js +34 -0
  640. package/dist/esm/migrations/0002_selection_store.js.map +1 -0
  641. package/dist/esm/migrations/0003_plan_inputs.d.ts +13 -0
  642. package/dist/esm/migrations/0003_plan_inputs.d.ts.map +1 -0
  643. package/dist/esm/migrations/0003_plan_inputs.js +70 -0
  644. package/dist/esm/migrations/0003_plan_inputs.js.map +1 -0
  645. package/dist/esm/migrations/0004_plan_environment.d.ts +14 -0
  646. package/dist/esm/migrations/0004_plan_environment.d.ts.map +1 -0
  647. package/dist/esm/migrations/0004_plan_environment.js +33 -0
  648. package/dist/esm/migrations/0004_plan_environment.js.map +1 -0
  649. package/dist/esm/migrations/0005_plan_merges.d.ts +14 -0
  650. package/dist/esm/migrations/0005_plan_merges.d.ts.map +1 -0
  651. package/dist/esm/migrations/0005_plan_merges.js +59 -0
  652. package/dist/esm/migrations/0005_plan_merges.js.map +1 -0
  653. package/dist/esm/migrations/0006_execution_listing.d.ts +15 -0
  654. package/dist/esm/migrations/0006_execution_listing.d.ts.map +1 -0
  655. package/dist/esm/migrations/0006_execution_listing.js +81 -0
  656. package/dist/esm/migrations/0006_execution_listing.js.map +1 -0
  657. package/dist/esm/migrations/0007_run_parent_sequence.d.ts +15 -0
  658. package/dist/esm/migrations/0007_run_parent_sequence.d.ts.map +1 -0
  659. package/dist/esm/migrations/0007_run_parent_sequence.js +18 -0
  660. package/dist/esm/migrations/0007_run_parent_sequence.js.map +1 -0
  661. package/dist/esm/migrations/0008_deferred_consumption.d.ts +16 -0
  662. package/dist/esm/migrations/0008_deferred_consumption.d.ts.map +1 -0
  663. package/dist/esm/migrations/0008_deferred_consumption.js +24 -0
  664. package/dist/esm/migrations/0008_deferred_consumption.js.map +1 -0
  665. package/dist/esm/migrations/0009_deferred_clock_facts.d.ts +24 -0
  666. package/dist/esm/migrations/0009_deferred_clock_facts.d.ts.map +1 -0
  667. package/dist/esm/migrations/0009_deferred_clock_facts.js +127 -0
  668. package/dist/esm/migrations/0009_deferred_clock_facts.js.map +1 -0
  669. package/dist/esm/migrations/0010_pending_cancellation.d.ts +15 -0
  670. package/dist/esm/migrations/0010_pending_cancellation.d.ts.map +1 -0
  671. package/dist/esm/migrations/0010_pending_cancellation.js +19 -0
  672. package/dist/esm/migrations/0010_pending_cancellation.js.map +1 -0
  673. package/dist/esm/test/TestStores.d.ts +89 -0
  674. package/dist/esm/test/TestStores.d.ts.map +1 -0
  675. package/dist/esm/test/TestStores.js +103 -0
  676. package/dist/esm/test/TestStores.js.map +1 -0
  677. package/docs/README.md +113 -0
  678. package/docs/api.md +1494 -0
  679. package/docs/concepts/attempts-and-replay.md +149 -0
  680. package/docs/concepts/cache-admission.md +265 -0
  681. package/docs/concepts/call-facts.md +86 -0
  682. package/docs/concepts/durable-waits.md +175 -0
  683. package/docs/concepts/execution-facts.md +90 -0
  684. package/docs/concepts/ownership-and-fencing.md +128 -0
  685. package/docs/concepts/step-boundaries.md +148 -0
  686. package/docs/concepts/workspace-transactions.md +199 -0
  687. package/docs/event-types.md +14 -0
  688. package/docs/guides/back-up-and-restore.md +164 -0
  689. package/docs/guides/collect-unreferenced-artifacts.md +128 -0
  690. package/docs/guides/compose-a-durable-engine.md +146 -0
  691. package/docs/guides/coordinate-two-processes.md +120 -0
  692. package/docs/guides/defer-work-with-selection.md +171 -0
  693. package/docs/guides/delete-old-run-history.md +154 -0
  694. package/docs/guides/drive-a-plan.md +314 -0
  695. package/docs/guides/observe-engine-metrics.md +98 -0
  696. package/docs/guides/observe-executions.md +187 -0
  697. package/docs/guides/reclaim-runs-from-a-dead-host.md +133 -0
  698. package/docs/guides/share-a-cache-across-machines.md +134 -0
  699. package/docs/guides/testing.md +123 -0
  700. package/docs/installation.md +102 -0
  701. package/docs/quickstart.md +215 -0
  702. package/docs/troubleshooting.md +347 -0
  703. package/package.json +438 -3
  704. package/src/ArtifactGc.ts +408 -0
  705. package/src/ArtifactSync.ts +278 -0
  706. package/src/CacheSync.ts +131 -0
  707. package/src/DeferredClockFold.ts +586 -0
  708. package/src/DisasterRecovery.ts +888 -0
  709. package/src/DurableEngineState.ts +2656 -0
  710. package/src/EngineStore.ts +656 -0
  711. package/src/EngineStoreMetrics.ts +331 -0
  712. package/src/Errors.ts +28 -0
  713. package/src/EventTypes.ts +27 -0
  714. package/src/ExecutionFacts.ts +125 -0
  715. package/src/ExecutionSnapshot.ts +186 -0
  716. package/src/Inconsistency.ts +253 -0
  717. package/src/Migrations.ts +95 -0
  718. package/src/OwnerIdentity.ts +125 -0
  719. package/src/PlanInputStore.ts +292 -0
  720. package/src/PlanMergeStore.ts +330 -0
  721. package/src/PlanScheduler.ts +1806 -0
  722. package/src/Reconciliation.ts +224 -0
  723. package/src/ReplayOnly.ts +95 -0
  724. package/src/Retention.ts +214 -0
  725. package/src/RunCatalogRead.ts +27 -0
  726. package/src/RunChangeFeed.ts +125 -0
  727. package/src/RunState.ts +137 -0
  728. package/src/Selection.ts +683 -0
  729. package/src/SelectionStore.ts +353 -0
  730. package/src/StepBoundary.ts +1165 -0
  731. package/src/StepCacheFold.ts +244 -0
  732. package/src/StepSandbox.ts +110 -0
  733. package/src/WakeBus.ts +167 -0
  734. package/src/WorkspaceSandbox.ts +1604 -0
  735. package/src/index.ts +185 -0
  736. package/src/internal/ActionPersistence.ts +2687 -0
  737. package/src/internal/ArtifactRoots.ts +92 -0
  738. package/src/internal/AttemptAdmission.ts +76 -0
  739. package/src/internal/AttemptLifecycle.ts +163 -0
  740. package/src/internal/AttemptProbe.ts +90 -0
  741. package/src/internal/CacheAdmission.ts +133 -0
  742. package/src/internal/CacheAgeHistory.ts +58 -0
  743. package/src/internal/CacheAgeVerdicts.ts +61 -0
  744. package/src/internal/CacheOutputPolicy.ts +82 -0
  745. package/src/internal/CachePublication.ts +153 -0
  746. package/src/internal/CallFacts.ts +87 -0
  747. package/src/internal/CopiedRecord.ts +201 -0
  748. package/src/internal/DeferredPersistence.ts +459 -0
  749. package/src/internal/EffectRecords.ts +136 -0
  750. package/src/internal/EngineJj.ts +30 -0
  751. package/src/internal/EngineStateSchema.ts +92 -0
  752. package/src/internal/ExecutionSnapshotRead.ts +300 -0
  753. package/src/internal/ExecutionSnapshotRelations.ts +121 -0
  754. package/src/internal/ExitEncoding.ts +453 -0
  755. package/src/internal/FileBoundarySnapshot.ts +39 -0
  756. package/src/internal/FileEnumeration.ts +334 -0
  757. package/src/internal/HostReflection.ts +128 -0
  758. package/src/internal/JournalRecords.ts +396 -0
  759. package/src/internal/NodeJournal.ts +340 -0
  760. package/src/internal/Ordering.ts +14 -0
  761. package/src/internal/PlanInputs.ts +62 -0
  762. package/src/internal/PlanMerges.ts +123 -0
  763. package/src/internal/ProvenanceSlot.ts +52 -0
  764. package/src/internal/ResultEnvelope.ts +118 -0
  765. package/src/internal/RetentionOps.ts +865 -0
  766. package/src/internal/RunCatalogOps.ts +174 -0
  767. package/src/internal/RunCoordinator.ts +215 -0
  768. package/src/internal/RunDriver.ts +3154 -0
  769. package/src/internal/RunLifecycle.ts +53 -0
  770. package/src/internal/RunListing.ts +210 -0
  771. package/src/internal/RunListingError.ts +37 -0
  772. package/src/internal/RuntimeGraph.ts +253 -0
  773. package/src/internal/SandboxedExecution.ts +165 -0
  774. package/src/internal/StateTransaction.ts +71 -0
  775. package/src/internal/StepFacts.ts +36 -0
  776. package/src/internal/TypedEvents.ts +29 -0
  777. package/src/migrations/0001_initial.ts +51 -0
  778. package/src/migrations/0002_selection_store.ts +38 -0
  779. package/src/migrations/0003_plan_inputs.ts +75 -0
  780. package/src/migrations/0004_plan_environment.ts +34 -0
  781. package/src/migrations/0005_plan_merges.ts +60 -0
  782. package/src/migrations/0006_execution_listing.ts +86 -0
  783. package/src/migrations/0007_run_parent_sequence.ts +19 -0
  784. package/src/migrations/0008_deferred_consumption.ts +27 -0
  785. package/src/migrations/0009_deferred_clock_facts.ts +163 -0
  786. package/src/migrations/0010_pending_cancellation.ts +20 -0
  787. package/src/test/TestStores.ts +145 -0
@@ -0,0 +1,919 @@
1
+ /**
2
+ * Hermetic step boundary contracts, the filesystem-backed production
3
+ * implementation, and the deterministic test implementation.
4
+ *
5
+ * @since 0.1.0
6
+ */
7
+ import * as ArtifactStore from "@smthrs/artifacts/ArtifactStore";
8
+ import { Sha256 } from "@smthrs/crypto";
9
+ import { FileBoundary } from "@smthrs/flow/FileBoundary";
10
+ import { FileInput } from "@smthrs/flow/FileInput";
11
+ import * as KernelFileSystem from "@smthrs/kernel/FileSystem";
12
+ import { Workspace as KernelWorkspace } from "@smthrs/kernel/Workspace";
13
+ import { DerivedKey } from "@smthrs/keys";
14
+ import * as FileSet from "@smthrs/plan/FileSet";
15
+ import * as Context from "effect/Context";
16
+ import * as Effect from "effect/Effect";
17
+ import * as Encoding from "effect/Encoding";
18
+ import * as FileSystem from "effect/FileSystem";
19
+ import * as Layer from "effect/Layer";
20
+ import * as Path from "effect/Path";
21
+ import * as Result from "effect/Result";
22
+ import * as Schema from "effect/Schema";
23
+ import * as FileBoundarySnapshot from "./internal/FileBoundarySnapshot.js";
24
+ import * as FileEnumeration from "./internal/FileEnumeration.js";
25
+ import { compareText } from "./internal/Ordering.js";
26
+ /**
27
+ * A file boundary that has been measured but not yet run: the caller's
28
+ * declaration, paired with what the host actually found on disk for it.
29
+ *
30
+ * `prepare` produces one of these before a step executes and `settle` consumes
31
+ * it afterwards, which is what lets the boundary say whether the world moved
32
+ * underneath the declaration. Check it with {@link readSetMatches}.
33
+ *
34
+ * @since 0.1.0
35
+ * @category schemas
36
+ */
37
+ export const PreparedBoundary = Schema.Struct({
38
+ descriptor: FileBoundary,
39
+ /**
40
+ * What the host actually measured for the declared read set at prepare
41
+ * time. The declared digests are caller metadata folded into the step key;
42
+ * this is the evidence that they still describe reality, and a sealed
43
+ * cache hit is refused when the two disagree (issue #90).
44
+ */
45
+ readSnapshot: Schema.Array(FileInput)
46
+ });
47
+ /**
48
+ * Exact read inputs from a boundary after ignoring declarations that still need expansion.
49
+ *
50
+ * @category accessors
51
+ * @since 0.1.0
52
+ */
53
+ export const exactReads = (descriptor) => descriptor.readSet.filter((entry) => !FileSet.isGlob(entry));
54
+ /**
55
+ * Whether every declared read still matches what the host measured.
56
+ *
57
+ * Reads the host reports but the declaration never claimed are ignored: the
58
+ * declaration is the dependency edge set, and an incidental extra read is not
59
+ * one of its edges. A declared path missing from the measurement counts as a
60
+ * mismatch — its value is unknown, so reuse cannot be justified.
61
+ *
62
+ * @since 0.1.0
63
+ * @category predicates
64
+ */
65
+ export const readSetMatches = (prepared) => {
66
+ const digestsByPath = new Map();
67
+ for (const measured of prepared.readSnapshot) {
68
+ const digests = digestsByPath.get(measured.path);
69
+ if (digests === undefined)
70
+ digestsByPath.set(measured.path, new Set([measured.digest]));
71
+ else
72
+ digests.add(measured.digest);
73
+ }
74
+ return prepared.descriptor.readSet.every((entry) => !FileSet.isGlob(entry) &&
75
+ digestsByPath.get(entry.path)?.has(entry.digest) === true);
76
+ };
77
+ /**
78
+ * The paths a step wrote that its `expected` write set did not name, together
79
+ * with the diff identity they were observed under.
80
+ *
81
+ * An expected-mode boundary reports these rather than failing: the declaration
82
+ * is a prediction, and a wrong prediction is evidence to journal, not an
83
+ * error. A hard-mode boundary raises {@link UndeclaredWrite} for the same
84
+ * observation.
85
+ *
86
+ * @since 0.1.0
87
+ * @category schemas
88
+ */
89
+ export const ExpectedSetDeviation = Schema.TaggedStruct("ExpectedSetDeviation", {
90
+ paths: Schema.Array(Schema.String),
91
+ diffIdentity: Schema.NonEmptyString
92
+ });
93
+ /**
94
+ * Declared writes an expected-mode step did not produce, and did not declare
95
+ * as removals.
96
+ *
97
+ * The absence itself is the defect: recording it as valid evidence caches the
98
+ * claim "this file should not exist", which `replayOutputs` then acts on by
99
+ * deleting the path on a workspace that never ran the step. A hard-mode
100
+ * boundary raises {@link MissingDeclaredOutput} for the same observation.
101
+ *
102
+ * Expected mode records it rather than failing because the declaration there is
103
+ * a prediction — and because a deviation of any variant already bars the
104
+ * evidence from the shared cache (`ActionPersistence` gates `recordCache` on
105
+ * `deviation === undefined`), so an unexplained absence never reaches another
106
+ * host either way.
107
+ *
108
+ * @since 0.1.0
109
+ * @category schemas
110
+ */
111
+ export const MissingOutputDeviation = Schema.TaggedStruct("MissingDeclaredOutput", {
112
+ paths: Schema.Array(Schema.String),
113
+ diffIdentity: Schema.NonEmptyString
114
+ });
115
+ /**
116
+ * Declared removals an expected-mode step left in place.
117
+ *
118
+ * The dual of {@link MissingOutputDeviation}: a removal is a promise about the
119
+ * post-state exactly as a write is. A path that was promised absent but is
120
+ * still present — possibly mutated — must not settle as valid evidence, or
121
+ * the mutation is cached under a declaration that disclaimed it and replay
122
+ * materializes it everywhere. A hard-mode boundary raises
123
+ * {@link SurvivingDeclaredRemoval} for the same observation.
124
+ *
125
+ * @since 0.1.0
126
+ * @category schemas
127
+ */
128
+ export const SurvivingRemovalDeviation = Schema.TaggedStruct("SurvivingDeclaredRemoval", {
129
+ paths: Schema.Array(Schema.String),
130
+ diffIdentity: Schema.NonEmptyString
131
+ });
132
+ /**
133
+ * What a settled boundary observed that its declaration did not predict.
134
+ *
135
+ * @since 0.1.0
136
+ * @category schemas
137
+ */
138
+ export const BoundaryDeviation = Schema.Union([ExpectedSetDeviation, MissingOutputDeviation, SurvivingRemovalDeviation]);
139
+ /**
140
+ * What a settled boundary proved about a step's writes — the record the
141
+ * journal keeps and a later cache hit is justified against.
142
+ *
143
+ * `diffIdentity` names the post-state the step produced; `declaredOutputs`
144
+ * carries whatever the implementation needs to reproduce it on a workspace
145
+ * that never ran the step. The two optional fields are the honest gaps:
146
+ * `wholeTreeWritesVerified` is present only when the boundary could observe
147
+ * the entire execution tree, and `deviation` only when it saw writes the
148
+ * declaration did not predict.
149
+ *
150
+ * @since 0.1.0
151
+ * @category schemas
152
+ */
153
+ export const BoundaryEvidence = Schema.Struct({
154
+ declaredOutputs: Schema.Unknown,
155
+ diffIdentity: Schema.NonEmptyString,
156
+ /**
157
+ * The boundary observed the whole execution tree and proved that every
158
+ * write was covered by the descriptor's write set. Only evidence carrying
159
+ * this explicit proof may enter the cross-run cache. Older evidence and
160
+ * boundaries that can inspect declared paths only omit it.
161
+ */
162
+ wholeTreeWritesVerified: Schema.optional(Schema.Literal(true)),
163
+ /** The body could observe only declared filesystem inputs. */
164
+ hermeticReadsVerified: Schema.optional(Schema.Literal(true)),
165
+ deviation: Schema.optional(BoundaryDeviation)
166
+ });
167
+ /**
168
+ * A hard-mode step wrote outside its declared write set.
169
+ *
170
+ * Hard mode treats the declaration as a contract, so this is a refusal, not a
171
+ * report: the step's evidence is never journaled and never becomes a cache
172
+ * entry. An expected-mode boundary records the same observation as a
173
+ * {@link BoundaryDeviation} instead.
174
+ *
175
+ * @since 0.1.0
176
+ * @category errors
177
+ */
178
+ export class UndeclaredWrite extends Schema.TaggedError()("@smthrs/engine-store/UndeclaredWrite", {
179
+ code: Schema.Literal("undeclared_write"),
180
+ paths: Schema.Array(Schema.String),
181
+ diffIdentity: Schema.NonEmptyString
182
+ }) {
183
+ }
184
+ /**
185
+ * A step finished without producing a path its write set declared, and did not
186
+ * declare that path as a removal.
187
+ *
188
+ * Bazel hard-fails the same observation — `SkyframeActionExecutor.checkOutputs`
189
+ * reports "output was not created" — and for the same reason: the alternative
190
+ * is to record `digest: null` as valid evidence, which caches the claim "this
191
+ * file should not exist" and makes every later replay delete the path. A step
192
+ * that crashed after declaring its writes would poison the cache with an
193
+ * eraser.
194
+ *
195
+ * Declaring the path in {@link FileBoundary}'s `removes` is how a deliberate
196
+ * deletion says so, and it is the only thing that makes the absence legitimate.
197
+ *
198
+ * @since 0.1.0
199
+ * @category errors
200
+ */
201
+ export class MissingDeclaredOutput extends Schema.TaggedError()("@smthrs/engine-store/MissingDeclaredOutput", {
202
+ code: Schema.Literal("missing_declared_output"),
203
+ paths: Schema.Array(Schema.String),
204
+ diffIdentity: Schema.NonEmptyString
205
+ }) {
206
+ }
207
+ /**
208
+ * A hard-mode step left a declared removal in place.
209
+ *
210
+ * The dual of {@link MissingDeclaredOutput}: `removes` promises the path is
211
+ * absent afterwards, and a path that survived — or was quietly rewritten —
212
+ * is a post-state the declaration disclaimed. Settling it as evidence would
213
+ * cache the surviving bytes under a removal and hand them to every replay.
214
+ *
215
+ * @since 0.1.0
216
+ * @category errors
217
+ */
218
+ export class SurvivingDeclaredRemoval extends Schema.TaggedError()("@smthrs/engine-store/SurvivingDeclaredRemoval", {
219
+ code: Schema.Literal("surviving_declared_removal"),
220
+ paths: Schema.Array(Schema.String),
221
+ diffIdentity: Schema.NonEmptyString
222
+ }) {
223
+ }
224
+ /**
225
+ * The host could not honour the boundary at all — a filesystem that cannot be
226
+ * measured, a path that cannot be read, a transient I/O failure.
227
+ *
228
+ * It is the catch-all host refusal, deliberately kept distinct from the two
229
+ * refusals a caller can act on: {@link BoundaryCorruption} (the bytes changed
230
+ * under a recorded digest) and {@link MissingArtifact} (the bytes might be
231
+ * fetchable from a shared tier).
232
+ *
233
+ * @since 0.1.0
234
+ * @category errors
235
+ */
236
+ export class UnsupportedBoundary extends Schema.TaggedError()("@smthrs/engine-store/UnsupportedBoundary", {
237
+ code: Schema.Literal("unsupported_boundary"),
238
+ message: Schema.String,
239
+ /**
240
+ * The refusing host or artifact-store failure, carried whole rather than
241
+ * flattened into the message (`PlatformError`'s own convention), so the
242
+ * journal record and a live debugger both see the original error.
243
+ */
244
+ cause: Schema.optional(Schema.Defect())
245
+ }) {
246
+ }
247
+ /**
248
+ * Recorded boundary evidence whose bytes no longer match their recorded
249
+ * digest — an integrity violation of the store's strongest invariant, as
250
+ * opposed to a transient host failure (issue #150). The two classes were
251
+ * previously conflated under one `UnsupportedBoundary` tag, so a failing
252
+ * disk corrupting many blobs journalled identically to a one-off EIO.
253
+ *
254
+ * @since 0.1.0
255
+ * @category errors
256
+ */
257
+ export class BoundaryCorruption extends Schema.TaggedError()("@smthrs/engine-store/BoundaryCorruption", {
258
+ code: Schema.Literal("boundary_corruption"),
259
+ path: Schema.String,
260
+ recordedDigest: Schema.String,
261
+ measuredDigest: Schema.String
262
+ }) {
263
+ }
264
+ /**
265
+ * Recorded evidence references an artifact this host's store does not hold
266
+ * (issue #172). Distinct from {@link UnsupportedBoundary} because it is the one
267
+ * replay refusal a *shared artifact tier* can repair: the caller fetches the
268
+ * blob from the remote store, writes it back locally, and retries the replay
269
+ * once before falling through to a real execution. Every other host refusal
270
+ * says nothing about where the bytes might be.
271
+ *
272
+ * @since 0.1.0
273
+ * @category errors
274
+ */
275
+ export class MissingArtifact extends Schema.TaggedError()("@smthrs/engine-store/MissingArtifact", {
276
+ code: Schema.Literal("missing_artifact"),
277
+ path: Schema.String,
278
+ digest: Schema.String
279
+ }) {
280
+ }
281
+ /**
282
+ * The service key for a {@link Service}. Provide it with `layer` for
283
+ * a real workspace or `layerTest` for a deterministic in-memory one.
284
+ *
285
+ * @since 0.1.0
286
+ * @category services
287
+ */
288
+ export const StepBoundary = Context.Service("@smthrs/engine-store/StepBoundary");
289
+ /**
290
+ * Brands a {@link Service} implementation as a `StepBoundary`, so a new
291
+ * boundary backend is type-checked where it is written rather than where it is
292
+ * provided.
293
+ *
294
+ * @since 0.1.0
295
+ * @category constructors
296
+ */
297
+ export const make = (service) => StepBoundary.of(service);
298
+ /**
299
+ * The digest a measurement reports for a declared path that does not exist.
300
+ * Declared digests are hex SHA-256 strings, so the sentinel can never
301
+ * collide with a real measurement — a declaration naming a vanished file
302
+ * always mismatches and the cache hit is refused.
303
+ */
304
+ const absentDigest = "absent";
305
+ /**
306
+ * The persisted shape of the production layer's `declaredOutputs`: the
307
+ * declared write set's materialized post-state, so a cache-hit replay can
308
+ * reproduce the outputs on a workspace that never ran the step.
309
+ *
310
+ * Outputs are recorded by content digest, never inlined unbounded
311
+ * (issue #113): a `null` digest records that the path did not exist at
312
+ * settle time; `content` (base64) is present only when the payload fits the
313
+ * configured inline bound, otherwise the bytes live in the host's
314
+ * content-addressed object directory under the digest and the row carries
315
+ * only the reference. Temporal's blob-size limits are the prior art — the
316
+ * evidence is persisted into every attempt row and cache entry.
317
+ *
318
+ * The digest is decoded against the store's strict address schema
319
+ * (`ArtifactStore.Digest`), so a persisted row carrying a malformed address
320
+ * fails the decode here instead of reaching the store or the sync RPCs.
321
+ */
322
+ const DigestReferencedOutput = Schema.Struct({
323
+ path: Schema.String,
324
+ digest: Schema.NullOr(ArtifactStore.Digest),
325
+ sizeBytes: Schema.optional(Schema.Number),
326
+ content: Schema.optional(Schema.String)
327
+ });
328
+ const MaterializedOutputs = Schema.Struct({
329
+ outputs: Schema.Array(DigestReferencedOutput),
330
+ trees: Schema.optional(Schema.Array(Schema.Struct({
331
+ path: Schema.String,
332
+ identity: Schema.String
333
+ })))
334
+ });
335
+ /**
336
+ * The directory portion of a slash-separated path, or `undefined` for a
337
+ * bare filename (nothing to create). Boundary paths are workspace-relative
338
+ * and slash-separated — the same normalization the kernel `FileSystem`
339
+ * layer applies.
340
+ */
341
+ const parentDirectory = (path) => {
342
+ const index = path.lastIndexOf("/");
343
+ return index <= 0 ? undefined : path.slice(0, index);
344
+ };
345
+ const hostFailure = (cause) => new UnsupportedBoundary({
346
+ code: "unsupported_boundary",
347
+ message: "the host filesystem could not enforce the step boundary",
348
+ cause
349
+ });
350
+ /**
351
+ * An artifact store that refused the operation outright — a failing disk, an
352
+ * unreachable shared tier, an address that is not a content address. Unlike a
353
+ * miss or a corruption it says nothing about the artifact, so it stays the
354
+ * ordinary retryable host refusal the issue-#107 call sites already handle.
355
+ */
356
+ const artifactFailure = (cause) => new UnsupportedBoundary({
357
+ code: "unsupported_boundary",
358
+ message: `the artifact store could not serve the step boundary: ${cause.message}`,
359
+ cause
360
+ });
361
+ /**
362
+ * Corruption of an *inline* evidence payload (issue #159): the recorded
363
+ * base64 no longer decodes, so there are no bytes to measure a digest of —
364
+ * the `invalid_base64` sentinel records that the measurement itself was
365
+ * impossible, which is still cache-origin corruption and never a transient
366
+ * host refusal.
367
+ */
368
+ const inlineCorruption = (path, recordedDigest) => new BoundaryCorruption({
369
+ code: "boundary_corruption",
370
+ path,
371
+ recordedDigest,
372
+ measuredDigest: "invalid_base64"
373
+ });
374
+ const defaultMaxInlineBytes = 1024 * 1024;
375
+ const defaultMaxTotalInlineBytes = 8 * 1024 * 1024;
376
+ /**
377
+ * The digests this evidence references rather than inlines — the set that must
378
+ * be durable in a shared artifact tier before the evidence's cache entry
379
+ * becomes observable there, and the set a replay on a fresh host has to fetch.
380
+ *
381
+ * Evidence recorded by a foreign boundary implementation references nothing
382
+ * this store can name, so it yields the empty list rather than failing: the
383
+ * caller's replay path already refuses such evidence with
384
+ * {@link UnsupportedBoundary}.
385
+ *
386
+ * @since 0.1.0
387
+ * @category accessors
388
+ */
389
+ export const referencedDigests = (evidence) => {
390
+ const decoded = Schema.decodeUnknownResult(MaterializedOutputs)(evidence.declaredOutputs);
391
+ if (decoded._tag === "Failure")
392
+ return [];
393
+ const digests = [];
394
+ for (const output of decoded.success.outputs) {
395
+ if (output.digest === null || output.content !== undefined)
396
+ continue;
397
+ digests.push(output.digest);
398
+ }
399
+ return digests;
400
+ };
401
+ /**
402
+ * Builds the filesystem-backed boundary service.
403
+ *
404
+ * The blob mechanics — content addressing, atomic publication, digest
405
+ * verification, dedupe — belong to `artifacts` and were extracted into
406
+ * `@smthrs/artifacts` (`packages/smithers/flows/artifacts/docs/api.md`). What stays here
407
+ * is the *policy* that decides which outputs become blobs at all: the
408
+ * inline-versus-spill budgets are a property of how large an evidence row may
409
+ * get, not of how bytes are stored.
410
+ *
411
+ * @since 0.1.0
412
+ * @category constructors
413
+ */
414
+ export const makeFileSystem = (fs, platformPath, artifacts, options = {}) => {
415
+ const maxInlineBytes = options.maxInlineBytes ?? defaultMaxInlineBytes;
416
+ const maxTotalInlineBytes = options.maxTotalInlineBytes ?? defaultMaxTotalInlineBytes;
417
+ // Stat tuples are not content identities: a same-size rewrite can preserve
418
+ // mtime, device, and inode on every supported filesystem.
419
+ const readDigestFrom = Effect.fn("StepBoundary.readDigest")(function* (host, path) {
420
+ const bytes = yield* host.readFile(path);
421
+ const digest = yield* Schema.decodeUnknownEffect(Sha256)(bytes).pipe(Effect.orDie);
422
+ return { digest, bytes };
423
+ });
424
+ const readDigest = (path) => readDigestFrom(fs, path);
425
+ const batch = KernelFileSystem.batch(fs);
426
+ const measurements = Effect.fn("StepBoundary.measurements")(function* (paths, content) {
427
+ if (batch === undefined) {
428
+ return yield* Effect.forEach(paths, (path) => readDigest(path).pipe(Effect.map((value) => ({
429
+ digest: value.digest,
430
+ sizeBytes: value.bytes.length,
431
+ ...(content ? { bytes: value.bytes } : {})
432
+ })), Effect.catchReason("PlatformError", "NotFound", () => Effect.succeed(undefined)), Effect.mapError(hostFailure)), { concurrency: KernelFileSystem.fallbackConcurrency });
433
+ }
434
+ const values = [];
435
+ for (let offset = 0; offset < paths.length; offset += batch.maxSize) {
436
+ const response = yield* batch.execute(paths.slice(offset, offset + batch.maxSize).map((path) => ({
437
+ operation: "digest",
438
+ path,
439
+ content
440
+ }))).pipe(Effect.mapError(hostFailure));
441
+ for (const entry of [...response.entries].sort((a, b) => a.index - b.index)) {
442
+ const measured = yield* Effect.fromResult(entry.result).pipe(Effect.catchReason("PlatformError", "NotFound", () => Effect.succeed(undefined)), Effect.mapError(hostFailure));
443
+ if (measured === undefined)
444
+ values.push(undefined);
445
+ else if (measured.operation !== "digest") {
446
+ return yield* Effect.fail(hostFailure(new Error("host returned a non-digest batch result")));
447
+ }
448
+ else
449
+ values.push({ ...measured, digest: measured.digest });
450
+ }
451
+ }
452
+ return values;
453
+ });
454
+ /**
455
+ * One host call, never two. An `exists` probe ahead of the read asked
456
+ * exactly what the read itself answers — a path that is not there refuses
457
+ * with `NotFound` — and every declared read was therefore measured twice.
458
+ * On the confined host that is two CPython forks per path
459
+ * (`@smthrs/platform-node/AtomicFileSystem` spawns one interpreter per
460
+ * operation, ~130 ms each), so the probe doubled the cost of every
461
+ * `prepare`, every post-body change check, and every materialization.
462
+ */
463
+ const measure = (path, host = fs) => readDigestFrom(host, path).pipe(Effect.map((measured) => measured.digest), Effect.catchReason("PlatformError", "NotFound", () => Effect.succeed(absentDigest)), Effect.mapError(hostFailure));
464
+ // Both expansions enumerate through `FileEnumeration`, never the host
465
+ // `glob`: host results are absolute under the kernel FileSystem and skip
466
+ // dotfiles under Node's matcher, so trusting them silently emptied every
467
+ // workspace-relative expansion and let a tree replay delete dotfiles the
468
+ // producer wrote.
469
+ const expandGlob = Effect.fn("StepBoundary.expandGlob")(function* (glob) {
470
+ return yield* FileEnumeration.expandGlob(fs, glob).pipe(Effect.mapError(hostFailure));
471
+ });
472
+ const treeEntries = Effect.fn("StepBoundary.treeEntries")(function* (host, path) {
473
+ return yield* FileEnumeration.entriesUnder(host, path).pipe(Effect.mapError(hostFailure));
474
+ });
475
+ // Replay writes and deletes what evidence names, so the lexical check alone
476
+ // is not a boundary: a symlink planted on a lexically valid path would carry
477
+ // the mutation outside the workspace. Every replay mutation, its probes, and
478
+ // its prune walk go through a view pinned to the root, where each call is
479
+ // one descriptor-relative, no-follow request and a symlink anywhere on the
480
+ // path is refused rather than followed. `prepare` and `settle` only read,
481
+ // and keep the caller's filesystem.
482
+ const replayRoot = KernelFileSystem.confinedRoot(fs) ?? options.root ?? ".";
483
+ const replayHost = KernelFileSystem.isConfinable(fs)
484
+ ? KernelFileSystem.confined(fs, replayRoot).pipe(Effect.provideService(Path.Path, platformPath), Effect.mapError(hostFailure))
485
+ : Effect.fail(new UnsupportedBoundary({
486
+ code: "unsupported_boundary",
487
+ message: "cache replay needs a confined host filesystem; the host carries no descriptor-relative executor or isolation attestation"
488
+ }));
489
+ const capture = Effect.fn("StepBoundary.capture")(function* (path, inlineBudget, measured) {
490
+ yield* Effect.annotateCurrentSpan({ path });
491
+ // As in `measure`: the read reports absence itself, so the output is
492
+ // captured in one host call rather than an `exists` probe plus a read.
493
+ if (measured === undefined) {
494
+ return { output: { path, digest: null }, inlinedBytes: 0 };
495
+ }
496
+ const bytes = measured.bytes;
497
+ if (bytes === undefined)
498
+ return yield* Effect.fail(hostFailure(new Error("host omitted requested batch content")));
499
+ const digest = measured.digest;
500
+ // Inline only while both bounds hold (issue #122): the per-output bound
501
+ // and the settle-wide aggregate budget the caller threads through.
502
+ if (bytes.length <= maxInlineBytes && bytes.length <= inlineBudget) {
503
+ return {
504
+ output: {
505
+ path,
506
+ digest,
507
+ sizeBytes: bytes.length,
508
+ content: Encoding.encodeBase64(bytes)
509
+ },
510
+ inlinedBytes: bytes.length
511
+ };
512
+ }
513
+ // Over the inline bound: the payload goes to the content-addressed
514
+ // artifact store and the persisted row carries only the reference. Every
515
+ // property that used to live here — atomic publication, verify-once
516
+ // dedupe, healing rewrite of a corrupt address — is now the store's, and
517
+ // is tested there (`@smthrs/artifacts`).
518
+ const stored = yield* artifacts.put(bytes).pipe(Effect.mapError(artifactFailure));
519
+ if (stored !== digest) {
520
+ return yield* Effect.fail(new BoundaryCorruption({
521
+ code: "boundary_corruption",
522
+ path,
523
+ recordedDigest: `${stored}`,
524
+ measuredDigest: digest
525
+ }));
526
+ }
527
+ return { output: { path, digest, sizeBytes: bytes.length }, inlinedBytes: 0 };
528
+ });
529
+ const materialize = Effect.fn("StepBoundary.materialize")(function* (host, output) {
530
+ yield* Effect.annotateCurrentSpan({ path: output.path });
531
+ // The filesystem is the cheapest source of truth for a warm workspace.
532
+ // Probe before decoding inline bytes or consulting the artifact store; a
533
+ // transient probe refusal merely forfeits the optimization and the
534
+ // ordinary materialization path retains its existing typed failures.
535
+ const current = yield* measure(output.path, host).pipe(Effect.map((digest) => digest !== absentDigest && digest === output.digest), Effect.catch(() => Effect.succeed(false)));
536
+ if (current)
537
+ return;
538
+ let bytes;
539
+ if (output.content !== undefined) {
540
+ const decoded = Encoding.decodeBase64(output.content);
541
+ if (Result.isFailure(decoded)) {
542
+ // Inline content is cache-origin bytes: an undecodable payload is a
543
+ // tampered durable row, classified exactly like a digest mismatch so
544
+ // the caller routes it to the Inconsistency receiver instead of
545
+ // retrying it as a transient host refusal (issue #159).
546
+ return yield* Effect.fail(inlineCorruption(output.path, `${output.digest}`));
547
+ }
548
+ bytes = decoded.success;
549
+ // Inline evidence is verified here because nothing else can: the bytes
550
+ // travel inside the row rather than at a content address. A referenced
551
+ // artifact is verified by the store on the way out, so the check below
552
+ // would be a second read+hash of the same bytes.
553
+ const measured = yield* Schema.decodeUnknownEffect(Sha256)(bytes).pipe(Effect.orDie);
554
+ if (measured !== output.digest) {
555
+ return yield* Effect.fail(new BoundaryCorruption({
556
+ code: "boundary_corruption",
557
+ path: output.path,
558
+ recordedDigest: `${output.digest}`,
559
+ measuredDigest: measured
560
+ }));
561
+ }
562
+ }
563
+ else {
564
+ bytes = yield* artifacts.get(`${output.digest}`).pipe(Effect.catchTags({
565
+ // A reference this host cannot resolve is not a host refusal: a
566
+ // shared artifact tier may still hold it, so the caller gets a
567
+ // typed, repairable failure and fetches before falling back to a
568
+ // real execution (issue #172).
569
+ "@smthrs/artifacts/ArtifactMissing": (missing) => Effect.fail(new MissingArtifact({ code: "missing_artifact", path: output.path, digest: missing.digest })),
570
+ // Corruption is a distinct typed failure from a transient host
571
+ // error (issue #150): the caller routes it to the Inconsistency
572
+ // receiver instead of treating it as an ordinary retryable refusal.
573
+ "@smthrs/artifacts/ArtifactCorruption": (corrupt) => Effect.fail(new BoundaryCorruption({
574
+ code: "boundary_corruption",
575
+ path: output.path,
576
+ recordedDigest: corrupt.recordedDigest,
577
+ measuredDigest: corrupt.measuredDigest
578
+ })),
579
+ "@smthrs/artifacts/ArtifactStoreError": (failure) => Effect.fail(artifactFailure(failure))
580
+ }));
581
+ }
582
+ // The original body may have created the output's directory itself; a
583
+ // fresh workspace replaying the evidence has no such directory and
584
+ // `writeFile` does not create parents (issue #107).
585
+ const parent = parentDirectory(output.path);
586
+ if (parent !== undefined) {
587
+ yield* host.makeDirectory(parent, { recursive: true }).pipe(Effect.mapError(hostFailure));
588
+ }
589
+ yield* host.writeFile(output.path, bytes).pipe(Effect.mapError(hostFailure));
590
+ });
591
+ return make({
592
+ prepare: Effect.fn("StepBoundary.prepare")(function* (descriptor) {
593
+ const boundary = FileBoundarySnapshot.make(descriptor);
594
+ yield* Effect.annotateCurrentSpan({
595
+ reads: boundary.readSet.length,
596
+ boundaryMode: boundary.boundaryMode
597
+ });
598
+ // The dirty check's evidence (issue #90): what the host actually
599
+ // measured for every declared read, never the declaration itself —
600
+ // defaulting the snapshot to the declaration made `readSetMatches`
601
+ // compare the declaration against itself and pass unconditionally
602
+ // (issue #104).
603
+ const readSnapshot = [];
604
+ const paths = [];
605
+ for (const entry of boundary.readSet) {
606
+ if (FileSet.isGlob(entry)) {
607
+ paths.push(...yield* expandGlob(entry));
608
+ }
609
+ else
610
+ paths.push(entry.path);
611
+ }
612
+ const measured = yield* measurements(paths, false);
613
+ for (const [index, path] of paths.entries()) {
614
+ readSnapshot.push({ path, digest: measured[index]?.digest ?? absentDigest });
615
+ }
616
+ readSnapshot.sort((left, right) => compareText(left.path, right.path));
617
+ return Object.freeze({
618
+ descriptor: boundary,
619
+ readSnapshot: Object.freeze(readSnapshot.map((entry) => Object.freeze({ ...entry })))
620
+ });
621
+ }),
622
+ settle: Effect.fn("StepBoundary.settle")(function* (prepared) {
623
+ yield* Effect.annotateCurrentSpan({
624
+ writes: prepared.descriptor.writeSet.length,
625
+ boundaryMode: prepared.descriptor.boundaryMode
626
+ });
627
+ // Undeclared-write detection is scoped to the declared read set: a
628
+ // declared read whose content moved during the body and is not also a
629
+ // declared write was mutated outside the contract. Whole-tree change
630
+ // detection needs the jj diff surface and stays a documented
631
+ // limitation of this layer rather than a silent pass — the read set
632
+ // is exactly the material cacheability rests on.
633
+ const removes = prepared.descriptor.removes ?? [];
634
+ const declaredWrites = [...prepared.descriptor.writeSet, ...removes];
635
+ const declaredCovers = (path) => declaredWrites.some((entry) => typeof entry === "string"
636
+ ? entry === path
637
+ : entry._tag === "TreeArtifact"
638
+ ? path === entry.path || path.startsWith(`${entry.path}/`)
639
+ : FileSet.matchesGlob(entry, path));
640
+ const undeclared = [];
641
+ const checkedReads = prepared.readSnapshot.filter((entry) => !declaredCovers(entry.path));
642
+ const currentReads = yield* measurements(checkedReads.map((entry) => entry.path), false);
643
+ for (const [index, entry] of checkedReads.entries()) {
644
+ if ((currentReads[index]?.digest ?? absentDigest) !== entry.digest)
645
+ undeclared.push(entry.path);
646
+ }
647
+ const outputs = [];
648
+ // Declared removals are captured on the same path and under the same
649
+ // `digest: null` semantics they have always had — the difference is that
650
+ // here the absence was declared, so it is evidence rather than a defect.
651
+ const missing = [];
652
+ const surviving = [];
653
+ let inlinedBytes = 0;
654
+ const outputPaths = [];
655
+ const treeMembers = [];
656
+ for (const entry of prepared.descriptor.writeSet) {
657
+ if (typeof entry === "string")
658
+ outputPaths.push(entry);
659
+ else if (entry._tag === "Glob")
660
+ outputPaths.push(...yield* expandGlob(entry));
661
+ else {
662
+ const files = (yield* treeEntries(fs, entry.path)).files;
663
+ outputPaths.push(...files);
664
+ treeMembers.push({ path: entry.path, files });
665
+ }
666
+ }
667
+ outputPaths.push(...removes);
668
+ const captured = new Map();
669
+ const sortedPaths = [...new Set(outputPaths)].sort(compareText);
670
+ // Digest-only preflight bounds content batches by bytes as well as path
671
+ // count. Both measurements share the guarded host's pinned root identity;
672
+ // a rewrite between them is a refusal, never mismatched cached content.
673
+ const sizes = batch === undefined ? undefined : yield* measurements(sortedPaths, false);
674
+ for (let offset = 0; offset < sortedPaths.length;) {
675
+ let end = offset;
676
+ let responseBytes = 256;
677
+ const size = batch?.maxSize ?? KernelFileSystem.fallbackConcurrency;
678
+ while (end < sortedPaths.length && end - offset < size) {
679
+ const estimate = 4096 + new TextEncoder().encode(sortedPaths[end]).length * 6 +
680
+ Math.ceil((sizes?.[end]?.sizeBytes ?? 0) / 3) * 4;
681
+ if (end > offset && batch !== undefined && responseBytes + estimate > batch.maxResponseBytes)
682
+ break;
683
+ responseBytes += estimate;
684
+ end++;
685
+ }
686
+ const group = sortedPaths.slice(offset, end);
687
+ const contents = yield* measurements(group, true);
688
+ for (const [index, path] of group.entries()) {
689
+ const measured = contents[index];
690
+ if (sizes !== undefined && measured?.digest !== sizes[offset + index]?.digest) {
691
+ return yield* Effect.fail(hostFailure(new Error(`output changed during measurement: ${path}`)));
692
+ }
693
+ const output = yield* capture(path, maxTotalInlineBytes - inlinedBytes, measured);
694
+ // `capture` reports the bytes it actually inlined (zero for a
695
+ // digest-only reference), so the aggregate budget never has to
696
+ // re-derive them from the row it just built.
697
+ inlinedBytes += output.inlinedBytes;
698
+ outputs.push(output.output);
699
+ captured.set(path, output.output);
700
+ if (output.output.digest === null &&
701
+ !removes.includes(path) &&
702
+ prepared.descriptor.writeSet.some((entry) => typeof entry === "string" && entry === path))
703
+ missing.push(path);
704
+ // The dual check: a removal promised the path absent, and it is still
705
+ // here — possibly rewritten. Settling it would cache the surviving
706
+ // bytes under a declaration that disclaimed them.
707
+ if (output.output.digest !== null && removes.includes(path))
708
+ surviving.push(path);
709
+ }
710
+ offset = end;
711
+ }
712
+ // A tree member is already one of the captured outputs, so its identity
713
+ // is folded from the digest that capture measured rather than from a
714
+ // second read of the same bytes. `capture` spells an absent member
715
+ // `null` where `measure` spells it `absentDigest`; the identity keeps
716
+ // the `measure` spelling, so a tree recorded before this and one
717
+ // recorded after hash identically.
718
+ const trees = [];
719
+ for (const tree of treeMembers) {
720
+ const pairs = tree.files.map((path) => [path.slice(tree.path.length + 1), captured.get(path).digest ?? absentDigest]);
721
+ trees.push({
722
+ path: tree.path,
723
+ identity: yield* Schema.decodeUnknownEffect(DerivedKey)({ kind: "tree-artifact", files: pairs }).pipe(Effect.orDie)
724
+ });
725
+ }
726
+ // Through `DerivedKey` — the repo's one hashing chokepoint — so the identity is
727
+ // a digest of the RFC 8785 canonical form rather than of whatever
728
+ // `JSON.stringify` happened to emit for this shape.
729
+ const diffIdentity = yield* Schema.decodeUnknownEffect(DerivedKey)({
730
+ kind: "diff-identity",
731
+ outputs: outputs.map((output) => [output.path, output.digest]),
732
+ trees
733
+ }).pipe(Effect.orDie);
734
+ yield* Effect.annotateCurrentSpan({ diffIdentity });
735
+ if (prepared.descriptor.boundaryMode === "hard") {
736
+ if (undeclared.length > 0) {
737
+ return yield* Effect.fail(new UndeclaredWrite({ code: "undeclared_write", paths: undeclared, diffIdentity }));
738
+ }
739
+ // A declared output that was never produced is a defect, not evidence
740
+ // (Bazel's `checkOutputs`). Recording it would cache `digest: null`,
741
+ // which every later `replayOutputs` reads as "delete this path".
742
+ if (missing.length > 0) {
743
+ return yield* Effect.fail(new MissingDeclaredOutput({ code: "missing_declared_output", paths: missing, diffIdentity }));
744
+ }
745
+ if (surviving.length > 0) {
746
+ return yield* Effect.fail(new SurvivingDeclaredRemoval({ code: "surviving_declared_removal", paths: surviving, diffIdentity }));
747
+ }
748
+ }
749
+ return {
750
+ declaredOutputs: { outputs, ...(trees.length === 0 ? {} : { trees }) },
751
+ diffIdentity,
752
+ // This filesystem-only boundary cannot observe writes elsewhere in
753
+ // the tree. Omission is deliberate: ActionPersistence treats the
754
+ // result as run-local and will not publish it to the shared cache.
755
+ //
756
+ // An undeclared write is reported ahead of a missing output, and a
757
+ // missing output ahead of a surviving removal: each is the stronger
758
+ // claim about the same execution, and every variant bars the evidence
759
+ // from the shared cache identically.
760
+ ...(undeclared.length > 0
761
+ ? { deviation: { _tag: "ExpectedSetDeviation", paths: undeclared, diffIdentity } }
762
+ : missing.length > 0
763
+ ? { deviation: { _tag: "MissingDeclaredOutput", paths: missing, diffIdentity } }
764
+ : surviving.length > 0
765
+ ? { deviation: { _tag: "SurvivingDeclaredRemoval", paths: surviving, diffIdentity } }
766
+ : {})
767
+ };
768
+ }),
769
+ replayOutputs: Effect.fn("StepBoundary.replayOutputs")(function* (evidence) {
770
+ yield* Effect.annotateCurrentSpan({ diffIdentity: evidence.diffIdentity });
771
+ const decoded = Schema.decodeUnknownResult(MaterializedOutputs)(evidence.declaredOutputs);
772
+ if (decoded._tag === "Failure") {
773
+ // Evidence recorded by a different boundary implementation carries
774
+ // no materializable outputs; refusing is honest — the caller's
775
+ // dispatch path falls back to a real execution or fails visibly.
776
+ return yield* Effect.fail(new UnsupportedBoundary({
777
+ code: "unsupported_boundary",
778
+ message: "the recorded boundary evidence carries no materializable outputs"
779
+ }));
780
+ }
781
+ // Replay writes and DELETES whatever the evidence names, so a path is
782
+ // honored only in the coordinate system declarations are written in.
783
+ // Evidence can arrive from a foreign producer through cache sync; an
784
+ // absolute or upward spelling is an eraser aimed outside the workspace,
785
+ // and refusing it here is what keeps that a refusal instead of a wipe.
786
+ const foreign = [
787
+ ...(decoded.success.trees ?? []).map((tree) => tree.path),
788
+ ...decoded.success.outputs.map((output) => output.path)
789
+ ].filter((path) => !FileSet.workspaceRelative(path));
790
+ if (foreign.length > 0) {
791
+ return yield* Effect.fail(new UnsupportedBoundary({
792
+ code: "unsupported_boundary",
793
+ message: `the recorded boundary evidence names paths outside the workspace: ${foreign.join(", ")}`
794
+ }));
795
+ }
796
+ // Before any mutation: a host that cannot be confined refuses the whole
797
+ // replay, and the caller falls back to a real execution.
798
+ const host = yield* replayHost;
799
+ const emptyDirectoryCandidates = new Set();
800
+ for (const tree of decoded.success.trees ?? []) {
801
+ const prefix = `${tree.path}/`.replace(/\/{2,}$/g, "/");
802
+ const recorded = new Set(decoded.success.outputs
803
+ .map((output) => output.path)
804
+ .filter((path) => path.startsWith(prefix)));
805
+ const entries = yield* treeEntries(host, tree.path);
806
+ for (const path of entries.files) {
807
+ if (!recorded.has(path))
808
+ yield* host.remove(path).pipe(Effect.mapError(hostFailure));
809
+ }
810
+ for (const directory of entries.directories)
811
+ emptyDirectoryCandidates.add(directory);
812
+ }
813
+ for (const output of decoded.success.outputs) {
814
+ if (output.digest === null) {
815
+ // `force` IS the probe: the evidence says this path must not exist,
816
+ // and a removal that finds it already gone has done its job. The
817
+ // `exists` call that used to precede it was a second host call — a
818
+ // second process on the confined host — for the same answer.
819
+ yield* host.remove(output.path, { force: true }).pipe(Effect.mapError(hostFailure));
820
+ }
821
+ else {
822
+ yield* materialize(host, output);
823
+ }
824
+ }
825
+ // Remove only directories proven empty after pruning and
826
+ // materialization. Deepest-first preserves every directory that still
827
+ // contains a recorded child while clearing stale empty scaffolding.
828
+ const directories = [...emptyDirectoryCandidates].sort((left, right) => right.length - left.length || compareText(left, right));
829
+ for (const directory of directories) {
830
+ const entries = yield* host.readDirectory(directory).pipe(Effect.mapError(hostFailure));
831
+ if (entries.length === 0)
832
+ yield* host.remove(directory).pipe(Effect.mapError(hostFailure));
833
+ }
834
+ })
835
+ });
836
+ };
837
+ /**
838
+ * Provides the filesystem-backed production boundary: `prepare` measures the
839
+ * declared read set for real, `settle` detects reads mutated outside the
840
+ * declared write set and captures the write set's post-state, and
841
+ * `replayOutputs` re-materializes those outputs on cache-hit replay.
842
+ *
843
+ * Host access arrives through Effect's `FileSystem` tag, which the capability
844
+ * kernel decorates in place — the same seam every host implementation (node,
845
+ * bun, browser, sandbox) already provides. Blob storage arrives through
846
+ * `@smthrs/artifacts`, so the same boundary runs over a purely local store or
847
+ * over a local-plus-shared composition without knowing which it got.
848
+ *
849
+ * Replay confines its own mutations rather than trusting the composition:
850
+ * they run through `@smthrs/kernel/FileSystem`'s `confined` view, rooted at
851
+ * the kernel `Workspace` when one is in context. A symlink on a replayed path
852
+ * (a parent, the final component, or a member of a replayed tree) and a host
853
+ * with no descriptor-relative executor or isolation attestation both refuse
854
+ * with {@link UnsupportedBoundary}, which the caller journals as
855
+ * `replay_failed` before executing the step for real.
856
+ *
857
+ * @since 0.1.0
858
+ * @category layers
859
+ */
860
+ export const layer = Layer.effect(StepBoundary, Effect.gen(function* () {
861
+ const fs = yield* FileSystem.FileSystem;
862
+ const platformPath = yield* Path.Path;
863
+ const artifacts = yield* ArtifactStore.ArtifactStore;
864
+ const workspace = yield* Effect.serviceOption(KernelWorkspace);
865
+ return makeFileSystem(fs, platformPath, artifacts, workspace._tag === "Some" ? { root: workspace.value.root } : {});
866
+ }));
867
+ const unsupported = () => new UnsupportedBoundary({
868
+ code: "unsupported_boundary",
869
+ message: "the host cannot enforce the declared step boundary"
870
+ });
871
+ /**
872
+ * Deterministic in-memory boundary suitable only for tests. Production
873
+ * wiring uses {@link layer}, the filesystem-backed implementation.
874
+ *
875
+ * Whole-tree change detection is supplied by sandboxed settlement, not by any
876
+ * boundary layer: an isolated execution's transaction IS the tree, so
877
+ * `ActionPersistence` compares its diff against the declared sets and sets
878
+ * `wholeTreeWritesVerified` structurally (the retired piece-6 limitation).
879
+ * {@link layer} still detects mutations within the declared read set only,
880
+ * which is why unsandboxed evidence stays run-local.
881
+ *
882
+ * @since 0.1.0
883
+ * @category layers
884
+ */
885
+ export const layerTest = (options = {}) => {
886
+ const diffIdentity = options.diffIdentity ?? "test-diff";
887
+ const service = make({
888
+ prepare: Effect.fn("StepBoundary.prepare")(function* (descriptor) {
889
+ if (options.supported === false)
890
+ return yield* Effect.fail(unsupported());
891
+ return {
892
+ descriptor,
893
+ readSnapshot: options.readSnapshot ?? exactReads(descriptor)
894
+ };
895
+ }),
896
+ settle: Effect.fn("StepBoundary.settle")(function* (prepared) {
897
+ if (options.supported === false)
898
+ return yield* Effect.fail(unsupported());
899
+ if (options.failure !== undefined)
900
+ return yield* Effect.fail(options.failure);
901
+ return {
902
+ declaredOutputs: options.declaredOutputs ?? { paths: prepared.descriptor.writeSet },
903
+ diffIdentity,
904
+ ...(options.wholeTreeWriteDetection === false ? {} : { wholeTreeWritesVerified: true }),
905
+ ...(options.hermeticReadDetection === false ? {} : { hermeticReadsVerified: true }),
906
+ ...(options.deviation === undefined ? {} : { deviation: options.deviation })
907
+ };
908
+ }),
909
+ replayOutputs: Effect.fn("StepBoundary.replayOutputs")(function* (evidence) {
910
+ if (options.supported === false)
911
+ return yield* Effect.fail(unsupported());
912
+ yield* Effect.sync(() => {
913
+ options.onReplay?.(evidence);
914
+ });
915
+ })
916
+ });
917
+ return Layer.succeed(StepBoundary, service);
918
+ };
919
+ //# sourceMappingURL=StepBoundary.js.map