@smthrs/engine-store 0.0.0-stage → 1.0.0-rc.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +247 -0
- package/LICENSE +21 -0
- package/README.md +146 -2
- package/dist/cjs/ArtifactGc.d.ts +235 -0
- package/dist/cjs/ArtifactGc.d.ts.map +1 -0
- package/dist/cjs/ArtifactGc.js +183 -0
- package/dist/cjs/ArtifactGc.js.map +7 -0
- package/dist/cjs/ArtifactSync.d.ts +164 -0
- package/dist/cjs/ArtifactSync.d.ts.map +1 -0
- package/dist/cjs/ArtifactSync.js +144 -0
- package/dist/cjs/ArtifactSync.js.map +7 -0
- package/dist/cjs/CacheSync.d.ts +112 -0
- package/dist/cjs/CacheSync.d.ts.map +1 -0
- package/dist/cjs/CacheSync.js +64 -0
- package/dist/cjs/CacheSync.js.map +7 -0
- package/dist/cjs/DeferredClockFold.d.ts +354 -0
- package/dist/cjs/DeferredClockFold.d.ts.map +1 -0
- package/dist/cjs/DeferredClockFold.js +335 -0
- package/dist/cjs/DeferredClockFold.js.map +7 -0
- package/dist/cjs/DisasterRecovery.d.ts +431 -0
- package/dist/cjs/DisasterRecovery.d.ts.map +1 -0
- package/dist/cjs/DisasterRecovery.js +453 -0
- package/dist/cjs/DisasterRecovery.js.map +7 -0
- package/dist/cjs/DurableEngineState.d.ts +776 -0
- package/dist/cjs/DurableEngineState.d.ts.map +1 -0
- package/dist/cjs/DurableEngineState.js +1536 -0
- package/dist/cjs/DurableEngineState.js.map +7 -0
- package/dist/cjs/EngineStore.d.ts +158 -0
- package/dist/cjs/EngineStore.d.ts.map +1 -0
- package/dist/cjs/EngineStore.js +398 -0
- package/dist/cjs/EngineStore.js.map +7 -0
- package/dist/cjs/EngineStoreMetrics.d.ts +276 -0
- package/dist/cjs/EngineStoreMetrics.d.ts.map +1 -0
- package/dist/cjs/EngineStoreMetrics.js +135 -0
- package/dist/cjs/EngineStoreMetrics.js.map +7 -0
- package/dist/cjs/Errors.d.ts +22 -0
- package/dist/cjs/Errors.d.ts.map +1 -0
- package/dist/cjs/Errors.js +39 -0
- package/dist/cjs/Errors.js.map +7 -0
- package/dist/cjs/EventTypes.d.ts +27 -0
- package/dist/cjs/EventTypes.d.ts.map +1 -0
- package/dist/cjs/EventTypes.js +37 -0
- package/dist/cjs/EventTypes.js.map +7 -0
- package/dist/cjs/ExecutionFacts.d.ts +59 -0
- package/dist/cjs/ExecutionFacts.d.ts.map +1 -0
- package/dist/cjs/ExecutionFacts.js +123 -0
- package/dist/cjs/ExecutionFacts.js.map +7 -0
- package/dist/cjs/ExecutionSnapshot.d.ts +117 -0
- package/dist/cjs/ExecutionSnapshot.d.ts.map +1 -0
- package/dist/cjs/ExecutionSnapshot.js +111 -0
- package/dist/cjs/ExecutionSnapshot.js.map +7 -0
- package/dist/cjs/Inconsistency.d.ts +154 -0
- package/dist/cjs/Inconsistency.d.ts.map +1 -0
- package/dist/cjs/Inconsistency.js +135 -0
- package/dist/cjs/Inconsistency.js.map +7 -0
- package/dist/cjs/Migrations.d.ts +56 -0
- package/dist/cjs/Migrations.d.ts.map +1 -0
- package/dist/cjs/Migrations.js +78 -0
- package/dist/cjs/Migrations.js.map +7 -0
- package/dist/cjs/OwnerIdentity.d.ts +91 -0
- package/dist/cjs/OwnerIdentity.d.ts.map +1 -0
- package/dist/cjs/OwnerIdentity.js +65 -0
- package/dist/cjs/OwnerIdentity.js.map +7 -0
- package/dist/cjs/PlanInputStore.d.ts +110 -0
- package/dist/cjs/PlanInputStore.d.ts.map +1 -0
- package/dist/cjs/PlanInputStore.js +224 -0
- package/dist/cjs/PlanInputStore.js.map +7 -0
- package/dist/cjs/PlanMergeStore.d.ts +113 -0
- package/dist/cjs/PlanMergeStore.d.ts.map +1 -0
- package/dist/cjs/PlanMergeStore.js +255 -0
- package/dist/cjs/PlanMergeStore.js.map +7 -0
- package/dist/cjs/PlanScheduler.d.ts +363 -0
- package/dist/cjs/PlanScheduler.d.ts.map +1 -0
- package/dist/cjs/PlanScheduler.js +1090 -0
- package/dist/cjs/PlanScheduler.js.map +7 -0
- package/dist/cjs/Reconciliation.d.ts +175 -0
- package/dist/cjs/Reconciliation.d.ts.map +1 -0
- package/dist/cjs/Reconciliation.js +119 -0
- package/dist/cjs/Reconciliation.js.map +7 -0
- package/dist/cjs/ReplayOnly.d.ts +91 -0
- package/dist/cjs/ReplayOnly.d.ts.map +1 -0
- package/dist/cjs/ReplayOnly.js +52 -0
- package/dist/cjs/ReplayOnly.js.map +7 -0
- package/dist/cjs/Retention.d.ts +113 -0
- package/dist/cjs/Retention.d.ts.map +1 -0
- package/dist/cjs/Retention.js +99 -0
- package/dist/cjs/Retention.js.map +7 -0
- package/dist/cjs/RunCatalogRead.d.ts +17 -0
- package/dist/cjs/RunCatalogRead.d.ts.map +1 -0
- package/dist/cjs/RunCatalogRead.js +33 -0
- package/dist/cjs/RunCatalogRead.js.map +7 -0
- package/dist/cjs/RunChangeFeed.d.ts +75 -0
- package/dist/cjs/RunChangeFeed.d.ts.map +1 -0
- package/dist/cjs/RunChangeFeed.js +96 -0
- package/dist/cjs/RunChangeFeed.js.map +7 -0
- package/dist/cjs/RunState.d.ts +116 -0
- package/dist/cjs/RunState.d.ts.map +1 -0
- package/dist/cjs/RunState.js +76 -0
- package/dist/cjs/RunState.js.map +7 -0
- package/dist/cjs/Selection.d.ts +495 -0
- package/dist/cjs/Selection.d.ts.map +1 -0
- package/dist/cjs/Selection.js +288 -0
- package/dist/cjs/Selection.js.map +7 -0
- package/dist/cjs/SelectionStore.d.ts +141 -0
- package/dist/cjs/SelectionStore.d.ts.map +1 -0
- package/dist/cjs/SelectionStore.js +229 -0
- package/dist/cjs/SelectionStore.js.map +7 -0
- package/dist/cjs/StepBoundary.d.ts +501 -0
- package/dist/cjs/StepBoundary.d.ts.map +1 -0
- package/dist/cjs/StepBoundary.js +619 -0
- package/dist/cjs/StepBoundary.js.map +7 -0
- package/dist/cjs/StepCacheFold.d.ts +148 -0
- package/dist/cjs/StepCacheFold.d.ts.map +1 -0
- package/dist/cjs/StepCacheFold.js +131 -0
- package/dist/cjs/StepCacheFold.js.map +7 -0
- package/dist/cjs/StepSandbox.d.ts +78 -0
- package/dist/cjs/StepSandbox.d.ts.map +1 -0
- package/dist/cjs/StepSandbox.js +75 -0
- package/dist/cjs/StepSandbox.js.map +7 -0
- package/dist/cjs/WakeBus.d.ts +116 -0
- package/dist/cjs/WakeBus.d.ts.map +1 -0
- package/dist/cjs/WakeBus.js +89 -0
- package/dist/cjs/WakeBus.js.map +7 -0
- package/dist/cjs/WorkspaceSandbox.d.ts +619 -0
- package/dist/cjs/WorkspaceSandbox.d.ts.map +1 -0
- package/dist/cjs/WorkspaceSandbox.js +711 -0
- package/dist/cjs/WorkspaceSandbox.js.map +7 -0
- package/dist/cjs/index.d.ts +157 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +95 -0
- package/dist/cjs/index.js.map +7 -0
- package/dist/cjs/internal/ActionPersistence.d.ts +276 -0
- package/dist/cjs/internal/ActionPersistence.d.ts.map +1 -0
- package/dist/cjs/internal/ActionPersistence.js +1395 -0
- package/dist/cjs/internal/ActionPersistence.js.map +7 -0
- package/dist/cjs/internal/ArtifactRoots.d.ts +38 -0
- package/dist/cjs/internal/ArtifactRoots.d.ts.map +1 -0
- package/dist/cjs/internal/ArtifactRoots.js +89 -0
- package/dist/cjs/internal/ArtifactRoots.js.map +7 -0
- package/dist/cjs/internal/AttemptAdmission.d.ts +53 -0
- package/dist/cjs/internal/AttemptAdmission.d.ts.map +1 -0
- package/dist/cjs/internal/AttemptAdmission.js +52 -0
- package/dist/cjs/internal/AttemptAdmission.js.map +7 -0
- package/dist/cjs/internal/AttemptLifecycle.d.ts +245 -0
- package/dist/cjs/internal/AttemptLifecycle.d.ts.map +1 -0
- package/dist/cjs/internal/AttemptLifecycle.js +112 -0
- package/dist/cjs/internal/AttemptLifecycle.js.map +7 -0
- package/dist/cjs/internal/AttemptProbe.d.ts +53 -0
- package/dist/cjs/internal/AttemptProbe.d.ts.map +1 -0
- package/dist/cjs/internal/AttemptProbe.js +66 -0
- package/dist/cjs/internal/AttemptProbe.js.map +7 -0
- package/dist/cjs/internal/CacheAdmission.d.ts +79 -0
- package/dist/cjs/internal/CacheAdmission.d.ts.map +1 -0
- package/dist/cjs/internal/CacheAdmission.js +71 -0
- package/dist/cjs/internal/CacheAdmission.js.map +7 -0
- package/dist/cjs/internal/CacheAgeHistory.d.ts +27 -0
- package/dist/cjs/internal/CacheAgeHistory.d.ts.map +1 -0
- package/dist/cjs/internal/CacheAgeHistory.js +61 -0
- package/dist/cjs/internal/CacheAgeHistory.js.map +7 -0
- package/dist/cjs/internal/CacheAgeVerdicts.d.ts +15 -0
- package/dist/cjs/internal/CacheAgeVerdicts.d.ts.map +1 -0
- package/dist/cjs/internal/CacheAgeVerdicts.js +73 -0
- package/dist/cjs/internal/CacheAgeVerdicts.js.map +7 -0
- package/dist/cjs/internal/CacheOutputPolicy.d.ts +24 -0
- package/dist/cjs/internal/CacheOutputPolicy.d.ts.map +1 -0
- package/dist/cjs/internal/CacheOutputPolicy.js +75 -0
- package/dist/cjs/internal/CacheOutputPolicy.js.map +7 -0
- package/dist/cjs/internal/CachePublication.d.ts +97 -0
- package/dist/cjs/internal/CachePublication.d.ts.map +1 -0
- package/dist/cjs/internal/CachePublication.js +80 -0
- package/dist/cjs/internal/CachePublication.js.map +7 -0
- package/dist/cjs/internal/CallFacts.d.ts +15 -0
- package/dist/cjs/internal/CallFacts.d.ts.map +1 -0
- package/dist/cjs/internal/CallFacts.js +97 -0
- package/dist/cjs/internal/CallFacts.js.map +7 -0
- package/dist/cjs/internal/CopiedRecord.d.ts +61 -0
- package/dist/cjs/internal/CopiedRecord.d.ts.map +1 -0
- package/dist/cjs/internal/CopiedRecord.js +134 -0
- package/dist/cjs/internal/CopiedRecord.js.map +7 -0
- package/dist/cjs/internal/DeferredPersistence.d.ts +108 -0
- package/dist/cjs/internal/DeferredPersistence.d.ts.map +1 -0
- package/dist/cjs/internal/DeferredPersistence.js +270 -0
- package/dist/cjs/internal/DeferredPersistence.js.map +7 -0
- package/dist/cjs/internal/EffectRecords.d.ts +92 -0
- package/dist/cjs/internal/EffectRecords.d.ts.map +1 -0
- package/dist/cjs/internal/EffectRecords.js +63 -0
- package/dist/cjs/internal/EffectRecords.js.map +7 -0
- package/dist/cjs/internal/EngineJj.d.ts +30 -0
- package/dist/cjs/internal/EngineJj.d.ts.map +1 -0
- package/dist/cjs/internal/EngineJj.js +42 -0
- package/dist/cjs/internal/EngineJj.js.map +7 -0
- package/dist/cjs/internal/EngineStateSchema.d.ts +68 -0
- package/dist/cjs/internal/EngineStateSchema.d.ts.map +1 -0
- package/dist/cjs/internal/EngineStateSchema.js +58 -0
- package/dist/cjs/internal/EngineStateSchema.js.map +7 -0
- package/dist/cjs/internal/ExecutionSnapshotRead.d.ts +162 -0
- package/dist/cjs/internal/ExecutionSnapshotRead.d.ts.map +1 -0
- package/dist/cjs/internal/ExecutionSnapshotRead.js +201 -0
- package/dist/cjs/internal/ExecutionSnapshotRead.js.map +7 -0
- package/dist/cjs/internal/ExecutionSnapshotRelations.d.ts +39 -0
- package/dist/cjs/internal/ExecutionSnapshotRelations.d.ts.map +1 -0
- package/dist/cjs/internal/ExecutionSnapshotRelations.js +105 -0
- package/dist/cjs/internal/ExecutionSnapshotRelations.js.map +7 -0
- package/dist/cjs/internal/ExitEncoding.d.ts +180 -0
- package/dist/cjs/internal/ExitEncoding.d.ts.map +1 -0
- package/dist/cjs/internal/ExitEncoding.js +236 -0
- package/dist/cjs/internal/ExitEncoding.js.map +7 -0
- package/dist/cjs/internal/FileBoundarySnapshot.d.ts +14 -0
- package/dist/cjs/internal/FileBoundarySnapshot.d.ts.map +1 -0
- package/dist/cjs/internal/FileBoundarySnapshot.js +51 -0
- package/dist/cjs/internal/FileBoundarySnapshot.js.map +7 -0
- package/dist/cjs/internal/FileEnumeration.d.ts +127 -0
- package/dist/cjs/internal/FileEnumeration.d.ts.map +1 -0
- package/dist/cjs/internal/FileEnumeration.js +194 -0
- package/dist/cjs/internal/FileEnumeration.js.map +7 -0
- package/dist/cjs/internal/HostReflection.d.ts +80 -0
- package/dist/cjs/internal/HostReflection.d.ts.map +1 -0
- package/dist/cjs/internal/HostReflection.js +43 -0
- package/dist/cjs/internal/HostReflection.js.map +7 -0
- package/dist/cjs/internal/JournalRecords.d.ts +325 -0
- package/dist/cjs/internal/JournalRecords.d.ts.map +1 -0
- package/dist/cjs/internal/JournalRecords.js +122 -0
- package/dist/cjs/internal/JournalRecords.js.map +7 -0
- package/dist/cjs/internal/NodeJournal.d.ts +157 -0
- package/dist/cjs/internal/NodeJournal.d.ts.map +1 -0
- package/dist/cjs/internal/NodeJournal.js +192 -0
- package/dist/cjs/internal/NodeJournal.js.map +7 -0
- package/dist/cjs/internal/Ordering.d.ts +14 -0
- package/dist/cjs/internal/Ordering.d.ts.map +1 -0
- package/dist/cjs/internal/Ordering.js +25 -0
- package/dist/cjs/internal/Ordering.js.map +7 -0
- package/dist/cjs/internal/PlanInputs.d.ts +14 -0
- package/dist/cjs/internal/PlanInputs.d.ts.map +1 -0
- package/dist/cjs/internal/PlanInputs.js +78 -0
- package/dist/cjs/internal/PlanInputs.js.map +7 -0
- package/dist/cjs/internal/PlanMerges.d.ts +178 -0
- package/dist/cjs/internal/PlanMerges.d.ts.map +1 -0
- package/dist/cjs/internal/PlanMerges.js +125 -0
- package/dist/cjs/internal/PlanMerges.js.map +7 -0
- package/dist/cjs/internal/ProvenanceSlot.d.ts +30 -0
- package/dist/cjs/internal/ProvenanceSlot.d.ts.map +1 -0
- package/dist/cjs/internal/ProvenanceSlot.js +53 -0
- package/dist/cjs/internal/ProvenanceSlot.js.map +7 -0
- package/dist/cjs/internal/ResultEnvelope.d.ts +88 -0
- package/dist/cjs/internal/ResultEnvelope.d.ts.map +1 -0
- package/dist/cjs/internal/ResultEnvelope.js +90 -0
- package/dist/cjs/internal/ResultEnvelope.js.map +7 -0
- package/dist/cjs/internal/RetentionOps.d.ts +414 -0
- package/dist/cjs/internal/RetentionOps.d.ts.map +1 -0
- package/dist/cjs/internal/RetentionOps.js +354 -0
- package/dist/cjs/internal/RetentionOps.js.map +7 -0
- package/dist/cjs/internal/RunCatalogOps.d.ts +118 -0
- package/dist/cjs/internal/RunCatalogOps.d.ts.map +1 -0
- package/dist/cjs/internal/RunCatalogOps.js +85 -0
- package/dist/cjs/internal/RunCatalogOps.js.map +7 -0
- package/dist/cjs/internal/RunCoordinator.d.ts +78 -0
- package/dist/cjs/internal/RunCoordinator.d.ts.map +1 -0
- package/dist/cjs/internal/RunCoordinator.js +123 -0
- package/dist/cjs/internal/RunCoordinator.js.map +7 -0
- package/dist/cjs/internal/RunDriver.d.ts +192 -0
- package/dist/cjs/internal/RunDriver.d.ts.map +1 -0
- package/dist/cjs/internal/RunDriver.js +1586 -0
- package/dist/cjs/internal/RunDriver.js.map +7 -0
- package/dist/cjs/internal/RunLifecycle.d.ts +22 -0
- package/dist/cjs/internal/RunLifecycle.d.ts.map +1 -0
- package/dist/cjs/internal/RunLifecycle.js +63 -0
- package/dist/cjs/internal/RunLifecycle.js.map +7 -0
- package/dist/cjs/internal/RunListing.d.ts +78 -0
- package/dist/cjs/internal/RunListing.d.ts.map +1 -0
- package/dist/cjs/internal/RunListing.js +171 -0
- package/dist/cjs/internal/RunListing.js.map +7 -0
- package/dist/cjs/internal/RunListingError.d.ts +35 -0
- package/dist/cjs/internal/RunListingError.d.ts.map +1 -0
- package/dist/cjs/internal/RunListingError.js +47 -0
- package/dist/cjs/internal/RunListingError.js.map +7 -0
- package/dist/cjs/internal/RuntimeGraph.d.ts +73 -0
- package/dist/cjs/internal/RuntimeGraph.d.ts.map +1 -0
- package/dist/cjs/internal/RuntimeGraph.js +180 -0
- package/dist/cjs/internal/RuntimeGraph.js.map +7 -0
- package/dist/cjs/internal/SandboxedExecution.d.ts +80 -0
- package/dist/cjs/internal/SandboxedExecution.d.ts.map +1 -0
- package/dist/cjs/internal/SandboxedExecution.js +104 -0
- package/dist/cjs/internal/SandboxedExecution.js.map +7 -0
- package/dist/cjs/internal/StateTransaction.d.ts +44 -0
- package/dist/cjs/internal/StateTransaction.d.ts.map +1 -0
- package/dist/cjs/internal/StateTransaction.js +52 -0
- package/dist/cjs/internal/StateTransaction.js.map +7 -0
- package/dist/cjs/internal/StepFacts.d.ts +14 -0
- package/dist/cjs/internal/StepFacts.d.ts.map +1 -0
- package/dist/cjs/internal/StepFacts.js +58 -0
- package/dist/cjs/internal/StepFacts.js.map +7 -0
- package/dist/cjs/internal/TypedEvents.d.ts +14 -0
- package/dist/cjs/internal/TypedEvents.d.ts.map +1 -0
- package/dist/cjs/internal/TypedEvents.js +37 -0
- package/dist/cjs/internal/TypedEvents.js.map +7 -0
- package/dist/cjs/migrations/0001_initial.d.ts +17 -0
- package/dist/cjs/migrations/0001_initial.d.ts.map +1 -0
- package/dist/cjs/migrations/0001_initial.js +61 -0
- package/dist/cjs/migrations/0001_initial.js.map +7 -0
- package/dist/cjs/migrations/0002_selection_store.d.ts +15 -0
- package/dist/cjs/migrations/0002_selection_store.d.ts.map +1 -0
- package/dist/cjs/migrations/0002_selection_store.js +56 -0
- package/dist/cjs/migrations/0002_selection_store.js.map +7 -0
- package/dist/cjs/migrations/0003_plan_inputs.d.ts +13 -0
- package/dist/cjs/migrations/0003_plan_inputs.d.ts.map +1 -0
- package/dist/cjs/migrations/0003_plan_inputs.js +90 -0
- package/dist/cjs/migrations/0003_plan_inputs.js.map +7 -0
- package/dist/cjs/migrations/0004_plan_environment.d.ts +14 -0
- package/dist/cjs/migrations/0004_plan_environment.d.ts.map +1 -0
- package/dist/cjs/migrations/0004_plan_environment.js +56 -0
- package/dist/cjs/migrations/0004_plan_environment.js.map +7 -0
- package/dist/cjs/migrations/0005_plan_merges.d.ts +14 -0
- package/dist/cjs/migrations/0005_plan_merges.d.ts.map +1 -0
- package/dist/cjs/migrations/0005_plan_merges.js +82 -0
- package/dist/cjs/migrations/0005_plan_merges.js.map +7 -0
- package/dist/cjs/migrations/0006_execution_listing.d.ts +15 -0
- package/dist/cjs/migrations/0006_execution_listing.d.ts.map +1 -0
- package/dist/cjs/migrations/0006_execution_listing.js +101 -0
- package/dist/cjs/migrations/0006_execution_listing.js.map +7 -0
- package/dist/cjs/migrations/0007_run_parent_sequence.d.ts +15 -0
- package/dist/cjs/migrations/0007_run_parent_sequence.d.ts.map +1 -0
- package/dist/cjs/migrations/0007_run_parent_sequence.js +40 -0
- package/dist/cjs/migrations/0007_run_parent_sequence.js.map +7 -0
- package/dist/cjs/migrations/0008_deferred_consumption.d.ts +16 -0
- package/dist/cjs/migrations/0008_deferred_consumption.d.ts.map +1 -0
- package/dist/cjs/migrations/0008_deferred_consumption.js +45 -0
- package/dist/cjs/migrations/0008_deferred_consumption.js.map +7 -0
- package/dist/cjs/migrations/0009_deferred_clock_facts.d.ts +24 -0
- package/dist/cjs/migrations/0009_deferred_clock_facts.d.ts.map +1 -0
- package/dist/cjs/migrations/0009_deferred_clock_facts.js +141 -0
- package/dist/cjs/migrations/0009_deferred_clock_facts.js.map +7 -0
- package/dist/cjs/migrations/0010_pending_cancellation.d.ts +15 -0
- package/dist/cjs/migrations/0010_pending_cancellation.d.ts.map +1 -0
- package/dist/cjs/migrations/0010_pending_cancellation.js +41 -0
- package/dist/cjs/migrations/0010_pending_cancellation.js.map +7 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/test/TestStores.d.ts +89 -0
- package/dist/cjs/test/TestStores.d.ts.map +1 -0
- package/dist/cjs/test/TestStores.js +98 -0
- package/dist/cjs/test/TestStores.js.map +7 -0
- package/dist/esm/ArtifactGc.d.ts +235 -0
- package/dist/esm/ArtifactGc.d.ts.map +1 -0
- package/dist/esm/ArtifactGc.js +268 -0
- package/dist/esm/ArtifactGc.js.map +1 -0
- package/dist/esm/ArtifactSync.d.ts +164 -0
- package/dist/esm/ArtifactSync.d.ts.map +1 -0
- package/dist/esm/ArtifactSync.js +176 -0
- package/dist/esm/ArtifactSync.js.map +1 -0
- package/dist/esm/CacheSync.d.ts +112 -0
- package/dist/esm/CacheSync.d.ts.map +1 -0
- package/dist/esm/CacheSync.js +94 -0
- package/dist/esm/CacheSync.js.map +1 -0
- package/dist/esm/DeferredClockFold.d.ts +354 -0
- package/dist/esm/DeferredClockFold.d.ts.map +1 -0
- package/dist/esm/DeferredClockFold.js +472 -0
- package/dist/esm/DeferredClockFold.js.map +1 -0
- package/dist/esm/DisasterRecovery.d.ts +431 -0
- package/dist/esm/DisasterRecovery.d.ts.map +1 -0
- package/dist/esm/DisasterRecovery.js +523 -0
- package/dist/esm/DisasterRecovery.js.map +1 -0
- package/dist/esm/DurableEngineState.d.ts +776 -0
- package/dist/esm/DurableEngineState.d.ts.map +1 -0
- package/dist/esm/DurableEngineState.js +1648 -0
- package/dist/esm/DurableEngineState.js.map +1 -0
- package/dist/esm/EngineStore.d.ts +158 -0
- package/dist/esm/EngineStore.d.ts.map +1 -0
- package/dist/esm/EngineStore.js +403 -0
- package/dist/esm/EngineStore.js.map +1 -0
- package/dist/esm/EngineStoreMetrics.d.ts +276 -0
- package/dist/esm/EngineStoreMetrics.d.ts.map +1 -0
- package/dist/esm/EngineStoreMetrics.js +260 -0
- package/dist/esm/EngineStoreMetrics.js.map +1 -0
- package/dist/esm/Errors.d.ts +22 -0
- package/dist/esm/Errors.d.ts.map +1 -0
- package/dist/esm/Errors.js +22 -0
- package/dist/esm/Errors.js.map +1 -0
- package/dist/esm/EventTypes.d.ts +27 -0
- package/dist/esm/EventTypes.d.ts.map +1 -0
- package/dist/esm/EventTypes.js +27 -0
- package/dist/esm/EventTypes.js.map +1 -0
- package/dist/esm/ExecutionFacts.d.ts +59 -0
- package/dist/esm/ExecutionFacts.d.ts.map +1 -0
- package/dist/esm/ExecutionFacts.js +96 -0
- package/dist/esm/ExecutionFacts.js.map +1 -0
- package/dist/esm/ExecutionSnapshot.d.ts +117 -0
- package/dist/esm/ExecutionSnapshot.d.ts.map +1 -0
- package/dist/esm/ExecutionSnapshot.js +95 -0
- package/dist/esm/ExecutionSnapshot.js.map +1 -0
- package/dist/esm/Inconsistency.d.ts +154 -0
- package/dist/esm/Inconsistency.d.ts.map +1 -0
- package/dist/esm/Inconsistency.js +133 -0
- package/dist/esm/Inconsistency.js.map +1 -0
- package/dist/esm/Migrations.d.ts +56 -0
- package/dist/esm/Migrations.d.ts.map +1 -0
- package/dist/esm/Migrations.js +91 -0
- package/dist/esm/Migrations.js.map +1 -0
- package/dist/esm/OwnerIdentity.d.ts +91 -0
- package/dist/esm/OwnerIdentity.d.ts.map +1 -0
- package/dist/esm/OwnerIdentity.js +99 -0
- package/dist/esm/OwnerIdentity.js.map +1 -0
- package/dist/esm/PlanInputStore.d.ts +110 -0
- package/dist/esm/PlanInputStore.d.ts.map +1 -0
- package/dist/esm/PlanInputStore.js +207 -0
- package/dist/esm/PlanInputStore.js.map +1 -0
- package/dist/esm/PlanMergeStore.d.ts +113 -0
- package/dist/esm/PlanMergeStore.d.ts.map +1 -0
- package/dist/esm/PlanMergeStore.js +244 -0
- package/dist/esm/PlanMergeStore.js.map +1 -0
- package/dist/esm/PlanScheduler.d.ts +363 -0
- package/dist/esm/PlanScheduler.d.ts.map +1 -0
- package/dist/esm/PlanScheduler.js +1321 -0
- package/dist/esm/PlanScheduler.js.map +1 -0
- package/dist/esm/Reconciliation.d.ts +175 -0
- package/dist/esm/Reconciliation.d.ts.map +1 -0
- package/dist/esm/Reconciliation.js +175 -0
- package/dist/esm/Reconciliation.js.map +1 -0
- package/dist/esm/ReplayOnly.d.ts +91 -0
- package/dist/esm/ReplayOnly.d.ts.map +1 -0
- package/dist/esm/ReplayOnly.js +59 -0
- package/dist/esm/ReplayOnly.js.map +1 -0
- package/dist/esm/Retention.d.ts +113 -0
- package/dist/esm/Retention.d.ts.map +1 -0
- package/dist/esm/Retention.js +139 -0
- package/dist/esm/Retention.js.map +1 -0
- package/dist/esm/RunCatalogRead.d.ts +17 -0
- package/dist/esm/RunCatalogRead.d.ts.map +1 -0
- package/dist/esm/RunCatalogRead.js +17 -0
- package/dist/esm/RunCatalogRead.js.map +1 -0
- package/dist/esm/RunChangeFeed.d.ts +75 -0
- package/dist/esm/RunChangeFeed.d.ts.map +1 -0
- package/dist/esm/RunChangeFeed.js +81 -0
- package/dist/esm/RunChangeFeed.js.map +1 -0
- package/dist/esm/RunState.d.ts +116 -0
- package/dist/esm/RunState.d.ts.map +1 -0
- package/dist/esm/RunState.js +109 -0
- package/dist/esm/RunState.js.map +1 -0
- package/dist/esm/Selection.d.ts +495 -0
- package/dist/esm/Selection.d.ts.map +1 -0
- package/dist/esm/Selection.js +482 -0
- package/dist/esm/Selection.js.map +1 -0
- package/dist/esm/SelectionStore.d.ts +141 -0
- package/dist/esm/SelectionStore.d.ts.map +1 -0
- package/dist/esm/SelectionStore.js +215 -0
- package/dist/esm/SelectionStore.js.map +1 -0
- package/dist/esm/StepBoundary.d.ts +501 -0
- package/dist/esm/StepBoundary.d.ts.map +1 -0
- package/dist/esm/StepBoundary.js +919 -0
- package/dist/esm/StepBoundary.js.map +1 -0
- package/dist/esm/StepCacheFold.d.ts +148 -0
- package/dist/esm/StepCacheFold.d.ts.map +1 -0
- package/dist/esm/StepCacheFold.js +201 -0
- package/dist/esm/StepCacheFold.js.map +1 -0
- package/dist/esm/StepSandbox.d.ts +78 -0
- package/dist/esm/StepSandbox.d.ts.map +1 -0
- package/dist/esm/StepSandbox.js +70 -0
- package/dist/esm/StepSandbox.js.map +1 -0
- package/dist/esm/WakeBus.d.ts +116 -0
- package/dist/esm/WakeBus.d.ts.map +1 -0
- package/dist/esm/WakeBus.js +121 -0
- package/dist/esm/WakeBus.js.map +1 -0
- package/dist/esm/WorkspaceSandbox.d.ts +619 -0
- package/dist/esm/WorkspaceSandbox.d.ts.map +1 -0
- package/dist/esm/WorkspaceSandbox.js +985 -0
- package/dist/esm/WorkspaceSandbox.js.map +1 -0
- package/dist/esm/index.d.ts +157 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +157 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/internal/ActionPersistence.d.ts +276 -0
- package/dist/esm/internal/ActionPersistence.d.ts.map +1 -0
- package/dist/esm/internal/ActionPersistence.js +2306 -0
- package/dist/esm/internal/ActionPersistence.js.map +1 -0
- package/dist/esm/internal/ArtifactRoots.d.ts +38 -0
- package/dist/esm/internal/ArtifactRoots.d.ts.map +1 -0
- package/dist/esm/internal/ArtifactRoots.js +76 -0
- package/dist/esm/internal/ArtifactRoots.js.map +1 -0
- package/dist/esm/internal/AttemptAdmission.d.ts +53 -0
- package/dist/esm/internal/AttemptAdmission.d.ts.map +1 -0
- package/dist/esm/internal/AttemptAdmission.js +52 -0
- package/dist/esm/internal/AttemptAdmission.js.map +1 -0
- package/dist/esm/internal/AttemptLifecycle.d.ts +245 -0
- package/dist/esm/internal/AttemptLifecycle.d.ts.map +1 -0
- package/dist/esm/internal/AttemptLifecycle.js +104 -0
- package/dist/esm/internal/AttemptLifecycle.js.map +1 -0
- package/dist/esm/internal/AttemptProbe.d.ts +53 -0
- package/dist/esm/internal/AttemptProbe.d.ts.map +1 -0
- package/dist/esm/internal/AttemptProbe.js +83 -0
- package/dist/esm/internal/AttemptProbe.js.map +1 -0
- package/dist/esm/internal/CacheAdmission.d.ts +79 -0
- package/dist/esm/internal/CacheAdmission.d.ts.map +1 -0
- package/dist/esm/internal/CacheAdmission.js +72 -0
- package/dist/esm/internal/CacheAdmission.js.map +1 -0
- package/dist/esm/internal/CacheAgeHistory.d.ts +27 -0
- package/dist/esm/internal/CacheAgeHistory.d.ts.map +1 -0
- package/dist/esm/internal/CacheAgeHistory.js +49 -0
- package/dist/esm/internal/CacheAgeHistory.js.map +1 -0
- package/dist/esm/internal/CacheAgeVerdicts.d.ts +15 -0
- package/dist/esm/internal/CacheAgeVerdicts.d.ts.map +1 -0
- package/dist/esm/internal/CacheAgeVerdicts.js +54 -0
- package/dist/esm/internal/CacheAgeVerdicts.js.map +1 -0
- package/dist/esm/internal/CacheOutputPolicy.d.ts +24 -0
- package/dist/esm/internal/CacheOutputPolicy.d.ts.map +1 -0
- package/dist/esm/internal/CacheOutputPolicy.js +73 -0
- package/dist/esm/internal/CacheOutputPolicy.js.map +1 -0
- package/dist/esm/internal/CachePublication.d.ts +97 -0
- package/dist/esm/internal/CachePublication.d.ts.map +1 -0
- package/dist/esm/internal/CachePublication.js +116 -0
- package/dist/esm/internal/CachePublication.js.map +1 -0
- package/dist/esm/internal/CallFacts.d.ts +15 -0
- package/dist/esm/internal/CallFacts.d.ts.map +1 -0
- package/dist/esm/internal/CallFacts.js +83 -0
- package/dist/esm/internal/CallFacts.js.map +1 -0
- package/dist/esm/internal/CopiedRecord.d.ts +61 -0
- package/dist/esm/internal/CopiedRecord.d.ts.map +1 -0
- package/dist/esm/internal/CopiedRecord.js +165 -0
- package/dist/esm/internal/CopiedRecord.js.map +1 -0
- package/dist/esm/internal/DeferredPersistence.d.ts +108 -0
- package/dist/esm/internal/DeferredPersistence.d.ts.map +1 -0
- package/dist/esm/internal/DeferredPersistence.js +240 -0
- package/dist/esm/internal/DeferredPersistence.js.map +1 -0
- package/dist/esm/internal/EffectRecords.d.ts +92 -0
- package/dist/esm/internal/EffectRecords.d.ts.map +1 -0
- package/dist/esm/internal/EffectRecords.js +94 -0
- package/dist/esm/internal/EffectRecords.js.map +1 -0
- package/dist/esm/internal/EngineJj.d.ts +30 -0
- package/dist/esm/internal/EngineJj.d.ts.map +1 -0
- package/dist/esm/internal/EngineJj.js +29 -0
- package/dist/esm/internal/EngineJj.js.map +1 -0
- package/dist/esm/internal/EngineStateSchema.d.ts +68 -0
- package/dist/esm/internal/EngineStateSchema.d.ts.map +1 -0
- package/dist/esm/internal/EngineStateSchema.js +53 -0
- package/dist/esm/internal/EngineStateSchema.js.map +1 -0
- package/dist/esm/internal/ExecutionSnapshotRead.d.ts +162 -0
- package/dist/esm/internal/ExecutionSnapshotRead.d.ts.map +1 -0
- package/dist/esm/internal/ExecutionSnapshotRead.js +218 -0
- package/dist/esm/internal/ExecutionSnapshotRead.js.map +1 -0
- package/dist/esm/internal/ExecutionSnapshotRelations.d.ts +39 -0
- package/dist/esm/internal/ExecutionSnapshotRelations.d.ts.map +1 -0
- package/dist/esm/internal/ExecutionSnapshotRelations.js +81 -0
- package/dist/esm/internal/ExecutionSnapshotRelations.js.map +1 -0
- package/dist/esm/internal/ExitEncoding.d.ts +180 -0
- package/dist/esm/internal/ExitEncoding.d.ts.map +1 -0
- package/dist/esm/internal/ExitEncoding.js +361 -0
- package/dist/esm/internal/ExitEncoding.js.map +1 -0
- package/dist/esm/internal/FileBoundarySnapshot.d.ts +14 -0
- package/dist/esm/internal/FileBoundarySnapshot.d.ts.map +1 -0
- package/dist/esm/internal/FileBoundarySnapshot.js +29 -0
- package/dist/esm/internal/FileBoundarySnapshot.js.map +1 -0
- package/dist/esm/internal/FileEnumeration.d.ts +127 -0
- package/dist/esm/internal/FileEnumeration.d.ts.map +1 -0
- package/dist/esm/internal/FileEnumeration.js +236 -0
- package/dist/esm/internal/FileEnumeration.js.map +1 -0
- package/dist/esm/internal/HostReflection.d.ts +80 -0
- package/dist/esm/internal/HostReflection.d.ts.map +1 -0
- package/dist/esm/internal/HostReflection.js +98 -0
- package/dist/esm/internal/HostReflection.js.map +1 -0
- package/dist/esm/internal/JournalRecords.d.ts +325 -0
- package/dist/esm/internal/JournalRecords.d.ts.map +1 -0
- package/dist/esm/internal/JournalRecords.js +306 -0
- package/dist/esm/internal/JournalRecords.js.map +1 -0
- package/dist/esm/internal/NodeJournal.d.ts +157 -0
- package/dist/esm/internal/NodeJournal.d.ts.map +1 -0
- package/dist/esm/internal/NodeJournal.js +298 -0
- package/dist/esm/internal/NodeJournal.js.map +1 -0
- package/dist/esm/internal/Ordering.d.ts +14 -0
- package/dist/esm/internal/Ordering.d.ts.map +1 -0
- package/dist/esm/internal/Ordering.js +14 -0
- package/dist/esm/internal/Ordering.js.map +1 -0
- package/dist/esm/internal/PlanInputs.d.ts +14 -0
- package/dist/esm/internal/PlanInputs.d.ts.map +1 -0
- package/dist/esm/internal/PlanInputs.js +57 -0
- package/dist/esm/internal/PlanInputs.js.map +1 -0
- package/dist/esm/internal/PlanMerges.d.ts +178 -0
- package/dist/esm/internal/PlanMerges.d.ts.map +1 -0
- package/dist/esm/internal/PlanMerges.js +113 -0
- package/dist/esm/internal/PlanMerges.js.map +1 -0
- package/dist/esm/internal/ProvenanceSlot.d.ts +30 -0
- package/dist/esm/internal/ProvenanceSlot.d.ts.map +1 -0
- package/dist/esm/internal/ProvenanceSlot.js +39 -0
- package/dist/esm/internal/ProvenanceSlot.js.map +1 -0
- package/dist/esm/internal/ResultEnvelope.d.ts +88 -0
- package/dist/esm/internal/ResultEnvelope.d.ts.map +1 -0
- package/dist/esm/internal/ResultEnvelope.js +83 -0
- package/dist/esm/internal/ResultEnvelope.js.map +1 -0
- package/dist/esm/internal/RetentionOps.d.ts +414 -0
- package/dist/esm/internal/RetentionOps.d.ts.map +1 -0
- package/dist/esm/internal/RetentionOps.js +576 -0
- package/dist/esm/internal/RetentionOps.js.map +1 -0
- package/dist/esm/internal/RunCatalogOps.d.ts +118 -0
- package/dist/esm/internal/RunCatalogOps.d.ts.map +1 -0
- package/dist/esm/internal/RunCatalogOps.js +120 -0
- package/dist/esm/internal/RunCatalogOps.js.map +1 -0
- package/dist/esm/internal/RunCoordinator.d.ts +78 -0
- package/dist/esm/internal/RunCoordinator.d.ts.map +1 -0
- package/dist/esm/internal/RunCoordinator.js +115 -0
- package/dist/esm/internal/RunCoordinator.js.map +1 -0
- package/dist/esm/internal/RunDriver.d.ts +192 -0
- package/dist/esm/internal/RunDriver.d.ts.map +1 -0
- package/dist/esm/internal/RunDriver.js +2334 -0
- package/dist/esm/internal/RunDriver.js.map +1 -0
- package/dist/esm/internal/RunLifecycle.d.ts +22 -0
- package/dist/esm/internal/RunLifecycle.d.ts.map +1 -0
- package/dist/esm/internal/RunLifecycle.js +49 -0
- package/dist/esm/internal/RunLifecycle.js.map +1 -0
- package/dist/esm/internal/RunListing.d.ts +78 -0
- package/dist/esm/internal/RunListing.d.ts.map +1 -0
- package/dist/esm/internal/RunListing.js +146 -0
- package/dist/esm/internal/RunListing.js.map +1 -0
- package/dist/esm/internal/RunListingError.d.ts +35 -0
- package/dist/esm/internal/RunListingError.d.ts.map +1 -0
- package/dist/esm/internal/RunListingError.js +27 -0
- package/dist/esm/internal/RunListingError.js.map +1 -0
- package/dist/esm/internal/RuntimeGraph.d.ts +73 -0
- package/dist/esm/internal/RuntimeGraph.d.ts.map +1 -0
- package/dist/esm/internal/RuntimeGraph.js +182 -0
- package/dist/esm/internal/RuntimeGraph.js.map +1 -0
- package/dist/esm/internal/SandboxedExecution.d.ts +80 -0
- package/dist/esm/internal/SandboxedExecution.d.ts.map +1 -0
- package/dist/esm/internal/SandboxedExecution.js +107 -0
- package/dist/esm/internal/SandboxedExecution.js.map +1 -0
- package/dist/esm/internal/StateTransaction.d.ts +44 -0
- package/dist/esm/internal/StateTransaction.d.ts.map +1 -0
- package/dist/esm/internal/StateTransaction.js +54 -0
- package/dist/esm/internal/StateTransaction.js.map +1 -0
- package/dist/esm/internal/StepFacts.d.ts +14 -0
- package/dist/esm/internal/StepFacts.d.ts.map +1 -0
- package/dist/esm/internal/StepFacts.js +35 -0
- package/dist/esm/internal/StepFacts.js.map +1 -0
- package/dist/esm/internal/TypedEvents.d.ts +14 -0
- package/dist/esm/internal/TypedEvents.d.ts.map +1 -0
- package/dist/esm/internal/TypedEvents.js +14 -0
- package/dist/esm/internal/TypedEvents.js.map +1 -0
- package/dist/esm/migrations/0001_initial.d.ts +17 -0
- package/dist/esm/migrations/0001_initial.d.ts.map +1 -0
- package/dist/esm/migrations/0001_initial.js +41 -0
- package/dist/esm/migrations/0001_initial.js.map +1 -0
- package/dist/esm/migrations/0002_selection_store.d.ts +15 -0
- package/dist/esm/migrations/0002_selection_store.d.ts.map +1 -0
- package/dist/esm/migrations/0002_selection_store.js +34 -0
- package/dist/esm/migrations/0002_selection_store.js.map +1 -0
- package/dist/esm/migrations/0003_plan_inputs.d.ts +13 -0
- package/dist/esm/migrations/0003_plan_inputs.d.ts.map +1 -0
- package/dist/esm/migrations/0003_plan_inputs.js +70 -0
- package/dist/esm/migrations/0003_plan_inputs.js.map +1 -0
- package/dist/esm/migrations/0004_plan_environment.d.ts +14 -0
- package/dist/esm/migrations/0004_plan_environment.d.ts.map +1 -0
- package/dist/esm/migrations/0004_plan_environment.js +33 -0
- package/dist/esm/migrations/0004_plan_environment.js.map +1 -0
- package/dist/esm/migrations/0005_plan_merges.d.ts +14 -0
- package/dist/esm/migrations/0005_plan_merges.d.ts.map +1 -0
- package/dist/esm/migrations/0005_plan_merges.js +59 -0
- package/dist/esm/migrations/0005_plan_merges.js.map +1 -0
- package/dist/esm/migrations/0006_execution_listing.d.ts +15 -0
- package/dist/esm/migrations/0006_execution_listing.d.ts.map +1 -0
- package/dist/esm/migrations/0006_execution_listing.js +81 -0
- package/dist/esm/migrations/0006_execution_listing.js.map +1 -0
- package/dist/esm/migrations/0007_run_parent_sequence.d.ts +15 -0
- package/dist/esm/migrations/0007_run_parent_sequence.d.ts.map +1 -0
- package/dist/esm/migrations/0007_run_parent_sequence.js +18 -0
- package/dist/esm/migrations/0007_run_parent_sequence.js.map +1 -0
- package/dist/esm/migrations/0008_deferred_consumption.d.ts +16 -0
- package/dist/esm/migrations/0008_deferred_consumption.d.ts.map +1 -0
- package/dist/esm/migrations/0008_deferred_consumption.js +24 -0
- package/dist/esm/migrations/0008_deferred_consumption.js.map +1 -0
- package/dist/esm/migrations/0009_deferred_clock_facts.d.ts +24 -0
- package/dist/esm/migrations/0009_deferred_clock_facts.d.ts.map +1 -0
- package/dist/esm/migrations/0009_deferred_clock_facts.js +127 -0
- package/dist/esm/migrations/0009_deferred_clock_facts.js.map +1 -0
- package/dist/esm/migrations/0010_pending_cancellation.d.ts +15 -0
- package/dist/esm/migrations/0010_pending_cancellation.d.ts.map +1 -0
- package/dist/esm/migrations/0010_pending_cancellation.js +19 -0
- package/dist/esm/migrations/0010_pending_cancellation.js.map +1 -0
- package/dist/esm/test/TestStores.d.ts +89 -0
- package/dist/esm/test/TestStores.d.ts.map +1 -0
- package/dist/esm/test/TestStores.js +103 -0
- package/dist/esm/test/TestStores.js.map +1 -0
- package/docs/README.md +113 -0
- package/docs/api.md +1494 -0
- package/docs/concepts/attempts-and-replay.md +149 -0
- package/docs/concepts/cache-admission.md +265 -0
- package/docs/concepts/call-facts.md +86 -0
- package/docs/concepts/durable-waits.md +175 -0
- package/docs/concepts/execution-facts.md +90 -0
- package/docs/concepts/ownership-and-fencing.md +128 -0
- package/docs/concepts/step-boundaries.md +148 -0
- package/docs/concepts/workspace-transactions.md +199 -0
- package/docs/event-types.md +14 -0
- package/docs/guides/back-up-and-restore.md +164 -0
- package/docs/guides/collect-unreferenced-artifacts.md +128 -0
- package/docs/guides/compose-a-durable-engine.md +146 -0
- package/docs/guides/coordinate-two-processes.md +120 -0
- package/docs/guides/defer-work-with-selection.md +171 -0
- package/docs/guides/delete-old-run-history.md +154 -0
- package/docs/guides/drive-a-plan.md +314 -0
- package/docs/guides/observe-engine-metrics.md +98 -0
- package/docs/guides/observe-executions.md +187 -0
- package/docs/guides/reclaim-runs-from-a-dead-host.md +133 -0
- package/docs/guides/share-a-cache-across-machines.md +134 -0
- package/docs/guides/testing.md +123 -0
- package/docs/installation.md +102 -0
- package/docs/quickstart.md +215 -0
- package/docs/troubleshooting.md +347 -0
- package/package.json +438 -3
- package/src/ArtifactGc.ts +408 -0
- package/src/ArtifactSync.ts +278 -0
- package/src/CacheSync.ts +131 -0
- package/src/DeferredClockFold.ts +586 -0
- package/src/DisasterRecovery.ts +888 -0
- package/src/DurableEngineState.ts +2656 -0
- package/src/EngineStore.ts +656 -0
- package/src/EngineStoreMetrics.ts +331 -0
- package/src/Errors.ts +28 -0
- package/src/EventTypes.ts +27 -0
- package/src/ExecutionFacts.ts +125 -0
- package/src/ExecutionSnapshot.ts +186 -0
- package/src/Inconsistency.ts +253 -0
- package/src/Migrations.ts +95 -0
- package/src/OwnerIdentity.ts +125 -0
- package/src/PlanInputStore.ts +292 -0
- package/src/PlanMergeStore.ts +330 -0
- package/src/PlanScheduler.ts +1806 -0
- package/src/Reconciliation.ts +224 -0
- package/src/ReplayOnly.ts +95 -0
- package/src/Retention.ts +214 -0
- package/src/RunCatalogRead.ts +27 -0
- package/src/RunChangeFeed.ts +125 -0
- package/src/RunState.ts +137 -0
- package/src/Selection.ts +683 -0
- package/src/SelectionStore.ts +353 -0
- package/src/StepBoundary.ts +1165 -0
- package/src/StepCacheFold.ts +244 -0
- package/src/StepSandbox.ts +110 -0
- package/src/WakeBus.ts +167 -0
- package/src/WorkspaceSandbox.ts +1604 -0
- package/src/index.ts +185 -0
- package/src/internal/ActionPersistence.ts +2687 -0
- package/src/internal/ArtifactRoots.ts +92 -0
- package/src/internal/AttemptAdmission.ts +76 -0
- package/src/internal/AttemptLifecycle.ts +163 -0
- package/src/internal/AttemptProbe.ts +90 -0
- package/src/internal/CacheAdmission.ts +133 -0
- package/src/internal/CacheAgeHistory.ts +58 -0
- package/src/internal/CacheAgeVerdicts.ts +61 -0
- package/src/internal/CacheOutputPolicy.ts +82 -0
- package/src/internal/CachePublication.ts +153 -0
- package/src/internal/CallFacts.ts +87 -0
- package/src/internal/CopiedRecord.ts +201 -0
- package/src/internal/DeferredPersistence.ts +459 -0
- package/src/internal/EffectRecords.ts +136 -0
- package/src/internal/EngineJj.ts +30 -0
- package/src/internal/EngineStateSchema.ts +92 -0
- package/src/internal/ExecutionSnapshotRead.ts +300 -0
- package/src/internal/ExecutionSnapshotRelations.ts +121 -0
- package/src/internal/ExitEncoding.ts +453 -0
- package/src/internal/FileBoundarySnapshot.ts +39 -0
- package/src/internal/FileEnumeration.ts +334 -0
- package/src/internal/HostReflection.ts +128 -0
- package/src/internal/JournalRecords.ts +396 -0
- package/src/internal/NodeJournal.ts +340 -0
- package/src/internal/Ordering.ts +14 -0
- package/src/internal/PlanInputs.ts +62 -0
- package/src/internal/PlanMerges.ts +123 -0
- package/src/internal/ProvenanceSlot.ts +52 -0
- package/src/internal/ResultEnvelope.ts +118 -0
- package/src/internal/RetentionOps.ts +865 -0
- package/src/internal/RunCatalogOps.ts +174 -0
- package/src/internal/RunCoordinator.ts +215 -0
- package/src/internal/RunDriver.ts +3154 -0
- package/src/internal/RunLifecycle.ts +53 -0
- package/src/internal/RunListing.ts +210 -0
- package/src/internal/RunListingError.ts +37 -0
- package/src/internal/RuntimeGraph.ts +253 -0
- package/src/internal/SandboxedExecution.ts +165 -0
- package/src/internal/StateTransaction.ts +71 -0
- package/src/internal/StepFacts.ts +36 -0
- package/src/internal/TypedEvents.ts +29 -0
- package/src/migrations/0001_initial.ts +51 -0
- package/src/migrations/0002_selection_store.ts +38 -0
- package/src/migrations/0003_plan_inputs.ts +75 -0
- package/src/migrations/0004_plan_environment.ts +34 -0
- package/src/migrations/0005_plan_merges.ts +60 -0
- package/src/migrations/0006_execution_listing.ts +86 -0
- package/src/migrations/0007_run_parent_sequence.ts +19 -0
- package/src/migrations/0008_deferred_consumption.ts +27 -0
- package/src/migrations/0009_deferred_clock_facts.ts +163 -0
- package/src/migrations/0010_pending_cancellation.ts +20 -0
- package/src/test/TestStores.ts +145 -0
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authoritative source observations for one durable plan execution. These are
|
|
3
|
+
* replay state, not approval data, journal projections, or evictable cache rows.
|
|
4
|
+
* @since 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
import { Sha256 } from "@smthrs/crypto";
|
|
7
|
+
import { DurableWriter } from "@smthrs/database/DurableWriter";
|
|
8
|
+
import { FileSet, Plan } from "@smthrs/plan";
|
|
9
|
+
import { OwnerId } from "@smthrs/run-store/Ownership";
|
|
10
|
+
import { Context, Effect, Layer, Option, Schema } from "effect";
|
|
11
|
+
import * as SqlClient from "effect/unstable/sql/SqlClient";
|
|
12
|
+
const Natural = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0));
|
|
13
|
+
/**
|
|
14
|
+
* Address of an append-only observation generation. `environmentDigest` comes
|
|
15
|
+
* from `StepKey.environmentIdentity` and binds every generation of the run.
|
|
16
|
+
* @since 1.0.0
|
|
17
|
+
* @category schemas
|
|
18
|
+
*/
|
|
19
|
+
export const Address = Schema.Struct({
|
|
20
|
+
runId: Schema.NonEmptyString,
|
|
21
|
+
planId: Schema.NonEmptyString,
|
|
22
|
+
baseDigest: Schema.NonEmptyString,
|
|
23
|
+
environmentDigest: Schema.NonEmptyString,
|
|
24
|
+
generation: Natural
|
|
25
|
+
});
|
|
26
|
+
/**
|
|
27
|
+
* Maximum encoded snapshot size, in JavaScript string code units.
|
|
28
|
+
* @since 1.0.0
|
|
29
|
+
* @category constants
|
|
30
|
+
*/
|
|
31
|
+
export const maximumSnapshotCharacters = 16 * 1024 * 1024;
|
|
32
|
+
/**
|
|
33
|
+
* Frozen membership and newly pinned source digests for one generation.
|
|
34
|
+
* @since 1.0.0
|
|
35
|
+
* @category schemas
|
|
36
|
+
*/
|
|
37
|
+
export const Snapshot = Schema.Struct({
|
|
38
|
+
version: Schema.Literal(1),
|
|
39
|
+
generation: Natural,
|
|
40
|
+
nodes: Schema.Array(Schema.Struct({
|
|
41
|
+
id: Schema.NonEmptyString,
|
|
42
|
+
key: Schema.NonEmptyString,
|
|
43
|
+
reads: Schema.Array(Schema.Struct({
|
|
44
|
+
entry: FileSet.ReadEntry,
|
|
45
|
+
sourcePaths: Schema.Array(FileSet.Pattern)
|
|
46
|
+
}))
|
|
47
|
+
})).check(Schema.isMaxLength(Plan.maximumPlanNodes)),
|
|
48
|
+
pins: Schema.Array(Schema.Struct({ path: FileSet.Pattern, digest: Schema.NonEmptyString }))
|
|
49
|
+
});
|
|
50
|
+
/**
|
|
51
|
+
* A durable observation cannot be read or safely admitted.
|
|
52
|
+
* @since 1.0.0
|
|
53
|
+
* @category errors
|
|
54
|
+
*/
|
|
55
|
+
export class PlanInputError extends Schema.TaggedError()("@smthrs/engine-store/PlanInputError", {
|
|
56
|
+
code: Schema.Literals([
|
|
57
|
+
"invalid_input",
|
|
58
|
+
"corrupt_state",
|
|
59
|
+
"incompatible_state",
|
|
60
|
+
"fence_lost",
|
|
61
|
+
"transaction_open",
|
|
62
|
+
"persistence_failed"
|
|
63
|
+
]),
|
|
64
|
+
message: Schema.String,
|
|
65
|
+
cause: Schema.optional(Schema.Unknown)
|
|
66
|
+
}) {
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Durable plan-input service.
|
|
70
|
+
* @since 1.0.0
|
|
71
|
+
* @category services
|
|
72
|
+
*/
|
|
73
|
+
export class PlanInputStore extends Context.Service()("@smthrs/engine-store/PlanInputStore") {
|
|
74
|
+
}
|
|
75
|
+
const failure = (code, message, cause) => new PlanInputError({ code, message, ...(cause === undefined ? {} : { cause }) });
|
|
76
|
+
const persistError = (cause) => cause instanceof PlanInputError ?
|
|
77
|
+
cause :
|
|
78
|
+
failure("persistence_failed", "could not access durable plan inputs", cause);
|
|
79
|
+
const decode = (schema, value, code) => Effect.try({
|
|
80
|
+
try: () => Schema.decodeUnknownSync(schema)(value, { onExcessProperty: "error" }),
|
|
81
|
+
catch: (cause) => failure(code, "invalid plan input observation", cause)
|
|
82
|
+
});
|
|
83
|
+
const validateSnapshot = (snapshot, generation, code) => {
|
|
84
|
+
if (snapshot.generation !== generation ||
|
|
85
|
+
new Set(snapshot.nodes.map((node) => node.id)).size !== snapshot.nodes.length ||
|
|
86
|
+
new Set(snapshot.pins.map((pin) => pin.path)).size !== snapshot.pins.length ||
|
|
87
|
+
snapshot.nodes.some((node) => node.reads.some((read) => new Set(read.sourcePaths).size !== read.sourcePaths.length ||
|
|
88
|
+
read.sourcePaths.some((path) => typeof read.entry === "string" ? path !== read.entry : !FileSet.matchesGlob(read.entry, path))))) {
|
|
89
|
+
return Effect.fail(failure(code, "plan input observation has inconsistent membership or generation"));
|
|
90
|
+
}
|
|
91
|
+
return Effect.void;
|
|
92
|
+
};
|
|
93
|
+
/**
|
|
94
|
+
* Builds the SQL-backed, owner-fenced store.
|
|
95
|
+
* @since 1.0.0
|
|
96
|
+
* @category constructors
|
|
97
|
+
*/
|
|
98
|
+
export const make = Effect.gen(function* () {
|
|
99
|
+
const sql = yield* SqlClient.SqlClient;
|
|
100
|
+
const writer = yield* DurableWriter;
|
|
101
|
+
const crypto = yield* Effect.context();
|
|
102
|
+
const checksum = (value) => Schema.decodeUnknownEffect(Sha256)(value).pipe(Effect.provide(crypto));
|
|
103
|
+
const fence = (address, owner) => Effect.gen(function* () {
|
|
104
|
+
const owned = yield* sql `SELECT run_id FROM flows_runs WHERE run_id = ${address.runId}
|
|
105
|
+
AND status = 'running' AND cancel_requested_at_ms IS NULL
|
|
106
|
+
AND owner_host_id = ${owner.hostId} AND owner_pid = ${owner.pid} AND owner_nonce = ${owner.nonce}`;
|
|
107
|
+
if (owned.length !== 1) {
|
|
108
|
+
return yield* Effect.fail(failure("fence_lost", "plan input owner no longer owns the run"));
|
|
109
|
+
}
|
|
110
|
+
const legacy = yield* sql `SELECT run_id FROM flows_plan_input_legacy_runs WHERE run_id = ${address.runId}`;
|
|
111
|
+
if (legacy.length > 0) {
|
|
112
|
+
return yield* Effect.fail(failure("incompatible_state", "this run executed before durable plan inputs were recorded; its original sources cannot be reconstructed"));
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
const load = (address) => Effect.gen(function* () {
|
|
116
|
+
const heads = yield* sql `SELECT plan_id AS "planId", base_digest AS "baseDigest", environment_digest AS "environmentDigest", generation
|
|
117
|
+
FROM flows_plan_input_heads WHERE run_id = ${address.runId}`;
|
|
118
|
+
const head = heads[0];
|
|
119
|
+
if (head === undefined) {
|
|
120
|
+
const orphan = yield* sql `SELECT 1 FROM flows_plan_input_generations
|
|
121
|
+
WHERE run_id = ${address.runId} AND plan_id = ${address.planId} LIMIT 1`;
|
|
122
|
+
if (address.generation !== 0 || orphan.length > 0) {
|
|
123
|
+
return yield* Effect.fail(failure("corrupt_state", "plan input history has no initial generation"));
|
|
124
|
+
}
|
|
125
|
+
return Option.none();
|
|
126
|
+
}
|
|
127
|
+
yield* decode(Schema.Struct({
|
|
128
|
+
planId: Schema.NonEmptyString,
|
|
129
|
+
baseDigest: Schema.NonEmptyString,
|
|
130
|
+
environmentDigest: Schema.NullOr(Schema.NonEmptyString),
|
|
131
|
+
generation: Natural
|
|
132
|
+
}), head, "corrupt_state");
|
|
133
|
+
if (head.planId !== address.planId || head.baseDigest !== address.baseDigest) {
|
|
134
|
+
return yield* Effect.fail(failure("incompatible_state", "this run already observed a different approved plan"));
|
|
135
|
+
}
|
|
136
|
+
if (head.environmentDigest === null || head.environmentDigest !== address.environmentDigest) {
|
|
137
|
+
return yield* Effect.fail(failure("incompatible_state", "this run has a different or unrecorded execution environment; recover with its original runtime or explicitly reconcile before starting a new run"));
|
|
138
|
+
}
|
|
139
|
+
const counts = yield* sql `SELECT COUNT(*) AS count,
|
|
140
|
+
MIN(generation) AS first, MAX(generation) AS last FROM flows_plan_input_generations
|
|
141
|
+
WHERE run_id = ${address.runId} AND plan_id = ${address.planId}`;
|
|
142
|
+
if (counts[0].count !== head.generation + 1 || counts[0].first !== 0 || counts[0].last !== head.generation ||
|
|
143
|
+
address.generation > head.generation + 1) {
|
|
144
|
+
return yield* Effect.fail(failure("corrupt_state", "plan input history has a missing generation"));
|
|
145
|
+
}
|
|
146
|
+
if (address.generation > head.generation)
|
|
147
|
+
return Option.none();
|
|
148
|
+
const rows = yield* sql `SELECT snapshot_json AS "snapshotJson", checksum
|
|
149
|
+
FROM flows_plan_input_generations WHERE run_id = ${address.runId} AND plan_id = ${address.planId}
|
|
150
|
+
AND generation = ${address.generation}`;
|
|
151
|
+
const row = rows[0];
|
|
152
|
+
if (row.snapshotJson.length > maximumSnapshotCharacters || (yield* checksum(row.snapshotJson)) !== row.checksum) {
|
|
153
|
+
return yield* Effect.fail(failure("corrupt_state", "plan input snapshot failed its size or integrity check"));
|
|
154
|
+
}
|
|
155
|
+
const snapshot = yield* decode(Schema.fromJsonString(Snapshot), row.snapshotJson, "corrupt_state");
|
|
156
|
+
yield* validateSnapshot(snapshot, address.generation, "corrupt_state");
|
|
157
|
+
return Option.some(snapshot);
|
|
158
|
+
});
|
|
159
|
+
const get = Effect.fn("PlanInputStore.get")((input, ownerInput) => Effect.gen(function* () {
|
|
160
|
+
const address = yield* decode(Address, input, "invalid_input");
|
|
161
|
+
const owner = yield* decode(OwnerId, ownerInput, "invalid_input");
|
|
162
|
+
if (Option.isSome(yield* Effect.serviceOption(sql.transactionService))) {
|
|
163
|
+
return yield* Effect.fail(failure("transaction_open", "plan execution requires committed source observations"));
|
|
164
|
+
}
|
|
165
|
+
return yield* writer.write(Effect.gen(function* () {
|
|
166
|
+
yield* fence(address, owner);
|
|
167
|
+
return yield* load(address);
|
|
168
|
+
}));
|
|
169
|
+
}).pipe(Effect.mapError(persistError)));
|
|
170
|
+
const record = Effect.fn("PlanInputStore.record")((input, value, ownerInput) => Effect.gen(function* () {
|
|
171
|
+
const address = yield* decode(Address, input, "invalid_input");
|
|
172
|
+
const owner = yield* decode(OwnerId, ownerInput, "invalid_input");
|
|
173
|
+
const snapshot = yield* decode(Snapshot, value, "invalid_input");
|
|
174
|
+
yield* validateSnapshot(snapshot, address.generation, "invalid_input");
|
|
175
|
+
const encoded = JSON.stringify(snapshot);
|
|
176
|
+
if (encoded.length > maximumSnapshotCharacters) {
|
|
177
|
+
return yield* Effect.fail(failure("invalid_input", "plan input snapshot exceeds the durable size limit"));
|
|
178
|
+
}
|
|
179
|
+
const hash = yield* checksum(encoded);
|
|
180
|
+
return yield* writer.write(Effect.gen(function* () {
|
|
181
|
+
yield* fence(address, owner);
|
|
182
|
+
const existing = yield* load(address);
|
|
183
|
+
if (Option.isSome(existing))
|
|
184
|
+
return existing.value;
|
|
185
|
+
if (address.generation === 0) {
|
|
186
|
+
yield* sql `INSERT INTO flows_plan_input_heads (run_id, plan_id, base_digest, environment_digest, merge_state_version, generation)
|
|
187
|
+
VALUES (${address.runId}, ${address.planId}, ${address.baseDigest}, ${address.environmentDigest}, 1, 0)`;
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
yield* sql `UPDATE flows_plan_input_heads SET generation = ${address.generation}
|
|
191
|
+
WHERE run_id = ${address.runId} AND plan_id = ${address.planId}`;
|
|
192
|
+
}
|
|
193
|
+
yield* sql `INSERT INTO flows_plan_input_generations (run_id, plan_id, generation, snapshot_json, checksum)
|
|
194
|
+
VALUES (${address.runId}, ${address.planId}, ${address.generation}, ${encoded}, ${hash})`;
|
|
195
|
+
return snapshot;
|
|
196
|
+
}));
|
|
197
|
+
}).pipe(Effect.mapError(persistError)));
|
|
198
|
+
return { get, record };
|
|
199
|
+
});
|
|
200
|
+
/**
|
|
201
|
+
* Provides the SQL-backed input store over the same database as the run/attempt stores.
|
|
202
|
+
* @since 1.0.0
|
|
203
|
+
* @category layers
|
|
204
|
+
*/
|
|
205
|
+
export const layer = Layer
|
|
206
|
+
.effect(PlanInputStore)(make);
|
|
207
|
+
//# sourceMappingURL=PlanInputStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlanInputStore.js","sourceRoot":"","sources":["../../src/PlanInputStore.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Authoritative source observations for one durable plan execution. These are\n * replay state, not approval data, journal projections, or evictable cache rows.\n * @since 1.0.0\n */\n\nimport { Sha256 } from \"@smthrs/crypto\"\nimport { DurableWriter } from \"@smthrs/database/DurableWriter\"\nimport { FileSet, Plan } from \"@smthrs/plan\"\nimport { OwnerId } from \"@smthrs/run-store/Ownership\"\nimport { Context, Effect, Layer, Option, Schema } from \"effect\"\nimport type * as Crypto from \"effect/Crypto\"\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\"\n\nconst Natural = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0))\n\n/**\n * Address of an append-only observation generation. `environmentDigest` comes\n * from `StepKey.environmentIdentity` and binds every generation of the run.\n * @since 1.0.0\n * @category schemas\n */\nexport const Address = Schema.Struct({\n runId: Schema.NonEmptyString,\n planId: Schema.NonEmptyString,\n baseDigest: Schema.NonEmptyString,\n environmentDigest: Schema.NonEmptyString,\n generation: Natural\n})\n/**\n * Address of an append-only observation generation.\n * @since 1.0.0\n * @category models\n */\nexport type Address = typeof Address.Type\n\n/**\n * Maximum encoded snapshot size, in JavaScript string code units.\n * @since 1.0.0\n * @category constants\n */\nexport const maximumSnapshotCharacters = 16 * 1024 * 1024\n\n/**\n * Frozen membership and newly pinned source digests for one generation.\n * @since 1.0.0\n * @category schemas\n */\nexport const Snapshot = Schema.Struct({\n version: Schema.Literal(1),\n generation: Natural,\n nodes: Schema.Array(Schema.Struct({\n id: Schema.NonEmptyString,\n key: Schema.NonEmptyString,\n reads: Schema.Array(Schema.Struct({\n entry: FileSet.ReadEntry,\n sourcePaths: Schema.Array(FileSet.Pattern)\n }))\n })).check(Schema.isMaxLength(Plan.maximumPlanNodes)),\n pins: Schema.Array(Schema.Struct({ path: FileSet.Pattern, digest: Schema.NonEmptyString }))\n})\n/**\n * Frozen membership and newly pinned source digests for one generation.\n * @since 1.0.0\n * @category models\n */\nexport type Snapshot = typeof Snapshot.Type\n\n/**\n * A durable observation cannot be read or safely admitted.\n * @since 1.0.0\n * @category errors\n */\nexport class PlanInputError extends Schema.TaggedError<PlanInputError>()(\"@smthrs/engine-store/PlanInputError\", {\n code: Schema.Literals([\n \"invalid_input\",\n \"corrupt_state\",\n \"incompatible_state\",\n \"fence_lost\",\n \"transaction_open\",\n \"persistence_failed\"\n ]),\n message: Schema.String,\n cause: Schema.optional(Schema.Unknown)\n}) {}\n\n/**\n * `get` is a committed-state admission gate and refuses an enclosing SQL\n * transaction. `record` is first-writer-wins and may join a write transaction;\n * callers must wait for its outer commit before executing affected actions.\n * @since 1.0.0\n * @category models\n */\nexport interface Service {\n readonly get: (address: Address, owner: OwnerId) => Effect.Effect<Option.Option<Snapshot>, PlanInputError>\n readonly record: (address: Address, snapshot: Snapshot, owner: OwnerId) => Effect.Effect<Snapshot, PlanInputError>\n}\n\n/**\n * Durable plan-input service.\n * @since 1.0.0\n * @category services\n */\nexport class PlanInputStore extends Context.Service<PlanInputStore, Service>()(\"@smthrs/engine-store/PlanInputStore\") {}\n\nconst failure = (code: PlanInputError[\"code\"], message: string, cause?: unknown) =>\n new PlanInputError({ code, message, ...(cause === undefined ? {} : { cause }) })\nconst persistError = (cause: unknown) =>\n cause instanceof PlanInputError ?\n cause :\n failure(\"persistence_failed\", \"could not access durable plan inputs\", cause)\n\nconst decode = <S extends Schema.Top & { readonly DecodingServices: never }>(\n schema: S,\n value: unknown,\n code: \"invalid_input\" | \"corrupt_state\"\n) =>\n Effect.try({\n try: () => Schema.decodeUnknownSync(schema)(value, { onExcessProperty: \"error\" }),\n catch: (cause) => failure(code, \"invalid plan input observation\", cause)\n })\n\nconst validateSnapshot = (snapshot: Snapshot, generation: number, code: \"invalid_input\" | \"corrupt_state\") => {\n if (\n snapshot.generation !== generation ||\n new Set(snapshot.nodes.map((node) => node.id)).size !== snapshot.nodes.length ||\n new Set(snapshot.pins.map((pin) => pin.path)).size !== snapshot.pins.length ||\n snapshot.nodes.some((node) =>\n node.reads.some((read) =>\n new Set(read.sourcePaths).size !== read.sourcePaths.length ||\n read.sourcePaths.some((path) =>\n typeof read.entry === \"string\" ? path !== read.entry : !FileSet.matchesGlob(read.entry, path)\n )\n )\n )\n ) {\n return Effect.fail(failure(code, \"plan input observation has inconsistent membership or generation\"))\n }\n return Effect.void\n}\n\n/**\n * Builds the SQL-backed, owner-fenced store.\n * @since 1.0.0\n * @category constructors\n */\nexport const make: Effect.Effect<Service, never, SqlClient.SqlClient | DurableWriter | Crypto.Crypto> = Effect.gen(\n function*() {\n const sql = yield* SqlClient.SqlClient\n const writer = yield* DurableWriter\n const crypto = yield* Effect.context<Crypto.Crypto>()\n const checksum = (value: string) => Schema.decodeUnknownEffect(Sha256)(value).pipe(Effect.provide(crypto))\n\n const fence = (address: Address, owner: OwnerId) =>\n Effect.gen(function*() {\n const owned = yield* sql`SELECT run_id FROM flows_runs WHERE run_id = ${address.runId}\n AND status = 'running' AND cancel_requested_at_ms IS NULL\n AND owner_host_id = ${owner.hostId} AND owner_pid = ${owner.pid} AND owner_nonce = ${owner.nonce}`\n if (owned.length !== 1) {\n return yield* Effect.fail(failure(\"fence_lost\", \"plan input owner no longer owns the run\"))\n }\n const legacy = yield* sql`SELECT run_id FROM flows_plan_input_legacy_runs WHERE run_id = ${address.runId}`\n if (legacy.length > 0) {\n return yield* Effect.fail(\n failure(\n \"incompatible_state\",\n \"this run executed before durable plan inputs were recorded; its original sources cannot be reconstructed\"\n )\n )\n }\n })\n\n const load = (address: Address) =>\n Effect.gen(function*() {\n const heads = yield* sql<\n { planId: string; baseDigest: string; environmentDigest: string | null; generation: number }\n >`SELECT plan_id AS \"planId\", base_digest AS \"baseDigest\", environment_digest AS \"environmentDigest\", generation\n FROM flows_plan_input_heads WHERE run_id = ${address.runId}`\n const head = heads[0]\n if (head === undefined) {\n const orphan = yield* sql`SELECT 1 FROM flows_plan_input_generations\n WHERE run_id = ${address.runId} AND plan_id = ${address.planId} LIMIT 1`\n if (address.generation !== 0 || orphan.length > 0) {\n return yield* Effect.fail(failure(\"corrupt_state\", \"plan input history has no initial generation\"))\n }\n return Option.none<Snapshot>()\n }\n yield* decode(\n Schema.Struct({\n planId: Schema.NonEmptyString,\n baseDigest: Schema.NonEmptyString,\n environmentDigest: Schema.NullOr(Schema.NonEmptyString),\n generation: Natural\n }),\n head,\n \"corrupt_state\"\n )\n if (head.planId !== address.planId || head.baseDigest !== address.baseDigest) {\n return yield* Effect.fail(\n failure(\"incompatible_state\", \"this run already observed a different approved plan\")\n )\n }\n if (head.environmentDigest === null || head.environmentDigest !== address.environmentDigest) {\n return yield* Effect.fail(failure(\n \"incompatible_state\",\n \"this run has a different or unrecorded execution environment; recover with its original runtime or explicitly reconcile before starting a new run\"\n ))\n }\n const counts = yield* sql<{ count: number; first: number; last: number }>`SELECT COUNT(*) AS count,\n MIN(generation) AS first, MAX(generation) AS last FROM flows_plan_input_generations\n WHERE run_id = ${address.runId} AND plan_id = ${address.planId}`\n if (\n counts[0]!.count !== head.generation + 1 || counts[0]!.first !== 0 || counts[0]!.last !== head.generation ||\n address.generation > head.generation + 1\n ) {\n return yield* Effect.fail(failure(\"corrupt_state\", \"plan input history has a missing generation\"))\n }\n if (address.generation > head.generation) return Option.none<Snapshot>()\n const rows = yield* sql<\n { snapshotJson: string; checksum: string }\n >`SELECT snapshot_json AS \"snapshotJson\", checksum\n FROM flows_plan_input_generations WHERE run_id = ${address.runId} AND plan_id = ${address.planId}\n AND generation = ${address.generation}`\n const row = rows[0]!\n if (\n row.snapshotJson.length > maximumSnapshotCharacters || (yield* checksum(row.snapshotJson)) !== row.checksum\n ) {\n return yield* Effect.fail(failure(\"corrupt_state\", \"plan input snapshot failed its size or integrity check\"))\n }\n const snapshot = yield* decode(Schema.fromJsonString(Snapshot), row.snapshotJson, \"corrupt_state\")\n yield* validateSnapshot(snapshot, address.generation, \"corrupt_state\")\n return Option.some(snapshot)\n })\n\n const get: Service[\"get\"] = Effect.fn(\"PlanInputStore.get\")((input, ownerInput) =>\n Effect.gen(function*() {\n const address = yield* decode(Address, input, \"invalid_input\")\n const owner = yield* decode(OwnerId, ownerInput, \"invalid_input\")\n if (Option.isSome(yield* Effect.serviceOption(sql.transactionService))) {\n return yield* Effect.fail(\n failure(\"transaction_open\", \"plan execution requires committed source observations\")\n )\n }\n return yield* writer.write(Effect.gen(function*() {\n yield* fence(address, owner)\n return yield* load(address)\n }))\n }).pipe(Effect.mapError(persistError))\n )\n\n const record: Service[\"record\"] = Effect.fn(\"PlanInputStore.record\")((input, value, ownerInput) =>\n Effect.gen(function*() {\n const address = yield* decode(Address, input, \"invalid_input\")\n const owner = yield* decode(OwnerId, ownerInput, \"invalid_input\")\n const snapshot = yield* decode(Snapshot, value, \"invalid_input\")\n yield* validateSnapshot(snapshot, address.generation, \"invalid_input\")\n const encoded = JSON.stringify(snapshot)\n if (encoded.length > maximumSnapshotCharacters) {\n return yield* Effect.fail(failure(\"invalid_input\", \"plan input snapshot exceeds the durable size limit\"))\n }\n const hash = yield* checksum(encoded)\n return yield* writer.write(Effect.gen(function*() {\n yield* fence(address, owner)\n const existing = yield* load(address)\n if (Option.isSome(existing)) return existing.value\n if (address.generation === 0) {\n yield* sql`INSERT INTO flows_plan_input_heads (run_id, plan_id, base_digest, environment_digest, merge_state_version, generation)\n VALUES (${address.runId}, ${address.planId}, ${address.baseDigest}, ${address.environmentDigest}, 1, 0)`\n } else {\n yield* sql`UPDATE flows_plan_input_heads SET generation = ${address.generation}\n WHERE run_id = ${address.runId} AND plan_id = ${address.planId}`\n }\n yield* sql`INSERT INTO flows_plan_input_generations (run_id, plan_id, generation, snapshot_json, checksum)\n VALUES (${address.runId}, ${address.planId}, ${address.generation}, ${encoded}, ${hash})`\n return snapshot\n }))\n }).pipe(Effect.mapError(persistError))\n )\n\n return { get, record }\n }\n)\n\n/**\n * Provides the SQL-backed input store over the same database as the run/attempt stores.\n * @since 1.0.0\n * @category layers\n */\nexport const layer: Layer.Layer<PlanInputStore, never, SqlClient.SqlClient | DurableWriter | Crypto.Crypto> = Layer\n .effect(\n PlanInputStore\n )(make)\n"]}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owner-fenced scheduler decisions, distinct from action failure evidence and
|
|
3
|
+
* redacted journal projections. Intent survives before a merge is appended.
|
|
4
|
+
* @since 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
import { DurableWriter } from "@smthrs/database/DurableWriter";
|
|
7
|
+
import { OwnerId } from "@smthrs/run-store/Ownership";
|
|
8
|
+
import { Context, Effect, Layer, Schema } from "effect";
|
|
9
|
+
import type * as Crypto from "effect/Crypto";
|
|
10
|
+
import * as SqlClient from "effect/unstable/sql/SqlClient";
|
|
11
|
+
/** Execution binding shared by every decision of one plan run.
|
|
12
|
+
* @since 1.0.0
|
|
13
|
+
* @category schemas
|
|
14
|
+
*/
|
|
15
|
+
export declare const Identity: Schema.Struct<{
|
|
16
|
+
readonly runId: Schema.NonEmptyString;
|
|
17
|
+
readonly planId: Schema.NonEmptyString;
|
|
18
|
+
readonly baseDigest: Schema.NonEmptyString;
|
|
19
|
+
readonly environmentDigest: Schema.NonEmptyString;
|
|
20
|
+
}>;
|
|
21
|
+
/** Execution binding.
|
|
22
|
+
* @since 1.0.0
|
|
23
|
+
* @category models
|
|
24
|
+
*/
|
|
25
|
+
export type Identity = typeof Identity.Type;
|
|
26
|
+
/** A stopped attempt and the exact cohort eligible to supply merge winners.
|
|
27
|
+
* @since 1.0.0
|
|
28
|
+
* @category schemas
|
|
29
|
+
*/
|
|
30
|
+
export declare const Intent: Schema.Struct<{
|
|
31
|
+
readonly version: Schema.Literal<1>;
|
|
32
|
+
readonly nodeId: Schema.NonEmptyString;
|
|
33
|
+
readonly nodeKey: Schema.NonEmptyString;
|
|
34
|
+
readonly dispatchKey: Schema.NonEmptyString;
|
|
35
|
+
readonly attempts: Schema.Int;
|
|
36
|
+
readonly rebases: Schema.Int;
|
|
37
|
+
readonly peers: Schema.$Array<Schema.NonEmptyString>;
|
|
38
|
+
}>;
|
|
39
|
+
/** Durable stopped-attempt decision.
|
|
40
|
+
* @since 1.0.0
|
|
41
|
+
* @category models
|
|
42
|
+
*/
|
|
43
|
+
export type Intent = typeof Intent.Type;
|
|
44
|
+
/** The plan extension committed for an intent.
|
|
45
|
+
* @since 1.0.0
|
|
46
|
+
* @category schemas
|
|
47
|
+
*/
|
|
48
|
+
export declare const Completion: Schema.Struct<{
|
|
49
|
+
readonly version: Schema.Literal<1>;
|
|
50
|
+
readonly generation: Schema.Int;
|
|
51
|
+
readonly parentDigest: Schema.NonEmptyString;
|
|
52
|
+
readonly planDigest: Schema.NonEmptyString;
|
|
53
|
+
readonly mergeId: Schema.NonEmptyString;
|
|
54
|
+
readonly mergeKey: Schema.NonEmptyString;
|
|
55
|
+
readonly winners: Schema.$Array<Schema.NonEmptyString>;
|
|
56
|
+
}>;
|
|
57
|
+
/** Committed merge extension.
|
|
58
|
+
* @since 1.0.0
|
|
59
|
+
* @category models
|
|
60
|
+
*/
|
|
61
|
+
export type Completion = typeof Completion.Type;
|
|
62
|
+
/** Intent with its optional committed extension.
|
|
63
|
+
* @since 1.0.0
|
|
64
|
+
* @category models
|
|
65
|
+
*/
|
|
66
|
+
export interface Decision {
|
|
67
|
+
readonly intent: Intent;
|
|
68
|
+
readonly completion?: Completion;
|
|
69
|
+
}
|
|
70
|
+
declare const PlanMergeError_base: Schema.Class<PlanMergeError, Schema.TaggedStruct<"@smthrs/engine-store/PlanMergeError", {
|
|
71
|
+
readonly code: Schema.Literals<readonly ["invalid_input", "corrupt_state", "incompatible_state", "fence_lost", "transaction_open", "transaction_required", "persistence_failed"]>;
|
|
72
|
+
readonly message: Schema.String;
|
|
73
|
+
readonly cause: Schema.optional<Schema.Unknown>;
|
|
74
|
+
}>, import("effect/Cause").YieldableError>;
|
|
75
|
+
/** Typed admission/storage refusal.
|
|
76
|
+
* @since 1.0.0
|
|
77
|
+
* @category errors
|
|
78
|
+
*/
|
|
79
|
+
export declare class PlanMergeError extends PlanMergeError_base {
|
|
80
|
+
}
|
|
81
|
+
/** Store operations; writes may join the owning transaction, reads require committed state.
|
|
82
|
+
* @since 1.0.0
|
|
83
|
+
* @category models
|
|
84
|
+
*/
|
|
85
|
+
export interface Service {
|
|
86
|
+
readonly list: (identity: Identity, owner: OwnerId) => Effect.Effect<ReadonlyArray<Decision>, PlanMergeError>;
|
|
87
|
+
readonly intend: (identity: Identity, intent: Intent, owner: OwnerId) => Effect.Effect<Intent, PlanMergeError>;
|
|
88
|
+
readonly complete: (identity: Identity, nodeId: string, completion: Completion, owner: OwnerId) => Effect.Effect<Completion, PlanMergeError>;
|
|
89
|
+
}
|
|
90
|
+
declare const PlanMergeStore_base: Context.ServiceClass<PlanMergeStore, "@smthrs/engine-store/PlanMergeStore", Service>;
|
|
91
|
+
/** Durable merge decision service.
|
|
92
|
+
* @since 1.0.0
|
|
93
|
+
* @category services
|
|
94
|
+
*/
|
|
95
|
+
export declare class PlanMergeStore extends PlanMergeStore_base {
|
|
96
|
+
}
|
|
97
|
+
/** Encoded decision limit, in JavaScript code units.
|
|
98
|
+
* @since 1.0.0
|
|
99
|
+
* @category constants
|
|
100
|
+
*/
|
|
101
|
+
export declare const maximumDecisionCharacters: number;
|
|
102
|
+
/** SQL constructor; all collaborating stores must use the same database/writer.
|
|
103
|
+
* @since 1.0.0
|
|
104
|
+
* @category constructors
|
|
105
|
+
*/
|
|
106
|
+
export declare const make: Effect.Effect<Service, never, SqlClient.SqlClient | DurableWriter | Crypto.Crypto>;
|
|
107
|
+
/** SQL-backed merge decisions; migrations must run first.
|
|
108
|
+
* @since 1.0.0
|
|
109
|
+
* @category layers
|
|
110
|
+
*/
|
|
111
|
+
export declare const layer: Layer.Layer<PlanMergeStore, never, SqlClient.SqlClient | DurableWriter | Crypto.Crypto>;
|
|
112
|
+
export {};
|
|
113
|
+
//# sourceMappingURL=PlanMergeStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlanMergeStore.d.ts","sourceRoot":"","sources":["../../src/PlanMergeStore.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAE9D,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/D,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAM1D;;;GAGG;AACH,eAAO,MAAM,QAAQ;;;;;EAKnB,CAAA;AACF;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC,IAAI,CAAA;AAC3C;;;GAGG;AACH,eAAO,MAAM,MAAM;;;;;;;;EAQjB,CAAA;AACF;;;GAGG;AACH,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,IAAI,CAAA;AACvC;;;GAGG;AACH,eAAO,MAAM,UAAU;;;;;;;;EAQrB,CAAA;AACF;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,IAAI,CAAA;AAC/C;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAA;CACjC;;;;;;AACD;;;GAGG;AACH,qBAAa,cAAe,SAAQ,mBAYlC;CAAG;AACL;;;GAGG;AACH,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC,CAAA;IAC7G,QAAQ,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IAC9G,QAAQ,CAAC,QAAQ,EAAE,CACjB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,OAAO,KACX,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,cAAc,CAAC,CAAA;CAC/C;;AACD;;;GAGG;AACH,qBAAa,cAAe,SAAQ,mBAAiF;CAAG;AACxH;;;GAGG;AACH,eAAO,MAAM,yBAAyB,QAAmB,CAAA;AAiBzD;;;GAGG;AACH,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,SAAS,GAAG,aAAa,GAAG,MAAM,CAAC,MAAM,CAyLnG,CAAA;AACD;;;GAGG;AACH,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,EAAE,SAAS,CAAC,SAAS,GAAG,aAAa,GAAG,MAAM,CAAC,MAAM,CAC3E,CAAA"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owner-fenced scheduler decisions, distinct from action failure evidence and
|
|
3
|
+
* redacted journal projections. Intent survives before a merge is appended.
|
|
4
|
+
* @since 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
import { Sha256 } from "@smthrs/crypto";
|
|
7
|
+
import { DurableWriter } from "@smthrs/database/DurableWriter";
|
|
8
|
+
import { Plan } from "@smthrs/plan";
|
|
9
|
+
import { OwnerId } from "@smthrs/run-store/Ownership";
|
|
10
|
+
import { Context, Effect, Layer, Option, Schema } from "effect";
|
|
11
|
+
import * as SqlClient from "effect/unstable/sql/SqlClient";
|
|
12
|
+
const Natural = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0));
|
|
13
|
+
const Positive = Schema.Int.check(Schema.isGreaterThan(0));
|
|
14
|
+
const Names = Schema.Array(Schema.NonEmptyString).check(Schema.isMaxLength(Plan.maximumPlanNodes));
|
|
15
|
+
/** Execution binding shared by every decision of one plan run.
|
|
16
|
+
* @since 1.0.0
|
|
17
|
+
* @category schemas
|
|
18
|
+
*/
|
|
19
|
+
export const Identity = Schema.Struct({
|
|
20
|
+
runId: Schema.NonEmptyString,
|
|
21
|
+
planId: Schema.NonEmptyString,
|
|
22
|
+
baseDigest: Schema.NonEmptyString,
|
|
23
|
+
environmentDigest: Schema.NonEmptyString
|
|
24
|
+
});
|
|
25
|
+
/** A stopped attempt and the exact cohort eligible to supply merge winners.
|
|
26
|
+
* @since 1.0.0
|
|
27
|
+
* @category schemas
|
|
28
|
+
*/
|
|
29
|
+
export const Intent = Schema.Struct({
|
|
30
|
+
version: Schema.Literal(1),
|
|
31
|
+
nodeId: Schema.NonEmptyString,
|
|
32
|
+
nodeKey: Schema.NonEmptyString,
|
|
33
|
+
dispatchKey: Schema.NonEmptyString,
|
|
34
|
+
attempts: Positive,
|
|
35
|
+
rebases: Natural,
|
|
36
|
+
peers: Names
|
|
37
|
+
});
|
|
38
|
+
/** The plan extension committed for an intent.
|
|
39
|
+
* @since 1.0.0
|
|
40
|
+
* @category schemas
|
|
41
|
+
*/
|
|
42
|
+
export const Completion = Schema.Struct({
|
|
43
|
+
version: Schema.Literal(1),
|
|
44
|
+
generation: Positive,
|
|
45
|
+
parentDigest: Schema.NonEmptyString,
|
|
46
|
+
planDigest: Schema.NonEmptyString,
|
|
47
|
+
mergeId: Schema.NonEmptyString,
|
|
48
|
+
mergeKey: Schema.NonEmptyString,
|
|
49
|
+
winners: Names
|
|
50
|
+
});
|
|
51
|
+
/** Typed admission/storage refusal.
|
|
52
|
+
* @since 1.0.0
|
|
53
|
+
* @category errors
|
|
54
|
+
*/
|
|
55
|
+
export class PlanMergeError extends Schema.TaggedError()("@smthrs/engine-store/PlanMergeError", {
|
|
56
|
+
code: Schema.Literals([
|
|
57
|
+
"invalid_input",
|
|
58
|
+
"corrupt_state",
|
|
59
|
+
"incompatible_state",
|
|
60
|
+
"fence_lost",
|
|
61
|
+
"transaction_open",
|
|
62
|
+
"transaction_required",
|
|
63
|
+
"persistence_failed"
|
|
64
|
+
]),
|
|
65
|
+
message: Schema.String,
|
|
66
|
+
cause: Schema.optional(Schema.Unknown)
|
|
67
|
+
}) {
|
|
68
|
+
}
|
|
69
|
+
/** Durable merge decision service.
|
|
70
|
+
* @since 1.0.0
|
|
71
|
+
* @category services
|
|
72
|
+
*/
|
|
73
|
+
export class PlanMergeStore extends Context.Service()("@smthrs/engine-store/PlanMergeStore") {
|
|
74
|
+
}
|
|
75
|
+
/** Encoded decision limit, in JavaScript code units.
|
|
76
|
+
* @since 1.0.0
|
|
77
|
+
* @category constants
|
|
78
|
+
*/
|
|
79
|
+
export const maximumDecisionCharacters = 16 * 1024 * 1024;
|
|
80
|
+
const error = (code, message, cause) => new PlanMergeError({ code, message, ...(cause === undefined ? {} : { cause }) });
|
|
81
|
+
const storageError = (cause) => cause instanceof PlanMergeError ? cause : error("persistence_failed", "could not access plan merge decisions", cause);
|
|
82
|
+
const decode = (schema, value, code) => Effect.try({
|
|
83
|
+
try: () => Schema.decodeUnknownSync(schema)(value, { onExcessProperty: "error" }),
|
|
84
|
+
catch: (cause) => error(code, "invalid plan merge decision", cause)
|
|
85
|
+
});
|
|
86
|
+
const unique = (names, code) => new Set(names).size === names.length ? Effect.void : Effect.fail(error(code, "duplicate merge peer identity"));
|
|
87
|
+
/** SQL constructor; all collaborating stores must use the same database/writer.
|
|
88
|
+
* @since 1.0.0
|
|
89
|
+
* @category constructors
|
|
90
|
+
*/
|
|
91
|
+
export const make = Effect.gen(function* () {
|
|
92
|
+
const sql = yield* SqlClient.SqlClient;
|
|
93
|
+
const writer = yield* DurableWriter;
|
|
94
|
+
const crypto = yield* Effect.context();
|
|
95
|
+
const hash = (value) => Schema.decodeUnknownEffect(Sha256)(value).pipe(Effect.provide(crypto));
|
|
96
|
+
const fence = (identity, owner, requireHead) => Effect.gen(function* () {
|
|
97
|
+
const owned = yield* sql `SELECT run_id FROM flows_runs WHERE run_id = ${identity.runId}
|
|
98
|
+
AND status = 'running' AND cancel_requested_at_ms IS NULL
|
|
99
|
+
AND owner_host_id = ${owner.hostId} AND owner_pid = ${owner.pid} AND owner_nonce = ${owner.nonce}`;
|
|
100
|
+
if (owned.length !== 1) {
|
|
101
|
+
return yield* Effect.fail(error("fence_lost", "merge decision owner no longer owns the run"));
|
|
102
|
+
}
|
|
103
|
+
const heads = yield* sql `SELECT
|
|
104
|
+
plan_id AS "planId", base_digest AS "baseDigest", environment_digest AS "environmentDigest", merge_state_version AS version
|
|
105
|
+
FROM flows_plan_input_heads WHERE run_id = ${identity.runId}`;
|
|
106
|
+
const head = heads[0];
|
|
107
|
+
if (head === undefined) {
|
|
108
|
+
const orphan = yield* sql `SELECT 1 FROM flows_plan_merge_intents WHERE run_id = ${identity.runId} LIMIT 1`;
|
|
109
|
+
if (requireHead || orphan.length > 0) {
|
|
110
|
+
return yield* Effect.fail(error("corrupt_state", "merge intent has no admitted input generation"));
|
|
111
|
+
}
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
if (head.version !== 1 || head.planId !== identity.planId || head.baseDigest !== identity.baseDigest ||
|
|
115
|
+
head.environmentDigest !== identity.environmentDigest) {
|
|
116
|
+
return yield* Effect.fail(error("incompatible_state", "this run has different or unrecorded merge execution state; recover with its original runtime or reconcile before starting a new run"));
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
const encoded = (value) => Effect.gen(function* () {
|
|
120
|
+
const json = JSON.stringify(value);
|
|
121
|
+
if (json.length > maximumDecisionCharacters) {
|
|
122
|
+
return yield* Effect.fail(error("invalid_input", "merge decision exceeds its durable size limit"));
|
|
123
|
+
}
|
|
124
|
+
return { json, checksum: yield* hash(json) };
|
|
125
|
+
});
|
|
126
|
+
const stored = (schema, row) => Effect.gen(function* () {
|
|
127
|
+
if (row.json.length > maximumDecisionCharacters || (yield* hash(row.json)) !== row.checksum) {
|
|
128
|
+
return yield* Effect.fail(error("corrupt_state", "merge decision failed its size or integrity check"));
|
|
129
|
+
}
|
|
130
|
+
return yield* decode(Schema.fromJsonString(schema), row.json, "corrupt_state");
|
|
131
|
+
});
|
|
132
|
+
const load = (identity, nodeId) => Effect.gen(function* () {
|
|
133
|
+
const rows = yield* sql `SELECT i.stopped_node_id AS "nodeId", i.intent_json AS json, i.checksum,
|
|
134
|
+
c.generation, c.merge_node_id AS "mergeId", c.completion_json AS "completionJson",
|
|
135
|
+
c.checksum AS "completionChecksum"
|
|
136
|
+
FROM flows_plan_merge_intents i LEFT JOIN flows_plan_merge_completions c
|
|
137
|
+
ON c.run_id = i.run_id AND c.stopped_node_id = i.stopped_node_id
|
|
138
|
+
WHERE i.run_id = ${identity.runId} ${nodeId === undefined ? sql `` : sql `AND i.stopped_node_id = ${nodeId}`}
|
|
139
|
+
ORDER BY i.stopped_node_id LIMIT ${Plan.maximumPlanNodes + 1}`;
|
|
140
|
+
if (rows.length > Plan.maximumPlanNodes) {
|
|
141
|
+
return yield* Effect.fail(error("corrupt_state", "too many merge decisions for one plan"));
|
|
142
|
+
}
|
|
143
|
+
return yield* Effect.forEach(rows, (row) => Effect.gen(function* () {
|
|
144
|
+
const intent = yield* stored(Intent, row);
|
|
145
|
+
yield* unique(intent.peers, "corrupt_state");
|
|
146
|
+
if (intent.nodeId !== row.nodeId || intent.peers.includes(intent.nodeId)) {
|
|
147
|
+
return yield* Effect.fail(error("corrupt_state", "merge intent identity is inconsistent"));
|
|
148
|
+
}
|
|
149
|
+
if (row.completionJson === null)
|
|
150
|
+
return { intent };
|
|
151
|
+
const completion = yield* stored(Completion, {
|
|
152
|
+
json: row.completionJson,
|
|
153
|
+
checksum: row.completionChecksum
|
|
154
|
+
});
|
|
155
|
+
yield* unique(completion.winners, "corrupt_state");
|
|
156
|
+
if (completion.generation !== row.generation || completion.mergeId !== row.mergeId ||
|
|
157
|
+
completion.winners.some((id) => !intent.peers.includes(id))) {
|
|
158
|
+
return yield* Effect.fail(error("corrupt_state", "merge completion does not match its intent"));
|
|
159
|
+
}
|
|
160
|
+
return { intent, completion };
|
|
161
|
+
}));
|
|
162
|
+
});
|
|
163
|
+
const list = (input, ownerInput) => Effect.gen(function* () {
|
|
164
|
+
const identity = yield* decode(Identity, input, "invalid_input");
|
|
165
|
+
const owner = yield* decode(OwnerId, ownerInput, "invalid_input");
|
|
166
|
+
if (Option.isSome(yield* Effect.serviceOption(sql.transactionService))) {
|
|
167
|
+
return yield* Effect.fail(error("transaction_open", "merge recovery requires committed decisions"));
|
|
168
|
+
}
|
|
169
|
+
return yield* writer.write(Effect.gen(function* () {
|
|
170
|
+
yield* fence(identity, owner, false);
|
|
171
|
+
return yield* load(identity);
|
|
172
|
+
}));
|
|
173
|
+
}).pipe(Effect.mapError(storageError));
|
|
174
|
+
const intend = (input, value, ownerInput) => Effect.gen(function* () {
|
|
175
|
+
const identity = yield* decode(Identity, input, "invalid_input");
|
|
176
|
+
const owner = yield* decode(OwnerId, ownerInput, "invalid_input");
|
|
177
|
+
const intent = yield* decode(Intent, value, "invalid_input");
|
|
178
|
+
yield* unique(intent.peers, "invalid_input");
|
|
179
|
+
if (intent.peers.includes(intent.nodeId)) {
|
|
180
|
+
return yield* Effect.fail(error("invalid_input", "a merge cannot stop its own peer"));
|
|
181
|
+
}
|
|
182
|
+
const data = yield* encoded(intent);
|
|
183
|
+
return yield* writer.write(Effect.gen(function* () {
|
|
184
|
+
yield* fence(identity, owner, true);
|
|
185
|
+
const [existing] = yield* load(identity, intent.nodeId);
|
|
186
|
+
if (existing !== undefined)
|
|
187
|
+
return existing.intent;
|
|
188
|
+
const [count] = yield* sql `SELECT count(*) AS count
|
|
189
|
+
FROM flows_plan_merge_intents WHERE run_id = ${identity.runId}`;
|
|
190
|
+
if (count.count >= Plan.maximumPlanNodes) {
|
|
191
|
+
return yield* Effect.fail(error("invalid_input", "too many merge intents for one plan"));
|
|
192
|
+
}
|
|
193
|
+
yield* sql `INSERT INTO flows_plan_merge_intents (run_id, stopped_node_id, intent_json, checksum)
|
|
194
|
+
VALUES (${identity.runId}, ${intent.nodeId}, ${data.json}, ${data.checksum})`;
|
|
195
|
+
return intent;
|
|
196
|
+
}));
|
|
197
|
+
}).pipe(Effect.mapError(storageError));
|
|
198
|
+
const complete = (input, nodeIdInput, value, ownerInput) => Effect.gen(function* () {
|
|
199
|
+
if (Option.isNone(yield* Effect.serviceOption(sql.transactionService))) {
|
|
200
|
+
return yield* Effect.fail(error("transaction_required", "merge completion must join the plan/input append transaction"));
|
|
201
|
+
}
|
|
202
|
+
const identity = yield* decode(Identity, input, "invalid_input");
|
|
203
|
+
const owner = yield* decode(OwnerId, ownerInput, "invalid_input");
|
|
204
|
+
const nodeId = yield* decode(Schema.NonEmptyString, nodeIdInput, "invalid_input");
|
|
205
|
+
const completion = yield* decode(Completion, value, "invalid_input");
|
|
206
|
+
yield* unique(completion.winners, "invalid_input");
|
|
207
|
+
const data = yield* encoded(completion);
|
|
208
|
+
return yield* writer.write(Effect.gen(function* () {
|
|
209
|
+
yield* fence(identity, owner, true);
|
|
210
|
+
const [decision] = yield* load(identity, nodeId);
|
|
211
|
+
if (decision === undefined) {
|
|
212
|
+
return yield* Effect.fail(error("corrupt_state", "merge completion has no intent"));
|
|
213
|
+
}
|
|
214
|
+
if (decision.completion !== undefined) {
|
|
215
|
+
if (JSON.stringify(decision.completion) !== JSON.stringify(completion)) {
|
|
216
|
+
return yield* Effect.fail(error("incompatible_state", "a merge intent already committed a different extension"));
|
|
217
|
+
}
|
|
218
|
+
return decision.completion;
|
|
219
|
+
}
|
|
220
|
+
if (completion.winners.some((id) => !decision.intent.peers.includes(id))) {
|
|
221
|
+
return yield* Effect.fail(error("invalid_input", "merge winner was not an admitted peer"));
|
|
222
|
+
}
|
|
223
|
+
const appended = yield* sql `SELECT p.plan_id FROM flows_plans p JOIN flows_plan_input_generations i ON i.plan_id = p.plan_id
|
|
224
|
+
JOIN flows_plan_nodes n ON n.plan_id = p.plan_id AND n.generation = p.generation
|
|
225
|
+
WHERE p.plan_id = ${identity.planId} AND p.digest = ${completion.planDigest} AND p.generation = ${completion.generation}
|
|
226
|
+
AND i.run_id = ${identity.runId} AND i.generation = ${completion.generation}
|
|
227
|
+
AND n.node_id = ${completion.mergeId} AND n.key_digest = ${completion.mergeKey} AND n.kind = 'merge'`;
|
|
228
|
+
if (appended.length !== 1) {
|
|
229
|
+
return yield* Effect.fail(error("corrupt_state", "merge completion requires its plan and input generation in the same transaction"));
|
|
230
|
+
}
|
|
231
|
+
yield* sql `INSERT INTO flows_plan_merge_completions (run_id, stopped_node_id, generation, merge_node_id, completion_json, checksum)
|
|
232
|
+
VALUES (${identity.runId}, ${nodeId}, ${completion.generation}, ${completion.mergeId}, ${data.json}, ${data.checksum})`;
|
|
233
|
+
return completion;
|
|
234
|
+
}));
|
|
235
|
+
}).pipe(Effect.mapError(storageError));
|
|
236
|
+
return { list, intend, complete };
|
|
237
|
+
});
|
|
238
|
+
/** SQL-backed merge decisions; migrations must run first.
|
|
239
|
+
* @since 1.0.0
|
|
240
|
+
* @category layers
|
|
241
|
+
*/
|
|
242
|
+
export const layer = Layer
|
|
243
|
+
.effect(PlanMergeStore)(make);
|
|
244
|
+
//# sourceMappingURL=PlanMergeStore.js.map
|