@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,175 @@
1
+ /**
2
+ * The reconciliation seam: what happens when the world disagrees with the
3
+ * declaration.
4
+ *
5
+ * `docs/guides/drive-a-plan.md` ("Install a reconciler") describes expected sets as the soft
6
+ * mode: going outside them is allowed, journaled, and "triggers a
7
+ * **reconciliation flow** — pluggable, a flow like everything else". The
8
+ * deviation events have been emitted since the isolated-execution lane landed
9
+ * (`internal/ActionPersistence.ts`, both `expectedSetDeviation` sites) and
10
+ * had **no consumer at all**. This is the consumer, and
11
+ * `PlanScheduler` is what feeds it.
12
+ *
13
+ * Pluggability is dependency injection at the owning seam, per the repository's
14
+ * extension doctrine — there is no hook kernel. {@link layerDefault} installs a
15
+ * deterministic verdict function; a model-backed reconciler is a different
16
+ * `Layer` and lives in the agent packages. This package has no model
17
+ * dependency and must not grow one.
18
+ *
19
+ * The three verdicts are exactly the vault's: **fail** the step where the
20
+ * deviation is genuinely wrong, **reorder** — re-plan with the discovered
21
+ * dependency made explicit — and **factor out** a shared step, where content
22
+ * addressing does the heavy lifting because identical extracted steps collapse
23
+ * to one key automatically.
24
+ *
25
+ * @since 0.1.0
26
+ */
27
+ import * as Context from "effect/Context";
28
+ import * as Effect from "effect/Effect";
29
+ import * as Layer from "effect/Layer";
30
+ import * as Schema from "effect/Schema";
31
+ /**
32
+ * A journaled `flows.engine.expected-set-deviation`, resolved against the plan
33
+ * the scheduler is driving.
34
+ *
35
+ * @since 0.1.0
36
+ * @category schemas
37
+ */
38
+ export const Deviation = Schema.Struct({
39
+ nodeId: Schema.NonEmptyString,
40
+ keyDigest: Schema.NonEmptyString,
41
+ attempt: Schema.Int,
42
+ /** Paths the execution touched that its declaration did not predict. */
43
+ paths: Schema.Array(Schema.String),
44
+ diffIdentity: Schema.String,
45
+ /**
46
+ * For each undeclared path, the OTHER plan node that declares it as a write
47
+ * — the discovered dependency, resolved by the scheduler because only it
48
+ * holds the plan.
49
+ */
50
+ declaredBy: Schema.Record(Schema.String, Schema.NonEmptyString),
51
+ /** Other nodes in this run whose deviation named exactly the same paths. */
52
+ alsoDeviatedBy: Schema.Array(Schema.NonEmptyString)
53
+ });
54
+ /**
55
+ * A `WorkspaceSandbox.MaterializationConflict` the runtime strategy could not
56
+ * absorb: the delay/rebase budget is spent, or the merge itself conflicted.
57
+ *
58
+ * @since 0.1.0
59
+ * @category schemas
60
+ */
61
+ export const Conflict = Schema.Struct({
62
+ nodeId: Schema.NonEmptyString,
63
+ keyDigest: Schema.NonEmptyString,
64
+ attempt: Schema.Int,
65
+ /** How many times the scheduler rebased before giving up. */
66
+ rebases: Schema.Int,
67
+ strategy: Schema.Literals(["delay-rebase", "stop-merge"]),
68
+ /** The plan nodes this one was annotated as conflicting with. */
69
+ conflictsWith: Schema.Array(Schema.NonEmptyString)
70
+ });
71
+ /**
72
+ * What reconciliation decided.
73
+ *
74
+ * @since 0.1.0
75
+ * @category schemas
76
+ */
77
+ export const Verdict = Schema.Union([
78
+ Schema.TaggedStruct("Fail", { reason: Schema.String }),
79
+ Schema.TaggedStruct("Reorder", { dependsOn: Schema.Array(Schema.NonEmptyString), reason: Schema.String }),
80
+ Schema.TaggedStruct("FactorOut", { paths: Schema.Array(Schema.String), reason: Schema.String })
81
+ ]);
82
+ /**
83
+ * Service tag for the reconciliation seam.
84
+ *
85
+ * @since 0.1.0
86
+ * @category services
87
+ */
88
+ export class Reconciliation extends Context.Service()("@smthrs/engine-store/Reconciliation") {
89
+ }
90
+ /**
91
+ * Names a {@link Service} implementation as a reconciler.
92
+ *
93
+ * It is the identity function: the value is checked against the interface at
94
+ * its definition site, which is where a wrong-shaped reconciler should be
95
+ * reported rather than at whichever layer eventually provides it.
96
+ *
97
+ * @since 0.1.0
98
+ * @category constructors
99
+ */
100
+ export const make = (service) => service;
101
+ /**
102
+ * Provides a {@link Service} as the {@link Reconciliation} seam, replacing the
103
+ * deterministic default.
104
+ *
105
+ * @since 0.1.0
106
+ * @category layers
107
+ */
108
+ export const layer = (service) => Layer.succeed(Reconciliation, service);
109
+ /**
110
+ * The deterministic default, in the vault's order of preference.
111
+ *
112
+ * 1. **Reorder** when every undeclared path is a path some *other* plan node
113
+ * declares it writes. That is a real dependency the declaration missed, and
114
+ * making it explicit is strictly better than failing.
115
+ * 2. **Factor out** when another node in the same run deviated on exactly the
116
+ * same paths — two parallel steps that both ran `npm install`. No graph
117
+ * surgery follows: content addressing collapses two identical extracted
118
+ * steps to one key by itself, so the verdict is a record and a hint.
119
+ * 3. **Fail** otherwise. The default is deliberately conservative — a
120
+ * deviation nobody can explain is the case the vault says is "genuinely
121
+ * wrong", and guessing is what the model-backed reconciler is for.
122
+ *
123
+ * A conflict the runtime strategy could not absorb always fails here: choosing
124
+ * a winner between two landings is a semantic judgement this default does not
125
+ * have the material to make.
126
+ *
127
+ * @since 0.1.0
128
+ * @category constructors
129
+ */
130
+ export const makeDefault = () => ({
131
+ onDeviation: Effect.fn("Reconciliation.onDeviation")((deviation) => {
132
+ const paths = [...new Set(deviation.paths)];
133
+ // Own keys only: a path named `toString` must not resolve to Object.prototype.
134
+ const ownerOf = (path) => Object.hasOwn(deviation.declaredBy, path) ? deviation.declaredBy[path] : undefined;
135
+ const discovered = [
136
+ ...new Set(paths
137
+ .map(ownerOf)
138
+ .filter((owner) => owner !== undefined && owner !== deviation.nodeId))
139
+ ];
140
+ if (discovered.length > 0 &&
141
+ paths.every((path) => {
142
+ const owner = ownerOf(path);
143
+ return owner !== undefined && owner !== deviation.nodeId;
144
+ })) {
145
+ return Effect.succeed({
146
+ _tag: "Reorder",
147
+ dependsOn: discovered,
148
+ reason: `${deviation.nodeId} wrote paths declared by ${discovered.join(", ")}`
149
+ });
150
+ }
151
+ if (deviation.alsoDeviatedBy.length > 0) {
152
+ return Effect.succeed({
153
+ _tag: "FactorOut",
154
+ paths: deviation.paths,
155
+ reason: `${deviation.nodeId} and ${deviation.alsoDeviatedBy.join(", ")} produced the same undeclared paths`
156
+ });
157
+ }
158
+ return Effect.succeed({
159
+ _tag: "Fail",
160
+ reason: `${deviation.nodeId} wrote ${deviation.paths.join(", ")}, which no declaration explains`
161
+ });
162
+ }),
163
+ onConflict: Effect.fn("Reconciliation.onConflict")((conflict) => Effect.succeed({
164
+ _tag: "Fail",
165
+ reason: `${conflict.nodeId} could not land after ${conflict.rebases} rebases under ${conflict.strategy}`
166
+ }))
167
+ });
168
+ /**
169
+ * Installs the deterministic default reconciler.
170
+ *
171
+ * @since 0.1.0
172
+ * @category layers
173
+ */
174
+ export const layerDefault = Layer.sync(Reconciliation, makeDefault);
175
+ //# sourceMappingURL=Reconciliation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Reconciliation.js","sourceRoot":"","sources":["../../src/Reconciliation.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The reconciliation seam: what happens when the world disagrees with the\n * declaration.\n *\n * `docs/guides/drive-a-plan.md` (\"Install a reconciler\") describes expected sets as the soft\n * mode: going outside them is allowed, journaled, and \"triggers a\n * **reconciliation flow** — pluggable, a flow like everything else\". The\n * deviation events have been emitted since the isolated-execution lane landed\n * (`internal/ActionPersistence.ts`, both `expectedSetDeviation` sites) and\n * had **no consumer at all**. This is the consumer, and\n * `PlanScheduler` is what feeds it.\n *\n * Pluggability is dependency injection at the owning seam, per the repository's\n * extension doctrine — there is no hook kernel. {@link layerDefault} installs a\n * deterministic verdict function; a model-backed reconciler is a different\n * `Layer` and lives in the agent packages. This package has no model\n * dependency and must not grow one.\n *\n * The three verdicts are exactly the vault's: **fail** the step where the\n * deviation is genuinely wrong, **reorder** — re-plan with the discovered\n * dependency made explicit — and **factor out** a shared step, where content\n * addressing does the heavy lifting because identical extracted steps collapse\n * to one key automatically.\n *\n * @since 0.1.0\n */\n\nimport * as Context from \"effect/Context\"\nimport * as Effect from \"effect/Effect\"\nimport * as Layer from \"effect/Layer\"\nimport * as Schema from \"effect/Schema\"\n\n/**\n * A journaled `flows.engine.expected-set-deviation`, resolved against the plan\n * the scheduler is driving.\n *\n * @since 0.1.0\n * @category schemas\n */\nexport const Deviation = Schema.Struct({\n nodeId: Schema.NonEmptyString,\n keyDigest: Schema.NonEmptyString,\n attempt: Schema.Int,\n /** Paths the execution touched that its declaration did not predict. */\n paths: Schema.Array(Schema.String),\n diffIdentity: Schema.String,\n /**\n * For each undeclared path, the OTHER plan node that declares it as a write\n * — the discovered dependency, resolved by the scheduler because only it\n * holds the plan.\n */\n declaredBy: Schema.Record(Schema.String, Schema.NonEmptyString),\n /** Other nodes in this run whose deviation named exactly the same paths. */\n alsoDeviatedBy: Schema.Array(Schema.NonEmptyString)\n})\n\n/**\n * The value form of {@link Deviation}.\n *\n * @since 0.1.0\n * @category models\n */\nexport type Deviation = typeof Deviation.Type\n\n/**\n * A `WorkspaceSandbox.MaterializationConflict` the runtime strategy could not\n * absorb: the delay/rebase budget is spent, or the merge itself conflicted.\n *\n * @since 0.1.0\n * @category schemas\n */\nexport const Conflict = Schema.Struct({\n nodeId: Schema.NonEmptyString,\n keyDigest: Schema.NonEmptyString,\n attempt: Schema.Int,\n /** How many times the scheduler rebased before giving up. */\n rebases: Schema.Int,\n strategy: Schema.Literals([\"delay-rebase\", \"stop-merge\"]),\n /** The plan nodes this one was annotated as conflicting with. */\n conflictsWith: Schema.Array(Schema.NonEmptyString)\n})\n\n/**\n * The value form of {@link Conflict}.\n *\n * @since 0.1.0\n * @category models\n */\nexport type Conflict = typeof Conflict.Type\n\n/**\n * What reconciliation decided.\n *\n * @since 0.1.0\n * @category schemas\n */\nexport const Verdict = Schema.Union([\n Schema.TaggedStruct(\"Fail\", { reason: Schema.String }),\n Schema.TaggedStruct(\"Reorder\", { dependsOn: Schema.Array(Schema.NonEmptyString), reason: Schema.String }),\n Schema.TaggedStruct(\"FactorOut\", { paths: Schema.Array(Schema.String), reason: Schema.String })\n])\n\n/**\n * The value form of {@link Verdict}.\n *\n * @since 0.1.0\n * @category models\n */\nexport type Verdict = typeof Verdict.Type\n\n/**\n * The pluggable reconciler.\n *\n * @since 0.1.0\n * @category models\n */\nexport interface Service {\n readonly onDeviation: (deviation: Deviation) => Effect.Effect<Verdict>\n readonly onConflict: (conflict: Conflict) => Effect.Effect<Verdict>\n}\n\n/**\n * Service tag for the reconciliation seam.\n *\n * @since 0.1.0\n * @category services\n */\nexport class Reconciliation extends Context.Service<Reconciliation, Service>()(\"@smthrs/engine-store/Reconciliation\") {}\n\n/**\n * Names a {@link Service} implementation as a reconciler.\n *\n * It is the identity function: the value is checked against the interface at\n * its definition site, which is where a wrong-shaped reconciler should be\n * reported rather than at whichever layer eventually provides it.\n *\n * @since 0.1.0\n * @category constructors\n */\nexport const make = (service: Service): Service => service\n\n/**\n * Provides a {@link Service} as the {@link Reconciliation} seam, replacing the\n * deterministic default.\n *\n * @since 0.1.0\n * @category layers\n */\nexport const layer = (service: Service): Layer.Layer<Reconciliation> => Layer.succeed(Reconciliation, service)\n\n/**\n * The deterministic default, in the vault's order of preference.\n *\n * 1. **Reorder** when every undeclared path is a path some *other* plan node\n * declares it writes. That is a real dependency the declaration missed, and\n * making it explicit is strictly better than failing.\n * 2. **Factor out** when another node in the same run deviated on exactly the\n * same paths — two parallel steps that both ran `npm install`. No graph\n * surgery follows: content addressing collapses two identical extracted\n * steps to one key by itself, so the verdict is a record and a hint.\n * 3. **Fail** otherwise. The default is deliberately conservative — a\n * deviation nobody can explain is the case the vault says is \"genuinely\n * wrong\", and guessing is what the model-backed reconciler is for.\n *\n * A conflict the runtime strategy could not absorb always fails here: choosing\n * a winner between two landings is a semantic judgement this default does not\n * have the material to make.\n *\n * @since 0.1.0\n * @category constructors\n */\nexport const makeDefault = (): Service => ({\n onDeviation: Effect.fn(\"Reconciliation.onDeviation\")((deviation) => {\n const paths = [...new Set(deviation.paths)]\n // Own keys only: a path named `toString` must not resolve to Object.prototype.\n const ownerOf = (path: string): string | undefined =>\n Object.hasOwn(deviation.declaredBy, path) ? deviation.declaredBy[path] : undefined\n const discovered = [\n ...new Set(\n paths\n .map(ownerOf)\n .filter((owner): owner is string => owner !== undefined && owner !== deviation.nodeId)\n )\n ]\n if (\n discovered.length > 0 &&\n paths.every((path) => {\n const owner = ownerOf(path)\n return owner !== undefined && owner !== deviation.nodeId\n })\n ) {\n return Effect.succeed<Verdict>({\n _tag: \"Reorder\",\n dependsOn: discovered,\n reason: `${deviation.nodeId} wrote paths declared by ${discovered.join(\", \")}`\n })\n }\n if (deviation.alsoDeviatedBy.length > 0) {\n return Effect.succeed<Verdict>({\n _tag: \"FactorOut\",\n paths: deviation.paths,\n reason: `${deviation.nodeId} and ${deviation.alsoDeviatedBy.join(\", \")} produced the same undeclared paths`\n })\n }\n return Effect.succeed<Verdict>({\n _tag: \"Fail\",\n reason: `${deviation.nodeId} wrote ${deviation.paths.join(\", \")}, which no declaration explains`\n })\n }),\n onConflict: Effect.fn(\"Reconciliation.onConflict\")((conflict) =>\n Effect.succeed<Verdict>({\n _tag: \"Fail\",\n reason: `${conflict.nodeId} could not land after ${conflict.rebases} rebases under ${conflict.strategy}`\n })\n )\n})\n\n/**\n * Installs the deterministic default reconciler.\n *\n * @since 0.1.0\n * @category layers\n */\nexport const layerDefault: Layer.Layer<Reconciliation> = Layer.sync(Reconciliation, makeDefault)\n"]}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * An engine that replays recorded work and executes none.
3
+ *
4
+ * `smthrs runs verify` asks what a resume under the current code would do
5
+ * before anything runs: which recorded steps it would serve from their
6
+ * durable records, and which step it would execute again because its key no
7
+ * longer matches one. The engine is the only thing that can answer, because a
8
+ * step key is derived at dispatch from the running flow's own declaration,
9
+ * ordinal and scope. This service turns a durable engine into that question:
10
+ * a dispatch served from a durable record reports `replayed`, and the first
11
+ * dispatch that would run an action body dies with {@link WouldExecute} before
12
+ * any attempt row, snapshot, boundary or body. It reports `resumes` when it
13
+ * would re-enter a recorded attempt that never finished (a step parked inside
14
+ * its body), and `would-execute` when no record matches its key at all.
15
+ *
16
+ * The death is a defect on purpose. A typed failure would enter the action's
17
+ * retry policy, and the default policy never gives up; a defect is never
18
+ * retried, so the run settles with the verdict instead of spinning on it.
19
+ *
20
+ * Run it against a copy of the store. A replay still converges the journal
21
+ * rows a resume would write, and the run settles `failed` on the copy.
22
+ *
23
+ * @since 1.0.0
24
+ */
25
+ import * as Context from "effect/Context";
26
+ import type * as Effect from "effect/Effect";
27
+ import * as Layer from "effect/Layer";
28
+ import * as Schema from "effect/Schema";
29
+ /**
30
+ * One dispatch a replay-only engine saw.
31
+ *
32
+ * `stepKeyDigest` is the identity `flows_attempts` rows are keyed on, so a
33
+ * reader joins it to the recorded attempts directly. `action` is the declared
34
+ * action name. `outcome` is `replayed` for a dispatch served from a durable
35
+ * record (a recorded failure included), `resumes` for one that would re-enter
36
+ * a recorded attempt that never finished, and `would-execute` for one no
37
+ * record matches.
38
+ *
39
+ * @since 1.0.0
40
+ * @category models
41
+ */
42
+ export interface Dispatch {
43
+ readonly runId: string;
44
+ readonly stepKeyDigest: string;
45
+ readonly attempt: number;
46
+ readonly action: string;
47
+ readonly tier: "sealed" | "compensable" | "irreversible";
48
+ readonly outcome: "replayed" | "resumes" | "would-execute";
49
+ }
50
+ /**
51
+ * Receives every dispatch a replay-only engine settles, in settlement order.
52
+ *
53
+ * @since 1.0.0
54
+ * @category models
55
+ */
56
+ export interface Service {
57
+ readonly observe: (dispatch: Dispatch) => Effect.Effect<void>;
58
+ }
59
+ declare const ReplayOnly_base: Context.ServiceClass<ReplayOnly, "@smthrs/engine-store/ReplayOnly", Service>;
60
+ /**
61
+ * Service tag. An engine composed with it in context executes no action body.
62
+ *
63
+ * @since 1.0.0
64
+ * @category services
65
+ */
66
+ export declare class ReplayOnly extends ReplayOnly_base {
67
+ }
68
+ declare const WouldExecute_base: Schema.Class<WouldExecute, Schema.TaggedStruct<"@smthrs/engine-store/WouldExecute", {
69
+ readonly runId: Schema.String;
70
+ readonly stepKeyDigest: Schema.String;
71
+ readonly attempt: Schema.Number;
72
+ readonly action: Schema.String;
73
+ }>, import("effect/Cause").YieldableError>;
74
+ /**
75
+ * The defect a replay-only dispatch dies with instead of executing.
76
+ *
77
+ * @since 1.0.0
78
+ * @category errors
79
+ */
80
+ export declare class WouldExecute extends WouldExecute_base {
81
+ get message(): string;
82
+ }
83
+ /**
84
+ * Provides a replay-only engine context that reports to `observe`.
85
+ *
86
+ * @since 1.0.0
87
+ * @category layers
88
+ */
89
+ export declare const layer: (observe: Service["observe"]) => Layer.Layer<ReplayOnly>;
90
+ export {};
91
+ //# sourceMappingURL=ReplayOnly.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReplayOnly.d.ts","sourceRoot":"","sources":["../../src/ReplayOnly.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,aAAa,GAAG,cAAc,CAAA;IACxD,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,SAAS,GAAG,eAAe,CAAA;CAC3D;AAED;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;CAC9D;;AAED;;;;;GAKG;AACH,qBAAa,UAAW,SAAQ,eAAyE;CAAG;;;;;;;AAE5G;;;;;GAKG;AACH,qBAAa,YAAa,SAAQ,iBAKhC;IACA,IAAa,OAAO,IAAI,MAAM,CAE7B;CACF;AAED;;;;;GAKG;AACH,eAAO,MAAM,KAAK,GAAI,SAAS,OAAO,CAAC,SAAS,CAAC,KAAG,KAAK,CAAC,KAAK,CAAC,UAAU,CACnB,CAAA"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * An engine that replays recorded work and executes none.
3
+ *
4
+ * `smthrs runs verify` asks what a resume under the current code would do
5
+ * before anything runs: which recorded steps it would serve from their
6
+ * durable records, and which step it would execute again because its key no
7
+ * longer matches one. The engine is the only thing that can answer, because a
8
+ * step key is derived at dispatch from the running flow's own declaration,
9
+ * ordinal and scope. This service turns a durable engine into that question:
10
+ * a dispatch served from a durable record reports `replayed`, and the first
11
+ * dispatch that would run an action body dies with {@link WouldExecute} before
12
+ * any attempt row, snapshot, boundary or body. It reports `resumes` when it
13
+ * would re-enter a recorded attempt that never finished (a step parked inside
14
+ * its body), and `would-execute` when no record matches its key at all.
15
+ *
16
+ * The death is a defect on purpose. A typed failure would enter the action's
17
+ * retry policy, and the default policy never gives up; a defect is never
18
+ * retried, so the run settles with the verdict instead of spinning on it.
19
+ *
20
+ * Run it against a copy of the store. A replay still converges the journal
21
+ * rows a resume would write, and the run settles `failed` on the copy.
22
+ *
23
+ * @since 1.0.0
24
+ */
25
+ import * as Context from "effect/Context";
26
+ import * as Layer from "effect/Layer";
27
+ import * as Schema from "effect/Schema";
28
+ /**
29
+ * Service tag. An engine composed with it in context executes no action body.
30
+ *
31
+ * @since 1.0.0
32
+ * @category services
33
+ */
34
+ export class ReplayOnly extends Context.Service()("@smthrs/engine-store/ReplayOnly") {
35
+ }
36
+ /**
37
+ * The defect a replay-only dispatch dies with instead of executing.
38
+ *
39
+ * @since 1.0.0
40
+ * @category errors
41
+ */
42
+ export class WouldExecute extends Schema.TaggedError()("@smthrs/engine-store/WouldExecute", {
43
+ runId: Schema.String,
44
+ stepKeyDigest: Schema.String,
45
+ attempt: Schema.Number,
46
+ action: Schema.String
47
+ }) {
48
+ get message() {
49
+ return `Action ${this.action} (step ${this.stepKeyDigest}, attempt ${this.attempt}) would execute`;
50
+ }
51
+ }
52
+ /**
53
+ * Provides a replay-only engine context that reports to `observe`.
54
+ *
55
+ * @since 1.0.0
56
+ * @category layers
57
+ */
58
+ export const layer = (observe) => Layer.succeed(ReplayOnly, ReplayOnly.of({ observe }));
59
+ //# sourceMappingURL=ReplayOnly.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReplayOnly.js","sourceRoot":"","sources":["../../src/ReplayOnly.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AAEzC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAkCvC;;;;;GAKG;AACH,MAAM,OAAO,UAAW,SAAQ,OAAO,CAAC,OAAO,EAAuB,CAAC,iCAAiC,CAAC;CAAG;AAE5G;;;;;GAKG;AACH,MAAM,OAAO,YAAa,SAAQ,MAAM,CAAC,WAAW,EAAgB,CAAC,mCAAmC,EAAE;IACxG,KAAK,EAAE,MAAM,CAAC,MAAM;IACpB,aAAa,EAAE,MAAM,CAAC,MAAM;IAC5B,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,MAAM,EAAE,MAAM,CAAC,MAAM;CACtB,CAAC;IACA,IAAa,OAAO;QAClB,OAAO,UAAU,IAAI,CAAC,MAAM,UAAU,IAAI,CAAC,aAAa,aAAa,IAAI,CAAC,OAAO,iBAAiB,CAAA;IACpG,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,OAA2B,EAA2B,EAAE,CAC5E,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA","sourcesContent":["/**\n * An engine that replays recorded work and executes none.\n *\n * `smthrs runs verify` asks what a resume under the current code would do\n * before anything runs: which recorded steps it would serve from their\n * durable records, and which step it would execute again because its key no\n * longer matches one. The engine is the only thing that can answer, because a\n * step key is derived at dispatch from the running flow's own declaration,\n * ordinal and scope. This service turns a durable engine into that question:\n * a dispatch served from a durable record reports `replayed`, and the first\n * dispatch that would run an action body dies with {@link WouldExecute} before\n * any attempt row, snapshot, boundary or body. It reports `resumes` when it\n * would re-enter a recorded attempt that never finished (a step parked inside\n * its body), and `would-execute` when no record matches its key at all.\n *\n * The death is a defect on purpose. A typed failure would enter the action's\n * retry policy, and the default policy never gives up; a defect is never\n * retried, so the run settles with the verdict instead of spinning on it.\n *\n * Run it against a copy of the store. A replay still converges the journal\n * rows a resume would write, and the run settles `failed` on the copy.\n *\n * @since 1.0.0\n */\n\nimport * as Context from \"effect/Context\"\nimport type * as Effect from \"effect/Effect\"\nimport * as Layer from \"effect/Layer\"\nimport * as Schema from \"effect/Schema\"\n\n/**\n * One dispatch a replay-only engine saw.\n *\n * `stepKeyDigest` is the identity `flows_attempts` rows are keyed on, so a\n * reader joins it to the recorded attempts directly. `action` is the declared\n * action name. `outcome` is `replayed` for a dispatch served from a durable\n * record (a recorded failure included), `resumes` for one that would re-enter\n * a recorded attempt that never finished, and `would-execute` for one no\n * record matches.\n *\n * @since 1.0.0\n * @category models\n */\nexport interface Dispatch {\n readonly runId: string\n readonly stepKeyDigest: string\n readonly attempt: number\n readonly action: string\n readonly tier: \"sealed\" | \"compensable\" | \"irreversible\"\n readonly outcome: \"replayed\" | \"resumes\" | \"would-execute\"\n}\n\n/**\n * Receives every dispatch a replay-only engine settles, in settlement order.\n *\n * @since 1.0.0\n * @category models\n */\nexport interface Service {\n readonly observe: (dispatch: Dispatch) => Effect.Effect<void>\n}\n\n/**\n * Service tag. An engine composed with it in context executes no action body.\n *\n * @since 1.0.0\n * @category services\n */\nexport class ReplayOnly extends Context.Service<ReplayOnly, Service>()(\"@smthrs/engine-store/ReplayOnly\") {}\n\n/**\n * The defect a replay-only dispatch dies with instead of executing.\n *\n * @since 1.0.0\n * @category errors\n */\nexport class WouldExecute extends Schema.TaggedError<WouldExecute>()(\"@smthrs/engine-store/WouldExecute\", {\n runId: Schema.String,\n stepKeyDigest: Schema.String,\n attempt: Schema.Number,\n action: Schema.String\n}) {\n override get message(): string {\n return `Action ${this.action} (step ${this.stepKeyDigest}, attempt ${this.attempt}) would execute`\n }\n}\n\n/**\n * Provides a replay-only engine context that reports to `observe`.\n *\n * @since 1.0.0\n * @category layers\n */\nexport const layer = (observe: Service[\"observe\"]): Layer.Layer<ReplayOnly> =>\n Layer.succeed(ReplayOnly, ReplayOnly.of({ observe }))\n"]}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Deleting run history that has outlived its usefulness.
3
+ *
4
+ * Nothing in the durable stores forgets on its own: a finished run keeps its
5
+ * row, every attempt, every journal event, and every archived frame forever.
6
+ * That is the right default — a run's history is the only account of what an
7
+ * agent did to a repository — and it is why `smithers gc` exists rather than a
8
+ * background sweeper. Retention is an operator decision, taken explicitly,
9
+ * with a dry run available before anything is deleted.
10
+ *
11
+ * This module is the public surface. The operation lives in
12
+ * `internal/RetentionOps.ts` beside the other modules that read this package's
13
+ * own tables, so `internal/` is never imported by a consumer — the same split
14
+ * `Errors.ts` uses. {@link retain} and {@link layer} are that operation: one
15
+ * bounded pass over the engine ladder, inside one `journal.transact`.
16
+ *
17
+ * {@link collect} is the host-facing pass `smithers gc` runs, and it is a
18
+ * facade over the same guard. A project keeps its history in two files — the
19
+ * control plane's database and the engine's — and a sweep of one without the
20
+ * other leaves half of a deleted run behind, so the pass takes the database as
21
+ * a service and runs once per file. Which runs it may delete is
22
+ * {@link RetentionOps.lineagePrelude}'s answer, not a second guard written
23
+ * here: a run stays whenever a live run stands above or below it, over BOTH
24
+ * relations that make one run the parent of another — the `flows_run_parents`
25
+ * edge a spawned child records, and the `parent_run_id` column a trampoline
26
+ * lineage is chained through.
27
+ *
28
+ * Only terminal runs are ever considered. A `pending`, `running`, or
29
+ * `suspended` row belongs to work that can still resume.
30
+ *
31
+ * @since 1.0.0
32
+ */
33
+ import * as Effect from "effect/Effect";
34
+ import * as SqlClient from "effect/unstable/sql/SqlClient";
35
+ import type { SqlError } from "effect/unstable/sql/SqlError";
36
+ import * as RetentionOps from "./internal/RetentionOps.ts";
37
+ export { defaultLimit, layer, make, type RetainOptions, type RetainReport, Retention, RetentionError, RetentionErrorCode, type RunScopedTable,
38
+ /**
39
+ * Every table a deleted run leaves rows in. One inventory serves this pass
40
+ * and {@link Service.retain}, so neither can leak what the other deletes.
41
+ *
42
+ * @category constants
43
+ * @since 1.0.0
44
+ */
45
+ runScopedTables, type Service, terminalStatuses } from "./internal/RetentionOps.ts";
46
+ /**
47
+ * What one retention pass would delete, or did.
48
+ *
49
+ * @category models
50
+ * @since 1.0.0
51
+ */
52
+ export interface Report {
53
+ readonly database: string;
54
+ /** The threshold, as an epoch millisecond value. */
55
+ readonly olderThanMs: number;
56
+ readonly runs: ReadonlyArray<string>;
57
+ /** Rows deleted per table; empty under a dry run. */
58
+ readonly deleted: Readonly<Record<string, number>>;
59
+ readonly dryRun: boolean;
60
+ }
61
+ /**
62
+ * Arguments accepted by {@link collect}.
63
+ *
64
+ * @category models
65
+ * @since 1.0.0
66
+ */
67
+ export interface Options {
68
+ /** Delete terminal runs that finished strictly before this epoch millisecond. */
69
+ readonly olderThanMs: number;
70
+ readonly dryRun?: boolean | undefined;
71
+ /** A label for the report; the host's database path. */
72
+ readonly database?: string | undefined;
73
+ /** Largest number of runs considered by this pass. Defaults to 1,000. */
74
+ readonly limit?: number | undefined;
75
+ /** Runs retained by a host's cross-store ancestry, in addition to local live roots. */
76
+ readonly pins?: ReadonlyArray<string> | undefined;
77
+ }
78
+ /**
79
+ * The terminal runs one pass would delete, oldest first.
80
+ *
81
+ * @category getters
82
+ * @since 1.0.0
83
+ */
84
+ export declare const eligible: (olderThanMs: number, limit?: number) => Effect.Effect<ReadonlyArray<string>, SqlError, SqlClient.SqlClient>;
85
+ /**
86
+ * Runs one retention pass.
87
+ *
88
+ * The deletion itself is {@link RetentionOps.deleteRuns}, the same one
89
+ * {@link Service.retain} runs, so this pass cannot hold a shorter table list
90
+ * than that one and cannot delete run rows in an order the self-referential
91
+ * `parent_run_id` foreign key refuses. A handoff parent always sorts before
92
+ * its successor, so deleting in age order broke as soon as one lineage
93
+ * straddled a chunk boundary, and it broke AFTER the dependent rows of every
94
+ * eligible run were already gone. `assumeLadder: false` because this pass also
95
+ * runs against the control plane's database, which composed fewer stores.
96
+ *
97
+ * Eligibility and deletion share one retryable transaction: another writer
98
+ * cannot attach a live parent between the lineage scan and deletion. A busy
99
+ * retry recomputes eligibility rather than replaying an old candidate list.
100
+ * One transaction, for the reason `retain` opens one: a pass that removed a
101
+ * run's history and then refused on its row would have destroyed what it could
102
+ * not put back, and a workspace whose next pass refuses the same way can never
103
+ * be collected again.
104
+ *
105
+ * Under `dryRun` nothing is written and `deleted` is empty: the report names
106
+ * exactly the runs a real pass would remove, which is what makes
107
+ * `smithers gc --dry-run` worth trusting.
108
+ *
109
+ * @category constructors
110
+ * @since 1.0.0
111
+ */
112
+ export declare const collect: (options: Options) => Effect.Effect<Report, SqlError | RetentionOps.RetentionError, SqlClient.SqlClient>;
113
+ //# sourceMappingURL=Retention.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Retention.d.ts","sourceRoot":"","sources":["../../src/Retention.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAIH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AAC5D,OAAO,KAAK,YAAY,MAAM,4BAA4B,CAAA;AAE1D,OAAO,EACL,YAAY,EACZ,KAAK,EACL,IAAI,EACJ,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,KAAK,cAAc;AACnB;;;;;;GAMG;AACH,eAAe,EACf,KAAK,OAAO,EACZ,gBAAgB,EACjB,MAAM,4BAA4B,CAAA;AAEnC;;;;;GAKG;AACH,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,oDAAoD;IACpD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IACpC,qDAAqD;IACrD,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAClD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CACzB;AAED;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACtB,iFAAiF;IACjF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACrC,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACtC,yEAAyE;IACzE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACnC,uFAAuF;IACvF,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,CAAA;CAClD;AA4CD;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,GACnB,aAAa,MAAM,EACnB,cAAiC,KAChC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,SAAS,CAIlE,CAAA;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,OAAO,GAClB,SAAS,OAAO,KACf,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,GAAG,YAAY,CAAC,cAAc,EAAE,SAAS,CAAC,SAAS,CA+BhF,CAAA"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Deleting run history that has outlived its usefulness.
3
+ *
4
+ * Nothing in the durable stores forgets on its own: a finished run keeps its
5
+ * row, every attempt, every journal event, and every archived frame forever.
6
+ * That is the right default — a run's history is the only account of what an
7
+ * agent did to a repository — and it is why `smithers gc` exists rather than a
8
+ * background sweeper. Retention is an operator decision, taken explicitly,
9
+ * with a dry run available before anything is deleted.
10
+ *
11
+ * This module is the public surface. The operation lives in
12
+ * `internal/RetentionOps.ts` beside the other modules that read this package's
13
+ * own tables, so `internal/` is never imported by a consumer — the same split
14
+ * `Errors.ts` uses. {@link retain} and {@link layer} are that operation: one
15
+ * bounded pass over the engine ladder, inside one `journal.transact`.
16
+ *
17
+ * {@link collect} is the host-facing pass `smithers gc` runs, and it is a
18
+ * facade over the same guard. A project keeps its history in two files — the
19
+ * control plane's database and the engine's — and a sweep of one without the
20
+ * other leaves half of a deleted run behind, so the pass takes the database as
21
+ * a service and runs once per file. Which runs it may delete is
22
+ * {@link RetentionOps.lineagePrelude}'s answer, not a second guard written
23
+ * here: a run stays whenever a live run stands above or below it, over BOTH
24
+ * relations that make one run the parent of another — the `flows_run_parents`
25
+ * edge a spawned child records, and the `parent_run_id` column a trampoline
26
+ * lineage is chained through.
27
+ *
28
+ * Only terminal runs are ever considered. A `pending`, `running`, or
29
+ * `suspended` row belongs to work that can still resume.
30
+ *
31
+ * @since 1.0.0
32
+ */
33
+ import * as Dialect from "@smthrs/database/Dialect";
34
+ import * as DurableWriter from "@smthrs/database/DurableWriter";
35
+ import * as Effect from "effect/Effect";
36
+ import * as SqlClient from "effect/unstable/sql/SqlClient";
37
+ import * as RetentionOps from "./internal/RetentionOps.js";
38
+ export { defaultLimit, layer, make, Retention, RetentionError, RetentionErrorCode,
39
+ /**
40
+ * Every table a deleted run leaves rows in. One inventory serves this pass
41
+ * and {@link Service.retain}, so neither can leak what the other deletes.
42
+ *
43
+ * @category constants
44
+ * @since 1.0.0
45
+ */
46
+ runScopedTables, terminalStatuses } from "./internal/RetentionOps.js";
47
+ /** Whether a table exists in the connected database. */
48
+ const hasTable = (table) => Effect.gen(function* () {
49
+ const sql = yield* SqlClient.SqlClient;
50
+ const rows = yield* Dialect.tables(sql).pipe(Effect.map((rows) => rows.filter((row) => row.name === table)));
51
+ return rows.length > 0;
52
+ });
53
+ /**
54
+ * The runs one pass would delete, oldest first, each with the run it names as
55
+ * its parent.
56
+ *
57
+ * The same candidate query `retain` runs: children before parents, so a
58
+ * trampoline lineage longer than the bound still loses a run every pass, and
59
+ * a run is excluded whenever a live run stands above or below it. Downward,
60
+ * deleting a parent whose child is still running would break the
61
+ * `parent_run_id` foreign key and drop the live child's edges with the
62
+ * `flows_run_parents_gc` trigger. Upward, a parked parent still reads a
63
+ * settled child's result out of its run row through `agent/await`, and it can
64
+ * be parked for longer than the threshold before it ever asks.
65
+ */
66
+ const eligibleCandidates = (olderThanMs, limit, pins) => Effect.gen(function* () {
67
+ const sql = yield* SqlClient.SqlClient;
68
+ if (!(yield* hasTable("flows_runs")))
69
+ return [];
70
+ // The engine's edge table is absent from the control-plane database, which
71
+ // migrates the run store and the journal and nothing else. The prelude
72
+ // drops that half of the walk there and keeps the `parent_run_id` half, so
73
+ // one guard covers both files.
74
+ return yield* RetentionOps.candidatesOf(sql, {
75
+ cutoffMs: olderThanMs,
76
+ inclusive: false,
77
+ parentEdges: yield* hasTable("flows_run_parents"),
78
+ pins,
79
+ limit: RetentionOps.normalizeLimit(limit)
80
+ });
81
+ });
82
+ /**
83
+ * The terminal runs one pass would delete, oldest first.
84
+ *
85
+ * @category getters
86
+ * @since 1.0.0
87
+ */
88
+ export const eligible = (olderThanMs, limit = RetentionOps.defaultLimit) => Effect.map(eligibleCandidates(olderThanMs, limit), (candidates) => candidates.map((candidate) => candidate.runId));
89
+ /**
90
+ * Runs one retention pass.
91
+ *
92
+ * The deletion itself is {@link RetentionOps.deleteRuns}, the same one
93
+ * {@link Service.retain} runs, so this pass cannot hold a shorter table list
94
+ * than that one and cannot delete run rows in an order the self-referential
95
+ * `parent_run_id` foreign key refuses. A handoff parent always sorts before
96
+ * its successor, so deleting in age order broke as soon as one lineage
97
+ * straddled a chunk boundary, and it broke AFTER the dependent rows of every
98
+ * eligible run were already gone. `assumeLadder: false` because this pass also
99
+ * runs against the control plane's database, which composed fewer stores.
100
+ *
101
+ * Eligibility and deletion share one retryable transaction: another writer
102
+ * cannot attach a live parent between the lineage scan and deletion. A busy
103
+ * retry recomputes eligibility rather than replaying an old candidate list.
104
+ * One transaction, for the reason `retain` opens one: a pass that removed a
105
+ * run's history and then refused on its row would have destroyed what it could
106
+ * not put back, and a workspace whose next pass refuses the same way can never
107
+ * be collected again.
108
+ *
109
+ * Under `dryRun` nothing is written and `deleted` is empty: the report names
110
+ * exactly the runs a real pass would remove, which is what makes
111
+ * `smithers gc --dry-run` worth trusting.
112
+ *
113
+ * @category constructors
114
+ * @since 1.0.0
115
+ */
116
+ export const collect = (options) => Effect.gen(function* () {
117
+ const sql = yield* SqlClient.SqlClient;
118
+ const dryRun = options.dryRun === true;
119
+ const pass = Effect.gen(function* () {
120
+ const candidates = yield* eligibleCandidates(options.olderThanMs, options.limit, options.pins);
121
+ return yield* RetentionOps.deleteRuns(sql, candidates, {
122
+ dryRun,
123
+ assumeLadder: false
124
+ });
125
+ });
126
+ const removed = yield* (dryRun ? sql.withTransaction(pass) : DurableWriter.make(sql).write(pass).pipe(Effect.catchIf((cause) => cause instanceof DurableWriter.DatabaseError, (cause) => Effect.fail(new RetentionOps.RetentionError({
127
+ code: "delete_failed",
128
+ message: "retention transaction failed; no history was deleted",
129
+ cause
130
+ })))));
131
+ return {
132
+ database: options.database ?? "",
133
+ olderThanMs: options.olderThanMs,
134
+ runs: removed.runIds,
135
+ deleted: dryRun ? {} : removed.deleted,
136
+ dryRun
137
+ };
138
+ });
139
+ //# sourceMappingURL=Retention.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Retention.js","sourceRoot":"","sources":["../../src/Retention.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Deleting run history that has outlived its usefulness.\n *\n * Nothing in the durable stores forgets on its own: a finished run keeps its\n * row, every attempt, every journal event, and every archived frame forever.\n * That is the right default — a run's history is the only account of what an\n * agent did to a repository — and it is why `smithers gc` exists rather than a\n * background sweeper. Retention is an operator decision, taken explicitly,\n * with a dry run available before anything is deleted.\n *\n * This module is the public surface. The operation lives in\n * `internal/RetentionOps.ts` beside the other modules that read this package's\n * own tables, so `internal/` is never imported by a consumer — the same split\n * `Errors.ts` uses. {@link retain} and {@link layer} are that operation: one\n * bounded pass over the engine ladder, inside one `journal.transact`.\n *\n * {@link collect} is the host-facing pass `smithers gc` runs, and it is a\n * facade over the same guard. A project keeps its history in two files — the\n * control plane's database and the engine's — and a sweep of one without the\n * other leaves half of a deleted run behind, so the pass takes the database as\n * a service and runs once per file. Which runs it may delete is\n * {@link RetentionOps.lineagePrelude}'s answer, not a second guard written\n * here: a run stays whenever a live run stands above or below it, over BOTH\n * relations that make one run the parent of another — the `flows_run_parents`\n * edge a spawned child records, and the `parent_run_id` column a trampoline\n * lineage is chained through.\n *\n * Only terminal runs are ever considered. A `pending`, `running`, or\n * `suspended` row belongs to work that can still resume.\n *\n * @since 1.0.0\n */\n\nimport * as Dialect from \"@smthrs/database/Dialect\"\nimport * as DurableWriter from \"@smthrs/database/DurableWriter\"\nimport * as Effect from \"effect/Effect\"\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\"\nimport type { SqlError } from \"effect/unstable/sql/SqlError\"\nimport * as RetentionOps from \"./internal/RetentionOps.ts\"\n\nexport {\n defaultLimit,\n layer,\n make,\n type RetainOptions,\n type RetainReport,\n Retention,\n RetentionError,\n RetentionErrorCode,\n type RunScopedTable,\n /**\n * Every table a deleted run leaves rows in. One inventory serves this pass\n * and {@link Service.retain}, so neither can leak what the other deletes.\n *\n * @category constants\n * @since 1.0.0\n */\n runScopedTables,\n type Service,\n terminalStatuses\n} from \"./internal/RetentionOps.ts\"\n\n/**\n * What one retention pass would delete, or did.\n *\n * @category models\n * @since 1.0.0\n */\nexport interface Report {\n readonly database: string\n /** The threshold, as an epoch millisecond value. */\n readonly olderThanMs: number\n readonly runs: ReadonlyArray<string>\n /** Rows deleted per table; empty under a dry run. */\n readonly deleted: Readonly<Record<string, number>>\n readonly dryRun: boolean\n}\n\n/**\n * Arguments accepted by {@link collect}.\n *\n * @category models\n * @since 1.0.0\n */\nexport interface Options {\n /** Delete terminal runs that finished strictly before this epoch millisecond. */\n readonly olderThanMs: number\n readonly dryRun?: boolean | undefined\n /** A label for the report; the host's database path. */\n readonly database?: string | undefined\n /** Largest number of runs considered by this pass. Defaults to 1,000. */\n readonly limit?: number | undefined\n /** Runs retained by a host's cross-store ancestry, in addition to local live roots. */\n readonly pins?: ReadonlyArray<string> | undefined\n}\n\n/** Whether a table exists in the connected database. */\nconst hasTable = (table: string): Effect.Effect<boolean, SqlError, SqlClient.SqlClient> =>\n Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n const rows = yield* Dialect.tables(sql).pipe(Effect.map((rows) => rows.filter((row) => row.name === table)))\n return rows.length > 0\n })\n\n/**\n * The runs one pass would delete, oldest first, each with the run it names as\n * its parent.\n *\n * The same candidate query `retain` runs: children before parents, so a\n * trampoline lineage longer than the bound still loses a run every pass, and\n * a run is excluded whenever a live run stands above or below it. Downward,\n * deleting a parent whose child is still running would break the\n * `parent_run_id` foreign key and drop the live child's edges with the\n * `flows_run_parents_gc` trigger. Upward, a parked parent still reads a\n * settled child's result out of its run row through `agent/await`, and it can\n * be parked for longer than the threshold before it ever asks.\n */\nconst eligibleCandidates = (\n olderThanMs: number,\n limit: number | undefined,\n pins?: ReadonlyArray<string>\n): Effect.Effect<ReadonlyArray<RetentionOps.Candidate>, SqlError, SqlClient.SqlClient> =>\n Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n if (!(yield* hasTable(\"flows_runs\"))) return []\n // The engine's edge table is absent from the control-plane database, which\n // migrates the run store and the journal and nothing else. The prelude\n // drops that half of the walk there and keeps the `parent_run_id` half, so\n // one guard covers both files.\n return yield* RetentionOps.candidatesOf(sql, {\n cutoffMs: olderThanMs,\n inclusive: false,\n parentEdges: yield* hasTable(\"flows_run_parents\"),\n pins,\n limit: RetentionOps.normalizeLimit(limit)\n })\n })\n\n/**\n * The terminal runs one pass would delete, oldest first.\n *\n * @category getters\n * @since 1.0.0\n */\nexport const eligible = (\n olderThanMs: number,\n limit = RetentionOps.defaultLimit\n): Effect.Effect<ReadonlyArray<string>, SqlError, SqlClient.SqlClient> =>\n Effect.map(\n eligibleCandidates(olderThanMs, limit),\n (candidates) => candidates.map((candidate) => candidate.runId)\n )\n\n/**\n * Runs one retention pass.\n *\n * The deletion itself is {@link RetentionOps.deleteRuns}, the same one\n * {@link Service.retain} runs, so this pass cannot hold a shorter table list\n * than that one and cannot delete run rows in an order the self-referential\n * `parent_run_id` foreign key refuses. A handoff parent always sorts before\n * its successor, so deleting in age order broke as soon as one lineage\n * straddled a chunk boundary, and it broke AFTER the dependent rows of every\n * eligible run were already gone. `assumeLadder: false` because this pass also\n * runs against the control plane's database, which composed fewer stores.\n *\n * Eligibility and deletion share one retryable transaction: another writer\n * cannot attach a live parent between the lineage scan and deletion. A busy\n * retry recomputes eligibility rather than replaying an old candidate list.\n * One transaction, for the reason `retain` opens one: a pass that removed a\n * run's history and then refused on its row would have destroyed what it could\n * not put back, and a workspace whose next pass refuses the same way can never\n * be collected again.\n *\n * Under `dryRun` nothing is written and `deleted` is empty: the report names\n * exactly the runs a real pass would remove, which is what makes\n * `smithers gc --dry-run` worth trusting.\n *\n * @category constructors\n * @since 1.0.0\n */\nexport const collect = (\n options: Options\n): Effect.Effect<Report, SqlError | RetentionOps.RetentionError, SqlClient.SqlClient> =>\n Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n const dryRun = options.dryRun === true\n const pass = Effect.gen(function*() {\n const candidates = yield* eligibleCandidates(options.olderThanMs, options.limit, options.pins)\n return yield* RetentionOps.deleteRuns(sql, candidates, {\n dryRun,\n assumeLadder: false\n })\n })\n const removed = yield* (dryRun ? sql.withTransaction(pass) : DurableWriter.make(sql).write(pass).pipe(\n Effect.catchIf(\n (cause): cause is DurableWriter.DatabaseError => cause instanceof DurableWriter.DatabaseError,\n (cause) =>\n Effect.fail(\n new RetentionOps.RetentionError({\n code: \"delete_failed\",\n message: \"retention transaction failed; no history was deleted\",\n cause\n })\n )\n )\n ))\n return {\n database: options.database ?? \"\",\n olderThanMs: options.olderThanMs,\n runs: removed.runIds,\n deleted: dryRun ? {} : removed.deleted,\n dryRun\n }\n })\n"]}