@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,183 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var ArtifactGc_exports = {};
|
|
30
|
+
__export(ArtifactGc_exports, {
|
|
31
|
+
ArtifactGc: () => ArtifactGc,
|
|
32
|
+
ArtifactGcError: () => ArtifactGcError,
|
|
33
|
+
ArtifactGcErrorCode: () => ArtifactGcErrorCode,
|
|
34
|
+
ArtifactGcPolicy: () => ArtifactGcPolicy,
|
|
35
|
+
defaultGraceMs: () => defaultGraceMs,
|
|
36
|
+
layer: () => layer,
|
|
37
|
+
layerFileSystem: () => layerFileSystem,
|
|
38
|
+
layerPolicy: () => layerPolicy,
|
|
39
|
+
make: () => make
|
|
40
|
+
});
|
|
41
|
+
module.exports = __toCommonJS(ArtifactGc_exports);
|
|
42
|
+
var ArtifactSweep = __toESM(require("@smthrs/artifacts/ArtifactSweep"), 1);
|
|
43
|
+
var Clock = __toESM(require("effect/Clock"), 1);
|
|
44
|
+
var Context = __toESM(require("effect/Context"), 1);
|
|
45
|
+
var Effect = __toESM(require("effect/Effect"), 1);
|
|
46
|
+
var Layer = __toESM(require("effect/Layer"), 1);
|
|
47
|
+
var Option = __toESM(require("effect/Option"), 1);
|
|
48
|
+
var Schema = __toESM(require("effect/Schema"), 1);
|
|
49
|
+
var SqlClient = __toESM(require("effect/unstable/sql/SqlClient"), 1);
|
|
50
|
+
var ArtifactRoots = __toESM(require("./internal/ArtifactRoots.js"), 1);
|
|
51
|
+
const ArtifactGcErrorCode = Schema.Literals(["invalid_options", "mark_failed", "sweep_failed"]);
|
|
52
|
+
class ArtifactGcError extends Schema.TaggedError()(
|
|
53
|
+
"@smthrs/engine-store/ArtifactGcError",
|
|
54
|
+
{
|
|
55
|
+
code: ArtifactGcErrorCode,
|
|
56
|
+
message: Schema.String,
|
|
57
|
+
cause: Schema.optional(Schema.Unknown)
|
|
58
|
+
}
|
|
59
|
+
) {
|
|
60
|
+
}
|
|
61
|
+
class ArtifactGcPolicy extends Context.Service()(
|
|
62
|
+
"@smthrs/engine-store/ArtifactGcPolicy"
|
|
63
|
+
) {
|
|
64
|
+
}
|
|
65
|
+
const layerPolicy = (policy) => Layer.succeed(ArtifactGcPolicy)(policy);
|
|
66
|
+
class ArtifactGc extends Context.Service()("@smthrs/engine-store/ArtifactGc") {
|
|
67
|
+
}
|
|
68
|
+
const defaultGraceMs = 14 * 24 * 60 * 60 * 1e3;
|
|
69
|
+
const markFailed = (message, cause) => new ArtifactGcError({ code: "mark_failed", message, cause });
|
|
70
|
+
const sweepFailed = (message, cause) => new ArtifactGcError({ code: "sweep_failed", message, cause });
|
|
71
|
+
const invalidOptions = (message) => new ArtifactGcError({ code: "invalid_options", message });
|
|
72
|
+
const rootDigests = (table, metaJson) => ArtifactRoots.rootDigests(table, metaJson).pipe(
|
|
73
|
+
Effect.mapError((cause) => markFailed(cause.message, cause.cause))
|
|
74
|
+
);
|
|
75
|
+
const checkpointDigests = (checkpointJson) => ArtifactRoots.checkpointDigests(checkpointJson).pipe(
|
|
76
|
+
Effect.mapError((cause) => markFailed(cause.message, cause.cause))
|
|
77
|
+
);
|
|
78
|
+
const make = (options = {}) => Effect.gen(function* () {
|
|
79
|
+
const sql = yield* Effect.service(SqlClient.SqlClient);
|
|
80
|
+
const sweeper = yield* ArtifactSweep.ArtifactSweep;
|
|
81
|
+
const policy = yield* Effect.serviceOption(ArtifactGcPolicy);
|
|
82
|
+
const pageSize = options.pageSize ?? 500;
|
|
83
|
+
const markCacheEntries = (live) => Effect.gen(function* () {
|
|
84
|
+
let after = "";
|
|
85
|
+
for (; ; ) {
|
|
86
|
+
const rows = yield* sql`
|
|
87
|
+
SELECT key_digest, meta_json FROM flows_step_cache
|
|
88
|
+
WHERE key_digest > ${after}
|
|
89
|
+
ORDER BY key_digest
|
|
90
|
+
LIMIT ${pageSize}
|
|
91
|
+
`.pipe(Effect.mapError((cause) => markFailed("the step cache could not be scanned", cause)));
|
|
92
|
+
for (const row of rows) {
|
|
93
|
+
for (const digest of yield* rootDigests("flows_step_cache", row.meta_json)) {
|
|
94
|
+
live.add(digest);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (rows.length < pageSize) return;
|
|
98
|
+
after = rows[rows.length - 1].key_digest;
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
const markAttempts = (live) => Effect.gen(function* () {
|
|
102
|
+
let after = { runId: "", stepKeyDigest: "", attempt: -1 };
|
|
103
|
+
for (; ; ) {
|
|
104
|
+
const rows = yield* sql`
|
|
105
|
+
SELECT run_id, step_key_digest, attempt, checkpoint_json, meta_json FROM flows_attempts
|
|
106
|
+
WHERE (run_id, step_key_digest, attempt) > (${after.runId}, ${after.stepKeyDigest}, ${after.attempt})
|
|
107
|
+
ORDER BY run_id, step_key_digest, attempt
|
|
108
|
+
LIMIT ${pageSize}
|
|
109
|
+
`.pipe(Effect.mapError((cause) => markFailed("the attempt table could not be scanned", cause)));
|
|
110
|
+
for (const row of rows) {
|
|
111
|
+
for (const digest of yield* rootDigests("flows_attempts", row.meta_json)) {
|
|
112
|
+
live.add(digest);
|
|
113
|
+
}
|
|
114
|
+
for (const digest of yield* checkpointDigests(row.checkpoint_json)) {
|
|
115
|
+
live.add(digest);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if (rows.length < pageSize) return;
|
|
119
|
+
const last = rows[rows.length - 1];
|
|
120
|
+
after = { runId: last.run_id, stepKeyDigest: last.step_key_digest, attempt: last.attempt };
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
const gc = Effect.fn("ArtifactGc.gc")(
|
|
124
|
+
(gcOptions) => Effect.gen(function* () {
|
|
125
|
+
if (!Number.isSafeInteger(pageSize) || pageSize < 1) {
|
|
126
|
+
return yield* Effect.fail(invalidOptions("artifact GC pageSize must be a positive safe integer"));
|
|
127
|
+
}
|
|
128
|
+
const grace = gcOptions?.graceMs ?? (Option.isSome(policy) ? policy.value.graceMs : void 0) ?? defaultGraceMs;
|
|
129
|
+
if (!Number.isSafeInteger(grace) || grace < 0) {
|
|
130
|
+
return yield* Effect.fail(invalidOptions("artifact GC graceMs must be a non-negative safe integer"));
|
|
131
|
+
}
|
|
132
|
+
const startedAtMs = yield* Clock.currentTimeMillis.pipe(Effect.map(Math.floor));
|
|
133
|
+
const bound = startedAtMs - grace;
|
|
134
|
+
const live = new Set(gcOptions?.pins ?? []);
|
|
135
|
+
if (Option.isSome(policy) && policy.value.pins !== void 0) {
|
|
136
|
+
for (const digest of yield* policy.value.pins) live.add(digest);
|
|
137
|
+
}
|
|
138
|
+
yield* markCacheEntries(live);
|
|
139
|
+
yield* markAttempts(live);
|
|
140
|
+
const blobs = yield* sweeper.inventory.pipe(
|
|
141
|
+
Effect.mapError((cause) => sweepFailed(`the blob inventory refused: ${cause.message}`, cause))
|
|
142
|
+
);
|
|
143
|
+
const swept = [];
|
|
144
|
+
let reclaimedBytes = 0;
|
|
145
|
+
let keptByGrace = 0;
|
|
146
|
+
for (const blob of blobs) {
|
|
147
|
+
if (live.has(blob.digest)) continue;
|
|
148
|
+
if (blob.modifiedAtMs >= bound) {
|
|
149
|
+
keptByGrace++;
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
if (gcOptions?.dryRun === true) {
|
|
153
|
+
swept.push(blob.digest);
|
|
154
|
+
reclaimedBytes += blob.sizeBytes;
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
const removed = yield* sweeper.remove(blob.digest, { ifUnmodifiedSinceMs: bound - 1 }).pipe(
|
|
158
|
+
Effect.mapError((cause) => sweepFailed(`sweeping ${blob.digest} refused: ${cause.message}`, cause))
|
|
159
|
+
);
|
|
160
|
+
if (removed) {
|
|
161
|
+
swept.push(blob.digest);
|
|
162
|
+
reclaimedBytes += blob.sizeBytes;
|
|
163
|
+
} else {
|
|
164
|
+
keptByGrace++;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return {
|
|
168
|
+
scannedBlobs: blobs.length,
|
|
169
|
+
liveDigests: live.size,
|
|
170
|
+
sweptDigests: swept,
|
|
171
|
+
reclaimedBytes,
|
|
172
|
+
keptByGrace,
|
|
173
|
+
dryRun: gcOptions?.dryRun === true
|
|
174
|
+
};
|
|
175
|
+
})
|
|
176
|
+
);
|
|
177
|
+
return { gc };
|
|
178
|
+
});
|
|
179
|
+
const layer = (options = {}) => Layer.effect(ArtifactGc)(make(options));
|
|
180
|
+
const layerFileSystem = (options = {}) => layer(options).pipe(
|
|
181
|
+
Layer.provide(ArtifactSweep.layerFileSystem({ directory: options.directory, coordination: options.coordination }))
|
|
182
|
+
);
|
|
183
|
+
//# sourceMappingURL=ArtifactGc.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/ArtifactGc.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Mark/sweep garbage collection for the content-addressed artifact store.\n *\n * The artifact tier is the one store in the composition with true *garbage*:\n * every output over the inline bound is spilled to `.flows/objects` by digest\n * (`StepBoundary`), nothing ever deletes a published blob, and a blob whose\n * every referencing row is gone is unreachable forever. The step cache is\n * deliberately NOT collected here \u2014 its rows are the *roots* of this graph,\n * they never become unreachable, and removing one is the policy decision\n * `CacheStore.evict` already serves.\n *\n * The design combines the two prior arts on the shelf:\n *\n * - **Reachability from durable roots** \u2014 git's `git gc` marks from refs;\n * Skyframe deletes what a keyed graph walk cannot reach. Here the roots are\n * every attempt row of every existing (never-deleted) run and every step\n * cache entry; each carries boundary evidence, and\n * `StepBoundary.referencedDigests` names the blobs that evidence needs.\n * Attempt checkpoints are roots too: they are opaque executable state, so\n * the mark keeps digest-shaped strings found in their JSON.\n * - **A grace period over mtime** \u2014 git refuses to prune unreachable objects\n * younger than `gc.pruneExpire` (two weeks), jj keeps operations newer than\n * its keep bound, and Bazel's disk-cache collector\n * (`reference/bazel/.../remote/disk/DiskCacheGarbageCollector.java`) fences\n * on mtime. The cutoff is the collection start time minus the grace period,\n * sampled before resolving policy pins or scanning roots and held fixed\n * through inventory and deletion. Only mtimes strictly before it are\n * eligible: a blob published \u2014 or freshened by a dedupe `put` \u2014 at or after\n * collection start survives, including same-millisecond writes at zero\n * grace, no lock required.\n *\n * Collection NEVER runs automatically. `gc()` is an explicit verb because\n * deletion is irreversible, and a human approving a plan must approve the\n * deletions too. The opt-in {@link ArtifactGcPolicy} layer\n * configures *how* an invocation collects (grace bound, pinned digests); it\n * does not schedule anything.\n *\n * @since 0.1.0\n */\n\nimport * as ArtifactSweep from \"@smthrs/artifacts/ArtifactSweep\"\nimport * as Clock from \"effect/Clock\"\nimport * as Context from \"effect/Context\"\nimport * as Effect from \"effect/Effect\"\nimport type * as FileSystem from \"effect/FileSystem\"\nimport * as Layer from \"effect/Layer\"\nimport * as Option from \"effect/Option\"\nimport * as Schema from \"effect/Schema\"\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\"\nimport * as ArtifactRoots from \"./internal/ArtifactRoots.ts\"\n\n/**\n * Stable error codes returned by artifact garbage collection.\n *\n * @category models\n * @since 0.1.0\n */\nexport const ArtifactGcErrorCode = Schema.Literals([\"invalid_options\", \"mark_failed\", \"sweep_failed\"])\n\n/**\n * Stable error codes returned by artifact garbage collection.\n *\n * @category models\n * @since 0.1.0\n */\nexport type ArtifactGcErrorCode = typeof ArtifactGcErrorCode.Type\n\n/**\n * A collection that could not complete. `mark_failed` means the live set\n * could not be computed \u2014 nothing was deleted. `sweep_failed` means the live\n * set held but a deletion refused; everything already swept was garbage, so a\n * re-run converges from wherever the failure stopped it.\n *\n * @category errors\n * @since 0.1.0\n */\nexport class ArtifactGcError extends Schema.TaggedError<ArtifactGcError>()(\n \"@smthrs/engine-store/ArtifactGcError\",\n {\n code: ArtifactGcErrorCode,\n message: Schema.String,\n cause: Schema.optional(Schema.Unknown)\n }\n) {}\n\n/**\n * The opt-in collection policy. Explicit {@link GcOptions} on a `gc()` call\n * override the installed policy; the policy overrides the defaults.\n *\n * @category models\n * @since 0.1.0\n */\nexport interface Policy {\n /** Grace bound applied when a `gc()` call does not name one. */\n readonly graceMs?: number | undefined\n /**\n * Digests held live regardless of reachability \u2014 the seam for references\n * this composition's tables cannot see (an external index, an export a\n * human wants kept). Resolved fresh on every collection.\n */\n readonly pins?: Effect.Effect<ReadonlyArray<string>> | undefined\n}\n\n/**\n * Service tag for the opt-in collection policy.\n *\n * @category services\n * @since 0.1.0\n */\nexport class ArtifactGcPolicy extends Context.Service<ArtifactGcPolicy, Policy>()(\n \"@smthrs/engine-store/ArtifactGcPolicy\"\n) {}\n\n/**\n * Installs a collection policy.\n *\n * @category layers\n * @since 0.1.0\n */\nexport const layerPolicy = (policy: Policy): Layer.Layer<ArtifactGcPolicy> => Layer.succeed(ArtifactGcPolicy)(policy)\n\n/**\n * Options for one explicit collection.\n *\n * @category models\n * @since 0.1.0\n */\nexport interface GcOptions {\n /**\n * How recently a blob must have been written or freshened to survive\n * unreferenced. Defaults to the installed {@link ArtifactGcPolicy}'s bound,\n * then to {@link defaultGraceMs}.\n */\n readonly graceMs?: number | undefined\n /** Digests held live for this collection, unioned with the policy's pins. */\n readonly pins?: ReadonlyArray<string> | undefined\n /** Compute and report without deleting anything. */\n readonly dryRun?: boolean | undefined\n}\n\n/**\n * What one collection did.\n *\n * @category models\n * @since 0.1.0\n */\nexport interface GcReport {\n /** Blobs the inventory enumerated. */\n readonly scannedBlobs: number\n /** Distinct digests the mark phase proved live, pins included. */\n readonly liveDigests: number\n /** Digests deleted \u2014 or, under `dryRun`, the ones a real run would delete. */\n readonly sweptDigests: ReadonlyArray<string>\n /** Bytes the swept blobs held. */\n readonly reclaimedBytes: number\n /** Unreferenced blobs retained by the grace bound or a freshen race. */\n readonly keptByGrace: number\n readonly dryRun: boolean\n}\n\n/**\n * Explicit artifact garbage collection.\n *\n * @category models\n * @since 0.1.0\n */\nexport interface Service {\n /**\n * Marks the live set from the durable roots, then sweeps every blob that\n * is both outside it and older than the grace bound. Explicit only \u2014\n * nothing in the engine composition ever calls this.\n */\n readonly gc: (options?: GcOptions) => Effect.Effect<GcReport, ArtifactGcError>\n}\n\n/**\n * Service tag for artifact garbage collection.\n *\n * @category services\n * @since 0.1.0\n */\nexport class ArtifactGc extends Context.Service<ArtifactGc, Service>()(\"@smthrs/engine-store/ArtifactGc\") {}\n\n/**\n * Two weeks, git's `gc.pruneExpire` default. The bound is deliberately far\n * beyond any live attempt's duration: a blob spilled by a running step is\n * unreferenced until its attempt row finishes, and the grace period is the\n * only thing protecting it in that window.\n *\n * @category constants\n * @since 0.1.0\n */\nexport const defaultGraceMs = 14 * 24 * 60 * 60 * 1000\n\n/**\n * Construction options.\n *\n * @category models\n * @since 0.1.0\n */\nexport interface MakeOptions {\n /** Rows per mark-phase page. Defaults to 500. */\n readonly pageSize?: number | undefined\n}\n\nconst markFailed = (message: string, cause: unknown): ArtifactGcError =>\n new ArtifactGcError({ code: \"mark_failed\", message, cause })\n\nconst sweepFailed = (message: string, cause: unknown): ArtifactGcError =>\n new ArtifactGcError({ code: \"sweep_failed\", message, cause })\n\nconst invalidOptions = (message: string): ArtifactGcError => new ArtifactGcError({ code: \"invalid_options\", message })\n\n/**\n * Extracts the digests one root row keeps live, FAIL-SAFE: a row whose\n * metadata carries a `boundary` this build cannot decode aborts the\n * collection rather than contributing nothing. Silently reading such a row as\n * \"references no artifacts\" is exactly how a live blob gets collected; a\n * metadata shape with no `boundary` key at all is the ordinary\n * foreign-evidence case `referencedDigests` already defines as empty.\n */\nconst rootDigests = (table: string, metaJson: string): Effect.Effect<ReadonlyArray<string>, ArtifactGcError> =>\n ArtifactRoots.rootDigests(table, metaJson).pipe(\n Effect.mapError((cause) => markFailed(cause.message, cause.cause))\n )\n\nconst checkpointDigests = (checkpointJson: string | null): Effect.Effect<ReadonlyArray<string>, ArtifactGcError> =>\n ArtifactRoots.checkpointDigests(checkpointJson).pipe(\n Effect.mapError((cause) => markFailed(cause.message, cause.cause))\n )\n\n/**\n * Builds the collector over the composition's own durable tables and the\n * host-local sweep surface.\n *\n * The mark phase reads `flows_step_cache` and `flows_attempts` directly, the\n * same way `DurableEngineState` range-scans `flows_runs`: this package\n * composes every one of those migrations, so the schema is its own. Every run\n * present in `flows_runs` is a live root \u2014 there is no deleted state, and the\n * attempt table's foreign key guarantees each attempt's run exists \u2014 so the\n * scan is simply *all* attempt rows plus *all* cache entries, paged by\n * primary key so no page holds more than `pageSize` rows in memory.\n *\n * Ordering is the safety argument. The live set is computed BEFORE the\n * inventory, so a root recorded during the sweep can only be missed, never\n * half-seen \u2014 and the blob such a root references is protected anyway: a\n * fresh publication carries a fresh mtime, a re-publication of existing bytes\n * freshens the blob's mtime (`ArtifactStore.put`), and the sweep's deletion\n * is fenced on that mtime (`ArtifactSweep.remove`'s `ifUnmodifiedSinceMs`).\n * A crash mid-sweep deletes some garbage and no live blobs; re-running\n * converges.\n *\n * @category constructors\n * @since 0.1.0\n */\nexport const make = (\n options: MakeOptions = {}\n): Effect.Effect<Service, never, SqlClient.SqlClient | ArtifactSweep.ArtifactSweep> =>\n Effect.gen(function*() {\n const sql = yield* Effect.service(SqlClient.SqlClient)\n const sweeper = yield* ArtifactSweep.ArtifactSweep\n const policy = yield* Effect.serviceOption(ArtifactGcPolicy)\n const pageSize = options.pageSize ?? 500\n\n const markCacheEntries = (live: Set<string>) =>\n Effect.gen(function*() {\n let after = \"\"\n for (;;) {\n const rows = yield* sql<{ readonly key_digest: string; readonly meta_json: string }>`\n SELECT key_digest, meta_json FROM flows_step_cache\n WHERE key_digest > ${after}\n ORDER BY key_digest\n LIMIT ${pageSize}\n `.pipe(Effect.mapError((cause) => markFailed(\"the step cache could not be scanned\", cause)))\n for (const row of rows) {\n for (const digest of yield* rootDigests(\"flows_step_cache\", row.meta_json)) {\n live.add(digest)\n }\n }\n if (rows.length < pageSize) return\n after = rows[rows.length - 1]!.key_digest\n }\n })\n\n const markAttempts = (live: Set<string>) =>\n Effect.gen(function*() {\n let after = { runId: \"\", stepKeyDigest: \"\", attempt: -1 }\n for (;;) {\n const rows = yield* sql<{\n readonly run_id: string\n readonly step_key_digest: string\n readonly attempt: number\n readonly checkpoint_json: string | null\n readonly meta_json: string\n }>`\n SELECT run_id, step_key_digest, attempt, checkpoint_json, meta_json FROM flows_attempts\n WHERE (run_id, step_key_digest, attempt) > (${after.runId}, ${after.stepKeyDigest}, ${after.attempt})\n ORDER BY run_id, step_key_digest, attempt\n LIMIT ${pageSize}\n `.pipe(Effect.mapError((cause) => markFailed(\"the attempt table could not be scanned\", cause)))\n for (const row of rows) {\n for (const digest of yield* rootDigests(\"flows_attempts\", row.meta_json)) {\n live.add(digest)\n }\n for (const digest of yield* checkpointDigests(row.checkpoint_json)) {\n live.add(digest)\n }\n }\n if (rows.length < pageSize) return\n const last = rows[rows.length - 1]!\n after = { runId: last.run_id, stepKeyDigest: last.step_key_digest, attempt: last.attempt }\n }\n })\n\n const gc: Service[\"gc\"] = Effect.fn(\"ArtifactGc.gc\")((gcOptions) =>\n Effect.gen(function*() {\n if (!Number.isSafeInteger(pageSize) || pageSize < 1) {\n return yield* Effect.fail(invalidOptions(\"artifact GC pageSize must be a positive safe integer\"))\n }\n const grace = gcOptions?.graceMs ??\n (Option.isSome(policy) ? policy.value.graceMs : undefined) ??\n defaultGraceMs\n if (!Number.isSafeInteger(grace) || grace < 0) {\n return yield* Effect.fail(invalidOptions(\"artifact GC graceMs must be a non-negative safe integer\"))\n }\n const startedAtMs = yield* Clock.currentTimeMillis.pipe(Effect.map(Math.floor))\n const bound = startedAtMs - grace\n const live = new Set<string>(gcOptions?.pins ?? [])\n if (Option.isSome(policy) && policy.value.pins !== undefined) {\n for (const digest of yield* policy.value.pins) live.add(digest)\n }\n yield* markCacheEntries(live)\n yield* markAttempts(live)\n const blobs = yield* sweeper.inventory.pipe(\n Effect.mapError((cause) => sweepFailed(`the blob inventory refused: ${cause.message}`, cause))\n )\n const swept: Array<string> = []\n let reclaimedBytes = 0\n let keptByGrace = 0\n for (const blob of blobs) {\n if (live.has(blob.digest)) continue\n if (blob.modifiedAtMs >= bound) {\n keptByGrace++\n continue\n }\n if (gcOptions?.dryRun === true) {\n swept.push(blob.digest)\n reclaimedBytes += blob.sizeBytes\n continue\n }\n // The fence re-reads the blob's age inside the deletion: an\n // unreferenced-at-mark blob a concurrent `put` freshened since the\n // inventory fails the fence and is retained, exactly as a fresher\n // cache row survives a laggard's fenced evict (issue #119).\n // remove's fence is inclusive; mtimes have millisecond resolution,\n // so exclude cutoff equality there just as in the inventory check.\n const removed = yield* sweeper.remove(blob.digest, { ifUnmodifiedSinceMs: bound - 1 }).pipe(\n Effect.mapError((cause) => sweepFailed(`sweeping ${blob.digest} refused: ${cause.message}`, cause))\n )\n if (removed) {\n swept.push(blob.digest)\n reclaimedBytes += blob.sizeBytes\n } else {\n keptByGrace++\n }\n }\n return {\n scannedBlobs: blobs.length,\n liveDigests: live.size,\n sweptDigests: swept,\n reclaimedBytes,\n keptByGrace,\n dryRun: gcOptions?.dryRun === true\n }\n })\n )\n\n return { gc }\n })\n\n/**\n * Provides the artifact garbage collector. Install {@link layerPolicy} into\n * this layer's inputs to configure collection; nothing schedules `gc()` \u2014\n * invoking it stays an explicit caller decision.\n *\n * @category layers\n * @since 0.1.0\n */\nexport const layer = (\n options: MakeOptions = {}\n): Layer.Layer<ArtifactGc, never, SqlClient.SqlClient | ArtifactSweep.ArtifactSweep> =>\n Layer.effect(ArtifactGc)(make(options))\n\n/**\n * Provides the artifact garbage collector over a filesystem objects directory:\n * {@link layer} with `ArtifactSweep.layerFileSystem` beneath it. Pass the same\n * `directory` and `coordination` the paired `ArtifactStore.layerFileSystem`\n * publishes with.\n *\n * @category layers\n * @since 1.0.0\n */\nexport const layerFileSystem = (\n options: MakeOptions & ArtifactSweep.SweepOptions = {}\n): Layer.Layer<ArtifactGc, never, SqlClient.SqlClient | FileSystem.FileSystem> =>\n layer(options).pipe(\n Layer.provide(ArtifactSweep.layerFileSystem({ directory: options.directory, coordination: options.coordination }))\n )\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The two-tier artifact protocol the step cache rides on: publish before the
|
|
3
|
+
* entry, fetch on demand after it.
|
|
4
|
+
*
|
|
5
|
+
* This is the seam that makes a shared cache safe. A cache entry references
|
|
6
|
+
* its large outputs by digest, so an entry that becomes observable while one
|
|
7
|
+
* of those artifacts is still missing hands the next machine a hit it cannot
|
|
8
|
+
* materialize. Bazel states the constraint at
|
|
9
|
+
* `reference/bazel/.../remote/UploadManifest.java:630-633` — "action results
|
|
10
|
+
* may fail to validate server-side if they are accessed before all blobs they
|
|
11
|
+
* refer to are present" — and enforces it by ordering:
|
|
12
|
+
* `findMissingDigests` → upload the missing → upload the `ActionResult` LAST.
|
|
13
|
+
* {@link Service.publish} is that ordering, and `ActionPersistence` calls it
|
|
14
|
+
* before `CacheStore.put`.
|
|
15
|
+
*
|
|
16
|
+
* The read direction is the same protocol in reverse, and how eagerly it runs
|
|
17
|
+
* is the {@link DownloadPolicy}, declared on the shared tier itself
|
|
18
|
+
* (`RemoteArtifacts.Options.downloadPolicy`) and split across two seams.
|
|
19
|
+
* `all` fetches every referenced artifact into this host's store while
|
|
20
|
+
* admitting the replay. `toplevel` and `minimal` fetch nothing here: one
|
|
21
|
+
* batched probe establishes that the shared tier can serve them and the
|
|
22
|
+
* transfer is left to the first read through `CombinedArtifacts`, which then
|
|
23
|
+
* writes the blob back under `toplevel` and does not under `minimal`. This is
|
|
24
|
+
* Bazel's `RemoteOutputChecker` dial
|
|
25
|
+
* (`--remote_download_{all,toplevel,minimal}`) split the way our two seams
|
|
26
|
+
* split: what a replay prefetches is this module's decision, what a read
|
|
27
|
+
* materializes is the combined store's.
|
|
28
|
+
*
|
|
29
|
+
* Governing design: `packages/smithers/flows/artifacts/docs/api.md`.
|
|
30
|
+
*
|
|
31
|
+
* @since 0.1.0
|
|
32
|
+
*/
|
|
33
|
+
import * as ArtifactStore from "@smthrs/artifacts/ArtifactStore";
|
|
34
|
+
import * as RemoteArtifacts from "@smthrs/artifacts/RemoteArtifacts";
|
|
35
|
+
import * as Context from "effect/Context";
|
|
36
|
+
import type * as Crypto from "effect/Crypto";
|
|
37
|
+
import * as Effect from "effect/Effect";
|
|
38
|
+
import * as Layer from "effect/Layer";
|
|
39
|
+
import * as Schema from "effect/Schema";
|
|
40
|
+
declare const ArtifactPublicationFailed_base: Schema.Class<ArtifactPublicationFailed, Schema.TaggedStruct<"@smthrs/engine-store/ArtifactPublicationFailed", {
|
|
41
|
+
readonly code: Schema.Literal<"artifact_publication_failed">;
|
|
42
|
+
readonly digests: Schema.$Array<Schema.String>;
|
|
43
|
+
readonly message: Schema.String;
|
|
44
|
+
readonly cause: Schema.optional<Schema.Union<readonly [typeof ArtifactStore.ArtifactStoreError, typeof ArtifactStore.ArtifactMissing, typeof ArtifactStore.ArtifactCorruption]>>;
|
|
45
|
+
}>, import("effect/Cause").YieldableError>;
|
|
46
|
+
/**
|
|
47
|
+
* A referenced artifact could not be made durable in the shared tier, so the
|
|
48
|
+
* cache entry that references it must not be published.
|
|
49
|
+
*
|
|
50
|
+
* Failing here is the point: silently publishing the entry anyway is exactly
|
|
51
|
+
* the state the REAPI ordering constraint exists to prevent.
|
|
52
|
+
*
|
|
53
|
+
* @since 0.1.0
|
|
54
|
+
* @category errors
|
|
55
|
+
*/
|
|
56
|
+
export declare class ArtifactPublicationFailed extends ArtifactPublicationFailed_base {
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* How eagerly a replay materializes the artifacts it references.
|
|
60
|
+
*
|
|
61
|
+
* `all` downloads every referenced artifact into this host's local store while
|
|
62
|
+
* the replay is admitted, so every later read is local and a shared tier that
|
|
63
|
+
* goes down afterwards costs nothing. `minimal` downloads none of them: it
|
|
64
|
+
* establishes that each digest is resolvable — locally, or from the shared tier
|
|
65
|
+
* — and lets the first actual read fetch the bytes.
|
|
66
|
+
*
|
|
67
|
+
* `minimal` is only sound when the store the replay reads through can reach the
|
|
68
|
+
* shared tier, which means `CombinedArtifacts` with the same remote tier. Under
|
|
69
|
+
* a purely local `ArtifactStore` an admitted `minimal` replay would later read
|
|
70
|
+
* an artifact this host never fetched.
|
|
71
|
+
*
|
|
72
|
+
* @since 0.1.0
|
|
73
|
+
* @category models
|
|
74
|
+
*/
|
|
75
|
+
export type DownloadPolicy = RemoteArtifacts.DownloadPolicy;
|
|
76
|
+
/**
|
|
77
|
+
* The two directions of the artifact protocol: {@link Service.publish} before a
|
|
78
|
+
* cache entry becomes observable, {@link Service.hydrate} when a replay needs
|
|
79
|
+
* bytes this host does not have.
|
|
80
|
+
*
|
|
81
|
+
* The asymmetry in their error types is the design: publishing may fail,
|
|
82
|
+
* because publishing an entry whose artifacts are missing is the unsafe state;
|
|
83
|
+
* hydrating never fails, because a shared tier that is down should cost a run
|
|
84
|
+
* a cache hit, not the run itself.
|
|
85
|
+
*
|
|
86
|
+
* @since 0.1.0
|
|
87
|
+
* @category services
|
|
88
|
+
*/
|
|
89
|
+
export interface Service {
|
|
90
|
+
/**
|
|
91
|
+
* Makes every digest durable in the shared tier, in REAPI order:
|
|
92
|
+
* `findMissing`, upload what is missing, then confirm nothing is missing
|
|
93
|
+
* any more. Returns only once the shared tier can serve all of them.
|
|
94
|
+
*/
|
|
95
|
+
readonly publish: (digests: ReadonlyArray<string>) => Effect.Effect<void, ArtifactPublicationFailed, Crypto.Crypto>;
|
|
96
|
+
/**
|
|
97
|
+
* Fetches the digests this host is missing from the shared tier and writes
|
|
98
|
+
* them into the local store, reporting whether every digest is now locally
|
|
99
|
+
* resolvable.
|
|
100
|
+
*
|
|
101
|
+
* Best-effort by construction: `false` means "replay still cannot be
|
|
102
|
+
* satisfied", which the caller turns into a real execution. A shared tier
|
|
103
|
+
* that is down must never fail a run that can simply do the work.
|
|
104
|
+
*/
|
|
105
|
+
readonly hydrate: (digests: ReadonlyArray<string>) => Effect.Effect<boolean, never, Crypto.Crypto>;
|
|
106
|
+
}
|
|
107
|
+
declare const ArtifactSync_base: Context.ServiceClass<ArtifactSync, "@smthrs/engine-store/ArtifactSync", Service>;
|
|
108
|
+
/**
|
|
109
|
+
* Service tag for the two-tier artifact protocol.
|
|
110
|
+
*
|
|
111
|
+
* @since 0.1.0
|
|
112
|
+
* @category services
|
|
113
|
+
*/
|
|
114
|
+
export declare class ArtifactSync extends ArtifactSync_base {
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* The single-tier implementation: there is no shared artifact store, so there
|
|
118
|
+
* is nothing to publish and nothing to fetch.
|
|
119
|
+
*
|
|
120
|
+
* This is the default `ActionPersistence` falls back to when the tag is
|
|
121
|
+
* absent, which is what keeps a purely local composition free of any
|
|
122
|
+
* remote-cache machinery.
|
|
123
|
+
*
|
|
124
|
+
* @since 0.1.0
|
|
125
|
+
* @category constructors
|
|
126
|
+
*/
|
|
127
|
+
export declare const makeLocal: () => Service;
|
|
128
|
+
/**
|
|
129
|
+
* Provides the single-tier (no shared artifact store) protocol.
|
|
130
|
+
*
|
|
131
|
+
* @since 0.1.0
|
|
132
|
+
* @category layers
|
|
133
|
+
*/
|
|
134
|
+
export declare const layerLocal: Layer.Layer<ArtifactSync>;
|
|
135
|
+
/**
|
|
136
|
+
* Builds the two-tier protocol over a local and a shared artifact store.
|
|
137
|
+
*
|
|
138
|
+
* @since 0.1.0
|
|
139
|
+
* @category constructors
|
|
140
|
+
*/
|
|
141
|
+
export declare const make: (options: {
|
|
142
|
+
readonly local: ArtifactStore.Service;
|
|
143
|
+
readonly remote: ArtifactStore.Service;
|
|
144
|
+
/**
|
|
145
|
+
* Defaults to the policy the shared tier declares, and to `all` for a tier
|
|
146
|
+
* that declares none: every referenced artifact is fetched at hydrate.
|
|
147
|
+
*/
|
|
148
|
+
readonly downloadPolicy?: DownloadPolicy | undefined;
|
|
149
|
+
}) => Service;
|
|
150
|
+
/**
|
|
151
|
+
* Provides the two-tier protocol, taking the local store from the
|
|
152
|
+
* `ArtifactStore` tag and the shared store from the supplied effect.
|
|
153
|
+
*
|
|
154
|
+
* The two tiers cannot both be layers: they inhabit the same tag, so composing
|
|
155
|
+
* them would shadow one with the other.
|
|
156
|
+
*
|
|
157
|
+
* @since 0.1.0
|
|
158
|
+
* @category layers
|
|
159
|
+
*/
|
|
160
|
+
export declare const layer: <E, R>(remote: Effect.Effect<ArtifactStore.Service, E, R>, options?: {
|
|
161
|
+
readonly downloadPolicy?: DownloadPolicy | undefined;
|
|
162
|
+
} | undefined) => Layer.Layer<ArtifactSync, E, ArtifactStore.ArtifactStore | R>;
|
|
163
|
+
export {};
|
|
164
|
+
//# sourceMappingURL=ArtifactSync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArtifactSync.d.ts","sourceRoot":"","sources":["../../src/ArtifactSync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,aAAa,MAAM,iCAAiC,CAAA;AAChE,OAAO,KAAK,eAAe,MAAM,mCAAmC,CAAA;AACpE,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;;;;;;;AAEvC;;;;;;;;;GASG;AACH,qBAAa,yBAA0B,SAAQ,8BAc9C;CAAG;AAEJ;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,cAAc,GAAG,eAAe,CAAC,cAAc,CAAA;AAE3D;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,OAAO;IACtB;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,CAChB,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,yBAAyB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IAClE;;;;;;;;OAQG;IACH,QAAQ,CAAC,OAAO,EAAE,CAChB,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;CAClD;;AAED;;;;;GAKG;AACH,qBAAa,YAAa,SAAQ,iBAA6E;CAAG;AAElH;;;;;;;;;;GAUG;AACH,eAAO,MAAM,SAAS,QAAO,OAG3B,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,YAAY,CAA4C,CAAA;AAE7F;;;;;GAKG;AACH,eAAO,MAAM,IAAI,GAAI,SAAS;IAC5B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAA;IACrC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,OAAO,CAAA;IACtC;;;OAGG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,SAAS,CAAA;CACrD,KAAG,OAmFH,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,KAAK,GAAI,CAAC,EAAE,CAAC,EACxB,QAAQ,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,EAClD,UAAU;IAAE,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,SAAS,CAAA;CAAE,GAAG,SAAS,KAC7E,KAAK,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,EAAE,aAAa,CAAC,aAAa,GAAG,CAAC,CAW5D,CAAA"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var ArtifactSync_exports = {};
|
|
30
|
+
__export(ArtifactSync_exports, {
|
|
31
|
+
ArtifactPublicationFailed: () => ArtifactPublicationFailed,
|
|
32
|
+
ArtifactSync: () => ArtifactSync,
|
|
33
|
+
layer: () => layer,
|
|
34
|
+
layerLocal: () => layerLocal,
|
|
35
|
+
make: () => make,
|
|
36
|
+
makeLocal: () => makeLocal
|
|
37
|
+
});
|
|
38
|
+
module.exports = __toCommonJS(ArtifactSync_exports);
|
|
39
|
+
var ArtifactStore = __toESM(require("@smthrs/artifacts/ArtifactStore"), 1);
|
|
40
|
+
var RemoteArtifacts = __toESM(require("@smthrs/artifacts/RemoteArtifacts"), 1);
|
|
41
|
+
var Context = __toESM(require("effect/Context"), 1);
|
|
42
|
+
var Effect = __toESM(require("effect/Effect"), 1);
|
|
43
|
+
var Layer = __toESM(require("effect/Layer"), 1);
|
|
44
|
+
var Schema = __toESM(require("effect/Schema"), 1);
|
|
45
|
+
class ArtifactPublicationFailed extends Schema.TaggedError()(
|
|
46
|
+
"@smthrs/engine-store/ArtifactPublicationFailed",
|
|
47
|
+
{
|
|
48
|
+
code: Schema.Literal("artifact_publication_failed"),
|
|
49
|
+
digests: Schema.Array(Schema.String),
|
|
50
|
+
message: Schema.String,
|
|
51
|
+
cause: Schema.optional(
|
|
52
|
+
Schema.Union([
|
|
53
|
+
ArtifactStore.ArtifactStoreError,
|
|
54
|
+
ArtifactStore.ArtifactMissing,
|
|
55
|
+
ArtifactStore.ArtifactCorruption
|
|
56
|
+
])
|
|
57
|
+
)
|
|
58
|
+
}
|
|
59
|
+
) {
|
|
60
|
+
}
|
|
61
|
+
class ArtifactSync extends Context.Service()("@smthrs/engine-store/ArtifactSync") {
|
|
62
|
+
}
|
|
63
|
+
const makeLocal = () => ({
|
|
64
|
+
publish: Effect.fn("ArtifactSync.publish")(() => Effect.void),
|
|
65
|
+
hydrate: Effect.fn("ArtifactSync.hydrate")((digests) => Effect.succeed(digests.length === 0))
|
|
66
|
+
});
|
|
67
|
+
const layerLocal = Layer.succeed(ArtifactSync)(makeLocal());
|
|
68
|
+
const make = (options) => {
|
|
69
|
+
const { local, remote } = options;
|
|
70
|
+
const downloadPolicy = options.downloadPolicy ?? RemoteArtifacts.downloadPolicyOf(remote) ?? "all";
|
|
71
|
+
const publicationFailed = (digests, message, cause) => new ArtifactPublicationFailed({ code: "artifact_publication_failed", digests, message, cause });
|
|
72
|
+
return {
|
|
73
|
+
publish: Effect.fn("ArtifactSync.publish")(function* (digests) {
|
|
74
|
+
if (digests.length === 0) return;
|
|
75
|
+
const missing = yield* remote.findMissing(digests).pipe(
|
|
76
|
+
Effect.mapError((cause) => publicationFailed(digests, "the shared tier refused a probe", cause))
|
|
77
|
+
);
|
|
78
|
+
for (const digest of missing) {
|
|
79
|
+
const bytes = yield* local.get(digest).pipe(
|
|
80
|
+
Effect.mapError(
|
|
81
|
+
(cause) => (
|
|
82
|
+
// The blob is referenced by evidence this host just produced, so
|
|
83
|
+
// it should be in this host's own store. If it is not, the
|
|
84
|
+
// evidence is not publishable — and saying so is far better than
|
|
85
|
+
// publishing an entry nobody can replay.
|
|
86
|
+
publicationFailed([digest], "this host cannot read the artifact it recorded", cause)
|
|
87
|
+
)
|
|
88
|
+
)
|
|
89
|
+
);
|
|
90
|
+
yield* remote.put(bytes).pipe(
|
|
91
|
+
Effect.mapError((cause) => publicationFailed([digest], "the shared tier refused an upload", cause))
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
if (missing.length === 0) return;
|
|
95
|
+
const stillMissing = yield* remote.findMissing(missing).pipe(
|
|
96
|
+
Effect.mapError((cause) => publicationFailed(missing, "the shared tier refused a probe", cause))
|
|
97
|
+
);
|
|
98
|
+
if (stillMissing.length > 0) {
|
|
99
|
+
return yield* Effect.fail(
|
|
100
|
+
publicationFailed(stillMissing, "the shared tier did not retain the uploaded artifacts")
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
}),
|
|
104
|
+
hydrate: Effect.fn("ArtifactSync.hydrate")(function* (digests) {
|
|
105
|
+
const fallBack = (message, digests2) => (cause) => Effect.logWarning(`artifact hydration falls back to re-execution: ${message}: ${digests2.join(", ")}`).pipe(
|
|
106
|
+
Effect.annotateLogs({ reason: cause.message })
|
|
107
|
+
);
|
|
108
|
+
const missing = yield* local.findMissing(digests).pipe(
|
|
109
|
+
Effect.tapError(fallBack("the local tier refused a probe", digests)),
|
|
110
|
+
Effect.option
|
|
111
|
+
);
|
|
112
|
+
if (missing._tag === "None") return false;
|
|
113
|
+
if (downloadPolicy !== "all") {
|
|
114
|
+
if (missing.value.length === 0) return true;
|
|
115
|
+
const elsewhere = yield* remote.findMissing(missing.value).pipe(
|
|
116
|
+
Effect.tapError(fallBack("the shared tier refused a probe", missing.value)),
|
|
117
|
+
Effect.option
|
|
118
|
+
);
|
|
119
|
+
return elsewhere._tag === "Some" && elsewhere.value.length === 0;
|
|
120
|
+
}
|
|
121
|
+
for (const digest of missing.value) {
|
|
122
|
+
const written = yield* remote.get(digest).pipe(
|
|
123
|
+
Effect.flatMap((bytes) => local.put(bytes)),
|
|
124
|
+
Effect.tapError(fallBack("the artifact could not be fetched", [digest])),
|
|
125
|
+
Effect.option
|
|
126
|
+
);
|
|
127
|
+
if (written._tag === "None") return false;
|
|
128
|
+
}
|
|
129
|
+
return true;
|
|
130
|
+
})
|
|
131
|
+
};
|
|
132
|
+
};
|
|
133
|
+
const layer = (remote, options) => Layer.effect(ArtifactSync)(
|
|
134
|
+
Effect.gen(function* () {
|
|
135
|
+
const local = yield* ArtifactStore.ArtifactStore;
|
|
136
|
+
const shared = yield* remote;
|
|
137
|
+
return make({
|
|
138
|
+
local,
|
|
139
|
+
remote: shared,
|
|
140
|
+
...options?.downloadPolicy === void 0 ? {} : { downloadPolicy: options.downloadPolicy }
|
|
141
|
+
});
|
|
142
|
+
})
|
|
143
|
+
);
|
|
144
|
+
//# sourceMappingURL=ArtifactSync.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/ArtifactSync.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * The two-tier artifact protocol the step cache rides on: publish before the\n * entry, fetch on demand after it.\n *\n * This is the seam that makes a shared cache safe. A cache entry references\n * its large outputs by digest, so an entry that becomes observable while one\n * of those artifacts is still missing hands the next machine a hit it cannot\n * materialize. Bazel states the constraint at\n * `reference/bazel/.../remote/UploadManifest.java:630-633` \u2014 \"action results\n * may fail to validate server-side if they are accessed before all blobs they\n * refer to are present\" \u2014 and enforces it by ordering:\n * `findMissingDigests` \u2192 upload the missing \u2192 upload the `ActionResult` LAST.\n * {@link Service.publish} is that ordering, and `ActionPersistence` calls it\n * before `CacheStore.put`.\n *\n * The read direction is the same protocol in reverse, and how eagerly it runs\n * is the {@link DownloadPolicy}, declared on the shared tier itself\n * (`RemoteArtifacts.Options.downloadPolicy`) and split across two seams.\n * `all` fetches every referenced artifact into this host's store while\n * admitting the replay. `toplevel` and `minimal` fetch nothing here: one\n * batched probe establishes that the shared tier can serve them and the\n * transfer is left to the first read through `CombinedArtifacts`, which then\n * writes the blob back under `toplevel` and does not under `minimal`. This is\n * Bazel's `RemoteOutputChecker` dial\n * (`--remote_download_{all,toplevel,minimal}`) split the way our two seams\n * split: what a replay prefetches is this module's decision, what a read\n * materializes is the combined store's.\n *\n * Governing design: `packages/smithers/flows/artifacts/docs/api.md`.\n *\n * @since 0.1.0\n */\n\nimport * as ArtifactStore from \"@smthrs/artifacts/ArtifactStore\"\nimport * as RemoteArtifacts from \"@smthrs/artifacts/RemoteArtifacts\"\nimport * as Context from \"effect/Context\"\nimport type * as Crypto from \"effect/Crypto\"\nimport * as Effect from \"effect/Effect\"\nimport * as Layer from \"effect/Layer\"\nimport * as Schema from \"effect/Schema\"\n\n/**\n * A referenced artifact could not be made durable in the shared tier, so the\n * cache entry that references it must not be published.\n *\n * Failing here is the point: silently publishing the entry anyway is exactly\n * the state the REAPI ordering constraint exists to prevent.\n *\n * @since 0.1.0\n * @category errors\n */\nexport class ArtifactPublicationFailed extends Schema.TaggedError<ArtifactPublicationFailed>()(\n \"@smthrs/engine-store/ArtifactPublicationFailed\",\n {\n code: Schema.Literal(\"artifact_publication_failed\"),\n digests: Schema.Array(Schema.String),\n message: Schema.String,\n cause: Schema.optional(\n Schema.Union([\n ArtifactStore.ArtifactStoreError,\n ArtifactStore.ArtifactMissing,\n ArtifactStore.ArtifactCorruption\n ])\n )\n }\n) {}\n\n/**\n * How eagerly a replay materializes the artifacts it references.\n *\n * `all` downloads every referenced artifact into this host's local store while\n * the replay is admitted, so every later read is local and a shared tier that\n * goes down afterwards costs nothing. `minimal` downloads none of them: it\n * establishes that each digest is resolvable \u2014 locally, or from the shared tier\n * \u2014 and lets the first actual read fetch the bytes.\n *\n * `minimal` is only sound when the store the replay reads through can reach the\n * shared tier, which means `CombinedArtifacts` with the same remote tier. Under\n * a purely local `ArtifactStore` an admitted `minimal` replay would later read\n * an artifact this host never fetched.\n *\n * @since 0.1.0\n * @category models\n */\nexport type DownloadPolicy = RemoteArtifacts.DownloadPolicy\n\n/**\n * The two directions of the artifact protocol: {@link Service.publish} before a\n * cache entry becomes observable, {@link Service.hydrate} when a replay needs\n * bytes this host does not have.\n *\n * The asymmetry in their error types is the design: publishing may fail,\n * because publishing an entry whose artifacts are missing is the unsafe state;\n * hydrating never fails, because a shared tier that is down should cost a run\n * a cache hit, not the run itself.\n *\n * @since 0.1.0\n * @category services\n */\nexport interface Service {\n /**\n * Makes every digest durable in the shared tier, in REAPI order:\n * `findMissing`, upload what is missing, then confirm nothing is missing\n * any more. Returns only once the shared tier can serve all of them.\n */\n readonly publish: (\n digests: ReadonlyArray<string>\n ) => Effect.Effect<void, ArtifactPublicationFailed, Crypto.Crypto>\n /**\n * Fetches the digests this host is missing from the shared tier and writes\n * them into the local store, reporting whether every digest is now locally\n * resolvable.\n *\n * Best-effort by construction: `false` means \"replay still cannot be\n * satisfied\", which the caller turns into a real execution. A shared tier\n * that is down must never fail a run that can simply do the work.\n */\n readonly hydrate: (\n digests: ReadonlyArray<string>\n ) => Effect.Effect<boolean, never, Crypto.Crypto>\n}\n\n/**\n * Service tag for the two-tier artifact protocol.\n *\n * @since 0.1.0\n * @category services\n */\nexport class ArtifactSync extends Context.Service<ArtifactSync, Service>()(\"@smthrs/engine-store/ArtifactSync\") {}\n\n/**\n * The single-tier implementation: there is no shared artifact store, so there\n * is nothing to publish and nothing to fetch.\n *\n * This is the default `ActionPersistence` falls back to when the tag is\n * absent, which is what keeps a purely local composition free of any\n * remote-cache machinery.\n *\n * @since 0.1.0\n * @category constructors\n */\nexport const makeLocal = (): Service => ({\n publish: Effect.fn(\"ArtifactSync.publish\")(() => Effect.void),\n hydrate: Effect.fn(\"ArtifactSync.hydrate\")((digests) => Effect.succeed(digests.length === 0))\n})\n\n/**\n * Provides the single-tier (no shared artifact store) protocol.\n *\n * @since 0.1.0\n * @category layers\n */\nexport const layerLocal: Layer.Layer<ArtifactSync> = Layer.succeed(ArtifactSync)(makeLocal())\n\n/**\n * Builds the two-tier protocol over a local and a shared artifact store.\n *\n * @since 0.1.0\n * @category constructors\n */\nexport const make = (options: {\n readonly local: ArtifactStore.Service\n readonly remote: ArtifactStore.Service\n /**\n * Defaults to the policy the shared tier declares, and to `all` for a tier\n * that declares none: every referenced artifact is fetched at hydrate.\n */\n readonly downloadPolicy?: DownloadPolicy | undefined\n}): Service => {\n const { local, remote } = options\n const downloadPolicy = options.downloadPolicy ?? RemoteArtifacts.downloadPolicyOf(remote) ?? \"all\"\n const publicationFailed = (\n digests: ReadonlyArray<string>,\n message: string,\n cause?: ArtifactStore.ArtifactStoreError | ArtifactStore.ArtifactMissing | ArtifactStore.ArtifactCorruption\n ) => new ArtifactPublicationFailed({ code: \"artifact_publication_failed\", digests, message, cause })\n return {\n publish: Effect.fn(\"ArtifactSync.publish\")(function*(digests) {\n if (digests.length === 0) return\n const missing = yield* remote.findMissing(digests).pipe(\n Effect.mapError((cause) => publicationFailed(digests, \"the shared tier refused a probe\", cause))\n )\n for (const digest of missing) {\n const bytes = yield* local.get(digest).pipe(\n Effect.mapError((cause) =>\n // The blob is referenced by evidence this host just produced, so\n // it should be in this host's own store. If it is not, the\n // evidence is not publishable \u2014 and saying so is far better than\n // publishing an entry nobody can replay.\n publicationFailed([digest], \"this host cannot read the artifact it recorded\", cause)\n )\n )\n yield* remote.put(bytes).pipe(\n Effect.mapError((cause) => publicationFailed([digest], \"the shared tier refused an upload\", cause))\n )\n }\n if (missing.length === 0) return\n // The confirming re-probe is not paranoia: a tier that accepted the\n // upload but did not durably store it is exactly the state that makes a\n // published entry unreplayable, and it is cheap to rule out \u2014 one\n // batched round trip over the set we just wrote.\n const stillMissing = yield* remote.findMissing(missing).pipe(\n Effect.mapError((cause) => publicationFailed(missing, \"the shared tier refused a probe\", cause))\n )\n if (stillMissing.length > 0) {\n return yield* Effect.fail(\n publicationFailed(stillMissing, \"the shared tier did not retain the uploaded artifacts\")\n )\n }\n }),\n hydrate: Effect.fn(\"ArtifactSync.hydrate\")(function*(digests) {\n // Every refusal below falls back to re-executing the step, which is\n // correct and silent. The warning is the operator's only signal that a\n // tier stopped serving replays.\n const fallBack = (message: string, digests: ReadonlyArray<string>) => (cause: { readonly message: string }) =>\n Effect.logWarning(`artifact hydration falls back to re-execution: ${message}: ${digests.join(\", \")}`).pipe(\n Effect.annotateLogs({ reason: cause.message })\n )\n const missing = yield* local.findMissing(digests).pipe(\n Effect.tapError(fallBack(\"the local tier refused a probe\", digests)),\n Effect.option\n )\n if (missing._tag === \"None\") return false\n if (downloadPolicy !== \"all\") {\n if (missing.value.length === 0) return true\n // One batched probe, no body transfer: the answer these policies owe\n // the caller is \"can this replay be satisfied\", and `findMissing`\n // answers exactly that. A tier that refuses the probe is\n // indistinguishable from one that holds nothing, so the replay is\n // refused either way.\n const elsewhere = yield* remote.findMissing(missing.value).pipe(\n Effect.tapError(fallBack(\"the shared tier refused a probe\", missing.value)),\n Effect.option\n )\n return elsewhere._tag === \"Some\" && elsewhere.value.length === 0\n }\n for (const digest of missing.value) {\n // Read-through, one artifact at a time and only on demand: the remote\n // read is digest-verified by `RemoteArtifacts`, and the local `put`\n // re-addresses the bytes, so a tier serving wrong content cannot get\n // them written into this workspace.\n const written = yield* remote.get(digest).pipe(\n Effect.flatMap((bytes) => local.put(bytes)),\n Effect.tapError(fallBack(\"the artifact could not be fetched\", [digest])),\n Effect.option\n )\n if (written._tag === \"None\") return false\n }\n return true\n })\n }\n}\n\n/**\n * Provides the two-tier protocol, taking the local store from the\n * `ArtifactStore` tag and the shared store from the supplied effect.\n *\n * The two tiers cannot both be layers: they inhabit the same tag, so composing\n * them would shadow one with the other.\n *\n * @since 0.1.0\n * @category layers\n */\nexport const layer = <E, R>(\n remote: Effect.Effect<ArtifactStore.Service, E, R>,\n options?: { readonly downloadPolicy?: DownloadPolicy | undefined } | undefined\n): Layer.Layer<ArtifactSync, E, ArtifactStore.ArtifactStore | R> =>\n Layer.effect(ArtifactSync)(\n Effect.gen(function*() {\n const local = yield* ArtifactStore.ArtifactStore\n const shared = yield* remote\n return make({\n local,\n remote: shared,\n ...(options?.downloadPolicy === undefined ? {} : { downloadPolicy: options.downloadPolicy })\n })\n })\n )\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["digests"]
|
|
7
|
+
}
|