@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.
- package/README.md +15 -15
- package/dist/cjs/ArtifactGc.d.ts +1 -1
- package/dist/cjs/ArtifactGc.d.ts.map +1 -1
- package/dist/cjs/ArtifactGc.js +1 -1
- package/dist/cjs/ArtifactGc.js.map +1 -1
- package/dist/cjs/DeferredClockFold.d.ts +4 -4
- package/dist/cjs/DeferredClockFold.d.ts.map +1 -1
- package/dist/cjs/DeferredClockFold.js +1 -1
- package/dist/cjs/DeferredClockFold.js.map +1 -1
- package/dist/cjs/DisasterRecovery.d.ts +1 -1
- package/dist/cjs/DisasterRecovery.d.ts.map +1 -1
- package/dist/cjs/DisasterRecovery.js +1 -1
- package/dist/cjs/DisasterRecovery.js.map +1 -1
- package/dist/cjs/DurableEngineState.d.ts +1 -1
- package/dist/cjs/DurableEngineState.d.ts.map +1 -1
- package/dist/cjs/DurableEngineState.js +1 -1
- package/dist/cjs/DurableEngineState.js.map +1 -1
- package/dist/cjs/ExecutionSnapshot.d.ts +2 -2
- package/dist/cjs/ExecutionSnapshot.d.ts.map +1 -1
- package/dist/cjs/ExecutionSnapshot.js +1 -1
- package/dist/cjs/ExecutionSnapshot.js.map +1 -1
- package/dist/cjs/Migrations.d.ts +2 -2
- package/dist/cjs/Migrations.d.ts.map +1 -1
- package/dist/cjs/OwnerIdentity.js +1 -1
- package/dist/cjs/OwnerIdentity.js.map +2 -2
- package/dist/cjs/PlanInputStore.d.ts +1 -1
- package/dist/cjs/PlanInputStore.d.ts.map +1 -1
- package/dist/cjs/PlanInputStore.js +1 -1
- package/dist/cjs/PlanInputStore.js.map +1 -1
- package/dist/cjs/PlanMergeStore.d.ts +1 -1
- package/dist/cjs/PlanMergeStore.d.ts.map +1 -1
- package/dist/cjs/PlanMergeStore.js +1 -1
- package/dist/cjs/PlanMergeStore.js.map +1 -1
- package/dist/cjs/Retention.d.ts +2 -2
- package/dist/cjs/Retention.d.ts.map +1 -1
- package/dist/cjs/Retention.js +1 -1
- package/dist/cjs/Retention.js.map +1 -1
- package/dist/cjs/RunChangeFeed.d.ts +1 -1
- package/dist/cjs/RunChangeFeed.d.ts.map +1 -1
- package/dist/cjs/RunChangeFeed.js +1 -1
- package/dist/cjs/RunChangeFeed.js.map +1 -1
- package/dist/cjs/SelectionStore.d.ts +1 -1
- package/dist/cjs/SelectionStore.d.ts.map +1 -1
- package/dist/cjs/SelectionStore.js +1 -1
- package/dist/cjs/SelectionStore.js.map +1 -1
- package/dist/cjs/StepBoundary.d.ts +8 -6
- package/dist/cjs/StepBoundary.d.ts.map +1 -1
- package/dist/cjs/StepBoundary.js +13 -10
- package/dist/cjs/StepBoundary.js.map +2 -2
- package/dist/cjs/StepCacheFold.d.ts +2 -2
- package/dist/cjs/StepCacheFold.d.ts.map +1 -1
- package/dist/cjs/StepCacheFold.js +1 -1
- package/dist/cjs/StepCacheFold.js.map +1 -1
- package/dist/cjs/internal/EngineStateSchema.d.ts +1 -1
- package/dist/cjs/internal/EngineStateSchema.d.ts.map +1 -1
- package/dist/cjs/internal/EngineStateSchema.js.map +1 -1
- package/dist/cjs/internal/ExecutionSnapshotRead.d.ts +3 -3
- package/dist/cjs/internal/ExecutionSnapshotRead.d.ts.map +1 -1
- package/dist/cjs/internal/ExecutionSnapshotRead.js.map +1 -1
- package/dist/cjs/internal/ExecutionSnapshotRelations.d.ts +1 -1
- package/dist/cjs/internal/ExecutionSnapshotRelations.d.ts.map +1 -1
- package/dist/cjs/internal/ExecutionSnapshotRelations.js.map +1 -1
- package/dist/cjs/internal/RetentionOps.d.ts +2 -2
- package/dist/cjs/internal/RetentionOps.d.ts.map +1 -1
- package/dist/cjs/internal/RetentionOps.js +1 -1
- package/dist/cjs/internal/RetentionOps.js.map +1 -1
- package/dist/cjs/internal/RunCatalogOps.d.ts +1 -1
- package/dist/cjs/internal/RunCatalogOps.d.ts.map +1 -1
- package/dist/cjs/internal/RunCatalogOps.js +1 -1
- package/dist/cjs/internal/RunCatalogOps.js.map +1 -1
- package/dist/cjs/internal/RunListing.d.ts +1 -1
- package/dist/cjs/internal/RunListing.d.ts.map +1 -1
- package/dist/cjs/internal/RunListing.js +1 -1
- package/dist/cjs/internal/RunListing.js.map +1 -1
- package/dist/cjs/migrations/0001_initial.d.ts +1 -1
- package/dist/cjs/migrations/0001_initial.d.ts.map +1 -1
- package/dist/cjs/migrations/0001_initial.js +1 -1
- package/dist/cjs/migrations/0001_initial.js.map +1 -1
- package/dist/cjs/migrations/0002_selection_store.d.ts +1 -1
- package/dist/cjs/migrations/0002_selection_store.d.ts.map +1 -1
- package/dist/cjs/migrations/0002_selection_store.js +1 -1
- package/dist/cjs/migrations/0002_selection_store.js.map +1 -1
- package/dist/cjs/migrations/0003_plan_inputs.d.ts +1 -1
- package/dist/cjs/migrations/0003_plan_inputs.d.ts.map +1 -1
- package/dist/cjs/migrations/0003_plan_inputs.js +1 -1
- package/dist/cjs/migrations/0003_plan_inputs.js.map +1 -1
- package/dist/cjs/migrations/0004_plan_environment.d.ts +1 -1
- package/dist/cjs/migrations/0004_plan_environment.d.ts.map +1 -1
- package/dist/cjs/migrations/0004_plan_environment.js +1 -1
- package/dist/cjs/migrations/0004_plan_environment.js.map +1 -1
- package/dist/cjs/migrations/0005_plan_merges.d.ts +1 -1
- package/dist/cjs/migrations/0005_plan_merges.d.ts.map +1 -1
- package/dist/cjs/migrations/0005_plan_merges.js +1 -1
- package/dist/cjs/migrations/0005_plan_merges.js.map +1 -1
- package/dist/cjs/migrations/0006_execution_listing.d.ts +1 -1
- package/dist/cjs/migrations/0006_execution_listing.d.ts.map +1 -1
- package/dist/cjs/migrations/0006_execution_listing.js +1 -1
- package/dist/cjs/migrations/0006_execution_listing.js.map +1 -1
- package/dist/cjs/migrations/0007_run_parent_sequence.d.ts +1 -1
- package/dist/cjs/migrations/0007_run_parent_sequence.d.ts.map +1 -1
- package/dist/cjs/migrations/0007_run_parent_sequence.js +1 -1
- package/dist/cjs/migrations/0007_run_parent_sequence.js.map +1 -1
- package/dist/cjs/migrations/0008_deferred_consumption.d.ts +1 -1
- package/dist/cjs/migrations/0008_deferred_consumption.d.ts.map +1 -1
- package/dist/cjs/migrations/0008_deferred_consumption.js +1 -1
- package/dist/cjs/migrations/0008_deferred_consumption.js.map +1 -1
- package/dist/cjs/migrations/0009_deferred_clock_facts.d.ts +1 -1
- package/dist/cjs/migrations/0009_deferred_clock_facts.d.ts.map +1 -1
- package/dist/cjs/migrations/0009_deferred_clock_facts.js +1 -1
- package/dist/cjs/migrations/0009_deferred_clock_facts.js.map +1 -1
- package/dist/cjs/migrations/0010_pending_cancellation.d.ts +1 -1
- package/dist/cjs/migrations/0010_pending_cancellation.d.ts.map +1 -1
- package/dist/cjs/migrations/0010_pending_cancellation.js +1 -1
- package/dist/cjs/migrations/0010_pending_cancellation.js.map +1 -1
- package/dist/cjs/test/TestStores.d.ts +4 -4
- package/dist/cjs/test/TestStores.d.ts.map +1 -1
- package/dist/esm/ArtifactGc.d.ts +1 -1
- package/dist/esm/ArtifactGc.d.ts.map +1 -1
- package/dist/esm/ArtifactGc.js +1 -1
- package/dist/esm/ArtifactGc.js.map +1 -1
- package/dist/esm/DeferredClockFold.d.ts +4 -4
- package/dist/esm/DeferredClockFold.d.ts.map +1 -1
- package/dist/esm/DeferredClockFold.js +1 -1
- package/dist/esm/DeferredClockFold.js.map +1 -1
- package/dist/esm/DisasterRecovery.d.ts +1 -1
- package/dist/esm/DisasterRecovery.d.ts.map +1 -1
- package/dist/esm/DisasterRecovery.js +1 -1
- package/dist/esm/DisasterRecovery.js.map +1 -1
- package/dist/esm/DurableEngineState.d.ts +1 -1
- package/dist/esm/DurableEngineState.d.ts.map +1 -1
- package/dist/esm/DurableEngineState.js +1 -1
- package/dist/esm/DurableEngineState.js.map +1 -1
- package/dist/esm/ExecutionSnapshot.d.ts +2 -2
- package/dist/esm/ExecutionSnapshot.d.ts.map +1 -1
- package/dist/esm/ExecutionSnapshot.js +1 -1
- package/dist/esm/ExecutionSnapshot.js.map +1 -1
- package/dist/esm/Migrations.d.ts +2 -2
- package/dist/esm/Migrations.d.ts.map +1 -1
- package/dist/esm/OwnerIdentity.js +1 -1
- package/dist/esm/OwnerIdentity.js.map +1 -1
- package/dist/esm/PlanInputStore.d.ts +1 -1
- package/dist/esm/PlanInputStore.d.ts.map +1 -1
- package/dist/esm/PlanInputStore.js +1 -1
- package/dist/esm/PlanInputStore.js.map +1 -1
- package/dist/esm/PlanMergeStore.d.ts +1 -1
- package/dist/esm/PlanMergeStore.d.ts.map +1 -1
- package/dist/esm/PlanMergeStore.js +1 -1
- package/dist/esm/PlanMergeStore.js.map +1 -1
- package/dist/esm/Retention.d.ts +2 -2
- package/dist/esm/Retention.d.ts.map +1 -1
- package/dist/esm/Retention.js +1 -1
- package/dist/esm/Retention.js.map +1 -1
- package/dist/esm/RunChangeFeed.d.ts +1 -1
- package/dist/esm/RunChangeFeed.d.ts.map +1 -1
- package/dist/esm/RunChangeFeed.js +1 -1
- package/dist/esm/RunChangeFeed.js.map +1 -1
- package/dist/esm/SelectionStore.d.ts +1 -1
- package/dist/esm/SelectionStore.d.ts.map +1 -1
- package/dist/esm/SelectionStore.js +1 -1
- package/dist/esm/SelectionStore.js.map +1 -1
- package/dist/esm/StepBoundary.d.ts +8 -6
- package/dist/esm/StepBoundary.d.ts.map +1 -1
- package/dist/esm/StepBoundary.js +20 -11
- package/dist/esm/StepBoundary.js.map +1 -1
- package/dist/esm/StepCacheFold.d.ts +2 -2
- package/dist/esm/StepCacheFold.d.ts.map +1 -1
- package/dist/esm/StepCacheFold.js +1 -1
- package/dist/esm/StepCacheFold.js.map +1 -1
- package/dist/esm/internal/EngineStateSchema.d.ts +1 -1
- package/dist/esm/internal/EngineStateSchema.d.ts.map +1 -1
- package/dist/esm/internal/EngineStateSchema.js.map +1 -1
- package/dist/esm/internal/ExecutionSnapshotRead.d.ts +3 -3
- package/dist/esm/internal/ExecutionSnapshotRead.d.ts.map +1 -1
- package/dist/esm/internal/ExecutionSnapshotRead.js.map +1 -1
- package/dist/esm/internal/ExecutionSnapshotRelations.d.ts +1 -1
- package/dist/esm/internal/ExecutionSnapshotRelations.d.ts.map +1 -1
- package/dist/esm/internal/ExecutionSnapshotRelations.js.map +1 -1
- package/dist/esm/internal/RetentionOps.d.ts +2 -2
- package/dist/esm/internal/RetentionOps.d.ts.map +1 -1
- package/dist/esm/internal/RetentionOps.js +1 -1
- package/dist/esm/internal/RetentionOps.js.map +1 -1
- package/dist/esm/internal/RunCatalogOps.d.ts +1 -1
- package/dist/esm/internal/RunCatalogOps.d.ts.map +1 -1
- package/dist/esm/internal/RunCatalogOps.js +1 -1
- package/dist/esm/internal/RunCatalogOps.js.map +1 -1
- package/dist/esm/internal/RunListing.d.ts +1 -1
- package/dist/esm/internal/RunListing.d.ts.map +1 -1
- package/dist/esm/internal/RunListing.js +1 -1
- package/dist/esm/internal/RunListing.js.map +1 -1
- package/dist/esm/migrations/0001_initial.d.ts +1 -1
- package/dist/esm/migrations/0001_initial.d.ts.map +1 -1
- package/dist/esm/migrations/0001_initial.js +1 -1
- package/dist/esm/migrations/0001_initial.js.map +1 -1
- package/dist/esm/migrations/0002_selection_store.d.ts +1 -1
- package/dist/esm/migrations/0002_selection_store.d.ts.map +1 -1
- package/dist/esm/migrations/0002_selection_store.js +1 -1
- package/dist/esm/migrations/0002_selection_store.js.map +1 -1
- package/dist/esm/migrations/0003_plan_inputs.d.ts +1 -1
- package/dist/esm/migrations/0003_plan_inputs.d.ts.map +1 -1
- package/dist/esm/migrations/0003_plan_inputs.js +1 -1
- package/dist/esm/migrations/0003_plan_inputs.js.map +1 -1
- package/dist/esm/migrations/0004_plan_environment.d.ts +1 -1
- package/dist/esm/migrations/0004_plan_environment.d.ts.map +1 -1
- package/dist/esm/migrations/0004_plan_environment.js +1 -1
- package/dist/esm/migrations/0004_plan_environment.js.map +1 -1
- package/dist/esm/migrations/0005_plan_merges.d.ts +1 -1
- package/dist/esm/migrations/0005_plan_merges.d.ts.map +1 -1
- package/dist/esm/migrations/0005_plan_merges.js +1 -1
- package/dist/esm/migrations/0005_plan_merges.js.map +1 -1
- package/dist/esm/migrations/0006_execution_listing.d.ts +1 -1
- package/dist/esm/migrations/0006_execution_listing.d.ts.map +1 -1
- package/dist/esm/migrations/0006_execution_listing.js +1 -1
- package/dist/esm/migrations/0006_execution_listing.js.map +1 -1
- package/dist/esm/migrations/0007_run_parent_sequence.d.ts +1 -1
- package/dist/esm/migrations/0007_run_parent_sequence.d.ts.map +1 -1
- package/dist/esm/migrations/0007_run_parent_sequence.js +1 -1
- package/dist/esm/migrations/0007_run_parent_sequence.js.map +1 -1
- package/dist/esm/migrations/0008_deferred_consumption.d.ts +1 -1
- package/dist/esm/migrations/0008_deferred_consumption.d.ts.map +1 -1
- package/dist/esm/migrations/0008_deferred_consumption.js +1 -1
- package/dist/esm/migrations/0008_deferred_consumption.js.map +1 -1
- package/dist/esm/migrations/0009_deferred_clock_facts.d.ts +1 -1
- package/dist/esm/migrations/0009_deferred_clock_facts.d.ts.map +1 -1
- package/dist/esm/migrations/0009_deferred_clock_facts.js +1 -1
- package/dist/esm/migrations/0009_deferred_clock_facts.js.map +1 -1
- package/dist/esm/migrations/0010_pending_cancellation.d.ts +1 -1
- package/dist/esm/migrations/0010_pending_cancellation.d.ts.map +1 -1
- package/dist/esm/migrations/0010_pending_cancellation.js +1 -1
- package/dist/esm/migrations/0010_pending_cancellation.js.map +1 -1
- package/dist/esm/test/TestStores.d.ts +4 -4
- package/dist/esm/test/TestStores.d.ts.map +1 -1
- package/docs/api.md +19 -16
- package/package.json +22 -22
- package/src/ArtifactGc.ts +1 -1
- package/src/DeferredClockFold.ts +1 -1
- package/src/DisasterRecovery.ts +1 -1
- package/src/DurableEngineState.ts +1 -1
- package/src/ExecutionSnapshot.ts +1 -1
- package/src/OwnerIdentity.ts +1 -1
- package/src/PlanInputStore.ts +1 -1
- package/src/PlanMergeStore.ts +1 -1
- package/src/Retention.ts +2 -2
- package/src/RunChangeFeed.ts +1 -1
- package/src/SelectionStore.ts +1 -1
- package/src/StepBoundary.ts +32 -17
- package/src/StepCacheFold.ts +1 -1
- package/src/internal/EngineStateSchema.ts +1 -1
- package/src/internal/ExecutionSnapshotRead.ts +1 -1
- package/src/internal/ExecutionSnapshotRelations.ts +1 -1
- package/src/internal/RetentionOps.ts +2 -2
- package/src/internal/RunCatalogOps.ts +1 -1
- package/src/internal/RunListing.ts +1 -1
- package/src/migrations/0001_initial.ts +1 -1
- package/src/migrations/0002_selection_store.ts +1 -1
- package/src/migrations/0003_plan_inputs.ts +1 -1
- package/src/migrations/0004_plan_environment.ts +1 -1
- package/src/migrations/0005_plan_merges.ts +1 -1
- package/src/migrations/0006_execution_listing.ts +1 -1
- package/src/migrations/0007_run_parent_sequence.ts +1 -1
- package/src/migrations/0008_deferred_consumption.ts +1 -1
- package/src/migrations/0009_deferred_clock_facts.ts +1 -1
- package/src/migrations/0010_pending_cancellation.ts +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/internal/RunCatalogOps.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * The workspace run catalog read.\n *\n * `@smthrs/sync` serves a workspace subscription over a `RunCatalog`, and\n * every implementation of that service was static (`layerStatic`,\n * `layerNoop`) or in-process (`makeMemory`, which hears only about runs the\n * same process registered). A follower composed against any of them saw the\n * runs that existed when it started and never learned of another run, so a\n * second engine writing to the same workspace was invisible to it. This\n * module is the durable half of the fix: the read that says which runs the\n * workspace has right now, taken from `flows_runs` itself.\n *\n * The read is a full set rather than a cursor tail, for one reason: retention\n * deletes runs. A follower that only ever appended what appeared after a\n * cursor would keep every collected run in its view forever and hold a\n * journal stream open for each one. Reading the set makes both directions\n * work, and the workspace's own bound keeps the cost of it flat.\n *\n * Nothing here polls. The interval belongs to the catalog that consumes this\n * read (`RunCatalog.makePolling` in `@smthrs/sync`), so the durable side has\n * no policy and no fiber of its own.\n *\n * @since 0.1.0\n */\n\nimport * as Context from \"effect/Context\"\nimport * as Effect from \"effect/Effect\"\nimport * as Layer from \"effect/Layer\"\nimport * as SqlClient from \"effect/
|
|
4
|
+
"sourcesContent": ["/**\n * The workspace run catalog read.\n *\n * `@smthrs/sync` serves a workspace subscription over a `RunCatalog`, and\n * every implementation of that service was static (`layerStatic`,\n * `layerNoop`) or in-process (`makeMemory`, which hears only about runs the\n * same process registered). A follower composed against any of them saw the\n * runs that existed when it started and never learned of another run, so a\n * second engine writing to the same workspace was invisible to it. This\n * module is the durable half of the fix: the read that says which runs the\n * workspace has right now, taken from `flows_runs` itself.\n *\n * The read is a full set rather than a cursor tail, for one reason: retention\n * deletes runs. A follower that only ever appended what appeared after a\n * cursor would keep every collected run in its view forever and hold a\n * journal stream open for each one. Reading the set makes both directions\n * work, and the workspace's own bound keeps the cost of it flat.\n *\n * Nothing here polls. The interval belongs to the catalog that consumes this\n * read (`RunCatalog.makePolling` in `@smthrs/sync`), so the durable side has\n * no policy and no fiber of its own.\n *\n * @since 0.1.0\n */\n\nimport * as Context from \"effect/Context\"\nimport * as Effect from \"effect/Effect\"\nimport * as Layer from \"effect/Layer\"\nimport * as SqlClient from \"effect/sql/SqlClient\"\nimport * as RunListing from \"./RunListing.ts\"\nimport { RunCatalogError } from \"./RunListingError.ts\"\n\n/**\n * Stable error codes returned by the catalog read.\n *\n * @category models\n * @since 0.1.0\n */\nexport { RunCatalogErrorCode } from \"./RunListingError.ts\"\n\n/**\n * A catalog read that could not complete.\n *\n * `list_failed` means the workspace's run set could not be read. The caller\n * keeps whatever view it already had; the read is idempotent, so the next one\n * converges once the cause is fixed.\n *\n * @category errors\n * @since 0.1.0\n */\nexport { RunCatalogError } from \"./RunListingError.ts\"\n\n/**\n * Options for one catalog read.\n *\n * @category models\n * @since 0.1.0\n */\nexport interface ListOptions {\n /**\n * Largest number of runs the read returns. Defaults to\n * {@link defaultLimit}. A workspace with more runs than the bound is\n * followed by its most recent ones; an older run stays readable through a\n * run-scoped subscription, which names it directly.\n */\n readonly limit?: number | undefined\n}\n\n/**\n * The workspace's run set.\n *\n * @category models\n * @since 0.1.0\n */\nexport interface Service {\n /** Revision-consistent, filtered keyset page of execution rows. */\n readonly listRuns: RunListing.Service[\"listRuns\"]\n /**\n * Every run the workspace has, oldest first, bounded by the read. \"Oldest\"\n * is the run table's own row order, which is the order `RunStore.create`\n * inserted them: SQLite hands a new row an identifier above every one in\n * the table, and reuses one only after the highest is deleted, so deletion\n * by retention does not reorder what is left.\n */\n readonly listRunIds: (options?: ListOptions) => Effect.Effect<ReadonlyArray<string>, RunCatalogError>\n}\n\n/**\n * Service tag for the workspace run catalog read.\n *\n * @category services\n * @since 0.1.0\n */\nexport class RunCatalogRead extends Context.Service<RunCatalogRead, Service>()(\n \"@smthrs/engine-store/RunCatalogRead\"\n) {}\n\n/**\n * Runs one read returns when the caller names no bound. Large enough that an\n * ordinary workspace is returned whole, small enough that a workspace which\n * has never been collected does not hand a follower an unbounded list.\n *\n * @category constants\n * @since 0.1.0\n */\nexport const defaultLimit = 10_000\n\n/**\n * Builds the catalog read over the composition's own run table.\n *\n * The read goes to `flows_runs` directly, the way `DurableEngineState`,\n * `ArtifactGc`, and `RetentionOps` do: this package composes the run-store\n * migrations, so the schema is its own.\n *\n * @category constructors\n * @since 0.1.0\n */\nexport const make = (): Effect.Effect<Service, never, SqlClient.SqlClient> =>\n Effect.gen(function*() {\n const sql = yield* Effect.service(SqlClient.SqlClient)\n const listing = yield* RunListing.make()\n\n // Newest first by `rowid`, then reversed. `rowid` is the order the\n // workspace gained its runs, and reading it backwards walks the table's\n // own b-tree, so the bound costs one seek rather than a sort of every\n // run: `flows_runs` carries no index on `created_at_ms`, and two runs\n // created in the same millisecond do not order by it at all.\n //\n // `flows_runs` has a TEXT primary key, so its `rowid` is not an alias of\n // a declared column and SQLite documents that a rebuild may reassign it.\n // The order the rebuild leaves is what this read depends on, not the\n // numbers, and `VACUUM INTO` \u2014 the hot backup this release ships, and the\n // only rebuild in the supported path (the release policy) \u2014 preserves\n // it. `RunCatalogCatchUp.test.ts` pins that across a real backup and\n // reopen, including after retention has deleted rows out of the middle\n // and the end.\n const listRunIds: Service[\"listRunIds\"] = Effect.fn(\"RunCatalog.listRunIds\")((options?: ListOptions) =>\n Effect.gen(function*() {\n const limit = options?.limit ?? defaultLimit\n if (!Number.isSafeInteger(limit) || limit < 0) {\n return yield* Effect.fail(\n new RunCatalogError({\n code: \"invalid_options\",\n message: \"the run catalog limit must be a non-negative safe integer\"\n })\n )\n }\n return yield* sql<{ readonly run_id: string }>`\n SELECT run_id FROM flows_runs\n ORDER BY rowid DESC\n LIMIT ${limit}\n `.pipe(\n Effect.map((rows) => rows.map((row) => row.run_id).reverse()),\n Effect.mapError((cause) =>\n new RunCatalogError({\n code: \"list_failed\",\n message: \"the workspace run set could not be read\",\n cause\n })\n )\n )\n })\n )\n\n return { listRunIds, ...listing }\n })\n\n/**\n * Provides the workspace run catalog read.\n *\n * @category layers\n * @since 0.1.0\n */\nexport const layer: Layer.Layer<RunCatalogRead, never, SqlClient.SqlClient> = Layer.effect(RunCatalogRead)(make())\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBA,cAAyB;AACzB,aAAwB;AACxB,YAAuB;AACvB,gBAA2B;AAC3B,iBAA4B;AAC5B,6BAAgC;AAQhC,IAAAA,0BAAoC;AAYpC,IAAAA,0BAAgC;AA2CzB,MAAM,uBAAuB,QAAQ,QAAiC;AAAA,EAC3E;AACF,EAAE;AAAC;AAUI,MAAM,eAAe;AAYrB,MAAM,OAAO,MAClB,OAAO,IAAI,aAAY;AACrB,QAAM,MAAM,OAAO,OAAO,QAAQ,UAAU,SAAS;AACrD,QAAM,UAAU,OAAO,WAAW,KAAK;AAgBvC,QAAM,aAAoC,OAAO,GAAG,uBAAuB;AAAA,IAAE,CAAC,YAC5E,OAAO,IAAI,aAAY;AACrB,YAAM,QAAQ,SAAS,SAAS;AAChC,UAAI,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,GAAG;AAC7C,eAAO,OAAO,OAAO;AAAA,UACnB,IAAI,uCAAgB;AAAA,YAClB,MAAM;AAAA,YACN,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAAA,MACF;AACA,aAAO,OAAO;AAAA;AAAA;AAAA,kBAGJ,KAAK;AAAA,UACb;AAAA,QACA,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,QAAQ,IAAI,MAAM,EAAE,QAAQ,CAAC;AAAA,QAC5D,OAAO;AAAA,UAAS,CAAC,UACf,IAAI,uCAAgB;AAAA,YAClB,MAAM;AAAA,YACN,SAAS;AAAA,YACT;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,YAAY,GAAG,QAAQ;AAClC,CAAC;AAQI,MAAM,QAAiE,MAAM,OAAO,cAAc,EAAE,KAAK,CAAC;",
|
|
6
6
|
"names": ["import_RunListingError"]
|
|
7
7
|
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* @since 1.0.0
|
|
5
5
|
*/
|
|
6
6
|
import { Effect, Schema } from "effect";
|
|
7
|
-
import * as SqlClient from "effect/
|
|
7
|
+
import * as SqlClient from "effect/sql/SqlClient";
|
|
8
8
|
import * as Read from "./ExecutionSnapshotRead.ts";
|
|
9
9
|
import { RunCatalogError } from "./RunListingError.ts";
|
|
10
10
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RunListing.d.ts","sourceRoot":"","sources":["../../../src/internal/RunListing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAS,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC9C,OAAO,KAAK,SAAS,MAAM
|
|
1
|
+
{"version":3,"file":"RunListing.d.ts","sourceRoot":"","sources":["../../../src/internal/RunListing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAS,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC9C,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AACjD,OAAO,KAAK,IAAI,MAAM,4BAA4B,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD;;;;;GAKG;AACH,eAAO,MAAM,OAAO;;;;;;;;EAQlB,CAAA;AACF;;;;;GAKG;AACH,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AACzC;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CACxB;AACD;;;;;GAKG;AACH,MAAM,WAAW,OAAQ,SAAQ,IAAI,CAAC,QAAQ;IAC5C,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAC/B;AACD;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,eAAe,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,CAAA;CAC1F;AACD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,MAAM,CAAA;AAiBlC;;;;;GAKG;AACH,eAAO,MAAM,IAAI;yBA/Be,eAAe,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC;8BAkJvF,CAAA"}
|
|
@@ -36,7 +36,7 @@ module.exports = __toCommonJS(RunListing_exports);
|
|
|
36
36
|
var Dialect = __toESM(require("@smthrs/database/Dialect"), 1);
|
|
37
37
|
var import_RunStore = require("@smthrs/run-store/RunStore");
|
|
38
38
|
var import_effect = require("effect");
|
|
39
|
-
var SqlClient = __toESM(require("effect/
|
|
39
|
+
var SqlClient = __toESM(require("effect/sql/SqlClient"), 1);
|
|
40
40
|
var Read = __toESM(require("./ExecutionSnapshotRead.js"), 1);
|
|
41
41
|
var import_RunListingError = require("./RunListingError.js");
|
|
42
42
|
const Filters = import_effect.Schema.Struct({
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/internal/RunListing.ts"],
|
|
4
|
-
"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/
|
|
4
|
+
"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"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -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/
|
|
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
|
|
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"}
|
|
@@ -33,7 +33,7 @@ __export(initial_exports, {
|
|
|
33
33
|
module.exports = __toCommonJS(initial_exports);
|
|
34
34
|
var Dialect = __toESM(require("@smthrs/database/Dialect"), 1);
|
|
35
35
|
var Effect = __toESM(require("effect/Effect"), 1);
|
|
36
|
-
var SqlClient = __toESM(require("effect/
|
|
36
|
+
var SqlClient = __toESM(require("effect/sql/SqlClient"), 1);
|
|
37
37
|
const initial = Effect.gen(function* () {
|
|
38
38
|
const sql = yield* SqlClient.SqlClient;
|
|
39
39
|
yield* sql`CREATE TABLE flows_deferred_completions (
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/migrations/0001_initial.ts"],
|
|
4
|
-
"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/
|
|
4
|
+
"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"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,cAAyB;AACzB,aAAwB;AACxB,gBAA2B;AAQpB,MAAM,UAA6D,OAAO,IAAI,aAAY;AAC/F,QAAM,MAAM,OAAO,UAAU;AAE7B,SAAO;AAAA;AAAA;AAAA;AAAA,qCAI4B,QAAQ,UAAU,KAAK,cAAc,CAAC;AAAA,yDAClB,QAAQ,UAAU,KAAK,kBAAkB,CAAC;AAAA,sBAC7E,QAAQ,QAAQ,GAAG,CAAC,oBACtC,QAAQ,UAAU,KAAK,oBAAoB,CAC7C;AAAA;AAAA;AAAA;AAKA,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,gBAKO,QAAQ,QAAQ,GAAG,CAAC,oBAChC,QAAQ,UAAU,KAAK,cAAc,CACvC;AAAA,sBACoB,QAAQ,QAAQ,GAAG,CAAC,uCACtC,QAAQ,UAAU,KAAK,oBAAoB,CAC7C;AAAA;AAAA;AAAA;AAKA,SAAO;AACT,CAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -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
|
|
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"}
|
|
@@ -33,7 +33,7 @@ __export(selection_store_exports, {
|
|
|
33
33
|
module.exports = __toCommonJS(selection_store_exports);
|
|
34
34
|
var Dialect = __toESM(require("@smthrs/database/Dialect"), 1);
|
|
35
35
|
var Effect = __toESM(require("effect/Effect"), 1);
|
|
36
|
-
var SqlClient = __toESM(require("effect/
|
|
36
|
+
var SqlClient = __toESM(require("effect/sql/SqlClient"), 1);
|
|
37
37
|
const selectionStore = Effect.gen(function* () {
|
|
38
38
|
const sql = yield* SqlClient.SqlClient;
|
|
39
39
|
yield* sql`CREATE TABLE flows_selection_suspected_edges (
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/migrations/0002_selection_store.ts"],
|
|
4
|
-
"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/
|
|
4
|
+
"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"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,cAAyB;AACzB,aAAwB;AACxB,gBAA2B;AAQpB,MAAM,iBAAoE,OAAO,IAAI,aAAY;AACtG,QAAM,MAAM,OAAO,UAAU;AAE7B,SAAO;AAAA;AAAA;AAAA;AAAA,QAKL,IAAI,QAAQ,QAAQ,WAAW,GAAG,IAAI,SAAS,iEAAiE,CAClH;AAAA;AAAA;AAAA;AAAA,oBAIkB,QAAQ,QAAQ,GAAG,CAAC;AAAA,QAChC,QAAQ,UAAU,KAAK,kBAAkB,CAAC;AAAA;AAAA;AAAA;AAAA,yCAIT,QAAQ,UAAU,KAAK,kBAAkB,CAAC;AAAA;AAAA;AAGnF,CAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -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/
|
|
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
|
|
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"}
|
|
@@ -33,7 +33,7 @@ __export(plan_inputs_exports, {
|
|
|
33
33
|
module.exports = __toCommonJS(plan_inputs_exports);
|
|
34
34
|
var Dialect = __toESM(require("@smthrs/database/Dialect"), 1);
|
|
35
35
|
var Effect = __toESM(require("effect/Effect"), 1);
|
|
36
|
-
var SqlClient = __toESM(require("effect/
|
|
36
|
+
var SqlClient = __toESM(require("effect/sql/SqlClient"), 1);
|
|
37
37
|
const planInputs = Effect.gen(function* () {
|
|
38
38
|
const sql = yield* SqlClient.SqlClient;
|
|
39
39
|
yield* sql`CREATE TABLE flows_plan_input_legacy_runs (
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/migrations/0003_plan_inputs.ts"],
|
|
4
|
-
"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/
|
|
4
|
+
"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"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,cAAyB;AACzB,aAAwB;AACxB,gBAA2B;AAOpB,MAAM,aAAgE,OAAO,IAAI,aAAY;AAClG,QAAM,MAAM,OAAO,UAAU;AAC7B,SAAO;AAAA;AAAA;AAKP,SAAO;AAAA;AAEP,SAAO,QAAQ,QAAQ,KAAK;AAAA,IAC1B,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,EACV,CAAC;AACD,SAAO;AAAA;AAAA;AAAA;AAAA,iBAIQ,QAAQ,QAAQ,GAAG,CAAC,oBACjC,QAAQ,UAAU,KAAK,eAAe,CACxC;AAAA;AAAA;AAGA,SAAO;AACP,SAAO;AAAA;AAAA;AAAA,iBAGQ,QAAQ,QAAQ,GAAG,CAAC,oBACjC,QAAQ,UAAU,KAAK,eAAe,CACxC;AAAA,yCACuC,QAAQ,UAAU,KAAK,kBAAkB,CAAC;AAAA;AAAA;AAAA;AAIjF,SAAO,QAAQ,QAAQ,KAAK;AAAA,IAC1B,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,EACV,CAAC;AACD,SAAO,QAAQ,QAAQ,KAAK;AAAA,IAC1B,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA;AAAA,IAEN,QAAQ;AAAA,EACV,CAAC;AACD,aAAW,SAAS,CAAC,gCAAgC,0BAA0B,8BAA8B,GAAG;AAG9G,WAAO,QAAQ,QAAQ,KAAK;AAAA,MAC1B,MAAM,GAAG,KAAK;AAAA,MACd,OAAO,GAAG,KAAK;AAAA,MACf,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACF,CAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -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/
|
|
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
|
|
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"}
|
|
@@ -33,7 +33,7 @@ __export(plan_environment_exports, {
|
|
|
33
33
|
module.exports = __toCommonJS(plan_environment_exports);
|
|
34
34
|
var Dialect = __toESM(require("@smthrs/database/Dialect"), 1);
|
|
35
35
|
var Effect = __toESM(require("effect/Effect"), 1);
|
|
36
|
-
var SqlClient = __toESM(require("effect/
|
|
36
|
+
var SqlClient = __toESM(require("effect/sql/SqlClient"), 1);
|
|
37
37
|
const planEnvironment = Effect.gen(function* () {
|
|
38
38
|
const sql = yield* SqlClient.SqlClient;
|
|
39
39
|
yield* sql`ALTER TABLE flows_plan_input_heads ADD COLUMN environment_digest TEXT
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/migrations/0004_plan_environment.ts"],
|
|
4
|
-
"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/
|
|
4
|
+
"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"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,cAAyB;AACzB,aAAwB;AACxB,gBAA2B;AAQpB,MAAM,kBAAqE,OAAO,IAAI,aAAY;AACvG,QAAM,MAAM,OAAO,UAAU;AAC7B,SAAO;AAAA;AAEP,SAAO,QAAQ,QAAQ,KAAK;AAAA,IAC1B,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,CAAC;AACD,SAAO,QAAQ,QAAQ,KAAK;AAAA,IAC1B,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,CAAC;AACH,CAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -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/
|
|
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
|
|
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"}
|
|
@@ -33,7 +33,7 @@ __export(plan_merges_exports, {
|
|
|
33
33
|
module.exports = __toCommonJS(plan_merges_exports);
|
|
34
34
|
var Dialect = __toESM(require("@smthrs/database/Dialect"), 1);
|
|
35
35
|
var Effect = __toESM(require("effect/Effect"), 1);
|
|
36
|
-
var SqlClient = __toESM(require("effect/
|
|
36
|
+
var SqlClient = __toESM(require("effect/sql/SqlClient"), 1);
|
|
37
37
|
const planMerges = Effect.gen(function* () {
|
|
38
38
|
const sql = yield* SqlClient.SqlClient;
|
|
39
39
|
yield* sql`ALTER TABLE flows_plan_input_heads ADD COLUMN merge_state_version ${Dialect.integer(sql)}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/migrations/0005_plan_merges.ts"],
|
|
4
|
-
"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/
|
|
4
|
+
"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"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,cAAyB;AACzB,aAAwB;AACxB,gBAA2B;AAQpB,MAAM,aAAgE,OAAO,IAAI,aAAY;AAClG,QAAM,MAAM,OAAO,UAAU;AAC7B,SAAO,wEAAwE,QAAQ,QAAQ,GAAG,CAAC;AAAA;AAEnG,SAAO,QAAQ,QAAQ,KAAK;AAAA,IAC1B,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,CAAC;AACD,SAAO;AAAA;AAAA;AAAA,uCAG8B,QAAQ,UAAU,KAAK,gBAAgB,CAAC;AAAA;AAAA;AAAA;AAI7E,SAAO;AAAA;AAAA;AAAA,iBAGQ,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,QAAQ,UAAU,KAAK,eAAe,CAAC;AAAA;AAAA,2CAErD,QAAQ,UAAU,KAAK,oBAAoB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAMrF,aAAW,SAAS,CAAC,4BAA4B,8BAA8B,GAAG;AAChF,WAAO,QAAQ,QAAQ,KAAK;AAAA,MAC1B,MAAM,GAAG,KAAK;AAAA,MACd,OAAO,GAAG,KAAK;AAAA,MACf,OAAO;AAAA,MACP,QAAQ;AAAA,IACV,CAAC;AACD,WAAO,QAAQ,QAAQ,KAAK;AAAA,MAC1B,MAAM,GAAG,KAAK;AAAA,MACd,OAAO,GAAG,KAAK;AAAA,MACf,OAAO;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACF,CAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -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/
|
|
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
|
|
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"}
|
|
@@ -33,7 +33,7 @@ __export(execution_listing_exports, {
|
|
|
33
33
|
module.exports = __toCommonJS(execution_listing_exports);
|
|
34
34
|
var Dialect = __toESM(require("@smthrs/database/Dialect"), 1);
|
|
35
35
|
var Effect = __toESM(require("effect/Effect"), 1);
|
|
36
|
-
var SqlClient = __toESM(require("effect/
|
|
36
|
+
var SqlClient = __toESM(require("effect/sql/SqlClient"), 1);
|
|
37
37
|
const executionListing = Effect.gen(function* () {
|
|
38
38
|
const sql = yield* SqlClient.SqlClient;
|
|
39
39
|
yield* sql`CREATE TABLE IF NOT EXISTS flows_run_parents (
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/migrations/0006_execution_listing.ts"],
|
|
4
|
-
"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/
|
|
4
|
+
"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"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,cAAyB;AACzB,aAAwB;AACxB,gBAA2B;AAQpB,MAAM,mBAAsE,OAAO,IAAI,aAAY;AACxG,QAAM,MAAM,OAAO,UAAU;AAC7B,SAAO;AAAA;AAAA;AAAA,UAGC,QAAQ,QAAQ,GAAG,CAAC,oBAC1B,QAAQ,UAAU,KAAK,QAAQ,CACjC;AAAA;AAAA;AAGA,SAAO;AACP,SAAO;AACP,SAAO;AACP,SAAO,QAAQ,QAAQ,KAAK;AAAA,IAC1B,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,EACR,CAAC;AACD,SAAO;AACP,SAAO;AAAA,2BACkB,QAAQ,SAAS,KAAK,iBAAiB,YAAY,CAAC,KAC3E,IAAI,QAAQ,QAAQ,WAAW,GAAG,IAAI,WAAW,SAAS,CAC5D;AACA,SAAO;AAAA,yDACgD,IAAI,QAAQ,QAAQ,WAAW,GAAG,IAAI,WAAW,SAAS,CAAC;AAClH,SAAO;AACP,SAAO,QAAQ,QAAQ,KAAK;AAAA,IAC1B,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,CAAC;AACD,SAAO;AAAA;AAEP,aAAW,aAAa,CAAC,UAAU,yBAAyB,GAAY;AACtE,WAAO,QAAQ,QAAQ,KAAK;AAAA,MAC1B,MAAM,+BAA+B,cAAc,WAAW,WAAW,QAAQ;AAAA,MACjF,OAAO;AAAA,MACP,OAAO,SAAS,SAAS;AAAA,MACzB,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,IAKR,CAAC;AAAA,EACH;AACA,aAAW,aAAa,CAAC,UAAU,UAAU,QAAQ,GAAY;AAC/D,UAAM,MAAM,cAAc,WAAW,QAAQ;AAC7C,WAAO,QAAQ,QAAQ,KAAK;AAAA,MAC1B,MAAM,8BAA8B,UAAU,YAAY,CAAC;AAAA,MAC3D,OAAO;AAAA,MACP,OAAO,SAAS,SAAS;AAAA,MACzB,MAAM;AAAA;AAAA;AAAA,yBAGa,GAAG,aAAa,cAAc,WAAW,6BAA6B,EAAE;AAAA;AAAA,IAE7F,CAAC;AAAA,EACH;AAGA,QAAM,SAAS,CAAC,UAAU,kBAAkB,uBAAuB,qBAAqB,gBAAgB;AACxG,WAAS,OAAO,GAAG,OAAO,IAAI,QAAQ;AACpC,UAAM,UAAU,OAAO,OAAO,CAAC,GAAG,WAAW,OAAQ,KAAK,WAAY,CAAC;AACvE,WAAO,IAAI,OAAO,mCAAmC,IAAI;AAAA,SACpD,CAAC,GAAG,SAAS,iBAAiB,QAAQ,EAAE,KAAK,IAAI,CAAC,GAAG;AAAA,EAC5D;AACF,CAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -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
|
|
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"}
|
|
@@ -32,7 +32,7 @@ __export(run_parent_sequence_exports, {
|
|
|
32
32
|
});
|
|
33
33
|
module.exports = __toCommonJS(run_parent_sequence_exports);
|
|
34
34
|
var Effect = __toESM(require("effect/Effect"), 1);
|
|
35
|
-
var SqlClient = __toESM(require("effect/
|
|
35
|
+
var SqlClient = __toESM(require("effect/sql/SqlClient"), 1);
|
|
36
36
|
const runParentSequence = Effect.gen(function* () {
|
|
37
37
|
const sql = yield* SqlClient.SqlClient;
|
|
38
38
|
yield* sql`CREATE INDEX flows_run_parents_seq_idx ON flows_run_parents (seq)`;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/migrations/0007_run_parent_sequence.ts"],
|
|
4
|
-
"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/
|
|
4
|
+
"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"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,aAAwB;AACxB,gBAA2B;AAQpB,MAAM,oBAAuE,OAAO,IAAI,aAAY;AACzG,QAAM,MAAM,OAAO,UAAU;AAC7B,SAAO;AACT,CAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -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/
|
|
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
|
|
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"}
|
|
@@ -33,7 +33,7 @@ __export(deferred_consumption_exports, {
|
|
|
33
33
|
module.exports = __toCommonJS(deferred_consumption_exports);
|
|
34
34
|
var Dialect = __toESM(require("@smthrs/database/Dialect"), 1);
|
|
35
35
|
var Effect = __toESM(require("effect/Effect"), 1);
|
|
36
|
-
var SqlClient = __toESM(require("effect/
|
|
36
|
+
var SqlClient = __toESM(require("effect/sql/SqlClient"), 1);
|
|
37
37
|
const deferredConsumption = Effect.gen(function* () {
|
|
38
38
|
const sql = yield* SqlClient.SqlClient;
|
|
39
39
|
yield* sql`ALTER TABLE flows_deferred_completions ADD COLUMN consumed_at_ms ${Dialect.integer(sql)}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/migrations/0008_deferred_consumption.ts"],
|
|
4
|
-
"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/
|
|
4
|
+
"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"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,cAAyB;AACzB,aAAwB;AACxB,gBAA2B;AASpB,MAAM,sBAAyE,OAAO,IAAI,aAAY;AAC3G,QAAM,MAAM,OAAO,UAAU;AAC7B,SAAO,uEAAuE,QAAQ,QAAQ,GAAG,CAAC;AAAA,wCAEhG,QAAQ,UAAU,KAAK,mBAAmB,CAC5C;AACA,SAAO;AAAA;AAAA;AAGT,CAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -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/
|
|
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
|
|
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"}
|
|
@@ -34,7 +34,7 @@ module.exports = __toCommonJS(deferred_clock_facts_exports);
|
|
|
34
34
|
var import_engine = require("@smthrs/engine");
|
|
35
35
|
var JournalEvent = __toESM(require("@smthrs/journal/JournalEvent"), 1);
|
|
36
36
|
var Effect = __toESM(require("effect/Effect"), 1);
|
|
37
|
-
var SqlClient = __toESM(require("effect/
|
|
37
|
+
var SqlClient = __toESM(require("effect/sql/SqlClient"), 1);
|
|
38
38
|
var import_EventTypes = require("../EventTypes.js");
|
|
39
39
|
const optionalTime = (value) => value === null ? null : Number(value);
|
|
40
40
|
const deferredClockFacts = Effect.gen(function* () {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/migrations/0009_deferred_clock_facts.ts"],
|
|
4
|
-
"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/
|
|
4
|
+
"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"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|