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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (787) hide show
  1. package/CHANGELOG.md +247 -0
  2. package/LICENSE +21 -0
  3. package/README.md +146 -2
  4. package/dist/cjs/ArtifactGc.d.ts +235 -0
  5. package/dist/cjs/ArtifactGc.d.ts.map +1 -0
  6. package/dist/cjs/ArtifactGc.js +183 -0
  7. package/dist/cjs/ArtifactGc.js.map +7 -0
  8. package/dist/cjs/ArtifactSync.d.ts +164 -0
  9. package/dist/cjs/ArtifactSync.d.ts.map +1 -0
  10. package/dist/cjs/ArtifactSync.js +144 -0
  11. package/dist/cjs/ArtifactSync.js.map +7 -0
  12. package/dist/cjs/CacheSync.d.ts +112 -0
  13. package/dist/cjs/CacheSync.d.ts.map +1 -0
  14. package/dist/cjs/CacheSync.js +64 -0
  15. package/dist/cjs/CacheSync.js.map +7 -0
  16. package/dist/cjs/DeferredClockFold.d.ts +354 -0
  17. package/dist/cjs/DeferredClockFold.d.ts.map +1 -0
  18. package/dist/cjs/DeferredClockFold.js +335 -0
  19. package/dist/cjs/DeferredClockFold.js.map +7 -0
  20. package/dist/cjs/DisasterRecovery.d.ts +431 -0
  21. package/dist/cjs/DisasterRecovery.d.ts.map +1 -0
  22. package/dist/cjs/DisasterRecovery.js +453 -0
  23. package/dist/cjs/DisasterRecovery.js.map +7 -0
  24. package/dist/cjs/DurableEngineState.d.ts +776 -0
  25. package/dist/cjs/DurableEngineState.d.ts.map +1 -0
  26. package/dist/cjs/DurableEngineState.js +1536 -0
  27. package/dist/cjs/DurableEngineState.js.map +7 -0
  28. package/dist/cjs/EngineStore.d.ts +158 -0
  29. package/dist/cjs/EngineStore.d.ts.map +1 -0
  30. package/dist/cjs/EngineStore.js +398 -0
  31. package/dist/cjs/EngineStore.js.map +7 -0
  32. package/dist/cjs/EngineStoreMetrics.d.ts +276 -0
  33. package/dist/cjs/EngineStoreMetrics.d.ts.map +1 -0
  34. package/dist/cjs/EngineStoreMetrics.js +135 -0
  35. package/dist/cjs/EngineStoreMetrics.js.map +7 -0
  36. package/dist/cjs/Errors.d.ts +22 -0
  37. package/dist/cjs/Errors.d.ts.map +1 -0
  38. package/dist/cjs/Errors.js +39 -0
  39. package/dist/cjs/Errors.js.map +7 -0
  40. package/dist/cjs/EventTypes.d.ts +27 -0
  41. package/dist/cjs/EventTypes.d.ts.map +1 -0
  42. package/dist/cjs/EventTypes.js +37 -0
  43. package/dist/cjs/EventTypes.js.map +7 -0
  44. package/dist/cjs/ExecutionFacts.d.ts +59 -0
  45. package/dist/cjs/ExecutionFacts.d.ts.map +1 -0
  46. package/dist/cjs/ExecutionFacts.js +123 -0
  47. package/dist/cjs/ExecutionFacts.js.map +7 -0
  48. package/dist/cjs/ExecutionSnapshot.d.ts +117 -0
  49. package/dist/cjs/ExecutionSnapshot.d.ts.map +1 -0
  50. package/dist/cjs/ExecutionSnapshot.js +111 -0
  51. package/dist/cjs/ExecutionSnapshot.js.map +7 -0
  52. package/dist/cjs/Inconsistency.d.ts +154 -0
  53. package/dist/cjs/Inconsistency.d.ts.map +1 -0
  54. package/dist/cjs/Inconsistency.js +135 -0
  55. package/dist/cjs/Inconsistency.js.map +7 -0
  56. package/dist/cjs/Migrations.d.ts +56 -0
  57. package/dist/cjs/Migrations.d.ts.map +1 -0
  58. package/dist/cjs/Migrations.js +78 -0
  59. package/dist/cjs/Migrations.js.map +7 -0
  60. package/dist/cjs/OwnerIdentity.d.ts +91 -0
  61. package/dist/cjs/OwnerIdentity.d.ts.map +1 -0
  62. package/dist/cjs/OwnerIdentity.js +65 -0
  63. package/dist/cjs/OwnerIdentity.js.map +7 -0
  64. package/dist/cjs/PlanInputStore.d.ts +110 -0
  65. package/dist/cjs/PlanInputStore.d.ts.map +1 -0
  66. package/dist/cjs/PlanInputStore.js +224 -0
  67. package/dist/cjs/PlanInputStore.js.map +7 -0
  68. package/dist/cjs/PlanMergeStore.d.ts +113 -0
  69. package/dist/cjs/PlanMergeStore.d.ts.map +1 -0
  70. package/dist/cjs/PlanMergeStore.js +255 -0
  71. package/dist/cjs/PlanMergeStore.js.map +7 -0
  72. package/dist/cjs/PlanScheduler.d.ts +363 -0
  73. package/dist/cjs/PlanScheduler.d.ts.map +1 -0
  74. package/dist/cjs/PlanScheduler.js +1090 -0
  75. package/dist/cjs/PlanScheduler.js.map +7 -0
  76. package/dist/cjs/Reconciliation.d.ts +175 -0
  77. package/dist/cjs/Reconciliation.d.ts.map +1 -0
  78. package/dist/cjs/Reconciliation.js +119 -0
  79. package/dist/cjs/Reconciliation.js.map +7 -0
  80. package/dist/cjs/ReplayOnly.d.ts +91 -0
  81. package/dist/cjs/ReplayOnly.d.ts.map +1 -0
  82. package/dist/cjs/ReplayOnly.js +52 -0
  83. package/dist/cjs/ReplayOnly.js.map +7 -0
  84. package/dist/cjs/Retention.d.ts +113 -0
  85. package/dist/cjs/Retention.d.ts.map +1 -0
  86. package/dist/cjs/Retention.js +99 -0
  87. package/dist/cjs/Retention.js.map +7 -0
  88. package/dist/cjs/RunCatalogRead.d.ts +17 -0
  89. package/dist/cjs/RunCatalogRead.d.ts.map +1 -0
  90. package/dist/cjs/RunCatalogRead.js +33 -0
  91. package/dist/cjs/RunCatalogRead.js.map +7 -0
  92. package/dist/cjs/RunChangeFeed.d.ts +75 -0
  93. package/dist/cjs/RunChangeFeed.d.ts.map +1 -0
  94. package/dist/cjs/RunChangeFeed.js +96 -0
  95. package/dist/cjs/RunChangeFeed.js.map +7 -0
  96. package/dist/cjs/RunState.d.ts +116 -0
  97. package/dist/cjs/RunState.d.ts.map +1 -0
  98. package/dist/cjs/RunState.js +76 -0
  99. package/dist/cjs/RunState.js.map +7 -0
  100. package/dist/cjs/Selection.d.ts +495 -0
  101. package/dist/cjs/Selection.d.ts.map +1 -0
  102. package/dist/cjs/Selection.js +288 -0
  103. package/dist/cjs/Selection.js.map +7 -0
  104. package/dist/cjs/SelectionStore.d.ts +141 -0
  105. package/dist/cjs/SelectionStore.d.ts.map +1 -0
  106. package/dist/cjs/SelectionStore.js +229 -0
  107. package/dist/cjs/SelectionStore.js.map +7 -0
  108. package/dist/cjs/StepBoundary.d.ts +501 -0
  109. package/dist/cjs/StepBoundary.d.ts.map +1 -0
  110. package/dist/cjs/StepBoundary.js +619 -0
  111. package/dist/cjs/StepBoundary.js.map +7 -0
  112. package/dist/cjs/StepCacheFold.d.ts +148 -0
  113. package/dist/cjs/StepCacheFold.d.ts.map +1 -0
  114. package/dist/cjs/StepCacheFold.js +131 -0
  115. package/dist/cjs/StepCacheFold.js.map +7 -0
  116. package/dist/cjs/StepSandbox.d.ts +78 -0
  117. package/dist/cjs/StepSandbox.d.ts.map +1 -0
  118. package/dist/cjs/StepSandbox.js +75 -0
  119. package/dist/cjs/StepSandbox.js.map +7 -0
  120. package/dist/cjs/WakeBus.d.ts +116 -0
  121. package/dist/cjs/WakeBus.d.ts.map +1 -0
  122. package/dist/cjs/WakeBus.js +89 -0
  123. package/dist/cjs/WakeBus.js.map +7 -0
  124. package/dist/cjs/WorkspaceSandbox.d.ts +619 -0
  125. package/dist/cjs/WorkspaceSandbox.d.ts.map +1 -0
  126. package/dist/cjs/WorkspaceSandbox.js +711 -0
  127. package/dist/cjs/WorkspaceSandbox.js.map +7 -0
  128. package/dist/cjs/index.d.ts +157 -0
  129. package/dist/cjs/index.d.ts.map +1 -0
  130. package/dist/cjs/index.js +95 -0
  131. package/dist/cjs/index.js.map +7 -0
  132. package/dist/cjs/internal/ActionPersistence.d.ts +276 -0
  133. package/dist/cjs/internal/ActionPersistence.d.ts.map +1 -0
  134. package/dist/cjs/internal/ActionPersistence.js +1395 -0
  135. package/dist/cjs/internal/ActionPersistence.js.map +7 -0
  136. package/dist/cjs/internal/ArtifactRoots.d.ts +38 -0
  137. package/dist/cjs/internal/ArtifactRoots.d.ts.map +1 -0
  138. package/dist/cjs/internal/ArtifactRoots.js +89 -0
  139. package/dist/cjs/internal/ArtifactRoots.js.map +7 -0
  140. package/dist/cjs/internal/AttemptAdmission.d.ts +53 -0
  141. package/dist/cjs/internal/AttemptAdmission.d.ts.map +1 -0
  142. package/dist/cjs/internal/AttemptAdmission.js +52 -0
  143. package/dist/cjs/internal/AttemptAdmission.js.map +7 -0
  144. package/dist/cjs/internal/AttemptLifecycle.d.ts +245 -0
  145. package/dist/cjs/internal/AttemptLifecycle.d.ts.map +1 -0
  146. package/dist/cjs/internal/AttemptLifecycle.js +112 -0
  147. package/dist/cjs/internal/AttemptLifecycle.js.map +7 -0
  148. package/dist/cjs/internal/AttemptProbe.d.ts +53 -0
  149. package/dist/cjs/internal/AttemptProbe.d.ts.map +1 -0
  150. package/dist/cjs/internal/AttemptProbe.js +66 -0
  151. package/dist/cjs/internal/AttemptProbe.js.map +7 -0
  152. package/dist/cjs/internal/CacheAdmission.d.ts +79 -0
  153. package/dist/cjs/internal/CacheAdmission.d.ts.map +1 -0
  154. package/dist/cjs/internal/CacheAdmission.js +71 -0
  155. package/dist/cjs/internal/CacheAdmission.js.map +7 -0
  156. package/dist/cjs/internal/CacheAgeHistory.d.ts +27 -0
  157. package/dist/cjs/internal/CacheAgeHistory.d.ts.map +1 -0
  158. package/dist/cjs/internal/CacheAgeHistory.js +61 -0
  159. package/dist/cjs/internal/CacheAgeHistory.js.map +7 -0
  160. package/dist/cjs/internal/CacheAgeVerdicts.d.ts +15 -0
  161. package/dist/cjs/internal/CacheAgeVerdicts.d.ts.map +1 -0
  162. package/dist/cjs/internal/CacheAgeVerdicts.js +73 -0
  163. package/dist/cjs/internal/CacheAgeVerdicts.js.map +7 -0
  164. package/dist/cjs/internal/CacheOutputPolicy.d.ts +24 -0
  165. package/dist/cjs/internal/CacheOutputPolicy.d.ts.map +1 -0
  166. package/dist/cjs/internal/CacheOutputPolicy.js +75 -0
  167. package/dist/cjs/internal/CacheOutputPolicy.js.map +7 -0
  168. package/dist/cjs/internal/CachePublication.d.ts +97 -0
  169. package/dist/cjs/internal/CachePublication.d.ts.map +1 -0
  170. package/dist/cjs/internal/CachePublication.js +80 -0
  171. package/dist/cjs/internal/CachePublication.js.map +7 -0
  172. package/dist/cjs/internal/CallFacts.d.ts +15 -0
  173. package/dist/cjs/internal/CallFacts.d.ts.map +1 -0
  174. package/dist/cjs/internal/CallFacts.js +97 -0
  175. package/dist/cjs/internal/CallFacts.js.map +7 -0
  176. package/dist/cjs/internal/CopiedRecord.d.ts +61 -0
  177. package/dist/cjs/internal/CopiedRecord.d.ts.map +1 -0
  178. package/dist/cjs/internal/CopiedRecord.js +134 -0
  179. package/dist/cjs/internal/CopiedRecord.js.map +7 -0
  180. package/dist/cjs/internal/DeferredPersistence.d.ts +108 -0
  181. package/dist/cjs/internal/DeferredPersistence.d.ts.map +1 -0
  182. package/dist/cjs/internal/DeferredPersistence.js +270 -0
  183. package/dist/cjs/internal/DeferredPersistence.js.map +7 -0
  184. package/dist/cjs/internal/EffectRecords.d.ts +92 -0
  185. package/dist/cjs/internal/EffectRecords.d.ts.map +1 -0
  186. package/dist/cjs/internal/EffectRecords.js +63 -0
  187. package/dist/cjs/internal/EffectRecords.js.map +7 -0
  188. package/dist/cjs/internal/EngineJj.d.ts +30 -0
  189. package/dist/cjs/internal/EngineJj.d.ts.map +1 -0
  190. package/dist/cjs/internal/EngineJj.js +42 -0
  191. package/dist/cjs/internal/EngineJj.js.map +7 -0
  192. package/dist/cjs/internal/EngineStateSchema.d.ts +68 -0
  193. package/dist/cjs/internal/EngineStateSchema.d.ts.map +1 -0
  194. package/dist/cjs/internal/EngineStateSchema.js +58 -0
  195. package/dist/cjs/internal/EngineStateSchema.js.map +7 -0
  196. package/dist/cjs/internal/ExecutionSnapshotRead.d.ts +162 -0
  197. package/dist/cjs/internal/ExecutionSnapshotRead.d.ts.map +1 -0
  198. package/dist/cjs/internal/ExecutionSnapshotRead.js +201 -0
  199. package/dist/cjs/internal/ExecutionSnapshotRead.js.map +7 -0
  200. package/dist/cjs/internal/ExecutionSnapshotRelations.d.ts +39 -0
  201. package/dist/cjs/internal/ExecutionSnapshotRelations.d.ts.map +1 -0
  202. package/dist/cjs/internal/ExecutionSnapshotRelations.js +105 -0
  203. package/dist/cjs/internal/ExecutionSnapshotRelations.js.map +7 -0
  204. package/dist/cjs/internal/ExitEncoding.d.ts +180 -0
  205. package/dist/cjs/internal/ExitEncoding.d.ts.map +1 -0
  206. package/dist/cjs/internal/ExitEncoding.js +236 -0
  207. package/dist/cjs/internal/ExitEncoding.js.map +7 -0
  208. package/dist/cjs/internal/FileBoundarySnapshot.d.ts +14 -0
  209. package/dist/cjs/internal/FileBoundarySnapshot.d.ts.map +1 -0
  210. package/dist/cjs/internal/FileBoundarySnapshot.js +51 -0
  211. package/dist/cjs/internal/FileBoundarySnapshot.js.map +7 -0
  212. package/dist/cjs/internal/FileEnumeration.d.ts +127 -0
  213. package/dist/cjs/internal/FileEnumeration.d.ts.map +1 -0
  214. package/dist/cjs/internal/FileEnumeration.js +194 -0
  215. package/dist/cjs/internal/FileEnumeration.js.map +7 -0
  216. package/dist/cjs/internal/HostReflection.d.ts +80 -0
  217. package/dist/cjs/internal/HostReflection.d.ts.map +1 -0
  218. package/dist/cjs/internal/HostReflection.js +43 -0
  219. package/dist/cjs/internal/HostReflection.js.map +7 -0
  220. package/dist/cjs/internal/JournalRecords.d.ts +325 -0
  221. package/dist/cjs/internal/JournalRecords.d.ts.map +1 -0
  222. package/dist/cjs/internal/JournalRecords.js +122 -0
  223. package/dist/cjs/internal/JournalRecords.js.map +7 -0
  224. package/dist/cjs/internal/NodeJournal.d.ts +157 -0
  225. package/dist/cjs/internal/NodeJournal.d.ts.map +1 -0
  226. package/dist/cjs/internal/NodeJournal.js +192 -0
  227. package/dist/cjs/internal/NodeJournal.js.map +7 -0
  228. package/dist/cjs/internal/Ordering.d.ts +14 -0
  229. package/dist/cjs/internal/Ordering.d.ts.map +1 -0
  230. package/dist/cjs/internal/Ordering.js +25 -0
  231. package/dist/cjs/internal/Ordering.js.map +7 -0
  232. package/dist/cjs/internal/PlanInputs.d.ts +14 -0
  233. package/dist/cjs/internal/PlanInputs.d.ts.map +1 -0
  234. package/dist/cjs/internal/PlanInputs.js +78 -0
  235. package/dist/cjs/internal/PlanInputs.js.map +7 -0
  236. package/dist/cjs/internal/PlanMerges.d.ts +178 -0
  237. package/dist/cjs/internal/PlanMerges.d.ts.map +1 -0
  238. package/dist/cjs/internal/PlanMerges.js +125 -0
  239. package/dist/cjs/internal/PlanMerges.js.map +7 -0
  240. package/dist/cjs/internal/ProvenanceSlot.d.ts +30 -0
  241. package/dist/cjs/internal/ProvenanceSlot.d.ts.map +1 -0
  242. package/dist/cjs/internal/ProvenanceSlot.js +53 -0
  243. package/dist/cjs/internal/ProvenanceSlot.js.map +7 -0
  244. package/dist/cjs/internal/ResultEnvelope.d.ts +88 -0
  245. package/dist/cjs/internal/ResultEnvelope.d.ts.map +1 -0
  246. package/dist/cjs/internal/ResultEnvelope.js +90 -0
  247. package/dist/cjs/internal/ResultEnvelope.js.map +7 -0
  248. package/dist/cjs/internal/RetentionOps.d.ts +414 -0
  249. package/dist/cjs/internal/RetentionOps.d.ts.map +1 -0
  250. package/dist/cjs/internal/RetentionOps.js +354 -0
  251. package/dist/cjs/internal/RetentionOps.js.map +7 -0
  252. package/dist/cjs/internal/RunCatalogOps.d.ts +118 -0
  253. package/dist/cjs/internal/RunCatalogOps.d.ts.map +1 -0
  254. package/dist/cjs/internal/RunCatalogOps.js +85 -0
  255. package/dist/cjs/internal/RunCatalogOps.js.map +7 -0
  256. package/dist/cjs/internal/RunCoordinator.d.ts +78 -0
  257. package/dist/cjs/internal/RunCoordinator.d.ts.map +1 -0
  258. package/dist/cjs/internal/RunCoordinator.js +123 -0
  259. package/dist/cjs/internal/RunCoordinator.js.map +7 -0
  260. package/dist/cjs/internal/RunDriver.d.ts +192 -0
  261. package/dist/cjs/internal/RunDriver.d.ts.map +1 -0
  262. package/dist/cjs/internal/RunDriver.js +1586 -0
  263. package/dist/cjs/internal/RunDriver.js.map +7 -0
  264. package/dist/cjs/internal/RunLifecycle.d.ts +22 -0
  265. package/dist/cjs/internal/RunLifecycle.d.ts.map +1 -0
  266. package/dist/cjs/internal/RunLifecycle.js +63 -0
  267. package/dist/cjs/internal/RunLifecycle.js.map +7 -0
  268. package/dist/cjs/internal/RunListing.d.ts +78 -0
  269. package/dist/cjs/internal/RunListing.d.ts.map +1 -0
  270. package/dist/cjs/internal/RunListing.js +171 -0
  271. package/dist/cjs/internal/RunListing.js.map +7 -0
  272. package/dist/cjs/internal/RunListingError.d.ts +35 -0
  273. package/dist/cjs/internal/RunListingError.d.ts.map +1 -0
  274. package/dist/cjs/internal/RunListingError.js +47 -0
  275. package/dist/cjs/internal/RunListingError.js.map +7 -0
  276. package/dist/cjs/internal/RuntimeGraph.d.ts +73 -0
  277. package/dist/cjs/internal/RuntimeGraph.d.ts.map +1 -0
  278. package/dist/cjs/internal/RuntimeGraph.js +180 -0
  279. package/dist/cjs/internal/RuntimeGraph.js.map +7 -0
  280. package/dist/cjs/internal/SandboxedExecution.d.ts +80 -0
  281. package/dist/cjs/internal/SandboxedExecution.d.ts.map +1 -0
  282. package/dist/cjs/internal/SandboxedExecution.js +104 -0
  283. package/dist/cjs/internal/SandboxedExecution.js.map +7 -0
  284. package/dist/cjs/internal/StateTransaction.d.ts +44 -0
  285. package/dist/cjs/internal/StateTransaction.d.ts.map +1 -0
  286. package/dist/cjs/internal/StateTransaction.js +52 -0
  287. package/dist/cjs/internal/StateTransaction.js.map +7 -0
  288. package/dist/cjs/internal/StepFacts.d.ts +14 -0
  289. package/dist/cjs/internal/StepFacts.d.ts.map +1 -0
  290. package/dist/cjs/internal/StepFacts.js +58 -0
  291. package/dist/cjs/internal/StepFacts.js.map +7 -0
  292. package/dist/cjs/internal/TypedEvents.d.ts +14 -0
  293. package/dist/cjs/internal/TypedEvents.d.ts.map +1 -0
  294. package/dist/cjs/internal/TypedEvents.js +37 -0
  295. package/dist/cjs/internal/TypedEvents.js.map +7 -0
  296. package/dist/cjs/migrations/0001_initial.d.ts +17 -0
  297. package/dist/cjs/migrations/0001_initial.d.ts.map +1 -0
  298. package/dist/cjs/migrations/0001_initial.js +61 -0
  299. package/dist/cjs/migrations/0001_initial.js.map +7 -0
  300. package/dist/cjs/migrations/0002_selection_store.d.ts +15 -0
  301. package/dist/cjs/migrations/0002_selection_store.d.ts.map +1 -0
  302. package/dist/cjs/migrations/0002_selection_store.js +56 -0
  303. package/dist/cjs/migrations/0002_selection_store.js.map +7 -0
  304. package/dist/cjs/migrations/0003_plan_inputs.d.ts +13 -0
  305. package/dist/cjs/migrations/0003_plan_inputs.d.ts.map +1 -0
  306. package/dist/cjs/migrations/0003_plan_inputs.js +90 -0
  307. package/dist/cjs/migrations/0003_plan_inputs.js.map +7 -0
  308. package/dist/cjs/migrations/0004_plan_environment.d.ts +14 -0
  309. package/dist/cjs/migrations/0004_plan_environment.d.ts.map +1 -0
  310. package/dist/cjs/migrations/0004_plan_environment.js +56 -0
  311. package/dist/cjs/migrations/0004_plan_environment.js.map +7 -0
  312. package/dist/cjs/migrations/0005_plan_merges.d.ts +14 -0
  313. package/dist/cjs/migrations/0005_plan_merges.d.ts.map +1 -0
  314. package/dist/cjs/migrations/0005_plan_merges.js +82 -0
  315. package/dist/cjs/migrations/0005_plan_merges.js.map +7 -0
  316. package/dist/cjs/migrations/0006_execution_listing.d.ts +15 -0
  317. package/dist/cjs/migrations/0006_execution_listing.d.ts.map +1 -0
  318. package/dist/cjs/migrations/0006_execution_listing.js +101 -0
  319. package/dist/cjs/migrations/0006_execution_listing.js.map +7 -0
  320. package/dist/cjs/migrations/0007_run_parent_sequence.d.ts +15 -0
  321. package/dist/cjs/migrations/0007_run_parent_sequence.d.ts.map +1 -0
  322. package/dist/cjs/migrations/0007_run_parent_sequence.js +40 -0
  323. package/dist/cjs/migrations/0007_run_parent_sequence.js.map +7 -0
  324. package/dist/cjs/migrations/0008_deferred_consumption.d.ts +16 -0
  325. package/dist/cjs/migrations/0008_deferred_consumption.d.ts.map +1 -0
  326. package/dist/cjs/migrations/0008_deferred_consumption.js +45 -0
  327. package/dist/cjs/migrations/0008_deferred_consumption.js.map +7 -0
  328. package/dist/cjs/migrations/0009_deferred_clock_facts.d.ts +24 -0
  329. package/dist/cjs/migrations/0009_deferred_clock_facts.d.ts.map +1 -0
  330. package/dist/cjs/migrations/0009_deferred_clock_facts.js +141 -0
  331. package/dist/cjs/migrations/0009_deferred_clock_facts.js.map +7 -0
  332. package/dist/cjs/migrations/0010_pending_cancellation.d.ts +15 -0
  333. package/dist/cjs/migrations/0010_pending_cancellation.d.ts.map +1 -0
  334. package/dist/cjs/migrations/0010_pending_cancellation.js +41 -0
  335. package/dist/cjs/migrations/0010_pending_cancellation.js.map +7 -0
  336. package/dist/cjs/package.json +1 -0
  337. package/dist/cjs/test/TestStores.d.ts +89 -0
  338. package/dist/cjs/test/TestStores.d.ts.map +1 -0
  339. package/dist/cjs/test/TestStores.js +98 -0
  340. package/dist/cjs/test/TestStores.js.map +7 -0
  341. package/dist/esm/ArtifactGc.d.ts +235 -0
  342. package/dist/esm/ArtifactGc.d.ts.map +1 -0
  343. package/dist/esm/ArtifactGc.js +268 -0
  344. package/dist/esm/ArtifactGc.js.map +1 -0
  345. package/dist/esm/ArtifactSync.d.ts +164 -0
  346. package/dist/esm/ArtifactSync.d.ts.map +1 -0
  347. package/dist/esm/ArtifactSync.js +176 -0
  348. package/dist/esm/ArtifactSync.js.map +1 -0
  349. package/dist/esm/CacheSync.d.ts +112 -0
  350. package/dist/esm/CacheSync.d.ts.map +1 -0
  351. package/dist/esm/CacheSync.js +94 -0
  352. package/dist/esm/CacheSync.js.map +1 -0
  353. package/dist/esm/DeferredClockFold.d.ts +354 -0
  354. package/dist/esm/DeferredClockFold.d.ts.map +1 -0
  355. package/dist/esm/DeferredClockFold.js +472 -0
  356. package/dist/esm/DeferredClockFold.js.map +1 -0
  357. package/dist/esm/DisasterRecovery.d.ts +431 -0
  358. package/dist/esm/DisasterRecovery.d.ts.map +1 -0
  359. package/dist/esm/DisasterRecovery.js +523 -0
  360. package/dist/esm/DisasterRecovery.js.map +1 -0
  361. package/dist/esm/DurableEngineState.d.ts +776 -0
  362. package/dist/esm/DurableEngineState.d.ts.map +1 -0
  363. package/dist/esm/DurableEngineState.js +1648 -0
  364. package/dist/esm/DurableEngineState.js.map +1 -0
  365. package/dist/esm/EngineStore.d.ts +158 -0
  366. package/dist/esm/EngineStore.d.ts.map +1 -0
  367. package/dist/esm/EngineStore.js +403 -0
  368. package/dist/esm/EngineStore.js.map +1 -0
  369. package/dist/esm/EngineStoreMetrics.d.ts +276 -0
  370. package/dist/esm/EngineStoreMetrics.d.ts.map +1 -0
  371. package/dist/esm/EngineStoreMetrics.js +260 -0
  372. package/dist/esm/EngineStoreMetrics.js.map +1 -0
  373. package/dist/esm/Errors.d.ts +22 -0
  374. package/dist/esm/Errors.d.ts.map +1 -0
  375. package/dist/esm/Errors.js +22 -0
  376. package/dist/esm/Errors.js.map +1 -0
  377. package/dist/esm/EventTypes.d.ts +27 -0
  378. package/dist/esm/EventTypes.d.ts.map +1 -0
  379. package/dist/esm/EventTypes.js +27 -0
  380. package/dist/esm/EventTypes.js.map +1 -0
  381. package/dist/esm/ExecutionFacts.d.ts +59 -0
  382. package/dist/esm/ExecutionFacts.d.ts.map +1 -0
  383. package/dist/esm/ExecutionFacts.js +96 -0
  384. package/dist/esm/ExecutionFacts.js.map +1 -0
  385. package/dist/esm/ExecutionSnapshot.d.ts +117 -0
  386. package/dist/esm/ExecutionSnapshot.d.ts.map +1 -0
  387. package/dist/esm/ExecutionSnapshot.js +95 -0
  388. package/dist/esm/ExecutionSnapshot.js.map +1 -0
  389. package/dist/esm/Inconsistency.d.ts +154 -0
  390. package/dist/esm/Inconsistency.d.ts.map +1 -0
  391. package/dist/esm/Inconsistency.js +133 -0
  392. package/dist/esm/Inconsistency.js.map +1 -0
  393. package/dist/esm/Migrations.d.ts +56 -0
  394. package/dist/esm/Migrations.d.ts.map +1 -0
  395. package/dist/esm/Migrations.js +91 -0
  396. package/dist/esm/Migrations.js.map +1 -0
  397. package/dist/esm/OwnerIdentity.d.ts +91 -0
  398. package/dist/esm/OwnerIdentity.d.ts.map +1 -0
  399. package/dist/esm/OwnerIdentity.js +99 -0
  400. package/dist/esm/OwnerIdentity.js.map +1 -0
  401. package/dist/esm/PlanInputStore.d.ts +110 -0
  402. package/dist/esm/PlanInputStore.d.ts.map +1 -0
  403. package/dist/esm/PlanInputStore.js +207 -0
  404. package/dist/esm/PlanInputStore.js.map +1 -0
  405. package/dist/esm/PlanMergeStore.d.ts +113 -0
  406. package/dist/esm/PlanMergeStore.d.ts.map +1 -0
  407. package/dist/esm/PlanMergeStore.js +244 -0
  408. package/dist/esm/PlanMergeStore.js.map +1 -0
  409. package/dist/esm/PlanScheduler.d.ts +363 -0
  410. package/dist/esm/PlanScheduler.d.ts.map +1 -0
  411. package/dist/esm/PlanScheduler.js +1321 -0
  412. package/dist/esm/PlanScheduler.js.map +1 -0
  413. package/dist/esm/Reconciliation.d.ts +175 -0
  414. package/dist/esm/Reconciliation.d.ts.map +1 -0
  415. package/dist/esm/Reconciliation.js +175 -0
  416. package/dist/esm/Reconciliation.js.map +1 -0
  417. package/dist/esm/ReplayOnly.d.ts +91 -0
  418. package/dist/esm/ReplayOnly.d.ts.map +1 -0
  419. package/dist/esm/ReplayOnly.js +59 -0
  420. package/dist/esm/ReplayOnly.js.map +1 -0
  421. package/dist/esm/Retention.d.ts +113 -0
  422. package/dist/esm/Retention.d.ts.map +1 -0
  423. package/dist/esm/Retention.js +139 -0
  424. package/dist/esm/Retention.js.map +1 -0
  425. package/dist/esm/RunCatalogRead.d.ts +17 -0
  426. package/dist/esm/RunCatalogRead.d.ts.map +1 -0
  427. package/dist/esm/RunCatalogRead.js +17 -0
  428. package/dist/esm/RunCatalogRead.js.map +1 -0
  429. package/dist/esm/RunChangeFeed.d.ts +75 -0
  430. package/dist/esm/RunChangeFeed.d.ts.map +1 -0
  431. package/dist/esm/RunChangeFeed.js +81 -0
  432. package/dist/esm/RunChangeFeed.js.map +1 -0
  433. package/dist/esm/RunState.d.ts +116 -0
  434. package/dist/esm/RunState.d.ts.map +1 -0
  435. package/dist/esm/RunState.js +109 -0
  436. package/dist/esm/RunState.js.map +1 -0
  437. package/dist/esm/Selection.d.ts +495 -0
  438. package/dist/esm/Selection.d.ts.map +1 -0
  439. package/dist/esm/Selection.js +482 -0
  440. package/dist/esm/Selection.js.map +1 -0
  441. package/dist/esm/SelectionStore.d.ts +141 -0
  442. package/dist/esm/SelectionStore.d.ts.map +1 -0
  443. package/dist/esm/SelectionStore.js +215 -0
  444. package/dist/esm/SelectionStore.js.map +1 -0
  445. package/dist/esm/StepBoundary.d.ts +501 -0
  446. package/dist/esm/StepBoundary.d.ts.map +1 -0
  447. package/dist/esm/StepBoundary.js +919 -0
  448. package/dist/esm/StepBoundary.js.map +1 -0
  449. package/dist/esm/StepCacheFold.d.ts +148 -0
  450. package/dist/esm/StepCacheFold.d.ts.map +1 -0
  451. package/dist/esm/StepCacheFold.js +201 -0
  452. package/dist/esm/StepCacheFold.js.map +1 -0
  453. package/dist/esm/StepSandbox.d.ts +78 -0
  454. package/dist/esm/StepSandbox.d.ts.map +1 -0
  455. package/dist/esm/StepSandbox.js +70 -0
  456. package/dist/esm/StepSandbox.js.map +1 -0
  457. package/dist/esm/WakeBus.d.ts +116 -0
  458. package/dist/esm/WakeBus.d.ts.map +1 -0
  459. package/dist/esm/WakeBus.js +121 -0
  460. package/dist/esm/WakeBus.js.map +1 -0
  461. package/dist/esm/WorkspaceSandbox.d.ts +619 -0
  462. package/dist/esm/WorkspaceSandbox.d.ts.map +1 -0
  463. package/dist/esm/WorkspaceSandbox.js +985 -0
  464. package/dist/esm/WorkspaceSandbox.js.map +1 -0
  465. package/dist/esm/index.d.ts +157 -0
  466. package/dist/esm/index.d.ts.map +1 -0
  467. package/dist/esm/index.js +157 -0
  468. package/dist/esm/index.js.map +1 -0
  469. package/dist/esm/internal/ActionPersistence.d.ts +276 -0
  470. package/dist/esm/internal/ActionPersistence.d.ts.map +1 -0
  471. package/dist/esm/internal/ActionPersistence.js +2306 -0
  472. package/dist/esm/internal/ActionPersistence.js.map +1 -0
  473. package/dist/esm/internal/ArtifactRoots.d.ts +38 -0
  474. package/dist/esm/internal/ArtifactRoots.d.ts.map +1 -0
  475. package/dist/esm/internal/ArtifactRoots.js +76 -0
  476. package/dist/esm/internal/ArtifactRoots.js.map +1 -0
  477. package/dist/esm/internal/AttemptAdmission.d.ts +53 -0
  478. package/dist/esm/internal/AttemptAdmission.d.ts.map +1 -0
  479. package/dist/esm/internal/AttemptAdmission.js +52 -0
  480. package/dist/esm/internal/AttemptAdmission.js.map +1 -0
  481. package/dist/esm/internal/AttemptLifecycle.d.ts +245 -0
  482. package/dist/esm/internal/AttemptLifecycle.d.ts.map +1 -0
  483. package/dist/esm/internal/AttemptLifecycle.js +104 -0
  484. package/dist/esm/internal/AttemptLifecycle.js.map +1 -0
  485. package/dist/esm/internal/AttemptProbe.d.ts +53 -0
  486. package/dist/esm/internal/AttemptProbe.d.ts.map +1 -0
  487. package/dist/esm/internal/AttemptProbe.js +83 -0
  488. package/dist/esm/internal/AttemptProbe.js.map +1 -0
  489. package/dist/esm/internal/CacheAdmission.d.ts +79 -0
  490. package/dist/esm/internal/CacheAdmission.d.ts.map +1 -0
  491. package/dist/esm/internal/CacheAdmission.js +72 -0
  492. package/dist/esm/internal/CacheAdmission.js.map +1 -0
  493. package/dist/esm/internal/CacheAgeHistory.d.ts +27 -0
  494. package/dist/esm/internal/CacheAgeHistory.d.ts.map +1 -0
  495. package/dist/esm/internal/CacheAgeHistory.js +49 -0
  496. package/dist/esm/internal/CacheAgeHistory.js.map +1 -0
  497. package/dist/esm/internal/CacheAgeVerdicts.d.ts +15 -0
  498. package/dist/esm/internal/CacheAgeVerdicts.d.ts.map +1 -0
  499. package/dist/esm/internal/CacheAgeVerdicts.js +54 -0
  500. package/dist/esm/internal/CacheAgeVerdicts.js.map +1 -0
  501. package/dist/esm/internal/CacheOutputPolicy.d.ts +24 -0
  502. package/dist/esm/internal/CacheOutputPolicy.d.ts.map +1 -0
  503. package/dist/esm/internal/CacheOutputPolicy.js +73 -0
  504. package/dist/esm/internal/CacheOutputPolicy.js.map +1 -0
  505. package/dist/esm/internal/CachePublication.d.ts +97 -0
  506. package/dist/esm/internal/CachePublication.d.ts.map +1 -0
  507. package/dist/esm/internal/CachePublication.js +116 -0
  508. package/dist/esm/internal/CachePublication.js.map +1 -0
  509. package/dist/esm/internal/CallFacts.d.ts +15 -0
  510. package/dist/esm/internal/CallFacts.d.ts.map +1 -0
  511. package/dist/esm/internal/CallFacts.js +83 -0
  512. package/dist/esm/internal/CallFacts.js.map +1 -0
  513. package/dist/esm/internal/CopiedRecord.d.ts +61 -0
  514. package/dist/esm/internal/CopiedRecord.d.ts.map +1 -0
  515. package/dist/esm/internal/CopiedRecord.js +165 -0
  516. package/dist/esm/internal/CopiedRecord.js.map +1 -0
  517. package/dist/esm/internal/DeferredPersistence.d.ts +108 -0
  518. package/dist/esm/internal/DeferredPersistence.d.ts.map +1 -0
  519. package/dist/esm/internal/DeferredPersistence.js +240 -0
  520. package/dist/esm/internal/DeferredPersistence.js.map +1 -0
  521. package/dist/esm/internal/EffectRecords.d.ts +92 -0
  522. package/dist/esm/internal/EffectRecords.d.ts.map +1 -0
  523. package/dist/esm/internal/EffectRecords.js +94 -0
  524. package/dist/esm/internal/EffectRecords.js.map +1 -0
  525. package/dist/esm/internal/EngineJj.d.ts +30 -0
  526. package/dist/esm/internal/EngineJj.d.ts.map +1 -0
  527. package/dist/esm/internal/EngineJj.js +29 -0
  528. package/dist/esm/internal/EngineJj.js.map +1 -0
  529. package/dist/esm/internal/EngineStateSchema.d.ts +68 -0
  530. package/dist/esm/internal/EngineStateSchema.d.ts.map +1 -0
  531. package/dist/esm/internal/EngineStateSchema.js +53 -0
  532. package/dist/esm/internal/EngineStateSchema.js.map +1 -0
  533. package/dist/esm/internal/ExecutionSnapshotRead.d.ts +162 -0
  534. package/dist/esm/internal/ExecutionSnapshotRead.d.ts.map +1 -0
  535. package/dist/esm/internal/ExecutionSnapshotRead.js +218 -0
  536. package/dist/esm/internal/ExecutionSnapshotRead.js.map +1 -0
  537. package/dist/esm/internal/ExecutionSnapshotRelations.d.ts +39 -0
  538. package/dist/esm/internal/ExecutionSnapshotRelations.d.ts.map +1 -0
  539. package/dist/esm/internal/ExecutionSnapshotRelations.js +81 -0
  540. package/dist/esm/internal/ExecutionSnapshotRelations.js.map +1 -0
  541. package/dist/esm/internal/ExitEncoding.d.ts +180 -0
  542. package/dist/esm/internal/ExitEncoding.d.ts.map +1 -0
  543. package/dist/esm/internal/ExitEncoding.js +361 -0
  544. package/dist/esm/internal/ExitEncoding.js.map +1 -0
  545. package/dist/esm/internal/FileBoundarySnapshot.d.ts +14 -0
  546. package/dist/esm/internal/FileBoundarySnapshot.d.ts.map +1 -0
  547. package/dist/esm/internal/FileBoundarySnapshot.js +29 -0
  548. package/dist/esm/internal/FileBoundarySnapshot.js.map +1 -0
  549. package/dist/esm/internal/FileEnumeration.d.ts +127 -0
  550. package/dist/esm/internal/FileEnumeration.d.ts.map +1 -0
  551. package/dist/esm/internal/FileEnumeration.js +236 -0
  552. package/dist/esm/internal/FileEnumeration.js.map +1 -0
  553. package/dist/esm/internal/HostReflection.d.ts +80 -0
  554. package/dist/esm/internal/HostReflection.d.ts.map +1 -0
  555. package/dist/esm/internal/HostReflection.js +98 -0
  556. package/dist/esm/internal/HostReflection.js.map +1 -0
  557. package/dist/esm/internal/JournalRecords.d.ts +325 -0
  558. package/dist/esm/internal/JournalRecords.d.ts.map +1 -0
  559. package/dist/esm/internal/JournalRecords.js +306 -0
  560. package/dist/esm/internal/JournalRecords.js.map +1 -0
  561. package/dist/esm/internal/NodeJournal.d.ts +157 -0
  562. package/dist/esm/internal/NodeJournal.d.ts.map +1 -0
  563. package/dist/esm/internal/NodeJournal.js +298 -0
  564. package/dist/esm/internal/NodeJournal.js.map +1 -0
  565. package/dist/esm/internal/Ordering.d.ts +14 -0
  566. package/dist/esm/internal/Ordering.d.ts.map +1 -0
  567. package/dist/esm/internal/Ordering.js +14 -0
  568. package/dist/esm/internal/Ordering.js.map +1 -0
  569. package/dist/esm/internal/PlanInputs.d.ts +14 -0
  570. package/dist/esm/internal/PlanInputs.d.ts.map +1 -0
  571. package/dist/esm/internal/PlanInputs.js +57 -0
  572. package/dist/esm/internal/PlanInputs.js.map +1 -0
  573. package/dist/esm/internal/PlanMerges.d.ts +178 -0
  574. package/dist/esm/internal/PlanMerges.d.ts.map +1 -0
  575. package/dist/esm/internal/PlanMerges.js +113 -0
  576. package/dist/esm/internal/PlanMerges.js.map +1 -0
  577. package/dist/esm/internal/ProvenanceSlot.d.ts +30 -0
  578. package/dist/esm/internal/ProvenanceSlot.d.ts.map +1 -0
  579. package/dist/esm/internal/ProvenanceSlot.js +39 -0
  580. package/dist/esm/internal/ProvenanceSlot.js.map +1 -0
  581. package/dist/esm/internal/ResultEnvelope.d.ts +88 -0
  582. package/dist/esm/internal/ResultEnvelope.d.ts.map +1 -0
  583. package/dist/esm/internal/ResultEnvelope.js +83 -0
  584. package/dist/esm/internal/ResultEnvelope.js.map +1 -0
  585. package/dist/esm/internal/RetentionOps.d.ts +414 -0
  586. package/dist/esm/internal/RetentionOps.d.ts.map +1 -0
  587. package/dist/esm/internal/RetentionOps.js +576 -0
  588. package/dist/esm/internal/RetentionOps.js.map +1 -0
  589. package/dist/esm/internal/RunCatalogOps.d.ts +118 -0
  590. package/dist/esm/internal/RunCatalogOps.d.ts.map +1 -0
  591. package/dist/esm/internal/RunCatalogOps.js +120 -0
  592. package/dist/esm/internal/RunCatalogOps.js.map +1 -0
  593. package/dist/esm/internal/RunCoordinator.d.ts +78 -0
  594. package/dist/esm/internal/RunCoordinator.d.ts.map +1 -0
  595. package/dist/esm/internal/RunCoordinator.js +115 -0
  596. package/dist/esm/internal/RunCoordinator.js.map +1 -0
  597. package/dist/esm/internal/RunDriver.d.ts +192 -0
  598. package/dist/esm/internal/RunDriver.d.ts.map +1 -0
  599. package/dist/esm/internal/RunDriver.js +2334 -0
  600. package/dist/esm/internal/RunDriver.js.map +1 -0
  601. package/dist/esm/internal/RunLifecycle.d.ts +22 -0
  602. package/dist/esm/internal/RunLifecycle.d.ts.map +1 -0
  603. package/dist/esm/internal/RunLifecycle.js +49 -0
  604. package/dist/esm/internal/RunLifecycle.js.map +1 -0
  605. package/dist/esm/internal/RunListing.d.ts +78 -0
  606. package/dist/esm/internal/RunListing.d.ts.map +1 -0
  607. package/dist/esm/internal/RunListing.js +146 -0
  608. package/dist/esm/internal/RunListing.js.map +1 -0
  609. package/dist/esm/internal/RunListingError.d.ts +35 -0
  610. package/dist/esm/internal/RunListingError.d.ts.map +1 -0
  611. package/dist/esm/internal/RunListingError.js +27 -0
  612. package/dist/esm/internal/RunListingError.js.map +1 -0
  613. package/dist/esm/internal/RuntimeGraph.d.ts +73 -0
  614. package/dist/esm/internal/RuntimeGraph.d.ts.map +1 -0
  615. package/dist/esm/internal/RuntimeGraph.js +182 -0
  616. package/dist/esm/internal/RuntimeGraph.js.map +1 -0
  617. package/dist/esm/internal/SandboxedExecution.d.ts +80 -0
  618. package/dist/esm/internal/SandboxedExecution.d.ts.map +1 -0
  619. package/dist/esm/internal/SandboxedExecution.js +107 -0
  620. package/dist/esm/internal/SandboxedExecution.js.map +1 -0
  621. package/dist/esm/internal/StateTransaction.d.ts +44 -0
  622. package/dist/esm/internal/StateTransaction.d.ts.map +1 -0
  623. package/dist/esm/internal/StateTransaction.js +54 -0
  624. package/dist/esm/internal/StateTransaction.js.map +1 -0
  625. package/dist/esm/internal/StepFacts.d.ts +14 -0
  626. package/dist/esm/internal/StepFacts.d.ts.map +1 -0
  627. package/dist/esm/internal/StepFacts.js +35 -0
  628. package/dist/esm/internal/StepFacts.js.map +1 -0
  629. package/dist/esm/internal/TypedEvents.d.ts +14 -0
  630. package/dist/esm/internal/TypedEvents.d.ts.map +1 -0
  631. package/dist/esm/internal/TypedEvents.js +14 -0
  632. package/dist/esm/internal/TypedEvents.js.map +1 -0
  633. package/dist/esm/migrations/0001_initial.d.ts +17 -0
  634. package/dist/esm/migrations/0001_initial.d.ts.map +1 -0
  635. package/dist/esm/migrations/0001_initial.js +41 -0
  636. package/dist/esm/migrations/0001_initial.js.map +1 -0
  637. package/dist/esm/migrations/0002_selection_store.d.ts +15 -0
  638. package/dist/esm/migrations/0002_selection_store.d.ts.map +1 -0
  639. package/dist/esm/migrations/0002_selection_store.js +34 -0
  640. package/dist/esm/migrations/0002_selection_store.js.map +1 -0
  641. package/dist/esm/migrations/0003_plan_inputs.d.ts +13 -0
  642. package/dist/esm/migrations/0003_plan_inputs.d.ts.map +1 -0
  643. package/dist/esm/migrations/0003_plan_inputs.js +70 -0
  644. package/dist/esm/migrations/0003_plan_inputs.js.map +1 -0
  645. package/dist/esm/migrations/0004_plan_environment.d.ts +14 -0
  646. package/dist/esm/migrations/0004_plan_environment.d.ts.map +1 -0
  647. package/dist/esm/migrations/0004_plan_environment.js +33 -0
  648. package/dist/esm/migrations/0004_plan_environment.js.map +1 -0
  649. package/dist/esm/migrations/0005_plan_merges.d.ts +14 -0
  650. package/dist/esm/migrations/0005_plan_merges.d.ts.map +1 -0
  651. package/dist/esm/migrations/0005_plan_merges.js +59 -0
  652. package/dist/esm/migrations/0005_plan_merges.js.map +1 -0
  653. package/dist/esm/migrations/0006_execution_listing.d.ts +15 -0
  654. package/dist/esm/migrations/0006_execution_listing.d.ts.map +1 -0
  655. package/dist/esm/migrations/0006_execution_listing.js +81 -0
  656. package/dist/esm/migrations/0006_execution_listing.js.map +1 -0
  657. package/dist/esm/migrations/0007_run_parent_sequence.d.ts +15 -0
  658. package/dist/esm/migrations/0007_run_parent_sequence.d.ts.map +1 -0
  659. package/dist/esm/migrations/0007_run_parent_sequence.js +18 -0
  660. package/dist/esm/migrations/0007_run_parent_sequence.js.map +1 -0
  661. package/dist/esm/migrations/0008_deferred_consumption.d.ts +16 -0
  662. package/dist/esm/migrations/0008_deferred_consumption.d.ts.map +1 -0
  663. package/dist/esm/migrations/0008_deferred_consumption.js +24 -0
  664. package/dist/esm/migrations/0008_deferred_consumption.js.map +1 -0
  665. package/dist/esm/migrations/0009_deferred_clock_facts.d.ts +24 -0
  666. package/dist/esm/migrations/0009_deferred_clock_facts.d.ts.map +1 -0
  667. package/dist/esm/migrations/0009_deferred_clock_facts.js +127 -0
  668. package/dist/esm/migrations/0009_deferred_clock_facts.js.map +1 -0
  669. package/dist/esm/migrations/0010_pending_cancellation.d.ts +15 -0
  670. package/dist/esm/migrations/0010_pending_cancellation.d.ts.map +1 -0
  671. package/dist/esm/migrations/0010_pending_cancellation.js +19 -0
  672. package/dist/esm/migrations/0010_pending_cancellation.js.map +1 -0
  673. package/dist/esm/test/TestStores.d.ts +89 -0
  674. package/dist/esm/test/TestStores.d.ts.map +1 -0
  675. package/dist/esm/test/TestStores.js +103 -0
  676. package/dist/esm/test/TestStores.js.map +1 -0
  677. package/docs/README.md +113 -0
  678. package/docs/api.md +1494 -0
  679. package/docs/concepts/attempts-and-replay.md +149 -0
  680. package/docs/concepts/cache-admission.md +265 -0
  681. package/docs/concepts/call-facts.md +86 -0
  682. package/docs/concepts/durable-waits.md +175 -0
  683. package/docs/concepts/execution-facts.md +90 -0
  684. package/docs/concepts/ownership-and-fencing.md +128 -0
  685. package/docs/concepts/step-boundaries.md +148 -0
  686. package/docs/concepts/workspace-transactions.md +199 -0
  687. package/docs/event-types.md +14 -0
  688. package/docs/guides/back-up-and-restore.md +164 -0
  689. package/docs/guides/collect-unreferenced-artifacts.md +128 -0
  690. package/docs/guides/compose-a-durable-engine.md +146 -0
  691. package/docs/guides/coordinate-two-processes.md +120 -0
  692. package/docs/guides/defer-work-with-selection.md +171 -0
  693. package/docs/guides/delete-old-run-history.md +154 -0
  694. package/docs/guides/drive-a-plan.md +314 -0
  695. package/docs/guides/observe-engine-metrics.md +98 -0
  696. package/docs/guides/observe-executions.md +187 -0
  697. package/docs/guides/reclaim-runs-from-a-dead-host.md +133 -0
  698. package/docs/guides/share-a-cache-across-machines.md +134 -0
  699. package/docs/guides/testing.md +123 -0
  700. package/docs/installation.md +102 -0
  701. package/docs/quickstart.md +215 -0
  702. package/docs/troubleshooting.md +347 -0
  703. package/package.json +438 -3
  704. package/src/ArtifactGc.ts +408 -0
  705. package/src/ArtifactSync.ts +278 -0
  706. package/src/CacheSync.ts +131 -0
  707. package/src/DeferredClockFold.ts +586 -0
  708. package/src/DisasterRecovery.ts +888 -0
  709. package/src/DurableEngineState.ts +2656 -0
  710. package/src/EngineStore.ts +656 -0
  711. package/src/EngineStoreMetrics.ts +331 -0
  712. package/src/Errors.ts +28 -0
  713. package/src/EventTypes.ts +27 -0
  714. package/src/ExecutionFacts.ts +125 -0
  715. package/src/ExecutionSnapshot.ts +186 -0
  716. package/src/Inconsistency.ts +253 -0
  717. package/src/Migrations.ts +95 -0
  718. package/src/OwnerIdentity.ts +125 -0
  719. package/src/PlanInputStore.ts +292 -0
  720. package/src/PlanMergeStore.ts +330 -0
  721. package/src/PlanScheduler.ts +1806 -0
  722. package/src/Reconciliation.ts +224 -0
  723. package/src/ReplayOnly.ts +95 -0
  724. package/src/Retention.ts +214 -0
  725. package/src/RunCatalogRead.ts +27 -0
  726. package/src/RunChangeFeed.ts +125 -0
  727. package/src/RunState.ts +137 -0
  728. package/src/Selection.ts +683 -0
  729. package/src/SelectionStore.ts +353 -0
  730. package/src/StepBoundary.ts +1165 -0
  731. package/src/StepCacheFold.ts +244 -0
  732. package/src/StepSandbox.ts +110 -0
  733. package/src/WakeBus.ts +167 -0
  734. package/src/WorkspaceSandbox.ts +1604 -0
  735. package/src/index.ts +185 -0
  736. package/src/internal/ActionPersistence.ts +2687 -0
  737. package/src/internal/ArtifactRoots.ts +92 -0
  738. package/src/internal/AttemptAdmission.ts +76 -0
  739. package/src/internal/AttemptLifecycle.ts +163 -0
  740. package/src/internal/AttemptProbe.ts +90 -0
  741. package/src/internal/CacheAdmission.ts +133 -0
  742. package/src/internal/CacheAgeHistory.ts +58 -0
  743. package/src/internal/CacheAgeVerdicts.ts +61 -0
  744. package/src/internal/CacheOutputPolicy.ts +82 -0
  745. package/src/internal/CachePublication.ts +153 -0
  746. package/src/internal/CallFacts.ts +87 -0
  747. package/src/internal/CopiedRecord.ts +201 -0
  748. package/src/internal/DeferredPersistence.ts +459 -0
  749. package/src/internal/EffectRecords.ts +136 -0
  750. package/src/internal/EngineJj.ts +30 -0
  751. package/src/internal/EngineStateSchema.ts +92 -0
  752. package/src/internal/ExecutionSnapshotRead.ts +300 -0
  753. package/src/internal/ExecutionSnapshotRelations.ts +121 -0
  754. package/src/internal/ExitEncoding.ts +453 -0
  755. package/src/internal/FileBoundarySnapshot.ts +39 -0
  756. package/src/internal/FileEnumeration.ts +334 -0
  757. package/src/internal/HostReflection.ts +128 -0
  758. package/src/internal/JournalRecords.ts +396 -0
  759. package/src/internal/NodeJournal.ts +340 -0
  760. package/src/internal/Ordering.ts +14 -0
  761. package/src/internal/PlanInputs.ts +62 -0
  762. package/src/internal/PlanMerges.ts +123 -0
  763. package/src/internal/ProvenanceSlot.ts +52 -0
  764. package/src/internal/ResultEnvelope.ts +118 -0
  765. package/src/internal/RetentionOps.ts +865 -0
  766. package/src/internal/RunCatalogOps.ts +174 -0
  767. package/src/internal/RunCoordinator.ts +215 -0
  768. package/src/internal/RunDriver.ts +3154 -0
  769. package/src/internal/RunLifecycle.ts +53 -0
  770. package/src/internal/RunListing.ts +210 -0
  771. package/src/internal/RunListingError.ts +37 -0
  772. package/src/internal/RuntimeGraph.ts +253 -0
  773. package/src/internal/SandboxedExecution.ts +165 -0
  774. package/src/internal/StateTransaction.ts +71 -0
  775. package/src/internal/StepFacts.ts +36 -0
  776. package/src/internal/TypedEvents.ts +29 -0
  777. package/src/migrations/0001_initial.ts +51 -0
  778. package/src/migrations/0002_selection_store.ts +38 -0
  779. package/src/migrations/0003_plan_inputs.ts +75 -0
  780. package/src/migrations/0004_plan_environment.ts +34 -0
  781. package/src/migrations/0005_plan_merges.ts +60 -0
  782. package/src/migrations/0006_execution_listing.ts +86 -0
  783. package/src/migrations/0007_run_parent_sequence.ts +19 -0
  784. package/src/migrations/0008_deferred_consumption.ts +27 -0
  785. package/src/migrations/0009_deferred_clock_facts.ts +163 -0
  786. package/src/migrations/0010_pending_cancellation.ts +20 -0
  787. package/src/test/TestStores.ts +145 -0
@@ -0,0 +1,1536 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var DurableEngineState_exports = {};
30
+ __export(DurableEngineState_exports, {
31
+ AttemptSurvivors: () => AttemptSurvivors,
32
+ ClockAddress: () => ClockAddress,
33
+ ClockRow: () => ClockRow,
34
+ DeferredAddress: () => DeferredAddress,
35
+ DeferredRow: () => DeferredRow,
36
+ DurableEngineState: () => DurableEngineState,
37
+ EngineStateFault: () => EngineStateFault,
38
+ RunParentCycleError: () => RunParentCycleError,
39
+ RunParentEdge: () => RunParentEdge,
40
+ Waiting: () => Waiting,
41
+ WaitingReason: () => WaitingReason,
42
+ WaitingRow: () => WaitingRow,
43
+ layer: () => layer,
44
+ layerMemory: () => layerMemory,
45
+ make: () => make,
46
+ makeMemory: () => makeMemory,
47
+ waitingTreeMaxDepth: () => waitingTreeMaxDepth
48
+ });
49
+ module.exports = __toCommonJS(DurableEngineState_exports);
50
+ var Dialect = __toESM(require("@smthrs/database/Dialect"), 1);
51
+ var import_DurableWriter = require("@smthrs/database/DurableWriter");
52
+ var import_JournalEvent = require("@smthrs/journal/JournalEvent");
53
+ var Cause = __toESM(require("effect/Cause"), 1);
54
+ var Context = __toESM(require("effect/Context"), 1);
55
+ var Effect = __toESM(require("effect/Effect"), 1);
56
+ var Exit = __toESM(require("effect/Exit"), 1);
57
+ var Layer = __toESM(require("effect/Layer"), 1);
58
+ var Option = __toESM(require("effect/Option"), 1);
59
+ var Result = __toESM(require("effect/Result"), 1);
60
+ var Schema = __toESM(require("effect/Schema"), 1);
61
+ var Semaphore = __toESM(require("effect/Semaphore"), 1);
62
+ var SqlClient = __toESM(require("effect/unstable/sql/SqlClient"), 1);
63
+ var EngineStateSchema = __toESM(require("./internal/EngineStateSchema.js"), 1);
64
+ var import_Ordering = require("./internal/Ordering.js");
65
+ const pendingCancellationLimit = (limit) => Number.isSafeInteger(limit) && limit >= 0 ? Effect.void : Effect.die(new RangeError("Pending cancellation limit must be a non-negative safe integer"));
66
+ const UnknownFromJsonString = Schema.fromJsonString(Schema.Unknown);
67
+ const NonNegativeSafeInt = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0));
68
+ const DeferredAddress = Schema.Struct({
69
+ flowName: Schema.NonEmptyString,
70
+ executionId: Schema.NonEmptyString,
71
+ deferredName: Schema.NonEmptyString
72
+ });
73
+ const DeferredRow = Schema.Struct({
74
+ ...DeferredAddress.fields,
75
+ exit: Schema.Unknown,
76
+ metadata: Schema.optionalKey(Schema.Unknown),
77
+ completedAtMs: NonNegativeSafeInt
78
+ });
79
+ const ClockAddress = Schema.Struct({
80
+ flowName: Schema.NonEmptyString,
81
+ executionId: Schema.NonEmptyString,
82
+ clockName: Schema.NonEmptyString
83
+ });
84
+ const ClockRow = Schema.Struct({
85
+ ...ClockAddress.fields,
86
+ deferredName: Schema.NonEmptyString,
87
+ dueAtMs: NonNegativeSafeInt,
88
+ completedAtMs: Schema.NullOr(NonNegativeSafeInt)
89
+ });
90
+ const WaitingReason = Schema.NonEmptyString;
91
+ const Waiting = Schema.Struct({
92
+ reason: WaitingReason,
93
+ wakeAt: Schema.optional(NonNegativeSafeInt),
94
+ token: Schema.optional(Schema.NonEmptyString),
95
+ /**
96
+ * What the wait declared about itself: for a `HumanTask` park, the kind of
97
+ * answer it wants, the prompt, and the attempt budget.
98
+ *
99
+ * `reason` and `token` say that a person owes the run an answer and which
100
+ * wait point holds it. Neither says what was asked, and the question lives
101
+ * in an action payload of an execution that has released its owner, so a
102
+ * reader had nothing to render but the wait's own name. This is the question
103
+ * itself, as the JSON TEXT the declaring flow wrote, stored and cleared with
104
+ * the other waiting columns.
105
+ */
106
+ request: Schema.optional(Schema.String)
107
+ });
108
+ const WaitingRow = Schema.Struct({
109
+ runId: Schema.NonEmptyString,
110
+ reason: WaitingReason,
111
+ wakeAt: Schema.NullOr(NonNegativeSafeInt),
112
+ token: Schema.NullOr(Schema.NonEmptyString),
113
+ /** The question {@link Waiting} declared, absent on a park that declared none. */
114
+ request: Schema.optionalKey(Schema.Json)
115
+ });
116
+ const RunParentEdge = Schema.Struct({
117
+ childId: Schema.NonEmptyString,
118
+ parentId: Schema.NonEmptyString,
119
+ seq: NonNegativeSafeInt
120
+ });
121
+ const AttemptSurvivors = Schema.Struct({
122
+ /**
123
+ * The lowest surviving attempt number. Anything above 1 means the prune
124
+ * job removed a leading run of attempts; the engine store applies the
125
+ * pruned-prefix tolerance to it so both survivor paths agree (issue #96).
126
+ */
127
+ earliestAttempt: NonNegativeSafeInt,
128
+ earliestStartedAtMs: NonNegativeSafeInt,
129
+ latest: NonNegativeSafeInt
130
+ });
131
+ class RunParentCycleError extends Schema.TaggedError()(
132
+ "@smthrs/engine-store/RunParentCycleError",
133
+ {
134
+ path: Schema.Array(Schema.String)
135
+ }
136
+ ) {
137
+ }
138
+ class EngineStateFault extends Schema.TaggedError()(
139
+ "@smthrs/engine-store/EngineStateFault",
140
+ {
141
+ reason: Schema.Literals([
142
+ "value_not_serializable",
143
+ "value_not_decodable",
144
+ "deferred_completion_missing",
145
+ "run_parent_edge_missing"
146
+ ]),
147
+ field: Schema.optional(Schema.String),
148
+ cause: Schema.optional(Schema.Defect())
149
+ }
150
+ ) {
151
+ get message() {
152
+ switch (this.reason) {
153
+ case "value_not_serializable":
154
+ return `${this.field} must be JSON-serializable`;
155
+ case "value_not_decodable":
156
+ return `could not decode ${this.field}`;
157
+ case "deferred_completion_missing":
158
+ return "deferred completion disappeared during first-writer transaction";
159
+ case "run_parent_edge_missing":
160
+ return "run parent edge disappeared during first-writer transaction";
161
+ }
162
+ }
163
+ }
164
+ class DurableEngineState extends Context.Service()(
165
+ "@smthrs/engine-store/DurableEngineState"
166
+ ) {
167
+ }
168
+ const deferredKey = (address) => JSON.stringify([address.flowName, address.executionId, address.deferredName]);
169
+ const clockKey = (address) => JSON.stringify([address.flowName, address.executionId, address.clockName]);
170
+ const DeferredDatabaseRow = Schema.Struct({
171
+ ...DeferredAddress.fields,
172
+ exitJson: Schema.String,
173
+ metadataJson: Schema.NullOr(Schema.String),
174
+ completedAtMs: NonNegativeSafeInt
175
+ });
176
+ const ClockDatabaseRow = Schema.Struct({
177
+ ...ClockAddress.fields,
178
+ deferredName: Schema.NonEmptyString,
179
+ dueAtMs: NonNegativeSafeInt,
180
+ completedAtMs: Schema.NullOr(NonNegativeSafeInt)
181
+ });
182
+ const WaitingDatabaseRow = Schema.Struct({
183
+ runId: Schema.NonEmptyString,
184
+ waitingReason: WaitingReason,
185
+ waitingWakeAtMs: Schema.NullOr(NonNegativeSafeInt),
186
+ waitingToken: Schema.NullOr(Schema.NonEmptyString),
187
+ /** Absent rather than null on a database written before `0004_waiting_request`. */
188
+ waitingRequest: Schema.optional(Schema.NullOr(Schema.String))
189
+ });
190
+ const decodeWaitingRequest = (value) => {
191
+ if (value === null || value === void 0) return {};
192
+ try {
193
+ return { request: JSON.parse(value) };
194
+ } catch {
195
+ return {};
196
+ }
197
+ };
198
+ const decodeWaitingRow = (input) => decodeWaitingRowResult(input).pipe(Effect.orDie);
199
+ const decodeWaitingRowResult = (input) => Schema.decodeUnknownEffect(WaitingDatabaseRow)(input).pipe(
200
+ Effect.map((row) => ({
201
+ runId: row.runId,
202
+ reason: row.waitingReason,
203
+ wakeAt: row.waitingWakeAtMs,
204
+ token: row.waitingToken,
205
+ ...decodeWaitingRequest(row.waitingRequest)
206
+ }))
207
+ );
208
+ const RunParentDatabaseRow = Schema.Struct({
209
+ childId: Schema.NonEmptyString,
210
+ parentId: Schema.NonEmptyString,
211
+ seq: NonNegativeSafeInt
212
+ });
213
+ const decodeRunParentEdge = (input) => decodeRunParentEdgeResult(input).pipe(Effect.orDie);
214
+ const decodeRunParentEdgeResult = (input) => Schema.decodeUnknownEffect(RunParentDatabaseRow)(input);
215
+ const findCyclePath = (childId, parentId, parentsOf) => Effect.suspend(() => {
216
+ if (parentId === childId) {
217
+ return Effect.succeed([childId]);
218
+ }
219
+ const seen = /* @__PURE__ */ new Set([parentId]);
220
+ const walk = (current, chain) => Effect.gen(function* () {
221
+ const parents = yield* parentsOf(current);
222
+ for (const parent of parents) {
223
+ if (parent === childId) return [...chain, parent].reverse();
224
+ if (seen.has(parent)) continue;
225
+ seen.add(parent);
226
+ const found = yield* walk(parent, [...chain, parent]);
227
+ if (found !== void 0) return found;
228
+ }
229
+ return void 0;
230
+ });
231
+ return walk(parentId, [parentId]);
232
+ });
233
+ const DeferredAddressDatabaseRow = DeferredAddress;
234
+ const deferredDigest = (row) => ({
235
+ exit: (0, import_JournalEvent.contentDigest)(row.exitJson),
236
+ metadata: row.metadataJson === null ? null : (0, import_JournalEvent.contentDigest)(row.metadataJson)
237
+ });
238
+ const memoryDigest = (row) => Effect.gen(function* () {
239
+ const exitJson = yield* encodeJson(row.exit, "exit");
240
+ const metadataJson = row.metadata === void 0 ? null : yield* encodeJson(row.metadata, "metadata");
241
+ return deferredDigest({ exitJson, metadataJson });
242
+ });
243
+ const encodeJson = (value, field) => Schema.encodeEffect(UnknownFromJsonString)(value).pipe(
244
+ Effect.mapError((cause) => new EngineStateFault({ reason: "value_not_serializable", field, cause })),
245
+ Effect.orDie
246
+ );
247
+ const decodeJson = (value, field) => Schema.decodeUnknownEffect(UnknownFromJsonString)(value).pipe(
248
+ Effect.mapError((cause) => new EngineStateFault({ reason: "value_not_decodable", field, cause })),
249
+ Effect.orDie
250
+ );
251
+ const restoreJsonExit = (value) => {
252
+ if (typeof value !== "object" || value === null) return value;
253
+ const record = value;
254
+ if (record["_id"] !== "Exit") return value;
255
+ if (record["_tag"] === "Success") return Exit.succeed(record["value"]);
256
+ if (record["_tag"] !== "Failure") return value;
257
+ const cause = record["cause"];
258
+ if (typeof cause !== "object" || cause === null) return value;
259
+ const failures = cause["failures"];
260
+ if (!Array.isArray(failures)) return value;
261
+ const reasons = [];
262
+ for (const failure of failures) {
263
+ if (typeof failure !== "object" || failure === null) return value;
264
+ const reason = failure;
265
+ switch (reason["_tag"]) {
266
+ case "Fail":
267
+ reasons.push(Cause.makeFailReason(reason["error"]));
268
+ break;
269
+ case "Die":
270
+ reasons.push(Cause.makeDieReason(reason["defect"]));
271
+ break;
272
+ case "Interrupt":
273
+ reasons.push(Cause.makeInterruptReason(
274
+ typeof reason["fiberId"] === "number" ? reason["fiberId"] : void 0
275
+ ));
276
+ break;
277
+ default:
278
+ return value;
279
+ }
280
+ }
281
+ return Exit.failCause(Cause.fromReasons(reasons));
282
+ };
283
+ const decodeDeferredRow = (input) => Schema.decodeUnknownEffect(DeferredDatabaseRow)(input).pipe(
284
+ Effect.orDie,
285
+ Effect.flatMap(
286
+ (row) => Effect.all({
287
+ exit: decodeJson(row.exitJson, "exit_json").pipe(Effect.map(restoreJsonExit)),
288
+ metadata: row.metadataJson === null ? Effect.succeed(void 0) : decodeJson(row.metadataJson, "metadata_json")
289
+ }).pipe(
290
+ Effect.map(({ exit, metadata }) => ({
291
+ flowName: row.flowName,
292
+ executionId: row.executionId,
293
+ deferredName: row.deferredName,
294
+ exit,
295
+ ...metadata === void 0 ? {} : { metadata },
296
+ completedAtMs: row.completedAtMs
297
+ }))
298
+ )
299
+ )
300
+ );
301
+ const decodeClockRow = (input) => decodeClockRowResult(input).pipe(Effect.orDie);
302
+ const decodeClockRowResult = (input) => Schema.decodeUnknownEffect(ClockDatabaseRow)(input).pipe(
303
+ Effect.map((row) => ({
304
+ flowName: row.flowName,
305
+ executionId: row.executionId,
306
+ clockName: row.clockName,
307
+ deferredName: row.deferredName,
308
+ dueAtMs: row.dueAtMs,
309
+ completedAtMs: row.completedAtMs
310
+ }))
311
+ );
312
+ const clockRowKey = (row) => JSON.stringify([row["flowName"], row["executionId"], row["clockName"]]);
313
+ const deferredAddressRowKey = (row) => JSON.stringify([row["flowName"], row["executionId"], row["deferredName"]]);
314
+ const runParentRowKey = (row) => JSON.stringify([row["childId"], row["parentId"]]);
315
+ const waitingTreeMaxDepth = 64;
316
+ const waitingRowKey = (row) => JSON.stringify([row["runId"]]);
317
+ const decodeSweep = (rows, kind, keyOf, decode) => Effect.gen(function* () {
318
+ const decoded = [];
319
+ for (const row of rows) {
320
+ const result = yield* Effect.result(decode(row));
321
+ if (Result.isSuccess(result)) {
322
+ decoded.push(result.success);
323
+ continue;
324
+ }
325
+ yield* Effect.logWarning(
326
+ `engine-store: skipping a malformed ${kind} row ${keyOf(row)}`,
327
+ result.failure
328
+ );
329
+ }
330
+ return decoded;
331
+ });
332
+ const dieOnDatabaseError = (cause) => Cause.fromReasons(
333
+ cause.reasons.map(
334
+ (reason) => Cause.isFailReason(reason) && reason.error instanceof import_DurableWriter.DatabaseError ? Cause.makeDieReason(reason.error).annotate(Cause.reasonAnnotations(reason)) : reason
335
+ )
336
+ );
337
+ const make = Effect.gen(function* () {
338
+ const sql = yield* Effect.service(SqlClient.SqlClient);
339
+ const writer = yield* import_DurableWriter.DurableWriter;
340
+ yield* EngineStateSchema.apply(sql, writer);
341
+ const selectDeferred = (address) => sql`
342
+ SELECT
343
+ flow_name AS "flowName",
344
+ execution_id AS "executionId",
345
+ deferred_name AS "deferredName",
346
+ exit_json AS "exitJson",
347
+ metadata_json AS "metadataJson",
348
+ completed_at_ms AS "completedAtMs"
349
+ FROM flows_deferred_completions
350
+ WHERE flow_name = ${address.flowName}
351
+ AND execution_id = ${address.executionId}
352
+ AND deferred_name = ${address.deferredName}
353
+ `;
354
+ const selectClock = (address) => sql`
355
+ SELECT
356
+ flow_name AS "flowName",
357
+ execution_id AS "executionId",
358
+ clock_name AS "clockName",
359
+ deferred_name AS "deferredName",
360
+ due_at_ms AS "dueAtMs",
361
+ completed_at_ms AS "completedAtMs"
362
+ FROM flows_clock_deadlines
363
+ WHERE flow_name = ${address.flowName}
364
+ AND execution_id = ${address.executionId}
365
+ AND clock_name = ${address.clockName}
366
+ `;
367
+ const deferred = Effect.fn("DurableEngineState.deferred")(
368
+ (address) => selectDeferred(address).pipe(
369
+ Effect.orDie,
370
+ Effect.flatMap(
371
+ (rows) => rows[0] === void 0 ? Effect.succeedNone : Effect.map(decodeDeferredRow(rows[0]), Option.some)
372
+ )
373
+ )
374
+ );
375
+ const consumeDeferred = Effect.fn("DurableEngineState.consumeDeferred")(
376
+ (address, consumedAtMs) => writer.write(sql`
377
+ UPDATE flows_deferred_completions
378
+ SET consumed_at_ms = ${consumedAtMs}
379
+ WHERE flow_name = ${address.flowName}
380
+ AND execution_id = ${address.executionId}
381
+ AND deferred_name = ${address.deferredName}
382
+ AND consumed_at_ms IS NULL
383
+ RETURNING flow_name AS "flowName"
384
+ `).pipe(Effect.orDie, Effect.map((rows) => rows.length > 0))
385
+ );
386
+ const completeDeferred = Effect.fn(
387
+ "DurableEngineState.completeDeferred"
388
+ )(
389
+ (row) => Effect.gen(function* () {
390
+ const exitJson = yield* encodeJson(row.exit, "exit");
391
+ const metadataJson = row.metadata === void 0 ? null : yield* encodeJson(row.metadata, "metadata");
392
+ return yield* writer.write(
393
+ Effect.gen(function* () {
394
+ const inserted = yield* sql`
395
+ INSERT INTO flows_deferred_completions (
396
+ flow_name,
397
+ execution_id,
398
+ deferred_name,
399
+ exit_json,
400
+ metadata_json,
401
+ completed_at_ms
402
+ ) VALUES (
403
+ ${row.flowName},
404
+ ${row.executionId},
405
+ ${row.deferredName},
406
+ ${exitJson},
407
+ ${metadataJson},
408
+ ${row.completedAtMs}
409
+ )
410
+ ON CONFLICT (flow_name, execution_id, deferred_name) DO NOTHING
411
+ RETURNING
412
+ flow_name AS "flowName",
413
+ execution_id AS "executionId",
414
+ deferred_name AS "deferredName",
415
+ exit_json AS "exitJson",
416
+ metadata_json AS "metadataJson",
417
+ completed_at_ms AS "completedAtMs"
418
+ `;
419
+ if (inserted[0] !== void 0) {
420
+ return {
421
+ _tag: "Completed",
422
+ row: yield* decodeDeferredRow(inserted[0]),
423
+ digest: deferredDigest(inserted[0])
424
+ };
425
+ }
426
+ const existing = yield* selectDeferred(row);
427
+ if (existing[0] === void 0) {
428
+ return yield* Effect.die(new EngineStateFault({ reason: "deferred_completion_missing" }));
429
+ }
430
+ return {
431
+ _tag: "Existing",
432
+ row: yield* decodeDeferredRow(existing[0]),
433
+ digest: deferredDigest(existing[0])
434
+ };
435
+ })
436
+ ).pipe(Effect.orDie);
437
+ })
438
+ );
439
+ const clock = Effect.fn("DurableEngineState.clock")(
440
+ (address) => selectClock(address).pipe(
441
+ Effect.orDie,
442
+ Effect.flatMap(
443
+ (rows) => rows[0] === void 0 ? Effect.succeedNone : Effect.map(decodeClockRow(rows[0]), Option.some)
444
+ )
445
+ )
446
+ );
447
+ const scheduleClock = Effect.fn("DurableEngineState.scheduleClock")(
448
+ (row, owner) => writer.write(
449
+ Effect.gen(function* () {
450
+ const inserted = yield* sql`
451
+ INSERT INTO flows_clock_deadlines (
452
+ flow_name,
453
+ execution_id,
454
+ clock_name,
455
+ deferred_name,
456
+ due_at_ms,
457
+ completed_at_ms
458
+ )
459
+ SELECT
460
+ ${row.flowName},
461
+ ${row.executionId},
462
+ ${row.clockName},
463
+ ${row.deferredName},
464
+ ${row.dueAtMs},
465
+ ${row.completedAtMs}
466
+ WHERE EXISTS (
467
+ SELECT 1
468
+ FROM flows_runs
469
+ WHERE run_id = ${row.executionId}
470
+ AND status = 'running'
471
+ AND owner_host_id = ${owner.hostId}
472
+ AND owner_pid = ${owner.pid}
473
+ AND owner_nonce = ${owner.nonce}
474
+ )
475
+ ON CONFLICT (flow_name, execution_id, clock_name) DO NOTHING
476
+ RETURNING
477
+ flow_name AS "flowName",
478
+ execution_id AS "executionId",
479
+ clock_name AS "clockName",
480
+ deferred_name AS "deferredName",
481
+ due_at_ms AS "dueAtMs",
482
+ completed_at_ms AS "completedAtMs"
483
+ `;
484
+ if (inserted[0] !== void 0) {
485
+ return {
486
+ _tag: "Scheduled",
487
+ row: yield* decodeClockRow(inserted[0])
488
+ };
489
+ }
490
+ const existing = yield* selectClock(row);
491
+ if (existing[0] !== void 0) {
492
+ return {
493
+ _tag: "Existing",
494
+ row: yield* decodeClockRow(existing[0])
495
+ };
496
+ }
497
+ return yield* Effect.interrupt;
498
+ })
499
+ ).pipe(Effect.orDie)
500
+ );
501
+ const completeClock = Effect.fn("DurableEngineState.completeClock")(
502
+ (address, completedAtMs) => writer.write(
503
+ Effect.gen(function* () {
504
+ const updated = yield* sql`
505
+ UPDATE flows_clock_deadlines
506
+ SET completed_at_ms = ${completedAtMs}
507
+ WHERE flow_name = ${address.flowName}
508
+ AND execution_id = ${address.executionId}
509
+ AND clock_name = ${address.clockName}
510
+ AND completed_at_ms IS NULL
511
+ RETURNING
512
+ flow_name AS "flowName",
513
+ execution_id AS "executionId",
514
+ clock_name AS "clockName",
515
+ deferred_name AS "deferredName",
516
+ due_at_ms AS "dueAtMs",
517
+ completed_at_ms AS "completedAtMs"
518
+ `;
519
+ if (updated[0] !== void 0) {
520
+ return {
521
+ _tag: "Completed",
522
+ row: yield* decodeClockRow(updated[0])
523
+ };
524
+ }
525
+ const existing = yield* selectClock(address);
526
+ return existing[0] === void 0 ? { _tag: "NotFound" } : {
527
+ _tag: "AlreadyCompleted",
528
+ row: yield* decodeClockRow(existing[0])
529
+ };
530
+ })
531
+ ).pipe(Effect.orDie)
532
+ );
533
+ const dueClocks = Effect.fn("DurableEngineState.dueClocks")(
534
+ (nowMs) => sql`
535
+ SELECT
536
+ flow_name AS "flowName",
537
+ execution_id AS "executionId",
538
+ clock_name AS "clockName",
539
+ deferred_name AS "deferredName",
540
+ due_at_ms AS "dueAtMs",
541
+ completed_at_ms AS "completedAtMs"
542
+ FROM flows_clock_deadlines
543
+ WHERE completed_at_ms IS NULL
544
+ AND due_at_ms <= ${nowMs}
545
+ ORDER BY due_at_ms, execution_id, clock_name
546
+ `.pipe(
547
+ Effect.orDie,
548
+ // This is the whole store's due-timer sweep: dying on one unreadable
549
+ // deadline stopped every timer in every flow from firing.
550
+ Effect.flatMap((rows) => decodeSweep(rows, "clock deadline", clockRowKey, decodeClockRowResult))
551
+ )
552
+ );
553
+ const pendingClocks = Effect.fn("DurableEngineState.pendingClocks")(
554
+ (scope) => (scope.executionId !== void 0 ? sql`
555
+ SELECT
556
+ flow_name AS "flowName",
557
+ execution_id AS "executionId",
558
+ clock_name AS "clockName",
559
+ deferred_name AS "deferredName",
560
+ due_at_ms AS "dueAtMs",
561
+ completed_at_ms AS "completedAtMs"
562
+ FROM flows_clock_deadlines
563
+ WHERE completed_at_ms IS NULL
564
+ AND execution_id = ${scope.executionId}
565
+ AND ${scope.flowName === void 0 ? sql`1 = 1` : sql`flow_name = ${scope.flowName}`}
566
+ AND EXISTS (
567
+ SELECT 1 FROM flows_runs
568
+ WHERE flows_runs.run_id = flows_clock_deadlines.execution_id
569
+ AND flows_runs.status NOT IN ('completed', 'failed', 'cancelled')
570
+ )
571
+ ORDER BY due_at_ms, execution_id, clock_name
572
+ ` : scope.flowName !== void 0 ? sql`
573
+ SELECT
574
+ flow_name AS "flowName",
575
+ execution_id AS "executionId",
576
+ clock_name AS "clockName",
577
+ deferred_name AS "deferredName",
578
+ due_at_ms AS "dueAtMs",
579
+ completed_at_ms AS "completedAtMs"
580
+ FROM flows_clock_deadlines
581
+ WHERE completed_at_ms IS NULL
582
+ AND flow_name = ${scope.flowName}
583
+ AND EXISTS (
584
+ SELECT 1 FROM flows_runs
585
+ WHERE flows_runs.run_id = flows_clock_deadlines.execution_id
586
+ AND flows_runs.status NOT IN ('completed', 'failed', 'cancelled')
587
+ )
588
+ ORDER BY due_at_ms, execution_id, clock_name
589
+ ` : sql`
590
+ SELECT
591
+ flow_name AS "flowName",
592
+ execution_id AS "executionId",
593
+ clock_name AS "clockName",
594
+ deferred_name AS "deferredName",
595
+ due_at_ms AS "dueAtMs",
596
+ completed_at_ms AS "completedAtMs"
597
+ FROM flows_clock_deadlines
598
+ WHERE completed_at_ms IS NULL
599
+ AND EXISTS (
600
+ SELECT 1 FROM flows_runs
601
+ WHERE flows_runs.run_id = flows_clock_deadlines.execution_id
602
+ AND flows_runs.status NOT IN ('completed', 'failed', 'cancelled')
603
+ )
604
+ ORDER BY due_at_ms, execution_id, clock_name
605
+ `).pipe(
606
+ Effect.orDie,
607
+ // A row that will not decode is a storage-integrity event about that
608
+ // row. Dying here made one of them fatal for the whole sweep, and so
609
+ // for `register` itself (issue B-08).
610
+ Effect.flatMap((rows) => decodeSweep(rows, "clock deadline", clockRowKey, decodeClockRowResult))
611
+ )
612
+ );
613
+ const completedDeferreds = Effect.fn(
614
+ "DurableEngineState.completedDeferreds"
615
+ )(
616
+ (flowName) => sql`
617
+ SELECT
618
+ flow_name AS "flowName",
619
+ execution_id AS "executionId",
620
+ deferred_name AS "deferredName"
621
+ FROM flows_deferred_completions
622
+ WHERE flow_name = ${flowName}
623
+ AND consumed_at_ms IS NULL
624
+ AND EXISTS (
625
+ SELECT 1 FROM flows_runs
626
+ WHERE flows_runs.run_id = flows_deferred_completions.execution_id
627
+ AND flows_runs.status NOT IN ('completed', 'failed', 'cancelled')
628
+ )
629
+ ORDER BY execution_id, deferred_name
630
+ `.pipe(
631
+ Effect.orDie,
632
+ Effect.flatMap(
633
+ (rows) => decodeSweep(
634
+ rows,
635
+ "deferred completion",
636
+ deferredAddressRowKey,
637
+ (row) => Schema.decodeUnknownEffect(DeferredAddressDatabaseRow)(row)
638
+ )
639
+ )
640
+ )
641
+ );
642
+ const completeRunClocks = Effect.fn(
643
+ "DurableEngineState.completeRunClocks"
644
+ )(
645
+ (executionId, completedAtMs) => writer.write(sql`
646
+ UPDATE flows_clock_deadlines
647
+ SET completed_at_ms = ${completedAtMs}
648
+ WHERE execution_id = ${executionId}
649
+ AND completed_at_ms IS NULL
650
+ RETURNING
651
+ flow_name AS "flowName",
652
+ execution_id AS "executionId",
653
+ clock_name AS "clockName",
654
+ deferred_name AS "deferredName",
655
+ due_at_ms AS "dueAtMs",
656
+ completed_at_ms AS "completedAtMs"
657
+ `).pipe(
658
+ Effect.orDie,
659
+ Effect.flatMap((rows) => Effect.forEach(rows, decodeClockRow)),
660
+ Effect.map(
661
+ (rows) => [...rows].sort(
662
+ (left, right) => (0, import_Ordering.compareText)(left.flowName, right.flowName) || (0, import_Ordering.compareText)(left.clockName, right.clockName)
663
+ )
664
+ )
665
+ )
666
+ );
667
+ const selectWaiting = (runId) => sql`
668
+ SELECT
669
+ run_id AS "runId",
670
+ waiting_reason AS "waitingReason",
671
+ waiting_wake_at_ms AS "waitingWakeAtMs",
672
+ waiting_token AS "waitingToken",
673
+ waiting_request AS "waitingRequest"
674
+ FROM flows_runs
675
+ WHERE run_id = ${runId}
676
+ AND waiting_reason IS NOT NULL
677
+ `;
678
+ const park = Effect.fn("DurableEngineState.park")(
679
+ (runId, waiting2, owner) => writer.write(
680
+ Effect.gen(function* () {
681
+ const updated = yield* sql`
682
+ UPDATE flows_runs
683
+ SET
684
+ waiting_reason = ${waiting2.reason},
685
+ waiting_wake_at_ms = ${waiting2.wakeAt ?? null},
686
+ waiting_token = ${waiting2.token ?? null},
687
+ waiting_request = ${waiting2.request ?? null}
688
+ WHERE run_id = ${runId}
689
+ AND owner_host_id = ${owner.hostId}
690
+ AND owner_pid = ${owner.pid}
691
+ AND owner_nonce = ${owner.nonce}
692
+ RETURNING
693
+ run_id AS "runId",
694
+ waiting_reason AS "waitingReason",
695
+ waiting_wake_at_ms AS "waitingWakeAtMs",
696
+ waiting_token AS "waitingToken",
697
+ waiting_request AS "waitingRequest"
698
+ `;
699
+ if (updated[0] === void 0) {
700
+ return { _tag: "NotFound" };
701
+ }
702
+ return { _tag: "Parked", row: yield* decodeWaitingRow(updated[0]) };
703
+ })
704
+ ).pipe(Effect.orDie)
705
+ );
706
+ const wake = Effect.fn("DurableEngineState.wake")(
707
+ (runId) => writer.write(
708
+ Effect.gen(function* () {
709
+ const before = yield* selectWaiting(runId);
710
+ if (before[0] === void 0) {
711
+ const existing = yield* sql`
712
+ SELECT run_id AS "runId" FROM flows_runs WHERE run_id = ${runId}
713
+ `;
714
+ return existing[0] === void 0 ? { _tag: "NotFound" } : { _tag: "NotWaiting" };
715
+ }
716
+ const row = yield* decodeWaitingRow(before[0]);
717
+ yield* sql`
718
+ UPDATE flows_runs
719
+ SET
720
+ waiting_reason = NULL,
721
+ waiting_wake_at_ms = NULL,
722
+ waiting_token = NULL,
723
+ waiting_request = NULL
724
+ WHERE run_id = ${runId}
725
+ AND waiting_reason IS NOT NULL
726
+ `;
727
+ return { _tag: "Woken", row };
728
+ })
729
+ ).pipe(Effect.orDie)
730
+ );
731
+ const waiting = Effect.fn("DurableEngineState.waiting")(
732
+ (runId) => selectWaiting(runId).pipe(
733
+ Effect.orDie,
734
+ Effect.flatMap(
735
+ (rows) => rows[0] === void 0 ? Effect.succeedNone : Effect.map(decodeWaitingRow(rows[0]), Option.some)
736
+ )
737
+ )
738
+ );
739
+ const waitingTree = Effect.fn("DurableEngineState.waitingTree")(
740
+ (runId, options) => sql`
741
+ WITH RECURSIVE tree(run_id, depth) AS (
742
+ SELECT run_id, 0 FROM flows_runs WHERE run_id = ${runId}
743
+ UNION
744
+ SELECT child.run_id, tree.depth + 1
745
+ FROM tree
746
+ JOIN flows_runs child ON child.run_id IN (
747
+ SELECT child_id FROM flows_run_parents WHERE parent_id = tree.run_id
748
+ UNION ALL
749
+ SELECT run_id FROM flows_runs WHERE parent_run_id = tree.run_id
750
+ )
751
+ WHERE tree.depth < ${waitingTreeMaxDepth}
752
+ AND (${options?.detached === "include" ? 1 : 0} = 1
753
+ OR child.parent_run_id = tree.run_id
754
+ OR COALESCE(${Dialect.jsonText(sql, sql`child.state_json`, "$.onParentExit")}, 'cancel') <> 'detach')
755
+ ), reachable(run_id, depth) AS (
756
+ SELECT run_id, MIN(depth) FROM tree GROUP BY run_id
757
+ )
758
+ SELECT
759
+ parked.run_id AS "runId",
760
+ parked.waiting_reason AS "waitingReason",
761
+ parked.waiting_wake_at_ms AS "waitingWakeAtMs",
762
+ parked.waiting_token AS "waitingToken",
763
+ parked.waiting_request AS "waitingRequest"
764
+ FROM reachable
765
+ JOIN flows_runs parked ON parked.run_id = reachable.run_id
766
+ WHERE parked.waiting_reason IS NOT NULL
767
+ AND parked.status NOT IN ('completed', 'failed', 'cancelled')
768
+ ORDER BY reachable.depth, parked.created_at_ms, parked.run_id
769
+ `.pipe(
770
+ Effect.orDie,
771
+ Effect.flatMap((rows) => decodeSweep(rows, "waiting run", waitingRowKey, decodeWaitingRowResult))
772
+ )
773
+ );
774
+ const waitingRuns = Effect.fn("DurableEngineState.waitingRuns")((filter) => {
775
+ const cancelRequestedOnly = filter?.cancelRequested === true ? 1 : 0;
776
+ return (filter?.reason !== void 0 && filter.dueBeforeMs !== void 0 ? sql`
777
+ SELECT
778
+ run_id AS "runId",
779
+ waiting_reason AS "waitingReason",
780
+ waiting_wake_at_ms AS "waitingWakeAtMs",
781
+ waiting_token AS "waitingToken",
782
+ waiting_request AS "waitingRequest"
783
+ FROM flows_runs
784
+ WHERE waiting_reason = ${filter.reason}
785
+ AND waiting_wake_at_ms IS NOT NULL
786
+ AND waiting_wake_at_ms <= ${filter.dueBeforeMs}
787
+ AND (${cancelRequestedOnly} = 0 OR cancel_requested_at_ms IS NOT NULL)
788
+ AND status NOT IN ('completed', 'failed', 'cancelled')
789
+ ORDER BY waiting_wake_at_ms, run_id
790
+ ` : filter?.reason !== void 0 ? sql`
791
+ SELECT
792
+ run_id AS "runId",
793
+ waiting_reason AS "waitingReason",
794
+ waiting_wake_at_ms AS "waitingWakeAtMs",
795
+ waiting_token AS "waitingToken",
796
+ waiting_request AS "waitingRequest"
797
+ FROM flows_runs
798
+ WHERE waiting_reason = ${filter.reason}
799
+ AND (${cancelRequestedOnly} = 0 OR cancel_requested_at_ms IS NOT NULL)
800
+ AND status NOT IN ('completed', 'failed', 'cancelled')
801
+ ORDER BY waiting_wake_at_ms IS NULL, waiting_wake_at_ms, run_id
802
+ ` : filter?.dueBeforeMs !== void 0 ? sql`
803
+ SELECT
804
+ run_id AS "runId",
805
+ waiting_reason AS "waitingReason",
806
+ waiting_wake_at_ms AS "waitingWakeAtMs",
807
+ waiting_token AS "waitingToken",
808
+ waiting_request AS "waitingRequest"
809
+ FROM flows_runs
810
+ WHERE waiting_reason IS NOT NULL
811
+ AND waiting_wake_at_ms IS NOT NULL
812
+ AND waiting_wake_at_ms <= ${filter.dueBeforeMs}
813
+ AND (${cancelRequestedOnly} = 0 OR cancel_requested_at_ms IS NOT NULL)
814
+ AND status NOT IN ('completed', 'failed', 'cancelled')
815
+ ORDER BY waiting_wake_at_ms, run_id
816
+ ` : sql`
817
+ SELECT
818
+ run_id AS "runId",
819
+ waiting_reason AS "waitingReason",
820
+ waiting_wake_at_ms AS "waitingWakeAtMs",
821
+ waiting_token AS "waitingToken",
822
+ waiting_request AS "waitingRequest"
823
+ FROM flows_runs
824
+ WHERE waiting_reason IS NOT NULL
825
+ AND (${cancelRequestedOnly} = 0 OR cancel_requested_at_ms IS NOT NULL)
826
+ AND status NOT IN ('completed', 'failed', 'cancelled')
827
+ ORDER BY waiting_wake_at_ms IS NULL, waiting_wake_at_ms, run_id
828
+ `).pipe(
829
+ Effect.orDie,
830
+ // The parked-run sweeper's only enumeration: one unreadable waiting
831
+ // payload stranded every parked run, including the ones whose
832
+ // cancellation had already been requested.
833
+ Effect.flatMap((rows) => decodeSweep(rows, "waiting run", waitingRowKey, decodeWaitingRowResult))
834
+ );
835
+ });
836
+ const pendingRows = (flowName, limit, after, through, descending = false, eligibleBeforeMs) => sql`
837
+ SELECT run_id AS "runId", created_at_ms AS "createdAtMs" FROM flows_runs
838
+ ${Dialect.isPostgres(sql) ? sql`` : sql`INDEXED BY flows_runs_listing_3`}
839
+ WHERE status = 'pending'
840
+ AND ${eligibleBeforeMs === void 0 ? sql`TRUE` : sql`created_at_ms < ${eligibleBeforeMs}`}
841
+ AND execution_flow = ${flowName}
842
+ AND ${after === void 0 ? sql`TRUE` : sql`(
843
+ created_at_ms > ${after.createdAtMs}
844
+ OR (created_at_ms = ${after.createdAtMs} AND run_id > ${after.runId})
845
+ )`}
846
+ AND ${through === void 0 ? sql`TRUE` : sql`(
847
+ created_at_ms < ${through.createdAtMs}
848
+ OR (created_at_ms = ${through.createdAtMs} AND run_id <= ${through.runId})
849
+ )`}
850
+ ORDER BY ${descending ? sql`created_at_ms DESC, run_id DESC` : sql`created_at_ms, run_id`}
851
+ LIMIT ${limit ?? (Dialect.isPostgres(sql) ? null : -1)}
852
+ `.pipe(
853
+ Effect.orDie,
854
+ Effect.map((rows) => rows.map((row) => ({ runId: row.runId, createdAtMs: Number(row.createdAtMs) })))
855
+ );
856
+ const pendingRuns = Effect.fn("DurableEngineState.pendingRuns")((flowName, limit, after, through, eligibleBeforeMs) => pendingRows(flowName, limit, after, through, false, eligibleBeforeMs));
857
+ const pendingRunTail = Effect.fn("DurableEngineState.pendingRunTail")(
858
+ (flowName, eligibleBeforeMs) => pendingRows(flowName, 1, void 0, void 0, true, eligibleBeforeMs).pipe(
859
+ Effect.map((rows) => Option.fromNullishOr(rows[0]))
860
+ )
861
+ );
862
+ const pendingCancellationRows = (limit, after, through, descending = false) => pendingCancellationLimit(limit).pipe(
863
+ Effect.andThen(sql`
864
+ SELECT run_id AS "runId", created_at_ms AS "createdAtMs" FROM flows_runs
865
+ ${Dialect.isPostgres(sql) ? sql`` : sql`INDEXED BY flows_runs_pending_cancel_idx`}
866
+ WHERE status = 'pending' AND cancel_requested_at_ms IS NOT NULL
867
+ AND ${after === void 0 ? sql`TRUE` : sql`(created_at_ms, run_id) > (${after.createdAtMs}, ${after.runId})`}
868
+ AND ${through === void 0 ? sql`TRUE` : sql`(created_at_ms, run_id) <= (${through.createdAtMs}, ${through.runId})`}
869
+ ORDER BY ${descending ? sql`created_at_ms DESC, run_id DESC` : sql`created_at_ms, run_id`}
870
+ LIMIT ${limit}
871
+ `.pipe(
872
+ Effect.orDie,
873
+ Effect.map((rows) => rows.map((row) => ({ runId: row.runId, createdAtMs: Number(row.createdAtMs) })))
874
+ ))
875
+ );
876
+ const pendingCancellationRuns = Effect.fn(
877
+ "DurableEngineState.pendingCancellationRuns"
878
+ )((limit, after, through) => pendingCancellationRows(limit, after, through));
879
+ const pendingCancellationTail = Effect.fn(
880
+ "DurableEngineState.pendingCancellationTail"
881
+ )(
882
+ () => pendingCancellationRows(1, void 0, void 0, true).pipe(
883
+ Effect.map((rows) => Option.fromNullishOr(rows[0]))
884
+ )
885
+ );
886
+ const staleRunningRuns = Effect.fn(
887
+ "DurableEngineState.staleRunningRuns"
888
+ )(
889
+ (staleBeforeMs, limit) => (
890
+ // `LIMIT -1` is SQLite's explicit "no limit"; the partial index created
891
+ // in `make` serves the predicate, so the per-tick sweep is an index
892
+ // range read instead of a full table scan (issue #79).
893
+ sql`
894
+ SELECT run_id AS "runId", heartbeat_at_ms AS "heartbeatAtMs"
895
+ FROM flows_runs
896
+ WHERE status = 'running'
897
+ AND heartbeat_at_ms IS NOT NULL
898
+ AND heartbeat_at_ms < ${staleBeforeMs}
899
+ ORDER BY heartbeat_at_ms, run_id
900
+ LIMIT ${limit ?? (Dialect.isPostgres(sql) ? null : -1)}
901
+ `.pipe(
902
+ Effect.orDie,
903
+ Effect.map((rows) => rows.map((row) => ({ runId: String(row.runId), heartbeatAtMs: Number(row.heartbeatAtMs) })))
904
+ )
905
+ )
906
+ );
907
+ const attemptSurvivors = Effect.fn(
908
+ "DurableEngineState.attemptSurvivors"
909
+ )(
910
+ (runId, stepKeyDigest) => sql`
911
+ SELECT attempt AS "attempt", started_at_ms AS "startedAtMs"
912
+ FROM flows_attempts
913
+ WHERE run_id = ${runId}
914
+ AND step_key_digest = ${stepKeyDigest}
915
+ ORDER BY attempt
916
+ `.pipe(
917
+ Effect.orDie,
918
+ Effect.map((rows) => {
919
+ const first = rows[0];
920
+ if (first === void 0) return Option.none();
921
+ let latest = Number(first.attempt);
922
+ for (let index = 1; index < rows.length; index++) {
923
+ const next = Number(rows[index].attempt);
924
+ if (next !== latest + 1) break;
925
+ latest = next;
926
+ }
927
+ return Option.some({
928
+ earliestAttempt: Number(first.attempt),
929
+ earliestStartedAtMs: Number(first.startedAtMs),
930
+ latest
931
+ });
932
+ })
933
+ )
934
+ );
935
+ const selectRunParent = (childId, parentId) => sql`
936
+ SELECT
937
+ child_id AS "childId",
938
+ parent_id AS "parentId",
939
+ seq AS "seq"
940
+ FROM flows_run_parents
941
+ WHERE child_id = ${childId}
942
+ AND parent_id = ${parentId}
943
+ `;
944
+ const parentIdsOf = (id) => sql`
945
+ SELECT
946
+ child_id AS "childId",
947
+ parent_id AS "parentId",
948
+ seq AS "seq"
949
+ FROM flows_run_parents
950
+ WHERE child_id = ${id}
951
+ ORDER BY seq
952
+ `.pipe(
953
+ Effect.orDie,
954
+ Effect.map((rows) => rows.map((row) => String(row.parentId)))
955
+ );
956
+ const recordRunParent = Effect.fn(
957
+ "DurableEngineState.recordRunParent"
958
+ )(
959
+ (childId, parentId) => writer.write(
960
+ Effect.gen(function* () {
961
+ const inserted = yield* sql`
962
+ INSERT INTO flows_run_parents (child_id, parent_id, seq)
963
+ SELECT ${childId}, ${parentId}, COALESCE(MAX(seq), 0) + 1
964
+ FROM flows_run_parents
965
+ WHERE TRUE
966
+ ON CONFLICT (child_id, parent_id) DO NOTHING
967
+ RETURNING
968
+ child_id AS "childId",
969
+ parent_id AS "parentId",
970
+ seq AS "seq"
971
+ `;
972
+ if (inserted[0] !== void 0) {
973
+ const cycle = yield* findCyclePath(childId, parentId, parentIdsOf);
974
+ if (cycle !== void 0) {
975
+ return yield* Effect.fail(new RunParentCycleError({ path: cycle }));
976
+ }
977
+ return {
978
+ _tag: "Recorded",
979
+ edge: yield* decodeRunParentEdge(inserted[0])
980
+ };
981
+ }
982
+ const existing = yield* selectRunParent(childId, parentId);
983
+ if (existing[0] === void 0) {
984
+ return yield* Effect.die(new EngineStateFault({ reason: "run_parent_edge_missing" }));
985
+ }
986
+ return {
987
+ _tag: "Existing",
988
+ edge: yield* decodeRunParentEdge(existing[0])
989
+ };
990
+ })
991
+ ).pipe(
992
+ Effect.catch((error) => error instanceof RunParentCycleError ? Effect.fail(error) : Effect.die(error))
993
+ )
994
+ );
995
+ const removeRunParentsForRun = Effect.fn(
996
+ "DurableEngineState.removeRunParentsForRun"
997
+ )(
998
+ (runId) => writer.write(sql`
999
+ DELETE FROM flows_run_parents
1000
+ WHERE child_id = ${runId}
1001
+ OR parent_id = ${runId}
1002
+ `).pipe(Effect.orDie, Effect.asVoid)
1003
+ );
1004
+ const transactionGate = Semaphore.makeUnsafe(1);
1005
+ const transaction = (effect) => Effect.flatMap(Effect.serviceOption(sql.transactionService), (enclosing) => {
1006
+ const write = (body) => writer.write(body).pipe(
1007
+ Effect.catchCause((cause) => {
1008
+ if (cause.reasons.length === 1) {
1009
+ const reason = cause.reasons[0];
1010
+ if (Cause.isFailReason(reason) && reason.error instanceof import_DurableWriter.DatabaseError) {
1011
+ return Effect.die(reason.error);
1012
+ }
1013
+ }
1014
+ return Effect.failCause(dieOnDatabaseError(cause));
1015
+ })
1016
+ );
1017
+ if (Option.isSome(enclosing)) return write(effect);
1018
+ return Effect.uninterruptibleMask(
1019
+ (restore) => Effect.gen(function* () {
1020
+ yield* restore(transactionGate.take(1));
1021
+ let released = false;
1022
+ const release = Effect.suspend(() => {
1023
+ if (released) return Effect.void;
1024
+ released = true;
1025
+ return transactionGate.release(1).pipe(Effect.asVoid);
1026
+ });
1027
+ return yield* restore(write(Effect.gen(function* () {
1028
+ yield* (0, import_DurableWriter.afterCommit)(release, sql);
1029
+ return yield* effect;
1030
+ }))).pipe(Effect.ensuring(release));
1031
+ })
1032
+ );
1033
+ });
1034
+ const runParents = Effect.fn("DurableEngineState.runParents")(
1035
+ (childId) => sql`
1036
+ SELECT
1037
+ child_id AS "childId",
1038
+ parent_id AS "parentId",
1039
+ seq AS "seq"
1040
+ FROM flows_run_parents
1041
+ WHERE child_id = ${childId}
1042
+ ORDER BY seq
1043
+ `.pipe(
1044
+ Effect.orDie,
1045
+ // One unreadable edge made a run's whole ancestry unreadable, so no
1046
+ // subflow under it could be linked at all.
1047
+ Effect.flatMap((rows) => decodeSweep(rows, "run parent", runParentRowKey, decodeRunParentEdgeResult))
1048
+ )
1049
+ );
1050
+ const runChildren = Effect.fn("DurableEngineState.runChildren")(
1051
+ (parentId) => sql`
1052
+ SELECT
1053
+ child_id AS "childId",
1054
+ parent_id AS "parentId",
1055
+ seq AS "seq"
1056
+ FROM flows_run_parents
1057
+ WHERE parent_id = ${parentId}
1058
+ ORDER BY seq
1059
+ `.pipe(
1060
+ Effect.orDie,
1061
+ // The cancellation cascade's only cross-process way to find a run's
1062
+ // children: one unreadable sibling edge left every child running after
1063
+ // its parent was cancelled.
1064
+ Effect.flatMap((rows) => decodeSweep(rows, "run parent", runParentRowKey, decodeRunParentEdgeResult))
1065
+ )
1066
+ );
1067
+ return DurableEngineState.of({
1068
+ deferred,
1069
+ consumeDeferred,
1070
+ completeDeferred,
1071
+ clock,
1072
+ scheduleClock,
1073
+ completeClock,
1074
+ completeRunClocks,
1075
+ dueClocks,
1076
+ pendingClocks,
1077
+ completedDeferreds,
1078
+ park,
1079
+ wake,
1080
+ waiting,
1081
+ waitingTree,
1082
+ waitingRuns,
1083
+ pendingRuns,
1084
+ pendingRunTail,
1085
+ pendingCancellationRuns,
1086
+ pendingCancellationTail,
1087
+ staleRunningRuns,
1088
+ attemptSurvivors,
1089
+ recordRunParent,
1090
+ removeRunParentsForRun,
1091
+ runParents,
1092
+ runChildren,
1093
+ transaction
1094
+ });
1095
+ });
1096
+ const layer = Layer.effect(
1097
+ DurableEngineState,
1098
+ make
1099
+ );
1100
+ const makeMemory = (options = {}) => {
1101
+ const deferreds = /* @__PURE__ */ new Map();
1102
+ const consumedDeferreds = /* @__PURE__ */ new Map();
1103
+ const clocks = /* @__PURE__ */ new Map();
1104
+ const waitingRows = /* @__PURE__ */ new Map();
1105
+ const parentEdges = /* @__PURE__ */ new Map();
1106
+ let parentSeq = 0;
1107
+ const snapshotDeferred = (row) => Schema.decodeUnknownEffect(DeferredRow)(row).pipe(
1108
+ Effect.orDie,
1109
+ Effect.flatMap(
1110
+ (decoded) => Effect.all({
1111
+ exitJson: encodeJson(decoded.exit, "exit"),
1112
+ metadataJson: decoded.metadata === void 0 ? Effect.succeed(null) : encodeJson(decoded.metadata, "metadata")
1113
+ }).pipe(
1114
+ Effect.flatMap(
1115
+ ({ exitJson, metadataJson }) => decodeDeferredRow({
1116
+ flowName: decoded.flowName,
1117
+ executionId: decoded.executionId,
1118
+ deferredName: decoded.deferredName,
1119
+ exitJson,
1120
+ metadataJson,
1121
+ completedAtMs: decoded.completedAtMs
1122
+ })
1123
+ )
1124
+ )
1125
+ )
1126
+ );
1127
+ const snapshotClock = (row) => Schema.decodeUnknownEffect(ClockRow)(row).pipe(
1128
+ Effect.orDie,
1129
+ Effect.map((decoded) => ({ ...decoded }))
1130
+ );
1131
+ const snapshotWaiting = (row) => ({ ...row });
1132
+ const findCyclePathSync = (childId, parentId) => {
1133
+ if (parentId === childId) return [childId];
1134
+ const seen = /* @__PURE__ */ new Set([parentId]);
1135
+ const walk = (current, chain) => {
1136
+ for (const parent of parentEdges.get(current)?.keys() ?? []) {
1137
+ if (parent === childId) return [...chain, parent].reverse();
1138
+ if (seen.has(parent)) continue;
1139
+ seen.add(parent);
1140
+ const found = walk(parent, [...chain, parent]);
1141
+ if (found !== void 0) return found;
1142
+ }
1143
+ return void 0;
1144
+ };
1145
+ return walk(parentId, [parentId]);
1146
+ };
1147
+ const sameOwner = (left, right) => left.hostId === right.hostId && left.pid === right.pid && left.nonce === right.nonce;
1148
+ const runView = (runId, presented) => {
1149
+ if (options.runs === void 0) {
1150
+ return { exists: true, running: true, owned: true };
1151
+ }
1152
+ const view = options.runs(runId);
1153
+ if (Option.isNone(view)) {
1154
+ return { exists: false, running: false, owned: false };
1155
+ }
1156
+ const owned = presented !== void 0 && view.value.owner !== null && sameOwner(view.value.owner, presented);
1157
+ return { exists: true, running: view.value.status === "running", owned };
1158
+ };
1159
+ const isLive = (runId) => {
1160
+ if (options.runs === void 0) return true;
1161
+ const view = options.runs(runId);
1162
+ return Option.isSome(view) && (view.value.status === "pending" || view.value.status === "running" || view.value.status === "suspended");
1163
+ };
1164
+ const pendingMemoryRows = (flowName, after, through, eligibleBeforeMs, cancellationOnly = false) => Array.from(options.listRuns?.() ?? []).filter(
1165
+ ([runId, view]) => view.status === "pending" && (flowName === void 0 || view.flowName === flowName) && (!cancellationOnly || view.cancelRequestedAtMs != null) && (eligibleBeforeMs === void 0 || (view.createdAtMs ?? 0) < eligibleBeforeMs) && (after === void 0 || (view.createdAtMs ?? 0) > after.createdAtMs || (view.createdAtMs ?? 0) === after.createdAtMs && (0, import_Ordering.compareText)(runId, after.runId) > 0) && (through === void 0 || (view.createdAtMs ?? 0) < through.createdAtMs || (view.createdAtMs ?? 0) === through.createdAtMs && (0, import_Ordering.compareText)(runId, through.runId) <= 0)
1166
+ ).sort(
1167
+ ([leftId, left], [rightId, right]) => (left.createdAtMs ?? 0) - (right.createdAtMs ?? 0) || (0, import_Ordering.compareText)(leftId, rightId)
1168
+ ).map(([runId, view]) => ({ runId, createdAtMs: view.createdAtMs ?? 0 }));
1169
+ const unguarded = {
1170
+ deferred: Effect.fn("DurableEngineState.deferred")(
1171
+ (address) => Effect.gen(function* () {
1172
+ const row = deferreds.get(deferredKey(address));
1173
+ return row === void 0 ? Option.none() : Option.some(yield* snapshotDeferred(row));
1174
+ })
1175
+ ),
1176
+ consumeDeferred: Effect.fn("DurableEngineState.consumeDeferred")(
1177
+ (address, consumedAtMs) => Effect.sync(() => {
1178
+ const key = deferredKey(address);
1179
+ if (!deferreds.has(key) || consumedDeferreds.has(key)) return false;
1180
+ consumedDeferreds.set(key, consumedAtMs);
1181
+ return true;
1182
+ })
1183
+ ),
1184
+ completeDeferred: Effect.fn("DurableEngineState.completeDeferred")(
1185
+ (row) => Effect.gen(function* () {
1186
+ const stored = yield* snapshotDeferred(row);
1187
+ const key = deferredKey(stored);
1188
+ const existing = deferreds.get(key);
1189
+ if (existing !== void 0) {
1190
+ return {
1191
+ _tag: "Existing",
1192
+ row: yield* snapshotDeferred(existing),
1193
+ digest: yield* memoryDigest(existing)
1194
+ };
1195
+ }
1196
+ deferreds.set(key, stored);
1197
+ return {
1198
+ _tag: "Completed",
1199
+ row: yield* snapshotDeferred(stored),
1200
+ digest: yield* memoryDigest(stored)
1201
+ };
1202
+ })
1203
+ ),
1204
+ clock: Effect.fn("DurableEngineState.clock")(
1205
+ (address) => Effect.gen(function* () {
1206
+ const row = clocks.get(clockKey(address));
1207
+ return row === void 0 ? Option.none() : Option.some(yield* snapshotClock(row));
1208
+ })
1209
+ ),
1210
+ scheduleClock: Effect.fn("DurableEngineState.scheduleClock")(
1211
+ (row, owner) => Effect.gen(function* () {
1212
+ const stored = yield* snapshotClock(row);
1213
+ const key = clockKey(stored);
1214
+ const existing = clocks.get(key);
1215
+ if (existing !== void 0) {
1216
+ return { _tag: "Existing", row: yield* snapshotClock(existing) };
1217
+ }
1218
+ const view = runView(stored.executionId, owner);
1219
+ if (!view.exists || !view.running || !view.owned) {
1220
+ return yield* Effect.interrupt;
1221
+ }
1222
+ clocks.set(key, stored);
1223
+ return { _tag: "Scheduled", row: yield* snapshotClock(stored) };
1224
+ })
1225
+ ),
1226
+ completeClock: Effect.fn("DurableEngineState.completeClock")(
1227
+ (address, completedAtMs) => Effect.sync(() => {
1228
+ const key = clockKey(address);
1229
+ const existing = clocks.get(key);
1230
+ if (existing === void 0) {
1231
+ return { _tag: "NotFound" };
1232
+ }
1233
+ if (existing.completedAtMs !== null) {
1234
+ return { _tag: "AlreadyCompleted", row: { ...existing } };
1235
+ }
1236
+ const row = { ...existing, completedAtMs };
1237
+ clocks.set(key, row);
1238
+ return { _tag: "Completed", row: { ...row } };
1239
+ })
1240
+ ),
1241
+ dueClocks: Effect.fn("DurableEngineState.dueClocks")(
1242
+ (nowMs) => Effect.forEach(
1243
+ Array.from(clocks.values()).filter((row) => row.completedAtMs === null && row.dueAtMs <= nowMs).sort(
1244
+ (left, right) => left.dueAtMs - right.dueAtMs || (0, import_Ordering.compareText)(left.executionId, right.executionId) || (0, import_Ordering.compareText)(left.clockName, right.clockName)
1245
+ ),
1246
+ snapshotClock
1247
+ )
1248
+ ),
1249
+ completeRunClocks: Effect.fn("DurableEngineState.completeRunClocks")(
1250
+ (executionId, completedAtMs) => Effect.sync(() => {
1251
+ const completed = [];
1252
+ for (const [key, row] of clocks) {
1253
+ if (row.executionId !== executionId || row.completedAtMs !== null) continue;
1254
+ const next = { ...row, completedAtMs };
1255
+ clocks.set(key, next);
1256
+ completed.push({ ...next });
1257
+ }
1258
+ return completed.sort(
1259
+ (left, right) => (0, import_Ordering.compareText)(left.flowName, right.flowName) || (0, import_Ordering.compareText)(left.clockName, right.clockName)
1260
+ );
1261
+ })
1262
+ ),
1263
+ pendingClocks: Effect.fn("DurableEngineState.pendingClocks")(
1264
+ (scope) => Effect.flatMap(
1265
+ Effect.sync(
1266
+ () => Array.from(clocks.values()).filter(
1267
+ (row) => row.completedAtMs === null && isLive(row.executionId) && (scope.executionId === void 0 || row.executionId === scope.executionId) && (scope.flowName === void 0 || row.flowName === scope.flowName)
1268
+ ).sort(
1269
+ (left, right) => left.dueAtMs - right.dueAtMs || (0, import_Ordering.compareText)(left.executionId, right.executionId) || (0, import_Ordering.compareText)(left.clockName, right.clockName)
1270
+ )
1271
+ ),
1272
+ (rows) => Effect.forEach(rows, snapshotClock)
1273
+ )
1274
+ ),
1275
+ completedDeferreds: Effect.fn("DurableEngineState.completedDeferreds")(
1276
+ (flowName) => Effect.sync(
1277
+ () => Array.from(deferreds.values()).filter(
1278
+ (row) => row.flowName === flowName && isLive(row.executionId) && !consumedDeferreds.has(deferredKey(row))
1279
+ ).map(({ flowName: flowName2, executionId, deferredName }) => ({
1280
+ flowName: flowName2,
1281
+ executionId,
1282
+ deferredName
1283
+ })).sort(
1284
+ (left, right) => (0, import_Ordering.compareText)(left.executionId, right.executionId) || (0, import_Ordering.compareText)(left.deferredName, right.deferredName)
1285
+ )
1286
+ )
1287
+ ),
1288
+ park: Effect.fn("DurableEngineState.park")(
1289
+ (runId, waitingPayload, owner) => Effect.sync(() => {
1290
+ const view = runView(runId, owner);
1291
+ if (!view.exists || !view.owned) {
1292
+ return { _tag: "NotFound" };
1293
+ }
1294
+ const row = {
1295
+ runId,
1296
+ reason: waitingPayload.reason,
1297
+ wakeAt: waitingPayload.wakeAt ?? null,
1298
+ token: waitingPayload.token ?? null,
1299
+ ...decodeWaitingRequest(waitingPayload.request)
1300
+ };
1301
+ waitingRows.set(runId, row);
1302
+ return { _tag: "Parked", row: snapshotWaiting(row) };
1303
+ })
1304
+ ),
1305
+ wake: Effect.fn("DurableEngineState.wake")(
1306
+ (runId) => Effect.sync(() => {
1307
+ const row = waitingRows.get(runId);
1308
+ if (row === void 0) {
1309
+ return runView(runId, void 0).exists ? { _tag: "NotWaiting" } : { _tag: "NotFound" };
1310
+ }
1311
+ waitingRows.delete(runId);
1312
+ return { _tag: "Woken", row: snapshotWaiting(row) };
1313
+ })
1314
+ ),
1315
+ waiting: Effect.fn("DurableEngineState.waiting")(
1316
+ (runId) => Effect.sync(() => {
1317
+ const row = waitingRows.get(runId);
1318
+ return row === void 0 ? Option.none() : Option.some(snapshotWaiting(row));
1319
+ })
1320
+ ),
1321
+ waitingTree: Effect.fn("DurableEngineState.waitingTree")(
1322
+ (runId, walk) => Effect.sync(() => {
1323
+ const found = [];
1324
+ const seen = /* @__PURE__ */ new Set([runId]);
1325
+ let frontier = [runId];
1326
+ for (let depth = 0; depth <= waitingTreeMaxDepth && frontier.length > 0; depth++) {
1327
+ const next = [];
1328
+ for (const current of frontier) {
1329
+ const row = waitingRows.get(current);
1330
+ if (row !== void 0 && isLive(current)) found.push(snapshotWaiting(row));
1331
+ for (const [childId, parents] of parentEdges) {
1332
+ if (!parents.has(current) || seen.has(childId)) continue;
1333
+ const view = options.runs?.(childId);
1334
+ if (walk?.detached !== "include" && view !== void 0 && Option.isSome(view) && view.value.onParentExit === "detach") continue;
1335
+ seen.add(childId);
1336
+ next.push(childId);
1337
+ }
1338
+ }
1339
+ frontier = next;
1340
+ }
1341
+ return found;
1342
+ })
1343
+ ),
1344
+ waitingRuns: Effect.fn("DurableEngineState.waitingRuns")(
1345
+ (filter) => Effect.sync(
1346
+ () => Array.from(waitingRows.values()).filter((row) => isLive(row.runId)).filter((row) => filter?.reason === void 0 || row.reason === filter.reason).filter(
1347
+ (row) => filter?.dueBeforeMs === void 0 || row.wakeAt !== null && row.wakeAt <= filter.dueBeforeMs
1348
+ ).filter((row) => {
1349
+ if (filter?.cancelRequested !== true) return true;
1350
+ if (options.runs === void 0) return true;
1351
+ const view = options.runs(row.runId);
1352
+ return Option.isSome(view) && view.value.cancelRequestedAtMs != null;
1353
+ }).sort(
1354
+ (left, right) => Number(left.wakeAt === null) - Number(right.wakeAt === null) || (left.wakeAt ?? 0) - (right.wakeAt ?? 0) || (0, import_Ordering.compareText)(left.runId, right.runId)
1355
+ ).map(snapshotWaiting)
1356
+ )
1357
+ ),
1358
+ pendingRuns: Effect.fn("DurableEngineState.pendingRuns")(
1359
+ (flowName, limit, after, through, eligibleBeforeMs) => Effect.sync(() => {
1360
+ const ordered = pendingMemoryRows(flowName, after, through, eligibleBeforeMs);
1361
+ return limit === void 0 ? ordered : ordered.slice(0, limit);
1362
+ })
1363
+ ),
1364
+ pendingRunTail: Effect.fn("DurableEngineState.pendingRunTail")(
1365
+ (flowName, eligibleBeforeMs) => Effect.sync(
1366
+ () => Option.fromNullishOr(pendingMemoryRows(flowName, void 0, void 0, eligibleBeforeMs).at(-1))
1367
+ )
1368
+ ),
1369
+ pendingCancellationRuns: Effect.fn("DurableEngineState.pendingCancellationRuns")(
1370
+ (limit, after, through) => pendingCancellationLimit(limit).pipe(Effect.andThen(
1371
+ Effect.sync(() => pendingMemoryRows(void 0, after, through, void 0, true).slice(0, limit))
1372
+ ))
1373
+ ),
1374
+ pendingCancellationTail: Effect.fn("DurableEngineState.pendingCancellationTail")(
1375
+ () => Effect.sync(
1376
+ () => Option.fromNullishOr(
1377
+ pendingMemoryRows(void 0, void 0, void 0, void 0, true).at(-1)
1378
+ )
1379
+ )
1380
+ ),
1381
+ staleRunningRuns: Effect.fn("DurableEngineState.staleRunningRuns")(
1382
+ (staleBeforeMs, limit) => Effect.sync(() => {
1383
+ if (options.listRuns === void 0) return [];
1384
+ const stale = [];
1385
+ for (const [runId, view] of options.listRuns()) {
1386
+ const heartbeatAtMs = view.heartbeatAtMs;
1387
+ if (view.status === "running" && typeof heartbeatAtMs === "number" && heartbeatAtMs < staleBeforeMs) {
1388
+ stale.push({ runId, heartbeatAtMs });
1389
+ }
1390
+ }
1391
+ const ordered = stale.sort(
1392
+ (left, right) => left.heartbeatAtMs - right.heartbeatAtMs || (0, import_Ordering.compareText)(left.runId, right.runId)
1393
+ );
1394
+ return limit === void 0 ? ordered : ordered.slice(0, limit);
1395
+ })
1396
+ ),
1397
+ recordRunParent: Effect.fn("DurableEngineState.recordRunParent")(
1398
+ (childId, parentId) => (
1399
+ // A single synchronous step mirrors the SQL transaction: the cycle
1400
+ // check and the insert are atomic — no fiber can interleave between
1401
+ // them, and a rejected edge is never observable (issues #54/#55/#56).
1402
+ Effect.suspend(() => {
1403
+ const parents = parentEdges.get(childId) ?? /* @__PURE__ */ new Map();
1404
+ const existing = parents.get(parentId);
1405
+ if (existing !== void 0) {
1406
+ return Effect.succeed({
1407
+ _tag: "Existing",
1408
+ edge: { childId, parentId, seq: existing }
1409
+ });
1410
+ }
1411
+ const cycle = findCyclePathSync(childId, parentId);
1412
+ if (cycle !== void 0) {
1413
+ return Effect.fail(new RunParentCycleError({ path: cycle }));
1414
+ }
1415
+ parentSeq += 1;
1416
+ parents.set(parentId, parentSeq);
1417
+ parentEdges.set(childId, parents);
1418
+ return Effect.succeed({
1419
+ _tag: "Recorded",
1420
+ edge: { childId, parentId, seq: parentSeq }
1421
+ });
1422
+ })
1423
+ )
1424
+ ),
1425
+ removeRunParentsForRun: Effect.fn("DurableEngineState.removeRunParentsForRun")(
1426
+ (runId) => Effect.sync(() => {
1427
+ parentEdges.delete(runId);
1428
+ for (const [childId, parents] of parentEdges) {
1429
+ parents.delete(runId);
1430
+ if (parents.size === 0) parentEdges.delete(childId);
1431
+ }
1432
+ })
1433
+ ),
1434
+ runParents: Effect.fn("DurableEngineState.runParents")(
1435
+ (childId) => Effect.sync(
1436
+ () => Array.from(parentEdges.get(childId) ?? []).map(([parentId, seq]) => ({ childId, parentId, seq })).sort((left, right) => left.seq - right.seq)
1437
+ )
1438
+ ),
1439
+ runChildren: Effect.fn("DurableEngineState.runChildren")(
1440
+ (parentId) => Effect.sync(() => {
1441
+ const edges = [];
1442
+ for (const [childId, parents] of parentEdges) {
1443
+ const seq = parents.get(parentId);
1444
+ if (seq !== void 0) edges.push({ childId, parentId, seq });
1445
+ }
1446
+ return edges.sort((left, right) => left.seq - right.seq);
1447
+ })
1448
+ )
1449
+ };
1450
+ const gate = Semaphore.makeUnsafe(1);
1451
+ const transactionDepth = /* @__PURE__ */ new Map();
1452
+ const guard = (effect) => Effect.flatMap(
1453
+ Effect.fiberId,
1454
+ (fiberId) => (transactionDepth.get(fiberId) ?? 0) > 0 ? effect : gate.withPermit(effect)
1455
+ );
1456
+ const restoreMap = (target, source) => {
1457
+ target.clear();
1458
+ for (const [key, value] of source) target.set(key, value);
1459
+ };
1460
+ const transaction = (effect, options2) => Effect.flatMap(Effect.fiberId, (fiberId) => Effect.uninterruptibleMask(
1461
+ (restore) => Effect.gen(function* () {
1462
+ const nested = (transactionDepth.get(fiberId) ?? 0) > 0;
1463
+ if (!nested) yield* restore(gate.take(1));
1464
+ const before = {
1465
+ deferreds: new Map(deferreds),
1466
+ consumedDeferreds: new Map(consumedDeferreds),
1467
+ clocks: new Map(clocks),
1468
+ waitingRows: new Map(waitingRows),
1469
+ parentEdges: new Map([...parentEdges].map(([child, parents]) => [child, new Map(parents)])),
1470
+ parentSeq
1471
+ };
1472
+ transactionDepth.set(fiberId, (transactionDepth.get(fiberId) ?? 0) + 1);
1473
+ let committed = false;
1474
+ let closed = false;
1475
+ const close = Effect.suspend(() => {
1476
+ if (closed) return Effect.void;
1477
+ closed = true;
1478
+ const depth = transactionDepth.get(fiberId) - 1;
1479
+ if (depth === 0) transactionDepth.delete(fiberId);
1480
+ else transactionDepth.set(fiberId, depth);
1481
+ return nested ? Effect.void : gate.release(1).pipe(Effect.asVoid);
1482
+ });
1483
+ const commit = Effect.sync(() => {
1484
+ committed = true;
1485
+ }).pipe(Effect.andThen(close));
1486
+ return yield* Effect.sync(() => options2?.onCommit(commit)).pipe(
1487
+ Effect.andThen(restore(effect)),
1488
+ Effect.catchCause(
1489
+ (cause) => Effect.sync(() => {
1490
+ if (committed) return;
1491
+ restoreMap(deferreds, before.deferreds);
1492
+ restoreMap(consumedDeferreds, before.consumedDeferreds);
1493
+ restoreMap(clocks, before.clocks);
1494
+ restoreMap(waitingRows, before.waitingRows);
1495
+ restoreMap(parentEdges, before.parentEdges);
1496
+ parentSeq = before.parentSeq;
1497
+ }).pipe(Effect.andThen(Effect.failCause(cause)))
1498
+ ),
1499
+ Effect.ensuring(close)
1500
+ );
1501
+ })
1502
+ ));
1503
+ return DurableEngineState.of({
1504
+ deferred: (address) => guard(unguarded.deferred(address)),
1505
+ consumeDeferred: (address, consumedAtMs) => guard(unguarded.consumeDeferred(address, consumedAtMs)),
1506
+ completeDeferred: (row) => guard(unguarded.completeDeferred(row)),
1507
+ clock: (address) => guard(unguarded.clock(address)),
1508
+ scheduleClock: (row, owner) => guard(unguarded.scheduleClock(row, owner)),
1509
+ completeClock: (address, completedAtMs) => guard(unguarded.completeClock(address, completedAtMs)),
1510
+ dueClocks: (nowMs) => guard(unguarded.dueClocks(nowMs)),
1511
+ completeRunClocks: (executionId, completedAtMs) => guard(unguarded.completeRunClocks(executionId, completedAtMs)),
1512
+ pendingClocks: (scope) => guard(unguarded.pendingClocks(scope)),
1513
+ completedDeferreds: (flowName) => guard(unguarded.completedDeferreds(flowName)),
1514
+ park: (runId, waiting, owner) => guard(unguarded.park(runId, waiting, owner)),
1515
+ wake: (runId) => guard(unguarded.wake(runId)),
1516
+ waiting: (runId) => guard(unguarded.waiting(runId)),
1517
+ waitingTree: (runId, options2) => guard(unguarded.waitingTree(runId, options2)),
1518
+ waitingRuns: (filter) => guard(unguarded.waitingRuns(filter)),
1519
+ pendingRuns: (flowName, limit, after, through, eligibleBeforeMs) => guard(unguarded.pendingRuns(flowName, limit, after, through, eligibleBeforeMs)),
1520
+ pendingRunTail: (flowName, eligibleBeforeMs) => guard(unguarded.pendingRunTail(flowName, eligibleBeforeMs)),
1521
+ pendingCancellationRuns: (limit, after, through) => guard(unguarded.pendingCancellationRuns(limit, after, through)),
1522
+ pendingCancellationTail: () => guard(unguarded.pendingCancellationTail()),
1523
+ staleRunningRuns: (staleBeforeMs, limit) => guard(unguarded.staleRunningRuns(staleBeforeMs, limit)),
1524
+ attemptSurvivors: void 0,
1525
+ recordRunParent: (childId, parentId) => guard(unguarded.recordRunParent(childId, parentId)),
1526
+ removeRunParentsForRun: (runId) => guard(unguarded.removeRunParentsForRun(runId)),
1527
+ runParents: (childId) => guard(unguarded.runParents(childId)),
1528
+ runChildren: (parentId) => guard(unguarded.runChildren(parentId)),
1529
+ transaction
1530
+ });
1531
+ };
1532
+ const layerMemory = Layer.sync(
1533
+ DurableEngineState,
1534
+ makeMemory
1535
+ );
1536
+ //# sourceMappingURL=DurableEngineState.js.map