@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,459 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable deferred delivery and absolute clock scheduling.
|
|
3
|
+
*
|
|
4
|
+
* @since 0.1.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { FlowEngine } from "@smthrs/engine"
|
|
8
|
+
import { type DurableClock, type DurableDeferred, type Flow, FlowRuntime } from "@smthrs/flow"
|
|
9
|
+
import { Journal } from "@smthrs/journal"
|
|
10
|
+
import type { Ownership } from "@smthrs/run-store"
|
|
11
|
+
import * as Clock from "effect/Clock"
|
|
12
|
+
import * as Duration from "effect/Duration"
|
|
13
|
+
import * as Effect from "effect/Effect"
|
|
14
|
+
import * as Exit from "effect/Exit"
|
|
15
|
+
import * as FiberMap from "effect/FiberMap"
|
|
16
|
+
import * as Option from "effect/Option"
|
|
17
|
+
import * as Schedule from "effect/Schedule"
|
|
18
|
+
import type * as Scope from "effect/Scope"
|
|
19
|
+
import * as DurableEngineState from "../DurableEngineState.ts"
|
|
20
|
+
import * as JournalRecords from "./JournalRecords.ts"
|
|
21
|
+
import * as StateTransaction from "./StateTransaction.ts"
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Reasons passed to the single claim-gated resume scheduler.
|
|
25
|
+
*
|
|
26
|
+
* @since 0.1.0
|
|
27
|
+
* @category models
|
|
28
|
+
*/
|
|
29
|
+
export type ResumeReason = "deferred" | "clock"
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Dependencies for durable deferred and clock persistence.
|
|
33
|
+
*
|
|
34
|
+
* `scheduleResume` must enter the run coordinator and ownership claim path. It
|
|
35
|
+
* must never invoke a flow handler directly.
|
|
36
|
+
*
|
|
37
|
+
* @since 0.1.0
|
|
38
|
+
* @category models
|
|
39
|
+
*/
|
|
40
|
+
export interface Dependencies {
|
|
41
|
+
readonly owner: Ownership.OwnerId
|
|
42
|
+
readonly journalSource: string
|
|
43
|
+
readonly scheduleResume: (
|
|
44
|
+
flowName: string,
|
|
45
|
+
executionId: string,
|
|
46
|
+
reason: ResumeReason,
|
|
47
|
+
sourceId?: string | undefined
|
|
48
|
+
) => Effect.Effect<void>
|
|
49
|
+
/**
|
|
50
|
+
* Redispatch policy for a durable clock whose fire failed. Defaults to
|
|
51
|
+
* {@link defaultFireRetryPolicy}; a composition supplies its own the way
|
|
52
|
+
* the engine's `suspendedRetryPolicy` option is supplied, rather than
|
|
53
|
+
* editing the constant.
|
|
54
|
+
*/
|
|
55
|
+
readonly fireRetryPolicy?: FireRetryPolicy | undefined
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Encoded deferred completion with optional opaque correlation metadata.
|
|
60
|
+
*
|
|
61
|
+
* @since 0.1.0
|
|
62
|
+
* @category models
|
|
63
|
+
*/
|
|
64
|
+
export interface DeferredDoneOptions {
|
|
65
|
+
readonly flowName: string
|
|
66
|
+
readonly executionId: string
|
|
67
|
+
readonly deferredName: string
|
|
68
|
+
readonly exit: Exit.Exit<unknown, unknown>
|
|
69
|
+
readonly metadata?: unknown
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Durable deferred and clock operations composed into the encoded engine.
|
|
74
|
+
*
|
|
75
|
+
* @since 0.1.0
|
|
76
|
+
* @category models
|
|
77
|
+
*/
|
|
78
|
+
export interface Service {
|
|
79
|
+
readonly deferredResult: (
|
|
80
|
+
deferred: DurableDeferred.Any
|
|
81
|
+
) => Effect.Effect<
|
|
82
|
+
Option.Option<Exit.Exit<unknown, unknown>>,
|
|
83
|
+
never,
|
|
84
|
+
FlowRuntime.FlowInstance
|
|
85
|
+
>
|
|
86
|
+
readonly deferredDone: (options: DeferredDoneOptions) => Effect.Effect<void>
|
|
87
|
+
readonly deferredDoneIfWaiting: (
|
|
88
|
+
options: DeferredDoneOptions & {
|
|
89
|
+
readonly reason: string
|
|
90
|
+
readonly token: string
|
|
91
|
+
}
|
|
92
|
+
) => Effect.Effect<FlowRuntime.DeferredDoneIfWaitingOutcome>
|
|
93
|
+
readonly scheduleClock: (
|
|
94
|
+
flow: Flow.Any,
|
|
95
|
+
options: {
|
|
96
|
+
readonly executionId: string
|
|
97
|
+
readonly clock: DurableClock.DurableClock
|
|
98
|
+
}
|
|
99
|
+
) => Effect.Effect<void>
|
|
100
|
+
readonly sweepDue: (flowName?: string) => Effect.Effect<void>
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const clockKey = (row: DurableEngineState.ClockAddress): string =>
|
|
104
|
+
JSON.stringify([row.flowName, row.executionId, row.clockName])
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* A clock-fire redispatch policy. The input is the sandboxed cause of a failed
|
|
108
|
+
* fire, so any schedule that recurs on an arbitrary input fits.
|
|
109
|
+
*
|
|
110
|
+
* @since 0.1.0
|
|
111
|
+
* @category models
|
|
112
|
+
*/
|
|
113
|
+
export type FireRetryPolicy = Schedule.Schedule<unknown, unknown>
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* The default redispatch policy for a durable clock whose fire failed.
|
|
117
|
+
*
|
|
118
|
+
* Temporal redispatches timer-queue tasks with backoff until they are acked
|
|
119
|
+
* (`reference/temporal` `service/history` timer queue + `common/backoff`); we
|
|
120
|
+
* mirror that here so one transient journal/flush error at fire time cannot
|
|
121
|
+
* lose the timer until a process restart. Exponential from 100ms, capped at
|
|
122
|
+
* 30s, forever — the fire is idempotent (first-writer deferred completion,
|
|
123
|
+
* deduplicated journal admission, CAS clock completion), so retrying an
|
|
124
|
+
* arbitrary prefix is safe.
|
|
125
|
+
*
|
|
126
|
+
* @since 0.1.0
|
|
127
|
+
* @category constructors
|
|
128
|
+
*/
|
|
129
|
+
export const defaultFireRetryPolicy: FireRetryPolicy = Schedule.min([
|
|
130
|
+
Schedule.exponential("100 millis"),
|
|
131
|
+
Schedule.spaced("30 seconds")
|
|
132
|
+
])
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Constructs durable deferred and clock persistence.
|
|
136
|
+
*
|
|
137
|
+
* Delivery ordering is `durable state -> durable journal -> claim-gated
|
|
138
|
+
* resume`. The delivery operation itself never invokes a flow handler.
|
|
139
|
+
*
|
|
140
|
+
* @since 0.1.0
|
|
141
|
+
* @category constructors
|
|
142
|
+
*/
|
|
143
|
+
export const make = (
|
|
144
|
+
dependencies: Dependencies
|
|
145
|
+
): Effect.Effect<
|
|
146
|
+
Service,
|
|
147
|
+
never,
|
|
148
|
+
DurableEngineState.DurableEngineState | Journal.Journal | Scope.Scope
|
|
149
|
+
> =>
|
|
150
|
+
Effect.gen(function*() {
|
|
151
|
+
const state = yield* DurableEngineState.DurableEngineState
|
|
152
|
+
const journal = yield* Journal.Journal
|
|
153
|
+
/**
|
|
154
|
+
* The package's ordered state-and-journal boundary: engine state first,
|
|
155
|
+
* the journal's write transaction inside it. See
|
|
156
|
+
* {@link StateTransaction.make} for the order and what it guarantees.
|
|
157
|
+
*/
|
|
158
|
+
const transactState = StateTransaction.make(state, journal)
|
|
159
|
+
const timers = yield* FiberMap.make<string>()
|
|
160
|
+
const fireRetryPolicy = dependencies.fireRetryPolicy ?? defaultFireRetryPolicy
|
|
161
|
+
|
|
162
|
+
// The durable channel commits inside `emitDurable`; the flush that
|
|
163
|
+
// follows only pushes the *lossy* queue. Once the journal's lossy writer
|
|
164
|
+
// latches a `sink_failed` it stays latched for the process (issue #43),
|
|
165
|
+
// so treating a flush failure as a defect would turn every committed
|
|
166
|
+
// durable write into a permanent stall. Log and move on: durable
|
|
167
|
+
// delivery must never be coupled to lossy-channel health.
|
|
168
|
+
const flushLossy = journal.flush.pipe(
|
|
169
|
+
Effect.catchCause((cause) =>
|
|
170
|
+
Effect.logWarning(
|
|
171
|
+
"engine-store: lossy journal flush failed after a committed durable write; continuing",
|
|
172
|
+
cause
|
|
173
|
+
)
|
|
174
|
+
)
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
const persistDeferred = (
|
|
178
|
+
options: DeferredDoneOptions,
|
|
179
|
+
reason: ResumeReason = "deferred",
|
|
180
|
+
expectedWaiting?: { readonly reason: string; readonly token: string } | undefined,
|
|
181
|
+
alongside: Effect.Effect<void> = Effect.void
|
|
182
|
+
): Effect.Effect<FlowRuntime.DeferredDoneIfWaitingOutcome> =>
|
|
183
|
+
Effect.gen(function*() {
|
|
184
|
+
const completedAtMs = yield* Clock.currentTimeMillis.pipe(Effect.map(Math.floor))
|
|
185
|
+
// The completion row and the record describing it commit as one unit:
|
|
186
|
+
// a crash between them left a resumable deferred the journal never
|
|
187
|
+
// announced. The lossy flush below stays outside — it waits on the
|
|
188
|
+
// journal's writer fiber, which would deadlock against the write
|
|
189
|
+
// transaction this holds.
|
|
190
|
+
const admission = yield* transactState(
|
|
191
|
+
Effect.gen(function*() {
|
|
192
|
+
if (expectedWaiting !== undefined) {
|
|
193
|
+
const waiting = yield* state.waiting(options.executionId)
|
|
194
|
+
if (
|
|
195
|
+
Option.isNone(waiting) ||
|
|
196
|
+
waiting.value.reason !== expectedWaiting.reason ||
|
|
197
|
+
waiting.value.token !== expectedWaiting.token
|
|
198
|
+
) {
|
|
199
|
+
return { _tag: "NotWaiting" as const }
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
const completion = yield* state.completeDeferred({
|
|
203
|
+
flowName: options.flowName,
|
|
204
|
+
executionId: options.executionId,
|
|
205
|
+
deferredName: options.deferredName,
|
|
206
|
+
exit: options.exit,
|
|
207
|
+
...(options.metadata === undefined ? {} : { metadata: options.metadata }),
|
|
208
|
+
completedAtMs
|
|
209
|
+
})
|
|
210
|
+
const row = completion.row
|
|
211
|
+
|
|
212
|
+
// Durable channel: a deferred completion is a lifecycle record and
|
|
213
|
+
// must never take the droppable lossy queue. It is unfenced by
|
|
214
|
+
// design — external-trigger admissions are first-writer-wins
|
|
215
|
+
// regardless of who owns the run (issue #10), which is exactly the
|
|
216
|
+
// admission `emitDurableUnfenced` exists for. The record names the
|
|
217
|
+
// row and the digests of its value; the value stays in the row,
|
|
218
|
+
// because the journal is redacted and replayed (issue #72).
|
|
219
|
+
yield* journal.emitDurableUnfenced(
|
|
220
|
+
JournalRecords.deferredCompleted({
|
|
221
|
+
runId: options.executionId,
|
|
222
|
+
lineageId: FlowEngine.Lineage.root(options.executionId),
|
|
223
|
+
sourceId: `${dependencies.journalSource}:deferred:${
|
|
224
|
+
JSON.stringify([options.flowName, options.executionId, options.deferredName])
|
|
225
|
+
}`,
|
|
226
|
+
sourceSeq: 0
|
|
227
|
+
}, {
|
|
228
|
+
flowName: row.flowName,
|
|
229
|
+
executionId: row.executionId,
|
|
230
|
+
deferredName: row.deferredName,
|
|
231
|
+
completedAtMs: row.completedAtMs,
|
|
232
|
+
exitDigest: completion.digest.exit,
|
|
233
|
+
metadataDigest: completion.digest.metadata
|
|
234
|
+
})
|
|
235
|
+
).pipe(Effect.orDie)
|
|
236
|
+
yield* alongside
|
|
237
|
+
return { _tag: "Admitted" as const, completion }
|
|
238
|
+
})
|
|
239
|
+
).pipe(Effect.orDie)
|
|
240
|
+
if (admission._tag === "NotWaiting") return "NotWaiting"
|
|
241
|
+
const row = admission.completion.row
|
|
242
|
+
yield* flushLossy
|
|
243
|
+
yield* dependencies.scheduleResume(
|
|
244
|
+
row.flowName,
|
|
245
|
+
row.executionId,
|
|
246
|
+
reason
|
|
247
|
+
)
|
|
248
|
+
return admission.completion._tag
|
|
249
|
+
})
|
|
250
|
+
|
|
251
|
+
const completeDeferred = (
|
|
252
|
+
options: DeferredDoneOptions,
|
|
253
|
+
reason: ResumeReason = "deferred"
|
|
254
|
+
): Effect.Effect<void> => persistDeferred(options, reason).pipe(Effect.asVoid)
|
|
255
|
+
|
|
256
|
+
const fireClock = (row: DurableEngineState.ClockRow): Effect.Effect<void> =>
|
|
257
|
+
Effect.gen(function*() {
|
|
258
|
+
const completedAtMs = yield* Clock.currentTimeMillis.pipe(Effect.map(Math.floor))
|
|
259
|
+
// The clock completes in the deferred's transaction, and its record
|
|
260
|
+
// with it: a completion the journal never recorded is a clock a
|
|
261
|
+
// rebuilt deadline index would arm again (issue #2037).
|
|
262
|
+
yield* persistDeferred(
|
|
263
|
+
{
|
|
264
|
+
flowName: row.flowName,
|
|
265
|
+
executionId: row.executionId,
|
|
266
|
+
deferredName: row.deferredName,
|
|
267
|
+
exit: Exit.void,
|
|
268
|
+
metadata: {
|
|
269
|
+
clockName: row.clockName,
|
|
270
|
+
dueAtMs: row.dueAtMs,
|
|
271
|
+
completedAtMs
|
|
272
|
+
}
|
|
273
|
+
},
|
|
274
|
+
"clock",
|
|
275
|
+
undefined,
|
|
276
|
+
Effect.flatMap(
|
|
277
|
+
state.completeClock(row, completedAtMs),
|
|
278
|
+
(completed) =>
|
|
279
|
+
completed._tag === "Completed" ? emitClockCompleted(completed.row, completedAtMs) : Effect.void
|
|
280
|
+
)
|
|
281
|
+
)
|
|
282
|
+
})
|
|
283
|
+
|
|
284
|
+
const armClock = (row: DurableEngineState.ClockRow): Effect.Effect<void> =>
|
|
285
|
+
// A replayed sleep re-schedules its clock and gets the existing row
|
|
286
|
+
// back. A fired clock whose completion stands is not armed again: firing
|
|
287
|
+
// it would re-admit that completion and wake the run, whose replay would
|
|
288
|
+
// re-schedule the clock again, re-driving the parked run forever. A
|
|
289
|
+
// rewind can drop the completion and keep the fired row; that clock
|
|
290
|
+
// still has to fire.
|
|
291
|
+
(row.completedAtMs === null
|
|
292
|
+
? Effect.succeed(false)
|
|
293
|
+
: Effect.map(state.deferred(row), Option.isSome)).pipe(
|
|
294
|
+
Effect.flatMap((fired) => fired ? Effect.void : armTimer(row))
|
|
295
|
+
)
|
|
296
|
+
|
|
297
|
+
const armTimer = (row: DurableEngineState.ClockRow): Effect.Effect<void> =>
|
|
298
|
+
Clock.currentTimeMillis.pipe(Effect.map(Math.floor)).pipe(
|
|
299
|
+
Effect.flatMap((nowMs) =>
|
|
300
|
+
fireClock(row).pipe(
|
|
301
|
+
// A failed fire (journal emit/flush defect included) must not kill
|
|
302
|
+
// the one-shot timer fiber: expose the full cause and redispatch
|
|
303
|
+
// with backoff until the fire is durably acked.
|
|
304
|
+
Effect.sandbox,
|
|
305
|
+
Effect.retry(fireRetryPolicy),
|
|
306
|
+
Effect.orDie,
|
|
307
|
+
Effect.delay(Duration.millis(Math.max(0, row.dueAtMs - nowMs))),
|
|
308
|
+
FiberMap.run(timers, clockKey(row), { onlyIfMissing: true })
|
|
309
|
+
)
|
|
310
|
+
),
|
|
311
|
+
Effect.asVoid
|
|
312
|
+
)
|
|
313
|
+
|
|
314
|
+
/** Records that a clock stopped being pending, in the caller's transaction. */
|
|
315
|
+
const emitClockCompleted = (
|
|
316
|
+
row: DurableEngineState.ClockAddress,
|
|
317
|
+
completedAtMs: number
|
|
318
|
+
): Effect.Effect<void> =>
|
|
319
|
+
journal.emitDurableUnfenced(
|
|
320
|
+
JournalRecords.clockCompletedFor(
|
|
321
|
+
dependencies.journalSource,
|
|
322
|
+
FlowEngine.Lineage.root(row.executionId),
|
|
323
|
+
row,
|
|
324
|
+
completedAtMs
|
|
325
|
+
)
|
|
326
|
+
).pipe(Effect.asVoid, Effect.orDie)
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* Durable channel: clock schedule records are lifecycle evidence and must
|
|
330
|
+
* never be droppable (issue #10). Unfenced: registration-time sweeps
|
|
331
|
+
* re-record clocks the current process does not own.
|
|
332
|
+
*/
|
|
333
|
+
const emitClockScheduled = (
|
|
334
|
+
row: DurableEngineState.ClockRow
|
|
335
|
+
): Effect.Effect<void> =>
|
|
336
|
+
journal.emitDurableUnfenced(
|
|
337
|
+
JournalRecords.clockScheduled({
|
|
338
|
+
runId: row.executionId,
|
|
339
|
+
lineageId: FlowEngine.Lineage.root(row.executionId),
|
|
340
|
+
sourceId: `${dependencies.journalSource}:clock:${
|
|
341
|
+
JSON.stringify([row.flowName, row.executionId, row.clockName])
|
|
342
|
+
}`,
|
|
343
|
+
sourceSeq: 0
|
|
344
|
+
}, {
|
|
345
|
+
flowName: row.flowName,
|
|
346
|
+
executionId: row.executionId,
|
|
347
|
+
clockName: row.clockName,
|
|
348
|
+
deferredName: row.deferredName,
|
|
349
|
+
dueAtMs: row.dueAtMs
|
|
350
|
+
})
|
|
351
|
+
).pipe(Effect.asVoid, Effect.orDie)
|
|
352
|
+
|
|
353
|
+
/** Re-announces an already persisted clock row (the sweep path). */
|
|
354
|
+
const recordClockScheduled = (
|
|
355
|
+
row: DurableEngineState.ClockRow
|
|
356
|
+
): Effect.Effect<void> => emitClockScheduled(row).pipe(Effect.andThen(flushLossy))
|
|
357
|
+
|
|
358
|
+
const scheduleClock: Service["scheduleClock"] = Effect.fn("DeferredPersistence.scheduleClock")((
|
|
359
|
+
flow,
|
|
360
|
+
options
|
|
361
|
+
) =>
|
|
362
|
+
Effect.gen(function*() {
|
|
363
|
+
const nowMs = yield* Clock.currentTimeMillis.pipe(Effect.map(Math.floor))
|
|
364
|
+
// The clock row and its schedule record commit as one unit, so a
|
|
365
|
+
// crash between them can no longer arm a durable timer the journal
|
|
366
|
+
// never announced (or announce one that was rolled back).
|
|
367
|
+
const scheduled = yield* transactState(
|
|
368
|
+
Effect.gen(function*() {
|
|
369
|
+
const scheduled = yield* state.scheduleClock({
|
|
370
|
+
flowName: flow._tag,
|
|
371
|
+
executionId: options.executionId,
|
|
372
|
+
clockName: options.clock.name,
|
|
373
|
+
deferredName: options.clock.deferred.name,
|
|
374
|
+
dueAtMs: nowMs + Duration.toMillis(options.clock.duration),
|
|
375
|
+
completedAtMs: null
|
|
376
|
+
}, dependencies.owner)
|
|
377
|
+
yield* emitClockScheduled(scheduled.row)
|
|
378
|
+
return scheduled
|
|
379
|
+
})
|
|
380
|
+
).pipe(Effect.orDie)
|
|
381
|
+
yield* flushLossy
|
|
382
|
+
yield* armClock(scheduled.row)
|
|
383
|
+
})
|
|
384
|
+
)
|
|
385
|
+
|
|
386
|
+
const sweepDue: Service["sweepDue"] = Effect.fn("DeferredPersistence.sweepDue")((flowName) =>
|
|
387
|
+
Effect.gen(function*() {
|
|
388
|
+
const rows = yield* state.pendingClocks(flowName === undefined ? {} : { flowName })
|
|
389
|
+
yield* Effect.forEach(
|
|
390
|
+
rows,
|
|
391
|
+
(row) => recordClockScheduled(row).pipe(Effect.andThen(armClock(row))),
|
|
392
|
+
{ discard: true }
|
|
393
|
+
)
|
|
394
|
+
if (flowName !== undefined) {
|
|
395
|
+
const completions = yield* state.completedDeferreds(flowName)
|
|
396
|
+
yield* Effect.forEach(
|
|
397
|
+
completions,
|
|
398
|
+
(address) =>
|
|
399
|
+
dependencies.scheduleResume(
|
|
400
|
+
address.flowName,
|
|
401
|
+
address.executionId,
|
|
402
|
+
"deferred",
|
|
403
|
+
`${dependencies.journalSource}:wake:${
|
|
404
|
+
JSON.stringify([
|
|
405
|
+
address.flowName,
|
|
406
|
+
address.executionId,
|
|
407
|
+
address.deferredName
|
|
408
|
+
])
|
|
409
|
+
}`
|
|
410
|
+
),
|
|
411
|
+
{ discard: true }
|
|
412
|
+
)
|
|
413
|
+
}
|
|
414
|
+
})
|
|
415
|
+
)
|
|
416
|
+
|
|
417
|
+
return {
|
|
418
|
+
deferredResult: Effect.fn("DeferredPersistence.deferredResult")(function*(deferred) {
|
|
419
|
+
const instance = yield* FlowRuntime.FlowInstance
|
|
420
|
+
const address = {
|
|
421
|
+
flowName: instance.flow._tag,
|
|
422
|
+
executionId: instance.executionId,
|
|
423
|
+
deferredName: deferred.name
|
|
424
|
+
}
|
|
425
|
+
const row = yield* state.deferred(address)
|
|
426
|
+
if (Option.isSome(row)) {
|
|
427
|
+
// Keep the result for replay, but stop registration from waking a
|
|
428
|
+
// run that already observed it and may now be parked on another wait.
|
|
429
|
+
// The first consumption is recorded in the same transaction.
|
|
430
|
+
const consumedAtMs = yield* Clock.currentTimeMillis.pipe(Effect.map(Math.floor))
|
|
431
|
+
yield* transactState(
|
|
432
|
+
Effect.flatMap(state.consumeDeferred(address, consumedAtMs), (consumed) =>
|
|
433
|
+
consumed
|
|
434
|
+
? journal.emitDurableUnfenced(
|
|
435
|
+
JournalRecords.deferredConsumed({
|
|
436
|
+
runId: address.executionId,
|
|
437
|
+
lineageId: FlowEngine.Lineage.root(address.executionId),
|
|
438
|
+
sourceId: `${dependencies.journalSource}:deferred-consumed:${
|
|
439
|
+
JSON.stringify([address.flowName, address.executionId, address.deferredName])
|
|
440
|
+
}`,
|
|
441
|
+
sourceSeq: 0
|
|
442
|
+
}, { ...address, consumedAtMs })
|
|
443
|
+
).pipe(Effect.asVoid)
|
|
444
|
+
: Effect.void)
|
|
445
|
+
).pipe(Effect.orDie)
|
|
446
|
+
}
|
|
447
|
+
return Option.map(row, (value) => value.exit as Exit.Exit<unknown, unknown>)
|
|
448
|
+
}),
|
|
449
|
+
deferredDone: Effect.fn("DeferredPersistence.deferredDone")(completeDeferred),
|
|
450
|
+
deferredDoneIfWaiting: Effect.fn("DeferredPersistence.deferredDoneIfWaiting")((options) =>
|
|
451
|
+
persistDeferred(options, "deferred", {
|
|
452
|
+
reason: options.reason,
|
|
453
|
+
token: options.token
|
|
454
|
+
})
|
|
455
|
+
),
|
|
456
|
+
scheduleClock,
|
|
457
|
+
sweepDue
|
|
458
|
+
}
|
|
459
|
+
})
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Effect-boundary evidence, emitted by the engine at the point an irreversible
|
|
3
|
+
* action crosses into the outside world.
|
|
4
|
+
*
|
|
5
|
+
* Time travel (`packages/smithers/flows/time-travel/docs/README.md`) requires one durable
|
|
6
|
+
* journal entry recorded **before the adapter begins**, whose status then moves
|
|
7
|
+
* only forward (`intended` → `succeeded` | `unknown`). Rewind reads exactly
|
|
8
|
+
* these records to classify the doomed suffix as blocking, revertible, or
|
|
9
|
+
* warning; nothing else in the journal can answer that question, because an
|
|
10
|
+
* attempt row says an attempt happened, not that an effect left the machine.
|
|
11
|
+
*
|
|
12
|
+
* ## Why the shape lives here and not in `@smthrs/time-travel`
|
|
13
|
+
*
|
|
14
|
+
* `@smthrs/time-travel` depends on `@smthrs/engine-store` (it decodes
|
|
15
|
+
* `RunState`), so the arrow cannot be reversed without a cycle. The record is
|
|
16
|
+
* therefore a **wire contract**, not a shared type: this module writes the
|
|
17
|
+
* shape `EffectBoundary.decodeEntry` reads, under the event type that module
|
|
18
|
+
* owns, and `packages/smithers/flows/time-travel/test/EngineIntegration.test.ts` pins the two
|
|
19
|
+
* together by rewinding across a boundary record this module produced.
|
|
20
|
+
*
|
|
21
|
+
* ## One producer identity, two channels that must not double-count
|
|
22
|
+
*
|
|
23
|
+
* An irreversible dispatch now writes on two channels: the attempt lifecycle
|
|
24
|
+
* (`attempt-started` / `attempt-finished`), which says a durable attempt row
|
|
25
|
+
* moved, and this boundary (`intended` / terminal), which says an external
|
|
26
|
+
* effect was begun and how it settled. They are deliberately NOT merged —
|
|
27
|
+
* an attempt is retried under new numbers while an effect keeps one identity —
|
|
28
|
+
* and they cannot double-count, because a rewind's suffix scan matches only
|
|
29
|
+
* {@link eventType}. The two are tied by construction: the effect id IS the
|
|
30
|
+
* attempt identity (`runId:keyDigest:attempt`), so every boundary record names
|
|
31
|
+
* the attempt row that produced it and the audit reads as one story.
|
|
32
|
+
*
|
|
33
|
+
* @since 0.1.0
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
import { JournalEvent } from "@smthrs/journal"
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* The event type `@smthrs/time-travel` decodes boundary evidence from.
|
|
40
|
+
*
|
|
41
|
+
* Duplicated deliberately rather than imported: see the module note.
|
|
42
|
+
*
|
|
43
|
+
* @since 0.1.0
|
|
44
|
+
* @category constants
|
|
45
|
+
*/
|
|
46
|
+
export const eventType = "flows.time-travel.effect-boundary"
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Monotonic completion evidence recorded around an effect.
|
|
50
|
+
*
|
|
51
|
+
* @since 0.1.0
|
|
52
|
+
* @category models
|
|
53
|
+
*/
|
|
54
|
+
export type Status = "intended" | "succeeded" | "unknown"
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* What the engine knows about an effect before it begins.
|
|
58
|
+
*
|
|
59
|
+
* @since 0.1.0
|
|
60
|
+
* @category models
|
|
61
|
+
*/
|
|
62
|
+
export interface Descriptor {
|
|
63
|
+
readonly id: string
|
|
64
|
+
readonly kind: string
|
|
65
|
+
readonly tier: "sealed" | "compensable" | "irreversible"
|
|
66
|
+
readonly runId: string
|
|
67
|
+
readonly lineageId: string
|
|
68
|
+
readonly sourceId: string
|
|
69
|
+
readonly attempt: number
|
|
70
|
+
readonly idempotencyKey?: string | undefined
|
|
71
|
+
readonly cacheKey?: string | undefined
|
|
72
|
+
readonly changeId?: string | undefined
|
|
73
|
+
/**
|
|
74
|
+
* The stable compensation descriptor the adapter owns, when it declares one.
|
|
75
|
+
* Time travel puts it in the entry so a
|
|
76
|
+
* rewind's handler resolution is a lookup over recorded evidence rather than
|
|
77
|
+
* a guess from the effect kind alone.
|
|
78
|
+
*/
|
|
79
|
+
readonly compensation?: string | undefined
|
|
80
|
+
readonly residue?: string | undefined
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Builds one boundary record for `descriptor` at `status`.
|
|
85
|
+
*
|
|
86
|
+
* Every effect and status pair gets its own producer identity: the status is
|
|
87
|
+
* appended to `descriptor.sourceId`, and every boundary record carries
|
|
88
|
+
* sourceSeq 0. Re-emitting the same status for the same effect therefore
|
|
89
|
+
* reuses that `(sourceId, sourceSeq)` pair, so a replay collapses into a
|
|
90
|
+
* journal `Duplicate` instead of appending a second boundary row, the same
|
|
91
|
+
* convergence the attempt lifecycle records rely on.
|
|
92
|
+
*
|
|
93
|
+
* @since 0.1.0
|
|
94
|
+
* @category constructors
|
|
95
|
+
*/
|
|
96
|
+
export const boundary = (
|
|
97
|
+
descriptor: Descriptor,
|
|
98
|
+
status: Status,
|
|
99
|
+
output?: unknown
|
|
100
|
+
): JournalEvent.Input =>
|
|
101
|
+
new JournalEvent.Input({
|
|
102
|
+
runId: descriptor.runId as JournalEvent.RunId,
|
|
103
|
+
sourceId: `${descriptor.sourceId}:effect:${descriptor.id}:${status}` as JournalEvent.SourceId,
|
|
104
|
+
sourceSeq: 0 as JournalEvent.SourceSeq,
|
|
105
|
+
eventType,
|
|
106
|
+
payload: {
|
|
107
|
+
version: 1,
|
|
108
|
+
effect: {
|
|
109
|
+
id: descriptor.id,
|
|
110
|
+
kind: descriptor.kind,
|
|
111
|
+
tier: descriptor.tier,
|
|
112
|
+
status,
|
|
113
|
+
runId: descriptor.runId,
|
|
114
|
+
lineageId: descriptor.lineageId,
|
|
115
|
+
attempt: descriptor.attempt,
|
|
116
|
+
durableBoundary: true,
|
|
117
|
+
providerStream: false,
|
|
118
|
+
...(output === undefined ? {} : { output }),
|
|
119
|
+
...(descriptor.idempotencyKey === undefined ? {} : { idempotencyKey: descriptor.idempotencyKey }),
|
|
120
|
+
...(descriptor.cacheKey === undefined ? {} : { cacheKey: descriptor.cacheKey }),
|
|
121
|
+
...(descriptor.changeId === undefined ? {} : { changeId: descriptor.changeId }),
|
|
122
|
+
...(descriptor.compensation === undefined ? {} : { compensation: descriptor.compensation }),
|
|
123
|
+
...(descriptor.residue === undefined ? {} : { residue: descriptor.residue })
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
meta: {
|
|
127
|
+
lineageId: descriptor.lineageId,
|
|
128
|
+
...(descriptor.cacheKey === undefined ? {} : { cacheKey: descriptor.cacheKey }),
|
|
129
|
+
timeTravel: {
|
|
130
|
+
effectId: descriptor.id,
|
|
131
|
+
kind: descriptor.kind,
|
|
132
|
+
tier: descriptor.tier,
|
|
133
|
+
status
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
})
|
|
@@ -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
|
+
|
|
11
|
+
import { Jj } from "@smthrs/kernel"
|
|
12
|
+
import * as Context from "effect/Context"
|
|
13
|
+
import * as Effect from "effect/Effect"
|
|
14
|
+
import * as Layer from "effect/Layer"
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Engine-owned repository operations, absent from public action context.
|
|
18
|
+
*
|
|
19
|
+
* @since 1.0.0
|
|
20
|
+
* @category services
|
|
21
|
+
*/
|
|
22
|
+
export class EngineJj extends Context.Service<EngineJj, Jj.Jj>()("@smthrs/engine-store/internal/EngineJj") {}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Captures the current public Jj implementation under the private engine tag.
|
|
26
|
+
*
|
|
27
|
+
* @since 1.0.0
|
|
28
|
+
* @category layers
|
|
29
|
+
*/
|
|
30
|
+
export const layerFromJj: Layer.Layer<EngineJj, never, Jj.Jj> = Layer.effect(EngineJj, Effect.map(Jj.Jj, EngineJj.of))
|