@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,207 @@
1
+ /**
2
+ * Authoritative source observations for one durable plan execution. These are
3
+ * replay state, not approval data, journal projections, or evictable cache rows.
4
+ * @since 1.0.0
5
+ */
6
+ import { Sha256 } from "@smthrs/crypto";
7
+ import { DurableWriter } from "@smthrs/database/DurableWriter";
8
+ import { FileSet, Plan } from "@smthrs/plan";
9
+ import { OwnerId } from "@smthrs/run-store/Ownership";
10
+ import { Context, Effect, Layer, Option, Schema } from "effect";
11
+ import * as SqlClient from "effect/unstable/sql/SqlClient";
12
+ const Natural = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0));
13
+ /**
14
+ * Address of an append-only observation generation. `environmentDigest` comes
15
+ * from `StepKey.environmentIdentity` and binds every generation of the run.
16
+ * @since 1.0.0
17
+ * @category schemas
18
+ */
19
+ export const Address = Schema.Struct({
20
+ runId: Schema.NonEmptyString,
21
+ planId: Schema.NonEmptyString,
22
+ baseDigest: Schema.NonEmptyString,
23
+ environmentDigest: Schema.NonEmptyString,
24
+ generation: Natural
25
+ });
26
+ /**
27
+ * Maximum encoded snapshot size, in JavaScript string code units.
28
+ * @since 1.0.0
29
+ * @category constants
30
+ */
31
+ export const maximumSnapshotCharacters = 16 * 1024 * 1024;
32
+ /**
33
+ * Frozen membership and newly pinned source digests for one generation.
34
+ * @since 1.0.0
35
+ * @category schemas
36
+ */
37
+ export const Snapshot = Schema.Struct({
38
+ version: Schema.Literal(1),
39
+ generation: Natural,
40
+ nodes: Schema.Array(Schema.Struct({
41
+ id: Schema.NonEmptyString,
42
+ key: Schema.NonEmptyString,
43
+ reads: Schema.Array(Schema.Struct({
44
+ entry: FileSet.ReadEntry,
45
+ sourcePaths: Schema.Array(FileSet.Pattern)
46
+ }))
47
+ })).check(Schema.isMaxLength(Plan.maximumPlanNodes)),
48
+ pins: Schema.Array(Schema.Struct({ path: FileSet.Pattern, digest: Schema.NonEmptyString }))
49
+ });
50
+ /**
51
+ * A durable observation cannot be read or safely admitted.
52
+ * @since 1.0.0
53
+ * @category errors
54
+ */
55
+ export class PlanInputError extends Schema.TaggedError()("@smthrs/engine-store/PlanInputError", {
56
+ code: Schema.Literals([
57
+ "invalid_input",
58
+ "corrupt_state",
59
+ "incompatible_state",
60
+ "fence_lost",
61
+ "transaction_open",
62
+ "persistence_failed"
63
+ ]),
64
+ message: Schema.String,
65
+ cause: Schema.optional(Schema.Unknown)
66
+ }) {
67
+ }
68
+ /**
69
+ * Durable plan-input service.
70
+ * @since 1.0.0
71
+ * @category services
72
+ */
73
+ export class PlanInputStore extends Context.Service()("@smthrs/engine-store/PlanInputStore") {
74
+ }
75
+ const failure = (code, message, cause) => new PlanInputError({ code, message, ...(cause === undefined ? {} : { cause }) });
76
+ const persistError = (cause) => cause instanceof PlanInputError ?
77
+ cause :
78
+ failure("persistence_failed", "could not access durable plan inputs", cause);
79
+ const decode = (schema, value, code) => Effect.try({
80
+ try: () => Schema.decodeUnknownSync(schema)(value, { onExcessProperty: "error" }),
81
+ catch: (cause) => failure(code, "invalid plan input observation", cause)
82
+ });
83
+ const validateSnapshot = (snapshot, generation, code) => {
84
+ if (snapshot.generation !== generation ||
85
+ new Set(snapshot.nodes.map((node) => node.id)).size !== snapshot.nodes.length ||
86
+ new Set(snapshot.pins.map((pin) => pin.path)).size !== snapshot.pins.length ||
87
+ snapshot.nodes.some((node) => node.reads.some((read) => new Set(read.sourcePaths).size !== read.sourcePaths.length ||
88
+ read.sourcePaths.some((path) => typeof read.entry === "string" ? path !== read.entry : !FileSet.matchesGlob(read.entry, path))))) {
89
+ return Effect.fail(failure(code, "plan input observation has inconsistent membership or generation"));
90
+ }
91
+ return Effect.void;
92
+ };
93
+ /**
94
+ * Builds the SQL-backed, owner-fenced store.
95
+ * @since 1.0.0
96
+ * @category constructors
97
+ */
98
+ export const make = Effect.gen(function* () {
99
+ const sql = yield* SqlClient.SqlClient;
100
+ const writer = yield* DurableWriter;
101
+ const crypto = yield* Effect.context();
102
+ const checksum = (value) => Schema.decodeUnknownEffect(Sha256)(value).pipe(Effect.provide(crypto));
103
+ const fence = (address, owner) => Effect.gen(function* () {
104
+ const owned = yield* sql `SELECT run_id FROM flows_runs WHERE run_id = ${address.runId}
105
+ AND status = 'running' AND cancel_requested_at_ms IS NULL
106
+ AND owner_host_id = ${owner.hostId} AND owner_pid = ${owner.pid} AND owner_nonce = ${owner.nonce}`;
107
+ if (owned.length !== 1) {
108
+ return yield* Effect.fail(failure("fence_lost", "plan input owner no longer owns the run"));
109
+ }
110
+ const legacy = yield* sql `SELECT run_id FROM flows_plan_input_legacy_runs WHERE run_id = ${address.runId}`;
111
+ if (legacy.length > 0) {
112
+ return yield* Effect.fail(failure("incompatible_state", "this run executed before durable plan inputs were recorded; its original sources cannot be reconstructed"));
113
+ }
114
+ });
115
+ const load = (address) => Effect.gen(function* () {
116
+ const heads = yield* sql `SELECT plan_id AS "planId", base_digest AS "baseDigest", environment_digest AS "environmentDigest", generation
117
+ FROM flows_plan_input_heads WHERE run_id = ${address.runId}`;
118
+ const head = heads[0];
119
+ if (head === undefined) {
120
+ const orphan = yield* sql `SELECT 1 FROM flows_plan_input_generations
121
+ WHERE run_id = ${address.runId} AND plan_id = ${address.planId} LIMIT 1`;
122
+ if (address.generation !== 0 || orphan.length > 0) {
123
+ return yield* Effect.fail(failure("corrupt_state", "plan input history has no initial generation"));
124
+ }
125
+ return Option.none();
126
+ }
127
+ yield* decode(Schema.Struct({
128
+ planId: Schema.NonEmptyString,
129
+ baseDigest: Schema.NonEmptyString,
130
+ environmentDigest: Schema.NullOr(Schema.NonEmptyString),
131
+ generation: Natural
132
+ }), head, "corrupt_state");
133
+ if (head.planId !== address.planId || head.baseDigest !== address.baseDigest) {
134
+ return yield* Effect.fail(failure("incompatible_state", "this run already observed a different approved plan"));
135
+ }
136
+ if (head.environmentDigest === null || head.environmentDigest !== address.environmentDigest) {
137
+ return yield* Effect.fail(failure("incompatible_state", "this run has a different or unrecorded execution environment; recover with its original runtime or explicitly reconcile before starting a new run"));
138
+ }
139
+ const counts = yield* sql `SELECT COUNT(*) AS count,
140
+ MIN(generation) AS first, MAX(generation) AS last FROM flows_plan_input_generations
141
+ WHERE run_id = ${address.runId} AND plan_id = ${address.planId}`;
142
+ if (counts[0].count !== head.generation + 1 || counts[0].first !== 0 || counts[0].last !== head.generation ||
143
+ address.generation > head.generation + 1) {
144
+ return yield* Effect.fail(failure("corrupt_state", "plan input history has a missing generation"));
145
+ }
146
+ if (address.generation > head.generation)
147
+ return Option.none();
148
+ const rows = yield* sql `SELECT snapshot_json AS "snapshotJson", checksum
149
+ FROM flows_plan_input_generations WHERE run_id = ${address.runId} AND plan_id = ${address.planId}
150
+ AND generation = ${address.generation}`;
151
+ const row = rows[0];
152
+ if (row.snapshotJson.length > maximumSnapshotCharacters || (yield* checksum(row.snapshotJson)) !== row.checksum) {
153
+ return yield* Effect.fail(failure("corrupt_state", "plan input snapshot failed its size or integrity check"));
154
+ }
155
+ const snapshot = yield* decode(Schema.fromJsonString(Snapshot), row.snapshotJson, "corrupt_state");
156
+ yield* validateSnapshot(snapshot, address.generation, "corrupt_state");
157
+ return Option.some(snapshot);
158
+ });
159
+ const get = Effect.fn("PlanInputStore.get")((input, ownerInput) => Effect.gen(function* () {
160
+ const address = yield* decode(Address, input, "invalid_input");
161
+ const owner = yield* decode(OwnerId, ownerInput, "invalid_input");
162
+ if (Option.isSome(yield* Effect.serviceOption(sql.transactionService))) {
163
+ return yield* Effect.fail(failure("transaction_open", "plan execution requires committed source observations"));
164
+ }
165
+ return yield* writer.write(Effect.gen(function* () {
166
+ yield* fence(address, owner);
167
+ return yield* load(address);
168
+ }));
169
+ }).pipe(Effect.mapError(persistError)));
170
+ const record = Effect.fn("PlanInputStore.record")((input, value, ownerInput) => Effect.gen(function* () {
171
+ const address = yield* decode(Address, input, "invalid_input");
172
+ const owner = yield* decode(OwnerId, ownerInput, "invalid_input");
173
+ const snapshot = yield* decode(Snapshot, value, "invalid_input");
174
+ yield* validateSnapshot(snapshot, address.generation, "invalid_input");
175
+ const encoded = JSON.stringify(snapshot);
176
+ if (encoded.length > maximumSnapshotCharacters) {
177
+ return yield* Effect.fail(failure("invalid_input", "plan input snapshot exceeds the durable size limit"));
178
+ }
179
+ const hash = yield* checksum(encoded);
180
+ return yield* writer.write(Effect.gen(function* () {
181
+ yield* fence(address, owner);
182
+ const existing = yield* load(address);
183
+ if (Option.isSome(existing))
184
+ return existing.value;
185
+ if (address.generation === 0) {
186
+ yield* sql `INSERT INTO flows_plan_input_heads (run_id, plan_id, base_digest, environment_digest, merge_state_version, generation)
187
+ VALUES (${address.runId}, ${address.planId}, ${address.baseDigest}, ${address.environmentDigest}, 1, 0)`;
188
+ }
189
+ else {
190
+ yield* sql `UPDATE flows_plan_input_heads SET generation = ${address.generation}
191
+ WHERE run_id = ${address.runId} AND plan_id = ${address.planId}`;
192
+ }
193
+ yield* sql `INSERT INTO flows_plan_input_generations (run_id, plan_id, generation, snapshot_json, checksum)
194
+ VALUES (${address.runId}, ${address.planId}, ${address.generation}, ${encoded}, ${hash})`;
195
+ return snapshot;
196
+ }));
197
+ }).pipe(Effect.mapError(persistError)));
198
+ return { get, record };
199
+ });
200
+ /**
201
+ * Provides the SQL-backed input store over the same database as the run/attempt stores.
202
+ * @since 1.0.0
203
+ * @category layers
204
+ */
205
+ export const layer = Layer
206
+ .effect(PlanInputStore)(make);
207
+ //# sourceMappingURL=PlanInputStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlanInputStore.js","sourceRoot":"","sources":["../../src/PlanInputStore.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Authoritative source observations for one durable plan execution. These are\n * replay state, not approval data, journal projections, or evictable cache rows.\n * @since 1.0.0\n */\n\nimport { Sha256 } from \"@smthrs/crypto\"\nimport { DurableWriter } from \"@smthrs/database/DurableWriter\"\nimport { FileSet, Plan } from \"@smthrs/plan\"\nimport { OwnerId } from \"@smthrs/run-store/Ownership\"\nimport { Context, Effect, Layer, Option, Schema } from \"effect\"\nimport type * as Crypto from \"effect/Crypto\"\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\"\n\nconst Natural = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0))\n\n/**\n * Address of an append-only observation generation. `environmentDigest` comes\n * from `StepKey.environmentIdentity` and binds every generation of the run.\n * @since 1.0.0\n * @category schemas\n */\nexport const Address = Schema.Struct({\n runId: Schema.NonEmptyString,\n planId: Schema.NonEmptyString,\n baseDigest: Schema.NonEmptyString,\n environmentDigest: Schema.NonEmptyString,\n generation: Natural\n})\n/**\n * Address of an append-only observation generation.\n * @since 1.0.0\n * @category models\n */\nexport type Address = typeof Address.Type\n\n/**\n * Maximum encoded snapshot size, in JavaScript string code units.\n * @since 1.0.0\n * @category constants\n */\nexport const maximumSnapshotCharacters = 16 * 1024 * 1024\n\n/**\n * Frozen membership and newly pinned source digests for one generation.\n * @since 1.0.0\n * @category schemas\n */\nexport const Snapshot = Schema.Struct({\n version: Schema.Literal(1),\n generation: Natural,\n nodes: Schema.Array(Schema.Struct({\n id: Schema.NonEmptyString,\n key: Schema.NonEmptyString,\n reads: Schema.Array(Schema.Struct({\n entry: FileSet.ReadEntry,\n sourcePaths: Schema.Array(FileSet.Pattern)\n }))\n })).check(Schema.isMaxLength(Plan.maximumPlanNodes)),\n pins: Schema.Array(Schema.Struct({ path: FileSet.Pattern, digest: Schema.NonEmptyString }))\n})\n/**\n * Frozen membership and newly pinned source digests for one generation.\n * @since 1.0.0\n * @category models\n */\nexport type Snapshot = typeof Snapshot.Type\n\n/**\n * A durable observation cannot be read or safely admitted.\n * @since 1.0.0\n * @category errors\n */\nexport class PlanInputError extends Schema.TaggedError<PlanInputError>()(\"@smthrs/engine-store/PlanInputError\", {\n code: Schema.Literals([\n \"invalid_input\",\n \"corrupt_state\",\n \"incompatible_state\",\n \"fence_lost\",\n \"transaction_open\",\n \"persistence_failed\"\n ]),\n message: Schema.String,\n cause: Schema.optional(Schema.Unknown)\n}) {}\n\n/**\n * `get` is a committed-state admission gate and refuses an enclosing SQL\n * transaction. `record` is first-writer-wins and may join a write transaction;\n * callers must wait for its outer commit before executing affected actions.\n * @since 1.0.0\n * @category models\n */\nexport interface Service {\n readonly get: (address: Address, owner: OwnerId) => Effect.Effect<Option.Option<Snapshot>, PlanInputError>\n readonly record: (address: Address, snapshot: Snapshot, owner: OwnerId) => Effect.Effect<Snapshot, PlanInputError>\n}\n\n/**\n * Durable plan-input service.\n * @since 1.0.0\n * @category services\n */\nexport class PlanInputStore extends Context.Service<PlanInputStore, Service>()(\"@smthrs/engine-store/PlanInputStore\") {}\n\nconst failure = (code: PlanInputError[\"code\"], message: string, cause?: unknown) =>\n new PlanInputError({ code, message, ...(cause === undefined ? {} : { cause }) })\nconst persistError = (cause: unknown) =>\n cause instanceof PlanInputError ?\n cause :\n failure(\"persistence_failed\", \"could not access durable plan inputs\", cause)\n\nconst decode = <S extends Schema.Top & { readonly DecodingServices: never }>(\n schema: S,\n value: unknown,\n code: \"invalid_input\" | \"corrupt_state\"\n) =>\n Effect.try({\n try: () => Schema.decodeUnknownSync(schema)(value, { onExcessProperty: \"error\" }),\n catch: (cause) => failure(code, \"invalid plan input observation\", cause)\n })\n\nconst validateSnapshot = (snapshot: Snapshot, generation: number, code: \"invalid_input\" | \"corrupt_state\") => {\n if (\n snapshot.generation !== generation ||\n new Set(snapshot.nodes.map((node) => node.id)).size !== snapshot.nodes.length ||\n new Set(snapshot.pins.map((pin) => pin.path)).size !== snapshot.pins.length ||\n snapshot.nodes.some((node) =>\n node.reads.some((read) =>\n new Set(read.sourcePaths).size !== read.sourcePaths.length ||\n read.sourcePaths.some((path) =>\n typeof read.entry === \"string\" ? path !== read.entry : !FileSet.matchesGlob(read.entry, path)\n )\n )\n )\n ) {\n return Effect.fail(failure(code, \"plan input observation has inconsistent membership or generation\"))\n }\n return Effect.void\n}\n\n/**\n * Builds the SQL-backed, owner-fenced store.\n * @since 1.0.0\n * @category constructors\n */\nexport const make: Effect.Effect<Service, never, SqlClient.SqlClient | DurableWriter | Crypto.Crypto> = Effect.gen(\n function*() {\n const sql = yield* SqlClient.SqlClient\n const writer = yield* DurableWriter\n const crypto = yield* Effect.context<Crypto.Crypto>()\n const checksum = (value: string) => Schema.decodeUnknownEffect(Sha256)(value).pipe(Effect.provide(crypto))\n\n const fence = (address: Address, owner: OwnerId) =>\n Effect.gen(function*() {\n const owned = yield* sql`SELECT run_id FROM flows_runs WHERE run_id = ${address.runId}\n AND status = 'running' AND cancel_requested_at_ms IS NULL\n AND owner_host_id = ${owner.hostId} AND owner_pid = ${owner.pid} AND owner_nonce = ${owner.nonce}`\n if (owned.length !== 1) {\n return yield* Effect.fail(failure(\"fence_lost\", \"plan input owner no longer owns the run\"))\n }\n const legacy = yield* sql`SELECT run_id FROM flows_plan_input_legacy_runs WHERE run_id = ${address.runId}`\n if (legacy.length > 0) {\n return yield* Effect.fail(\n failure(\n \"incompatible_state\",\n \"this run executed before durable plan inputs were recorded; its original sources cannot be reconstructed\"\n )\n )\n }\n })\n\n const load = (address: Address) =>\n Effect.gen(function*() {\n const heads = yield* sql<\n { planId: string; baseDigest: string; environmentDigest: string | null; generation: number }\n >`SELECT plan_id AS \"planId\", base_digest AS \"baseDigest\", environment_digest AS \"environmentDigest\", generation\n FROM flows_plan_input_heads WHERE run_id = ${address.runId}`\n const head = heads[0]\n if (head === undefined) {\n const orphan = yield* sql`SELECT 1 FROM flows_plan_input_generations\n WHERE run_id = ${address.runId} AND plan_id = ${address.planId} LIMIT 1`\n if (address.generation !== 0 || orphan.length > 0) {\n return yield* Effect.fail(failure(\"corrupt_state\", \"plan input history has no initial generation\"))\n }\n return Option.none<Snapshot>()\n }\n yield* decode(\n Schema.Struct({\n planId: Schema.NonEmptyString,\n baseDigest: Schema.NonEmptyString,\n environmentDigest: Schema.NullOr(Schema.NonEmptyString),\n generation: Natural\n }),\n head,\n \"corrupt_state\"\n )\n if (head.planId !== address.planId || head.baseDigest !== address.baseDigest) {\n return yield* Effect.fail(\n failure(\"incompatible_state\", \"this run already observed a different approved plan\")\n )\n }\n if (head.environmentDigest === null || head.environmentDigest !== address.environmentDigest) {\n return yield* Effect.fail(failure(\n \"incompatible_state\",\n \"this run has a different or unrecorded execution environment; recover with its original runtime or explicitly reconcile before starting a new run\"\n ))\n }\n const counts = yield* sql<{ count: number; first: number; last: number }>`SELECT COUNT(*) AS count,\n MIN(generation) AS first, MAX(generation) AS last FROM flows_plan_input_generations\n WHERE run_id = ${address.runId} AND plan_id = ${address.planId}`\n if (\n counts[0]!.count !== head.generation + 1 || counts[0]!.first !== 0 || counts[0]!.last !== head.generation ||\n address.generation > head.generation + 1\n ) {\n return yield* Effect.fail(failure(\"corrupt_state\", \"plan input history has a missing generation\"))\n }\n if (address.generation > head.generation) return Option.none<Snapshot>()\n const rows = yield* sql<\n { snapshotJson: string; checksum: string }\n >`SELECT snapshot_json AS \"snapshotJson\", checksum\n FROM flows_plan_input_generations WHERE run_id = ${address.runId} AND plan_id = ${address.planId}\n AND generation = ${address.generation}`\n const row = rows[0]!\n if (\n row.snapshotJson.length > maximumSnapshotCharacters || (yield* checksum(row.snapshotJson)) !== row.checksum\n ) {\n return yield* Effect.fail(failure(\"corrupt_state\", \"plan input snapshot failed its size or integrity check\"))\n }\n const snapshot = yield* decode(Schema.fromJsonString(Snapshot), row.snapshotJson, \"corrupt_state\")\n yield* validateSnapshot(snapshot, address.generation, \"corrupt_state\")\n return Option.some(snapshot)\n })\n\n const get: Service[\"get\"] = Effect.fn(\"PlanInputStore.get\")((input, ownerInput) =>\n Effect.gen(function*() {\n const address = yield* decode(Address, input, \"invalid_input\")\n const owner = yield* decode(OwnerId, ownerInput, \"invalid_input\")\n if (Option.isSome(yield* Effect.serviceOption(sql.transactionService))) {\n return yield* Effect.fail(\n failure(\"transaction_open\", \"plan execution requires committed source observations\")\n )\n }\n return yield* writer.write(Effect.gen(function*() {\n yield* fence(address, owner)\n return yield* load(address)\n }))\n }).pipe(Effect.mapError(persistError))\n )\n\n const record: Service[\"record\"] = Effect.fn(\"PlanInputStore.record\")((input, value, ownerInput) =>\n Effect.gen(function*() {\n const address = yield* decode(Address, input, \"invalid_input\")\n const owner = yield* decode(OwnerId, ownerInput, \"invalid_input\")\n const snapshot = yield* decode(Snapshot, value, \"invalid_input\")\n yield* validateSnapshot(snapshot, address.generation, \"invalid_input\")\n const encoded = JSON.stringify(snapshot)\n if (encoded.length > maximumSnapshotCharacters) {\n return yield* Effect.fail(failure(\"invalid_input\", \"plan input snapshot exceeds the durable size limit\"))\n }\n const hash = yield* checksum(encoded)\n return yield* writer.write(Effect.gen(function*() {\n yield* fence(address, owner)\n const existing = yield* load(address)\n if (Option.isSome(existing)) return existing.value\n if (address.generation === 0) {\n yield* sql`INSERT INTO flows_plan_input_heads (run_id, plan_id, base_digest, environment_digest, merge_state_version, generation)\n VALUES (${address.runId}, ${address.planId}, ${address.baseDigest}, ${address.environmentDigest}, 1, 0)`\n } else {\n yield* sql`UPDATE flows_plan_input_heads SET generation = ${address.generation}\n WHERE run_id = ${address.runId} AND plan_id = ${address.planId}`\n }\n yield* sql`INSERT INTO flows_plan_input_generations (run_id, plan_id, generation, snapshot_json, checksum)\n VALUES (${address.runId}, ${address.planId}, ${address.generation}, ${encoded}, ${hash})`\n return snapshot\n }))\n }).pipe(Effect.mapError(persistError))\n )\n\n return { get, record }\n }\n)\n\n/**\n * Provides the SQL-backed input store over the same database as the run/attempt stores.\n * @since 1.0.0\n * @category layers\n */\nexport const layer: Layer.Layer<PlanInputStore, never, SqlClient.SqlClient | DurableWriter | Crypto.Crypto> = Layer\n .effect(\n PlanInputStore\n )(make)\n"]}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Owner-fenced scheduler decisions, distinct from action failure evidence and
3
+ * redacted journal projections. Intent survives before a merge is appended.
4
+ * @since 1.0.0
5
+ */
6
+ import { DurableWriter } from "@smthrs/database/DurableWriter";
7
+ import { OwnerId } from "@smthrs/run-store/Ownership";
8
+ import { Context, Effect, Layer, Schema } from "effect";
9
+ import type * as Crypto from "effect/Crypto";
10
+ import * as SqlClient from "effect/unstable/sql/SqlClient";
11
+ /** Execution binding shared by every decision of one plan run.
12
+ * @since 1.0.0
13
+ * @category schemas
14
+ */
15
+ export declare const Identity: Schema.Struct<{
16
+ readonly runId: Schema.NonEmptyString;
17
+ readonly planId: Schema.NonEmptyString;
18
+ readonly baseDigest: Schema.NonEmptyString;
19
+ readonly environmentDigest: Schema.NonEmptyString;
20
+ }>;
21
+ /** Execution binding.
22
+ * @since 1.0.0
23
+ * @category models
24
+ */
25
+ export type Identity = typeof Identity.Type;
26
+ /** A stopped attempt and the exact cohort eligible to supply merge winners.
27
+ * @since 1.0.0
28
+ * @category schemas
29
+ */
30
+ export declare const Intent: Schema.Struct<{
31
+ readonly version: Schema.Literal<1>;
32
+ readonly nodeId: Schema.NonEmptyString;
33
+ readonly nodeKey: Schema.NonEmptyString;
34
+ readonly dispatchKey: Schema.NonEmptyString;
35
+ readonly attempts: Schema.Int;
36
+ readonly rebases: Schema.Int;
37
+ readonly peers: Schema.$Array<Schema.NonEmptyString>;
38
+ }>;
39
+ /** Durable stopped-attempt decision.
40
+ * @since 1.0.0
41
+ * @category models
42
+ */
43
+ export type Intent = typeof Intent.Type;
44
+ /** The plan extension committed for an intent.
45
+ * @since 1.0.0
46
+ * @category schemas
47
+ */
48
+ export declare const Completion: Schema.Struct<{
49
+ readonly version: Schema.Literal<1>;
50
+ readonly generation: Schema.Int;
51
+ readonly parentDigest: Schema.NonEmptyString;
52
+ readonly planDigest: Schema.NonEmptyString;
53
+ readonly mergeId: Schema.NonEmptyString;
54
+ readonly mergeKey: Schema.NonEmptyString;
55
+ readonly winners: Schema.$Array<Schema.NonEmptyString>;
56
+ }>;
57
+ /** Committed merge extension.
58
+ * @since 1.0.0
59
+ * @category models
60
+ */
61
+ export type Completion = typeof Completion.Type;
62
+ /** Intent with its optional committed extension.
63
+ * @since 1.0.0
64
+ * @category models
65
+ */
66
+ export interface Decision {
67
+ readonly intent: Intent;
68
+ readonly completion?: Completion;
69
+ }
70
+ declare const PlanMergeError_base: Schema.Class<PlanMergeError, Schema.TaggedStruct<"@smthrs/engine-store/PlanMergeError", {
71
+ readonly code: Schema.Literals<readonly ["invalid_input", "corrupt_state", "incompatible_state", "fence_lost", "transaction_open", "transaction_required", "persistence_failed"]>;
72
+ readonly message: Schema.String;
73
+ readonly cause: Schema.optional<Schema.Unknown>;
74
+ }>, import("effect/Cause").YieldableError>;
75
+ /** Typed admission/storage refusal.
76
+ * @since 1.0.0
77
+ * @category errors
78
+ */
79
+ export declare class PlanMergeError extends PlanMergeError_base {
80
+ }
81
+ /** Store operations; writes may join the owning transaction, reads require committed state.
82
+ * @since 1.0.0
83
+ * @category models
84
+ */
85
+ export interface Service {
86
+ readonly list: (identity: Identity, owner: OwnerId) => Effect.Effect<ReadonlyArray<Decision>, PlanMergeError>;
87
+ readonly intend: (identity: Identity, intent: Intent, owner: OwnerId) => Effect.Effect<Intent, PlanMergeError>;
88
+ readonly complete: (identity: Identity, nodeId: string, completion: Completion, owner: OwnerId) => Effect.Effect<Completion, PlanMergeError>;
89
+ }
90
+ declare const PlanMergeStore_base: Context.ServiceClass<PlanMergeStore, "@smthrs/engine-store/PlanMergeStore", Service>;
91
+ /** Durable merge decision service.
92
+ * @since 1.0.0
93
+ * @category services
94
+ */
95
+ export declare class PlanMergeStore extends PlanMergeStore_base {
96
+ }
97
+ /** Encoded decision limit, in JavaScript code units.
98
+ * @since 1.0.0
99
+ * @category constants
100
+ */
101
+ export declare const maximumDecisionCharacters: number;
102
+ /** SQL constructor; all collaborating stores must use the same database/writer.
103
+ * @since 1.0.0
104
+ * @category constructors
105
+ */
106
+ export declare const make: Effect.Effect<Service, never, SqlClient.SqlClient | DurableWriter | Crypto.Crypto>;
107
+ /** SQL-backed merge decisions; migrations must run first.
108
+ * @since 1.0.0
109
+ * @category layers
110
+ */
111
+ export declare const layer: Layer.Layer<PlanMergeStore, never, SqlClient.SqlClient | DurableWriter | Crypto.Crypto>;
112
+ export {};
113
+ //# sourceMappingURL=PlanMergeStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlanMergeStore.d.ts","sourceRoot":"","sources":["../../src/PlanMergeStore.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAE9D,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/D,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAM1D;;;GAGG;AACH,eAAO,MAAM,QAAQ;;;;;EAKnB,CAAA;AACF;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC,IAAI,CAAA;AAC3C;;;GAGG;AACH,eAAO,MAAM,MAAM;;;;;;;;EAQjB,CAAA;AACF;;;GAGG;AACH,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,IAAI,CAAA;AACvC;;;GAGG;AACH,eAAO,MAAM,UAAU;;;;;;;;EAQrB,CAAA;AACF;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,IAAI,CAAA;AAC/C;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAA;CACjC;;;;;;AACD;;;GAGG;AACH,qBAAa,cAAe,SAAQ,mBAYlC;CAAG;AACL;;;GAGG;AACH,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC,CAAA;IAC7G,QAAQ,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IAC9G,QAAQ,CAAC,QAAQ,EAAE,CACjB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,OAAO,KACX,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,cAAc,CAAC,CAAA;CAC/C;;AACD;;;GAGG;AACH,qBAAa,cAAe,SAAQ,mBAAiF;CAAG;AACxH;;;GAGG;AACH,eAAO,MAAM,yBAAyB,QAAmB,CAAA;AAiBzD;;;GAGG;AACH,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,SAAS,GAAG,aAAa,GAAG,MAAM,CAAC,MAAM,CAyLnG,CAAA;AACD;;;GAGG;AACH,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,EAAE,SAAS,CAAC,SAAS,GAAG,aAAa,GAAG,MAAM,CAAC,MAAM,CAC3E,CAAA"}
@@ -0,0 +1,244 @@
1
+ /**
2
+ * Owner-fenced scheduler decisions, distinct from action failure evidence and
3
+ * redacted journal projections. Intent survives before a merge is appended.
4
+ * @since 1.0.0
5
+ */
6
+ import { Sha256 } from "@smthrs/crypto";
7
+ import { DurableWriter } from "@smthrs/database/DurableWriter";
8
+ import { Plan } from "@smthrs/plan";
9
+ import { OwnerId } from "@smthrs/run-store/Ownership";
10
+ import { Context, Effect, Layer, Option, Schema } from "effect";
11
+ import * as SqlClient from "effect/unstable/sql/SqlClient";
12
+ const Natural = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0));
13
+ const Positive = Schema.Int.check(Schema.isGreaterThan(0));
14
+ const Names = Schema.Array(Schema.NonEmptyString).check(Schema.isMaxLength(Plan.maximumPlanNodes));
15
+ /** Execution binding shared by every decision of one plan run.
16
+ * @since 1.0.0
17
+ * @category schemas
18
+ */
19
+ export const Identity = Schema.Struct({
20
+ runId: Schema.NonEmptyString,
21
+ planId: Schema.NonEmptyString,
22
+ baseDigest: Schema.NonEmptyString,
23
+ environmentDigest: Schema.NonEmptyString
24
+ });
25
+ /** A stopped attempt and the exact cohort eligible to supply merge winners.
26
+ * @since 1.0.0
27
+ * @category schemas
28
+ */
29
+ export const Intent = Schema.Struct({
30
+ version: Schema.Literal(1),
31
+ nodeId: Schema.NonEmptyString,
32
+ nodeKey: Schema.NonEmptyString,
33
+ dispatchKey: Schema.NonEmptyString,
34
+ attempts: Positive,
35
+ rebases: Natural,
36
+ peers: Names
37
+ });
38
+ /** The plan extension committed for an intent.
39
+ * @since 1.0.0
40
+ * @category schemas
41
+ */
42
+ export const Completion = Schema.Struct({
43
+ version: Schema.Literal(1),
44
+ generation: Positive,
45
+ parentDigest: Schema.NonEmptyString,
46
+ planDigest: Schema.NonEmptyString,
47
+ mergeId: Schema.NonEmptyString,
48
+ mergeKey: Schema.NonEmptyString,
49
+ winners: Names
50
+ });
51
+ /** Typed admission/storage refusal.
52
+ * @since 1.0.0
53
+ * @category errors
54
+ */
55
+ export class PlanMergeError extends Schema.TaggedError()("@smthrs/engine-store/PlanMergeError", {
56
+ code: Schema.Literals([
57
+ "invalid_input",
58
+ "corrupt_state",
59
+ "incompatible_state",
60
+ "fence_lost",
61
+ "transaction_open",
62
+ "transaction_required",
63
+ "persistence_failed"
64
+ ]),
65
+ message: Schema.String,
66
+ cause: Schema.optional(Schema.Unknown)
67
+ }) {
68
+ }
69
+ /** Durable merge decision service.
70
+ * @since 1.0.0
71
+ * @category services
72
+ */
73
+ export class PlanMergeStore extends Context.Service()("@smthrs/engine-store/PlanMergeStore") {
74
+ }
75
+ /** Encoded decision limit, in JavaScript code units.
76
+ * @since 1.0.0
77
+ * @category constants
78
+ */
79
+ export const maximumDecisionCharacters = 16 * 1024 * 1024;
80
+ const error = (code, message, cause) => new PlanMergeError({ code, message, ...(cause === undefined ? {} : { cause }) });
81
+ const storageError = (cause) => cause instanceof PlanMergeError ? cause : error("persistence_failed", "could not access plan merge decisions", cause);
82
+ const decode = (schema, value, code) => Effect.try({
83
+ try: () => Schema.decodeUnknownSync(schema)(value, { onExcessProperty: "error" }),
84
+ catch: (cause) => error(code, "invalid plan merge decision", cause)
85
+ });
86
+ const unique = (names, code) => new Set(names).size === names.length ? Effect.void : Effect.fail(error(code, "duplicate merge peer identity"));
87
+ /** SQL constructor; all collaborating stores must use the same database/writer.
88
+ * @since 1.0.0
89
+ * @category constructors
90
+ */
91
+ export const make = Effect.gen(function* () {
92
+ const sql = yield* SqlClient.SqlClient;
93
+ const writer = yield* DurableWriter;
94
+ const crypto = yield* Effect.context();
95
+ const hash = (value) => Schema.decodeUnknownEffect(Sha256)(value).pipe(Effect.provide(crypto));
96
+ const fence = (identity, owner, requireHead) => Effect.gen(function* () {
97
+ const owned = yield* sql `SELECT run_id FROM flows_runs WHERE run_id = ${identity.runId}
98
+ AND status = 'running' AND cancel_requested_at_ms IS NULL
99
+ AND owner_host_id = ${owner.hostId} AND owner_pid = ${owner.pid} AND owner_nonce = ${owner.nonce}`;
100
+ if (owned.length !== 1) {
101
+ return yield* Effect.fail(error("fence_lost", "merge decision owner no longer owns the run"));
102
+ }
103
+ const heads = yield* sql `SELECT
104
+ plan_id AS "planId", base_digest AS "baseDigest", environment_digest AS "environmentDigest", merge_state_version AS version
105
+ FROM flows_plan_input_heads WHERE run_id = ${identity.runId}`;
106
+ const head = heads[0];
107
+ if (head === undefined) {
108
+ const orphan = yield* sql `SELECT 1 FROM flows_plan_merge_intents WHERE run_id = ${identity.runId} LIMIT 1`;
109
+ if (requireHead || orphan.length > 0) {
110
+ return yield* Effect.fail(error("corrupt_state", "merge intent has no admitted input generation"));
111
+ }
112
+ return;
113
+ }
114
+ if (head.version !== 1 || head.planId !== identity.planId || head.baseDigest !== identity.baseDigest ||
115
+ head.environmentDigest !== identity.environmentDigest) {
116
+ return yield* Effect.fail(error("incompatible_state", "this run has different or unrecorded merge execution state; recover with its original runtime or reconcile before starting a new run"));
117
+ }
118
+ });
119
+ const encoded = (value) => Effect.gen(function* () {
120
+ const json = JSON.stringify(value);
121
+ if (json.length > maximumDecisionCharacters) {
122
+ return yield* Effect.fail(error("invalid_input", "merge decision exceeds its durable size limit"));
123
+ }
124
+ return { json, checksum: yield* hash(json) };
125
+ });
126
+ const stored = (schema, row) => Effect.gen(function* () {
127
+ if (row.json.length > maximumDecisionCharacters || (yield* hash(row.json)) !== row.checksum) {
128
+ return yield* Effect.fail(error("corrupt_state", "merge decision failed its size or integrity check"));
129
+ }
130
+ return yield* decode(Schema.fromJsonString(schema), row.json, "corrupt_state");
131
+ });
132
+ const load = (identity, nodeId) => Effect.gen(function* () {
133
+ const rows = yield* sql `SELECT i.stopped_node_id AS "nodeId", i.intent_json AS json, i.checksum,
134
+ c.generation, c.merge_node_id AS "mergeId", c.completion_json AS "completionJson",
135
+ c.checksum AS "completionChecksum"
136
+ FROM flows_plan_merge_intents i LEFT JOIN flows_plan_merge_completions c
137
+ ON c.run_id = i.run_id AND c.stopped_node_id = i.stopped_node_id
138
+ WHERE i.run_id = ${identity.runId} ${nodeId === undefined ? sql `` : sql `AND i.stopped_node_id = ${nodeId}`}
139
+ ORDER BY i.stopped_node_id LIMIT ${Plan.maximumPlanNodes + 1}`;
140
+ if (rows.length > Plan.maximumPlanNodes) {
141
+ return yield* Effect.fail(error("corrupt_state", "too many merge decisions for one plan"));
142
+ }
143
+ return yield* Effect.forEach(rows, (row) => Effect.gen(function* () {
144
+ const intent = yield* stored(Intent, row);
145
+ yield* unique(intent.peers, "corrupt_state");
146
+ if (intent.nodeId !== row.nodeId || intent.peers.includes(intent.nodeId)) {
147
+ return yield* Effect.fail(error("corrupt_state", "merge intent identity is inconsistent"));
148
+ }
149
+ if (row.completionJson === null)
150
+ return { intent };
151
+ const completion = yield* stored(Completion, {
152
+ json: row.completionJson,
153
+ checksum: row.completionChecksum
154
+ });
155
+ yield* unique(completion.winners, "corrupt_state");
156
+ if (completion.generation !== row.generation || completion.mergeId !== row.mergeId ||
157
+ completion.winners.some((id) => !intent.peers.includes(id))) {
158
+ return yield* Effect.fail(error("corrupt_state", "merge completion does not match its intent"));
159
+ }
160
+ return { intent, completion };
161
+ }));
162
+ });
163
+ const list = (input, ownerInput) => Effect.gen(function* () {
164
+ const identity = yield* decode(Identity, input, "invalid_input");
165
+ const owner = yield* decode(OwnerId, ownerInput, "invalid_input");
166
+ if (Option.isSome(yield* Effect.serviceOption(sql.transactionService))) {
167
+ return yield* Effect.fail(error("transaction_open", "merge recovery requires committed decisions"));
168
+ }
169
+ return yield* writer.write(Effect.gen(function* () {
170
+ yield* fence(identity, owner, false);
171
+ return yield* load(identity);
172
+ }));
173
+ }).pipe(Effect.mapError(storageError));
174
+ const intend = (input, value, ownerInput) => Effect.gen(function* () {
175
+ const identity = yield* decode(Identity, input, "invalid_input");
176
+ const owner = yield* decode(OwnerId, ownerInput, "invalid_input");
177
+ const intent = yield* decode(Intent, value, "invalid_input");
178
+ yield* unique(intent.peers, "invalid_input");
179
+ if (intent.peers.includes(intent.nodeId)) {
180
+ return yield* Effect.fail(error("invalid_input", "a merge cannot stop its own peer"));
181
+ }
182
+ const data = yield* encoded(intent);
183
+ return yield* writer.write(Effect.gen(function* () {
184
+ yield* fence(identity, owner, true);
185
+ const [existing] = yield* load(identity, intent.nodeId);
186
+ if (existing !== undefined)
187
+ return existing.intent;
188
+ const [count] = yield* sql `SELECT count(*) AS count
189
+ FROM flows_plan_merge_intents WHERE run_id = ${identity.runId}`;
190
+ if (count.count >= Plan.maximumPlanNodes) {
191
+ return yield* Effect.fail(error("invalid_input", "too many merge intents for one plan"));
192
+ }
193
+ yield* sql `INSERT INTO flows_plan_merge_intents (run_id, stopped_node_id, intent_json, checksum)
194
+ VALUES (${identity.runId}, ${intent.nodeId}, ${data.json}, ${data.checksum})`;
195
+ return intent;
196
+ }));
197
+ }).pipe(Effect.mapError(storageError));
198
+ const complete = (input, nodeIdInput, value, ownerInput) => Effect.gen(function* () {
199
+ if (Option.isNone(yield* Effect.serviceOption(sql.transactionService))) {
200
+ return yield* Effect.fail(error("transaction_required", "merge completion must join the plan/input append transaction"));
201
+ }
202
+ const identity = yield* decode(Identity, input, "invalid_input");
203
+ const owner = yield* decode(OwnerId, ownerInput, "invalid_input");
204
+ const nodeId = yield* decode(Schema.NonEmptyString, nodeIdInput, "invalid_input");
205
+ const completion = yield* decode(Completion, value, "invalid_input");
206
+ yield* unique(completion.winners, "invalid_input");
207
+ const data = yield* encoded(completion);
208
+ return yield* writer.write(Effect.gen(function* () {
209
+ yield* fence(identity, owner, true);
210
+ const [decision] = yield* load(identity, nodeId);
211
+ if (decision === undefined) {
212
+ return yield* Effect.fail(error("corrupt_state", "merge completion has no intent"));
213
+ }
214
+ if (decision.completion !== undefined) {
215
+ if (JSON.stringify(decision.completion) !== JSON.stringify(completion)) {
216
+ return yield* Effect.fail(error("incompatible_state", "a merge intent already committed a different extension"));
217
+ }
218
+ return decision.completion;
219
+ }
220
+ if (completion.winners.some((id) => !decision.intent.peers.includes(id))) {
221
+ return yield* Effect.fail(error("invalid_input", "merge winner was not an admitted peer"));
222
+ }
223
+ const appended = yield* sql `SELECT p.plan_id FROM flows_plans p JOIN flows_plan_input_generations i ON i.plan_id = p.plan_id
224
+ JOIN flows_plan_nodes n ON n.plan_id = p.plan_id AND n.generation = p.generation
225
+ WHERE p.plan_id = ${identity.planId} AND p.digest = ${completion.planDigest} AND p.generation = ${completion.generation}
226
+ AND i.run_id = ${identity.runId} AND i.generation = ${completion.generation}
227
+ AND n.node_id = ${completion.mergeId} AND n.key_digest = ${completion.mergeKey} AND n.kind = 'merge'`;
228
+ if (appended.length !== 1) {
229
+ return yield* Effect.fail(error("corrupt_state", "merge completion requires its plan and input generation in the same transaction"));
230
+ }
231
+ yield* sql `INSERT INTO flows_plan_merge_completions (run_id, stopped_node_id, generation, merge_node_id, completion_json, checksum)
232
+ VALUES (${identity.runId}, ${nodeId}, ${completion.generation}, ${completion.mergeId}, ${data.json}, ${data.checksum})`;
233
+ return completion;
234
+ }));
235
+ }).pipe(Effect.mapError(storageError));
236
+ return { list, intend, complete };
237
+ });
238
+ /** SQL-backed merge decisions; migrations must run first.
239
+ * @since 1.0.0
240
+ * @category layers
241
+ */
242
+ export const layer = Layer
243
+ .effect(PlanMergeStore)(make);
244
+ //# sourceMappingURL=PlanMergeStore.js.map