@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,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Engine-private Jujutsu authority.
|
|
3
|
+
*
|
|
4
|
+
* Action bodies resolve the public `Jj` tag from their guarded host context.
|
|
5
|
+
* Snapshot, restore, and diff bookkeeping resolve this distinct tag instead,
|
|
6
|
+
* so an engine operation never grants the same authority to user code.
|
|
7
|
+
*
|
|
8
|
+
* @since 1.0.0
|
|
9
|
+
*/
|
|
10
|
+
import { Jj } from "@smthrs/kernel";
|
|
11
|
+
import * as Context from "effect/Context";
|
|
12
|
+
import * as Layer from "effect/Layer";
|
|
13
|
+
declare const EngineJj_base: Context.ServiceClass<EngineJj, "@smthrs/engine-store/internal/EngineJj", Jj.Jj>;
|
|
14
|
+
/**
|
|
15
|
+
* Engine-owned repository operations, absent from public action context.
|
|
16
|
+
*
|
|
17
|
+
* @since 1.0.0
|
|
18
|
+
* @category services
|
|
19
|
+
*/
|
|
20
|
+
export declare class EngineJj extends EngineJj_base {
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Captures the current public Jj implementation under the private engine tag.
|
|
24
|
+
*
|
|
25
|
+
* @since 1.0.0
|
|
26
|
+
* @category layers
|
|
27
|
+
*/
|
|
28
|
+
export declare const layerFromJj: Layer.Layer<EngineJj, never, Jj.Jj>;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=EngineJj.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EngineJj.d.ts","sourceRoot":"","sources":["../../../src/internal/EngineJj.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAA;AACnC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AAEzC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;;AAErC;;;;;GAKG;AACH,qBAAa,QAAS,SAAQ,aAA4E;CAAG;AAE7G;;;;;GAKG;AACH,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAA0D,CAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Engine-private Jujutsu authority.
|
|
3
|
+
*
|
|
4
|
+
* Action bodies resolve the public `Jj` tag from their guarded host context.
|
|
5
|
+
* Snapshot, restore, and diff bookkeeping resolve this distinct tag instead,
|
|
6
|
+
* so an engine operation never grants the same authority to user code.
|
|
7
|
+
*
|
|
8
|
+
* @since 1.0.0
|
|
9
|
+
*/
|
|
10
|
+
import { Jj } from "@smthrs/kernel";
|
|
11
|
+
import * as Context from "effect/Context";
|
|
12
|
+
import * as Effect from "effect/Effect";
|
|
13
|
+
import * as Layer from "effect/Layer";
|
|
14
|
+
/**
|
|
15
|
+
* Engine-owned repository operations, absent from public action context.
|
|
16
|
+
*
|
|
17
|
+
* @since 1.0.0
|
|
18
|
+
* @category services
|
|
19
|
+
*/
|
|
20
|
+
export class EngineJj extends Context.Service()("@smthrs/engine-store/internal/EngineJj") {
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Captures the current public Jj implementation under the private engine tag.
|
|
24
|
+
*
|
|
25
|
+
* @since 1.0.0
|
|
26
|
+
* @category layers
|
|
27
|
+
*/
|
|
28
|
+
export const layerFromJj = Layer.effect(EngineJj, Effect.map(Jj.Jj, EngineJj.of));
|
|
29
|
+
//# sourceMappingURL=EngineJj.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EngineJj.js","sourceRoot":"","sources":["../../../src/internal/EngineJj.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAA;AACnC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC;;;;;GAKG;AACH,MAAM,OAAO,QAAS,SAAQ,OAAO,CAAC,OAAO,EAAmB,CAAC,wCAAwC,CAAC;CAAG;AAE7G;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAwC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA","sourcesContent":["/**\n * Engine-private Jujutsu authority.\n *\n * Action bodies resolve the public `Jj` tag from their guarded host context.\n * Snapshot, restore, and diff bookkeeping resolve this distinct tag instead,\n * so an engine operation never grants the same authority to user code.\n *\n * @since 1.0.0\n */\n\nimport { Jj } from \"@smthrs/kernel\"\nimport * as Context from \"effect/Context\"\nimport * as Effect from \"effect/Effect\"\nimport * as Layer from \"effect/Layer\"\n\n/**\n * Engine-owned repository operations, absent from public action context.\n *\n * @since 1.0.0\n * @category services\n */\nexport class EngineJj extends Context.Service<EngineJj, Jj.Jj>()(\"@smthrs/engine-store/internal/EngineJj\") {}\n\n/**\n * Captures the current public Jj implementation under the private engine tag.\n *\n * @since 1.0.0\n * @category layers\n */\nexport const layerFromJj: Layer.Layer<EngineJj, never, Jj.Jj> = Layer.effect(EngineJj, Effect.map(Jj.Jj, EngineJj.of))\n"]}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The schema objects `DurableEngineState` creates outside the journal
|
|
3
|
+
* migration, and the inventory of what porting them to another
|
|
4
|
+
* dialect costs.
|
|
5
|
+
*
|
|
6
|
+
* Each durable package owns its migration ladder. Spawn edges and their GC
|
|
7
|
+
* trigger moved into engine-store migration 0006. The remaining
|
|
8
|
+
* statements are engine-store-owned storage created idempotently at
|
|
9
|
+
* construction instead (issues #40/#41/#79/#81). That is a deliberate lane
|
|
10
|
+
* boundary, not an oversight — but it left the statements invisible to the
|
|
11
|
+
* pg-porting plan in the database roadmap, which
|
|
12
|
+
* scoped only the journal migration's SQLite-specific DDL. Declaring them here
|
|
13
|
+
* makes the inventory machine-readable: a test diffs the database's schema
|
|
14
|
+
* objects across `make` against this list, so no engine-owned statement can
|
|
15
|
+
* be added without appearing in the porting inventory (issue #92).
|
|
16
|
+
*
|
|
17
|
+
* @since 0.1.0
|
|
18
|
+
*/
|
|
19
|
+
import type { Service as WriterService } from "@smthrs/database/DurableWriter";
|
|
20
|
+
import * as Effect from "effect/Effect";
|
|
21
|
+
import type * as SqlClient from "effect/unstable/sql/SqlClient";
|
|
22
|
+
/**
|
|
23
|
+
* SQL dialects a statement is known to be accepted by, verbatim.
|
|
24
|
+
*
|
|
25
|
+
* @since 0.1.0
|
|
26
|
+
* @category models
|
|
27
|
+
*/
|
|
28
|
+
export type Dialect = "sqlite" | "postgres";
|
|
29
|
+
/**
|
|
30
|
+
* One engine-store-owned schema object.
|
|
31
|
+
*
|
|
32
|
+
* @since 0.1.0
|
|
33
|
+
* @category models
|
|
34
|
+
*/
|
|
35
|
+
export interface Statement {
|
|
36
|
+
/** The schema object's name, as it appears in the catalog. */
|
|
37
|
+
readonly name: string;
|
|
38
|
+
/** Why the object exists, by issue. */
|
|
39
|
+
readonly reason: string;
|
|
40
|
+
/**
|
|
41
|
+
* Dialects that accept this statement unchanged. A statement listing only
|
|
42
|
+
* `"sqlite"` must be rewritten before a Postgres/PGlite `Database` layer
|
|
43
|
+
* can construct this service — `make` pipes every one of them through
|
|
44
|
+
* `Effect.orDie`, so an unported statement is a construction-time defect,
|
|
45
|
+
* not a recoverable error.
|
|
46
|
+
*/
|
|
47
|
+
readonly dialects: ReadonlyArray<Dialect>;
|
|
48
|
+
readonly ddl: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* The porting inventory: every engine-store-owned statement, in creation order.
|
|
52
|
+
*
|
|
53
|
+
* @since 0.1.0
|
|
54
|
+
* @category constants
|
|
55
|
+
*/
|
|
56
|
+
export declare const statements: ReadonlyArray<Statement>;
|
|
57
|
+
/**
|
|
58
|
+
* Creates the engine-store-owned objects, idempotently, in inventory order.
|
|
59
|
+
*
|
|
60
|
+
* `flows_runs` must already exist — every query in this service assumes a
|
|
61
|
+
* migrated database, so `make` composes over one by construction. A read-only
|
|
62
|
+
* client installs nothing.
|
|
63
|
+
*
|
|
64
|
+
* @since 0.1.0
|
|
65
|
+
* @category constructors
|
|
66
|
+
*/
|
|
67
|
+
export declare const apply: (sql: SqlClient.SqlClient, writer: WriterService) => Effect.Effect<void>;
|
|
68
|
+
//# sourceMappingURL=EngineStateSchema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EngineStateSchema.d.ts","sourceRoot":"","sources":["../../../src/internal/EngineStateSchema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9E,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAE/D;;;;;GAKG;AACH,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAA;AAE3C;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACxB,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,uCAAuC;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;IACzC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CACrB;AAED;;;;;GAKG;AACH,eAAO,MAAM,UAAU,EAAE,aAAa,CAAC,SAAS,CAa/C,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,KAAK,GAAI,KAAK,SAAS,CAAC,SAAS,EAAE,QAAQ,aAAa,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAMvF,CAAA"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The schema objects `DurableEngineState` creates outside the journal
|
|
3
|
+
* migration, and the inventory of what porting them to another
|
|
4
|
+
* dialect costs.
|
|
5
|
+
*
|
|
6
|
+
* Each durable package owns its migration ladder. Spawn edges and their GC
|
|
7
|
+
* trigger moved into engine-store migration 0006. The remaining
|
|
8
|
+
* statements are engine-store-owned storage created idempotently at
|
|
9
|
+
* construction instead (issues #40/#41/#79/#81). That is a deliberate lane
|
|
10
|
+
* boundary, not an oversight — but it left the statements invisible to the
|
|
11
|
+
* pg-porting plan in the database roadmap, which
|
|
12
|
+
* scoped only the journal migration's SQLite-specific DDL. Declaring them here
|
|
13
|
+
* makes the inventory machine-readable: a test diffs the database's schema
|
|
14
|
+
* objects across `make` against this list, so no engine-owned statement can
|
|
15
|
+
* be added without appearing in the porting inventory (issue #92).
|
|
16
|
+
*
|
|
17
|
+
* @since 0.1.0
|
|
18
|
+
*/
|
|
19
|
+
import { isReadOnly } from "@smthrs/database/Dialect";
|
|
20
|
+
import * as Effect from "effect/Effect";
|
|
21
|
+
/**
|
|
22
|
+
* The porting inventory: every engine-store-owned statement, in creation order.
|
|
23
|
+
*
|
|
24
|
+
* @since 0.1.0
|
|
25
|
+
* @category constants
|
|
26
|
+
*/
|
|
27
|
+
export const statements = [
|
|
28
|
+
{
|
|
29
|
+
name: "flows_runs_stale_running_idx",
|
|
30
|
+
reason: "Serves the stale-running sweep's per-tick predicate (issue #79): `status = 'running' AND heartbeat_at_ms < cutoff`, ordered by heartbeat. A partial index keeps it tiny — only live running rows appear.",
|
|
31
|
+
// Partial indexes are valid Postgres since 9.5, so this one ports as-is.
|
|
32
|
+
dialects: ["sqlite", "postgres"],
|
|
33
|
+
ddl: `
|
|
34
|
+
CREATE INDEX IF NOT EXISTS flows_runs_stale_running_idx
|
|
35
|
+
ON flows_runs (heartbeat_at_ms)
|
|
36
|
+
WHERE status = 'running'
|
|
37
|
+
`
|
|
38
|
+
}
|
|
39
|
+
];
|
|
40
|
+
/**
|
|
41
|
+
* Creates the engine-store-owned objects, idempotently, in inventory order.
|
|
42
|
+
*
|
|
43
|
+
* `flows_runs` must already exist — every query in this service assumes a
|
|
44
|
+
* migrated database, so `make` composes over one by construction. A read-only
|
|
45
|
+
* client installs nothing.
|
|
46
|
+
*
|
|
47
|
+
* @since 0.1.0
|
|
48
|
+
* @category constructors
|
|
49
|
+
*/
|
|
50
|
+
export const apply = (sql, writer) =>
|
|
51
|
+
// A read-only observer reads the schema it finds and installs nothing.
|
|
52
|
+
isReadOnly(sql) ? Effect.void : Effect.forEach(statements, (statement) => writer.write(sql.unsafe(statement.ddl)).pipe(Effect.orDie), { discard: true });
|
|
53
|
+
//# sourceMappingURL=EngineStateSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EngineStateSchema.js","sourceRoot":"","sources":["../../../src/internal/EngineStateSchema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAErD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAiCvC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAA6B;IAClD;QACE,IAAI,EAAE,8BAA8B;QACpC,MAAM,EACJ,0MAA0M;QAC5M,yEAAyE;QACzE,QAAQ,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC;QAChC,GAAG,EAAE;;;;KAIJ;KACF;CACF,CAAA;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,GAAwB,EAAE,MAAqB,EAAuB,EAAE;AAC5F,uEAAuE;AACvE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAC5C,UAAU,EACV,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EACzE,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB,CAAA","sourcesContent":["/**\n * The schema objects `DurableEngineState` creates outside the journal\n * migration, and the inventory of what porting them to another\n * dialect costs.\n *\n * Each durable package owns its migration ladder. Spawn edges and their GC\n * trigger moved into engine-store migration 0006. The remaining\n * statements are engine-store-owned storage created idempotently at\n * construction instead (issues #40/#41/#79/#81). That is a deliberate lane\n * boundary, not an oversight — but it left the statements invisible to the\n * pg-porting plan in the database roadmap, which\n * scoped only the journal migration's SQLite-specific DDL. Declaring them here\n * makes the inventory machine-readable: a test diffs the database's schema\n * objects across `make` against this list, so no engine-owned statement can\n * be added without appearing in the porting inventory (issue #92).\n *\n * @since 0.1.0\n */\n\nimport { isReadOnly } from \"@smthrs/database/Dialect\"\nimport type { Service as WriterService } from \"@smthrs/database/DurableWriter\"\nimport * as Effect from \"effect/Effect\"\nimport type * as SqlClient from \"effect/unstable/sql/SqlClient\"\n\n/**\n * SQL dialects a statement is known to be accepted by, verbatim.\n *\n * @since 0.1.0\n * @category models\n */\nexport type Dialect = \"sqlite\" | \"postgres\"\n\n/**\n * One engine-store-owned schema object.\n *\n * @since 0.1.0\n * @category models\n */\nexport interface Statement {\n /** The schema object's name, as it appears in the catalog. */\n readonly name: string\n /** Why the object exists, by issue. */\n readonly reason: string\n /**\n * Dialects that accept this statement unchanged. A statement listing only\n * `\"sqlite\"` must be rewritten before a Postgres/PGlite `Database` layer\n * can construct this service — `make` pipes every one of them through\n * `Effect.orDie`, so an unported statement is a construction-time defect,\n * not a recoverable error.\n */\n readonly dialects: ReadonlyArray<Dialect>\n readonly ddl: string\n}\n\n/**\n * The porting inventory: every engine-store-owned statement, in creation order.\n *\n * @since 0.1.0\n * @category constants\n */\nexport const statements: ReadonlyArray<Statement> = [\n {\n name: \"flows_runs_stale_running_idx\",\n reason:\n \"Serves the stale-running sweep's per-tick predicate (issue #79): `status = 'running' AND heartbeat_at_ms < cutoff`, ordered by heartbeat. A partial index keeps it tiny — only live running rows appear.\",\n // Partial indexes are valid Postgres since 9.5, so this one ports as-is.\n dialects: [\"sqlite\", \"postgres\"],\n ddl: `\n CREATE INDEX IF NOT EXISTS flows_runs_stale_running_idx\n ON flows_runs (heartbeat_at_ms)\n WHERE status = 'running'\n `\n }\n]\n\n/**\n * Creates the engine-store-owned objects, idempotently, in inventory order.\n *\n * `flows_runs` must already exist — every query in this service assumes a\n * migrated database, so `make` composes over one by construction. A read-only\n * client installs nothing.\n *\n * @since 0.1.0\n * @category constructors\n */\nexport const apply = (sql: SqlClient.SqlClient, writer: WriterService): Effect.Effect<void> =>\n // A read-only observer reads the schema it finds and installs nothing.\n isReadOnly(sql) ? Effect.void : Effect.forEach(\n statements,\n (statement) => writer.write(sql.unsafe(statement.ddl)).pipe(Effect.orDie),\n { discard: true }\n )\n"]}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared transactional execution decoding.
|
|
3
|
+
*
|
|
4
|
+
* @since 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
import * as Sha256 from "@smthrs/crypto/Sha256";
|
|
7
|
+
import { RunStoreError } from "@smthrs/run-store/RunStore";
|
|
8
|
+
import { Effect, Schema } from "effect";
|
|
9
|
+
import type * as SqlClient from "effect/unstable/sql/SqlClient";
|
|
10
|
+
import type { Batch } from "../ExecutionSnapshot.ts";
|
|
11
|
+
/**
|
|
12
|
+
* Non-negative safe integer for timestamps and revisions.
|
|
13
|
+
*
|
|
14
|
+
* @private
|
|
15
|
+
* @since 1.0.0
|
|
16
|
+
*/
|
|
17
|
+
export declare const Natural: Schema.Int;
|
|
18
|
+
/**
|
|
19
|
+
* Bounded identifier with a durable text encoding.
|
|
20
|
+
*
|
|
21
|
+
* @private
|
|
22
|
+
* @since 1.0.0
|
|
23
|
+
*/
|
|
24
|
+
export declare const Identifier: Schema.NonEmptyString;
|
|
25
|
+
/**
|
|
26
|
+
* Engine database source identity.
|
|
27
|
+
*
|
|
28
|
+
* @private
|
|
29
|
+
* @since 1.0.0
|
|
30
|
+
*/
|
|
31
|
+
export declare const Source: Schema.String;
|
|
32
|
+
/**
|
|
33
|
+
* Source identity and observed high-water mark.
|
|
34
|
+
*
|
|
35
|
+
* @private
|
|
36
|
+
* @since 1.0.0
|
|
37
|
+
*/
|
|
38
|
+
export declare const Position: Schema.Struct<{
|
|
39
|
+
readonly source: Schema.String;
|
|
40
|
+
readonly revision: Schema.Int;
|
|
41
|
+
}>;
|
|
42
|
+
/**
|
|
43
|
+
* Source identity and observed high-water mark.
|
|
44
|
+
*
|
|
45
|
+
* @private
|
|
46
|
+
* @since 1.0.0
|
|
47
|
+
*/
|
|
48
|
+
export type Position = typeof Position.Type;
|
|
49
|
+
/**
|
|
50
|
+
* A deferred read transaction on the reserved engine connection. The normal
|
|
51
|
+
* writable client's transaction starts IMMEDIATE; a read needs only SQLite's
|
|
52
|
+
* snapshot and must allow a WAL writer to commit while it reads. PostgreSQL
|
|
53
|
+
* reads at REPEATABLE READ so every statement shares the snapshot the position
|
|
54
|
+
* was read from; READ COMMITTED would let a concurrent commit make a row look
|
|
55
|
+
* newer than its position. Reuse the SQL
|
|
56
|
+
* client's transaction service to join an existing transaction. No read body
|
|
57
|
+
* exposes a mutation callback. Connection reservation and interruption release
|
|
58
|
+
* remain scoped, including when BEGIN or the read fails.
|
|
59
|
+
* @since 1.0.0
|
|
60
|
+
* @private
|
|
61
|
+
*/
|
|
62
|
+
export declare const transaction: <A, E, R>(sql: SqlClient.SqlClient, effect: Effect.Effect<A, E, R>) => Effect.Effect<A, import("effect/unstable/sql/SqlError").SqlError | E, R>;
|
|
63
|
+
/**
|
|
64
|
+
* Preserves failure causes and interruption at the read boundary.
|
|
65
|
+
*
|
|
66
|
+
* @private
|
|
67
|
+
* @since 1.0.0
|
|
68
|
+
*/
|
|
69
|
+
export declare const boundary: <A, E, R>(method: string, effect: Effect.Effect<A, E, R>) => Effect.Effect<A, RunStoreError, R>;
|
|
70
|
+
/**
|
|
71
|
+
* Decodes stored SQL values with the original schema error.
|
|
72
|
+
*
|
|
73
|
+
* @private
|
|
74
|
+
* @since 1.0.0
|
|
75
|
+
*/
|
|
76
|
+
export declare const decode: <S extends Schema.Top>(schema: S, input: unknown) => Effect.Effect<S["Type"], RunStoreError, S["DecodingServices"]>;
|
|
77
|
+
/**
|
|
78
|
+
* Reads the engine database identity and revision.
|
|
79
|
+
*
|
|
80
|
+
* @private
|
|
81
|
+
* @since 1.0.0
|
|
82
|
+
*/
|
|
83
|
+
export declare const position: (sql: SqlClient.SqlClient) => Effect.Effect<{
|
|
84
|
+
readonly source: string;
|
|
85
|
+
readonly revision: number;
|
|
86
|
+
}, import("effect/unstable/sql/SqlError").SqlError | RunStoreError, never>;
|
|
87
|
+
/**
|
|
88
|
+
* Structured waiting condition; nullable fields preserve older unknown values.
|
|
89
|
+
* The opaque wake token leaves the engine only as its SHA-256 `tokenDigest`,
|
|
90
|
+
* the same digest `ExecutionFacts` records: a reader may correlate a wait but
|
|
91
|
+
* never holds the address that resolves it.
|
|
92
|
+
*
|
|
93
|
+
* @private
|
|
94
|
+
* @since 1.0.0
|
|
95
|
+
*/
|
|
96
|
+
export interface Waiting {
|
|
97
|
+
readonly kind: "timer" | "signal" | "approval" | "quota" | "human" | "other";
|
|
98
|
+
readonly reason: string;
|
|
99
|
+
readonly wakeAtMs: number | null;
|
|
100
|
+
readonly tokenDigest: Sha256.Digest | null;
|
|
101
|
+
readonly request?: typeof Schema.Json.Type | undefined;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Page-scoped lifecycle fields and indexed earliest spawn edge.
|
|
105
|
+
*
|
|
106
|
+
* @private
|
|
107
|
+
* @since 1.0.0
|
|
108
|
+
*/
|
|
109
|
+
export declare const selectColumns = "r.*, c.revision, c.deleted,\n (SELECT parent_id FROM flows_run_parents WHERE child_id = r.run_id ORDER BY seq, parent_id LIMIT 1) AS spawn_parent_id,\n (SELECT seq FROM flows_run_parents WHERE child_id = r.run_id ORDER BY seq, parent_id LIMIT 1) AS spawn_seq";
|
|
110
|
+
/**
|
|
111
|
+
* Decodes a run row and validates observation invariants.
|
|
112
|
+
*
|
|
113
|
+
* @private
|
|
114
|
+
* @since 1.0.0
|
|
115
|
+
*/
|
|
116
|
+
export declare const observed: (input: unknown, at: Position) => Effect.Effect<{
|
|
117
|
+
_tag: "Observed";
|
|
118
|
+
runId: string;
|
|
119
|
+
source: string;
|
|
120
|
+
revision: number;
|
|
121
|
+
status: "running" | "suspended" | "failed" | "completed" | "pending" | "cancelled";
|
|
122
|
+
flowName: string;
|
|
123
|
+
createdAtMs: number;
|
|
124
|
+
startedAtMs: number | null;
|
|
125
|
+
finishedAtMs: number | null;
|
|
126
|
+
parentRunId: string | null;
|
|
127
|
+
lineageId: string;
|
|
128
|
+
roundOrdinal: number;
|
|
129
|
+
cancellation: {
|
|
130
|
+
requestedAtMs: number | null;
|
|
131
|
+
acknowledgement: {
|
|
132
|
+
readonly observedAtMs: number;
|
|
133
|
+
readonly owner: {
|
|
134
|
+
readonly hostId: string;
|
|
135
|
+
readonly pid: number;
|
|
136
|
+
readonly nonce: string;
|
|
137
|
+
};
|
|
138
|
+
} | null;
|
|
139
|
+
};
|
|
140
|
+
waiting: {
|
|
141
|
+
request?: string | number | boolean | Schema.JsonArray | Schema.JsonObject;
|
|
142
|
+
kind: "approval" | "human" | "timer" | "signal" | "quota" | "other";
|
|
143
|
+
reason: string;
|
|
144
|
+
wakeAtMs: number | null;
|
|
145
|
+
tokenDigest: (string & import("effect/Brand").Brand<"@smthrs/crypto/Sha256/Digest">) | null;
|
|
146
|
+
} | null;
|
|
147
|
+
}, RunStoreError, never>;
|
|
148
|
+
/**
|
|
149
|
+
* The result of a successful execution observation.
|
|
150
|
+
*
|
|
151
|
+
* @private
|
|
152
|
+
* @since 1.0.0
|
|
153
|
+
*/
|
|
154
|
+
export type Observed = Effect.Success<ReturnType<typeof observed>>;
|
|
155
|
+
/**
|
|
156
|
+
* Validates source, identity, ordering and revision coherence at the batch boundary.
|
|
157
|
+
*
|
|
158
|
+
* @private
|
|
159
|
+
* @since 1.0.0
|
|
160
|
+
*/
|
|
161
|
+
export declare const coherentBatch: (runIds: ReadonlyArray<string>, batch: Batch) => Effect.Effect<Batch, RunStoreError>;
|
|
162
|
+
//# sourceMappingURL=ExecutionSnapshotRead.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExecutionSnapshotRead.d.ts","sourceRoot":"","sources":["../../../src/internal/ExecutionSnapshotRead.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,MAAM,uBAAuB,CAAA;AAE/C,OAAO,EAAa,aAAa,EAAE,MAAM,4BAA4B,CAAA;AACrE,OAAO,EAAS,MAAM,EAAgB,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC5D,OAAO,KAAK,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAC/D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAGpD;;;;;GAKG;AACH,eAAO,MAAM,OAAO,YAAuF,CAAA;AAC3G;;;;;GAKG;AACH,eAAO,MAAM,UAAU,uBAKtB,CAAA;AACD;;;;;GAKG;AACH,eAAO,MAAM,MAAM,eAA0D,CAAA;AAC7E;;;;;GAKG;AACH,eAAO,MAAM,QAAQ;;;EAAuD,CAAA;AAC5E;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC,IAAI,CAAA;AAE3C;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,SAAS,CAAC,SAAS,EAAE,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,6EAiB1F,CAAA;AAEH;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,MAAM,EAAE,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAY/G,CAAA;AAEL;;;;;GAKG;AACH,eAAO,MAAM,MAAM,GAAI,CAAC,SAAS,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,OAAO,OAAO,mEAQlE,CAAA;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,GAAI,KAAK,SAAS,CAAC,SAAS;;;0EAG9C,CAAA;AAkCH;;;;;;;;GAQG;AACH,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAA;IAC5E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAA;IAC1C,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,SAAS,CAAA;CACvD;AAiBD;;;;;GAKG;AACH,eAAO,MAAM,aAAa,yQAEmF,CAAA;AAE7G;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,GAAI,OAAO,OAAO,EAAE,IAAI,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAkDjD,CAAA;AAEJ;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAA;AAElE;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GAAI,QAAQ,aAAa,CAAC,MAAM,CAAC,EAAE,OAAO,KAAK,KAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,CAmB7G,CAAA"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared transactional execution decoding.
|
|
3
|
+
*
|
|
4
|
+
* @since 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
import * as Sha256 from "@smthrs/crypto/Sha256";
|
|
7
|
+
import { OwnerId } from "@smthrs/journal/OwnerId";
|
|
8
|
+
import { RunStatus, RunStoreError } from "@smthrs/run-store/RunStore";
|
|
9
|
+
import { Cause, Effect, Exit, Option, Schema } from "effect";
|
|
10
|
+
import { RunState } from "../RunState.js";
|
|
11
|
+
/**
|
|
12
|
+
* Non-negative safe integer for timestamps and revisions.
|
|
13
|
+
*
|
|
14
|
+
* @private
|
|
15
|
+
* @since 1.0.0
|
|
16
|
+
*/
|
|
17
|
+
export const Natural = Schema.Int.check(Schema.isBetween({ minimum: 0, maximum: Number.MAX_SAFE_INTEGER }));
|
|
18
|
+
/**
|
|
19
|
+
* Bounded identifier with a durable text encoding.
|
|
20
|
+
*
|
|
21
|
+
* @private
|
|
22
|
+
* @since 1.0.0
|
|
23
|
+
*/
|
|
24
|
+
export const Identifier = Schema.NonEmptyString.check(Schema.isMaxLength(1024), Schema.makeFilter((value) => !value.includes("\0") && !/[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/.test(value)));
|
|
25
|
+
/**
|
|
26
|
+
* Engine database source identity.
|
|
27
|
+
*
|
|
28
|
+
* @private
|
|
29
|
+
* @since 1.0.0
|
|
30
|
+
*/
|
|
31
|
+
export const Source = Schema.String.check(Schema.isPattern(/^[0-9a-f]{32}$/));
|
|
32
|
+
/**
|
|
33
|
+
* Source identity and observed high-water mark.
|
|
34
|
+
*
|
|
35
|
+
* @private
|
|
36
|
+
* @since 1.0.0
|
|
37
|
+
*/
|
|
38
|
+
export const Position = Schema.Struct({ source: Source, revision: Natural });
|
|
39
|
+
/**
|
|
40
|
+
* A deferred read transaction on the reserved engine connection. The normal
|
|
41
|
+
* writable client's transaction starts IMMEDIATE; a read needs only SQLite's
|
|
42
|
+
* snapshot and must allow a WAL writer to commit while it reads. PostgreSQL
|
|
43
|
+
* reads at REPEATABLE READ so every statement shares the snapshot the position
|
|
44
|
+
* was read from; READ COMMITTED would let a concurrent commit make a row look
|
|
45
|
+
* newer than its position. Reuse the SQL
|
|
46
|
+
* client's transaction service to join an existing transaction. No read body
|
|
47
|
+
* exposes a mutation callback. Connection reservation and interruption release
|
|
48
|
+
* remain scoped, including when BEGIN or the read fails.
|
|
49
|
+
* @since 1.0.0
|
|
50
|
+
* @private
|
|
51
|
+
*/
|
|
52
|
+
export const transaction = (sql, effect) => Effect.flatMap(Effect.serviceOption(sql.transactionService), (existing) => Option.isSome(existing) ? effect : Effect.scoped(Effect.gen(function* () {
|
|
53
|
+
const connection = yield* sql.reserve;
|
|
54
|
+
return yield* Effect.acquireUseRelease(connection.executeUnprepared(sql.onDialectOrElse({ pg: () => "BEGIN ISOLATION LEVEL REPEATABLE READ READ ONLY", orElse: () => "BEGIN" }), [], undefined), () => effect.pipe(Effect.provideService(sql.transactionService, [connection, 0])), (_, exit) => connection.executeUnprepared(Exit.isSuccess(exit) ? "COMMIT" : "ROLLBACK", [], undefined).pipe(Effect.orDie));
|
|
55
|
+
})));
|
|
56
|
+
/**
|
|
57
|
+
* Preserves failure causes and interruption at the read boundary.
|
|
58
|
+
*
|
|
59
|
+
* @private
|
|
60
|
+
* @since 1.0.0
|
|
61
|
+
*/
|
|
62
|
+
export const boundary = (method, effect) => effect.pipe(Effect.catchCause((cause) => {
|
|
63
|
+
if (Cause.hasInterruptsOnly(cause))
|
|
64
|
+
return Effect.failCause(cause);
|
|
65
|
+
const original = Cause.squash(cause);
|
|
66
|
+
return Effect.fail(original instanceof RunStoreError ? original : new RunStoreError({
|
|
67
|
+
method,
|
|
68
|
+
code: "persistence_failed",
|
|
69
|
+
message: "engine execution observation failed",
|
|
70
|
+
cause: original
|
|
71
|
+
}));
|
|
72
|
+
}));
|
|
73
|
+
/**
|
|
74
|
+
* Decodes stored SQL values with the original schema error.
|
|
75
|
+
*
|
|
76
|
+
* @private
|
|
77
|
+
* @since 1.0.0
|
|
78
|
+
*/
|
|
79
|
+
export const decode = (schema, input) => Schema.decodeUnknownEffect(schema)(input).pipe(Effect.mapError((cause) => new RunStoreError({
|
|
80
|
+
method: "ExecutionSnapshot.decode",
|
|
81
|
+
code: "decode_failed",
|
|
82
|
+
message: "stored execution observation is malformed",
|
|
83
|
+
cause
|
|
84
|
+
})));
|
|
85
|
+
/**
|
|
86
|
+
* Reads the engine database identity and revision.
|
|
87
|
+
*
|
|
88
|
+
* @private
|
|
89
|
+
* @since 1.0.0
|
|
90
|
+
*/
|
|
91
|
+
export const position = (sql) => sql `SELECT source, revision FROM flows_run_source WHERE singleton = 1`.pipe(Effect.flatMap((rows) => decode(Position, rows[0])));
|
|
92
|
+
const Row = Schema.Struct({
|
|
93
|
+
run_id: Identifier,
|
|
94
|
+
status: RunStatus,
|
|
95
|
+
created_at_ms: Natural,
|
|
96
|
+
started_at_ms: Schema.NullOr(Natural),
|
|
97
|
+
finished_at_ms: Schema.NullOr(Natural),
|
|
98
|
+
owner_host_id: Schema.NullOr(Identifier),
|
|
99
|
+
owner_pid: Schema.NullOr(Natural),
|
|
100
|
+
owner_nonce: Schema.NullOr(Identifier),
|
|
101
|
+
heartbeat_at_ms: Schema.NullOr(Natural),
|
|
102
|
+
state_json: Schema.fromJsonString(RunState),
|
|
103
|
+
parent_run_id: Schema.NullOr(Identifier),
|
|
104
|
+
spawn_parent_id: Schema.NullOr(Identifier),
|
|
105
|
+
spawn_seq: Schema.NullOr(Natural),
|
|
106
|
+
execution_parent_id: Schema.NullOr(Identifier),
|
|
107
|
+
lineage_id: Schema.NullOr(Identifier),
|
|
108
|
+
round_ordinal: Schema.NullOr(Natural),
|
|
109
|
+
cancel_requested_at_ms: Schema.NullOr(Natural),
|
|
110
|
+
cancel_acknowledgement_json: Schema.NullOr(Schema.fromJsonString(Schema.Struct({
|
|
111
|
+
observedAtMs: Natural,
|
|
112
|
+
owner: OwnerId
|
|
113
|
+
}))),
|
|
114
|
+
// These opaque values use DurableEngineState's existing non-empty-string
|
|
115
|
+
// contract. They are not run IDs and must not acquire an identifier ceiling.
|
|
116
|
+
waiting_reason: Schema.NullOr(Schema.NonEmptyString),
|
|
117
|
+
waiting_wake_at_ms: Schema.NullOr(Natural),
|
|
118
|
+
waiting_token: Schema.NullOr(Schema.NonEmptyString),
|
|
119
|
+
waiting_request: Schema.optional(Schema.NullOr(Schema.fromJsonString(Schema.Json))),
|
|
120
|
+
revision: Natural,
|
|
121
|
+
deleted: Schema.Literal(0)
|
|
122
|
+
});
|
|
123
|
+
const waitingKind = (reason) => {
|
|
124
|
+
switch (reason) {
|
|
125
|
+
case "timer":
|
|
126
|
+
case "approval":
|
|
127
|
+
case "quota":
|
|
128
|
+
case "human":
|
|
129
|
+
return reason;
|
|
130
|
+
case "event":
|
|
131
|
+
case "signal":
|
|
132
|
+
return "signal";
|
|
133
|
+
default:
|
|
134
|
+
return "other";
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
/**
|
|
138
|
+
* Page-scoped lifecycle fields and indexed earliest spawn edge.
|
|
139
|
+
*
|
|
140
|
+
* @private
|
|
141
|
+
* @since 1.0.0
|
|
142
|
+
*/
|
|
143
|
+
export const selectColumns = `r.*, c.revision, c.deleted,
|
|
144
|
+
(SELECT parent_id FROM flows_run_parents WHERE child_id = r.run_id ORDER BY seq, parent_id LIMIT 1) AS spawn_parent_id,
|
|
145
|
+
(SELECT seq FROM flows_run_parents WHERE child_id = r.run_id ORDER BY seq, parent_id LIMIT 1) AS spawn_seq`;
|
|
146
|
+
/**
|
|
147
|
+
* Decodes a run row and validates observation invariants.
|
|
148
|
+
*
|
|
149
|
+
* @private
|
|
150
|
+
* @since 1.0.0
|
|
151
|
+
*/
|
|
152
|
+
export const observed = (input, at) => Effect.gen(function* () {
|
|
153
|
+
const row = yield* decode(Row, input);
|
|
154
|
+
const parentRunId = row.parent_run_id ?? row.spawn_parent_id;
|
|
155
|
+
const ownerFields = [row.owner_host_id, row.owner_pid, row.owner_nonce, row.heartbeat_at_ms];
|
|
156
|
+
const validOwner = row.status === "running"
|
|
157
|
+
? ownerFields.every((value) => value !== null)
|
|
158
|
+
: ownerFields.every((value) => value === null);
|
|
159
|
+
if (!validOwner || row.revision === 0 || row.revision > at.revision ||
|
|
160
|
+
parentRunId !== row.execution_parent_id || parentRunId === row.run_id ||
|
|
161
|
+
(row.lineage_id === null) !== (row.round_ordinal === null) ||
|
|
162
|
+
(row.waiting_reason === null && (row.waiting_wake_at_ms !== null || row.waiting_token !== null ||
|
|
163
|
+
row.waiting_request !== undefined && row.waiting_request !== null)) ||
|
|
164
|
+
(row.cancel_acknowledgement_json !== null && row.cancel_requested_at_ms === null)) {
|
|
165
|
+
return yield* Effect.fail(new RunStoreError({
|
|
166
|
+
method: "ExecutionSnapshot.decode",
|
|
167
|
+
code: "decode_failed",
|
|
168
|
+
message: "stored execution observation violates its invariants",
|
|
169
|
+
cause: new Error("inconsistent execution identity, wait, cancellation or revision")
|
|
170
|
+
}));
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
_tag: "Observed",
|
|
174
|
+
runId: row.run_id,
|
|
175
|
+
source: at.source,
|
|
176
|
+
revision: row.revision,
|
|
177
|
+
status: row.status,
|
|
178
|
+
flowName: row.state_json.flowName,
|
|
179
|
+
createdAtMs: row.created_at_ms,
|
|
180
|
+
startedAtMs: row.started_at_ms,
|
|
181
|
+
finishedAtMs: row.finished_at_ms,
|
|
182
|
+
parentRunId,
|
|
183
|
+
lineageId: row.lineage_id ?? row.run_id,
|
|
184
|
+
roundOrdinal: row.round_ordinal ?? 0,
|
|
185
|
+
cancellation: {
|
|
186
|
+
requestedAtMs: row.cancel_requested_at_ms,
|
|
187
|
+
acknowledgement: row.cancel_acknowledgement_json
|
|
188
|
+
},
|
|
189
|
+
waiting: row.waiting_reason === null ? null : {
|
|
190
|
+
kind: waitingKind(row.waiting_reason),
|
|
191
|
+
reason: row.waiting_reason,
|
|
192
|
+
wakeAtMs: row.waiting_wake_at_ms,
|
|
193
|
+
tokenDigest: row.waiting_token === null ? null : Sha256.digestSync(row.waiting_token),
|
|
194
|
+
...(row.waiting_request === undefined || row.waiting_request === null ? {} : { request: row.waiting_request })
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
});
|
|
198
|
+
/**
|
|
199
|
+
* Validates source, identity, ordering and revision coherence at the batch boundary.
|
|
200
|
+
*
|
|
201
|
+
* @private
|
|
202
|
+
* @since 1.0.0
|
|
203
|
+
*/
|
|
204
|
+
export const coherentBatch = (runIds, batch) => {
|
|
205
|
+
const validPosition = Schema.is(Position);
|
|
206
|
+
if (!validPosition(batch) || batch.snapshots.length !== runIds.length ||
|
|
207
|
+
batch.snapshots.some((row, index) => !validPosition(row) || row.runId !== runIds[index] || row.source !== batch.source ||
|
|
208
|
+
row.revision > batch.revision)) {
|
|
209
|
+
return Effect.fail(new RunStoreError({
|
|
210
|
+
method: "ExecutionSnapshot.read",
|
|
211
|
+
code: "persistence_failed",
|
|
212
|
+
message: "stored execution batch is incoherent: source, identity, order or revision mismatch",
|
|
213
|
+
cause: undefined
|
|
214
|
+
}));
|
|
215
|
+
}
|
|
216
|
+
return Effect.succeed(batch);
|
|
217
|
+
};
|
|
218
|
+
//# sourceMappingURL=ExecutionSnapshotRead.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExecutionSnapshotRead.js","sourceRoot":"","sources":["../../../src/internal/ExecutionSnapshotRead.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared transactional execution decoding.\n *\n * @since 1.0.0\n */\n\nimport * as Sha256 from \"@smthrs/crypto/Sha256\"\nimport { OwnerId } from \"@smthrs/journal/OwnerId\"\nimport { RunStatus, RunStoreError } from \"@smthrs/run-store/RunStore\"\nimport { Cause, Effect, Exit, Option, Schema } from \"effect\"\nimport type * as SqlClient from \"effect/unstable/sql/SqlClient\"\nimport type { Batch } from \"../ExecutionSnapshot.ts\"\nimport { RunState } from \"../RunState.ts\"\n\n/**\n * Non-negative safe integer for timestamps and revisions.\n *\n * @private\n * @since 1.0.0\n */\nexport const Natural = Schema.Int.check(Schema.isBetween({ minimum: 0, maximum: Number.MAX_SAFE_INTEGER }))\n/**\n * Bounded identifier with a durable text encoding.\n *\n * @private\n * @since 1.0.0\n */\nexport const Identifier = Schema.NonEmptyString.check(\n Schema.isMaxLength(1024),\n Schema.makeFilter((value) =>\n !value.includes(\"\\0\") && !/[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?<![\\uD800-\\uDBFF])[\\uDC00-\\uDFFF]/.test(value)\n )\n)\n/**\n * Engine database source identity.\n *\n * @private\n * @since 1.0.0\n */\nexport const Source = Schema.String.check(Schema.isPattern(/^[0-9a-f]{32}$/))\n/**\n * Source identity and observed high-water mark.\n *\n * @private\n * @since 1.0.0\n */\nexport const Position = Schema.Struct({ source: Source, revision: Natural })\n/**\n * Source identity and observed high-water mark.\n *\n * @private\n * @since 1.0.0\n */\nexport type Position = typeof Position.Type\n\n/**\n * A deferred read transaction on the reserved engine connection. The normal\n * writable client's transaction starts IMMEDIATE; a read needs only SQLite's\n * snapshot and must allow a WAL writer to commit while it reads. PostgreSQL\n * reads at REPEATABLE READ so every statement shares the snapshot the position\n * was read from; READ COMMITTED would let a concurrent commit make a row look\n * newer than its position. Reuse the SQL\n * client's transaction service to join an existing transaction. No read body\n * exposes a mutation callback. Connection reservation and interruption release\n * remain scoped, including when BEGIN or the read fails.\n * @since 1.0.0\n * @private\n */\nexport const transaction = <A, E, R>(sql: SqlClient.SqlClient, effect: Effect.Effect<A, E, R>) =>\n Effect.flatMap(\n Effect.serviceOption(sql.transactionService),\n (existing) =>\n Option.isSome(existing) ? effect : Effect.scoped(Effect.gen(function*() {\n const connection = yield* sql.reserve\n return yield* Effect.acquireUseRelease(\n connection.executeUnprepared(\n sql.onDialectOrElse({ pg: () => \"BEGIN ISOLATION LEVEL REPEATABLE READ READ ONLY\", orElse: () => \"BEGIN\" }),\n [],\n undefined\n ),\n () => effect.pipe(Effect.provideService(sql.transactionService, [connection, 0])),\n (_, exit) =>\n connection.executeUnprepared(Exit.isSuccess(exit) ? \"COMMIT\" : \"ROLLBACK\", [], undefined).pipe(Effect.orDie)\n )\n }))\n )\n\n/**\n * Preserves failure causes and interruption at the read boundary.\n *\n * @private\n * @since 1.0.0\n */\nexport const boundary = <A, E, R>(method: string, effect: Effect.Effect<A, E, R>): Effect.Effect<A, RunStoreError, R> =>\n effect.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 RunStoreError ? original : new RunStoreError({\n method,\n code: \"persistence_failed\",\n message: \"engine execution observation failed\",\n cause: original\n })\n )\n }))\n\n/**\n * Decodes stored SQL values with the original schema error.\n *\n * @private\n * @since 1.0.0\n */\nexport const decode = <S extends Schema.Top>(schema: S, input: unknown) =>\n Schema.decodeUnknownEffect(schema)(input).pipe(Effect.mapError((cause) =>\n new RunStoreError({\n method: \"ExecutionSnapshot.decode\",\n code: \"decode_failed\",\n message: \"stored execution observation is malformed\",\n cause\n })\n ))\n\n/**\n * Reads the engine database identity and revision.\n *\n * @private\n * @since 1.0.0\n */\nexport const position = (sql: SqlClient.SqlClient) =>\n sql`SELECT source, revision FROM flows_run_source WHERE singleton = 1`.pipe(\n Effect.flatMap((rows) => decode(Position, rows[0]))\n )\n\nconst Row = Schema.Struct({\n run_id: Identifier,\n status: RunStatus,\n created_at_ms: Natural,\n started_at_ms: Schema.NullOr(Natural),\n finished_at_ms: Schema.NullOr(Natural),\n owner_host_id: Schema.NullOr(Identifier),\n owner_pid: Schema.NullOr(Natural),\n owner_nonce: Schema.NullOr(Identifier),\n heartbeat_at_ms: Schema.NullOr(Natural),\n state_json: Schema.fromJsonString(RunState),\n parent_run_id: Schema.NullOr(Identifier),\n spawn_parent_id: Schema.NullOr(Identifier),\n spawn_seq: Schema.NullOr(Natural),\n execution_parent_id: Schema.NullOr(Identifier),\n lineage_id: Schema.NullOr(Identifier),\n round_ordinal: Schema.NullOr(Natural),\n cancel_requested_at_ms: Schema.NullOr(Natural),\n cancel_acknowledgement_json: Schema.NullOr(Schema.fromJsonString(Schema.Struct({\n observedAtMs: Natural,\n owner: OwnerId\n }))),\n // These opaque values use DurableEngineState's existing non-empty-string\n // contract. They are not run IDs and must not acquire an identifier ceiling.\n waiting_reason: Schema.NullOr(Schema.NonEmptyString),\n waiting_wake_at_ms: Schema.NullOr(Natural),\n waiting_token: Schema.NullOr(Schema.NonEmptyString),\n waiting_request: Schema.optional(Schema.NullOr(Schema.fromJsonString(Schema.Json))),\n revision: Natural,\n deleted: Schema.Literal(0)\n})\n\n/**\n * Structured waiting condition; nullable fields preserve older unknown values.\n * The opaque wake token leaves the engine only as its SHA-256 `tokenDigest`,\n * the same digest `ExecutionFacts` records: a reader may correlate a wait but\n * never holds the address that resolves it.\n *\n * @private\n * @since 1.0.0\n */\nexport interface Waiting {\n readonly kind: \"timer\" | \"signal\" | \"approval\" | \"quota\" | \"human\" | \"other\"\n readonly reason: string\n readonly wakeAtMs: number | null\n readonly tokenDigest: Sha256.Digest | null\n readonly request?: typeof Schema.Json.Type | undefined\n}\n\nconst waitingKind = (reason: string): Waiting[\"kind\"] => {\n switch (reason) {\n case \"timer\":\n case \"approval\":\n case \"quota\":\n case \"human\":\n return reason\n case \"event\":\n case \"signal\":\n return \"signal\"\n default:\n return \"other\"\n }\n}\n\n/**\n * Page-scoped lifecycle fields and indexed earliest spawn edge.\n *\n * @private\n * @since 1.0.0\n */\nexport const selectColumns = `r.*, c.revision, c.deleted,\n (SELECT parent_id FROM flows_run_parents WHERE child_id = r.run_id ORDER BY seq, parent_id LIMIT 1) AS spawn_parent_id,\n (SELECT seq FROM flows_run_parents WHERE child_id = r.run_id ORDER BY seq, parent_id LIMIT 1) AS spawn_seq`\n\n/**\n * Decodes a run row and validates observation invariants.\n *\n * @private\n * @since 1.0.0\n */\nexport const observed = (input: unknown, at: Position) =>\n Effect.gen(function*() {\n const row = yield* decode(Row, input)\n const parentRunId = row.parent_run_id ?? row.spawn_parent_id\n const ownerFields = [row.owner_host_id, row.owner_pid, row.owner_nonce, row.heartbeat_at_ms]\n const validOwner = row.status === \"running\"\n ? ownerFields.every((value) => value !== null)\n : ownerFields.every((value) => value === null)\n if (\n !validOwner || row.revision === 0 || row.revision > at.revision ||\n parentRunId !== row.execution_parent_id || parentRunId === row.run_id ||\n (row.lineage_id === null) !== (row.round_ordinal === null) ||\n (row.waiting_reason === null && (row.waiting_wake_at_ms !== null || row.waiting_token !== null ||\n row.waiting_request !== undefined && row.waiting_request !== null)) ||\n (row.cancel_acknowledgement_json !== null && row.cancel_requested_at_ms === null)\n ) {\n return yield* Effect.fail(\n new RunStoreError({\n method: \"ExecutionSnapshot.decode\",\n code: \"decode_failed\",\n message: \"stored execution observation violates its invariants\",\n cause: new Error(\"inconsistent execution identity, wait, cancellation or revision\")\n })\n )\n }\n return {\n _tag: \"Observed\" as const,\n runId: row.run_id,\n source: at.source,\n revision: row.revision,\n status: row.status,\n flowName: row.state_json.flowName,\n createdAtMs: row.created_at_ms,\n startedAtMs: row.started_at_ms,\n finishedAtMs: row.finished_at_ms,\n parentRunId,\n lineageId: row.lineage_id ?? row.run_id,\n roundOrdinal: row.round_ordinal ?? 0,\n cancellation: {\n requestedAtMs: row.cancel_requested_at_ms,\n acknowledgement: row.cancel_acknowledgement_json\n },\n waiting: row.waiting_reason === null ? null : {\n kind: waitingKind(row.waiting_reason),\n reason: row.waiting_reason,\n wakeAtMs: row.waiting_wake_at_ms,\n tokenDigest: row.waiting_token === null ? null : Sha256.digestSync(row.waiting_token),\n ...(row.waiting_request === undefined || row.waiting_request === null ? {} : { request: row.waiting_request })\n }\n }\n })\n\n/**\n * The result of a successful execution observation.\n *\n * @private\n * @since 1.0.0\n */\nexport type Observed = Effect.Success<ReturnType<typeof observed>>\n\n/**\n * Validates source, identity, ordering and revision coherence at the batch boundary.\n *\n * @private\n * @since 1.0.0\n */\nexport const coherentBatch = (runIds: ReadonlyArray<string>, batch: Batch): Effect.Effect<Batch, RunStoreError> => {\n const validPosition = Schema.is(Position)\n if (\n !validPosition(batch) || batch.snapshots.length !== runIds.length ||\n batch.snapshots.some((row, index) =>\n !validPosition(row) || row.runId !== runIds[index] || row.source !== batch.source ||\n row.revision > batch.revision\n )\n ) {\n return Effect.fail(\n new RunStoreError({\n method: \"ExecutionSnapshot.read\",\n code: \"persistence_failed\",\n message: \"stored execution batch is incoherent: source, identity, order or revision mismatch\",\n cause: undefined\n })\n )\n }\n return Effect.succeed(batch)\n}\n"]}
|