@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,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared fail-closed decoding of artifact addresses held by durable engine
|
|
3
|
+
* rows.
|
|
4
|
+
*
|
|
5
|
+
* @since 1.0.0
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import * as ArtifactStore from "@smthrs/artifacts/ArtifactStore"
|
|
9
|
+
import * as Effect from "effect/Effect"
|
|
10
|
+
import * as Schema from "effect/Schema"
|
|
11
|
+
import * as StepBoundary from "../StepBoundary.ts"
|
|
12
|
+
|
|
13
|
+
const RootMeta = Schema.Struct({ boundary: StepBoundary.BoundaryEvidence })
|
|
14
|
+
const MetaJson = Schema.fromJsonString(Schema.Unknown)
|
|
15
|
+
// The store's own address schema is the one rule for what counts as a digest;
|
|
16
|
+
// reimplementing it here is how the two drift apart.
|
|
17
|
+
const isDigest = Schema.is(ArtifactStore.Digest)
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* A durable root row this build cannot interpret safely.
|
|
21
|
+
*
|
|
22
|
+
* @category errors
|
|
23
|
+
* @since 1.0.0
|
|
24
|
+
*/
|
|
25
|
+
export class ArtifactRootDecodeError extends Schema.TaggedError<ArtifactRootDecodeError>()(
|
|
26
|
+
"@smthrs/engine-store/ArtifactRootDecodeError",
|
|
27
|
+
{ table: Schema.String, cause: Schema.Unknown }
|
|
28
|
+
) {
|
|
29
|
+
override readonly name = "ArtifactRootDecodeError"
|
|
30
|
+
override get message(): string {
|
|
31
|
+
return `a ${this.table} row carries artifact evidence this build cannot decode`
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Extracts referenced boundary digests from one metadata column.
|
|
37
|
+
*
|
|
38
|
+
* @category decoding
|
|
39
|
+
* @since 1.0.0
|
|
40
|
+
*/
|
|
41
|
+
export const rootDigests = (
|
|
42
|
+
table: string,
|
|
43
|
+
metaJson: string
|
|
44
|
+
): Effect.Effect<ReadonlyArray<string>, ArtifactRootDecodeError> =>
|
|
45
|
+
Effect.gen(function*() {
|
|
46
|
+
const meta = yield* Schema.decodeUnknownEffect(MetaJson)(metaJson).pipe(
|
|
47
|
+
Effect.mapError((cause) => new ArtifactRootDecodeError({ table, cause }))
|
|
48
|
+
)
|
|
49
|
+
if (meta === null || typeof meta !== "object" || !("boundary" in meta)) return []
|
|
50
|
+
const decoded = Schema.decodeUnknownResult(RootMeta)(meta)
|
|
51
|
+
if (decoded._tag === "Failure") {
|
|
52
|
+
return yield* Effect.fail(new ArtifactRootDecodeError({ table, cause: decoded.failure }))
|
|
53
|
+
}
|
|
54
|
+
return StepBoundary.referencedDigests(decoded.success.boundary)
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
const collectArtifactDigests = (root: unknown): ReadonlyArray<string> => {
|
|
58
|
+
const digests = new Set<string>()
|
|
59
|
+
const pending: Array<unknown> = [root]
|
|
60
|
+
while (pending.length > 0) {
|
|
61
|
+
const next = pending.pop()
|
|
62
|
+
if (typeof next === "string") {
|
|
63
|
+
if (isDigest(next)) digests.add(next)
|
|
64
|
+
continue
|
|
65
|
+
}
|
|
66
|
+
if (Array.isArray(next)) {
|
|
67
|
+
pending.push(...next)
|
|
68
|
+
continue
|
|
69
|
+
}
|
|
70
|
+
if (next !== null && typeof next === "object") {
|
|
71
|
+
pending.push(...Object.values(next as Readonly<Record<string, unknown>>))
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return [...digests]
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Extracts digest-shaped addresses from one opaque attempt checkpoint.
|
|
79
|
+
*
|
|
80
|
+
* @category decoding
|
|
81
|
+
* @since 1.0.0
|
|
82
|
+
*/
|
|
83
|
+
export const checkpointDigests = (
|
|
84
|
+
checkpointJson: string | null
|
|
85
|
+
): Effect.Effect<ReadonlyArray<string>, ArtifactRootDecodeError> =>
|
|
86
|
+
Effect.gen(function*() {
|
|
87
|
+
if (checkpointJson === null) return []
|
|
88
|
+
const checkpoint = yield* Schema.decodeUnknownEffect(MetaJson)(checkpointJson).pipe(
|
|
89
|
+
Effect.mapError((cause) => new ArtifactRootDecodeError({ table: "flows_attempts.checkpoint_json", cause }))
|
|
90
|
+
)
|
|
91
|
+
return collectArtifactDigests(checkpoint)
|
|
92
|
+
})
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The in-process attempt admission mutex.
|
|
3
|
+
*
|
|
4
|
+
* One instance lives per store incarnation (per `EngineStore.make`, alongside
|
|
5
|
+
* the owner nonce). Every durable action dispatch holds the key's permit
|
|
6
|
+
* for its whole admission-execute-finish span, so at most one fiber of this
|
|
7
|
+
* process can be driving a given `(runId, stepKeyDigest, attempt)` at a time.
|
|
8
|
+
*
|
|
9
|
+
* That exclusion is the liveness evidence adoption needs (issues #86, #102,
|
|
10
|
+
* #103): a persisted `running` row observed *while holding the key's permit*
|
|
11
|
+
* cannot belong to a live fiber of this process — a live same-key dispatch
|
|
12
|
+
* would be holding the permit — so it is crash or interruption evidence and
|
|
13
|
+
* safe to adopt, whether the admitting incarnation was another process
|
|
14
|
+
* (superseded by the run fence) or this very one (a dead fiber after an
|
|
15
|
+
* in-process re-drive). The recorded incarnation nonce alone could not make
|
|
16
|
+
* that distinction, which both let a TOCTOU window double-execute an
|
|
17
|
+
* irreversible body (issue #102) and permanently failed a same-incarnation
|
|
18
|
+
* re-drive with `AttemptAdmissionRejected` (issue #103).
|
|
19
|
+
*
|
|
20
|
+
* @since 0.1.0
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import * as Context from "effect/Context"
|
|
24
|
+
import * as Effect from "effect/Effect"
|
|
25
|
+
import * as Layer from "effect/Layer"
|
|
26
|
+
import * as RcMap from "effect/RcMap"
|
|
27
|
+
import * as Scope from "effect/Scope"
|
|
28
|
+
import * as Semaphore from "effect/Semaphore"
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* The single operation the admission mutex exposes: run something while
|
|
32
|
+
* holding a key's exclusive permit.
|
|
33
|
+
*
|
|
34
|
+
* It is deliberately not a lock/unlock pair. Handing out a permit a caller
|
|
35
|
+
* must remember to return would make an interrupted dispatch leak exclusion
|
|
36
|
+
* for the rest of the process's life; a bracketing combinator cannot.
|
|
37
|
+
*
|
|
38
|
+
* @since 0.1.0
|
|
39
|
+
* @category services
|
|
40
|
+
*/
|
|
41
|
+
export interface Service {
|
|
42
|
+
/**
|
|
43
|
+
* Runs `effect` while holding this process's exclusive permit for `key`.
|
|
44
|
+
* Concurrent same-key callers wait; the permit is released on any exit,
|
|
45
|
+
* including interruption.
|
|
46
|
+
*/
|
|
47
|
+
readonly withPermit: (
|
|
48
|
+
key: string
|
|
49
|
+
) => <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Constructs the keyed admission mutex synchronously.
|
|
54
|
+
*
|
|
55
|
+
* Gates are reference-counted and removed once no fiber holds or awaits
|
|
56
|
+
* them, so the map does not grow with the number of distinct keys a
|
|
57
|
+
* long-lived process dispatches.
|
|
58
|
+
*
|
|
59
|
+
* @since 0.1.0
|
|
60
|
+
* @category constructors
|
|
61
|
+
*/
|
|
62
|
+
export const makeUnsafe = (): Service => {
|
|
63
|
+
// One layer identity per incarnation; each operation borrows its owner
|
|
64
|
+
// through a shared memo map, so the last operation releases the RcMap.
|
|
65
|
+
const Locks = Context.Service<RcMap.RcMap<string, Semaphore.Semaphore>>("AttemptAdmission/Locks")
|
|
66
|
+
const layer = Layer.effect(Locks, RcMap.make({ lookup: (_key: string) => Semaphore.make(1) }))
|
|
67
|
+
const owners = Layer.makeMemoMapUnsafe()
|
|
68
|
+
return {
|
|
69
|
+
withPermit: (key) => (effect) =>
|
|
70
|
+
Effect.scoped(Effect.gen(function*() {
|
|
71
|
+
const services = yield* Layer.buildWithMemoMap(layer, owners, yield* Scope.Scope)
|
|
72
|
+
const lock = yield* RcMap.get(Context.get(services, Locks), key)
|
|
73
|
+
return yield* lock.withPermit(effect)
|
|
74
|
+
}))
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Complete attempt-history projection. The attempt store remains authoritative;
|
|
3
|
+
* only v2 histories contain enough evidence to rebuild this projection.
|
|
4
|
+
*
|
|
5
|
+
* @since 1.0.0
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import * as EngineEvent from "@smthrs/journal/EngineEvent"
|
|
9
|
+
import * as JournalEvent from "@smthrs/journal/JournalEvent"
|
|
10
|
+
import type * as Projection from "@smthrs/journal/Projection"
|
|
11
|
+
import * as Cause from "effect/Cause"
|
|
12
|
+
import * as Effect from "effect/Effect"
|
|
13
|
+
import * as Schema from "effect/Schema"
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* An attempt state with completion data required only at completion.
|
|
17
|
+
*
|
|
18
|
+
* @category schemas
|
|
19
|
+
* @since 1.0.0
|
|
20
|
+
*/
|
|
21
|
+
export const AttemptLifecycle = EngineEvent.AttemptLifecycle
|
|
22
|
+
/**
|
|
23
|
+
* An attempt state with completion data required only at completion.
|
|
24
|
+
*
|
|
25
|
+
* @category models
|
|
26
|
+
* @since 1.0.0
|
|
27
|
+
*/
|
|
28
|
+
export type AttemptLifecycle = EngineEvent.AttemptLifecycle
|
|
29
|
+
/**
|
|
30
|
+
* Validate untrusted encoded state without dropping contradictory fields.
|
|
31
|
+
*
|
|
32
|
+
* @category decoders
|
|
33
|
+
* @since 1.0.0
|
|
34
|
+
*/
|
|
35
|
+
export const decode = (input: unknown) =>
|
|
36
|
+
Effect.suspend(() => Schema.decodeUnknownEffect(AttemptLifecycle, { onExcessProperty: "error" })(input)).pipe(
|
|
37
|
+
Effect.catchCause((cause) =>
|
|
38
|
+
Effect.fail(
|
|
39
|
+
new EngineEvent.EventError({
|
|
40
|
+
code: "malformed",
|
|
41
|
+
message: "invalid attempt lifecycle",
|
|
42
|
+
cause: Cause.squash(cause)
|
|
43
|
+
})
|
|
44
|
+
)
|
|
45
|
+
)
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* The latest complete journal state for one attempt.
|
|
50
|
+
*
|
|
51
|
+
* @category models
|
|
52
|
+
* @since 1.0.0
|
|
53
|
+
*/
|
|
54
|
+
export interface Row {
|
|
55
|
+
readonly executionId: string
|
|
56
|
+
readonly stepKeyDigest: string
|
|
57
|
+
readonly attempt: number
|
|
58
|
+
readonly seq: number
|
|
59
|
+
readonly lifecycle: AttemptLifecycle
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Attempt projection rows, independent of executable engine storage.
|
|
64
|
+
*
|
|
65
|
+
* @category models
|
|
66
|
+
* @since 1.0.0
|
|
67
|
+
*/
|
|
68
|
+
export type State = ReadonlyArray<Row>
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* A versioned retained projection. Its sequence covers every included row.
|
|
72
|
+
*
|
|
73
|
+
* @category schemas
|
|
74
|
+
* @since 1.0.0
|
|
75
|
+
*/
|
|
76
|
+
export const Snapshot = Schema.Struct({
|
|
77
|
+
version: Schema.Literal(2),
|
|
78
|
+
lineage: EngineEvent.Lineage,
|
|
79
|
+
seq: JournalEvent.Seq,
|
|
80
|
+
rows: Schema.Array(Schema.Struct({
|
|
81
|
+
executionId: JournalEvent.Identifier,
|
|
82
|
+
stepKeyDigest: JournalEvent.Identifier,
|
|
83
|
+
attempt: JournalEvent.NonNegativeQuantity,
|
|
84
|
+
seq: JournalEvent.Seq,
|
|
85
|
+
lifecycle: AttemptLifecycle
|
|
86
|
+
}))
|
|
87
|
+
}).check(
|
|
88
|
+
Schema.makeFilter((snapshot) =>
|
|
89
|
+
snapshot.rows.every((row) => row.seq <= snapshot.seq && row.executionId === snapshot.lineage.runId) &&
|
|
90
|
+
new Set(snapshot.rows.map((row) => JSON.stringify([row.executionId, row.stepKeyDigest, row.attempt]))).size ===
|
|
91
|
+
snapshot.rows.length
|
|
92
|
+
)
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Decode retained state and check all lineage coordinates before suffix replay.
|
|
97
|
+
* Source admission still applies independently to every suffix event.
|
|
98
|
+
*
|
|
99
|
+
* @category decoders
|
|
100
|
+
* @since 1.0.0
|
|
101
|
+
*/
|
|
102
|
+
export const restore = (input: unknown, consumer: EngineEvent.Consumer) =>
|
|
103
|
+
Effect.suspend(() => Schema.decodeUnknownEffect(Snapshot, { onExcessProperty: "error" })(input)).pipe(
|
|
104
|
+
Effect.flatMap((snapshot) => {
|
|
105
|
+
const lineage = snapshot.lineage
|
|
106
|
+
return lineage.runId !== consumer.runId || lineage.lineageId !== consumer.lineageId ||
|
|
107
|
+
lineage.rootRunId !== consumer.rootRunId || lineage.round !== consumer.round ||
|
|
108
|
+
lineage.parentRunId !== consumer.parentRunId
|
|
109
|
+
? Effect.fail(
|
|
110
|
+
new EngineEvent.EventError({
|
|
111
|
+
code: "foreign",
|
|
112
|
+
message: "attempt snapshot is outside the consumer lineage",
|
|
113
|
+
cause: lineage
|
|
114
|
+
})
|
|
115
|
+
)
|
|
116
|
+
: Effect.succeed(snapshot)
|
|
117
|
+
}),
|
|
118
|
+
Effect.catchCause((failure) => {
|
|
119
|
+
const cause = Cause.squash(failure)
|
|
120
|
+
return Effect.fail(
|
|
121
|
+
cause instanceof EngineEvent.EventError ?
|
|
122
|
+
cause
|
|
123
|
+
: new EngineEvent.EventError({ code: "malformed", message: "invalid attempt snapshot", cause })
|
|
124
|
+
)
|
|
125
|
+
})
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Reduces full lifecycle records with monotonic sequence and legal state
|
|
130
|
+
* transitions. A missing start is incomplete history, never terminal success.
|
|
131
|
+
*
|
|
132
|
+
* @category projections
|
|
133
|
+
* @since 1.0.0
|
|
134
|
+
*/
|
|
135
|
+
export const projection = (consumer: EngineEvent.Consumer): Projection.Projection<State, EngineEvent.EventError> => ({
|
|
136
|
+
name: "flows/engine/attempts/v2",
|
|
137
|
+
initial: [],
|
|
138
|
+
reduce: (state, entry) =>
|
|
139
|
+
Effect.gen(function*() {
|
|
140
|
+
const decoded = yield* EngineEvent.decodeEntry(entry, consumer)
|
|
141
|
+
if (decoded._tag !== "Attempt") return state
|
|
142
|
+
const { attempt, executionId, lifecycle, stepKeyDigest } = decoded.payload
|
|
143
|
+
const previous = state.find((row) =>
|
|
144
|
+
row.executionId === executionId && row.stepKeyDigest === stepKeyDigest && row.attempt === attempt
|
|
145
|
+
)
|
|
146
|
+
if (
|
|
147
|
+
previous === undefined
|
|
148
|
+
? lifecycle.state !== "running"
|
|
149
|
+
: entry.seq <= previous.seq || previous.lifecycle.state === "succeeded" ||
|
|
150
|
+
previous.lifecycle.state === "failed" || lifecycle.startedAtMs !== previous.lifecycle.startedAtMs
|
|
151
|
+
) {
|
|
152
|
+
return yield* Effect.fail(
|
|
153
|
+
new EngineEvent.EventError({
|
|
154
|
+
code: "transition",
|
|
155
|
+
message: "attempt history has a missing start, reordered record or transition after completion",
|
|
156
|
+
cause: { previous, entry }
|
|
157
|
+
})
|
|
158
|
+
)
|
|
159
|
+
}
|
|
160
|
+
const row: Row = { executionId, stepKeyDigest, attempt, seq: entry.seq, lifecycle }
|
|
161
|
+
return [...state.filter((candidate) => candidate !== previous), row]
|
|
162
|
+
})
|
|
163
|
+
})
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Survivor discovery for an action key's attempt rows.
|
|
3
|
+
*
|
|
4
|
+
* Two implementations answer the same question — the durable state's single
|
|
5
|
+
* ordered range read (issue #77) and the point-probe walk against
|
|
6
|
+
* `AttemptStore` for storage that cannot range-scan. They are kept here
|
|
7
|
+
* together, behind one entry point, because their answers must agree: a run
|
|
8
|
+
* that resumes under SQL state and under the fallback must restore the same
|
|
9
|
+
* retry origin and the same attempt counter (issue #96).
|
|
10
|
+
*
|
|
11
|
+
* @since 0.1.0
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import type { AttemptStore } from "@smthrs/run-store"
|
|
15
|
+
import * as Effect from "effect/Effect"
|
|
16
|
+
import * as Option from "effect/Option"
|
|
17
|
+
import type * as DurableEngineState from "../DurableEngineState.ts"
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* How long a pruned leading run of attempt numbers the survivor scan
|
|
21
|
+
* tolerates before it reports "no attempt row survives".
|
|
22
|
+
*
|
|
23
|
+
* A retention/prune job removes attempts oldest-first, so a surviving
|
|
24
|
+
* sequence is contiguous once its first row is found; the bound caps the
|
|
25
|
+
* pruned prefix walk (issue #69). It is a *semantic* bound, not merely a
|
|
26
|
+
* cost bound: the point-probe fallback cannot distinguish "nothing ever ran"
|
|
27
|
+
* from "the first 33 attempts were pruned" without a range read, so both
|
|
28
|
+
* paths apply the same tolerance and a key whose earliest survivor sits past
|
|
29
|
+
* it restarts its expiration budget and attempt numbering on either backend
|
|
30
|
+
* (issue #96). Restarting is safe — the pruned numbers are gone, so the
|
|
31
|
+
* fresh counter cannot collide — and, unlike the previous split, it is the
|
|
32
|
+
* same behaviour on every backend.
|
|
33
|
+
*
|
|
34
|
+
* @since 0.1.0
|
|
35
|
+
* @category constants
|
|
36
|
+
*/
|
|
37
|
+
export const prunedPrefixScanLimit = 32
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Finds the surviving attempt rows for an action key: the earliest row's
|
|
41
|
+
* start time — the durable retry origin when attempt 1 itself was pruned
|
|
42
|
+
* (issue #69) — and the highest attempt number contiguous from it, from
|
|
43
|
+
* which the engine resumes the attempt counter (issue #59). `Option.none()`
|
|
44
|
+
* means no attempt row survives within `prunedPrefixScanLimit`.
|
|
45
|
+
*
|
|
46
|
+
* When the durable state can range-scan attempts, one ordered SELECT answers
|
|
47
|
+
* both questions (issue #77); otherwise the point-read scan against
|
|
48
|
+
* `AttemptStore` answers them, paying up to `prunedPrefixScanLimit`
|
|
49
|
+
* sequential gets for a key that never ran. Both answers pass through the
|
|
50
|
+
* same tolerance check, so the two paths cannot diverge (issue #96).
|
|
51
|
+
*
|
|
52
|
+
* @since 0.1.0
|
|
53
|
+
* @category combinators
|
|
54
|
+
*/
|
|
55
|
+
export const probeAttempts = (
|
|
56
|
+
attemptStore: AttemptStore.Service,
|
|
57
|
+
survivors: DurableEngineState.Service["attemptSurvivors"],
|
|
58
|
+
runId: string,
|
|
59
|
+
stepKeyDigest: string
|
|
60
|
+
): Effect.Effect<Option.Option<DurableEngineState.AttemptSurvivors>> =>
|
|
61
|
+
Effect.gen(function*() {
|
|
62
|
+
if (survivors !== undefined) {
|
|
63
|
+
const found = yield* survivors(runId, stepKeyDigest)
|
|
64
|
+
if (Option.isNone(found)) return Option.none()
|
|
65
|
+
return found.value.earliestAttempt > prunedPrefixScanLimit
|
|
66
|
+
? Option.none()
|
|
67
|
+
: found
|
|
68
|
+
}
|
|
69
|
+
let earliest = Option.none<AttemptStore.Attempt>()
|
|
70
|
+
let attempt = 1
|
|
71
|
+
for (; attempt <= prunedPrefixScanLimit; attempt++) {
|
|
72
|
+
const row = yield* attemptStore.get({ runId, stepKeyDigest, attempt }).pipe(Effect.orDie)
|
|
73
|
+
if (Option.isSome(row)) {
|
|
74
|
+
earliest = row
|
|
75
|
+
break
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (Option.isNone(earliest)) return Option.none()
|
|
79
|
+
let latest = attempt
|
|
80
|
+
for (let next = attempt + 1;; next++) {
|
|
81
|
+
const row = yield* attemptStore.get({ runId, stepKeyDigest, attempt: next }).pipe(Effect.orDie)
|
|
82
|
+
if (Option.isNone(row)) break
|
|
83
|
+
latest = next
|
|
84
|
+
}
|
|
85
|
+
return Option.some({
|
|
86
|
+
earliestAttempt: attempt,
|
|
87
|
+
earliestStartedAtMs: earliest.value.startedAtMs,
|
|
88
|
+
latest
|
|
89
|
+
})
|
|
90
|
+
})
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure, phase-specific cache evidence admission. Storage decoding, current-read
|
|
3
|
+
* measurement, TTL history, output replay and publication I/O stay with their owners.
|
|
4
|
+
* @since 1.0.0-rc.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { Action } from "@smthrs/flow"
|
|
8
|
+
import type { FileBoundary } from "@smthrs/flow/FileBoundary"
|
|
9
|
+
import * as FileSet from "@smthrs/plan/FileSet"
|
|
10
|
+
import type * as StepBoundary from "../StepBoundary.ts"
|
|
11
|
+
|
|
12
|
+
/** Reasons an existing declaration cannot name reusable results.
|
|
13
|
+
* @category models
|
|
14
|
+
* @since 1.0.0-rc.0
|
|
15
|
+
*/
|
|
16
|
+
export type DisabledReason = "unsealed" | "missing-boundary" | "expected-boundary" | "unresolved-read-glob"
|
|
17
|
+
|
|
18
|
+
/** Declaration eligibility is separate from proof that a result may be reused.
|
|
19
|
+
* @category models
|
|
20
|
+
* @since 1.0.0-rc.0
|
|
21
|
+
*/
|
|
22
|
+
export type Declaration =
|
|
23
|
+
| { readonly _tag: "Eligible"; readonly metadata: FileBoundary }
|
|
24
|
+
| { readonly _tag: "Disabled"; readonly reason: DisabledReason }
|
|
25
|
+
|
|
26
|
+
/** The proof-bearing part of already-decoded attempt metadata.
|
|
27
|
+
* @category models
|
|
28
|
+
* @since 1.0.0-rc.0
|
|
29
|
+
*/
|
|
30
|
+
export interface Metadata {
|
|
31
|
+
readonly tier: Action.Tier
|
|
32
|
+
readonly boundary?: StepBoundary.BoundaryEvidence | undefined
|
|
33
|
+
readonly readSetVerified?: true | undefined
|
|
34
|
+
readonly boundaryQuarantined?: true | undefined
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** A refusal is not a failure of an already durable action outcome.
|
|
38
|
+
* @category models
|
|
39
|
+
* @since 1.0.0-rc.0
|
|
40
|
+
*/
|
|
41
|
+
export interface Refused {
|
|
42
|
+
readonly _tag: "Refused"
|
|
43
|
+
readonly reason:
|
|
44
|
+
| DisabledReason
|
|
45
|
+
| "invalid-meta"
|
|
46
|
+
| "unsealed-meta"
|
|
47
|
+
| "missing-evidence"
|
|
48
|
+
| "deviation"
|
|
49
|
+
| "unverified-writes"
|
|
50
|
+
| "unverified-hermetic-reads"
|
|
51
|
+
| "unverified-recorded-reads"
|
|
52
|
+
| "quarantined-evidence"
|
|
53
|
+
| "contradictory-evidence"
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Necessary historical evidence, not yet a hit: current reads and outputs still need verification.
|
|
57
|
+
* @category models
|
|
58
|
+
* @since 1.0.0-rc.0
|
|
59
|
+
*/
|
|
60
|
+
export interface CandidateEvidence<M extends Metadata> {
|
|
61
|
+
readonly _tag: "CandidateEvidence"
|
|
62
|
+
readonly meta: M
|
|
63
|
+
readonly evidence: StepBoundary.BoundaryEvidence
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Shared gate for fresh completion and durable-completion convergence.
|
|
67
|
+
* @category models
|
|
68
|
+
* @since 1.0.0-rc.0
|
|
69
|
+
*/
|
|
70
|
+
export interface PublishCompletion<M extends Metadata> {
|
|
71
|
+
readonly _tag: "PublishCompletion"
|
|
72
|
+
readonly meta: M
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Classifies existing declaration policy without changing keys or measuring the host.
|
|
76
|
+
* @category classifiers
|
|
77
|
+
* @since 1.0.0-rc.0
|
|
78
|
+
*/
|
|
79
|
+
export const declaration = (
|
|
80
|
+
input: { readonly tier: Action.Tier; readonly metadata?: FileBoundary | undefined }
|
|
81
|
+
): Declaration => {
|
|
82
|
+
if (input.tier !== "sealed") return { _tag: "Disabled", reason: "unsealed" }
|
|
83
|
+
if (input.metadata === undefined) return { _tag: "Disabled", reason: "missing-boundary" }
|
|
84
|
+
if (input.metadata.boundaryMode !== "hard") return { _tag: "Disabled", reason: "expected-boundary" }
|
|
85
|
+
if (input.metadata.readSet.some(FileSet.isGlob)) return { _tag: "Disabled", reason: "unresolved-read-glob" }
|
|
86
|
+
return { _tag: "Eligible", metadata: input.metadata }
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** Candidate reads are remeasured, so do not require a historical readSetVerified flag here.
|
|
90
|
+
* @category classifiers
|
|
91
|
+
* @since 1.0.0-rc.0
|
|
92
|
+
*/
|
|
93
|
+
export const candidate = <M extends Metadata>(meta: M | undefined): CandidateEvidence<M> | Refused => {
|
|
94
|
+
if (meta === undefined) return { _tag: "Refused", reason: "invalid-meta" }
|
|
95
|
+
// Legacy flags never override quarantine. Retain the durable outcome and
|
|
96
|
+
// the original metadata, but refuse to promote contradictory proof to reuse.
|
|
97
|
+
if (meta.boundaryQuarantined === true) {
|
|
98
|
+
return {
|
|
99
|
+
_tag: "Refused",
|
|
100
|
+
reason: meta.boundary !== undefined || meta.readSetVerified === true
|
|
101
|
+
? "contradictory-evidence"
|
|
102
|
+
: "quarantined-evidence"
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (meta.readSetVerified === true && meta.boundary === undefined) {
|
|
106
|
+
return { _tag: "Refused", reason: "contradictory-evidence" }
|
|
107
|
+
}
|
|
108
|
+
if (meta.tier !== "sealed") return { _tag: "Refused", reason: "unsealed-meta" }
|
|
109
|
+
const evidence = meta.boundary
|
|
110
|
+
if (evidence === undefined) return { _tag: "Refused", reason: "missing-evidence" }
|
|
111
|
+
if (evidence.deviation !== undefined) return { _tag: "Refused", reason: "deviation" }
|
|
112
|
+
if (evidence.wholeTreeWritesVerified !== true) return { _tag: "Refused", reason: "unverified-writes" }
|
|
113
|
+
if (evidence.hermeticReadsVerified !== true) return { _tag: "Refused", reason: "unverified-hermetic-reads" }
|
|
114
|
+
return { _tag: "CandidateEvidence", meta, evidence }
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** Publication additionally requires the read proof associated with the completed body.
|
|
118
|
+
* Both stored quarantine and the caller's current integrity verdict forbid publication.
|
|
119
|
+
* @category classifiers
|
|
120
|
+
* @since 1.0.0-rc.0
|
|
121
|
+
*/
|
|
122
|
+
export const completion = <M extends Metadata>(
|
|
123
|
+
declared: Declaration,
|
|
124
|
+
meta: M | undefined,
|
|
125
|
+
quarantined: boolean
|
|
126
|
+
): PublishCompletion<M> | Refused => {
|
|
127
|
+
if (quarantined) return { _tag: "Refused", reason: "quarantined-evidence" }
|
|
128
|
+
if (declared._tag === "Disabled") return { _tag: "Refused", reason: declared.reason }
|
|
129
|
+
const checked = candidate(meta)
|
|
130
|
+
if (checked._tag === "Refused") return checked
|
|
131
|
+
if (checked.meta.readSetVerified !== true) return { _tag: "Refused", reason: "unverified-recorded-reads" }
|
|
132
|
+
return { _tag: "PublishCompletion", meta: checked.meta }
|
|
133
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read-only validation of copied cache-age decisions. Producer identities and
|
|
3
|
+
* persisted payloads remain unchanged; ancestry alone is not a reuse proof.
|
|
4
|
+
* @since 1.0.0-rc.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { FlowEngine } from "@smthrs/engine"
|
|
8
|
+
import type { Journal, JournalEvent } from "@smthrs/journal"
|
|
9
|
+
import type { RunStore } from "@smthrs/run-store"
|
|
10
|
+
import * as Effect from "effect/Effect"
|
|
11
|
+
import { find, prove } from "./CopiedRecord.ts"
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Paged journal lookup shared with copied-record validation.
|
|
15
|
+
* @category accessors
|
|
16
|
+
* @since 1.0.0-rc.0
|
|
17
|
+
*/
|
|
18
|
+
export { find } from "./CopiedRecord.ts"
|
|
19
|
+
|
|
20
|
+
const fieldsEqual = (value: unknown, expected: unknown): boolean => {
|
|
21
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) return false
|
|
22
|
+
if (typeof expected !== "object" || expected === null || Array.isArray(expected)) return false
|
|
23
|
+
const record = value as Readonly<Record<string, unknown>>
|
|
24
|
+
const keys = Object.keys(expected)
|
|
25
|
+
return Object.keys(record).length === keys.length &&
|
|
26
|
+
keys.every((key) => record[key] === (expected as Readonly<Record<string, unknown>>)[key])
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** A copied verdict is usable only through an exact, retained fork prefix.
|
|
30
|
+
* Missing/compacted ancestry and malformed or unrelated history fail closed.
|
|
31
|
+
* @category accessors
|
|
32
|
+
* @since 1.0.0-rc.0
|
|
33
|
+
*/
|
|
34
|
+
export const copiedVerdict = (options: {
|
|
35
|
+
readonly journal: Journal.Service
|
|
36
|
+
readonly runs: RunStore.Service
|
|
37
|
+
readonly runId: string
|
|
38
|
+
readonly decision: JournalEvent.Input
|
|
39
|
+
readonly conflict: Journal.JournalError
|
|
40
|
+
}): Effect.Effect<"admitted" | "expired", Journal.JournalError> =>
|
|
41
|
+
Effect.gen(function*() {
|
|
42
|
+
const { journal, conflict, decision } = options
|
|
43
|
+
const source = (entry: JournalEvent.Entry) =>
|
|
44
|
+
entry.sourceId === decision.sourceId && entry.sourceSeq === decision.sourceSeq
|
|
45
|
+
const entry = yield* find(journal, options.runId, source)
|
|
46
|
+
if (entry === undefined) return yield* Effect.fail(conflict)
|
|
47
|
+
const payload = entry.payload as { readonly verdict?: unknown } | null
|
|
48
|
+
const verdict = payload?.verdict
|
|
49
|
+
if (verdict !== "admitted" && verdict !== "expired") return yield* Effect.fail(conflict)
|
|
50
|
+
const expected = { ...decision.payload as Readonly<Record<string, unknown>>, verdict }
|
|
51
|
+
if (entry.eventType !== decision.eventType || !fieldsEqual(entry.payload, expected)) {
|
|
52
|
+
return yield* Effect.fail(conflict)
|
|
53
|
+
}
|
|
54
|
+
const original = yield* prove({ ...options, entry, same: fieldsEqual })
|
|
55
|
+
return fieldsEqual(original.record.meta, { lineageId: FlowEngine.Lineage.root(original.ancestor) })
|
|
56
|
+
? verdict
|
|
57
|
+
: yield* Effect.fail(conflict)
|
|
58
|
+
})
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Incremental evidence for the no-TTL cache guard.
|
|
3
|
+
* @since 1.0.0-rc.0
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { Journal, JournalEvent } from "@smthrs/journal"
|
|
7
|
+
import * as Effect from "effect/Effect"
|
|
8
|
+
import * as Semaphore from "effect/Semaphore"
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Per-executor index of TTL markers in an append-only journal generation.
|
|
12
|
+
* Refresh before answering, retaining the first record for either its producer
|
|
13
|
+
* key or payload key so malformed and copied verdicts still refuse removal.
|
|
14
|
+
* @category constructors
|
|
15
|
+
* @since 1.0.0-rc.0
|
|
16
|
+
*/
|
|
17
|
+
export const make = (runId: string) => {
|
|
18
|
+
const gate = Semaphore.makeUnsafe(1)
|
|
19
|
+
const id = JournalEvent.RunId.make(runId)
|
|
20
|
+
let source: Journal.Service | undefined
|
|
21
|
+
let generation: number | undefined
|
|
22
|
+
let after: JournalEvent.Seq | undefined
|
|
23
|
+
const verdicts = new Map<string, JournalEvent.Entry>()
|
|
24
|
+
return (
|
|
25
|
+
journal: Journal.Service,
|
|
26
|
+
keyDigest: string
|
|
27
|
+
): Effect.Effect<JournalEvent.Entry | undefined, Journal.JournalError> =>
|
|
28
|
+
Semaphore.withPermit(gate)(Effect.gen(function*() {
|
|
29
|
+
const currentGeneration = journal.generation === undefined ? 0 : (yield* journal.generation(id)).generation
|
|
30
|
+
if (source !== journal || generation !== currentGeneration) {
|
|
31
|
+
source = journal
|
|
32
|
+
generation = currentGeneration
|
|
33
|
+
after = undefined
|
|
34
|
+
verdicts.clear()
|
|
35
|
+
}
|
|
36
|
+
while (true) {
|
|
37
|
+
const page = yield* journal.entries({ runId: id, limit: 128, ...after === undefined ? {} : { after } })
|
|
38
|
+
const next = page.entries.at(-1)?.seq
|
|
39
|
+
if (
|
|
40
|
+
(page.hasMore && next === undefined) ||
|
|
41
|
+
(next !== undefined && after !== undefined && next <= after)
|
|
42
|
+
) {
|
|
43
|
+
return yield* Effect.fail(
|
|
44
|
+
new Journal.JournalError({ code: "read_failed", message: "cache history cursor did not advance" })
|
|
45
|
+
)
|
|
46
|
+
}
|
|
47
|
+
for (const entry of page.entries) {
|
|
48
|
+
const producerKey = /^cache:([^:]+):ttl:/.exec(entry.sourceId)?.[1]
|
|
49
|
+
const payload = entry.payload as { action?: unknown; keyDigest?: unknown } | null
|
|
50
|
+
if (producerKey !== undefined && !verdicts.has(producerKey)) verdicts.set(producerKey, entry)
|
|
51
|
+
if (payload?.action === "ttl" && typeof payload.keyDigest === "string" && !verdicts.has(payload.keyDigest)) {
|
|
52
|
+
verdicts.set(payload.keyDigest, entry)
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Publish each fully processed page, including the final one. A read
|
|
56
|
+
// failure or interruption retries only the unvalidated suffix.
|
|
57
|
+
after = next ?? after
|
|
58
|
+
if (!page.hasMore) return verdicts.get(keyDigest)
|
|
59
|
+
}
|
|
60
|
+
}))
|
|
61
|
+
}
|