@smthrs/engine-store 1.0.0-rc.5 → 1.0.0-rc.7

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 (262) hide show
  1. package/README.md +15 -15
  2. package/dist/cjs/ArtifactGc.d.ts +1 -1
  3. package/dist/cjs/ArtifactGc.d.ts.map +1 -1
  4. package/dist/cjs/ArtifactGc.js +1 -1
  5. package/dist/cjs/ArtifactGc.js.map +1 -1
  6. package/dist/cjs/DeferredClockFold.d.ts +4 -4
  7. package/dist/cjs/DeferredClockFold.d.ts.map +1 -1
  8. package/dist/cjs/DeferredClockFold.js +1 -1
  9. package/dist/cjs/DeferredClockFold.js.map +1 -1
  10. package/dist/cjs/DisasterRecovery.d.ts +1 -1
  11. package/dist/cjs/DisasterRecovery.d.ts.map +1 -1
  12. package/dist/cjs/DisasterRecovery.js +1 -1
  13. package/dist/cjs/DisasterRecovery.js.map +1 -1
  14. package/dist/cjs/DurableEngineState.d.ts +1 -1
  15. package/dist/cjs/DurableEngineState.d.ts.map +1 -1
  16. package/dist/cjs/DurableEngineState.js +1 -1
  17. package/dist/cjs/DurableEngineState.js.map +1 -1
  18. package/dist/cjs/ExecutionSnapshot.d.ts +2 -2
  19. package/dist/cjs/ExecutionSnapshot.d.ts.map +1 -1
  20. package/dist/cjs/ExecutionSnapshot.js +1 -1
  21. package/dist/cjs/ExecutionSnapshot.js.map +1 -1
  22. package/dist/cjs/Migrations.d.ts +2 -2
  23. package/dist/cjs/Migrations.d.ts.map +1 -1
  24. package/dist/cjs/OwnerIdentity.js +1 -1
  25. package/dist/cjs/OwnerIdentity.js.map +2 -2
  26. package/dist/cjs/PlanInputStore.d.ts +1 -1
  27. package/dist/cjs/PlanInputStore.d.ts.map +1 -1
  28. package/dist/cjs/PlanInputStore.js +1 -1
  29. package/dist/cjs/PlanInputStore.js.map +1 -1
  30. package/dist/cjs/PlanMergeStore.d.ts +1 -1
  31. package/dist/cjs/PlanMergeStore.d.ts.map +1 -1
  32. package/dist/cjs/PlanMergeStore.js +1 -1
  33. package/dist/cjs/PlanMergeStore.js.map +1 -1
  34. package/dist/cjs/Retention.d.ts +2 -2
  35. package/dist/cjs/Retention.d.ts.map +1 -1
  36. package/dist/cjs/Retention.js +1 -1
  37. package/dist/cjs/Retention.js.map +1 -1
  38. package/dist/cjs/RunChangeFeed.d.ts +1 -1
  39. package/dist/cjs/RunChangeFeed.d.ts.map +1 -1
  40. package/dist/cjs/RunChangeFeed.js +1 -1
  41. package/dist/cjs/RunChangeFeed.js.map +1 -1
  42. package/dist/cjs/SelectionStore.d.ts +1 -1
  43. package/dist/cjs/SelectionStore.d.ts.map +1 -1
  44. package/dist/cjs/SelectionStore.js +1 -1
  45. package/dist/cjs/SelectionStore.js.map +1 -1
  46. package/dist/cjs/StepBoundary.d.ts +8 -6
  47. package/dist/cjs/StepBoundary.d.ts.map +1 -1
  48. package/dist/cjs/StepBoundary.js +13 -10
  49. package/dist/cjs/StepBoundary.js.map +2 -2
  50. package/dist/cjs/StepCacheFold.d.ts +2 -2
  51. package/dist/cjs/StepCacheFold.d.ts.map +1 -1
  52. package/dist/cjs/StepCacheFold.js +1 -1
  53. package/dist/cjs/StepCacheFold.js.map +1 -1
  54. package/dist/cjs/internal/EngineStateSchema.d.ts +1 -1
  55. package/dist/cjs/internal/EngineStateSchema.d.ts.map +1 -1
  56. package/dist/cjs/internal/EngineStateSchema.js.map +1 -1
  57. package/dist/cjs/internal/ExecutionSnapshotRead.d.ts +3 -3
  58. package/dist/cjs/internal/ExecutionSnapshotRead.d.ts.map +1 -1
  59. package/dist/cjs/internal/ExecutionSnapshotRead.js.map +1 -1
  60. package/dist/cjs/internal/ExecutionSnapshotRelations.d.ts +1 -1
  61. package/dist/cjs/internal/ExecutionSnapshotRelations.d.ts.map +1 -1
  62. package/dist/cjs/internal/ExecutionSnapshotRelations.js.map +1 -1
  63. package/dist/cjs/internal/RetentionOps.d.ts +2 -2
  64. package/dist/cjs/internal/RetentionOps.d.ts.map +1 -1
  65. package/dist/cjs/internal/RetentionOps.js +1 -1
  66. package/dist/cjs/internal/RetentionOps.js.map +1 -1
  67. package/dist/cjs/internal/RunCatalogOps.d.ts +1 -1
  68. package/dist/cjs/internal/RunCatalogOps.d.ts.map +1 -1
  69. package/dist/cjs/internal/RunCatalogOps.js +1 -1
  70. package/dist/cjs/internal/RunCatalogOps.js.map +1 -1
  71. package/dist/cjs/internal/RunListing.d.ts +1 -1
  72. package/dist/cjs/internal/RunListing.d.ts.map +1 -1
  73. package/dist/cjs/internal/RunListing.js +1 -1
  74. package/dist/cjs/internal/RunListing.js.map +1 -1
  75. package/dist/cjs/migrations/0001_initial.d.ts +1 -1
  76. package/dist/cjs/migrations/0001_initial.d.ts.map +1 -1
  77. package/dist/cjs/migrations/0001_initial.js +1 -1
  78. package/dist/cjs/migrations/0001_initial.js.map +1 -1
  79. package/dist/cjs/migrations/0002_selection_store.d.ts +1 -1
  80. package/dist/cjs/migrations/0002_selection_store.d.ts.map +1 -1
  81. package/dist/cjs/migrations/0002_selection_store.js +1 -1
  82. package/dist/cjs/migrations/0002_selection_store.js.map +1 -1
  83. package/dist/cjs/migrations/0003_plan_inputs.d.ts +1 -1
  84. package/dist/cjs/migrations/0003_plan_inputs.d.ts.map +1 -1
  85. package/dist/cjs/migrations/0003_plan_inputs.js +1 -1
  86. package/dist/cjs/migrations/0003_plan_inputs.js.map +1 -1
  87. package/dist/cjs/migrations/0004_plan_environment.d.ts +1 -1
  88. package/dist/cjs/migrations/0004_plan_environment.d.ts.map +1 -1
  89. package/dist/cjs/migrations/0004_plan_environment.js +1 -1
  90. package/dist/cjs/migrations/0004_plan_environment.js.map +1 -1
  91. package/dist/cjs/migrations/0005_plan_merges.d.ts +1 -1
  92. package/dist/cjs/migrations/0005_plan_merges.d.ts.map +1 -1
  93. package/dist/cjs/migrations/0005_plan_merges.js +1 -1
  94. package/dist/cjs/migrations/0005_plan_merges.js.map +1 -1
  95. package/dist/cjs/migrations/0006_execution_listing.d.ts +1 -1
  96. package/dist/cjs/migrations/0006_execution_listing.d.ts.map +1 -1
  97. package/dist/cjs/migrations/0006_execution_listing.js +1 -1
  98. package/dist/cjs/migrations/0006_execution_listing.js.map +1 -1
  99. package/dist/cjs/migrations/0007_run_parent_sequence.d.ts +1 -1
  100. package/dist/cjs/migrations/0007_run_parent_sequence.d.ts.map +1 -1
  101. package/dist/cjs/migrations/0007_run_parent_sequence.js +1 -1
  102. package/dist/cjs/migrations/0007_run_parent_sequence.js.map +1 -1
  103. package/dist/cjs/migrations/0008_deferred_consumption.d.ts +1 -1
  104. package/dist/cjs/migrations/0008_deferred_consumption.d.ts.map +1 -1
  105. package/dist/cjs/migrations/0008_deferred_consumption.js +1 -1
  106. package/dist/cjs/migrations/0008_deferred_consumption.js.map +1 -1
  107. package/dist/cjs/migrations/0009_deferred_clock_facts.d.ts +1 -1
  108. package/dist/cjs/migrations/0009_deferred_clock_facts.d.ts.map +1 -1
  109. package/dist/cjs/migrations/0009_deferred_clock_facts.js +1 -1
  110. package/dist/cjs/migrations/0009_deferred_clock_facts.js.map +1 -1
  111. package/dist/cjs/migrations/0010_pending_cancellation.d.ts +1 -1
  112. package/dist/cjs/migrations/0010_pending_cancellation.d.ts.map +1 -1
  113. package/dist/cjs/migrations/0010_pending_cancellation.js +1 -1
  114. package/dist/cjs/migrations/0010_pending_cancellation.js.map +1 -1
  115. package/dist/cjs/test/TestStores.d.ts +4 -4
  116. package/dist/cjs/test/TestStores.d.ts.map +1 -1
  117. package/dist/esm/ArtifactGc.d.ts +1 -1
  118. package/dist/esm/ArtifactGc.d.ts.map +1 -1
  119. package/dist/esm/ArtifactGc.js +1 -1
  120. package/dist/esm/ArtifactGc.js.map +1 -1
  121. package/dist/esm/DeferredClockFold.d.ts +4 -4
  122. package/dist/esm/DeferredClockFold.d.ts.map +1 -1
  123. package/dist/esm/DeferredClockFold.js +1 -1
  124. package/dist/esm/DeferredClockFold.js.map +1 -1
  125. package/dist/esm/DisasterRecovery.d.ts +1 -1
  126. package/dist/esm/DisasterRecovery.d.ts.map +1 -1
  127. package/dist/esm/DisasterRecovery.js +1 -1
  128. package/dist/esm/DisasterRecovery.js.map +1 -1
  129. package/dist/esm/DurableEngineState.d.ts +1 -1
  130. package/dist/esm/DurableEngineState.d.ts.map +1 -1
  131. package/dist/esm/DurableEngineState.js +1 -1
  132. package/dist/esm/DurableEngineState.js.map +1 -1
  133. package/dist/esm/ExecutionSnapshot.d.ts +2 -2
  134. package/dist/esm/ExecutionSnapshot.d.ts.map +1 -1
  135. package/dist/esm/ExecutionSnapshot.js +1 -1
  136. package/dist/esm/ExecutionSnapshot.js.map +1 -1
  137. package/dist/esm/Migrations.d.ts +2 -2
  138. package/dist/esm/Migrations.d.ts.map +1 -1
  139. package/dist/esm/OwnerIdentity.js +1 -1
  140. package/dist/esm/OwnerIdentity.js.map +1 -1
  141. package/dist/esm/PlanInputStore.d.ts +1 -1
  142. package/dist/esm/PlanInputStore.d.ts.map +1 -1
  143. package/dist/esm/PlanInputStore.js +1 -1
  144. package/dist/esm/PlanInputStore.js.map +1 -1
  145. package/dist/esm/PlanMergeStore.d.ts +1 -1
  146. package/dist/esm/PlanMergeStore.d.ts.map +1 -1
  147. package/dist/esm/PlanMergeStore.js +1 -1
  148. package/dist/esm/PlanMergeStore.js.map +1 -1
  149. package/dist/esm/Retention.d.ts +2 -2
  150. package/dist/esm/Retention.d.ts.map +1 -1
  151. package/dist/esm/Retention.js +1 -1
  152. package/dist/esm/Retention.js.map +1 -1
  153. package/dist/esm/RunChangeFeed.d.ts +1 -1
  154. package/dist/esm/RunChangeFeed.d.ts.map +1 -1
  155. package/dist/esm/RunChangeFeed.js +1 -1
  156. package/dist/esm/RunChangeFeed.js.map +1 -1
  157. package/dist/esm/SelectionStore.d.ts +1 -1
  158. package/dist/esm/SelectionStore.d.ts.map +1 -1
  159. package/dist/esm/SelectionStore.js +1 -1
  160. package/dist/esm/SelectionStore.js.map +1 -1
  161. package/dist/esm/StepBoundary.d.ts +8 -6
  162. package/dist/esm/StepBoundary.d.ts.map +1 -1
  163. package/dist/esm/StepBoundary.js +20 -11
  164. package/dist/esm/StepBoundary.js.map +1 -1
  165. package/dist/esm/StepCacheFold.d.ts +2 -2
  166. package/dist/esm/StepCacheFold.d.ts.map +1 -1
  167. package/dist/esm/StepCacheFold.js +1 -1
  168. package/dist/esm/StepCacheFold.js.map +1 -1
  169. package/dist/esm/internal/EngineStateSchema.d.ts +1 -1
  170. package/dist/esm/internal/EngineStateSchema.d.ts.map +1 -1
  171. package/dist/esm/internal/EngineStateSchema.js.map +1 -1
  172. package/dist/esm/internal/ExecutionSnapshotRead.d.ts +3 -3
  173. package/dist/esm/internal/ExecutionSnapshotRead.d.ts.map +1 -1
  174. package/dist/esm/internal/ExecutionSnapshotRead.js.map +1 -1
  175. package/dist/esm/internal/ExecutionSnapshotRelations.d.ts +1 -1
  176. package/dist/esm/internal/ExecutionSnapshotRelations.d.ts.map +1 -1
  177. package/dist/esm/internal/ExecutionSnapshotRelations.js.map +1 -1
  178. package/dist/esm/internal/RetentionOps.d.ts +2 -2
  179. package/dist/esm/internal/RetentionOps.d.ts.map +1 -1
  180. package/dist/esm/internal/RetentionOps.js +1 -1
  181. package/dist/esm/internal/RetentionOps.js.map +1 -1
  182. package/dist/esm/internal/RunCatalogOps.d.ts +1 -1
  183. package/dist/esm/internal/RunCatalogOps.d.ts.map +1 -1
  184. package/dist/esm/internal/RunCatalogOps.js +1 -1
  185. package/dist/esm/internal/RunCatalogOps.js.map +1 -1
  186. package/dist/esm/internal/RunListing.d.ts +1 -1
  187. package/dist/esm/internal/RunListing.d.ts.map +1 -1
  188. package/dist/esm/internal/RunListing.js +1 -1
  189. package/dist/esm/internal/RunListing.js.map +1 -1
  190. package/dist/esm/migrations/0001_initial.d.ts +1 -1
  191. package/dist/esm/migrations/0001_initial.d.ts.map +1 -1
  192. package/dist/esm/migrations/0001_initial.js +1 -1
  193. package/dist/esm/migrations/0001_initial.js.map +1 -1
  194. package/dist/esm/migrations/0002_selection_store.d.ts +1 -1
  195. package/dist/esm/migrations/0002_selection_store.d.ts.map +1 -1
  196. package/dist/esm/migrations/0002_selection_store.js +1 -1
  197. package/dist/esm/migrations/0002_selection_store.js.map +1 -1
  198. package/dist/esm/migrations/0003_plan_inputs.d.ts +1 -1
  199. package/dist/esm/migrations/0003_plan_inputs.d.ts.map +1 -1
  200. package/dist/esm/migrations/0003_plan_inputs.js +1 -1
  201. package/dist/esm/migrations/0003_plan_inputs.js.map +1 -1
  202. package/dist/esm/migrations/0004_plan_environment.d.ts +1 -1
  203. package/dist/esm/migrations/0004_plan_environment.d.ts.map +1 -1
  204. package/dist/esm/migrations/0004_plan_environment.js +1 -1
  205. package/dist/esm/migrations/0004_plan_environment.js.map +1 -1
  206. package/dist/esm/migrations/0005_plan_merges.d.ts +1 -1
  207. package/dist/esm/migrations/0005_plan_merges.d.ts.map +1 -1
  208. package/dist/esm/migrations/0005_plan_merges.js +1 -1
  209. package/dist/esm/migrations/0005_plan_merges.js.map +1 -1
  210. package/dist/esm/migrations/0006_execution_listing.d.ts +1 -1
  211. package/dist/esm/migrations/0006_execution_listing.d.ts.map +1 -1
  212. package/dist/esm/migrations/0006_execution_listing.js +1 -1
  213. package/dist/esm/migrations/0006_execution_listing.js.map +1 -1
  214. package/dist/esm/migrations/0007_run_parent_sequence.d.ts +1 -1
  215. package/dist/esm/migrations/0007_run_parent_sequence.d.ts.map +1 -1
  216. package/dist/esm/migrations/0007_run_parent_sequence.js +1 -1
  217. package/dist/esm/migrations/0007_run_parent_sequence.js.map +1 -1
  218. package/dist/esm/migrations/0008_deferred_consumption.d.ts +1 -1
  219. package/dist/esm/migrations/0008_deferred_consumption.d.ts.map +1 -1
  220. package/dist/esm/migrations/0008_deferred_consumption.js +1 -1
  221. package/dist/esm/migrations/0008_deferred_consumption.js.map +1 -1
  222. package/dist/esm/migrations/0009_deferred_clock_facts.d.ts +1 -1
  223. package/dist/esm/migrations/0009_deferred_clock_facts.d.ts.map +1 -1
  224. package/dist/esm/migrations/0009_deferred_clock_facts.js +1 -1
  225. package/dist/esm/migrations/0009_deferred_clock_facts.js.map +1 -1
  226. package/dist/esm/migrations/0010_pending_cancellation.d.ts +1 -1
  227. package/dist/esm/migrations/0010_pending_cancellation.d.ts.map +1 -1
  228. package/dist/esm/migrations/0010_pending_cancellation.js +1 -1
  229. package/dist/esm/migrations/0010_pending_cancellation.js.map +1 -1
  230. package/dist/esm/test/TestStores.d.ts +4 -4
  231. package/dist/esm/test/TestStores.d.ts.map +1 -1
  232. package/docs/api.md +19 -16
  233. package/package.json +22 -22
  234. package/src/ArtifactGc.ts +1 -1
  235. package/src/DeferredClockFold.ts +1 -1
  236. package/src/DisasterRecovery.ts +1 -1
  237. package/src/DurableEngineState.ts +1 -1
  238. package/src/ExecutionSnapshot.ts +1 -1
  239. package/src/OwnerIdentity.ts +1 -1
  240. package/src/PlanInputStore.ts +1 -1
  241. package/src/PlanMergeStore.ts +1 -1
  242. package/src/Retention.ts +2 -2
  243. package/src/RunChangeFeed.ts +1 -1
  244. package/src/SelectionStore.ts +1 -1
  245. package/src/StepBoundary.ts +32 -17
  246. package/src/StepCacheFold.ts +1 -1
  247. package/src/internal/EngineStateSchema.ts +1 -1
  248. package/src/internal/ExecutionSnapshotRead.ts +1 -1
  249. package/src/internal/ExecutionSnapshotRelations.ts +1 -1
  250. package/src/internal/RetentionOps.ts +2 -2
  251. package/src/internal/RunCatalogOps.ts +1 -1
  252. package/src/internal/RunListing.ts +1 -1
  253. package/src/migrations/0001_initial.ts +1 -1
  254. package/src/migrations/0002_selection_store.ts +1 -1
  255. package/src/migrations/0003_plan_inputs.ts +1 -1
  256. package/src/migrations/0004_plan_environment.ts +1 -1
  257. package/src/migrations/0005_plan_merges.ts +1 -1
  258. package/src/migrations/0006_execution_listing.ts +1 -1
  259. package/src/migrations/0007_run_parent_sequence.ts +1 -1
  260. package/src/migrations/0008_deferred_consumption.ts +1 -1
  261. package/src/migrations/0009_deferred_clock_facts.ts +1 -1
  262. package/src/migrations/0010_pending_cancellation.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"RunListing.js","sourceRoot":"","sources":["../../../src/internal/RunListing.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Bounded, indexed run pages.\n *\n * @since 1.0.0\n */\n\nimport * as Dialect from \"@smthrs/database/Dialect\"\nimport { RunStatus } from \"@smthrs/run-store/RunStore\"\nimport { Cause, Effect, Schema } from \"effect\"\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\"\nimport * as Read from \"./ExecutionSnapshotRead.ts\"\nimport { RunCatalogError } from \"./RunListingError.ts\"\n\n/**\n * Supported equality and inclusive creation-range filters.\n *\n * @category models\n * @since 1.0.0\n */\nexport const Filters = Schema.Struct({\n status: Schema.optionalKey(RunStatus),\n flowName: Schema.optionalKey(Read.Identifier),\n parentRunId: Schema.optionalKey(Schema.NullOr(Read.Identifier)),\n lineageId: Schema.optionalKey(Read.Identifier),\n waitingReason: Schema.optionalKey(Schema.NullOr(Read.Identifier)),\n createdAfterMs: Schema.optionalKey(Read.Natural),\n createdBeforeMs: Schema.optionalKey(Read.Natural)\n})\n/**\n * Supported filters; lineageId also selects its original root.\n *\n * @category models\n * @since 1.0.0\n */\nexport type Filters = typeof Filters.Type\n/**\n * Options for a bounded run page. Numeric offsets are not cursors.\n *\n * @category models\n * @since 1.0.0\n */\nexport interface ListRunsOptions {\n readonly filters?: Filters\n readonly cursor?: string\n readonly limit?: number\n}\n/**\n * One transaction's page and watermark; no total count.\n *\n * @category models\n * @since 1.0.0\n */\nexport interface RunPage extends Read.Position {\n readonly runs: ReadonlyArray<Read.Observed>\n readonly cursor: string | null\n}\n/**\n * Bounded catalog operations.\n *\n * @category models\n * @since 1.0.0\n */\nexport interface Service {\n readonly listRuns: (options?: ListRunsOptions) => Effect.Effect<RunPage, RunCatalogError>\n}\n/**\n * Maximum page size.\n *\n * @category constants\n * @since 1.0.0\n */\nexport const maximumPageSize = 200\nconst Cursor = Schema.fromJsonString(Schema.Struct({\n version: Schema.Literal(1),\n source: Read.Source,\n filters: Schema.String,\n createdAtMs: Read.Natural,\n runId: Read.Identifier\n}))\nconst Options = Schema.Struct({\n filters: Schema.optionalKey(Filters),\n // Four 1,024-unit filter strings can expand sevenfold inside the JSON tuple\n // string, plus a sixfold escaped 1,024-unit run ID and bounded scalar fields.\n // 64 Ki UTF-16 units therefore admits every cursor this port can produce.\n cursor: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(65536))),\n limit: Schema.optionalKey(Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: maximumPageSize })))\n})\n\n/**\n * Builds the bounded read against the engine database.\n *\n * @category constructors\n * @since 1.0.0\n */\nexport const make = () =>\n Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n const listRuns: Service[\"listRuns\"] = (options = {}) =>\n Effect.gen(function*() {\n const admitted = yield* Schema.decodeUnknownEffect(Options)(options, { onExcessProperty: \"error\" }).pipe(\n Effect.mapError((cause) =>\n new RunCatalogError({ code: \"invalid_options\", message: \"invalid run page options\", cause })\n )\n )\n const filters = admitted.filters ?? {}\n const tuple = JSON.stringify([\n filters.status ?? null,\n filters.flowName ?? null,\n filters.parentRunId === undefined ? [] : [filters.parentRunId],\n filters.lineageId ?? null,\n filters.waitingReason === undefined ? [] : [filters.waitingReason],\n filters.createdAfterMs ?? null,\n filters.createdBeforeMs ?? null\n ])\n const cursor = admitted.cursor === undefined ?\n null :\n yield* Schema.decodeUnknownEffect(Cursor)(admitted.cursor).pipe(\n Effect.mapError((cause) =>\n new RunCatalogError({ code: \"invalid_cursor\", message: \"malformed run cursor\", cause })\n )\n )\n if (cursor !== null && cursor.filters !== tuple) {\n return yield* Effect.fail(\n new RunCatalogError({ code: \"invalid_cursor\", message: \"run cursor belongs to another query\" })\n )\n }\n const limit = admitted.limit ?? 100\n return yield* Read.transaction(\n sql,\n Effect.gen(function*() {\n const at = yield* Read.position(sql)\n if (cursor !== null && cursor.source !== at.source) {\n return yield* Effect.fail(\n new RunCatalogError({ code: \"source_changed\", message: \"run cursor belongs to another engine source\" })\n )\n }\n const predicates: Array<string> = []\n const values: Array<string | number | null> = []\n let mask = 0\n const equalities = [\n [\"status\", filters.status],\n [\"execution_flow\", filters.flowName],\n [\"execution_parent_id\", filters.parentRunId],\n [\"execution_lineage\", filters.lineageId],\n [\"waiting_reason\", filters.waitingReason]\n ] as const\n for (const [index, [column, value]] of equalities.entries()) {\n if (value === undefined) continue\n mask |= 1 << index\n predicates.push(`r.${column} IS NOT DISTINCT FROM ?`)\n values.push(value)\n }\n if (filters.createdAfterMs !== undefined) {\n predicates.push(\"r.created_at_ms >= ?\")\n values.push(filters.createdAfterMs)\n }\n if (filters.createdBeforeMs !== undefined) {\n predicates.push(\"r.created_at_ms <= ?\")\n values.push(filters.createdBeforeMs)\n }\n if (cursor !== null) {\n predicates.push(\"(r.created_at_ms, r.run_id) > (?, ?)\")\n values.push(cursor.createdAtMs, cursor.runId)\n }\n values.push(limit + 1)\n const rows = yield* Dialect.query(\n sql,\n `SELECT ${Read.selectColumns} FROM flows_runs r ${\n Dialect.isPostgres(sql) ? \"\" : `INDEXED BY flows_runs_listing_${mask}`\n }\n LEFT JOIN flows_run_changes c ON c.run_id = r.run_id\n ${\n predicates.length === 0\n ? \"\"\n : `WHERE ${predicates.join(\" AND \")}`\n }\n ORDER BY r.created_at_ms, r.run_id LIMIT ?`,\n values\n )\n const decoded = yield* Effect.forEach(rows, (row) => Read.observed(row, at))\n const runs = decoded.slice(0, limit)\n const last = runs[runs.length - 1]\n return {\n ...at,\n runs,\n cursor: decoded.length > limit ?\n JSON.stringify({\n version: 1,\n source: at.source,\n filters: tuple,\n createdAtMs: last!.createdAtMs,\n runId: last!.runId\n }) :\n null\n }\n })\n )\n }).pipe(Effect.catchCause((cause) => {\n if (Cause.hasInterruptsOnly(cause)) return Effect.failCause(cause as Cause.Cause<never>)\n const original = Cause.squash(cause)\n return Effect.fail(\n original instanceof RunCatalogError ? original : new RunCatalogError({\n code: \"list_failed\",\n message: \"the engine run page could not be read\",\n cause: original\n })\n )\n }))\n return { listRuns }\n })\n"]}
1
+ {"version":3,"file":"RunListing.js","sourceRoot":"","sources":["../../../src/internal/RunListing.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Bounded, indexed run pages.\n *\n * @since 1.0.0\n */\n\nimport * as Dialect from \"@smthrs/database/Dialect\"\nimport { RunStatus } from \"@smthrs/run-store/RunStore\"\nimport { Cause, Effect, Schema } from \"effect\"\nimport * as SqlClient from \"effect/sql/SqlClient\"\nimport * as Read from \"./ExecutionSnapshotRead.ts\"\nimport { RunCatalogError } from \"./RunListingError.ts\"\n\n/**\n * Supported equality and inclusive creation-range filters.\n *\n * @category models\n * @since 1.0.0\n */\nexport const Filters = Schema.Struct({\n status: Schema.optionalKey(RunStatus),\n flowName: Schema.optionalKey(Read.Identifier),\n parentRunId: Schema.optionalKey(Schema.NullOr(Read.Identifier)),\n lineageId: Schema.optionalKey(Read.Identifier),\n waitingReason: Schema.optionalKey(Schema.NullOr(Read.Identifier)),\n createdAfterMs: Schema.optionalKey(Read.Natural),\n createdBeforeMs: Schema.optionalKey(Read.Natural)\n})\n/**\n * Supported filters; lineageId also selects its original root.\n *\n * @category models\n * @since 1.0.0\n */\nexport type Filters = typeof Filters.Type\n/**\n * Options for a bounded run page. Numeric offsets are not cursors.\n *\n * @category models\n * @since 1.0.0\n */\nexport interface ListRunsOptions {\n readonly filters?: Filters\n readonly cursor?: string\n readonly limit?: number\n}\n/**\n * One transaction's page and watermark; no total count.\n *\n * @category models\n * @since 1.0.0\n */\nexport interface RunPage extends Read.Position {\n readonly runs: ReadonlyArray<Read.Observed>\n readonly cursor: string | null\n}\n/**\n * Bounded catalog operations.\n *\n * @category models\n * @since 1.0.0\n */\nexport interface Service {\n readonly listRuns: (options?: ListRunsOptions) => Effect.Effect<RunPage, RunCatalogError>\n}\n/**\n * Maximum page size.\n *\n * @category constants\n * @since 1.0.0\n */\nexport const maximumPageSize = 200\nconst Cursor = Schema.fromJsonString(Schema.Struct({\n version: Schema.Literal(1),\n source: Read.Source,\n filters: Schema.String,\n createdAtMs: Read.Natural,\n runId: Read.Identifier\n}))\nconst Options = Schema.Struct({\n filters: Schema.optionalKey(Filters),\n // Four 1,024-unit filter strings can expand sevenfold inside the JSON tuple\n // string, plus a sixfold escaped 1,024-unit run ID and bounded scalar fields.\n // 64 Ki UTF-16 units therefore admits every cursor this port can produce.\n cursor: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(65536))),\n limit: Schema.optionalKey(Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: maximumPageSize })))\n})\n\n/**\n * Builds the bounded read against the engine database.\n *\n * @category constructors\n * @since 1.0.0\n */\nexport const make = () =>\n Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n const listRuns: Service[\"listRuns\"] = (options = {}) =>\n Effect.gen(function*() {\n const admitted = yield* Schema.decodeUnknownEffect(Options)(options, { onExcessProperty: \"error\" }).pipe(\n Effect.mapError((cause) =>\n new RunCatalogError({ code: \"invalid_options\", message: \"invalid run page options\", cause })\n )\n )\n const filters = admitted.filters ?? {}\n const tuple = JSON.stringify([\n filters.status ?? null,\n filters.flowName ?? null,\n filters.parentRunId === undefined ? [] : [filters.parentRunId],\n filters.lineageId ?? null,\n filters.waitingReason === undefined ? [] : [filters.waitingReason],\n filters.createdAfterMs ?? null,\n filters.createdBeforeMs ?? null\n ])\n const cursor = admitted.cursor === undefined ?\n null :\n yield* Schema.decodeUnknownEffect(Cursor)(admitted.cursor).pipe(\n Effect.mapError((cause) =>\n new RunCatalogError({ code: \"invalid_cursor\", message: \"malformed run cursor\", cause })\n )\n )\n if (cursor !== null && cursor.filters !== tuple) {\n return yield* Effect.fail(\n new RunCatalogError({ code: \"invalid_cursor\", message: \"run cursor belongs to another query\" })\n )\n }\n const limit = admitted.limit ?? 100\n return yield* Read.transaction(\n sql,\n Effect.gen(function*() {\n const at = yield* Read.position(sql)\n if (cursor !== null && cursor.source !== at.source) {\n return yield* Effect.fail(\n new RunCatalogError({ code: \"source_changed\", message: \"run cursor belongs to another engine source\" })\n )\n }\n const predicates: Array<string> = []\n const values: Array<string | number | null> = []\n let mask = 0\n const equalities = [\n [\"status\", filters.status],\n [\"execution_flow\", filters.flowName],\n [\"execution_parent_id\", filters.parentRunId],\n [\"execution_lineage\", filters.lineageId],\n [\"waiting_reason\", filters.waitingReason]\n ] as const\n for (const [index, [column, value]] of equalities.entries()) {\n if (value === undefined) continue\n mask |= 1 << index\n predicates.push(`r.${column} IS NOT DISTINCT FROM ?`)\n values.push(value)\n }\n if (filters.createdAfterMs !== undefined) {\n predicates.push(\"r.created_at_ms >= ?\")\n values.push(filters.createdAfterMs)\n }\n if (filters.createdBeforeMs !== undefined) {\n predicates.push(\"r.created_at_ms <= ?\")\n values.push(filters.createdBeforeMs)\n }\n if (cursor !== null) {\n predicates.push(\"(r.created_at_ms, r.run_id) > (?, ?)\")\n values.push(cursor.createdAtMs, cursor.runId)\n }\n values.push(limit + 1)\n const rows = yield* Dialect.query(\n sql,\n `SELECT ${Read.selectColumns} FROM flows_runs r ${\n Dialect.isPostgres(sql) ? \"\" : `INDEXED BY flows_runs_listing_${mask}`\n }\n LEFT JOIN flows_run_changes c ON c.run_id = r.run_id\n ${\n predicates.length === 0\n ? \"\"\n : `WHERE ${predicates.join(\" AND \")}`\n }\n ORDER BY r.created_at_ms, r.run_id LIMIT ?`,\n values\n )\n const decoded = yield* Effect.forEach(rows, (row) => Read.observed(row, at))\n const runs = decoded.slice(0, limit)\n const last = runs[runs.length - 1]\n return {\n ...at,\n runs,\n cursor: decoded.length > limit ?\n JSON.stringify({\n version: 1,\n source: at.source,\n filters: tuple,\n createdAtMs: last!.createdAtMs,\n runId: last!.runId\n }) :\n null\n }\n })\n )\n }).pipe(Effect.catchCause((cause) => {\n if (Cause.hasInterruptsOnly(cause)) return Effect.failCause(cause as Cause.Cause<never>)\n const original = Cause.squash(cause)\n return Effect.fail(\n original instanceof RunCatalogError ? original : new RunCatalogError({\n code: \"list_failed\",\n message: \"the engine run page could not be read\",\n cause: original\n })\n )\n }))\n return { listRuns }\n })\n"]}
@@ -6,7 +6,7 @@
6
6
  * @since 0.1.0
7
7
  */
8
8
  import * as Effect from "effect/Effect";
9
- import * as SqlClient from "effect/unstable/sql/SqlClient";
9
+ import * as SqlClient from "effect/sql/SqlClient";
10
10
  /**
11
11
  * Creates the `flows_deferred_completions` and `flows_clock_deadlines` tables.
12
12
  *
@@ -1 +1 @@
1
- {"version":3,"file":"0001_initial.d.ts","sourceRoot":"","sources":["../../../src/migrations/0001_initial.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAE1D;;;;;GAKG;AACH,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,SAAS,CAgCpE,CAAA"}
1
+ {"version":3,"file":"0001_initial.d.ts","sourceRoot":"","sources":["../../../src/migrations/0001_initial.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AAEjD;;;;;GAKG;AACH,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,SAAS,CAgCpE,CAAA"}
@@ -7,7 +7,7 @@
7
7
  */
8
8
  import * as Dialect from "@smthrs/database/Dialect";
9
9
  import * as Effect from "effect/Effect";
10
- import * as SqlClient from "effect/unstable/sql/SqlClient";
10
+ import * as SqlClient from "effect/sql/SqlClient";
11
11
  /**
12
12
  * Creates the `flows_deferred_completions` and `flows_clock_deadlines` tables.
13
13
  *
@@ -1 +1 @@
1
- {"version":3,"file":"0001_initial.js","sourceRoot":"","sources":["../../../src/migrations/0001_initial.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAA;AACnD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAE1D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,OAAO,GAAsD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC5F,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAA;IAEtC,KAAK,CAAC,CAAC,GAAG,CAAA;;;;qCAIyB,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,WAAW,CAAC;yDAClB,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,eAAe,CAAC;sBAC7E,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,oBACtC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,iBAAiB,CAC7C;;;IAGE,CAAA;IAEF,KAAK,CAAC,CAAC,GAAG,CAAA;;;;;gBAKI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,oBAChC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,WAAW,CACvC;sBACoB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,uCACtC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,iBAAiB,CAC7C;;;IAGE,CAAA;IAEF,KAAK,CAAC,CAAC,GAAG,CAAA,sGAAsG,CAAA;AAClH,CAAC,CAAC,CAAA","sourcesContent":["/**\n * Initial durable deferred-completion and clock-deadline schema.\n *\n * Schema boundary: `packages/smithers/flows/engine-store/docs/concepts/durable-waits.md`.\n *\n * @since 0.1.0\n */\n\nimport * as Dialect from \"@smthrs/database/Dialect\"\nimport * as Effect from \"effect/Effect\"\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\"\n\n/**\n * Creates the `flows_deferred_completions` and `flows_clock_deadlines` tables.\n *\n * @category migrations\n * @since 0.1.0\n */\nexport const initial: Effect.Effect<void, unknown, SqlClient.SqlClient> = Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n\n yield* sql`CREATE TABLE flows_deferred_completions (\n flow_name TEXT NOT NULL CHECK (length(flow_name) > 0),\n execution_id TEXT NOT NULL CHECK (length(execution_id) > 0),\n deferred_name TEXT NOT NULL CHECK (length(deferred_name) > 0),\n exit_json TEXT NOT NULL CHECK (${Dialect.jsonValid(sql, sql`exit_json`)}),\n metadata_json TEXT CHECK (metadata_json IS NULL OR ${Dialect.jsonValid(sql, sql`metadata_json`)}),\n completed_at_ms ${Dialect.integer(sql)} NOT NULL CHECK (${\n Dialect.isInteger(sql, sql`completed_at_ms`)\n } AND completed_at_ms >= 0 AND completed_at_ms <= 9007199254740991),\n PRIMARY KEY (flow_name, execution_id, deferred_name),\n FOREIGN KEY (execution_id) REFERENCES flows_runs (run_id)\n )`\n\n yield* sql`CREATE TABLE flows_clock_deadlines (\n flow_name TEXT NOT NULL CHECK (length(flow_name) > 0),\n execution_id TEXT NOT NULL CHECK (length(execution_id) > 0),\n clock_name TEXT NOT NULL CHECK (length(clock_name) > 0),\n deferred_name TEXT NOT NULL CHECK (length(deferred_name) > 0),\n due_at_ms ${Dialect.integer(sql)} NOT NULL CHECK (${\n Dialect.isInteger(sql, sql`due_at_ms`)\n } AND due_at_ms >= 0 AND due_at_ms <= 9007199254740991),\n completed_at_ms ${Dialect.integer(sql)} CHECK (completed_at_ms IS NULL OR (${\n Dialect.isInteger(sql, sql`completed_at_ms`)\n } AND completed_at_ms >= 0 AND completed_at_ms <= 9007199254740991)),\n PRIMARY KEY (flow_name, execution_id, clock_name),\n FOREIGN KEY (execution_id) REFERENCES flows_runs (run_id)\n )`\n\n yield* sql`CREATE INDEX flows_clock_deadlines_pending_idx ON flows_clock_deadlines (completed_at_ms, due_at_ms)`\n})\n"]}
1
+ {"version":3,"file":"0001_initial.js","sourceRoot":"","sources":["../../../src/migrations/0001_initial.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAA;AACnD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AAEjD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,OAAO,GAAsD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC5F,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAA;IAEtC,KAAK,CAAC,CAAC,GAAG,CAAA;;;;qCAIyB,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,WAAW,CAAC;yDAClB,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,eAAe,CAAC;sBAC7E,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,oBACtC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,iBAAiB,CAC7C;;;IAGE,CAAA;IAEF,KAAK,CAAC,CAAC,GAAG,CAAA;;;;;gBAKI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,oBAChC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,WAAW,CACvC;sBACoB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,uCACtC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,iBAAiB,CAC7C;;;IAGE,CAAA;IAEF,KAAK,CAAC,CAAC,GAAG,CAAA,sGAAsG,CAAA;AAClH,CAAC,CAAC,CAAA","sourcesContent":["/**\n * Initial durable deferred-completion and clock-deadline schema.\n *\n * Schema boundary: `packages/smithers/flows/engine-store/docs/concepts/durable-waits.md`.\n *\n * @since 0.1.0\n */\n\nimport * as Dialect from \"@smthrs/database/Dialect\"\nimport * as Effect from \"effect/Effect\"\nimport * as SqlClient from \"effect/sql/SqlClient\"\n\n/**\n * Creates the `flows_deferred_completions` and `flows_clock_deadlines` tables.\n *\n * @category migrations\n * @since 0.1.0\n */\nexport const initial: Effect.Effect<void, unknown, SqlClient.SqlClient> = Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n\n yield* sql`CREATE TABLE flows_deferred_completions (\n flow_name TEXT NOT NULL CHECK (length(flow_name) > 0),\n execution_id TEXT NOT NULL CHECK (length(execution_id) > 0),\n deferred_name TEXT NOT NULL CHECK (length(deferred_name) > 0),\n exit_json TEXT NOT NULL CHECK (${Dialect.jsonValid(sql, sql`exit_json`)}),\n metadata_json TEXT CHECK (metadata_json IS NULL OR ${Dialect.jsonValid(sql, sql`metadata_json`)}),\n completed_at_ms ${Dialect.integer(sql)} NOT NULL CHECK (${\n Dialect.isInteger(sql, sql`completed_at_ms`)\n } AND completed_at_ms >= 0 AND completed_at_ms <= 9007199254740991),\n PRIMARY KEY (flow_name, execution_id, deferred_name),\n FOREIGN KEY (execution_id) REFERENCES flows_runs (run_id)\n )`\n\n yield* sql`CREATE TABLE flows_clock_deadlines (\n flow_name TEXT NOT NULL CHECK (length(flow_name) > 0),\n execution_id TEXT NOT NULL CHECK (length(execution_id) > 0),\n clock_name TEXT NOT NULL CHECK (length(clock_name) > 0),\n deferred_name TEXT NOT NULL CHECK (length(deferred_name) > 0),\n due_at_ms ${Dialect.integer(sql)} NOT NULL CHECK (${\n Dialect.isInteger(sql, sql`due_at_ms`)\n } AND due_at_ms >= 0 AND due_at_ms <= 9007199254740991),\n completed_at_ms ${Dialect.integer(sql)} CHECK (completed_at_ms IS NULL OR (${\n Dialect.isInteger(sql, sql`completed_at_ms`)\n } AND completed_at_ms >= 0 AND completed_at_ms <= 9007199254740991)),\n PRIMARY KEY (flow_name, execution_id, clock_name),\n FOREIGN KEY (execution_id) REFERENCES flows_runs (run_id)\n )`\n\n yield* sql`CREATE INDEX flows_clock_deadlines_pending_idx ON flows_clock_deadlines (completed_at_ms, due_at_ms)`\n})\n"]}
@@ -4,7 +4,7 @@
4
4
  * @since 0.1.0
5
5
  */
6
6
  import * as Effect from "effect/Effect";
7
- import * as SqlClient from "effect/unstable/sql/SqlClient";
7
+ import * as SqlClient from "effect/sql/SqlClient";
8
8
  /**
9
9
  * Creates the `flows_selection_suspected_edges` table.
10
10
  *
@@ -1 +1 @@
1
- {"version":3,"file":"0002_selection_store.d.ts","sourceRoot":"","sources":["../../../src/migrations/0002_selection_store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAE1D;;;;;GAKG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,SAAS,CAqB3E,CAAA"}
1
+ {"version":3,"file":"0002_selection_store.d.ts","sourceRoot":"","sources":["../../../src/migrations/0002_selection_store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AAEjD;;;;;GAKG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,SAAS,CAqB3E,CAAA"}
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import * as Dialect from "@smthrs/database/Dialect";
7
7
  import * as Effect from "effect/Effect";
8
- import * as SqlClient from "effect/unstable/sql/SqlClient";
8
+ import * as SqlClient from "effect/sql/SqlClient";
9
9
  /**
10
10
  * Creates the `flows_selection_suspected_edges` table.
11
11
  *
@@ -1 +1 @@
1
- {"version":3,"file":"0002_selection_store.js","sourceRoot":"","sources":["../../../src/migrations/0002_selection_store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAA;AACnD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAE1D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAsD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACnG,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAA;IAEtC,KAAK,CAAC,CAAC,GAAG,CAAA;;;;QAKR,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,iEAAiE,CAClH;;;;oBAIkB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;QAChC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,eAAe,CAAC;;;;yCAIT,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,eAAe,CAAC;;IAE/E,CAAA;AACJ,CAAC,CAAC,CAAA","sourcesContent":["/**\n * Durable suspected-edge storage for probabilistic selection.\n *\n * @since 0.1.0\n */\n\nimport * as Dialect from \"@smthrs/database/Dialect\"\nimport * as Effect from \"effect/Effect\"\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\"\n\n/**\n * Creates the `flows_selection_suspected_edges` table.\n *\n * @category migrations\n * @since 0.1.0\n */\nexport const selectionStore: Effect.Effect<void, unknown, SqlClient.SqlClient> = Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n\n yield* sql`CREATE TABLE flows_selection_suspected_edges (\n scope TEXT NOT NULL CHECK (length(scope) > 0),\n affects TEXT NOT NULL CHECK (length(affects) > 0),\n confidence DOUBLE PRECISION NOT NULL CHECK (\n ${\n sql.literal(Dialect.isPostgres(sql) ? \"TRUE\" : \"(typeof(confidence) = 'real' OR typeof(confidence) = 'integer')\")\n } AND\n confidence >= 0 AND\n confidence <= 1\n ),\n valid_from_ms ${Dialect.integer(sql)} NOT NULL CHECK (\n ${Dialect.isInteger(sql, sql`valid_from_ms`)} AND\n valid_from_ms >= 0 AND\n valid_from_ms <= 9007199254740991\n ),\n evidence_json TEXT NOT NULL CHECK (${Dialect.jsonValid(sql, sql`evidence_json`)}),\n PRIMARY KEY (scope, affects)\n )`\n})\n"]}
1
+ {"version":3,"file":"0002_selection_store.js","sourceRoot":"","sources":["../../../src/migrations/0002_selection_store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAA;AACnD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AAEjD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAsD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACnG,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAA;IAEtC,KAAK,CAAC,CAAC,GAAG,CAAA;;;;QAKR,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,iEAAiE,CAClH;;;;oBAIkB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;QAChC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,eAAe,CAAC;;;;yCAIT,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,eAAe,CAAC;;IAE/E,CAAA;AACJ,CAAC,CAAC,CAAA","sourcesContent":["/**\n * Durable suspected-edge storage for probabilistic selection.\n *\n * @since 0.1.0\n */\n\nimport * as Dialect from \"@smthrs/database/Dialect\"\nimport * as Effect from \"effect/Effect\"\nimport * as SqlClient from \"effect/sql/SqlClient\"\n\n/**\n * Creates the `flows_selection_suspected_edges` table.\n *\n * @category migrations\n * @since 0.1.0\n */\nexport const selectionStore: Effect.Effect<void, unknown, SqlClient.SqlClient> = Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n\n yield* sql`CREATE TABLE flows_selection_suspected_edges (\n scope TEXT NOT NULL CHECK (length(scope) > 0),\n affects TEXT NOT NULL CHECK (length(affects) > 0),\n confidence DOUBLE PRECISION NOT NULL CHECK (\n ${\n sql.literal(Dialect.isPostgres(sql) ? \"TRUE\" : \"(typeof(confidence) = 'real' OR typeof(confidence) = 'integer')\")\n } AND\n confidence >= 0 AND\n confidence <= 1\n ),\n valid_from_ms ${Dialect.integer(sql)} NOT NULL CHECK (\n ${Dialect.isInteger(sql, sql`valid_from_ms`)} AND\n valid_from_ms >= 0 AND\n valid_from_ms <= 9007199254740991\n ),\n evidence_json TEXT NOT NULL CHECK (${Dialect.jsonValid(sql, sql`evidence_json`)}),\n PRIMARY KEY (scope, affects)\n )`\n})\n"]}
@@ -3,7 +3,7 @@
3
3
  * @since 1.0.0
4
4
  */
5
5
  import * as Effect from "effect/Effect";
6
- import * as SqlClient from "effect/unstable/sql/SqlClient";
6
+ import * as SqlClient from "effect/sql/SqlClient";
7
7
  /**
8
8
  * Creates input generations and marks pre-observation executions as non-recoverable.
9
9
  * @since 1.0.0
@@ -1 +1 @@
1
- {"version":3,"file":"0003_plan_inputs.d.ts","sourceRoot":"","sources":["../../../src/migrations/0003_plan_inputs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAE1D;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,SAAS,CA4DvE,CAAA"}
1
+ {"version":3,"file":"0003_plan_inputs.d.ts","sourceRoot":"","sources":["../../../src/migrations/0003_plan_inputs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AAEjD;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,SAAS,CA4DvE,CAAA"}
@@ -4,7 +4,7 @@
4
4
  */
5
5
  import * as Dialect from "@smthrs/database/Dialect";
6
6
  import * as Effect from "effect/Effect";
7
- import * as SqlClient from "effect/unstable/sql/SqlClient";
7
+ import * as SqlClient from "effect/sql/SqlClient";
8
8
  /**
9
9
  * Creates input generations and marks pre-observation executions as non-recoverable.
10
10
  * @since 1.0.0
@@ -1 +1 @@
1
- {"version":3,"file":"0003_plan_inputs.js","sourceRoot":"","sources":["../../../src/migrations/0003_plan_inputs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAA;AACnD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAE1D;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAsD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC/F,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAA;IACtC,KAAK,CAAC,CAAC,GAAG,CAAA;;IAER,CAAA;IACF,4EAA4E;IAC5E,yEAAyE;IACzE,KAAK,CAAC,CAAC,GAAG,CAAA;+CACmC,CAAA;IAC7C,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;QAC1B,IAAI,EAAE,wCAAwC;QAC9C,KAAK,EAAE,8BAA8B;QACrC,KAAK,EAAE,eAAe;QACtB,MAAM,EAAE,4CAA4C;KACrD,CAAC,CAAA;IACF,KAAK,CAAC,CAAC,GAAG,CAAA;;;;iBAIK,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,oBACjC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,YAAY,CACxC;;IAEE,CAAA;IACF,KAAK,CAAC,CAAC,GAAG,CAAA,uFAAuF,CAAA;IACjG,KAAK,CAAC,CAAC,GAAG,CAAA;;;iBAGK,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,oBACjC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,YAAY,CACxC;yCACuC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,eAAe,CAAC;;;IAG/E,CAAA;IACF,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;QAC1B,IAAI,EAAE,wCAAwC;QAC9C,KAAK,EAAE,8BAA8B;QACrC,KAAK,EAAE,eAAe;QACtB,MAAM,EAAE,sCAAsC;KAC/C,CAAC,CAAA;IACF,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;QAC1B,IAAI,EAAE,qCAAqC;QAC3C,KAAK,EAAE,wBAAwB;QAC/B,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE;iFACuE;QAC7E,MAAM,EAAE,8CAA8C;KACvD,CAAC,CAAA;IACF,KAAK,MAAM,KAAK,IAAI,CAAC,8BAA8B,EAAE,wBAAwB,EAAE,8BAA8B,CAAC,EAAE,CAAC;QAC/G,wEAAwE;QACxE,sCAAsC;QACtC,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;YAC1B,IAAI,EAAE,GAAG,KAAK,YAAY;YAC1B,KAAK,EAAE,GAAG,KAAK,EAAE;YACjB,KAAK,EAAE,eAAe;YACtB,IAAI,EAAE,6DAA6D;YACnE,MAAM,EAAE,iCAAiC;SAC1C,CAAC,CAAA;IACJ,CAAC;AACH,CAAC,CAAC,CAAA","sourcesContent":["/**\n * Durable, append-only source observations for compiled plan execution.\n * @since 1.0.0\n */\n\nimport * as Dialect from \"@smthrs/database/Dialect\"\nimport * as Effect from \"effect/Effect\"\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\"\n\n/**\n * Creates input generations and marks pre-observation executions as non-recoverable.\n * @since 1.0.0\n * @category migrations\n */\nexport const planInputs: Effect.Effect<void, unknown, SqlClient.SqlClient> = Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n yield* sql`CREATE TABLE flows_plan_input_legacy_runs (\n run_id TEXT PRIMARY KEY NOT NULL REFERENCES flows_runs(run_id) ON DELETE CASCADE\n )`\n // A past source snapshot cannot be reconstructed from the files a completed\n // action may already have changed. Preserve that uncertainty on upgrade.\n yield* sql`INSERT INTO flows_plan_input_legacy_runs (run_id)\n SELECT DISTINCT run_id FROM flows_attempts`\n yield* Dialect.trigger(sql, {\n name: `flows_plan_input_legacy_runs_no_update`,\n table: `flows_plan_input_legacy_runs`,\n event: \"BEFORE UPDATE\",\n reject: \"legacy plan input uncertainty is immutable\"\n })\n yield* sql`CREATE TABLE flows_plan_input_heads (\n run_id TEXT NOT NULL REFERENCES flows_runs(run_id) ON DELETE CASCADE,\n plan_id TEXT NOT NULL CHECK (length(plan_id) > 0),\n base_digest TEXT NOT NULL CHECK (length(base_digest) > 0),\n generation ${Dialect.integer(sql)} NOT NULL CHECK (${\n Dialect.isInteger(sql, sql`generation`)\n } AND generation >= 0 AND generation <= 9007199254740991),\n PRIMARY KEY (run_id, plan_id)\n )`\n yield* sql`CREATE UNIQUE INDEX flows_plan_input_heads_run_idx ON flows_plan_input_heads (run_id)`\n yield* sql`CREATE TABLE flows_plan_input_generations (\n run_id TEXT NOT NULL REFERENCES flows_runs(run_id) ON DELETE CASCADE,\n plan_id TEXT NOT NULL CHECK (length(plan_id) > 0),\n generation ${Dialect.integer(sql)} NOT NULL CHECK (${\n Dialect.isInteger(sql, sql`generation`)\n } AND generation >= 0 AND generation <= 9007199254740991),\n snapshot_json TEXT NOT NULL CHECK (${Dialect.jsonValid(sql, sql`snapshot_json`)}),\n checksum TEXT NOT NULL CHECK (length(checksum) = 64),\n PRIMARY KEY (run_id, plan_id, generation)\n )`\n yield* Dialect.trigger(sql, {\n name: `flows_plan_input_generations_no_update`,\n table: `flows_plan_input_generations`,\n event: \"BEFORE UPDATE\",\n reject: \"plan input generations are immutable\"\n })\n yield* Dialect.trigger(sql, {\n name: `flows_plan_input_heads_forward_only`,\n table: `flows_plan_input_heads`,\n event: \"BEFORE UPDATE\",\n when: `NEW.run_id <> OLD.run_id OR NEW.plan_id <> OLD.plan_id OR\n NEW.base_digest <> OLD.base_digest OR NEW.generation <> OLD.generation + 1`,\n reject: \"plan input heads only advance one generation\"\n })\n for (const table of [\"flows_plan_input_legacy_runs\", \"flows_plan_input_heads\", \"flows_plan_input_generations\"]) {\n // Cascade on run collection is allowed; direct deletion of replay state\n // while its owning run exists is not.\n yield* Dialect.trigger(sql, {\n name: `${table}_no_delete`,\n table: `${table}`,\n event: \"BEFORE DELETE\",\n when: `EXISTS (SELECT 1 FROM flows_runs WHERE run_id = OLD.run_id)`,\n reject: \"plan inputs belong to their run\"\n })\n }\n})\n"]}
1
+ {"version":3,"file":"0003_plan_inputs.js","sourceRoot":"","sources":["../../../src/migrations/0003_plan_inputs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAA;AACnD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AAEjD;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAsD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC/F,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAA;IACtC,KAAK,CAAC,CAAC,GAAG,CAAA;;IAER,CAAA;IACF,4EAA4E;IAC5E,yEAAyE;IACzE,KAAK,CAAC,CAAC,GAAG,CAAA;+CACmC,CAAA;IAC7C,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;QAC1B,IAAI,EAAE,wCAAwC;QAC9C,KAAK,EAAE,8BAA8B;QACrC,KAAK,EAAE,eAAe;QACtB,MAAM,EAAE,4CAA4C;KACrD,CAAC,CAAA;IACF,KAAK,CAAC,CAAC,GAAG,CAAA;;;;iBAIK,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,oBACjC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,YAAY,CACxC;;IAEE,CAAA;IACF,KAAK,CAAC,CAAC,GAAG,CAAA,uFAAuF,CAAA;IACjG,KAAK,CAAC,CAAC,GAAG,CAAA;;;iBAGK,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,oBACjC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,YAAY,CACxC;yCACuC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,eAAe,CAAC;;;IAG/E,CAAA;IACF,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;QAC1B,IAAI,EAAE,wCAAwC;QAC9C,KAAK,EAAE,8BAA8B;QACrC,KAAK,EAAE,eAAe;QACtB,MAAM,EAAE,sCAAsC;KAC/C,CAAC,CAAA;IACF,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;QAC1B,IAAI,EAAE,qCAAqC;QAC3C,KAAK,EAAE,wBAAwB;QAC/B,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE;iFACuE;QAC7E,MAAM,EAAE,8CAA8C;KACvD,CAAC,CAAA;IACF,KAAK,MAAM,KAAK,IAAI,CAAC,8BAA8B,EAAE,wBAAwB,EAAE,8BAA8B,CAAC,EAAE,CAAC;QAC/G,wEAAwE;QACxE,sCAAsC;QACtC,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;YAC1B,IAAI,EAAE,GAAG,KAAK,YAAY;YAC1B,KAAK,EAAE,GAAG,KAAK,EAAE;YACjB,KAAK,EAAE,eAAe;YACtB,IAAI,EAAE,6DAA6D;YACnE,MAAM,EAAE,iCAAiC;SAC1C,CAAC,CAAA;IACJ,CAAC;AACH,CAAC,CAAC,CAAA","sourcesContent":["/**\n * Durable, append-only source observations for compiled plan execution.\n * @since 1.0.0\n */\n\nimport * as Dialect from \"@smthrs/database/Dialect\"\nimport * as Effect from \"effect/Effect\"\nimport * as SqlClient from \"effect/sql/SqlClient\"\n\n/**\n * Creates input generations and marks pre-observation executions as non-recoverable.\n * @since 1.0.0\n * @category migrations\n */\nexport const planInputs: Effect.Effect<void, unknown, SqlClient.SqlClient> = Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n yield* sql`CREATE TABLE flows_plan_input_legacy_runs (\n run_id TEXT PRIMARY KEY NOT NULL REFERENCES flows_runs(run_id) ON DELETE CASCADE\n )`\n // A past source snapshot cannot be reconstructed from the files a completed\n // action may already have changed. Preserve that uncertainty on upgrade.\n yield* sql`INSERT INTO flows_plan_input_legacy_runs (run_id)\n SELECT DISTINCT run_id FROM flows_attempts`\n yield* Dialect.trigger(sql, {\n name: `flows_plan_input_legacy_runs_no_update`,\n table: `flows_plan_input_legacy_runs`,\n event: \"BEFORE UPDATE\",\n reject: \"legacy plan input uncertainty is immutable\"\n })\n yield* sql`CREATE TABLE flows_plan_input_heads (\n run_id TEXT NOT NULL REFERENCES flows_runs(run_id) ON DELETE CASCADE,\n plan_id TEXT NOT NULL CHECK (length(plan_id) > 0),\n base_digest TEXT NOT NULL CHECK (length(base_digest) > 0),\n generation ${Dialect.integer(sql)} NOT NULL CHECK (${\n Dialect.isInteger(sql, sql`generation`)\n } AND generation >= 0 AND generation <= 9007199254740991),\n PRIMARY KEY (run_id, plan_id)\n )`\n yield* sql`CREATE UNIQUE INDEX flows_plan_input_heads_run_idx ON flows_plan_input_heads (run_id)`\n yield* sql`CREATE TABLE flows_plan_input_generations (\n run_id TEXT NOT NULL REFERENCES flows_runs(run_id) ON DELETE CASCADE,\n plan_id TEXT NOT NULL CHECK (length(plan_id) > 0),\n generation ${Dialect.integer(sql)} NOT NULL CHECK (${\n Dialect.isInteger(sql, sql`generation`)\n } AND generation >= 0 AND generation <= 9007199254740991),\n snapshot_json TEXT NOT NULL CHECK (${Dialect.jsonValid(sql, sql`snapshot_json`)}),\n checksum TEXT NOT NULL CHECK (length(checksum) = 64),\n PRIMARY KEY (run_id, plan_id, generation)\n )`\n yield* Dialect.trigger(sql, {\n name: `flows_plan_input_generations_no_update`,\n table: `flows_plan_input_generations`,\n event: \"BEFORE UPDATE\",\n reject: \"plan input generations are immutable\"\n })\n yield* Dialect.trigger(sql, {\n name: `flows_plan_input_heads_forward_only`,\n table: `flows_plan_input_heads`,\n event: \"BEFORE UPDATE\",\n when: `NEW.run_id <> OLD.run_id OR NEW.plan_id <> OLD.plan_id OR\n NEW.base_digest <> OLD.base_digest OR NEW.generation <> OLD.generation + 1`,\n reject: \"plan input heads only advance one generation\"\n })\n for (const table of [\"flows_plan_input_legacy_runs\", \"flows_plan_input_heads\", \"flows_plan_input_generations\"]) {\n // Cascade on run collection is allowed; direct deletion of replay state\n // while its owning run exists is not.\n yield* Dialect.trigger(sql, {\n name: `${table}_no_delete`,\n table: `${table}`,\n event: \"BEFORE DELETE\",\n when: `EXISTS (SELECT 1 FROM flows_runs WHERE run_id = OLD.run_id)`,\n reject: \"plan inputs belong to their run\"\n })\n }\n})\n"]}
@@ -3,7 +3,7 @@
3
3
  * @since 1.0.0
4
4
  */
5
5
  import * as Effect from "effect/Effect";
6
- import * as SqlClient from "effect/unstable/sql/SqlClient";
6
+ import * as SqlClient from "effect/sql/SqlClient";
7
7
  /**
8
8
  * Older heads retain NULL: their original runtime environment is unknowable.
9
9
  * New heads require an environment fingerprint, immutable for their lifetime.
@@ -1 +1 @@
1
- {"version":3,"file":"0004_plan_environment.d.ts","sourceRoot":"","sources":["../../../src/migrations/0004_plan_environment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAE1D;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,SAAS,CAkB5E,CAAA"}
1
+ {"version":3,"file":"0004_plan_environment.d.ts","sourceRoot":"","sources":["../../../src/migrations/0004_plan_environment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AAEjD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,SAAS,CAkB5E,CAAA"}
@@ -4,7 +4,7 @@
4
4
  */
5
5
  import * as Dialect from "@smthrs/database/Dialect";
6
6
  import * as Effect from "effect/Effect";
7
- import * as SqlClient from "effect/unstable/sql/SqlClient";
7
+ import * as SqlClient from "effect/sql/SqlClient";
8
8
  /**
9
9
  * Older heads retain NULL: their original runtime environment is unknowable.
10
10
  * New heads require an environment fingerprint, immutable for their lifetime.
@@ -1 +1 @@
1
- {"version":3,"file":"0004_plan_environment.js","sourceRoot":"","sources":["../../../src/migrations/0004_plan_environment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAA;AACnD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAE1D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAsD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACpG,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAA;IACtC,KAAK,CAAC,CAAC,GAAG,CAAA;yEAC6D,CAAA;IACvE,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;QAC1B,IAAI,EAAE,6CAA6C;QACnD,KAAK,EAAE,wBAAwB;QAC/B,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,gCAAgC;QACtC,MAAM,EAAE,sDAAsD;KAC/D,CAAC,CAAA;IACF,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;QAC1B,IAAI,EAAE,8CAA8C;QACpD,KAAK,EAAE,wBAAwB;QAC/B,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,gEAAgE;QACtE,MAAM,EAAE,8CAA8C;KACvD,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA","sourcesContent":["/**\n * Bind source observations to the runtime identity that admitted them.\n * @since 1.0.0\n */\n\nimport * as Dialect from \"@smthrs/database/Dialect\"\nimport * as Effect from \"effect/Effect\"\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\"\n\n/**\n * Older heads retain NULL: their original runtime environment is unknowable.\n * New heads require an environment fingerprint, immutable for their lifetime.\n * @since 1.0.0\n * @category migrations\n */\nexport const planEnvironment: Effect.Effect<void, unknown, SqlClient.SqlClient> = Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n yield* sql`ALTER TABLE flows_plan_input_heads ADD COLUMN environment_digest TEXT\n CHECK (environment_digest IS NULL OR length(environment_digest) > 0)`\n yield* Dialect.trigger(sql, {\n name: `flows_plan_input_heads_environment_required`,\n table: `flows_plan_input_heads`,\n event: \"BEFORE INSERT\",\n when: `NEW.environment_digest IS NULL`,\n reject: \"new plan input heads require an environment identity\"\n })\n yield* Dialect.trigger(sql, {\n name: `flows_plan_input_heads_environment_immutable`,\n table: `flows_plan_input_heads`,\n event: \"BEFORE UPDATE\",\n when: `NEW.environment_digest IS DISTINCT FROM OLD.environment_digest`,\n reject: \"plan input environment identity is immutable\"\n })\n})\n"]}
1
+ {"version":3,"file":"0004_plan_environment.js","sourceRoot":"","sources":["../../../src/migrations/0004_plan_environment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAA;AACnD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AAEjD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAsD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACpG,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAA;IACtC,KAAK,CAAC,CAAC,GAAG,CAAA;yEAC6D,CAAA;IACvE,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;QAC1B,IAAI,EAAE,6CAA6C;QACnD,KAAK,EAAE,wBAAwB;QAC/B,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,gCAAgC;QACtC,MAAM,EAAE,sDAAsD;KAC/D,CAAC,CAAA;IACF,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;QAC1B,IAAI,EAAE,8CAA8C;QACpD,KAAK,EAAE,wBAAwB;QAC/B,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,gEAAgE;QACtE,MAAM,EAAE,8CAA8C;KACvD,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA","sourcesContent":["/**\n * Bind source observations to the runtime identity that admitted them.\n * @since 1.0.0\n */\n\nimport * as Dialect from \"@smthrs/database/Dialect\"\nimport * as Effect from \"effect/Effect\"\nimport * as SqlClient from \"effect/sql/SqlClient\"\n\n/**\n * Older heads retain NULL: their original runtime environment is unknowable.\n * New heads require an environment fingerprint, immutable for their lifetime.\n * @since 1.0.0\n * @category migrations\n */\nexport const planEnvironment: Effect.Effect<void, unknown, SqlClient.SqlClient> = Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n yield* sql`ALTER TABLE flows_plan_input_heads ADD COLUMN environment_digest TEXT\n CHECK (environment_digest IS NULL OR length(environment_digest) > 0)`\n yield* Dialect.trigger(sql, {\n name: `flows_plan_input_heads_environment_required`,\n table: `flows_plan_input_heads`,\n event: \"BEFORE INSERT\",\n when: `NEW.environment_digest IS NULL`,\n reject: \"new plan input heads require an environment identity\"\n })\n yield* Dialect.trigger(sql, {\n name: `flows_plan_input_heads_environment_immutable`,\n table: `flows_plan_input_heads`,\n event: \"BEFORE UPDATE\",\n when: `NEW.environment_digest IS DISTINCT FROM OLD.environment_digest`,\n reject: \"plan input environment identity is immutable\"\n })\n})\n"]}
@@ -3,7 +3,7 @@
3
3
  * @since 1.0.0
4
4
  */
5
5
  import * as Effect from "effect/Effect";
6
- import * as SqlClient from "effect/unstable/sql/SqlClient";
6
+ import * as SqlClient from "effect/sql/SqlClient";
7
7
  /**
8
8
  * Existing heads retain an unknown merge-state version; a later runtime must
9
9
  * not infer its missing control decisions from arbitrary plan-node bodies.
@@ -1 +1 @@
1
- {"version":3,"file":"0005_plan_merges.d.ts","sourceRoot":"","sources":["../../../src/migrations/0005_plan_merges.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAE1D;;;;;GAKG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,SAAS,CA4CvE,CAAA"}
1
+ {"version":3,"file":"0005_plan_merges.d.ts","sourceRoot":"","sources":["../../../src/migrations/0005_plan_merges.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AAEjD;;;;;GAKG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,SAAS,CA4CvE,CAAA"}
@@ -4,7 +4,7 @@
4
4
  */
5
5
  import * as Dialect from "@smthrs/database/Dialect";
6
6
  import * as Effect from "effect/Effect";
7
- import * as SqlClient from "effect/unstable/sql/SqlClient";
7
+ import * as SqlClient from "effect/sql/SqlClient";
8
8
  /**
9
9
  * Existing heads retain an unknown merge-state version; a later runtime must
10
10
  * not infer its missing control decisions from arbitrary plan-node bodies.
@@ -1 +1 @@
1
- {"version":3,"file":"0005_plan_merges.js","sourceRoot":"","sources":["../../../src/migrations/0005_plan_merges.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAA;AACnD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAE1D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAsD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC/F,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAA;IACtC,KAAK,CAAC,CAAC,GAAG,CAAA,qEAAqE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;mEAClC,CAAA;IACjE,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;QAC1B,IAAI,EAAE,gDAAgD;QACtD,KAAK,EAAE,wBAAwB;QAC/B,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,kEAAkE;QACxE,MAAM,EAAE,uCAAuC;KAChD,CAAC,CAAA;IACF,KAAK,CAAC,CAAC,GAAG,CAAA;;;uCAG2B,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,aAAa,CAAC;;;IAG3E,CAAA;IACF,KAAK,CAAC,CAAC,GAAG,CAAA;;;iBAGK,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,YAAY,CAAC;;2CAErD,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,iBAAiB,CAAC;;;;;IAKnF,CAAA;IACF,KAAK,MAAM,KAAK,IAAI,CAAC,0BAA0B,EAAE,8BAA8B,CAAC,EAAE,CAAC;QACjF,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;YAC1B,IAAI,EAAE,GAAG,KAAK,YAAY;YAC1B,KAAK,EAAE,GAAG,KAAK,EAAE;YACjB,KAAK,EAAE,eAAe;YACtB,MAAM,EAAE,oCAAoC;SAC7C,CAAC,CAAA;QACF,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;YAC1B,IAAI,EAAE,GAAG,KAAK,YAAY;YAC1B,KAAK,EAAE,GAAG,KAAK,EAAE;YACjB,KAAK,EAAE,eAAe;YACtB,IAAI,EAAE,6DAA6D;YACnE,MAAM,EAAE,0CAA0C;SACnD,CAAC,CAAA;IACJ,CAAC;AACH,CAAC,CAAC,CAAA","sourcesContent":["/**\n * Durable scheduler merge intentions and their committed plan extensions.\n * @since 1.0.0\n */\n\nimport * as Dialect from \"@smthrs/database/Dialect\"\nimport * as Effect from \"effect/Effect\"\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\"\n\n/**\n * Existing heads retain an unknown merge-state version; a later runtime must\n * not infer its missing control decisions from arbitrary plan-node bodies.\n * @since 1.0.0\n * @category migrations\n */\nexport const planMerges: Effect.Effect<void, unknown, SqlClient.SqlClient> = Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n yield* sql`ALTER TABLE flows_plan_input_heads ADD COLUMN merge_state_version ${Dialect.integer(sql)}\n CHECK (merge_state_version IS NULL OR merge_state_version = 1)`\n yield* Dialect.trigger(sql, {\n name: `flows_plan_input_heads_merge_version_immutable`,\n table: `flows_plan_input_heads`,\n event: \"BEFORE UPDATE\",\n when: `NEW.merge_state_version IS DISTINCT FROM OLD.merge_state_version`,\n reject: \"plan merge state version is immutable\"\n })\n yield* sql`CREATE TABLE flows_plan_merge_intents (\n run_id TEXT NOT NULL REFERENCES flows_runs(run_id) ON DELETE CASCADE,\n stopped_node_id TEXT NOT NULL CHECK (length(stopped_node_id) > 0),\n intent_json TEXT NOT NULL CHECK (${Dialect.jsonValid(sql, sql`intent_json`)}),\n checksum TEXT NOT NULL CHECK (length(checksum) = 64),\n PRIMARY KEY (run_id, stopped_node_id)\n )`\n yield* sql`CREATE TABLE flows_plan_merge_completions (\n run_id TEXT NOT NULL REFERENCES flows_runs(run_id) ON DELETE CASCADE,\n stopped_node_id TEXT NOT NULL CHECK (length(stopped_node_id) > 0),\n generation ${Dialect.integer(sql)} NOT NULL CHECK (${Dialect.isInteger(sql, sql`generation`)} AND generation > 0),\n merge_node_id TEXT NOT NULL CHECK (length(merge_node_id) > 0),\n completion_json TEXT NOT NULL CHECK (${Dialect.jsonValid(sql, sql`completion_json`)}),\n checksum TEXT NOT NULL CHECK (length(checksum) = 64),\n PRIMARY KEY (run_id, stopped_node_id),\n UNIQUE (run_id, generation), UNIQUE (run_id, merge_node_id),\n FOREIGN KEY (run_id, stopped_node_id) REFERENCES flows_plan_merge_intents(run_id, stopped_node_id) ON DELETE CASCADE\n )`\n for (const table of [\"flows_plan_merge_intents\", \"flows_plan_merge_completions\"]) {\n yield* Dialect.trigger(sql, {\n name: `${table}_no_update`,\n table: `${table}`,\n event: \"BEFORE UPDATE\",\n reject: \"plan merge decisions are immutable\"\n })\n yield* Dialect.trigger(sql, {\n name: `${table}_no_delete`,\n table: `${table}`,\n event: \"BEFORE DELETE\",\n when: `EXISTS (SELECT 1 FROM flows_runs WHERE run_id = OLD.run_id)`,\n reject: \"plan merge decisions belong to their run\"\n })\n }\n})\n"]}
1
+ {"version":3,"file":"0005_plan_merges.js","sourceRoot":"","sources":["../../../src/migrations/0005_plan_merges.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAA;AACnD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AAEjD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAsD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC/F,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAA;IACtC,KAAK,CAAC,CAAC,GAAG,CAAA,qEAAqE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;mEAClC,CAAA;IACjE,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;QAC1B,IAAI,EAAE,gDAAgD;QACtD,KAAK,EAAE,wBAAwB;QAC/B,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,kEAAkE;QACxE,MAAM,EAAE,uCAAuC;KAChD,CAAC,CAAA;IACF,KAAK,CAAC,CAAC,GAAG,CAAA;;;uCAG2B,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,aAAa,CAAC;;;IAG3E,CAAA;IACF,KAAK,CAAC,CAAC,GAAG,CAAA;;;iBAGK,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,YAAY,CAAC;;2CAErD,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,iBAAiB,CAAC;;;;;IAKnF,CAAA;IACF,KAAK,MAAM,KAAK,IAAI,CAAC,0BAA0B,EAAE,8BAA8B,CAAC,EAAE,CAAC;QACjF,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;YAC1B,IAAI,EAAE,GAAG,KAAK,YAAY;YAC1B,KAAK,EAAE,GAAG,KAAK,EAAE;YACjB,KAAK,EAAE,eAAe;YACtB,MAAM,EAAE,oCAAoC;SAC7C,CAAC,CAAA;QACF,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;YAC1B,IAAI,EAAE,GAAG,KAAK,YAAY;YAC1B,KAAK,EAAE,GAAG,KAAK,EAAE;YACjB,KAAK,EAAE,eAAe;YACtB,IAAI,EAAE,6DAA6D;YACnE,MAAM,EAAE,0CAA0C;SACnD,CAAC,CAAA;IACJ,CAAC;AACH,CAAC,CAAC,CAAA","sourcesContent":["/**\n * Durable scheduler merge intentions and their committed plan extensions.\n * @since 1.0.0\n */\n\nimport * as Dialect from \"@smthrs/database/Dialect\"\nimport * as Effect from \"effect/Effect\"\nimport * as SqlClient from \"effect/sql/SqlClient\"\n\n/**\n * Existing heads retain an unknown merge-state version; a later runtime must\n * not infer its missing control decisions from arbitrary plan-node bodies.\n * @since 1.0.0\n * @category migrations\n */\nexport const planMerges: Effect.Effect<void, unknown, SqlClient.SqlClient> = Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n yield* sql`ALTER TABLE flows_plan_input_heads ADD COLUMN merge_state_version ${Dialect.integer(sql)}\n CHECK (merge_state_version IS NULL OR merge_state_version = 1)`\n yield* Dialect.trigger(sql, {\n name: `flows_plan_input_heads_merge_version_immutable`,\n table: `flows_plan_input_heads`,\n event: \"BEFORE UPDATE\",\n when: `NEW.merge_state_version IS DISTINCT FROM OLD.merge_state_version`,\n reject: \"plan merge state version is immutable\"\n })\n yield* sql`CREATE TABLE flows_plan_merge_intents (\n run_id TEXT NOT NULL REFERENCES flows_runs(run_id) ON DELETE CASCADE,\n stopped_node_id TEXT NOT NULL CHECK (length(stopped_node_id) > 0),\n intent_json TEXT NOT NULL CHECK (${Dialect.jsonValid(sql, sql`intent_json`)}),\n checksum TEXT NOT NULL CHECK (length(checksum) = 64),\n PRIMARY KEY (run_id, stopped_node_id)\n )`\n yield* sql`CREATE TABLE flows_plan_merge_completions (\n run_id TEXT NOT NULL REFERENCES flows_runs(run_id) ON DELETE CASCADE,\n stopped_node_id TEXT NOT NULL CHECK (length(stopped_node_id) > 0),\n generation ${Dialect.integer(sql)} NOT NULL CHECK (${Dialect.isInteger(sql, sql`generation`)} AND generation > 0),\n merge_node_id TEXT NOT NULL CHECK (length(merge_node_id) > 0),\n completion_json TEXT NOT NULL CHECK (${Dialect.jsonValid(sql, sql`completion_json`)}),\n checksum TEXT NOT NULL CHECK (length(checksum) = 64),\n PRIMARY KEY (run_id, stopped_node_id),\n UNIQUE (run_id, generation), UNIQUE (run_id, merge_node_id),\n FOREIGN KEY (run_id, stopped_node_id) REFERENCES flows_plan_merge_intents(run_id, stopped_node_id) ON DELETE CASCADE\n )`\n for (const table of [\"flows_plan_merge_intents\", \"flows_plan_merge_completions\"]) {\n yield* Dialect.trigger(sql, {\n name: `${table}_no_update`,\n table: `${table}`,\n event: \"BEFORE UPDATE\",\n reject: \"plan merge decisions are immutable\"\n })\n yield* Dialect.trigger(sql, {\n name: `${table}_no_delete`,\n table: `${table}`,\n event: \"BEFORE DELETE\",\n when: `EXISTS (SELECT 1 FROM flows_runs WHERE run_id = OLD.run_id)`,\n reject: \"plan merge decisions belong to their run\"\n })\n }\n})\n"]}
@@ -4,7 +4,7 @@
4
4
  * @since 1.0.0
5
5
  */
6
6
  import * as Effect from "effect/Effect";
7
- import * as SqlClient from "effect/unstable/sql/SqlClient";
7
+ import * as SqlClient from "effect/sql/SqlClient";
8
8
  /**
9
9
  * Brings existing spawn edges into the migration ladder and binds changes to
10
10
  * their child's run revision. Run-store owns the shared revision triggers.
@@ -1 +1 @@
1
- {"version":3,"file":"0006_execution_listing.d.ts","sourceRoot":"","sources":["../../../src/migrations/0006_execution_listing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAE1D;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,SAAS,CAqE7E,CAAA"}
1
+ {"version":3,"file":"0006_execution_listing.d.ts","sourceRoot":"","sources":["../../../src/migrations/0006_execution_listing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AAEjD;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,SAAS,CAqE7E,CAAA"}
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import * as Dialect from "@smthrs/database/Dialect";
7
7
  import * as Effect from "effect/Effect";
8
- import * as SqlClient from "effect/unstable/sql/SqlClient";
8
+ import * as SqlClient from "effect/sql/SqlClient";
9
9
  /**
10
10
  * Brings existing spawn edges into the migration ladder and binds changes to
11
11
  * their child's run revision. Run-store owns the shared revision triggers.
@@ -1 +1 @@
1
- {"version":3,"file":"0006_execution_listing.js","sourceRoot":"","sources":["../../../src/migrations/0006_execution_listing.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Indexed engine execution observation and ordering.\n *\n * @since 1.0.0\n */\n\nimport * as Dialect from \"@smthrs/database/Dialect\"\nimport * as Effect from \"effect/Effect\"\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\"\n\n/**\n * Brings existing spawn edges into the migration ladder and binds changes to\n * their child's run revision. Run-store owns the shared revision triggers.\n * @category migrations\n * @since 1.0.0\n */\nexport const executionListing: Effect.Effect<void, unknown, SqlClient.SqlClient> = Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n yield* sql`CREATE TABLE IF NOT EXISTS flows_run_parents (\n child_id TEXT NOT NULL CHECK (length(child_id) > 0),\n parent_id TEXT NOT NULL CHECK (length(parent_id) > 0),\n seq ${Dialect.integer(sql)} NOT NULL CHECK (${\n Dialect.isInteger(sql, sql`seq`)\n } AND seq >= 0 AND seq <= 9007199254740991),\n PRIMARY KEY (child_id, parent_id)\n )`\n yield* sql`CREATE INDEX IF NOT EXISTS flows_run_parents_parent_idx ON flows_run_parents (parent_id)`\n yield* sql`CREATE INDEX flows_run_parents_first_idx ON flows_run_parents (child_id, seq, parent_id)`\n yield* sql`CREATE INDEX flows_run_parents_children_idx ON flows_run_parents (parent_id, seq, child_id)`\n yield* Dialect.trigger(sql, {\n name: \"flows_run_parents_gc\",\n table: \"flows_runs\",\n event: \"AFTER DELETE\",\n body: \"DELETE FROM flows_run_parents WHERE child_id = OLD.run_id OR parent_id = OLD.run_id;\"\n })\n yield* sql`ALTER TABLE flows_runs ADD COLUMN execution_parent_id TEXT`\n yield* sql`ALTER TABLE flows_runs ADD COLUMN execution_flow TEXT\n GENERATED ALWAYS AS (${Dialect.jsonText(sql, sql`state_json`, \"$.flowName\")}) ${\n sql.literal(Dialect.isPostgres(sql) ? \"STORED\" : \"VIRTUAL\")\n }`\n yield* sql`ALTER TABLE flows_runs ADD COLUMN execution_lineage TEXT\n GENERATED ALWAYS AS (COALESCE(lineage_id, run_id)) ${sql.literal(Dialect.isPostgres(sql) ? \"STORED\" : \"VIRTUAL\")}`\n yield* sql`CREATE INDEX flows_runs_round_page_idx ON flows_runs (execution_lineage, COALESCE(round_ordinal, 0), run_id)`\n yield* Dialect.trigger(sql, {\n name: `flows_runs_creation_immutable`,\n table: `flows_runs`,\n event: \"BEFORE UPDATE OF created_at_ms\",\n when: `NEW.created_at_ms <> OLD.created_at_ms`,\n reject: \"execution creation key is immutable\"\n })\n yield* sql`UPDATE flows_runs SET execution_parent_id = COALESCE(parent_run_id,\n (SELECT parent_id FROM flows_run_parents WHERE child_id = run_id ORDER BY seq, parent_id LIMIT 1))`\n for (const operation of [\"INSERT\", \"UPDATE OF parent_run_id\"] as const) {\n yield* Dialect.trigger(sql, {\n name: `flows_runs_effective_parent_${operation === \"INSERT\" ? \"insert\" : \"update\"}`,\n table: \"flows_runs\",\n event: `AFTER ${operation}`,\n body: `\n UPDATE flows_runs SET execution_parent_id = COALESCE(NEW.parent_run_id,\n (SELECT parent_id FROM flows_run_parents WHERE child_id = NEW.run_id ORDER BY seq, parent_id LIMIT 1))\n WHERE run_id = NEW.run_id;\n `\n })\n }\n for (const operation of [\"INSERT\", \"UPDATE\", \"DELETE\"] as const) {\n const row = operation === \"DELETE\" ? \"OLD\" : \"NEW\"\n yield* Dialect.trigger(sql, {\n name: `flows_run_parents_revision_${operation.toLowerCase()}`,\n table: \"flows_run_parents\",\n event: `AFTER ${operation}`,\n body: `\n UPDATE flows_runs SET execution_parent_id = COALESCE(parent_run_id,\n (SELECT parent_id FROM flows_run_parents WHERE child_id = run_id ORDER BY seq, parent_id LIMIT 1))\n WHERE run_id = ${row}.child_id ${operation === \"UPDATE\" ? \"OR run_id = OLD.child_id\" : \"\"};\n `\n })\n }\n // Every subset of the five equality filters has its creation-order suffix.\n // This avoids rare combined predicates degrading to whole-history scans.\n const fields = [\"status\", \"execution_flow\", \"execution_parent_id\", \"execution_lineage\", \"waiting_reason\"]\n for (let mask = 0; mask < 32; mask++) {\n const columns = fields.filter((_, index) => (mask & (1 << index)) !== 0)\n yield* sql.unsafe(`CREATE INDEX flows_runs_listing_${mask} ON flows_runs\n (${[...columns, \"created_at_ms\", \"run_id\"].join(\", \")})`)\n }\n})\n"]}
1
+ {"version":3,"file":"0006_execution_listing.js","sourceRoot":"","sources":["../../../src/migrations/0006_execution_listing.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Indexed engine execution observation and ordering.\n *\n * @since 1.0.0\n */\n\nimport * as Dialect from \"@smthrs/database/Dialect\"\nimport * as Effect from \"effect/Effect\"\nimport * as SqlClient from \"effect/sql/SqlClient\"\n\n/**\n * Brings existing spawn edges into the migration ladder and binds changes to\n * their child's run revision. Run-store owns the shared revision triggers.\n * @category migrations\n * @since 1.0.0\n */\nexport const executionListing: Effect.Effect<void, unknown, SqlClient.SqlClient> = Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n yield* sql`CREATE TABLE IF NOT EXISTS flows_run_parents (\n child_id TEXT NOT NULL CHECK (length(child_id) > 0),\n parent_id TEXT NOT NULL CHECK (length(parent_id) > 0),\n seq ${Dialect.integer(sql)} NOT NULL CHECK (${\n Dialect.isInteger(sql, sql`seq`)\n } AND seq >= 0 AND seq <= 9007199254740991),\n PRIMARY KEY (child_id, parent_id)\n )`\n yield* sql`CREATE INDEX IF NOT EXISTS flows_run_parents_parent_idx ON flows_run_parents (parent_id)`\n yield* sql`CREATE INDEX flows_run_parents_first_idx ON flows_run_parents (child_id, seq, parent_id)`\n yield* sql`CREATE INDEX flows_run_parents_children_idx ON flows_run_parents (parent_id, seq, child_id)`\n yield* Dialect.trigger(sql, {\n name: \"flows_run_parents_gc\",\n table: \"flows_runs\",\n event: \"AFTER DELETE\",\n body: \"DELETE FROM flows_run_parents WHERE child_id = OLD.run_id OR parent_id = OLD.run_id;\"\n })\n yield* sql`ALTER TABLE flows_runs ADD COLUMN execution_parent_id TEXT`\n yield* sql`ALTER TABLE flows_runs ADD COLUMN execution_flow TEXT\n GENERATED ALWAYS AS (${Dialect.jsonText(sql, sql`state_json`, \"$.flowName\")}) ${\n sql.literal(Dialect.isPostgres(sql) ? \"STORED\" : \"VIRTUAL\")\n }`\n yield* sql`ALTER TABLE flows_runs ADD COLUMN execution_lineage TEXT\n GENERATED ALWAYS AS (COALESCE(lineage_id, run_id)) ${sql.literal(Dialect.isPostgres(sql) ? \"STORED\" : \"VIRTUAL\")}`\n yield* sql`CREATE INDEX flows_runs_round_page_idx ON flows_runs (execution_lineage, COALESCE(round_ordinal, 0), run_id)`\n yield* Dialect.trigger(sql, {\n name: `flows_runs_creation_immutable`,\n table: `flows_runs`,\n event: \"BEFORE UPDATE OF created_at_ms\",\n when: `NEW.created_at_ms <> OLD.created_at_ms`,\n reject: \"execution creation key is immutable\"\n })\n yield* sql`UPDATE flows_runs SET execution_parent_id = COALESCE(parent_run_id,\n (SELECT parent_id FROM flows_run_parents WHERE child_id = run_id ORDER BY seq, parent_id LIMIT 1))`\n for (const operation of [\"INSERT\", \"UPDATE OF parent_run_id\"] as const) {\n yield* Dialect.trigger(sql, {\n name: `flows_runs_effective_parent_${operation === \"INSERT\" ? \"insert\" : \"update\"}`,\n table: \"flows_runs\",\n event: `AFTER ${operation}`,\n body: `\n UPDATE flows_runs SET execution_parent_id = COALESCE(NEW.parent_run_id,\n (SELECT parent_id FROM flows_run_parents WHERE child_id = NEW.run_id ORDER BY seq, parent_id LIMIT 1))\n WHERE run_id = NEW.run_id;\n `\n })\n }\n for (const operation of [\"INSERT\", \"UPDATE\", \"DELETE\"] as const) {\n const row = operation === \"DELETE\" ? \"OLD\" : \"NEW\"\n yield* Dialect.trigger(sql, {\n name: `flows_run_parents_revision_${operation.toLowerCase()}`,\n table: \"flows_run_parents\",\n event: `AFTER ${operation}`,\n body: `\n UPDATE flows_runs SET execution_parent_id = COALESCE(parent_run_id,\n (SELECT parent_id FROM flows_run_parents WHERE child_id = run_id ORDER BY seq, parent_id LIMIT 1))\n WHERE run_id = ${row}.child_id ${operation === \"UPDATE\" ? \"OR run_id = OLD.child_id\" : \"\"};\n `\n })\n }\n // Every subset of the five equality filters has its creation-order suffix.\n // This avoids rare combined predicates degrading to whole-history scans.\n const fields = [\"status\", \"execution_flow\", \"execution_parent_id\", \"execution_lineage\", \"waiting_reason\"]\n for (let mask = 0; mask < 32; mask++) {\n const columns = fields.filter((_, index) => (mask & (1 << index)) !== 0)\n yield* sql.unsafe(`CREATE INDEX flows_runs_listing_${mask} ON flows_runs\n (${[...columns, \"created_at_ms\", \"run_id\"].join(\", \")})`)\n }\n})\n"]}
@@ -4,7 +4,7 @@
4
4
  * @since 1.0.0
5
5
  */
6
6
  import * as Effect from "effect/Effect";
7
- import * as SqlClient from "effect/unstable/sql/SqlClient";
7
+ import * as SqlClient from "effect/sql/SqlClient";
8
8
  /**
9
9
  * Supports MAX(seq) without scanning retained edges from unrelated runs.
10
10
  *
@@ -1 +1 @@
1
- {"version":3,"file":"0007_run_parent_sequence.d.ts","sourceRoot":"","sources":["../../../src/migrations/0007_run_parent_sequence.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAE1D;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,SAAS,CAG9E,CAAA"}
1
+ {"version":3,"file":"0007_run_parent_sequence.d.ts","sourceRoot":"","sources":["../../../src/migrations/0007_run_parent_sequence.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AAEjD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,SAAS,CAG9E,CAAA"}
@@ -4,7 +4,7 @@
4
4
  * @since 1.0.0
5
5
  */
6
6
  import * as Effect from "effect/Effect";
7
- import * as SqlClient from "effect/unstable/sql/SqlClient";
7
+ import * as SqlClient from "effect/sql/SqlClient";
8
8
  /**
9
9
  * Supports MAX(seq) without scanning retained edges from unrelated runs.
10
10
  *
@@ -1 +1 @@
1
- {"version":3,"file":"0007_run_parent_sequence.js","sourceRoot":"","sources":["../../../src/migrations/0007_run_parent_sequence.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAE1D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAsD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACtG,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAA;IACtC,KAAK,CAAC,CAAC,GAAG,CAAA,mEAAmE,CAAA;AAC/E,CAAC,CAAC,CAAA","sourcesContent":["/**\n * Indexed allocation of the global run-parent sequence.\n *\n * @since 1.0.0\n */\n\nimport * as Effect from \"effect/Effect\"\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\"\n\n/**\n * Supports MAX(seq) without scanning retained edges from unrelated runs.\n *\n * @category migrations\n * @since 1.0.0\n */\nexport const runParentSequence: Effect.Effect<void, unknown, SqlClient.SqlClient> = Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n yield* sql`CREATE INDEX flows_run_parents_seq_idx ON flows_run_parents (seq)`\n})\n"]}
1
+ {"version":3,"file":"0007_run_parent_sequence.js","sourceRoot":"","sources":["../../../src/migrations/0007_run_parent_sequence.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AAEjD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAsD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACtG,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAA;IACtC,KAAK,CAAC,CAAC,GAAG,CAAA,mEAAmE,CAAA;AAC/E,CAAC,CAAC,CAAA","sourcesContent":["/**\n * Indexed allocation of the global run-parent sequence.\n *\n * @since 1.0.0\n */\n\nimport * as Effect from \"effect/Effect\"\nimport * as SqlClient from \"effect/sql/SqlClient\"\n\n/**\n * Supports MAX(seq) without scanning retained edges from unrelated runs.\n *\n * @category migrations\n * @since 1.0.0\n */\nexport const runParentSequence: Effect.Effect<void, unknown, SqlClient.SqlClient> = Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n yield* sql`CREATE INDEX flows_run_parents_seq_idx ON flows_run_parents (seq)`\n})\n"]}
@@ -4,7 +4,7 @@
4
4
  * @since 1.0.0
5
5
  */
6
6
  import * as Effect from "effect/Effect";
7
- import * as SqlClient from "effect/unstable/sql/SqlClient";
7
+ import * as SqlClient from "effect/sql/SqlClient";
8
8
  /**
9
9
  * Retains completion values for replay while removing consumed rows from sweeps.
10
10
  * Existing completions stay eligible until first read by the upgraded engine.
@@ -1 +1 @@
1
- {"version":3,"file":"0008_deferred_consumption.d.ts","sourceRoot":"","sources":["../../../src/migrations/0008_deferred_consumption.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAE1D;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,SAAS,CAShF,CAAA"}
1
+ {"version":3,"file":"0008_deferred_consumption.d.ts","sourceRoot":"","sources":["../../../src/migrations/0008_deferred_consumption.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AAEjD;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,SAAS,CAShF,CAAA"}
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import * as Dialect from "@smthrs/database/Dialect";
7
7
  import * as Effect from "effect/Effect";
8
- import * as SqlClient from "effect/unstable/sql/SqlClient";
8
+ import * as SqlClient from "effect/sql/SqlClient";
9
9
  /**
10
10
  * Retains completion values for replay while removing consumed rows from sweeps.
11
11
  * Existing completions stay eligible until first read by the upgraded engine.
@@ -1 +1 @@
1
- {"version":3,"file":"0008_deferred_consumption.js","sourceRoot":"","sources":["../../../src/migrations/0008_deferred_consumption.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAA;AACnD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAE1D;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAsD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACxG,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAA;IACtC,KAAK,CAAC,CAAC,GAAG,CAAA,oEAAoE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;wCAEhG,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,gBAAgB,CAC5C,mEAAmE,CAAA;IACnE,KAAK,CAAC,CAAC,GAAG,CAAA;;iCAEqB,CAAA;AACjC,CAAC,CAAC,CAAA","sourcesContent":["/**\n * Registration recovery only needs completions the run has not observed.\n *\n * @since 1.0.0\n */\n\nimport * as Dialect from \"@smthrs/database/Dialect\"\nimport * as Effect from \"effect/Effect\"\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\"\n\n/**\n * Retains completion values for replay while removing consumed rows from sweeps.\n * Existing completions stay eligible until first read by the upgraded engine.\n *\n * @category migrations\n * @since 1.0.0\n */\nexport const deferredConsumption: Effect.Effect<void, unknown, SqlClient.SqlClient> = Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n yield* sql`ALTER TABLE flows_deferred_completions ADD COLUMN consumed_at_ms ${Dialect.integer(sql)}\n CHECK (consumed_at_ms IS NULL OR (${\n Dialect.isInteger(sql, sql`consumed_at_ms`)\n } AND consumed_at_ms >= 0 AND consumed_at_ms <= 9007199254740991))`\n yield* sql`CREATE INDEX flows_deferred_completions_unconsumed_idx\n ON flows_deferred_completions (flow_name, execution_id, deferred_name)\n WHERE consumed_at_ms IS NULL`\n})\n"]}
1
+ {"version":3,"file":"0008_deferred_consumption.js","sourceRoot":"","sources":["../../../src/migrations/0008_deferred_consumption.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAA;AACnD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AAEjD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAsD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACxG,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAA;IACtC,KAAK,CAAC,CAAC,GAAG,CAAA,oEAAoE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;wCAEhG,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,gBAAgB,CAC5C,mEAAmE,CAAA;IACnE,KAAK,CAAC,CAAC,GAAG,CAAA;;iCAEqB,CAAA;AACjC,CAAC,CAAC,CAAA","sourcesContent":["/**\n * Registration recovery only needs completions the run has not observed.\n *\n * @since 1.0.0\n */\n\nimport * as Dialect from \"@smthrs/database/Dialect\"\nimport * as Effect from \"effect/Effect\"\nimport * as SqlClient from \"effect/sql/SqlClient\"\n\n/**\n * Retains completion values for replay while removing consumed rows from sweeps.\n * Existing completions stay eligible until first read by the upgraded engine.\n *\n * @category migrations\n * @since 1.0.0\n */\nexport const deferredConsumption: Effect.Effect<void, unknown, SqlClient.SqlClient> = Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n yield* sql`ALTER TABLE flows_deferred_completions ADD COLUMN consumed_at_ms ${Dialect.integer(sql)}\n CHECK (consumed_at_ms IS NULL OR (${\n Dialect.isInteger(sql, sql`consumed_at_ms`)\n } AND consumed_at_ms >= 0 AND consumed_at_ms <= 9007199254740991))`\n yield* sql`CREATE INDEX flows_deferred_completions_unconsumed_idx\n ON flows_deferred_completions (flow_name, execution_id, deferred_name)\n WHERE consumed_at_ms IS NULL`\n})\n"]}
@@ -4,7 +4,7 @@
4
4
  * @since 1.0.0
5
5
  */
6
6
  import * as Effect from "effect/Effect";
7
- import * as SqlClient from "effect/unstable/sql/SqlClient";
7
+ import * as SqlClient from "effect/sql/SqlClient";
8
8
  /**
9
9
  * Journals every deferred/clock change written before the fold's records
10
10
  * existed: a clock row with no `clock-scheduled` record, a completed clock
@@ -1 +1 @@
1
- {"version":3,"file":"0009_deferred_clock_facts.d.ts","sourceRoot":"","sources":["../../../src/migrations/0009_deferred_clock_facts.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAwB1D;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,SAAS,CAkH/E,CAAA"}
1
+ {"version":3,"file":"0009_deferred_clock_facts.d.ts","sourceRoot":"","sources":["../../../src/migrations/0009_deferred_clock_facts.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AAwBjD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,SAAS,CAkH/E,CAAA"}
@@ -6,7 +6,7 @@
6
6
  import { FlowEngine } from "@smthrs/engine";
7
7
  import * as JournalEvent from "@smthrs/journal/JournalEvent";
8
8
  import * as Effect from "effect/Effect";
9
- import * as SqlClient from "effect/unstable/sql/SqlClient";
9
+ import * as SqlClient from "effect/sql/SqlClient";
10
10
  import { EventTypes } from "../EventTypes.js";
11
11
  const optionalTime = (value) => value === null ? null : Number(value);
12
12
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"0009_deferred_clock_facts.js","sourceRoot":"","sources":["../../../src/migrations/0009_deferred_clock_facts.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Backfills the journal records the deferred/clock fold reads.\n *\n * @since 1.0.0\n */\n\nimport { FlowEngine } from \"@smthrs/engine\"\nimport * as JournalEvent from \"@smthrs/journal/JournalEvent\"\nimport * as Effect from \"effect/Effect\"\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\"\nimport { EventTypes } from \"../EventTypes.ts\"\n\ninterface ClockRow {\n readonly flow_name: string\n readonly execution_id: string\n readonly clock_name: string\n readonly deferred_name: string\n readonly due_at_ms: number | string\n readonly completed_at_ms: number | string | null\n}\n\ninterface DeferredRow {\n readonly flow_name: string\n readonly execution_id: string\n readonly deferred_name: string\n readonly exit_json: string\n readonly metadata_json: string | null\n readonly completed_at_ms: number | string\n readonly consumed_at_ms: number | string | null\n}\n\nconst optionalTime = (value: number | string | null): number | null => value === null ? null : Number(value)\n\n/**\n * Journals every deferred/clock change written before the fold's records\n * existed: a clock row with no `clock-scheduled` record, a completed clock\n * with no `clock-completed` record, a completion with no `deferred-completed`\n * record, and a consumed completion with no `deferred-consumed` record. Without\n * them a rebuild would drop the clock, or re-arm a completed one and wake a run\n * for a result it already observed (issue #2037).\n *\n * Each backfilled record is appended at the run's next sequence under a\n * `flows.engine.backfill:` producer whose identity names the row, with the\n * lineage meta every engine record carries.\n *\n * @category migrations\n * @since 1.0.0\n */\nexport const deferredClockFacts: Effect.Effect<void, unknown, SqlClient.SqlClient> = Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n const recorded = new Set<string>()\n const events = yield* sql<{ readonly run_id: string; readonly event_type: string; readonly payload_json: string }>`\n SELECT run_id, event_type, payload_json FROM flows_journal_events\n WHERE ${\n sql.in(\"event_type\", [\n EventTypes.clockScheduled,\n EventTypes.clockCompleted,\n EventTypes.deferredCompleted,\n EventTypes.deferredConsumed\n ])\n }\n `\n for (const event of events) {\n const payload = JSON.parse(event.payload_json) as Record<string, unknown>\n const name = event.event_type === EventTypes.clockScheduled || event.event_type === EventTypes.clockCompleted\n ? payload.clockName\n : payload.deferredName\n recorded.add(JSON.stringify([event.event_type, payload.flowName, payload.executionId, name]))\n }\n const next = new Map<string, number>()\n const append = (\n eventType: string,\n executionId: string,\n name: string,\n emittedAtMs: number,\n payload: Readonly<Record<string, unknown>>\n ) =>\n Effect.gen(function*() {\n const identity = JSON.stringify([eventType, payload.flowName, executionId, name])\n if (recorded.has(identity)) return\n recorded.add(identity)\n let seq = next.get(executionId)\n if (seq === undefined) {\n const rows = yield* sql<{ readonly next: number | string | null }>`\n SELECT MAX(seq) + 1 AS next FROM flows_journal_events WHERE run_id = ${executionId}\n `\n seq = Number(rows[0]?.next ?? 0)\n }\n next.set(executionId, seq + 1)\n const sourceId = `flows.engine.backfill:${JournalEvent.contentDigest(identity)}`\n yield* sql`\n INSERT INTO flows_journal_events (\n run_id, seq, event_id, source_id, source_seq, emitted_at_ms, event_type, payload_json, meta_json\n ) VALUES (\n ${executionId},\n ${seq},\n ${\n JournalEvent.makeEventId(\n executionId as JournalEvent.RunId,\n sourceId as JournalEvent.SourceId,\n 0 as JournalEvent.SourceSeq\n )\n },\n ${sourceId},\n ${0},\n ${emittedAtMs},\n ${eventType},\n ${JSON.stringify(payload)},\n ${JSON.stringify({ lineageId: FlowEngine.Lineage.root(executionId) })}\n )\n `\n })\n\n const clocks = yield* sql<ClockRow>`\n SELECT flow_name, execution_id, clock_name, deferred_name, due_at_ms, completed_at_ms\n FROM flows_clock_deadlines\n ORDER BY execution_id, flow_name, clock_name\n `\n for (const clock of clocks) {\n const dueAtMs = Number(clock.due_at_ms)\n const completedAtMs = optionalTime(clock.completed_at_ms)\n yield* append(EventTypes.clockScheduled, clock.execution_id, clock.clock_name, completedAtMs ?? dueAtMs, {\n flowName: clock.flow_name,\n executionId: clock.execution_id,\n clockName: clock.clock_name,\n deferredName: clock.deferred_name,\n dueAtMs\n })\n if (completedAtMs !== null) {\n yield* append(EventTypes.clockCompleted, clock.execution_id, clock.clock_name, completedAtMs, {\n flowName: clock.flow_name,\n executionId: clock.execution_id,\n clockName: clock.clock_name,\n completedAtMs\n })\n }\n }\n const deferreds = yield* sql<DeferredRow>`\n SELECT flow_name, execution_id, deferred_name, exit_json, metadata_json, completed_at_ms, consumed_at_ms\n FROM flows_deferred_completions\n ORDER BY execution_id, flow_name, deferred_name\n `\n for (const deferred of deferreds) {\n const completedAtMs = Number(deferred.completed_at_ms)\n const consumedAtMs = optionalTime(deferred.consumed_at_ms)\n yield* append(EventTypes.deferredCompleted, deferred.execution_id, deferred.deferred_name, completedAtMs, {\n flowName: deferred.flow_name,\n executionId: deferred.execution_id,\n deferredName: deferred.deferred_name,\n completedAtMs,\n exitDigest: JournalEvent.contentDigest(deferred.exit_json),\n metadataDigest: deferred.metadata_json === null ? null : JournalEvent.contentDigest(deferred.metadata_json)\n })\n if (consumedAtMs !== null) {\n yield* append(EventTypes.deferredConsumed, deferred.execution_id, deferred.deferred_name, consumedAtMs, {\n flowName: deferred.flow_name,\n executionId: deferred.execution_id,\n deferredName: deferred.deferred_name,\n consumedAtMs\n })\n }\n }\n})\n"]}
1
+ {"version":3,"file":"0009_deferred_clock_facts.js","sourceRoot":"","sources":["../../../src/migrations/0009_deferred_clock_facts.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,YAAY,MAAM,8BAA8B,CAAA;AAC5D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAqB7C,MAAM,YAAY,GAAG,CAAC,KAA6B,EAAiB,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAE5G;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAsD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACvG,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAA;IACtC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;IAClC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,GAAG,CAAyF;;YAGhH,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE;QACnB,UAAU,CAAC,cAAc;QACzB,UAAU,CAAC,cAAc;QACzB,UAAU,CAAC,iBAAiB;QAC5B,UAAU,CAAC,gBAAgB;KAC5B,CACH;GACC,CAAA;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAA4B,CAAA;QACzE,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,KAAK,UAAU,CAAC,cAAc,IAAI,KAAK,CAAC,UAAU,KAAK,UAAU,CAAC,cAAc;YAC3G,CAAC,CAAC,OAAO,CAAC,SAAS;YACnB,CAAC,CAAC,OAAO,CAAC,YAAY,CAAA;QACxB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;IAC/F,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAA;IACtC,MAAM,MAAM,GAAG,CACb,SAAiB,EACjB,WAAmB,EACnB,IAAY,EACZ,WAAmB,EACnB,OAA0C,EAC1C,EAAE,CACF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,CAAA;QACjF,IAAI,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAM;QAClC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACtB,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QAC/B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,CAA2C;iFACO,WAAW;SACnF,CAAA;YACD,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,CAAA;QAClC,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,CAAC,CAAA;QAC9B,MAAM,QAAQ,GAAG,yBAAyB,YAAY,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAA;QAChF,KAAK,CAAC,CAAC,GAAG,CAAA;;;;YAIJ,WAAW;YACX,GAAG;YAEP,YAAY,CAAC,WAAW,CACtB,WAAiC,EACjC,QAAiC,EACjC,CAA2B,CAE/B;YACM,QAAQ;YACR,CAAC;YACD,WAAW;YACX,SAAS;YACT,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YACvB,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;;OAExE,CAAA;IACH,CAAC,CAAC,CAAA;IAEJ,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,GAAG,CAAU;;;;GAIlC,CAAA;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QACvC,MAAM,aAAa,GAAG,YAAY,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;QACzD,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,cAAc,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,UAAU,EAAE,aAAa,IAAI,OAAO,EAAE;YACvG,QAAQ,EAAE,KAAK,CAAC,SAAS;YACzB,WAAW,EAAE,KAAK,CAAC,YAAY;YAC/B,SAAS,EAAE,KAAK,CAAC,UAAU;YAC3B,YAAY,EAAE,KAAK,CAAC,aAAa;YACjC,OAAO;SACR,CAAC,CAAA;QACF,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;YAC3B,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,cAAc,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,UAAU,EAAE,aAAa,EAAE;gBAC5F,QAAQ,EAAE,KAAK,CAAC,SAAS;gBACzB,WAAW,EAAE,KAAK,CAAC,YAAY;gBAC/B,SAAS,EAAE,KAAK,CAAC,UAAU;gBAC3B,aAAa;aACd,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IACD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,GAAG,CAAa;;;;GAIxC,CAAA;IACD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAA;QACtD,MAAM,YAAY,GAAG,YAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAA;QAC1D,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,iBAAiB,EAAE,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,aAAa,EAAE,aAAa,EAAE;YACxG,QAAQ,EAAE,QAAQ,CAAC,SAAS;YAC5B,WAAW,EAAE,QAAQ,CAAC,YAAY;YAClC,YAAY,EAAE,QAAQ,CAAC,aAAa;YACpC,aAAa;YACb,UAAU,EAAE,YAAY,CAAC,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC1D,cAAc,EAAE,QAAQ,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC;SAC5G,CAAC,CAAA;QACF,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,gBAAgB,EAAE,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,aAAa,EAAE,YAAY,EAAE;gBACtG,QAAQ,EAAE,QAAQ,CAAC,SAAS;gBAC5B,WAAW,EAAE,QAAQ,CAAC,YAAY;gBAClC,YAAY,EAAE,QAAQ,CAAC,aAAa;gBACpC,YAAY;aACb,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAA","sourcesContent":["/**\n * Backfills the journal records the deferred/clock fold reads.\n *\n * @since 1.0.0\n */\n\nimport { FlowEngine } from \"@smthrs/engine\"\nimport * as JournalEvent from \"@smthrs/journal/JournalEvent\"\nimport * as Effect from \"effect/Effect\"\nimport * as SqlClient from \"effect/sql/SqlClient\"\nimport { EventTypes } from \"../EventTypes.ts\"\n\ninterface ClockRow {\n readonly flow_name: string\n readonly execution_id: string\n readonly clock_name: string\n readonly deferred_name: string\n readonly due_at_ms: number | string\n readonly completed_at_ms: number | string | null\n}\n\ninterface DeferredRow {\n readonly flow_name: string\n readonly execution_id: string\n readonly deferred_name: string\n readonly exit_json: string\n readonly metadata_json: string | null\n readonly completed_at_ms: number | string\n readonly consumed_at_ms: number | string | null\n}\n\nconst optionalTime = (value: number | string | null): number | null => value === null ? null : Number(value)\n\n/**\n * Journals every deferred/clock change written before the fold's records\n * existed: a clock row with no `clock-scheduled` record, a completed clock\n * with no `clock-completed` record, a completion with no `deferred-completed`\n * record, and a consumed completion with no `deferred-consumed` record. Without\n * them a rebuild would drop the clock, or re-arm a completed one and wake a run\n * for a result it already observed (issue #2037).\n *\n * Each backfilled record is appended at the run's next sequence under a\n * `flows.engine.backfill:` producer whose identity names the row, with the\n * lineage meta every engine record carries.\n *\n * @category migrations\n * @since 1.0.0\n */\nexport const deferredClockFacts: Effect.Effect<void, unknown, SqlClient.SqlClient> = Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n const recorded = new Set<string>()\n const events = yield* sql<{ readonly run_id: string; readonly event_type: string; readonly payload_json: string }>`\n SELECT run_id, event_type, payload_json FROM flows_journal_events\n WHERE ${\n sql.in(\"event_type\", [\n EventTypes.clockScheduled,\n EventTypes.clockCompleted,\n EventTypes.deferredCompleted,\n EventTypes.deferredConsumed\n ])\n }\n `\n for (const event of events) {\n const payload = JSON.parse(event.payload_json) as Record<string, unknown>\n const name = event.event_type === EventTypes.clockScheduled || event.event_type === EventTypes.clockCompleted\n ? payload.clockName\n : payload.deferredName\n recorded.add(JSON.stringify([event.event_type, payload.flowName, payload.executionId, name]))\n }\n const next = new Map<string, number>()\n const append = (\n eventType: string,\n executionId: string,\n name: string,\n emittedAtMs: number,\n payload: Readonly<Record<string, unknown>>\n ) =>\n Effect.gen(function*() {\n const identity = JSON.stringify([eventType, payload.flowName, executionId, name])\n if (recorded.has(identity)) return\n recorded.add(identity)\n let seq = next.get(executionId)\n if (seq === undefined) {\n const rows = yield* sql<{ readonly next: number | string | null }>`\n SELECT MAX(seq) + 1 AS next FROM flows_journal_events WHERE run_id = ${executionId}\n `\n seq = Number(rows[0]?.next ?? 0)\n }\n next.set(executionId, seq + 1)\n const sourceId = `flows.engine.backfill:${JournalEvent.contentDigest(identity)}`\n yield* sql`\n INSERT INTO flows_journal_events (\n run_id, seq, event_id, source_id, source_seq, emitted_at_ms, event_type, payload_json, meta_json\n ) VALUES (\n ${executionId},\n ${seq},\n ${\n JournalEvent.makeEventId(\n executionId as JournalEvent.RunId,\n sourceId as JournalEvent.SourceId,\n 0 as JournalEvent.SourceSeq\n )\n },\n ${sourceId},\n ${0},\n ${emittedAtMs},\n ${eventType},\n ${JSON.stringify(payload)},\n ${JSON.stringify({ lineageId: FlowEngine.Lineage.root(executionId) })}\n )\n `\n })\n\n const clocks = yield* sql<ClockRow>`\n SELECT flow_name, execution_id, clock_name, deferred_name, due_at_ms, completed_at_ms\n FROM flows_clock_deadlines\n ORDER BY execution_id, flow_name, clock_name\n `\n for (const clock of clocks) {\n const dueAtMs = Number(clock.due_at_ms)\n const completedAtMs = optionalTime(clock.completed_at_ms)\n yield* append(EventTypes.clockScheduled, clock.execution_id, clock.clock_name, completedAtMs ?? dueAtMs, {\n flowName: clock.flow_name,\n executionId: clock.execution_id,\n clockName: clock.clock_name,\n deferredName: clock.deferred_name,\n dueAtMs\n })\n if (completedAtMs !== null) {\n yield* append(EventTypes.clockCompleted, clock.execution_id, clock.clock_name, completedAtMs, {\n flowName: clock.flow_name,\n executionId: clock.execution_id,\n clockName: clock.clock_name,\n completedAtMs\n })\n }\n }\n const deferreds = yield* sql<DeferredRow>`\n SELECT flow_name, execution_id, deferred_name, exit_json, metadata_json, completed_at_ms, consumed_at_ms\n FROM flows_deferred_completions\n ORDER BY execution_id, flow_name, deferred_name\n `\n for (const deferred of deferreds) {\n const completedAtMs = Number(deferred.completed_at_ms)\n const consumedAtMs = optionalTime(deferred.consumed_at_ms)\n yield* append(EventTypes.deferredCompleted, deferred.execution_id, deferred.deferred_name, completedAtMs, {\n flowName: deferred.flow_name,\n executionId: deferred.execution_id,\n deferredName: deferred.deferred_name,\n completedAtMs,\n exitDigest: JournalEvent.contentDigest(deferred.exit_json),\n metadataDigest: deferred.metadata_json === null ? null : JournalEvent.contentDigest(deferred.metadata_json)\n })\n if (consumedAtMs !== null) {\n yield* append(EventTypes.deferredConsumed, deferred.execution_id, deferred.deferred_name, consumedAtMs, {\n flowName: deferred.flow_name,\n executionId: deferred.execution_id,\n deferredName: deferred.deferred_name,\n consumedAtMs\n })\n }\n }\n})\n"]}
@@ -4,7 +4,7 @@
4
4
  * @since 1.0.0
5
5
  */
6
6
  import * as Effect from "effect/Effect";
7
- import * as SqlClient from "effect/unstable/sql/SqlClient";
7
+ import * as SqlClient from "effect/sql/SqlClient";
8
8
  /**
9
9
  * Bounds cleanup reads to requested pending rows.
10
10
  *
@@ -1 +1 @@
1
- {"version":3,"file":"0010_pending_cancellation.d.ts","sourceRoot":"","sources":["../../../src/migrations/0010_pending_cancellation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAE1D;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,SAAS,CAIhF,CAAA"}
1
+ {"version":3,"file":"0010_pending_cancellation.d.ts","sourceRoot":"","sources":["../../../src/migrations/0010_pending_cancellation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AAEjD;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,SAAS,CAIhF,CAAA"}
@@ -4,7 +4,7 @@
4
4
  * @since 1.0.0
5
5
  */
6
6
  import * as Effect from "effect/Effect";
7
- import * as SqlClient from "effect/unstable/sql/SqlClient";
7
+ import * as SqlClient from "effect/sql/SqlClient";
8
8
  /**
9
9
  * Bounds cleanup reads to requested pending rows.
10
10
  *
@@ -1 +1 @@
1
- {"version":3,"file":"0010_pending_cancellation.js","sourceRoot":"","sources":["../../../src/migrations/0010_pending_cancellation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAE1D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAsD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACxG,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAA;IACtC,KAAK,CAAC,CAAC,GAAG,CAAA;oEACwD,CAAA;AACpE,CAAC,CAAC,CAAA","sourcesContent":["/**\n * Indexed cancellation cleanup for admissions whose handler is unavailable.\n *\n * @since 1.0.0\n */\n\nimport * as Effect from \"effect/Effect\"\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\"\n\n/**\n * Bounds cleanup reads to requested pending rows.\n *\n * @category migrations\n * @since 1.0.0\n */\nexport const pendingCancellation: Effect.Effect<void, unknown, SqlClient.SqlClient> = Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n yield* sql`CREATE INDEX flows_runs_pending_cancel_idx ON flows_runs (created_at_ms, run_id)\n WHERE status = 'pending' AND cancel_requested_at_ms IS NOT NULL`\n})\n"]}
1
+ {"version":3,"file":"0010_pending_cancellation.js","sourceRoot":"","sources":["../../../src/migrations/0010_pending_cancellation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AAEjD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAsD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACxG,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAA;IACtC,KAAK,CAAC,CAAC,GAAG,CAAA;oEACwD,CAAA;AACpE,CAAC,CAAC,CAAA","sourcesContent":["/**\n * Indexed cancellation cleanup for admissions whose handler is unavailable.\n *\n * @since 1.0.0\n */\n\nimport * as Effect from \"effect/Effect\"\nimport * as SqlClient from \"effect/sql/SqlClient\"\n\n/**\n * Bounds cleanup reads to requested pending rows.\n *\n * @category migrations\n * @since 1.0.0\n */\nexport const pendingCancellation: Effect.Effect<void, unknown, SqlClient.SqlClient> = Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n yield* sql`CREATE INDEX flows_runs_pending_cancel_idx ON flows_runs (created_at_ms, run_id)\n WHERE status = 'pending' AND cancel_requested_at_ms IS NOT NULL`\n})\n"]}