@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,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-check stored or newly measured observations against a verified plan.
|
|
3
|
+
* @since 1.0.0
|
|
4
|
+
*/
|
|
5
|
+
import { FileSet } from "@smthrs/plan";
|
|
6
|
+
import { Effect, Schema } from "effect";
|
|
7
|
+
import * as PlanInputStore from "../PlanInputStore.js";
|
|
8
|
+
/**
|
|
9
|
+
* Validates without publishing or mutating either the old pins or observations.
|
|
10
|
+
* @since 1.0.0
|
|
11
|
+
* @category validation
|
|
12
|
+
*/
|
|
13
|
+
export const validate = (snapshot, nodes, pinned, writerScopesBefore) => Effect.gen(function* () {
|
|
14
|
+
const corrupt = (message) => Effect.fail(new PlanInputStore.PlanInputError({ code: "corrupt_state", message }));
|
|
15
|
+
if (snapshot.nodes.length !== nodes.length)
|
|
16
|
+
return yield* corrupt("source observation node count changed");
|
|
17
|
+
const nextPins = new Map(pinned);
|
|
18
|
+
const newPins = new Set();
|
|
19
|
+
for (const pin of snapshot.pins) {
|
|
20
|
+
if (nextPins.has(pin.path))
|
|
21
|
+
return yield* corrupt("a later generation replaced an existing source pin");
|
|
22
|
+
nextPins.set(pin.path, pin.digest);
|
|
23
|
+
newPins.add(pin.path);
|
|
24
|
+
}
|
|
25
|
+
for (let index = 0; index < nodes.length; index++) {
|
|
26
|
+
const node = nodes[index];
|
|
27
|
+
const recorded = snapshot.nodes[index];
|
|
28
|
+
const reads = FileSet.expandReads(node.effects.reads);
|
|
29
|
+
const writerScopes = reads.length === 0 ? [] : writerScopesBefore(node);
|
|
30
|
+
if (recorded.id !== node.id || recorded.key !== node.key || recorded.reads.length !== reads.length) {
|
|
31
|
+
return yield* corrupt("source observation does not match its plan node");
|
|
32
|
+
}
|
|
33
|
+
for (let readIndex = 0; readIndex < reads.length; readIndex++) {
|
|
34
|
+
const expected = Schema.decodeUnknownSync(FileSet.ReadEntry)(reads[readIndex]);
|
|
35
|
+
const read = recorded.reads[readIndex];
|
|
36
|
+
if (JSON.stringify(read.entry) !== JSON.stringify(expected)) {
|
|
37
|
+
return yield* corrupt("source observation declaration changed");
|
|
38
|
+
}
|
|
39
|
+
if (typeof expected === "string") {
|
|
40
|
+
const source = !writerScopes.some((scope) => FileSet.overlaps(scope, expected));
|
|
41
|
+
if (read.sourcePaths.length !== (source ? 1 : 0)) {
|
|
42
|
+
return yield* corrupt("source observation selects the wrong file version");
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
for (const path of read.sourcePaths) {
|
|
46
|
+
if (!nextPins.has(path) || writerScopes.some((scope) => FileSet.overlaps(scope, path))) {
|
|
47
|
+
return yield* corrupt("source observation has a missing pin or preceding writer");
|
|
48
|
+
}
|
|
49
|
+
newPins.delete(path);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (newPins.size > 0)
|
|
54
|
+
return yield* corrupt("source observation contains unreferenced pins");
|
|
55
|
+
return nextPins;
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=PlanInputs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlanInputs.js","sourceRoot":"","sources":["../../../src/internal/PlanInputs.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Cross-check stored or newly measured observations against a verified plan.\n * @since 1.0.0\n */\n\nimport { FileSet, type Plan } from \"@smthrs/plan\"\nimport { Effect, Schema } from \"effect\"\nimport * as PlanInputStore from \"../PlanInputStore.ts\"\n\n/**\n * Validates without publishing or mutating either the old pins or observations.\n * @since 1.0.0\n * @category validation\n */\nexport const validate = (\n snapshot: PlanInputStore.Snapshot,\n nodes: ReadonlyArray<Plan.PlanNode>,\n pinned: ReadonlyMap<string, string>,\n writerScopesBefore: (node: Plan.PlanNode) => ReadonlyArray<FileSet.Entry>\n): Effect.Effect<Map<string, string>, PlanInputStore.PlanInputError> =>\n Effect.gen(function*() {\n const corrupt = (message: string) =>\n Effect.fail(new PlanInputStore.PlanInputError({ code: \"corrupt_state\", message }))\n if (snapshot.nodes.length !== nodes.length) return yield* corrupt(\"source observation node count changed\")\n const nextPins = new Map(pinned)\n const newPins = new Set<string>()\n for (const pin of snapshot.pins) {\n if (nextPins.has(pin.path)) return yield* corrupt(\"a later generation replaced an existing source pin\")\n nextPins.set(pin.path, pin.digest)\n newPins.add(pin.path)\n }\n for (let index = 0; index < nodes.length; index++) {\n const node = nodes[index]!\n const recorded = snapshot.nodes[index]!\n const reads = FileSet.expandReads(node.effects.reads)\n const writerScopes = reads.length === 0 ? [] : writerScopesBefore(node)\n if (recorded.id !== node.id || recorded.key !== node.key || recorded.reads.length !== reads.length) {\n return yield* corrupt(\"source observation does not match its plan node\")\n }\n for (let readIndex = 0; readIndex < reads.length; readIndex++) {\n const expected = Schema.decodeUnknownSync(FileSet.ReadEntry)(reads[readIndex]!)\n const read = recorded.reads[readIndex]!\n if (JSON.stringify(read.entry) !== JSON.stringify(expected)) {\n return yield* corrupt(\"source observation declaration changed\")\n }\n if (typeof expected === \"string\") {\n const source = !writerScopes.some((scope) => FileSet.overlaps(scope, expected))\n if (read.sourcePaths.length !== (source ? 1 : 0)) {\n return yield* corrupt(\"source observation selects the wrong file version\")\n }\n }\n for (const path of read.sourcePaths) {\n if (!nextPins.has(path) || writerScopes.some((scope) => FileSet.overlaps(scope, path))) {\n return yield* corrupt(\"source observation has a missing pin or preceding writer\")\n }\n newPins.delete(path)\n }\n }\n }\n if (newPins.size > 0) return yield* corrupt(\"source observation contains unreferenced pins\")\n return nextPins\n })\n"]}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/** Durable merge recovery and generated identity, independent of dispatch.
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import { Plan } from "@smthrs/plan";
|
|
5
|
+
import { Effect } from "effect";
|
|
6
|
+
import * as PlanMergeStore from "../PlanMergeStore.ts";
|
|
7
|
+
/** Chooses a free display ID; ownership comes from the durable decision, not this spelling.
|
|
8
|
+
* @since 1.0.0
|
|
9
|
+
* @category identity
|
|
10
|
+
*/
|
|
11
|
+
export declare const allocateId: (plan: Plan.Plan, nodeId: string) => string;
|
|
12
|
+
/** The single declaration used both when appending and when recovering an extension.
|
|
13
|
+
* @since 1.0.0
|
|
14
|
+
* @category constructors
|
|
15
|
+
*/
|
|
16
|
+
export declare const draft: (node: Plan.PlanNode, mergeId: string, winners: ReadonlyArray<string>) => Plan.NodeDraft;
|
|
17
|
+
/** Checks that an intent names a permissible stopped node and its actual conflict peers.
|
|
18
|
+
* @since 1.0.0
|
|
19
|
+
* @category validation
|
|
20
|
+
*/
|
|
21
|
+
export declare const validateIntent: (plan: Plan.Plan, intent: PlanMergeStore.Intent) => Effect.Effect<{
|
|
22
|
+
readonly id: string;
|
|
23
|
+
readonly kind: "step" | "agent" | "merge";
|
|
24
|
+
readonly key: string & import("effect/Brand").Brand<"@smthrs/keys/Key">;
|
|
25
|
+
readonly material: {
|
|
26
|
+
readonly kind: "sealed" | "compensable" | "irreversible";
|
|
27
|
+
readonly body: unknown;
|
|
28
|
+
readonly version: "flows/key-material/v2";
|
|
29
|
+
readonly layers: readonly string[];
|
|
30
|
+
readonly capabilities: readonly string[];
|
|
31
|
+
readonly inputs: readonly ({
|
|
32
|
+
readonly _tag: "Literal";
|
|
33
|
+
readonly value: unknown;
|
|
34
|
+
} | {
|
|
35
|
+
readonly _tag: "Ref";
|
|
36
|
+
readonly from: string;
|
|
37
|
+
readonly path: readonly string[];
|
|
38
|
+
} | {
|
|
39
|
+
readonly _tag: "Pending";
|
|
40
|
+
readonly from: string;
|
|
41
|
+
})[];
|
|
42
|
+
readonly effects?: unknown;
|
|
43
|
+
readonly nondeterministic?: true | undefined;
|
|
44
|
+
readonly placement?: unknown;
|
|
45
|
+
};
|
|
46
|
+
readonly effects: {
|
|
47
|
+
readonly boundaryMode: "expected" | "hard";
|
|
48
|
+
readonly reads: readonly (string | {
|
|
49
|
+
readonly _tag: "Glob";
|
|
50
|
+
readonly include: readonly [string, ...string[]];
|
|
51
|
+
readonly exclude?: readonly string[] | undefined;
|
|
52
|
+
} | {
|
|
53
|
+
readonly _tag: "Filegroup";
|
|
54
|
+
readonly name: string;
|
|
55
|
+
readonly entries: readonly (string | {
|
|
56
|
+
readonly _tag: "Glob";
|
|
57
|
+
readonly include: readonly [string, ...string[]];
|
|
58
|
+
readonly exclude?: readonly string[] | undefined;
|
|
59
|
+
})[];
|
|
60
|
+
})[];
|
|
61
|
+
readonly writes: readonly (string | {
|
|
62
|
+
readonly _tag: "Glob";
|
|
63
|
+
readonly include: readonly [string, ...string[]];
|
|
64
|
+
readonly exclude?: readonly string[] | undefined;
|
|
65
|
+
} | {
|
|
66
|
+
readonly _tag: "TreeArtifact";
|
|
67
|
+
readonly path: string;
|
|
68
|
+
} | {
|
|
69
|
+
readonly _tag: "Filegroup";
|
|
70
|
+
readonly name: string;
|
|
71
|
+
readonly entries: readonly (string | {
|
|
72
|
+
readonly _tag: "Glob";
|
|
73
|
+
readonly include: readonly [string, ...string[]];
|
|
74
|
+
readonly exclude?: readonly string[] | undefined;
|
|
75
|
+
} | {
|
|
76
|
+
readonly _tag: "TreeArtifact";
|
|
77
|
+
readonly path: string;
|
|
78
|
+
})[];
|
|
79
|
+
})[];
|
|
80
|
+
readonly removes?: readonly string[] | undefined;
|
|
81
|
+
};
|
|
82
|
+
readonly dependsOn: readonly string[];
|
|
83
|
+
readonly conflicts: readonly {
|
|
84
|
+
readonly with: string;
|
|
85
|
+
readonly paths: readonly string[];
|
|
86
|
+
readonly strategy: "serialize" | "lane" | "fail";
|
|
87
|
+
readonly runtime: "delay-rebase" | "stop-merge";
|
|
88
|
+
}[];
|
|
89
|
+
readonly strategy: "serialize" | "lane" | "fail";
|
|
90
|
+
readonly runtime: "delay-rebase" | "stop-merge";
|
|
91
|
+
readonly priority: number;
|
|
92
|
+
readonly generation: number;
|
|
93
|
+
}, PlanMergeStore.PlanMergeError, never>;
|
|
94
|
+
/** Recovers only recorded merge extensions, never unrelated/unapproved appended work.
|
|
95
|
+
* @since 1.0.0
|
|
96
|
+
* @category recovery
|
|
97
|
+
*/
|
|
98
|
+
export declare const recover: (candidate: Plan.Plan, decisions: ReadonlyArray<PlanMergeStore.Decision>) => Effect.Effect<{
|
|
99
|
+
readonly planId: string;
|
|
100
|
+
readonly flow: string;
|
|
101
|
+
readonly generation: number;
|
|
102
|
+
readonly baseDigest: string & import("effect/Brand").Brand<"@smthrs/keys/Key">;
|
|
103
|
+
readonly digest: string & import("effect/Brand").Brand<"@smthrs/keys/Key">;
|
|
104
|
+
readonly nodes: readonly {
|
|
105
|
+
readonly id: string;
|
|
106
|
+
readonly kind: "step" | "agent" | "merge";
|
|
107
|
+
readonly key: string & import("effect/Brand").Brand<"@smthrs/keys/Key">;
|
|
108
|
+
readonly material: {
|
|
109
|
+
readonly kind: "sealed" | "compensable" | "irreversible";
|
|
110
|
+
readonly body: unknown;
|
|
111
|
+
readonly version: "flows/key-material/v2";
|
|
112
|
+
readonly layers: readonly string[];
|
|
113
|
+
readonly capabilities: readonly string[];
|
|
114
|
+
readonly inputs: readonly ({
|
|
115
|
+
readonly _tag: "Literal";
|
|
116
|
+
readonly value: unknown;
|
|
117
|
+
} | {
|
|
118
|
+
readonly _tag: "Ref";
|
|
119
|
+
readonly from: string;
|
|
120
|
+
readonly path: readonly string[];
|
|
121
|
+
} | {
|
|
122
|
+
readonly _tag: "Pending";
|
|
123
|
+
readonly from: string;
|
|
124
|
+
})[];
|
|
125
|
+
readonly effects?: unknown;
|
|
126
|
+
readonly nondeterministic?: true | undefined;
|
|
127
|
+
readonly placement?: unknown;
|
|
128
|
+
};
|
|
129
|
+
readonly effects: {
|
|
130
|
+
readonly boundaryMode: "expected" | "hard";
|
|
131
|
+
readonly reads: readonly (string | {
|
|
132
|
+
readonly _tag: "Glob";
|
|
133
|
+
readonly include: readonly [string, ...string[]];
|
|
134
|
+
readonly exclude?: readonly string[] | undefined;
|
|
135
|
+
} | {
|
|
136
|
+
readonly _tag: "Filegroup";
|
|
137
|
+
readonly name: string;
|
|
138
|
+
readonly entries: readonly (string | {
|
|
139
|
+
readonly _tag: "Glob";
|
|
140
|
+
readonly include: readonly [string, ...string[]];
|
|
141
|
+
readonly exclude?: readonly string[] | undefined;
|
|
142
|
+
})[];
|
|
143
|
+
})[];
|
|
144
|
+
readonly writes: readonly (string | {
|
|
145
|
+
readonly _tag: "Glob";
|
|
146
|
+
readonly include: readonly [string, ...string[]];
|
|
147
|
+
readonly exclude?: readonly string[] | undefined;
|
|
148
|
+
} | {
|
|
149
|
+
readonly _tag: "TreeArtifact";
|
|
150
|
+
readonly path: string;
|
|
151
|
+
} | {
|
|
152
|
+
readonly _tag: "Filegroup";
|
|
153
|
+
readonly name: string;
|
|
154
|
+
readonly entries: readonly (string | {
|
|
155
|
+
readonly _tag: "Glob";
|
|
156
|
+
readonly include: readonly [string, ...string[]];
|
|
157
|
+
readonly exclude?: readonly string[] | undefined;
|
|
158
|
+
} | {
|
|
159
|
+
readonly _tag: "TreeArtifact";
|
|
160
|
+
readonly path: string;
|
|
161
|
+
})[];
|
|
162
|
+
})[];
|
|
163
|
+
readonly removes?: readonly string[] | undefined;
|
|
164
|
+
};
|
|
165
|
+
readonly dependsOn: readonly string[];
|
|
166
|
+
readonly conflicts: readonly {
|
|
167
|
+
readonly with: string;
|
|
168
|
+
readonly paths: readonly string[];
|
|
169
|
+
readonly strategy: "serialize" | "lane" | "fail";
|
|
170
|
+
readonly runtime: "delay-rebase" | "stop-merge";
|
|
171
|
+
}[];
|
|
172
|
+
readonly strategy: "serialize" | "lane" | "fail";
|
|
173
|
+
readonly runtime: "delay-rebase" | "stop-merge";
|
|
174
|
+
readonly priority: number;
|
|
175
|
+
readonly generation: number;
|
|
176
|
+
}[];
|
|
177
|
+
}, PlanMergeStore.PlanMergeError, import("effect/Crypto").Crypto>;
|
|
178
|
+
//# sourceMappingURL=PlanMerges.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlanMerges.d.ts","sourceRoot":"","sources":["../../../src/internal/PlanMerges.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAe,IAAI,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAA;AAQtD;;;GAGG;AACH,eAAO,MAAM,UAAU,GAAI,MAAM,IAAI,CAAC,IAAI,EAAE,QAAQ,MAAM,KAAG,MAM5D,CAAA;AACD;;;GAGG;AACH,eAAO,MAAM,KAAK,GAAI,MAAM,IAAI,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,SAAS,aAAa,CAAC,MAAM,CAAC,KAAG,IAAI,CAAC,SAYhG,CAAA;AACF;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,MAAM,IAAI,CAAC,IAAI,EAAE,QAAQ,cAAc,CAAC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wCAWzE,CAAA;AACJ;;;GAGG;AACH,eAAO,MAAM,OAAO,GAAI,WAAW,IAAI,CAAC,IAAI,EAAE,WAAW,aAAa,CAAC,cAAc,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iEA4D3F,CAAA"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/** Durable merge recovery and generated identity, independent of dispatch.
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import { KeyMaterial, Plan } from "@smthrs/plan";
|
|
5
|
+
import { Effect } from "effect";
|
|
6
|
+
import * as PlanMergeStore from "../PlanMergeStore.js";
|
|
7
|
+
const invalid = (message, cause) => new PlanMergeStore.PlanMergeError({
|
|
8
|
+
code: "corrupt_state",
|
|
9
|
+
message,
|
|
10
|
+
...(cause === undefined ? {} : { cause })
|
|
11
|
+
});
|
|
12
|
+
/** Chooses a free display ID; ownership comes from the durable decision, not this spelling.
|
|
13
|
+
* @since 1.0.0
|
|
14
|
+
* @category identity
|
|
15
|
+
*/
|
|
16
|
+
export const allocateId = (plan, nodeId) => {
|
|
17
|
+
const occupied = new Set(plan.nodes.map((node) => node.id));
|
|
18
|
+
const base = `${nodeId}+merge`;
|
|
19
|
+
let candidate = base;
|
|
20
|
+
for (let suffix = 1; occupied.has(candidate); suffix++)
|
|
21
|
+
candidate = `${base}#${suffix}`;
|
|
22
|
+
return candidate;
|
|
23
|
+
};
|
|
24
|
+
/** The single declaration used both when appending and when recovering an extension.
|
|
25
|
+
* @since 1.0.0
|
|
26
|
+
* @category constructors
|
|
27
|
+
*/
|
|
28
|
+
export const draft = (node, mergeId, winners) => ({
|
|
29
|
+
id: mergeId,
|
|
30
|
+
kind: "merge",
|
|
31
|
+
material: {
|
|
32
|
+
version: KeyMaterial.version,
|
|
33
|
+
kind: node.material.kind,
|
|
34
|
+
body: { merge: { stopped: node.id, winners } },
|
|
35
|
+
inputs: winners.map((id) => ({ _tag: "Pending", from: id })),
|
|
36
|
+
layers: [],
|
|
37
|
+
capabilities: []
|
|
38
|
+
},
|
|
39
|
+
effects: node.effects
|
|
40
|
+
});
|
|
41
|
+
/** Checks that an intent names a permissible stopped node and its actual conflict peers.
|
|
42
|
+
* @since 1.0.0
|
|
43
|
+
* @category validation
|
|
44
|
+
*/
|
|
45
|
+
export const validateIntent = (plan, intent) => Effect.gen(function* () {
|
|
46
|
+
const node = plan.nodes.find((candidate) => candidate.id === intent.nodeId);
|
|
47
|
+
if (node === undefined || node.key !== intent.nodeKey || node.material.kind === "irreversible" ||
|
|
48
|
+
(node.runtime !== "stop-merge" && !node.conflicts.some((conflict) => conflict.runtime === "stop-merge")) ||
|
|
49
|
+
intent.peers.some((id) => !node.conflicts.some((conflict) => conflict.with === id))) {
|
|
50
|
+
return yield* Effect.fail(invalid("merge intent does not match its approved stopped node"));
|
|
51
|
+
}
|
|
52
|
+
return node;
|
|
53
|
+
});
|
|
54
|
+
/** Recovers only recorded merge extensions, never unrelated/unapproved appended work.
|
|
55
|
+
* @since 1.0.0
|
|
56
|
+
* @category recovery
|
|
57
|
+
*/
|
|
58
|
+
export const recover = (candidate, decisions) => Effect.gen(function* () {
|
|
59
|
+
const byGeneration = new Map(decisions.flatMap((decision) => decision.completion === undefined ? [] : [[decision.completion.generation, decision]]));
|
|
60
|
+
let plan = candidate;
|
|
61
|
+
if (byGeneration.size > 0) {
|
|
62
|
+
// Rebuild each prefix once. Re-verifying every complete prefix separately
|
|
63
|
+
// would multiply the compiler's overlap work across a long merge history.
|
|
64
|
+
plan = yield* Plan.verify({
|
|
65
|
+
...candidate,
|
|
66
|
+
generation: 0,
|
|
67
|
+
digest: candidate.baseDigest,
|
|
68
|
+
nodes: candidate.nodes.filter((node) => node.generation === 0)
|
|
69
|
+
})
|
|
70
|
+
.pipe(Effect.mapError((cause) => invalid("merge recovery has an invalid approved base", cause)));
|
|
71
|
+
const last = Math.max(candidate.generation, ...byGeneration.keys());
|
|
72
|
+
if (last > Plan.maximumPlanNodes)
|
|
73
|
+
return yield* Effect.fail(invalid("merge generation exceeds the plan limit"));
|
|
74
|
+
for (let generation = 1; generation <= last; generation++) {
|
|
75
|
+
const decision = byGeneration.get(generation);
|
|
76
|
+
let drafts;
|
|
77
|
+
if (decision?.completion !== undefined) {
|
|
78
|
+
const stopped = yield* validateIntent(plan, decision.intent);
|
|
79
|
+
if (decision.completion.parentDigest !== plan.digest) {
|
|
80
|
+
return yield* Effect.fail(invalid("merge parent digest changed"));
|
|
81
|
+
}
|
|
82
|
+
drafts = [draft(stopped, decision.completion.mergeId, decision.completion.winners)];
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
drafts = candidate.nodes.filter((node) => node.generation === generation).map((node) => ({
|
|
86
|
+
id: node.id,
|
|
87
|
+
kind: node.kind,
|
|
88
|
+
material: node.material,
|
|
89
|
+
effects: node.effects,
|
|
90
|
+
priority: node.priority,
|
|
91
|
+
conflictStrategy: node.strategy,
|
|
92
|
+
runtimeStrategy: node.runtime
|
|
93
|
+
}));
|
|
94
|
+
if (drafts.length === 0) {
|
|
95
|
+
return yield* Effect.fail(invalid("merge recovery requires the approved intervening plan generations"));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
plan = yield* Plan.append(plan, drafts).pipe(Effect.mapError((cause) => invalid("stored merge extension cannot be reconstructed", cause)));
|
|
99
|
+
if (decision?.completion !== undefined &&
|
|
100
|
+
(plan.digest !== decision.completion.planDigest ||
|
|
101
|
+
Plan.generationNodes(plan)[0].key !== decision.completion.mergeKey)) {
|
|
102
|
+
return yield* Effect.fail(invalid("merge decision does not identify its generated node"));
|
|
103
|
+
}
|
|
104
|
+
if (generation === candidate.generation && plan.digest !== candidate.digest) {
|
|
105
|
+
return yield* Effect.fail(invalid("merge decisions disagree with the supplied plan"));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
for (const decision of decisions)
|
|
110
|
+
yield* validateIntent(plan, decision.intent);
|
|
111
|
+
return plan;
|
|
112
|
+
});
|
|
113
|
+
//# sourceMappingURL=PlanMerges.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlanMerges.js","sourceRoot":"","sources":["../../../src/internal/PlanMerges.ts"],"names":[],"mappings":"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","sourcesContent":["/** Durable merge recovery and generated identity, independent of dispatch.\n * @since 1.0.0\n */\n\nimport { KeyMaterial, Plan } from \"@smthrs/plan\"\nimport { Effect } from \"effect\"\nimport * as PlanMergeStore from \"../PlanMergeStore.ts\"\n\nconst invalid = (message: string, cause?: unknown) =>\n new PlanMergeStore.PlanMergeError({\n code: \"corrupt_state\",\n message,\n ...(cause === undefined ? {} : { cause })\n })\n/** Chooses a free display ID; ownership comes from the durable decision, not this spelling.\n * @since 1.0.0\n * @category identity\n */\nexport const allocateId = (plan: Plan.Plan, nodeId: string): string => {\n const occupied = new Set(plan.nodes.map((node) => node.id))\n const base = `${nodeId}+merge`\n let candidate = base\n for (let suffix = 1; occupied.has(candidate); suffix++) candidate = `${base}#${suffix}`\n return candidate\n}\n/** The single declaration used both when appending and when recovering an extension.\n * @since 1.0.0\n * @category constructors\n */\nexport const draft = (node: Plan.PlanNode, mergeId: string, winners: ReadonlyArray<string>): Plan.NodeDraft => ({\n id: mergeId,\n kind: \"merge\",\n material: {\n version: KeyMaterial.version,\n kind: node.material.kind,\n body: { merge: { stopped: node.id, winners } },\n inputs: winners.map((id) => ({ _tag: \"Pending\", from: id })),\n layers: [],\n capabilities: []\n },\n effects: node.effects\n})\n/** Checks that an intent names a permissible stopped node and its actual conflict peers.\n * @since 1.0.0\n * @category validation\n */\nexport const validateIntent = (plan: Plan.Plan, intent: PlanMergeStore.Intent) =>\n Effect.gen(function*() {\n const node = plan.nodes.find((candidate) => candidate.id === intent.nodeId)\n if (\n node === undefined || node.key !== intent.nodeKey || node.material.kind === \"irreversible\" ||\n (node.runtime !== \"stop-merge\" && !node.conflicts.some((conflict) => conflict.runtime === \"stop-merge\")) ||\n intent.peers.some((id) => !node.conflicts.some((conflict) => conflict.with === id))\n ) {\n return yield* Effect.fail(invalid(\"merge intent does not match its approved stopped node\"))\n }\n return node\n })\n/** Recovers only recorded merge extensions, never unrelated/unapproved appended work.\n * @since 1.0.0\n * @category recovery\n */\nexport const recover = (candidate: Plan.Plan, decisions: ReadonlyArray<PlanMergeStore.Decision>) =>\n Effect.gen(function*() {\n const byGeneration = new Map(\n decisions.flatMap((decision) =>\n decision.completion === undefined ? [] : [[decision.completion.generation, decision] as const]\n )\n )\n let plan = candidate\n if (byGeneration.size > 0) {\n // Rebuild each prefix once. Re-verifying every complete prefix separately\n // would multiply the compiler's overlap work across a long merge history.\n plan = yield* Plan.verify({\n ...candidate,\n generation: 0,\n digest: candidate.baseDigest,\n nodes: candidate.nodes.filter((node) => node.generation === 0)\n })\n .pipe(Effect.mapError((cause) => invalid(\"merge recovery has an invalid approved base\", cause)))\n const last = Math.max(candidate.generation, ...byGeneration.keys())\n if (last > Plan.maximumPlanNodes) return yield* Effect.fail(invalid(\"merge generation exceeds the plan limit\"))\n for (let generation = 1; generation <= last; generation++) {\n const decision = byGeneration.get(generation)\n let drafts: ReadonlyArray<Plan.NodeDraft>\n if (decision?.completion !== undefined) {\n const stopped = yield* validateIntent(plan, decision.intent)\n if (decision.completion.parentDigest !== plan.digest) {\n return yield* Effect.fail(invalid(\"merge parent digest changed\"))\n }\n drafts = [draft(stopped, decision.completion.mergeId, decision.completion.winners)]\n } else {\n drafts = candidate.nodes.filter((node) => node.generation === generation).map((node) => ({\n id: node.id,\n kind: node.kind,\n material: node.material,\n effects: node.effects,\n priority: node.priority,\n conflictStrategy: node.strategy,\n runtimeStrategy: node.runtime\n }))\n if (drafts.length === 0) {\n return yield* Effect.fail(invalid(\"merge recovery requires the approved intervening plan generations\"))\n }\n }\n plan = yield* Plan.append(plan, drafts).pipe(\n Effect.mapError((cause) => invalid(\"stored merge extension cannot be reconstructed\", cause))\n )\n if (\n decision?.completion !== undefined &&\n (plan.digest !== decision.completion.planDigest ||\n Plan.generationNodes(plan)[0]!.key !== decision.completion.mergeKey)\n ) {\n return yield* Effect.fail(invalid(\"merge decision does not identify its generated node\"))\n }\n if (generation === candidate.generation && plan.digest !== candidate.digest) {\n return yield* Effect.fail(invalid(\"merge decisions disagree with the supplied plan\"))\n }\n }\n }\n for (const decision of decisions) yield* validateIntent(plan, decision.intent)\n return plan\n })\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read-only validation of the cache-provenance record occupying a producer
|
|
3
|
+
* slot this run re-emits into.
|
|
4
|
+
*
|
|
5
|
+
* A provenance producer identity (`cache:<digest>:<action>[:<run>:<seq>]`,
|
|
6
|
+
* `sourceSeq` 0) names ONE fact about one cache row — this key expired, this
|
|
7
|
+
* row was served, this replay failed — so a re-emission after a resume or in
|
|
8
|
+
* a fork child records the same fact with fresh measurements (`ageMs`, the
|
|
9
|
+
* clock, a later `reason`) and collapses onto the row already there. That
|
|
10
|
+
* collapse is legitimate only while the occupying record IS that fact: the
|
|
11
|
+
* same event type, the same key, the same action, and the same recorded row
|
|
12
|
+
* when the record names one. Anything else in the slot is the conflict the
|
|
13
|
+
* journal reported.
|
|
14
|
+
* @since 1.0.0-rc.0
|
|
15
|
+
*/
|
|
16
|
+
import type { Journal, JournalEvent } from "@smthrs/journal";
|
|
17
|
+
import * as Effect from "effect/Effect";
|
|
18
|
+
/**
|
|
19
|
+
* Accepts the occupying record only when it states the same provenance fact
|
|
20
|
+
* as `record`; otherwise fails with `conflict`.
|
|
21
|
+
* @category accessors
|
|
22
|
+
* @since 1.0.0-rc.0
|
|
23
|
+
*/
|
|
24
|
+
export declare const accept: (options: {
|
|
25
|
+
readonly journal: Journal.Service;
|
|
26
|
+
readonly runId: string;
|
|
27
|
+
readonly record: JournalEvent.Input;
|
|
28
|
+
readonly conflict: Journal.JournalError;
|
|
29
|
+
}) => Effect.Effect<void, Journal.JournalError>;
|
|
30
|
+
//# sourceMappingURL=ProvenanceSlot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProvenanceSlot.d.ts","sourceRoot":"","sources":["../../../src/internal/ProvenanceSlot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC5D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAQvC;;;;;GAKG;AACH,eAAO,MAAM,MAAM,GAAI,SAAS;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAA;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,CAAA;IACnC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAA;CACxC,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,YAAY,CAexC,CAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read-only validation of the cache-provenance record occupying a producer
|
|
3
|
+
* slot this run re-emits into.
|
|
4
|
+
*
|
|
5
|
+
* A provenance producer identity (`cache:<digest>:<action>[:<run>:<seq>]`,
|
|
6
|
+
* `sourceSeq` 0) names ONE fact about one cache row — this key expired, this
|
|
7
|
+
* row was served, this replay failed — so a re-emission after a resume or in
|
|
8
|
+
* a fork child records the same fact with fresh measurements (`ageMs`, the
|
|
9
|
+
* clock, a later `reason`) and collapses onto the row already there. That
|
|
10
|
+
* collapse is legitimate only while the occupying record IS that fact: the
|
|
11
|
+
* same event type, the same key, the same action, and the same recorded row
|
|
12
|
+
* when the record names one. Anything else in the slot is the conflict the
|
|
13
|
+
* journal reported.
|
|
14
|
+
* @since 1.0.0-rc.0
|
|
15
|
+
*/
|
|
16
|
+
import * as Effect from "effect/Effect";
|
|
17
|
+
import * as CacheAgeHistory from "./CacheAgeHistory.js";
|
|
18
|
+
const identity = ["keyDigest", "action", "recordedRunId", "recordedEventSeq"];
|
|
19
|
+
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
20
|
+
/**
|
|
21
|
+
* Accepts the occupying record only when it states the same provenance fact
|
|
22
|
+
* as `record`; otherwise fails with `conflict`.
|
|
23
|
+
* @category accessors
|
|
24
|
+
* @since 1.0.0-rc.0
|
|
25
|
+
*/
|
|
26
|
+
export const accept = (options) => Effect.gen(function* () {
|
|
27
|
+
const { conflict, journal, record } = options;
|
|
28
|
+
const sourceSeq = record.sourceSeq ?? 0;
|
|
29
|
+
const entry = yield* CacheAgeHistory.find(journal, options.runId, (candidate) => candidate.sourceId === record.sourceId && Number(candidate.sourceSeq) === Number(sourceSeq));
|
|
30
|
+
if (entry === undefined || entry.eventType !== record.eventType)
|
|
31
|
+
return yield* Effect.fail(conflict);
|
|
32
|
+
const attempted = record.payload;
|
|
33
|
+
const occupying = entry.payload;
|
|
34
|
+
if (!isRecord(attempted) || !isRecord(occupying))
|
|
35
|
+
return yield* Effect.fail(conflict);
|
|
36
|
+
const same = identity.every((field) => !(field in attempted) || attempted[field] === occupying[field]);
|
|
37
|
+
return same ? undefined : yield* Effect.fail(conflict);
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=ProvenanceSlot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProvenanceSlot.js","sourceRoot":"","sources":["../../../src/internal/ProvenanceSlot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAA;AAEvD,MAAM,QAAQ,GAAG,CAAC,WAAW,EAAE,QAAQ,EAAE,eAAe,EAAE,kBAAkB,CAAU,CAAA;AAEtF,MAAM,QAAQ,GAAG,CAAC,KAAc,EAA8C,EAAE,CAC9E,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAEtE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,OAKtB,EAA6C,EAAE,CAC9C,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IAC7C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,CAAA;IACvC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,eAAe,CAAC,IAAI,CACvC,OAAO,EACP,OAAO,CAAC,KAAK,EACb,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC,SAAS,CAAC,CAC3G,CAAA;IACD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACpG,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAA;IAChC,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAA;IAC/B,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACrF,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,SAAS,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;IACtG,OAAO,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;AACxD,CAAC,CAAC,CAAA","sourcesContent":["/**\n * Read-only validation of the cache-provenance record occupying a producer\n * slot this run re-emits into.\n *\n * A provenance producer identity (`cache:<digest>:<action>[:<run>:<seq>]`,\n * `sourceSeq` 0) names ONE fact about one cache row — this key expired, this\n * row was served, this replay failed — so a re-emission after a resume or in\n * a fork child records the same fact with fresh measurements (`ageMs`, the\n * clock, a later `reason`) and collapses onto the row already there. That\n * collapse is legitimate only while the occupying record IS that fact: the\n * same event type, the same key, the same action, and the same recorded row\n * when the record names one. Anything else in the slot is the conflict the\n * journal reported.\n * @since 1.0.0-rc.0\n */\n\nimport type { Journal, JournalEvent } from \"@smthrs/journal\"\nimport * as Effect from \"effect/Effect\"\nimport * as CacheAgeHistory from \"./CacheAgeHistory.ts\"\n\nconst identity = [\"keyDigest\", \"action\", \"recordedRunId\", \"recordedEventSeq\"] as const\n\nconst isRecord = (value: unknown): value is Readonly<Record<string, unknown>> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n\n/**\n * Accepts the occupying record only when it states the same provenance fact\n * as `record`; otherwise fails with `conflict`.\n * @category accessors\n * @since 1.0.0-rc.0\n */\nexport const accept = (options: {\n readonly journal: Journal.Service\n readonly runId: string\n readonly record: JournalEvent.Input\n readonly conflict: Journal.JournalError\n}): Effect.Effect<void, Journal.JournalError> =>\n Effect.gen(function*() {\n const { conflict, journal, record } = options\n const sourceSeq = record.sourceSeq ?? 0\n const entry = yield* CacheAgeHistory.find(\n journal,\n options.runId,\n (candidate) => candidate.sourceId === record.sourceId && Number(candidate.sourceSeq) === Number(sourceSeq)\n )\n if (entry === undefined || entry.eventType !== record.eventType) return yield* Effect.fail(conflict)\n const attempted = record.payload\n const occupying = entry.payload\n if (!isRecord(attempted) || !isRecord(occupying)) return yield* Effect.fail(conflict)\n const same = identity.every((field) => !(field in attempted) || attempted[field] === occupying[field])\n return same ? undefined : yield* Effect.fail(conflict)\n })\n"]}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A typed JSON settlement at the engine persistence boundary. The existing
|
|
3
|
+
* terminal fallback remains the encoder, so a rejected class cannot leave a
|
|
4
|
+
* run live. This module does not change existing result bytes or writers.
|
|
5
|
+
*
|
|
6
|
+
* @since 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
import type { Flow } from "@smthrs/flow";
|
|
9
|
+
import * as EngineEvent from "@smthrs/journal/EngineEvent";
|
|
10
|
+
import * as Effect from "effect/Effect";
|
|
11
|
+
import * as Schema from "effect/Schema";
|
|
12
|
+
/**
|
|
13
|
+
* Encoded success or a classified failure.
|
|
14
|
+
*
|
|
15
|
+
* @category schemas
|
|
16
|
+
* @since 1.0.0
|
|
17
|
+
*/
|
|
18
|
+
export declare const ResultEnvelope: Schema.Union<readonly [Schema.TaggedStruct<"Success", {
|
|
19
|
+
readonly value: Schema.Codec<Schema.Json, Schema.Json, never, never>;
|
|
20
|
+
}>, Schema.TaggedStruct<"Failure", {
|
|
21
|
+
readonly reason: Schema.Literals<readonly ["error", "defect", "interrupted", "encoding"]>;
|
|
22
|
+
readonly detail: Schema.Codec<Schema.Json, Schema.Json, never, never>;
|
|
23
|
+
}>]>;
|
|
24
|
+
/**
|
|
25
|
+
* Encoded success or a classified failure.
|
|
26
|
+
*
|
|
27
|
+
* @category models
|
|
28
|
+
* @since 1.0.0
|
|
29
|
+
*/
|
|
30
|
+
export type ResultEnvelope = EngineEvent.ResultEnvelope;
|
|
31
|
+
/**
|
|
32
|
+
* Validate untrusted encoded state without dropping contradictory fields.
|
|
33
|
+
*
|
|
34
|
+
* @category decoders
|
|
35
|
+
* @since 1.0.0
|
|
36
|
+
*/
|
|
37
|
+
export declare const decode: (input: unknown) => Effect.Effect<{
|
|
38
|
+
readonly _tag: "Success";
|
|
39
|
+
readonly value: Schema.Json;
|
|
40
|
+
} | {
|
|
41
|
+
readonly _tag: "Failure";
|
|
42
|
+
readonly reason: "error" | "encoding" | "defect" | "interrupted";
|
|
43
|
+
readonly detail: Schema.Json;
|
|
44
|
+
}, EngineEvent.EventError, never>;
|
|
45
|
+
/**
|
|
46
|
+
* The encoded settlement and whether the existing encoder required terminal
|
|
47
|
+
* fallback. Encoded domain failure is still an Encoded settlement; callers
|
|
48
|
+
* read its exit, never infer domain success from this discriminant.
|
|
49
|
+
*
|
|
50
|
+
* @category schemas
|
|
51
|
+
* @since 1.0.0
|
|
52
|
+
*/
|
|
53
|
+
export declare const Settlement: Schema.Union<readonly [Schema.TaggedStruct<"Encoded", {
|
|
54
|
+
readonly value: Schema.Codec<Schema.Json, Schema.Json, never, never>;
|
|
55
|
+
}>, Schema.TaggedStruct<"EncodingFailure", {
|
|
56
|
+
readonly value: Schema.Codec<Schema.Json, Schema.Json, never, never>;
|
|
57
|
+
readonly note: Schema.String;
|
|
58
|
+
}>]>;
|
|
59
|
+
/**
|
|
60
|
+
* Encoded terminal settlement and its encoding-failure status.
|
|
61
|
+
*
|
|
62
|
+
* @category models
|
|
63
|
+
* @since 1.0.0
|
|
64
|
+
*/
|
|
65
|
+
export type Settlement = typeof Settlement.Type;
|
|
66
|
+
/**
|
|
67
|
+
* Admit an encoded settlement without introducing an error channel on the
|
|
68
|
+
* terminal write path. A corrupt codec output becomes a terminal failure.
|
|
69
|
+
*
|
|
70
|
+
* @category decoders
|
|
71
|
+
* @since 1.0.0
|
|
72
|
+
*/
|
|
73
|
+
export declare const fromEncoded: (encoded: unknown, note?: string) => Effect.Effect<Settlement>;
|
|
74
|
+
/**
|
|
75
|
+
* Wrap the established no-fail terminal encoder without changing its bytes.
|
|
76
|
+
*
|
|
77
|
+
* @category conversions
|
|
78
|
+
* @since 1.0.0
|
|
79
|
+
*/
|
|
80
|
+
export declare const encode: (flow: Flow.Any, result: Flow.Result<unknown, unknown>) => Effect.Effect<{
|
|
81
|
+
readonly _tag: "Encoded";
|
|
82
|
+
readonly value: Schema.Json;
|
|
83
|
+
} | {
|
|
84
|
+
readonly _tag: "EncodingFailure";
|
|
85
|
+
readonly value: Schema.Json;
|
|
86
|
+
readonly note: string;
|
|
87
|
+
}, never, never>;
|
|
88
|
+
//# sourceMappingURL=ResultEnvelope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResultEnvelope.d.ts","sourceRoot":"","sources":["../../../src/internal/ResultEnvelope.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,KAAK,WAAW,MAAM,6BAA6B,CAAA;AAE1D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC;;;;;GAKG;AACH,eAAO,MAAM,cAAc;;;;;IAA6B,CAAA;AACxD;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC,cAAc,CAAA;AACvD;;;;;GAKG;AACH,eAAO,MAAM,MAAM,GAAI,OAAO,OAAO;;;;;;;iCAWlC,CAAA;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU;;;;;IAGrB,CAAA;AACF;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,IAAI,CAAA;AAE/C;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GAAI,SAAS,OAAO,EAAE,OAAO,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CA+BnF,CAAA;AAEH;;;;;GAKG;AACH,eAAO,MAAM,MAAM,GAAI,MAAM,IAAI,CAAC,GAAG,EAAE,QAAQ,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC;;;;;;;gBAGzE,CAAA"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A typed JSON settlement at the engine persistence boundary. The existing
|
|
3
|
+
* terminal fallback remains the encoder, so a rejected class cannot leave a
|
|
4
|
+
* run live. This module does not change existing result bytes or writers.
|
|
5
|
+
*
|
|
6
|
+
* @since 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
import * as EngineEvent from "@smthrs/journal/EngineEvent";
|
|
9
|
+
import * as Cause from "effect/Cause";
|
|
10
|
+
import * as Effect from "effect/Effect";
|
|
11
|
+
import * as Schema from "effect/Schema";
|
|
12
|
+
import * as ExitEncoding from "./ExitEncoding.js";
|
|
13
|
+
/**
|
|
14
|
+
* Encoded success or a classified failure.
|
|
15
|
+
*
|
|
16
|
+
* @category schemas
|
|
17
|
+
* @since 1.0.0
|
|
18
|
+
*/
|
|
19
|
+
export const ResultEnvelope = EngineEvent.ResultEnvelope;
|
|
20
|
+
/**
|
|
21
|
+
* Validate untrusted encoded state without dropping contradictory fields.
|
|
22
|
+
*
|
|
23
|
+
* @category decoders
|
|
24
|
+
* @since 1.0.0
|
|
25
|
+
*/
|
|
26
|
+
export const decode = (input) => Effect.suspend(() => Schema.decodeUnknownEffect(ResultEnvelope, { onExcessProperty: "error" })(input)).pipe(Effect.catchCause((cause) => Effect.fail(new EngineEvent.EventError({
|
|
27
|
+
code: "malformed",
|
|
28
|
+
message: "invalid result envelope",
|
|
29
|
+
cause: Cause.squash(cause)
|
|
30
|
+
}))));
|
|
31
|
+
/**
|
|
32
|
+
* The encoded settlement and whether the existing encoder required terminal
|
|
33
|
+
* fallback. Encoded domain failure is still an Encoded settlement; callers
|
|
34
|
+
* read its exit, never infer domain success from this discriminant.
|
|
35
|
+
*
|
|
36
|
+
* @category schemas
|
|
37
|
+
* @since 1.0.0
|
|
38
|
+
*/
|
|
39
|
+
export const Settlement = Schema.Union([
|
|
40
|
+
Schema.TaggedStruct("Encoded", { value: Schema.Json }),
|
|
41
|
+
Schema.TaggedStruct("EncodingFailure", { value: Schema.Json, note: Schema.String })
|
|
42
|
+
]);
|
|
43
|
+
/**
|
|
44
|
+
* Admit an encoded settlement without introducing an error channel on the
|
|
45
|
+
* terminal write path. A corrupt codec output becomes a terminal failure.
|
|
46
|
+
*
|
|
47
|
+
* @category decoders
|
|
48
|
+
* @since 1.0.0
|
|
49
|
+
*/
|
|
50
|
+
export const fromEncoded = (encoded, note) => Effect.suspend(() => Schema.decodeUnknownEffect(Schema.Json)(encoded)).pipe(Effect.map((value) => note === undefined ? { _tag: "Encoded", value } : { _tag: "EncodingFailure", value, note }), Effect.catchCause((_cause) => {
|
|
51
|
+
const note = "the encoded settlement was not JSON";
|
|
52
|
+
// This is the same terminal-only policy as ExitEncoding.encode: record
|
|
53
|
+
// a failed settlement even when pure codec validation defects. No I/O
|
|
54
|
+
// or authority decision is retried by recovering this validation cause.
|
|
55
|
+
return Effect.as(Effect.logWarning(`${note}; preserving a terminal failure`), {
|
|
56
|
+
_tag: "EncodingFailure",
|
|
57
|
+
note,
|
|
58
|
+
value: {
|
|
59
|
+
_tag: "Complete",
|
|
60
|
+
exit: {
|
|
61
|
+
_tag: "Failure",
|
|
62
|
+
cause: [{
|
|
63
|
+
_tag: "Die",
|
|
64
|
+
defect: {
|
|
65
|
+
_tag: ExitEncoding.projectionTag,
|
|
66
|
+
result: "Complete",
|
|
67
|
+
note,
|
|
68
|
+
reasons: [],
|
|
69
|
+
value: null
|
|
70
|
+
}
|
|
71
|
+
}]
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}));
|
|
76
|
+
/**
|
|
77
|
+
* Wrap the established no-fail terminal encoder without changing its bytes.
|
|
78
|
+
*
|
|
79
|
+
* @category conversions
|
|
80
|
+
* @since 1.0.0
|
|
81
|
+
*/
|
|
82
|
+
export const encode = (flow, result) => ExitEncoding.encode(flow, result).pipe(Effect.flatMap(({ encoded, note }) => fromEncoded(encoded, note)));
|
|
83
|
+
//# sourceMappingURL=ResultEnvelope.js.map
|