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

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 +199 -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 +1584 -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 +298 -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 +3152 -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,83 @@
1
+ /**
2
+ * Survivor discovery for an action key's attempt rows.
3
+ *
4
+ * Two implementations answer the same question — the durable state's single
5
+ * ordered range read (issue #77) and the point-probe walk against
6
+ * `AttemptStore` for storage that cannot range-scan. They are kept here
7
+ * together, behind one entry point, because their answers must agree: a run
8
+ * that resumes under SQL state and under the fallback must restore the same
9
+ * retry origin and the same attempt counter (issue #96).
10
+ *
11
+ * @since 0.1.0
12
+ */
13
+ import * as Effect from "effect/Effect";
14
+ import * as Option from "effect/Option";
15
+ /**
16
+ * How long a pruned leading run of attempt numbers the survivor scan
17
+ * tolerates before it reports "no attempt row survives".
18
+ *
19
+ * A retention/prune job removes attempts oldest-first, so a surviving
20
+ * sequence is contiguous once its first row is found; the bound caps the
21
+ * pruned prefix walk (issue #69). It is a *semantic* bound, not merely a
22
+ * cost bound: the point-probe fallback cannot distinguish "nothing ever ran"
23
+ * from "the first 33 attempts were pruned" without a range read, so both
24
+ * paths apply the same tolerance and a key whose earliest survivor sits past
25
+ * it restarts its expiration budget and attempt numbering on either backend
26
+ * (issue #96). Restarting is safe — the pruned numbers are gone, so the
27
+ * fresh counter cannot collide — and, unlike the previous split, it is the
28
+ * same behaviour on every backend.
29
+ *
30
+ * @since 0.1.0
31
+ * @category constants
32
+ */
33
+ export const prunedPrefixScanLimit = 32;
34
+ /**
35
+ * Finds the surviving attempt rows for an action key: the earliest row's
36
+ * start time — the durable retry origin when attempt 1 itself was pruned
37
+ * (issue #69) — and the highest attempt number contiguous from it, from
38
+ * which the engine resumes the attempt counter (issue #59). `Option.none()`
39
+ * means no attempt row survives within `prunedPrefixScanLimit`.
40
+ *
41
+ * When the durable state can range-scan attempts, one ordered SELECT answers
42
+ * both questions (issue #77); otherwise the point-read scan against
43
+ * `AttemptStore` answers them, paying up to `prunedPrefixScanLimit`
44
+ * sequential gets for a key that never ran. Both answers pass through the
45
+ * same tolerance check, so the two paths cannot diverge (issue #96).
46
+ *
47
+ * @since 0.1.0
48
+ * @category combinators
49
+ */
50
+ export const probeAttempts = (attemptStore, survivors, runId, stepKeyDigest) => Effect.gen(function* () {
51
+ if (survivors !== undefined) {
52
+ const found = yield* survivors(runId, stepKeyDigest);
53
+ if (Option.isNone(found))
54
+ return Option.none();
55
+ return found.value.earliestAttempt > prunedPrefixScanLimit
56
+ ? Option.none()
57
+ : found;
58
+ }
59
+ let earliest = Option.none();
60
+ let attempt = 1;
61
+ for (; attempt <= prunedPrefixScanLimit; attempt++) {
62
+ const row = yield* attemptStore.get({ runId, stepKeyDigest, attempt }).pipe(Effect.orDie);
63
+ if (Option.isSome(row)) {
64
+ earliest = row;
65
+ break;
66
+ }
67
+ }
68
+ if (Option.isNone(earliest))
69
+ return Option.none();
70
+ let latest = attempt;
71
+ for (let next = attempt + 1;; next++) {
72
+ const row = yield* attemptStore.get({ runId, stepKeyDigest, attempt: next }).pipe(Effect.orDie);
73
+ if (Option.isNone(row))
74
+ break;
75
+ latest = next;
76
+ }
77
+ return Option.some({
78
+ earliestAttempt: attempt,
79
+ earliestStartedAtMs: earliest.value.startedAtMs,
80
+ latest
81
+ });
82
+ });
83
+ //# sourceMappingURL=AttemptProbe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttemptProbe.js","sourceRoot":"","sources":["../../../src/internal/AttemptProbe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAA;AAEvC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,YAAkC,EAClC,SAAyD,EACzD,KAAa,EACb,aAAqB,EAC8C,EAAE,CACrE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,aAAa,CAAC,CAAA;QACpD,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC,IAAI,EAAE,CAAA;QAC9C,OAAO,KAAK,CAAC,KAAK,CAAC,eAAe,GAAG,qBAAqB;YACxD,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE;YACf,CAAC,CAAC,KAAK,CAAA;IACX,CAAC;IACD,IAAI,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAwB,CAAA;IAClD,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,OAAO,OAAO,IAAI,qBAAqB,EAAE,OAAO,EAAE,EAAE,CAAC;QACnD,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACzF,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,QAAQ,GAAG,GAAG,CAAA;YACd,MAAK;QACP,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;QAAE,OAAO,MAAM,CAAC,IAAI,EAAE,CAAA;IACjD,IAAI,MAAM,GAAG,OAAO,CAAA;IACpB,KAAK,IAAI,IAAI,GAAG,OAAO,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC/F,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;YAAE,MAAK;QAC7B,MAAM,GAAG,IAAI,CAAA;IACf,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;QACjB,eAAe,EAAE,OAAO;QACxB,mBAAmB,EAAE,QAAQ,CAAC,KAAK,CAAC,WAAW;QAC/C,MAAM;KACP,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA","sourcesContent":["/**\n * Survivor discovery for an action key's attempt rows.\n *\n * Two implementations answer the same question — the durable state's single\n * ordered range read (issue #77) and the point-probe walk against\n * `AttemptStore` for storage that cannot range-scan. They are kept here\n * together, behind one entry point, because their answers must agree: a run\n * that resumes under SQL state and under the fallback must restore the same\n * retry origin and the same attempt counter (issue #96).\n *\n * @since 0.1.0\n */\n\nimport type { AttemptStore } from \"@smthrs/run-store\"\nimport * as Effect from \"effect/Effect\"\nimport * as Option from \"effect/Option\"\nimport type * as DurableEngineState from \"../DurableEngineState.ts\"\n\n/**\n * How long a pruned leading run of attempt numbers the survivor scan\n * tolerates before it reports \"no attempt row survives\".\n *\n * A retention/prune job removes attempts oldest-first, so a surviving\n * sequence is contiguous once its first row is found; the bound caps the\n * pruned prefix walk (issue #69). It is a *semantic* bound, not merely a\n * cost bound: the point-probe fallback cannot distinguish \"nothing ever ran\"\n * from \"the first 33 attempts were pruned\" without a range read, so both\n * paths apply the same tolerance and a key whose earliest survivor sits past\n * it restarts its expiration budget and attempt numbering on either backend\n * (issue #96). Restarting is safe — the pruned numbers are gone, so the\n * fresh counter cannot collide — and, unlike the previous split, it is the\n * same behaviour on every backend.\n *\n * @since 0.1.0\n * @category constants\n */\nexport const prunedPrefixScanLimit = 32\n\n/**\n * Finds the surviving attempt rows for an action key: the earliest row's\n * start time — the durable retry origin when attempt 1 itself was pruned\n * (issue #69) — and the highest attempt number contiguous from it, from\n * which the engine resumes the attempt counter (issue #59). `Option.none()`\n * means no attempt row survives within `prunedPrefixScanLimit`.\n *\n * When the durable state can range-scan attempts, one ordered SELECT answers\n * both questions (issue #77); otherwise the point-read scan against\n * `AttemptStore` answers them, paying up to `prunedPrefixScanLimit`\n * sequential gets for a key that never ran. Both answers pass through the\n * same tolerance check, so the two paths cannot diverge (issue #96).\n *\n * @since 0.1.0\n * @category combinators\n */\nexport const probeAttempts = (\n attemptStore: AttemptStore.Service,\n survivors: DurableEngineState.Service[\"attemptSurvivors\"],\n runId: string,\n stepKeyDigest: string\n): Effect.Effect<Option.Option<DurableEngineState.AttemptSurvivors>> =>\n Effect.gen(function*() {\n if (survivors !== undefined) {\n const found = yield* survivors(runId, stepKeyDigest)\n if (Option.isNone(found)) return Option.none()\n return found.value.earliestAttempt > prunedPrefixScanLimit\n ? Option.none()\n : found\n }\n let earliest = Option.none<AttemptStore.Attempt>()\n let attempt = 1\n for (; attempt <= prunedPrefixScanLimit; attempt++) {\n const row = yield* attemptStore.get({ runId, stepKeyDigest, attempt }).pipe(Effect.orDie)\n if (Option.isSome(row)) {\n earliest = row\n break\n }\n }\n if (Option.isNone(earliest)) return Option.none()\n let latest = attempt\n for (let next = attempt + 1;; next++) {\n const row = yield* attemptStore.get({ runId, stepKeyDigest, attempt: next }).pipe(Effect.orDie)\n if (Option.isNone(row)) break\n latest = next\n }\n return Option.some({\n earliestAttempt: attempt,\n earliestStartedAtMs: earliest.value.startedAtMs,\n latest\n })\n })\n"]}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Pure, phase-specific cache evidence admission. Storage decoding, current-read
3
+ * measurement, TTL history, output replay and publication I/O stay with their owners.
4
+ * @since 1.0.0-rc.0
5
+ */
6
+ import type { Action } from "@smthrs/flow";
7
+ import type { FileBoundary } from "@smthrs/flow/FileBoundary";
8
+ import type * as StepBoundary from "../StepBoundary.ts";
9
+ /** Reasons an existing declaration cannot name reusable results.
10
+ * @category models
11
+ * @since 1.0.0-rc.0
12
+ */
13
+ export type DisabledReason = "unsealed" | "missing-boundary" | "expected-boundary" | "unresolved-read-glob";
14
+ /** Declaration eligibility is separate from proof that a result may be reused.
15
+ * @category models
16
+ * @since 1.0.0-rc.0
17
+ */
18
+ export type Declaration = {
19
+ readonly _tag: "Eligible";
20
+ readonly metadata: FileBoundary;
21
+ } | {
22
+ readonly _tag: "Disabled";
23
+ readonly reason: DisabledReason;
24
+ };
25
+ /** The proof-bearing part of already-decoded attempt metadata.
26
+ * @category models
27
+ * @since 1.0.0-rc.0
28
+ */
29
+ export interface Metadata {
30
+ readonly tier: Action.Tier;
31
+ readonly boundary?: StepBoundary.BoundaryEvidence | undefined;
32
+ readonly readSetVerified?: true | undefined;
33
+ readonly boundaryQuarantined?: true | undefined;
34
+ }
35
+ /** A refusal is not a failure of an already durable action outcome.
36
+ * @category models
37
+ * @since 1.0.0-rc.0
38
+ */
39
+ export interface Refused {
40
+ readonly _tag: "Refused";
41
+ readonly reason: DisabledReason | "invalid-meta" | "unsealed-meta" | "missing-evidence" | "deviation" | "unverified-writes" | "unverified-hermetic-reads" | "unverified-recorded-reads" | "quarantined-evidence" | "contradictory-evidence";
42
+ }
43
+ /** Necessary historical evidence, not yet a hit: current reads and outputs still need verification.
44
+ * @category models
45
+ * @since 1.0.0-rc.0
46
+ */
47
+ export interface CandidateEvidence<M extends Metadata> {
48
+ readonly _tag: "CandidateEvidence";
49
+ readonly meta: M;
50
+ readonly evidence: StepBoundary.BoundaryEvidence;
51
+ }
52
+ /** Shared gate for fresh completion and durable-completion convergence.
53
+ * @category models
54
+ * @since 1.0.0-rc.0
55
+ */
56
+ export interface PublishCompletion<M extends Metadata> {
57
+ readonly _tag: "PublishCompletion";
58
+ readonly meta: M;
59
+ }
60
+ /** Classifies existing declaration policy without changing keys or measuring the host.
61
+ * @category classifiers
62
+ * @since 1.0.0-rc.0
63
+ */
64
+ export declare const declaration: (input: {
65
+ readonly tier: Action.Tier;
66
+ readonly metadata?: FileBoundary | undefined;
67
+ }) => Declaration;
68
+ /** Candidate reads are remeasured, so do not require a historical readSetVerified flag here.
69
+ * @category classifiers
70
+ * @since 1.0.0-rc.0
71
+ */
72
+ export declare const candidate: <M extends Metadata>(meta: M | undefined) => CandidateEvidence<M> | Refused;
73
+ /** Publication additionally requires the read proof associated with the completed body.
74
+ * Both stored quarantine and the caller's current integrity verdict forbid publication.
75
+ * @category classifiers
76
+ * @since 1.0.0-rc.0
77
+ */
78
+ export declare const completion: <M extends Metadata>(declared: Declaration, meta: M | undefined, quarantined: boolean) => PublishCompletion<M> | Refused;
79
+ //# sourceMappingURL=CacheAdmission.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheAdmission.d.ts","sourceRoot":"","sources":["../../../src/internal/CacheAdmission.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAE7D,OAAO,KAAK,KAAK,YAAY,MAAM,oBAAoB,CAAA;AAEvD;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,kBAAkB,GAAG,mBAAmB,GAAG,sBAAsB,CAAA;AAE3G;;;GAGG;AACH,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAA;CAAE,GAC9D;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;CAAE,CAAA;AAElE;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAA;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC,gBAAgB,GAAG,SAAS,CAAA;IAC7D,QAAQ,CAAC,eAAe,CAAC,EAAE,IAAI,GAAG,SAAS,CAAA;IAC3C,QAAQ,CAAC,mBAAmB,CAAC,EAAE,IAAI,GAAG,SAAS,CAAA;CAChD;AAED;;;GAGG;AACH,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB,QAAQ,CAAC,MAAM,EACX,cAAc,GACd,cAAc,GACd,eAAe,GACf,kBAAkB,GAClB,WAAW,GACX,mBAAmB,GACnB,2BAA2B,GAC3B,2BAA2B,GAC3B,sBAAsB,GACtB,wBAAwB,CAAA;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB,CAAC,CAAC,SAAS,QAAQ;IACnD,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAA;IAClC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;IAChB,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC,gBAAgB,CAAA;CACjD;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB,CAAC,CAAC,SAAS,QAAQ;IACnD,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAA;IAClC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;CACjB;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,GACtB,OAAO;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,GAAG,SAAS,CAAA;CAAE,KAClF,WAMF,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,QAAQ,EAAE,MAAM,CAAC,GAAG,SAAS,KAAG,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAsB1F,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,QAAQ,EAC3C,UAAU,WAAW,EACrB,MAAM,CAAC,GAAG,SAAS,EACnB,aAAa,OAAO,KACnB,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAOzB,CAAA"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Pure, phase-specific cache evidence admission. Storage decoding, current-read
3
+ * measurement, TTL history, output replay and publication I/O stay with their owners.
4
+ * @since 1.0.0-rc.0
5
+ */
6
+ import * as FileSet from "@smthrs/plan/FileSet";
7
+ /** Classifies existing declaration policy without changing keys or measuring the host.
8
+ * @category classifiers
9
+ * @since 1.0.0-rc.0
10
+ */
11
+ export const declaration = (input) => {
12
+ if (input.tier !== "sealed")
13
+ return { _tag: "Disabled", reason: "unsealed" };
14
+ if (input.metadata === undefined)
15
+ return { _tag: "Disabled", reason: "missing-boundary" };
16
+ if (input.metadata.boundaryMode !== "hard")
17
+ return { _tag: "Disabled", reason: "expected-boundary" };
18
+ if (input.metadata.readSet.some(FileSet.isGlob))
19
+ return { _tag: "Disabled", reason: "unresolved-read-glob" };
20
+ return { _tag: "Eligible", metadata: input.metadata };
21
+ };
22
+ /** Candidate reads are remeasured, so do not require a historical readSetVerified flag here.
23
+ * @category classifiers
24
+ * @since 1.0.0-rc.0
25
+ */
26
+ export const candidate = (meta) => {
27
+ if (meta === undefined)
28
+ return { _tag: "Refused", reason: "invalid-meta" };
29
+ // Legacy flags never override quarantine. Retain the durable outcome and
30
+ // the original metadata, but refuse to promote contradictory proof to reuse.
31
+ if (meta.boundaryQuarantined === true) {
32
+ return {
33
+ _tag: "Refused",
34
+ reason: meta.boundary !== undefined || meta.readSetVerified === true
35
+ ? "contradictory-evidence"
36
+ : "quarantined-evidence"
37
+ };
38
+ }
39
+ if (meta.readSetVerified === true && meta.boundary === undefined) {
40
+ return { _tag: "Refused", reason: "contradictory-evidence" };
41
+ }
42
+ if (meta.tier !== "sealed")
43
+ return { _tag: "Refused", reason: "unsealed-meta" };
44
+ const evidence = meta.boundary;
45
+ if (evidence === undefined)
46
+ return { _tag: "Refused", reason: "missing-evidence" };
47
+ if (evidence.deviation !== undefined)
48
+ return { _tag: "Refused", reason: "deviation" };
49
+ if (evidence.wholeTreeWritesVerified !== true)
50
+ return { _tag: "Refused", reason: "unverified-writes" };
51
+ if (evidence.hermeticReadsVerified !== true)
52
+ return { _tag: "Refused", reason: "unverified-hermetic-reads" };
53
+ return { _tag: "CandidateEvidence", meta, evidence };
54
+ };
55
+ /** Publication additionally requires the read proof associated with the completed body.
56
+ * Both stored quarantine and the caller's current integrity verdict forbid publication.
57
+ * @category classifiers
58
+ * @since 1.0.0-rc.0
59
+ */
60
+ export const completion = (declared, meta, quarantined) => {
61
+ if (quarantined)
62
+ return { _tag: "Refused", reason: "quarantined-evidence" };
63
+ if (declared._tag === "Disabled")
64
+ return { _tag: "Refused", reason: declared.reason };
65
+ const checked = candidate(meta);
66
+ if (checked._tag === "Refused")
67
+ return checked;
68
+ if (checked.meta.readSetVerified !== true)
69
+ return { _tag: "Refused", reason: "unverified-recorded-reads" };
70
+ return { _tag: "PublishCompletion", meta: checked.meta };
71
+ };
72
+ //# sourceMappingURL=CacheAdmission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheAdmission.js","sourceRoot":"","sources":["../../../src/internal/CacheAdmission.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pure, phase-specific cache evidence admission. Storage decoding, current-read\n * measurement, TTL history, output replay and publication I/O stay with their owners.\n * @since 1.0.0-rc.0\n */\n\nimport type { Action } from \"@smthrs/flow\"\nimport type { FileBoundary } from \"@smthrs/flow/FileBoundary\"\nimport * as FileSet from \"@smthrs/plan/FileSet\"\nimport type * as StepBoundary from \"../StepBoundary.ts\"\n\n/** Reasons an existing declaration cannot name reusable results.\n * @category models\n * @since 1.0.0-rc.0\n */\nexport type DisabledReason = \"unsealed\" | \"missing-boundary\" | \"expected-boundary\" | \"unresolved-read-glob\"\n\n/** Declaration eligibility is separate from proof that a result may be reused.\n * @category models\n * @since 1.0.0-rc.0\n */\nexport type Declaration =\n | { readonly _tag: \"Eligible\"; readonly metadata: FileBoundary }\n | { readonly _tag: \"Disabled\"; readonly reason: DisabledReason }\n\n/** The proof-bearing part of already-decoded attempt metadata.\n * @category models\n * @since 1.0.0-rc.0\n */\nexport interface Metadata {\n readonly tier: Action.Tier\n readonly boundary?: StepBoundary.BoundaryEvidence | undefined\n readonly readSetVerified?: true | undefined\n readonly boundaryQuarantined?: true | undefined\n}\n\n/** A refusal is not a failure of an already durable action outcome.\n * @category models\n * @since 1.0.0-rc.0\n */\nexport interface Refused {\n readonly _tag: \"Refused\"\n readonly reason:\n | DisabledReason\n | \"invalid-meta\"\n | \"unsealed-meta\"\n | \"missing-evidence\"\n | \"deviation\"\n | \"unverified-writes\"\n | \"unverified-hermetic-reads\"\n | \"unverified-recorded-reads\"\n | \"quarantined-evidence\"\n | \"contradictory-evidence\"\n}\n\n/** Necessary historical evidence, not yet a hit: current reads and outputs still need verification.\n * @category models\n * @since 1.0.0-rc.0\n */\nexport interface CandidateEvidence<M extends Metadata> {\n readonly _tag: \"CandidateEvidence\"\n readonly meta: M\n readonly evidence: StepBoundary.BoundaryEvidence\n}\n\n/** Shared gate for fresh completion and durable-completion convergence.\n * @category models\n * @since 1.0.0-rc.0\n */\nexport interface PublishCompletion<M extends Metadata> {\n readonly _tag: \"PublishCompletion\"\n readonly meta: M\n}\n\n/** Classifies existing declaration policy without changing keys or measuring the host.\n * @category classifiers\n * @since 1.0.0-rc.0\n */\nexport const declaration = (\n input: { readonly tier: Action.Tier; readonly metadata?: FileBoundary | undefined }\n): Declaration => {\n if (input.tier !== \"sealed\") return { _tag: \"Disabled\", reason: \"unsealed\" }\n if (input.metadata === undefined) return { _tag: \"Disabled\", reason: \"missing-boundary\" }\n if (input.metadata.boundaryMode !== \"hard\") return { _tag: \"Disabled\", reason: \"expected-boundary\" }\n if (input.metadata.readSet.some(FileSet.isGlob)) return { _tag: \"Disabled\", reason: \"unresolved-read-glob\" }\n return { _tag: \"Eligible\", metadata: input.metadata }\n}\n\n/** Candidate reads are remeasured, so do not require a historical readSetVerified flag here.\n * @category classifiers\n * @since 1.0.0-rc.0\n */\nexport const candidate = <M extends Metadata>(meta: M | undefined): CandidateEvidence<M> | Refused => {\n if (meta === undefined) return { _tag: \"Refused\", reason: \"invalid-meta\" }\n // Legacy flags never override quarantine. Retain the durable outcome and\n // the original metadata, but refuse to promote contradictory proof to reuse.\n if (meta.boundaryQuarantined === true) {\n return {\n _tag: \"Refused\",\n reason: meta.boundary !== undefined || meta.readSetVerified === true\n ? \"contradictory-evidence\"\n : \"quarantined-evidence\"\n }\n }\n if (meta.readSetVerified === true && meta.boundary === undefined) {\n return { _tag: \"Refused\", reason: \"contradictory-evidence\" }\n }\n if (meta.tier !== \"sealed\") return { _tag: \"Refused\", reason: \"unsealed-meta\" }\n const evidence = meta.boundary\n if (evidence === undefined) return { _tag: \"Refused\", reason: \"missing-evidence\" }\n if (evidence.deviation !== undefined) return { _tag: \"Refused\", reason: \"deviation\" }\n if (evidence.wholeTreeWritesVerified !== true) return { _tag: \"Refused\", reason: \"unverified-writes\" }\n if (evidence.hermeticReadsVerified !== true) return { _tag: \"Refused\", reason: \"unverified-hermetic-reads\" }\n return { _tag: \"CandidateEvidence\", meta, evidence }\n}\n\n/** Publication additionally requires the read proof associated with the completed body.\n * Both stored quarantine and the caller's current integrity verdict forbid publication.\n * @category classifiers\n * @since 1.0.0-rc.0\n */\nexport const completion = <M extends Metadata>(\n declared: Declaration,\n meta: M | undefined,\n quarantined: boolean\n): PublishCompletion<M> | Refused => {\n if (quarantined) return { _tag: \"Refused\", reason: \"quarantined-evidence\" }\n if (declared._tag === \"Disabled\") return { _tag: \"Refused\", reason: declared.reason }\n const checked = candidate(meta)\n if (checked._tag === \"Refused\") return checked\n if (checked.meta.readSetVerified !== true) return { _tag: \"Refused\", reason: \"unverified-recorded-reads\" }\n return { _tag: \"PublishCompletion\", meta: checked.meta }\n}\n"]}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Read-only validation of copied cache-age decisions. Producer identities and
3
+ * persisted payloads remain unchanged; ancestry alone is not a reuse proof.
4
+ * @since 1.0.0-rc.0
5
+ */
6
+ import type { Journal, JournalEvent } from "@smthrs/journal";
7
+ import type { RunStore } from "@smthrs/run-store";
8
+ import * as Effect from "effect/Effect";
9
+ /**
10
+ * Paged journal lookup shared with copied-record validation.
11
+ * @category accessors
12
+ * @since 1.0.0-rc.0
13
+ */
14
+ export { find } from "./CopiedRecord.ts";
15
+ /** A copied verdict is usable only through an exact, retained fork prefix.
16
+ * Missing/compacted ancestry and malformed or unrelated history fail closed.
17
+ * @category accessors
18
+ * @since 1.0.0-rc.0
19
+ */
20
+ export declare const copiedVerdict: (options: {
21
+ readonly journal: Journal.Service;
22
+ readonly runs: RunStore.Service;
23
+ readonly runId: string;
24
+ readonly decision: JournalEvent.Input;
25
+ readonly conflict: Journal.JournalError;
26
+ }) => Effect.Effect<"admitted" | "expired", Journal.JournalError>;
27
+ //# sourceMappingURL=CacheAgeHistory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheAgeHistory.d.ts","sourceRoot":"","sources":["../../../src/internal/CacheAgeHistory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC;;;;GAIG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAWxC;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,SAAS;IACrC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAA;IACjC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAA;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAA;IACrC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAA;CACxC,KAAG,MAAM,CAAC,MAAM,CAAC,UAAU,GAAG,SAAS,EAAE,OAAO,CAAC,YAAY,CAkB1D,CAAA"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Read-only validation of copied cache-age decisions. Producer identities and
3
+ * persisted payloads remain unchanged; ancestry alone is not a reuse proof.
4
+ * @since 1.0.0-rc.0
5
+ */
6
+ import { FlowEngine } from "@smthrs/engine";
7
+ import * as Effect from "effect/Effect";
8
+ import { find, prove } from "./CopiedRecord.js";
9
+ /**
10
+ * Paged journal lookup shared with copied-record validation.
11
+ * @category accessors
12
+ * @since 1.0.0-rc.0
13
+ */
14
+ export { find } from "./CopiedRecord.js";
15
+ const fieldsEqual = (value, expected) => {
16
+ if (typeof value !== "object" || value === null || Array.isArray(value))
17
+ return false;
18
+ if (typeof expected !== "object" || expected === null || Array.isArray(expected))
19
+ return false;
20
+ const record = value;
21
+ const keys = Object.keys(expected);
22
+ return Object.keys(record).length === keys.length &&
23
+ keys.every((key) => record[key] === expected[key]);
24
+ };
25
+ /** A copied verdict is usable only through an exact, retained fork prefix.
26
+ * Missing/compacted ancestry and malformed or unrelated history fail closed.
27
+ * @category accessors
28
+ * @since 1.0.0-rc.0
29
+ */
30
+ export const copiedVerdict = (options) => Effect.gen(function* () {
31
+ const { journal, conflict, decision } = options;
32
+ const source = (entry) => entry.sourceId === decision.sourceId && entry.sourceSeq === decision.sourceSeq;
33
+ const entry = yield* find(journal, options.runId, source);
34
+ if (entry === undefined)
35
+ return yield* Effect.fail(conflict);
36
+ const payload = entry.payload;
37
+ const verdict = payload?.verdict;
38
+ if (verdict !== "admitted" && verdict !== "expired")
39
+ return yield* Effect.fail(conflict);
40
+ const expected = { ...decision.payload, verdict };
41
+ if (entry.eventType !== decision.eventType || !fieldsEqual(entry.payload, expected)) {
42
+ return yield* Effect.fail(conflict);
43
+ }
44
+ const original = yield* prove({ ...options, entry, same: fieldsEqual });
45
+ return fieldsEqual(original.record.meta, { lineageId: FlowEngine.Lineage.root(original.ancestor) })
46
+ ? verdict
47
+ : yield* Effect.fail(conflict);
48
+ });
49
+ //# sourceMappingURL=CacheAgeHistory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheAgeHistory.js","sourceRoot":"","sources":["../../../src/internal/CacheAgeHistory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAG3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAE/C;;;;GAIG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAExC,MAAM,WAAW,GAAG,CAAC,KAAc,EAAE,QAAiB,EAAW,EAAE;IACjE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IACrF,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAA;IAC9F,MAAM,MAAM,GAAG,KAA0C,CAAA;IACzD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAClC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;QAC/C,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAM,QAA8C,CAAC,GAAG,CAAC,CAAC,CAAA;AAC7F,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAM7B,EAA+D,EAAE,CAChE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAA;IAC/C,MAAM,MAAM,GAAG,CAAC,KAAyB,EAAE,EAAE,CAC3C,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC,SAAS,CAAA;IAChF,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IACzD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC5D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAgD,CAAA;IACtE,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,CAAA;IAChC,IAAI,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACxF,MAAM,QAAQ,GAAG,EAAE,GAAG,QAAQ,CAAC,OAA4C,EAAE,OAAO,EAAE,CAAA;IACtF,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC,SAAS,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;QACpF,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACrC,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;IACvE,OAAO,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjG,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;AAClC,CAAC,CAAC,CAAA","sourcesContent":["/**\n * Read-only validation of copied cache-age decisions. Producer identities and\n * persisted payloads remain unchanged; ancestry alone is not a reuse proof.\n * @since 1.0.0-rc.0\n */\n\nimport { FlowEngine } from \"@smthrs/engine\"\nimport type { Journal, JournalEvent } from \"@smthrs/journal\"\nimport type { RunStore } from \"@smthrs/run-store\"\nimport * as Effect from \"effect/Effect\"\nimport { find, prove } from \"./CopiedRecord.ts\"\n\n/**\n * Paged journal lookup shared with copied-record validation.\n * @category accessors\n * @since 1.0.0-rc.0\n */\nexport { find } from \"./CopiedRecord.ts\"\n\nconst fieldsEqual = (value: unknown, expected: unknown): boolean => {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false\n if (typeof expected !== \"object\" || expected === null || Array.isArray(expected)) return false\n const record = value as Readonly<Record<string, unknown>>\n const keys = Object.keys(expected)\n return Object.keys(record).length === keys.length &&\n keys.every((key) => record[key] === (expected as Readonly<Record<string, unknown>>)[key])\n}\n\n/** A copied verdict is usable only through an exact, retained fork prefix.\n * Missing/compacted ancestry and malformed or unrelated history fail closed.\n * @category accessors\n * @since 1.0.0-rc.0\n */\nexport const copiedVerdict = (options: {\n readonly journal: Journal.Service\n readonly runs: RunStore.Service\n readonly runId: string\n readonly decision: JournalEvent.Input\n readonly conflict: Journal.JournalError\n}): Effect.Effect<\"admitted\" | \"expired\", Journal.JournalError> =>\n Effect.gen(function*() {\n const { journal, conflict, decision } = options\n const source = (entry: JournalEvent.Entry) =>\n entry.sourceId === decision.sourceId && entry.sourceSeq === decision.sourceSeq\n const entry = yield* find(journal, options.runId, source)\n if (entry === undefined) return yield* Effect.fail(conflict)\n const payload = entry.payload as { readonly verdict?: unknown } | null\n const verdict = payload?.verdict\n if (verdict !== \"admitted\" && verdict !== \"expired\") return yield* Effect.fail(conflict)\n const expected = { ...decision.payload as Readonly<Record<string, unknown>>, verdict }\n if (entry.eventType !== decision.eventType || !fieldsEqual(entry.payload, expected)) {\n return yield* Effect.fail(conflict)\n }\n const original = yield* prove({ ...options, entry, same: fieldsEqual })\n return fieldsEqual(original.record.meta, { lineageId: FlowEngine.Lineage.root(original.ancestor) })\n ? verdict\n : yield* Effect.fail(conflict)\n })\n"]}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Incremental evidence for the no-TTL cache guard.
3
+ * @since 1.0.0-rc.0
4
+ */
5
+ import { Journal, JournalEvent } from "@smthrs/journal";
6
+ import * as Effect from "effect/Effect";
7
+ /**
8
+ * Per-executor index of TTL markers in an append-only journal generation.
9
+ * Refresh before answering, retaining the first record for either its producer
10
+ * key or payload key so malformed and copied verdicts still refuse removal.
11
+ * @category constructors
12
+ * @since 1.0.0-rc.0
13
+ */
14
+ export declare const make: (runId: string) => (journal: Journal.Service, keyDigest: string) => Effect.Effect<JournalEvent.Entry | undefined, Journal.JournalError>;
15
+ //# sourceMappingURL=CacheAgeVerdicts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheAgeVerdicts.d.ts","sourceRoot":"","sources":["../../../src/internal/CacheAgeVerdicts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC;;;;;;GAMG;AACH,eAAO,MAAM,IAAI,GAAI,OAAO,MAAM,MAQ9B,SAAS,OAAO,CAAC,OAAO,EACxB,WAAW,MAAM,KAChB,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,GAAG,SAAS,EAAE,OAAO,CAAC,YAAY,CAkCtE,CAAA"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Incremental evidence for the no-TTL cache guard.
3
+ * @since 1.0.0-rc.0
4
+ */
5
+ import { Journal, JournalEvent } from "@smthrs/journal";
6
+ import * as Effect from "effect/Effect";
7
+ import * as Semaphore from "effect/Semaphore";
8
+ /**
9
+ * Per-executor index of TTL markers in an append-only journal generation.
10
+ * Refresh before answering, retaining the first record for either its producer
11
+ * key or payload key so malformed and copied verdicts still refuse removal.
12
+ * @category constructors
13
+ * @since 1.0.0-rc.0
14
+ */
15
+ export const make = (runId) => {
16
+ const gate = Semaphore.makeUnsafe(1);
17
+ const id = JournalEvent.RunId.make(runId);
18
+ let source;
19
+ let generation;
20
+ let after;
21
+ const verdicts = new Map();
22
+ return (journal, keyDigest) => Semaphore.withPermit(gate)(Effect.gen(function* () {
23
+ const currentGeneration = journal.generation === undefined ? 0 : (yield* journal.generation(id)).generation;
24
+ if (source !== journal || generation !== currentGeneration) {
25
+ source = journal;
26
+ generation = currentGeneration;
27
+ after = undefined;
28
+ verdicts.clear();
29
+ }
30
+ while (true) {
31
+ const page = yield* journal.entries({ runId: id, limit: 128, ...after === undefined ? {} : { after } });
32
+ const next = page.entries.at(-1)?.seq;
33
+ if ((page.hasMore && next === undefined) ||
34
+ (next !== undefined && after !== undefined && next <= after)) {
35
+ return yield* Effect.fail(new Journal.JournalError({ code: "read_failed", message: "cache history cursor did not advance" }));
36
+ }
37
+ for (const entry of page.entries) {
38
+ const producerKey = /^cache:([^:]+):ttl:/.exec(entry.sourceId)?.[1];
39
+ const payload = entry.payload;
40
+ if (producerKey !== undefined && !verdicts.has(producerKey))
41
+ verdicts.set(producerKey, entry);
42
+ if (payload?.action === "ttl" && typeof payload.keyDigest === "string" && !verdicts.has(payload.keyDigest)) {
43
+ verdicts.set(payload.keyDigest, entry);
44
+ }
45
+ }
46
+ // Publish each fully processed page, including the final one. A read
47
+ // failure or interruption retries only the unvalidated suffix.
48
+ after = next ?? after;
49
+ if (!page.hasMore)
50
+ return verdicts.get(keyDigest);
51
+ }
52
+ }));
53
+ };
54
+ //# sourceMappingURL=CacheAgeVerdicts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheAgeVerdicts.js","sourceRoot":"","sources":["../../../src/internal/CacheAgeVerdicts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,kBAAkB,CAAA;AAE7C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,EAAE;IACpC,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;IACpC,MAAM,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACzC,IAAI,MAAmC,CAAA;IACvC,IAAI,UAA8B,CAAA;IAClC,IAAI,KAAmC,CAAA;IACvC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAA;IACtD,OAAO,CACL,OAAwB,EACxB,SAAiB,EACoD,EAAE,CACvE,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC7C,MAAM,iBAAiB,GAAG,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAA;QAC3G,IAAI,MAAM,KAAK,OAAO,IAAI,UAAU,KAAK,iBAAiB,EAAE,CAAC;YAC3D,MAAM,GAAG,OAAO,CAAA;YAChB,UAAU,GAAG,iBAAiB,CAAA;YAC9B,KAAK,GAAG,SAAS,CAAA;YACjB,QAAQ,CAAC,KAAK,EAAE,CAAA;QAClB,CAAC;QACD,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAA;YACvG,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAA;YACrC,IACE,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,KAAK,SAAS,CAAC;gBACpC,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,IAAI,IAAI,KAAK,CAAC,EAC5D,CAAC;gBACD,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CACvB,IAAI,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,sCAAsC,EAAE,CAAC,CACnG,CAAA;YACH,CAAC;YACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjC,MAAM,WAAW,GAAG,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;gBACnE,MAAM,OAAO,GAAG,KAAK,CAAC,OAA2D,CAAA;gBACjF,IAAI,WAAW,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC;oBAAE,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;gBAC7F,IAAI,OAAO,EAAE,MAAM,KAAK,KAAK,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC3G,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;gBACxC,CAAC;YACH,CAAC;YACD,qEAAqE;YACrE,+DAA+D;YAC/D,KAAK,GAAG,IAAI,IAAI,KAAK,CAAA;YACrB,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,OAAO,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACnD,CAAC;IACH,CAAC,CAAC,CAAC,CAAA;AACP,CAAC,CAAA","sourcesContent":["/**\n * Incremental evidence for the no-TTL cache guard.\n * @since 1.0.0-rc.0\n */\n\nimport { Journal, JournalEvent } from \"@smthrs/journal\"\nimport * as Effect from \"effect/Effect\"\nimport * as Semaphore from \"effect/Semaphore\"\n\n/**\n * Per-executor index of TTL markers in an append-only journal generation.\n * Refresh before answering, retaining the first record for either its producer\n * key or payload key so malformed and copied verdicts still refuse removal.\n * @category constructors\n * @since 1.0.0-rc.0\n */\nexport const make = (runId: string) => {\n const gate = Semaphore.makeUnsafe(1)\n const id = JournalEvent.RunId.make(runId)\n let source: Journal.Service | undefined\n let generation: number | undefined\n let after: JournalEvent.Seq | undefined\n const verdicts = new Map<string, JournalEvent.Entry>()\n return (\n journal: Journal.Service,\n keyDigest: string\n ): Effect.Effect<JournalEvent.Entry | undefined, Journal.JournalError> =>\n Semaphore.withPermit(gate)(Effect.gen(function*() {\n const currentGeneration = journal.generation === undefined ? 0 : (yield* journal.generation(id)).generation\n if (source !== journal || generation !== currentGeneration) {\n source = journal\n generation = currentGeneration\n after = undefined\n verdicts.clear()\n }\n while (true) {\n const page = yield* journal.entries({ runId: id, limit: 128, ...after === undefined ? {} : { after } })\n const next = page.entries.at(-1)?.seq\n if (\n (page.hasMore && next === undefined) ||\n (next !== undefined && after !== undefined && next <= after)\n ) {\n return yield* Effect.fail(\n new Journal.JournalError({ code: \"read_failed\", message: \"cache history cursor did not advance\" })\n )\n }\n for (const entry of page.entries) {\n const producerKey = /^cache:([^:]+):ttl:/.exec(entry.sourceId)?.[1]\n const payload = entry.payload as { action?: unknown; keyDigest?: unknown } | null\n if (producerKey !== undefined && !verdicts.has(producerKey)) verdicts.set(producerKey, entry)\n if (payload?.action === \"ttl\" && typeof payload.keyDigest === \"string\" && !verdicts.has(payload.keyDigest)) {\n verdicts.set(payload.keyDigest, entry)\n }\n }\n // Publish each fully processed page, including the final one. A read\n // failure or interruption retries only the unvalidated suffix.\n after = next ?? after\n if (!page.hasMore) return verdicts.get(keyDigest)\n }\n }))\n}\n"]}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Replay authority comes from the current descriptor, never the recorded paths.
3
+ * This preflight performs no host I/O; every path is checked before replay can prune.
4
+ * @since 1.0.0-rc.0
5
+ */
6
+ import type { FileBoundary } from "@smthrs/flow/FileBoundary";
7
+ import type * as StepBoundary from "../StepBoundary.ts";
8
+ /** A typed refusal leaves both the evidence and the workspace intact.
9
+ * @category models
10
+ * @since 1.0.0-rc.0
11
+ */
12
+ export type Decision = {
13
+ readonly _tag: "ReplayOutputs";
14
+ } | {
15
+ readonly _tag: "Refused";
16
+ readonly reason: "output-boundary-mismatch" | "unsupported-output-evidence";
17
+ };
18
+ /** Validate all recorded writes, removals and pruning roots before materialization.
19
+ * Unknown output formats cannot establish current filesystem authority.
20
+ * @category classifiers
21
+ * @since 1.0.0-rc.0
22
+ */
23
+ export declare const replay: (descriptor: FileBoundary | undefined, evidence: StepBoundary.BoundaryEvidence) => Decision;
24
+ //# sourceMappingURL=CacheOutputPolicy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheOutputPolicy.d.ts","sourceRoot":"","sources":["../../../src/internal/CacheOutputPolicy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAG7D,OAAO,KAAK,KAAK,YAAY,MAAM,oBAAoB,CAAA;AAWvD;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAChB;IAAE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAA;CAAE,GAClC;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,0BAA0B,GAAG,6BAA6B,CAAA;CAAE,CAAA;AAE7G;;;;GAIG;AACH,eAAO,MAAM,MAAM,GACjB,YAAY,YAAY,GAAG,SAAS,EACpC,UAAU,YAAY,CAAC,gBAAgB,KACtC,QA4CF,CAAA"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Replay authority comes from the current descriptor, never the recorded paths.
3
+ * This preflight performs no host I/O; every path is checked before replay can prune.
4
+ * @since 1.0.0-rc.0
5
+ */
6
+ import * as ArtifactStore from "@smthrs/artifacts/ArtifactStore";
7
+ import * as FileSet from "@smthrs/plan/FileSet";
8
+ import * as Schema from "effect/Schema";
9
+ const Outputs = Schema.Struct({
10
+ outputs: Schema.Array(Schema.Struct({ path: Schema.String, digest: Schema.NullOr(ArtifactStore.Digest) })),
11
+ trees: Schema.optional(Schema.Array(Schema.Struct({ path: Schema.String, identity: Schema.String })))
12
+ });
13
+ // The existing abstract boundary protocol records its exact declared path set.
14
+ // Validate that format separately; it does not claim a filesystem blob manifest.
15
+ const DeclaredPaths = Schema.Struct({ paths: Schema.Array(FileSet.Entry) });
16
+ const samePaths = Schema.toEquivalence(Schema.Array(FileSet.Entry));
17
+ /** Validate all recorded writes, removals and pruning roots before materialization.
18
+ * Unknown output formats cannot establish current filesystem authority.
19
+ * @category classifiers
20
+ * @since 1.0.0-rc.0
21
+ */
22
+ export const replay = (descriptor, evidence) => {
23
+ const mismatch = { _tag: "Refused", reason: "output-boundary-mismatch" };
24
+ if (descriptor === undefined)
25
+ return mismatch;
26
+ const decoded = Schema.decodeUnknownResult(Outputs)(evidence.declaredOutputs);
27
+ if (decoded._tag === "Failure") {
28
+ const paths = Schema.decodeUnknownResult(DeclaredPaths)(evidence.declaredOutputs);
29
+ // Malformed production evidence cannot downgrade itself to the abstract
30
+ // protocol by also supplying a matching path list.
31
+ if (paths._tag === "Failure" || Object.hasOwn(evidence.declaredOutputs, "outputs")) {
32
+ return { _tag: "Refused", reason: "unsupported-output-evidence" };
33
+ }
34
+ return (descriptor.removes ?? []).length === 0 && samePaths(paths.success.paths, descriptor.writeSet)
35
+ ? { _tag: "ReplayOutputs" }
36
+ : mismatch;
37
+ }
38
+ const { outputs, trees = [] } = decoded.success;
39
+ const paths = [...outputs.map((output) => output.path), ...trees.map((tree) => tree.path)];
40
+ // Use the exact coordinate spelling that replay passes to the filesystem.
41
+ if (paths.some((path) => !FileSet.workspaceRelative(path) || FileSet.canonical(path) !== path))
42
+ return mismatch;
43
+ if (new Set(outputs.map((output) => output.path)).size !== outputs.length)
44
+ return mismatch;
45
+ if (new Set(trees.map((tree) => tree.path)).size !== trees.length)
46
+ return mismatch;
47
+ const removes = descriptor.removes ?? [];
48
+ for (const output of outputs) {
49
+ if (output.digest === null) {
50
+ if (!removes.includes(output.path))
51
+ return mismatch;
52
+ }
53
+ else if (removes.includes(output.path) ||
54
+ !descriptor.writeSet.some((entry) => FileSet.overlaps(entry, output.path)))
55
+ return mismatch;
56
+ }
57
+ // A tree root authorizes pruning its entire subtree. A glob or a narrower
58
+ // tree is never sufficient authority for a recorded broader pruning root.
59
+ const declaredTrees = descriptor.writeSet.filter(FileSet.isTreeArtifact);
60
+ // A declared tree root is a directory, never a replayable file or deletion.
61
+ if (declaredTrees.some((entry) => outputs.some((output) => output.path === entry.path)))
62
+ return mismatch;
63
+ if (trees.some((tree) => !declaredTrees.some((entry) => entry.path === tree.path)))
64
+ return mismatch;
65
+ if (declaredTrees.some((entry) => !trees.some((tree) => tree.path === entry.path)))
66
+ return mismatch;
67
+ if (removes.some((path) => !outputs.some((output) => output.path === path && output.digest === null)))
68
+ return mismatch;
69
+ if (descriptor.writeSet.some((entry) => typeof entry === "string" && !outputs.some((output) => output.path === entry && output.digest !== null)))
70
+ return mismatch;
71
+ return { _tag: "ReplayOutputs" };
72
+ };
73
+ //# sourceMappingURL=CacheOutputPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheOutputPolicy.js","sourceRoot":"","sources":["../../../src/internal/CacheOutputPolicy.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Replay authority comes from the current descriptor, never the recorded paths.\n * This preflight performs no host I/O; every path is checked before replay can prune.\n * @since 1.0.0-rc.0\n */\n\nimport * as ArtifactStore from \"@smthrs/artifacts/ArtifactStore\"\nimport type { FileBoundary } from \"@smthrs/flow/FileBoundary\"\nimport * as FileSet from \"@smthrs/plan/FileSet\"\nimport * as Schema from \"effect/Schema\"\nimport type * as StepBoundary from \"../StepBoundary.ts\"\n\nconst Outputs = Schema.Struct({\n outputs: Schema.Array(Schema.Struct({ path: Schema.String, digest: Schema.NullOr(ArtifactStore.Digest) })),\n trees: Schema.optional(Schema.Array(Schema.Struct({ path: Schema.String, identity: Schema.String })))\n})\n// The existing abstract boundary protocol records its exact declared path set.\n// Validate that format separately; it does not claim a filesystem blob manifest.\nconst DeclaredPaths = Schema.Struct({ paths: Schema.Array(FileSet.Entry) })\nconst samePaths = Schema.toEquivalence(Schema.Array(FileSet.Entry))\n\n/** A typed refusal leaves both the evidence and the workspace intact.\n * @category models\n * @since 1.0.0-rc.0\n */\nexport type Decision =\n | { readonly _tag: \"ReplayOutputs\" }\n | { readonly _tag: \"Refused\"; readonly reason: \"output-boundary-mismatch\" | \"unsupported-output-evidence\" }\n\n/** Validate all recorded writes, removals and pruning roots before materialization.\n * Unknown output formats cannot establish current filesystem authority.\n * @category classifiers\n * @since 1.0.0-rc.0\n */\nexport const replay = (\n descriptor: FileBoundary | undefined,\n evidence: StepBoundary.BoundaryEvidence\n): Decision => {\n const mismatch = { _tag: \"Refused\", reason: \"output-boundary-mismatch\" } as const\n if (descriptor === undefined) return mismatch\n const decoded = Schema.decodeUnknownResult(Outputs)(evidence.declaredOutputs)\n if (decoded._tag === \"Failure\") {\n const paths = Schema.decodeUnknownResult(DeclaredPaths)(evidence.declaredOutputs)\n // Malformed production evidence cannot downgrade itself to the abstract\n // protocol by also supplying a matching path list.\n if (paths._tag === \"Failure\" || Object.hasOwn(evidence.declaredOutputs as object, \"outputs\")) {\n return { _tag: \"Refused\", reason: \"unsupported-output-evidence\" }\n }\n return (descriptor.removes ?? []).length === 0 && samePaths(paths.success.paths, descriptor.writeSet)\n ? { _tag: \"ReplayOutputs\" }\n : mismatch\n }\n const { outputs, trees = [] } = decoded.success\n const paths = [...outputs.map((output) => output.path), ...trees.map((tree) => tree.path)]\n // Use the exact coordinate spelling that replay passes to the filesystem.\n if (paths.some((path) => !FileSet.workspaceRelative(path) || FileSet.canonical(path) !== path)) return mismatch\n if (new Set(outputs.map((output) => output.path)).size !== outputs.length) return mismatch\n if (new Set(trees.map((tree) => tree.path)).size !== trees.length) return mismatch\n const removes = descriptor.removes ?? []\n for (const output of outputs) {\n if (output.digest === null) {\n if (!removes.includes(output.path)) return mismatch\n } else if (\n removes.includes(output.path) ||\n !descriptor.writeSet.some((entry) => FileSet.overlaps(entry, output.path))\n ) return mismatch\n }\n // A tree root authorizes pruning its entire subtree. A glob or a narrower\n // tree is never sufficient authority for a recorded broader pruning root.\n const declaredTrees = descriptor.writeSet.filter(FileSet.isTreeArtifact)\n // A declared tree root is a directory, never a replayable file or deletion.\n if (declaredTrees.some((entry) => outputs.some((output) => output.path === entry.path))) return mismatch\n if (trees.some((tree) => !declaredTrees.some((entry) => entry.path === tree.path))) return mismatch\n if (declaredTrees.some((entry) => !trees.some((tree) => tree.path === entry.path))) return mismatch\n if (removes.some((path) => !outputs.some((output) => output.path === path && output.digest === null))) return mismatch\n if (\n descriptor.writeSet.some((entry) =>\n typeof entry === \"string\" && !outputs.some((output) => output.path === entry && output.digest !== null)\n )\n ) return mismatch\n return { _tag: \"ReplayOutputs\" }\n}\n"]}