@smthrs/flow 0.0.0-stage → 1.0.0-rc.12
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 +161 -0
- package/LICENSE +21 -0
- package/README.md +212 -2
- package/THIRD_PARTY_NOTICES.md +52 -0
- package/dist/cjs/Action/Action.d.ts +250 -0
- package/dist/cjs/Action/Action.d.ts.map +1 -0
- package/dist/cjs/Action/Action.js +42 -0
- package/dist/cjs/Action/Action.js.map +7 -0
- package/dist/cjs/Action/AttemptTimedOut.d.ts +33 -0
- package/dist/cjs/Action/AttemptTimedOut.d.ts.map +1 -0
- package/dist/cjs/Action/AttemptTimedOut.js +51 -0
- package/dist/cjs/Action/AttemptTimedOut.js.map +7 -0
- package/dist/cjs/Action/BoundaryMode.d.ts +29 -0
- package/dist/cjs/Action/BoundaryMode.d.ts.map +1 -0
- package/dist/cjs/Action/BoundaryMode.js +36 -0
- package/dist/cjs/Action/BoundaryMode.js.map +7 -0
- package/dist/cjs/Action/CacheEnvironment.d.ts +158 -0
- package/dist/cjs/Action/CacheEnvironment.d.ts.map +1 -0
- package/dist/cjs/Action/CacheEnvironment.js +57 -0
- package/dist/cjs/Action/CacheEnvironment.js.map +7 -0
- package/dist/cjs/Action/ConcurrentKeylessDispatch.d.ts +34 -0
- package/dist/cjs/Action/ConcurrentKeylessDispatch.d.ts.map +1 -0
- package/dist/cjs/Action/ConcurrentKeylessDispatch.js +46 -0
- package/dist/cjs/Action/ConcurrentKeylessDispatch.js.map +7 -0
- package/dist/cjs/Action/Context.d.ts +131 -0
- package/dist/cjs/Action/Context.d.ts.map +1 -0
- package/dist/cjs/Action/Context.js +68 -0
- package/dist/cjs/Action/Context.js.map +7 -0
- package/dist/cjs/Action/DuplicateImplementation.d.ts +20 -0
- package/dist/cjs/Action/DuplicateImplementation.d.ts.map +1 -0
- package/dist/cjs/Action/DuplicateImplementation.js +46 -0
- package/dist/cjs/Action/DuplicateImplementation.js.map +7 -0
- package/dist/cjs/Action/FileBoundary.d.ts +59 -0
- package/dist/cjs/Action/FileBoundary.d.ts.map +1 -0
- package/dist/cjs/Action/FileBoundary.js +81 -0
- package/dist/cjs/Action/FileBoundary.js.map +7 -0
- package/dist/cjs/Action/FileInput.d.ts +28 -0
- package/dist/cjs/Action/FileInput.d.ts.map +1 -0
- package/dist/cjs/Action/FileInput.js +42 -0
- package/dist/cjs/Action/FileInput.js.map +7 -0
- package/dist/cjs/Action/Filegroup.d.ts +16 -0
- package/dist/cjs/Action/Filegroup.d.ts.map +1 -0
- package/dist/cjs/Action/Filegroup.js +27 -0
- package/dist/cjs/Action/Filegroup.js.map +7 -0
- package/dist/cjs/Action/Glob.d.ts +8 -0
- package/dist/cjs/Action/Glob.d.ts.map +1 -0
- package/dist/cjs/Action/Glob.js +28 -0
- package/dist/cjs/Action/Glob.js.map +7 -0
- package/dist/cjs/Action/ImplementationVersionMismatch.d.ts +26 -0
- package/dist/cjs/Action/ImplementationVersionMismatch.d.ts.map +1 -0
- package/dist/cjs/Action/ImplementationVersionMismatch.js +45 -0
- package/dist/cjs/Action/ImplementationVersionMismatch.js.map +7 -0
- package/dist/cjs/Action/Implementations.d.ts +114 -0
- package/dist/cjs/Action/Implementations.d.ts.map +1 -0
- package/dist/cjs/Action/Implementations.js +65 -0
- package/dist/cjs/Action/Implementations.js.map +7 -0
- package/dist/cjs/Action/InfraInterrupt.d.ts +26 -0
- package/dist/cjs/Action/InfraInterrupt.d.ts.map +1 -0
- package/dist/cjs/Action/InfraInterrupt.js +46 -0
- package/dist/cjs/Action/InfraInterrupt.js.map +7 -0
- package/dist/cjs/Action/InfraInterruptRetriesExhausted.d.ts +33 -0
- package/dist/cjs/Action/InfraInterruptRetriesExhausted.d.ts.map +1 -0
- package/dist/cjs/Action/InfraInterruptRetriesExhausted.js +54 -0
- package/dist/cjs/Action/InfraInterruptRetriesExhausted.js.map +7 -0
- package/dist/cjs/Action/IrreversibleRetryRequiresIdempotencyKey.d.ts +26 -0
- package/dist/cjs/Action/IrreversibleRetryRequiresIdempotencyKey.d.ts.map +1 -0
- package/dist/cjs/Action/IrreversibleRetryRequiresIdempotencyKey.js +47 -0
- package/dist/cjs/Action/IrreversibleRetryRequiresIdempotencyKey.js.map +7 -0
- package/dist/cjs/Action/StepIdentity.d.ts +153 -0
- package/dist/cjs/Action/StepIdentity.d.ts.map +1 -0
- package/dist/cjs/Action/StepIdentity.js +75 -0
- package/dist/cjs/Action/StepIdentity.js.map +7 -0
- package/dist/cjs/Action/TreeArtifact.d.ts +8 -0
- package/dist/cjs/Action/TreeArtifact.d.ts.map +1 -0
- package/dist/cjs/Action/TreeArtifact.js +25 -0
- package/dist/cjs/Action/TreeArtifact.js.map +7 -0
- package/dist/cjs/Action/TypeId.d.ts +8 -0
- package/dist/cjs/Action/TypeId.d.ts.map +1 -0
- package/dist/cjs/Action/TypeId.js +25 -0
- package/dist/cjs/Action/TypeId.js.map +7 -0
- package/dist/cjs/Action/UncanonicalIdempotencyKey.d.ts +32 -0
- package/dist/cjs/Action/UncanonicalIdempotencyKey.d.ts.map +1 -0
- package/dist/cjs/Action/UncanonicalIdempotencyKey.js +51 -0
- package/dist/cjs/Action/UncanonicalIdempotencyKey.js.map +7 -0
- package/dist/cjs/Action/idempotencyKey.d.ts +21 -0
- package/dist/cjs/Action/idempotencyKey.d.ts.map +1 -0
- package/dist/cjs/Action/idempotencyKey.js +59 -0
- package/dist/cjs/Action/idempotencyKey.js.map +7 -0
- package/dist/cjs/Action/index.d.ts +29 -0
- package/dist/cjs/Action/index.d.ts.map +1 -0
- package/dist/cjs/Action/index.js +60 -0
- package/dist/cjs/Action/index.js.map +7 -0
- package/dist/cjs/Action/make.d.ts +128 -0
- package/dist/cjs/Action/make.d.ts.map +1 -0
- package/dist/cjs/Action/make.js +387 -0
- package/dist/cjs/Action/make.js.map +7 -0
- package/dist/cjs/Action/raceAll.d.ts +21 -0
- package/dist/cjs/Action/raceAll.d.ts.map +1 -0
- package/dist/cjs/Action/raceAll.js +46 -0
- package/dist/cjs/Action/raceAll.js.map +7 -0
- package/dist/cjs/Action/retry.d.ts +19 -0
- package/dist/cjs/Action/retry.d.ts.map +1 -0
- package/dist/cjs/Action/retry.js +75 -0
- package/dist/cjs/Action/retry.js.map +7 -0
- package/dist/cjs/Deadline.d.ts +110 -0
- package/dist/cjs/Deadline.d.ts.map +1 -0
- package/dist/cjs/Deadline.js +112 -0
- package/dist/cjs/Deadline.js.map +7 -0
- package/dist/cjs/DurableClock.d.ts +60 -0
- package/dist/cjs/DurableClock.d.ts.map +1 -0
- package/dist/cjs/DurableClock.js +107 -0
- package/dist/cjs/DurableClock.js.map +7 -0
- package/dist/cjs/DurableDeferred.d.ts +311 -0
- package/dist/cjs/DurableDeferred.d.ts.map +1 -0
- package/dist/cjs/DurableDeferred.js +322 -0
- package/dist/cjs/DurableDeferred.js.map +7 -0
- package/dist/cjs/DurableQueue.d.ts +160 -0
- package/dist/cjs/DurableQueue.d.ts.map +1 -0
- package/dist/cjs/DurableQueue.js +229 -0
- package/dist/cjs/DurableQueue.js.map +7 -0
- package/dist/cjs/ExternalJob.d.ts +179 -0
- package/dist/cjs/ExternalJob.d.ts.map +1 -0
- package/dist/cjs/ExternalJob.js +339 -0
- package/dist/cjs/ExternalJob.js.map +7 -0
- package/dist/cjs/Fault.d.ts +131 -0
- package/dist/cjs/Fault.d.ts.map +1 -0
- package/dist/cjs/Fault.js +157 -0
- package/dist/cjs/Fault.js.map +7 -0
- package/dist/cjs/Flow/Annotations.d.ts +245 -0
- package/dist/cjs/Flow/Annotations.d.ts.map +1 -0
- package/dist/cjs/Flow/Annotations.js +72 -0
- package/dist/cjs/Flow/Annotations.js.map +7 -0
- package/dist/cjs/Flow/CapabilityCeiling.d.ts +21 -0
- package/dist/cjs/Flow/CapabilityCeiling.d.ts.map +1 -0
- package/dist/cjs/Flow/CapabilityCeiling.js +49 -0
- package/dist/cjs/Flow/CapabilityCeiling.js.map +7 -0
- package/dist/cjs/Flow/DeadlineExceeded.d.ts +33 -0
- package/dist/cjs/Flow/DeadlineExceeded.d.ts.map +1 -0
- package/dist/cjs/Flow/DeadlineExceeded.js +52 -0
- package/dist/cjs/Flow/DeadlineExceeded.js.map +7 -0
- package/dist/cjs/Flow/ExecutionIdRequired.d.ts +25 -0
- package/dist/cjs/Flow/ExecutionIdRequired.d.ts.map +1 -0
- package/dist/cjs/Flow/ExecutionIdRequired.js +46 -0
- package/dist/cjs/Flow/ExecutionIdRequired.js.map +7 -0
- package/dist/cjs/Flow/ExecutionIds.d.ts +80 -0
- package/dist/cjs/Flow/ExecutionIds.d.ts.map +1 -0
- package/dist/cjs/Flow/ExecutionIds.js +66 -0
- package/dist/cjs/Flow/ExecutionIds.js.map +7 -0
- package/dist/cjs/Flow/Flow.d.ts +422 -0
- package/dist/cjs/Flow/Flow.d.ts.map +1 -0
- package/dist/cjs/Flow/Flow.js +17 -0
- package/dist/cjs/Flow/Flow.js.map +7 -0
- package/dist/cjs/Flow/MaxRoundsExceeded.d.ts +35 -0
- package/dist/cjs/Flow/MaxRoundsExceeded.d.ts.map +1 -0
- package/dist/cjs/Flow/MaxRoundsExceeded.js +50 -0
- package/dist/cjs/Flow/MaxRoundsExceeded.js.map +7 -0
- package/dist/cjs/Flow/Outcome.d.ts +162 -0
- package/dist/cjs/Flow/Outcome.d.ts.map +1 -0
- package/dist/cjs/Flow/Outcome.js +80 -0
- package/dist/cjs/Flow/Outcome.js.map +7 -0
- package/dist/cjs/Flow/Result.d.ts +186 -0
- package/dist/cjs/Flow/Result.d.ts.map +1 -0
- package/dist/cjs/Flow/Result.js +159 -0
- package/dist/cjs/Flow/Result.js.map +7 -0
- package/dist/cjs/Flow/Runtime.d.ts +98 -0
- package/dist/cjs/Flow/Runtime.d.ts.map +1 -0
- package/dist/cjs/Flow/Runtime.js +186 -0
- package/dist/cjs/Flow/Runtime.js.map +7 -0
- package/dist/cjs/Flow/TypeId.d.ts +8 -0
- package/dist/cjs/Flow/TypeId.d.ts.map +1 -0
- package/dist/cjs/Flow/TypeId.js +25 -0
- package/dist/cjs/Flow/TypeId.js.map +7 -0
- package/dist/cjs/Flow/index.d.ts +17 -0
- package/dist/cjs/Flow/index.d.ts.map +1 -0
- package/dist/cjs/Flow/index.js +29 -0
- package/dist/cjs/Flow/index.js.map +7 -0
- package/dist/cjs/Flow/internal.d.ts +34 -0
- package/dist/cjs/Flow/internal.d.ts.map +1 -0
- package/dist/cjs/Flow/internal.js +187 -0
- package/dist/cjs/Flow/internal.js.map +7 -0
- package/dist/cjs/Flow/make.d.ts +135 -0
- package/dist/cjs/Flow/make.d.ts.map +1 -0
- package/dist/cjs/Flow/make.js +107 -0
- package/dist/cjs/Flow/make.js.map +7 -0
- package/dist/cjs/FlowRuntime/CancelRequestFailed.d.ts +55 -0
- package/dist/cjs/FlowRuntime/CancelRequestFailed.d.ts.map +1 -0
- package/dist/cjs/FlowRuntime/CancelRequestFailed.js +51 -0
- package/dist/cjs/FlowRuntime/CancelRequestFailed.js.map +7 -0
- package/dist/cjs/FlowRuntime/ExecutionIdentityConflict.d.ts +23 -0
- package/dist/cjs/FlowRuntime/ExecutionIdentityConflict.d.ts.map +1 -0
- package/dist/cjs/FlowRuntime/ExecutionIdentityConflict.js +55 -0
- package/dist/cjs/FlowRuntime/ExecutionIdentityConflict.js.map +7 -0
- package/dist/cjs/FlowRuntime/FlowCycleDetected.d.ts +28 -0
- package/dist/cjs/FlowRuntime/FlowCycleDetected.d.ts.map +1 -0
- package/dist/cjs/FlowRuntime/FlowCycleDetected.js +49 -0
- package/dist/cjs/FlowRuntime/FlowCycleDetected.js.map +7 -0
- package/dist/cjs/FlowRuntime/FlowExecutionNotFound.d.ts +38 -0
- package/dist/cjs/FlowRuntime/FlowExecutionNotFound.d.ts.map +1 -0
- package/dist/cjs/FlowRuntime/FlowExecutionNotFound.js +53 -0
- package/dist/cjs/FlowRuntime/FlowExecutionNotFound.js.map +7 -0
- package/dist/cjs/FlowRuntime/FlowInstance.d.ts +115 -0
- package/dist/cjs/FlowRuntime/FlowInstance.d.ts.map +1 -0
- package/dist/cjs/FlowRuntime/FlowInstance.js +37 -0
- package/dist/cjs/FlowRuntime/FlowInstance.js.map +7 -0
- package/dist/cjs/FlowRuntime/FlowRuntime.d.ts +204 -0
- package/dist/cjs/FlowRuntime/FlowRuntime.d.ts.map +1 -0
- package/dist/cjs/FlowRuntime/FlowRuntime.js +37 -0
- package/dist/cjs/FlowRuntime/FlowRuntime.js.map +7 -0
- package/dist/cjs/FlowRuntime/NodeRecord.d.ts +177 -0
- package/dist/cjs/FlowRuntime/NodeRecord.d.ts.map +1 -0
- package/dist/cjs/FlowRuntime/NodeRecord.js +17 -0
- package/dist/cjs/FlowRuntime/NodeRecord.js.map +7 -0
- package/dist/cjs/FlowRuntime/WaitingAnnotation.d.ts +69 -0
- package/dist/cjs/FlowRuntime/WaitingAnnotation.d.ts.map +1 -0
- package/dist/cjs/FlowRuntime/WaitingAnnotation.js +53 -0
- package/dist/cjs/FlowRuntime/WaitingAnnotation.js.map +7 -0
- package/dist/cjs/FlowRuntime/index.d.ts +14 -0
- package/dist/cjs/FlowRuntime/index.d.ts.map +1 -0
- package/dist/cjs/FlowRuntime/index.js +26 -0
- package/dist/cjs/FlowRuntime/index.js.map +7 -0
- package/dist/cjs/Graph.d.ts +325 -0
- package/dist/cjs/Graph.d.ts.map +1 -0
- package/dist/cjs/Graph.js +1020 -0
- package/dist/cjs/Graph.js.map +7 -0
- package/dist/cjs/HumanTask.d.ts +442 -0
- package/dist/cjs/HumanTask.d.ts.map +1 -0
- package/dist/cjs/HumanTask.js +413 -0
- package/dist/cjs/HumanTask.js.map +7 -0
- package/dist/cjs/Interpreter.d.ts +223 -0
- package/dist/cjs/Interpreter.d.ts.map +1 -0
- package/dist/cjs/Interpreter.js +908 -0
- package/dist/cjs/Interpreter.js.map +7 -0
- package/dist/cjs/Poll.d.ts +240 -0
- package/dist/cjs/Poll.d.ts.map +1 -0
- package/dist/cjs/Poll.js +154 -0
- package/dist/cjs/Poll.js.map +7 -0
- package/dist/cjs/RetryPolicy.d.ts +273 -0
- package/dist/cjs/RetryPolicy.d.ts.map +1 -0
- package/dist/cjs/RetryPolicy.js +251 -0
- package/dist/cjs/RetryPolicy.js.map +7 -0
- package/dist/cjs/Sleep.d.ts +98 -0
- package/dist/cjs/Sleep.d.ts.map +1 -0
- package/dist/cjs/Sleep.js +141 -0
- package/dist/cjs/Sleep.js.map +7 -0
- package/dist/cjs/Stall.d.ts +173 -0
- package/dist/cjs/Stall.d.ts.map +1 -0
- package/dist/cjs/Stall.js +92 -0
- package/dist/cjs/Stall.js.map +7 -0
- package/dist/cjs/WaitFor.d.ts +109 -0
- package/dist/cjs/WaitFor.d.ts.map +1 -0
- package/dist/cjs/WaitFor.js +117 -0
- package/dist/cjs/WaitFor.js.map +7 -0
- package/dist/cjs/index.d.ts +107 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +69 -0
- package/dist/cjs/index.js.map +7 -0
- package/dist/cjs/internal/BoundedJson.d.ts +48 -0
- package/dist/cjs/internal/BoundedJson.d.ts.map +1 -0
- package/dist/cjs/internal/BoundedJson.js +96 -0
- package/dist/cjs/internal/BoundedJson.js.map +7 -0
- package/dist/cjs/internal/DeclarationSite.d.ts +135 -0
- package/dist/cjs/internal/DeclarationSite.d.ts.map +1 -0
- package/dist/cjs/internal/DeclarationSite.js +89 -0
- package/dist/cjs/internal/DeclarationSite.js.map +7 -0
- package/dist/cjs/internal/Declarations.d.ts +35 -0
- package/dist/cjs/internal/Declarations.d.ts.map +1 -0
- package/dist/cjs/internal/Declarations.js +50 -0
- package/dist/cjs/internal/Declarations.js.map +7 -0
- package/dist/cjs/internal/ExecutionMiddleware.d.ts +21 -0
- package/dist/cjs/internal/ExecutionMiddleware.d.ts.map +1 -0
- package/dist/cjs/internal/ExecutionMiddleware.js +39 -0
- package/dist/cjs/internal/ExecutionMiddleware.js.map +7 -0
- package/dist/cjs/internal/JsonSchemaSubset.d.ts +133 -0
- package/dist/cjs/internal/JsonSchemaSubset.d.ts.map +1 -0
- package/dist/cjs/internal/JsonSchemaSubset.js +229 -0
- package/dist/cjs/internal/JsonSchemaSubset.js.map +7 -0
- package/dist/cjs/internal/OutcomeMarker.d.ts +18 -0
- package/dist/cjs/internal/OutcomeMarker.d.ts.map +1 -0
- package/dist/cjs/internal/OutcomeMarker.js +27 -0
- package/dist/cjs/internal/OutcomeMarker.js.map +7 -0
- package/dist/cjs/package.json +1 -0
- package/dist/esm/Action/Action.d.ts +250 -0
- package/dist/esm/Action/Action.d.ts.map +1 -0
- package/dist/esm/Action/Action.js +30 -0
- package/dist/esm/Action/Action.js.map +1 -0
- package/dist/esm/Action/AttemptTimedOut.d.ts +33 -0
- package/dist/esm/Action/AttemptTimedOut.d.ts.map +1 -0
- package/dist/esm/Action/AttemptTimedOut.js +32 -0
- package/dist/esm/Action/AttemptTimedOut.js.map +1 -0
- package/dist/esm/Action/BoundaryMode.d.ts +29 -0
- package/dist/esm/Action/BoundaryMode.d.ts.map +1 -0
- package/dist/esm/Action/BoundaryMode.js +23 -0
- package/dist/esm/Action/BoundaryMode.js.map +1 -0
- package/dist/esm/Action/CacheEnvironment.d.ts +158 -0
- package/dist/esm/Action/CacheEnvironment.d.ts.map +1 -0
- package/dist/esm/Action/CacheEnvironment.js +130 -0
- package/dist/esm/Action/CacheEnvironment.js.map +1 -0
- package/dist/esm/Action/ConcurrentKeylessDispatch.d.ts +34 -0
- package/dist/esm/Action/ConcurrentKeylessDispatch.d.ts.map +1 -0
- package/dist/esm/Action/ConcurrentKeylessDispatch.js +33 -0
- package/dist/esm/Action/ConcurrentKeylessDispatch.js.map +1 -0
- package/dist/esm/Action/Context.d.ts +131 -0
- package/dist/esm/Action/Context.d.ts.map +1 -0
- package/dist/esm/Action/Context.js +99 -0
- package/dist/esm/Action/Context.js.map +1 -0
- package/dist/esm/Action/DuplicateImplementation.d.ts +20 -0
- package/dist/esm/Action/DuplicateImplementation.d.ts.map +1 -0
- package/dist/esm/Action/DuplicateImplementation.js +20 -0
- package/dist/esm/Action/DuplicateImplementation.js.map +1 -0
- package/dist/esm/Action/FileBoundary.d.ts +59 -0
- package/dist/esm/Action/FileBoundary.d.ts.map +1 -0
- package/dist/esm/Action/FileBoundary.js +60 -0
- package/dist/esm/Action/FileBoundary.js.map +1 -0
- package/dist/esm/Action/FileInput.d.ts +28 -0
- package/dist/esm/Action/FileInput.d.ts.map +1 -0
- package/dist/esm/Action/FileInput.js +32 -0
- package/dist/esm/Action/FileInput.js.map +1 -0
- package/dist/esm/Action/Filegroup.d.ts +16 -0
- package/dist/esm/Action/Filegroup.d.ts.map +1 -0
- package/dist/esm/Action/Filegroup.js +15 -0
- package/dist/esm/Action/Filegroup.js.map +1 -0
- package/dist/esm/Action/Glob.d.ts +8 -0
- package/dist/esm/Action/Glob.d.ts.map +1 -0
- package/dist/esm/Action/Glob.js +7 -0
- package/dist/esm/Action/Glob.js.map +1 -0
- package/dist/esm/Action/ImplementationVersionMismatch.d.ts +26 -0
- package/dist/esm/Action/ImplementationVersionMismatch.d.ts.map +1 -0
- package/dist/esm/Action/ImplementationVersionMismatch.js +24 -0
- package/dist/esm/Action/ImplementationVersionMismatch.js.map +1 -0
- package/dist/esm/Action/Implementations.d.ts +114 -0
- package/dist/esm/Action/Implementations.d.ts.map +1 -0
- package/dist/esm/Action/Implementations.js +94 -0
- package/dist/esm/Action/Implementations.js.map +1 -0
- package/dist/esm/Action/InfraInterrupt.d.ts +26 -0
- package/dist/esm/Action/InfraInterrupt.d.ts.map +1 -0
- package/dist/esm/Action/InfraInterrupt.js +25 -0
- package/dist/esm/Action/InfraInterrupt.js.map +1 -0
- package/dist/esm/Action/InfraInterruptRetriesExhausted.d.ts +33 -0
- package/dist/esm/Action/InfraInterruptRetriesExhausted.d.ts.map +1 -0
- package/dist/esm/Action/InfraInterruptRetriesExhausted.js +32 -0
- package/dist/esm/Action/InfraInterruptRetriesExhausted.js.map +1 -0
- package/dist/esm/Action/IrreversibleRetryRequiresIdempotencyKey.d.ts +26 -0
- package/dist/esm/Action/IrreversibleRetryRequiresIdempotencyKey.d.ts.map +1 -0
- package/dist/esm/Action/IrreversibleRetryRequiresIdempotencyKey.js +25 -0
- package/dist/esm/Action/IrreversibleRetryRequiresIdempotencyKey.js.map +1 -0
- package/dist/esm/Action/StepIdentity.d.ts +153 -0
- package/dist/esm/Action/StepIdentity.d.ts.map +1 -0
- package/dist/esm/Action/StepIdentity.js +139 -0
- package/dist/esm/Action/StepIdentity.js.map +1 -0
- package/dist/esm/Action/TreeArtifact.d.ts +8 -0
- package/dist/esm/Action/TreeArtifact.d.ts.map +1 -0
- package/dist/esm/Action/TreeArtifact.js +7 -0
- package/dist/esm/Action/TreeArtifact.js.map +1 -0
- package/dist/esm/Action/TypeId.d.ts +8 -0
- package/dist/esm/Action/TypeId.d.ts.map +1 -0
- package/dist/esm/Action/TypeId.js +9 -0
- package/dist/esm/Action/TypeId.js.map +1 -0
- package/dist/esm/Action/UncanonicalIdempotencyKey.d.ts +32 -0
- package/dist/esm/Action/UncanonicalIdempotencyKey.d.ts.map +1 -0
- package/dist/esm/Action/UncanonicalIdempotencyKey.js +31 -0
- package/dist/esm/Action/UncanonicalIdempotencyKey.js.map +1 -0
- package/dist/esm/Action/idempotencyKey.d.ts +21 -0
- package/dist/esm/Action/idempotencyKey.d.ts.map +1 -0
- package/dist/esm/Action/idempotencyKey.js +50 -0
- package/dist/esm/Action/idempotencyKey.js.map +1 -0
- package/dist/esm/Action/index.d.ts +29 -0
- package/dist/esm/Action/index.d.ts.map +1 -0
- package/dist/esm/Action/index.js +30 -0
- package/dist/esm/Action/index.js.map +1 -0
- package/dist/esm/Action/make.d.ts +128 -0
- package/dist/esm/Action/make.d.ts.map +1 -0
- package/dist/esm/Action/make.js +413 -0
- package/dist/esm/Action/make.js.map +1 -0
- package/dist/esm/Action/raceAll.d.ts +21 -0
- package/dist/esm/Action/raceAll.d.ts.map +1 -0
- package/dist/esm/Action/raceAll.js +20 -0
- package/dist/esm/Action/raceAll.js.map +1 -0
- package/dist/esm/Action/retry.d.ts +19 -0
- package/dist/esm/Action/retry.d.ts.map +1 -0
- package/dist/esm/Action/retry.js +72 -0
- package/dist/esm/Action/retry.js.map +1 -0
- package/dist/esm/Deadline.d.ts +110 -0
- package/dist/esm/Deadline.d.ts.map +1 -0
- package/dist/esm/Deadline.js +164 -0
- package/dist/esm/Deadline.js.map +1 -0
- package/dist/esm/DurableClock.d.ts +60 -0
- package/dist/esm/DurableClock.d.ts.map +1 -0
- package/dist/esm/DurableClock.js +122 -0
- package/dist/esm/DurableClock.js.map +1 -0
- package/dist/esm/DurableDeferred.d.ts +311 -0
- package/dist/esm/DurableDeferred.d.ts.map +1 -0
- package/dist/esm/DurableDeferred.js +357 -0
- package/dist/esm/DurableDeferred.js.map +1 -0
- package/dist/esm/DurableQueue.d.ts +160 -0
- package/dist/esm/DurableQueue.d.ts.map +1 -0
- package/dist/esm/DurableQueue.js +303 -0
- package/dist/esm/DurableQueue.js.map +1 -0
- package/dist/esm/ExternalJob.d.ts +179 -0
- package/dist/esm/ExternalJob.d.ts.map +1 -0
- package/dist/esm/ExternalJob.js +296 -0
- package/dist/esm/ExternalJob.js.map +1 -0
- package/dist/esm/Fault.d.ts +131 -0
- package/dist/esm/Fault.d.ts.map +1 -0
- package/dist/esm/Fault.js +198 -0
- package/dist/esm/Fault.js.map +1 -0
- package/dist/esm/Flow/Annotations.d.ts +245 -0
- package/dist/esm/Flow/Annotations.d.ts.map +1 -0
- package/dist/esm/Flow/Annotations.js +110 -0
- package/dist/esm/Flow/Annotations.js.map +1 -0
- package/dist/esm/Flow/CapabilityCeiling.d.ts +21 -0
- package/dist/esm/Flow/CapabilityCeiling.d.ts.map +1 -0
- package/dist/esm/Flow/CapabilityCeiling.js +27 -0
- package/dist/esm/Flow/CapabilityCeiling.js.map +1 -0
- package/dist/esm/Flow/DeadlineExceeded.d.ts +33 -0
- package/dist/esm/Flow/DeadlineExceeded.d.ts.map +1 -0
- package/dist/esm/Flow/DeadlineExceeded.js +34 -0
- package/dist/esm/Flow/DeadlineExceeded.js.map +1 -0
- package/dist/esm/Flow/ExecutionIdRequired.d.ts +25 -0
- package/dist/esm/Flow/ExecutionIdRequired.d.ts.map +1 -0
- package/dist/esm/Flow/ExecutionIdRequired.js +30 -0
- package/dist/esm/Flow/ExecutionIdRequired.js.map +1 -0
- package/dist/esm/Flow/ExecutionIds.d.ts +80 -0
- package/dist/esm/Flow/ExecutionIds.d.ts.map +1 -0
- package/dist/esm/Flow/ExecutionIds.js +91 -0
- package/dist/esm/Flow/ExecutionIds.js.map +1 -0
- package/dist/esm/Flow/Flow.d.ts +422 -0
- package/dist/esm/Flow/Flow.d.ts.map +1 -0
- package/dist/esm/Flow/Flow.js +3 -0
- package/dist/esm/Flow/Flow.js.map +1 -0
- package/dist/esm/Flow/MaxRoundsExceeded.d.ts +35 -0
- package/dist/esm/Flow/MaxRoundsExceeded.d.ts.map +1 -0
- package/dist/esm/Flow/MaxRoundsExceeded.js +34 -0
- package/dist/esm/Flow/MaxRoundsExceeded.js.map +1 -0
- package/dist/esm/Flow/Outcome.d.ts +162 -0
- package/dist/esm/Flow/Outcome.d.ts.map +1 -0
- package/dist/esm/Flow/Outcome.js +115 -0
- package/dist/esm/Flow/Outcome.js.map +1 -0
- package/dist/esm/Flow/Result.d.ts +186 -0
- package/dist/esm/Flow/Result.d.ts.map +1 -0
- package/dist/esm/Flow/Result.js +171 -0
- package/dist/esm/Flow/Result.js.map +1 -0
- package/dist/esm/Flow/Runtime.d.ts +98 -0
- package/dist/esm/Flow/Runtime.d.ts.map +1 -0
- package/dist/esm/Flow/Runtime.js +252 -0
- package/dist/esm/Flow/Runtime.js.map +1 -0
- package/dist/esm/Flow/TypeId.d.ts +8 -0
- package/dist/esm/Flow/TypeId.d.ts.map +1 -0
- package/dist/esm/Flow/TypeId.js +9 -0
- package/dist/esm/Flow/TypeId.js.map +1 -0
- package/dist/esm/Flow/index.d.ts +17 -0
- package/dist/esm/Flow/index.d.ts.map +1 -0
- package/dist/esm/Flow/index.js +18 -0
- package/dist/esm/Flow/index.js.map +1 -0
- package/dist/esm/Flow/internal.d.ts +34 -0
- package/dist/esm/Flow/internal.d.ts.map +1 -0
- package/dist/esm/Flow/internal.js +149 -0
- package/dist/esm/Flow/internal.js.map +1 -0
- package/dist/esm/Flow/make.d.ts +135 -0
- package/dist/esm/Flow/make.d.ts.map +1 -0
- package/dist/esm/Flow/make.js +111 -0
- package/dist/esm/Flow/make.js.map +1 -0
- package/dist/esm/FlowRuntime/CancelRequestFailed.d.ts +55 -0
- package/dist/esm/FlowRuntime/CancelRequestFailed.d.ts.map +1 -0
- package/dist/esm/FlowRuntime/CancelRequestFailed.js +53 -0
- package/dist/esm/FlowRuntime/CancelRequestFailed.js.map +1 -0
- package/dist/esm/FlowRuntime/ExecutionIdentityConflict.d.ts +23 -0
- package/dist/esm/FlowRuntime/ExecutionIdentityConflict.d.ts.map +1 -0
- package/dist/esm/FlowRuntime/ExecutionIdentityConflict.js +24 -0
- package/dist/esm/FlowRuntime/ExecutionIdentityConflict.js.map +1 -0
- package/dist/esm/FlowRuntime/FlowCycleDetected.d.ts +28 -0
- package/dist/esm/FlowRuntime/FlowCycleDetected.d.ts.map +1 -0
- package/dist/esm/FlowRuntime/FlowCycleDetected.js +35 -0
- package/dist/esm/FlowRuntime/FlowCycleDetected.js.map +1 -0
- package/dist/esm/FlowRuntime/FlowExecutionNotFound.d.ts +38 -0
- package/dist/esm/FlowRuntime/FlowExecutionNotFound.d.ts.map +1 -0
- package/dist/esm/FlowRuntime/FlowExecutionNotFound.js +40 -0
- package/dist/esm/FlowRuntime/FlowExecutionNotFound.js.map +1 -0
- package/dist/esm/FlowRuntime/FlowInstance.d.ts +115 -0
- package/dist/esm/FlowRuntime/FlowInstance.d.ts.map +1 -0
- package/dist/esm/FlowRuntime/FlowInstance.js +24 -0
- package/dist/esm/FlowRuntime/FlowInstance.js.map +1 -0
- package/dist/esm/FlowRuntime/FlowRuntime.d.ts +204 -0
- package/dist/esm/FlowRuntime/FlowRuntime.d.ts.map +1 -0
- package/dist/esm/FlowRuntime/FlowRuntime.js +34 -0
- package/dist/esm/FlowRuntime/FlowRuntime.js.map +1 -0
- package/dist/esm/FlowRuntime/NodeRecord.d.ts +177 -0
- package/dist/esm/FlowRuntime/NodeRecord.d.ts.map +1 -0
- package/dist/esm/FlowRuntime/NodeRecord.js +21 -0
- package/dist/esm/FlowRuntime/NodeRecord.js.map +1 -0
- package/dist/esm/FlowRuntime/WaitingAnnotation.d.ts +69 -0
- package/dist/esm/FlowRuntime/WaitingAnnotation.d.ts.map +1 -0
- package/dist/esm/FlowRuntime/WaitingAnnotation.js +53 -0
- package/dist/esm/FlowRuntime/WaitingAnnotation.js.map +1 -0
- package/dist/esm/FlowRuntime/index.d.ts +14 -0
- package/dist/esm/FlowRuntime/index.d.ts.map +1 -0
- package/dist/esm/FlowRuntime/index.js +15 -0
- package/dist/esm/FlowRuntime/index.js.map +1 -0
- package/dist/esm/Graph.d.ts +325 -0
- package/dist/esm/Graph.d.ts.map +1 -0
- package/dist/esm/Graph.js +1485 -0
- package/dist/esm/Graph.js.map +1 -0
- package/dist/esm/HumanTask.d.ts +442 -0
- package/dist/esm/HumanTask.d.ts.map +1 -0
- package/dist/esm/HumanTask.js +798 -0
- package/dist/esm/HumanTask.js.map +1 -0
- package/dist/esm/Interpreter.d.ts +223 -0
- package/dist/esm/Interpreter.d.ts.map +1 -0
- package/dist/esm/Interpreter.js +1289 -0
- package/dist/esm/Interpreter.js.map +1 -0
- package/dist/esm/Poll.d.ts +240 -0
- package/dist/esm/Poll.d.ts.map +1 -0
- package/dist/esm/Poll.js +289 -0
- package/dist/esm/Poll.js.map +1 -0
- package/dist/esm/RetryPolicy.d.ts +273 -0
- package/dist/esm/RetryPolicy.d.ts.map +1 -0
- package/dist/esm/RetryPolicy.js +429 -0
- package/dist/esm/RetryPolicy.js.map +1 -0
- package/dist/esm/Sleep.d.ts +98 -0
- package/dist/esm/Sleep.d.ts.map +1 -0
- package/dist/esm/Sleep.js +256 -0
- package/dist/esm/Sleep.js.map +1 -0
- package/dist/esm/Stall.d.ts +173 -0
- package/dist/esm/Stall.d.ts.map +1 -0
- package/dist/esm/Stall.js +138 -0
- package/dist/esm/Stall.js.map +1 -0
- package/dist/esm/WaitFor.d.ts +109 -0
- package/dist/esm/WaitFor.d.ts.map +1 -0
- package/dist/esm/WaitFor.js +184 -0
- package/dist/esm/WaitFor.js.map +1 -0
- package/dist/esm/index.d.ts +107 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +108 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/internal/BoundedJson.d.ts +48 -0
- package/dist/esm/internal/BoundedJson.d.ts.map +1 -0
- package/dist/esm/internal/BoundedJson.js +107 -0
- package/dist/esm/internal/BoundedJson.js.map +1 -0
- package/dist/esm/internal/DeclarationSite.d.ts +135 -0
- package/dist/esm/internal/DeclarationSite.d.ts.map +1 -0
- package/dist/esm/internal/DeclarationSite.js +196 -0
- package/dist/esm/internal/DeclarationSite.js.map +1 -0
- package/dist/esm/internal/Declarations.d.ts +35 -0
- package/dist/esm/internal/Declarations.d.ts.map +1 -0
- package/dist/esm/internal/Declarations.js +43 -0
- package/dist/esm/internal/Declarations.js.map +1 -0
- package/dist/esm/internal/ExecutionMiddleware.d.ts +21 -0
- package/dist/esm/internal/ExecutionMiddleware.d.ts.map +1 -0
- package/dist/esm/internal/ExecutionMiddleware.js +13 -0
- package/dist/esm/internal/ExecutionMiddleware.js.map +1 -0
- package/dist/esm/internal/JsonSchemaSubset.d.ts +133 -0
- package/dist/esm/internal/JsonSchemaSubset.d.ts.map +1 -0
- package/dist/esm/internal/JsonSchemaSubset.js +363 -0
- package/dist/esm/internal/JsonSchemaSubset.js.map +1 -0
- package/dist/esm/internal/OutcomeMarker.d.ts +18 -0
- package/dist/esm/internal/OutcomeMarker.d.ts.map +1 -0
- package/dist/esm/internal/OutcomeMarker.js +18 -0
- package/dist/esm/internal/OutcomeMarker.js.map +1 -0
- package/docs/README.md +152 -0
- package/docs/api.md +440 -0
- package/docs/concepts/bodies-and-plans.md +167 -0
- package/docs/concepts/execution-identity.md +142 -0
- package/docs/concepts/flows-and-actions.md +129 -0
- package/docs/concepts/suspension-and-replay.md +130 -0
- package/docs/concepts/the-runtime-port.md +110 -0
- package/docs/concepts/trampoline-rounds.md +151 -0
- package/docs/guides/ask-a-person.md +184 -0
- package/docs/guides/build-a-body.md +164 -0
- package/docs/guides/cancel-and-roll-back.md +112 -0
- package/docs/guides/implement-an-action.md +155 -0
- package/docs/guides/inspect-the-plan.md +235 -0
- package/docs/guides/poll-until-ready.md +169 -0
- package/docs/guides/queue-work-to-a-worker.md +122 -0
- package/docs/guides/retry-a-failing-action.md +243 -0
- package/docs/guides/reuse-a-recorded-result.md +129 -0
- package/docs/guides/run-a-child-flow.md +108 -0
- package/docs/guides/run-an-external-job.md +86 -0
- package/docs/guides/use-a-prompt.md +38 -0
- package/docs/guides/wait-for-a-deadline.md +141 -0
- package/docs/guides/wait-for-an-external-signal.md +151 -0
- package/docs/installation.md +87 -0
- package/docs/quickstart.md +164 -0
- package/docs/reference/flow.md +1835 -0
- package/docs/testing.md +157 -0
- package/docs/troubleshooting.md +286 -0
- package/package.json +327 -3
- package/src/Action/Action.ts +333 -0
- package/src/Action/AttemptTimedOut.ts +37 -0
- package/src/Action/BoundaryMode.ts +33 -0
- package/src/Action/CacheEnvironment.ts +170 -0
- package/src/Action/ConcurrentKeylessDispatch.ts +38 -0
- package/src/Action/Context.ts +156 -0
- package/src/Action/DuplicateImplementation.ts +24 -0
- package/src/Action/FileBoundary.ts +77 -0
- package/src/Action/FileInput.ts +42 -0
- package/src/Action/Filegroup.ts +16 -0
- package/src/Action/Glob.ts +8 -0
- package/src/Action/ImplementationVersionMismatch.ts +27 -0
- package/src/Action/Implementations.ts +149 -0
- package/src/Action/InfraInterrupt.ts +30 -0
- package/src/Action/InfraInterruptRetriesExhausted.ts +37 -0
- package/src/Action/IrreversibleRetryRequiresIdempotencyKey.ts +32 -0
- package/src/Action/StepIdentity.ts +219 -0
- package/src/Action/TreeArtifact.ts +8 -0
- package/src/Action/TypeId.ts +9 -0
- package/src/Action/UncanonicalIdempotencyKey.ts +36 -0
- package/src/Action/idempotencyKey.ts +67 -0
- package/src/Action/index.ts +31 -0
- package/src/Action/make.ts +671 -0
- package/src/Action/raceAll.ts +48 -0
- package/src/Action/retry.ts +92 -0
- package/src/Deadline.ts +201 -0
- package/src/DurableClock.ts +176 -0
- package/src/DurableDeferred.ts +753 -0
- package/src/DurableQueue.ts +519 -0
- package/src/ExternalJob.ts +437 -0
- package/src/Fault.ts +279 -0
- package/src/Flow/Annotations.ts +151 -0
- package/src/Flow/CapabilityCeiling.ts +37 -0
- package/src/Flow/DeadlineExceeded.ts +40 -0
- package/src/Flow/ExecutionIdRequired.ts +36 -0
- package/src/Flow/ExecutionIds.ts +133 -0
- package/src/Flow/Flow.ts +576 -0
- package/src/Flow/MaxRoundsExceeded.ts +39 -0
- package/src/Flow/Outcome.ts +179 -0
- package/src/Flow/Result.ts +284 -0
- package/src/Flow/Runtime.ts +339 -0
- package/src/Flow/TypeId.ts +9 -0
- package/src/Flow/index.ts +19 -0
- package/src/Flow/internal.ts +237 -0
- package/src/Flow/make.ts +285 -0
- package/src/FlowRuntime/CancelRequestFailed.ts +56 -0
- package/src/FlowRuntime/ExecutionIdentityConflict.ts +32 -0
- package/src/FlowRuntime/FlowCycleDetected.ts +41 -0
- package/src/FlowRuntime/FlowExecutionNotFound.ts +46 -0
- package/src/FlowRuntime/FlowInstance.ts +128 -0
- package/src/FlowRuntime/FlowRuntime.ts +339 -0
- package/src/FlowRuntime/NodeRecord.ts +185 -0
- package/src/FlowRuntime/WaitingAnnotation.ts +85 -0
- package/src/FlowRuntime/index.ts +17 -0
- package/src/Graph.ts +1865 -0
- package/src/HumanTask.ts +1007 -0
- package/src/Interpreter.ts +1620 -0
- package/src/Poll.ts +420 -0
- package/src/RetryPolicy.ts +550 -0
- package/src/Sleep.ts +296 -0
- package/src/Stall.ts +217 -0
- package/src/WaitFor.ts +228 -0
- package/src/index.ts +125 -0
- package/src/internal/BoundedJson.ts +109 -0
- package/src/internal/DeclarationSite.ts +214 -0
- package/src/internal/Declarations.ts +49 -0
- package/src/internal/ExecutionMiddleware.ts +29 -0
- package/src/internal/JsonSchemaSubset.ts +392 -0
- package/src/internal/OutcomeMarker.ts +19 -0
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
// Deep reviewed and polished by a human on 2026-08-10.
|
|
2
|
+
/**
|
|
3
|
+
* Defines data-shaped retry policies for durable action retries.
|
|
4
|
+
*
|
|
5
|
+
* A `RetryPolicy` is a plain value — initial interval, backoff factor, cap,
|
|
6
|
+
* optional maximum attempts, optional jitter, and optional non-retryable
|
|
7
|
+
* error tags — so the next retry delay can be derived from a persisted
|
|
8
|
+
* attempt count instead of fiber-local `Schedule` state. `nextDelay` mirrors
|
|
9
|
+
* Temporal's `ExponentialRetryPolicy.ComputeNextDelay` formula, and `decide`
|
|
10
|
+
* is the engine's single retry decision point: the core default a pluggable
|
|
11
|
+
* `resolveRetry` resolution can later dispatch in front of.
|
|
12
|
+
*
|
|
13
|
+
* The historical terminal-failure schemas below use the `@smthrs/flow/` tags settled for
|
|
14
|
+
* 1.0.0-rc.0. The release candidate makes no compatibility promise to 0.x
|
|
15
|
+
* journals, and these tags freeze at the RC. Current action dispatch preserves
|
|
16
|
+
* the final declared failure when a retry policy is spent.
|
|
17
|
+
*
|
|
18
|
+
* See `docs/guides/retry-a-failing-action.md`; its "Infrastructure
|
|
19
|
+
* interrupts" section covers the interrupt retry schedule.
|
|
20
|
+
*
|
|
21
|
+
* @since 0.1.0
|
|
22
|
+
*/
|
|
23
|
+
import * as Effect from "effect/Effect";
|
|
24
|
+
import * as Option from "effect/Option";
|
|
25
|
+
import * as Random from "effect/Random";
|
|
26
|
+
import * as Schema from "effect/Schema";
|
|
27
|
+
/**
|
|
28
|
+
* Data-shaped retry policy schema.
|
|
29
|
+
*
|
|
30
|
+
* The delay before attempt `n + 1` is
|
|
31
|
+
* `min(initialMs * factor^(n - 1), maxMs)`, where `n` is the attempt that
|
|
32
|
+
* just failed. `maxAttempts` bounds the total number of attempts;
|
|
33
|
+
* `expirationMs` bounds the total wall-clock retry duration
|
|
34
|
+
* (schedule-to-close, mirroring Temporal's `expirationInterval`);
|
|
35
|
+
* `jitterRatio` spreads the final portion of each delay uniformly;
|
|
36
|
+
* `nonRetryable` lists error tags that must never be retried.
|
|
37
|
+
*
|
|
38
|
+
* The bounds are per STEP KEY, which is what makes them the provider-retry
|
|
39
|
+
* budget for one agent ask rather than a budget for the exchange the ask
|
|
40
|
+
* belongs to. A structured-output correction re-prompts under a NEW session,
|
|
41
|
+
* so the corrected ask is a different sealed step with its own attempt
|
|
42
|
+
* sequence: `maxAttempts` bounds the provider retries inside one correction
|
|
43
|
+
* session and does not bound the correction ladder, which `AgentAction`
|
|
44
|
+
* bounds separately with its own `corrections` budget.
|
|
45
|
+
*
|
|
46
|
+
* @category models
|
|
47
|
+
* @since 0.1.0
|
|
48
|
+
*/
|
|
49
|
+
const RetryPolicyFields = Schema.Struct({
|
|
50
|
+
initialMs: Schema.Number,
|
|
51
|
+
factor: Schema.Number,
|
|
52
|
+
maxMs: Schema.Number,
|
|
53
|
+
maxAttempts: Schema.optional(Schema.Number),
|
|
54
|
+
expirationMs: Schema.optional(Schema.Number),
|
|
55
|
+
jitterRatio: Schema.optional(Schema.Number),
|
|
56
|
+
nonRetryable: Schema.optional(Schema.Array(Schema.String))
|
|
57
|
+
});
|
|
58
|
+
/** Returns the first contract violation shared by decoding and construction. */
|
|
59
|
+
const validationIssue = (policy) => {
|
|
60
|
+
// Zero is refused rather than read as "retry immediately": every computed
|
|
61
|
+
// delay would be zero, so such a policy would give up on its first failure
|
|
62
|
+
// no matter what `maxAttempts` promised. Use `initialMs: 1` for a
|
|
63
|
+
// near-immediate retry.
|
|
64
|
+
if (!Number.isFinite(policy.initialMs) || policy.initialMs <= 0) {
|
|
65
|
+
return `"initialMs" must be a finite number of milliseconds greater than zero, and was ${policy.initialMs}.`;
|
|
66
|
+
}
|
|
67
|
+
if (!Number.isFinite(policy.factor) || policy.factor <= 0) {
|
|
68
|
+
return `"factor" must be a finite number greater than zero, and was ${policy.factor}.`;
|
|
69
|
+
}
|
|
70
|
+
if (!Number.isFinite(policy.maxMs) || policy.maxMs < policy.initialMs) {
|
|
71
|
+
return `"maxMs" must be a finite number of milliseconds at least as large as initialMs, and was ${policy.maxMs}.`;
|
|
72
|
+
}
|
|
73
|
+
if (policy.maxAttempts !== undefined &&
|
|
74
|
+
(!Number.isSafeInteger(policy.maxAttempts) || policy.maxAttempts < 1)) {
|
|
75
|
+
return `"maxAttempts" must be a safe integer of at least one, and was ${policy.maxAttempts}.`;
|
|
76
|
+
}
|
|
77
|
+
if (policy.expirationMs !== undefined &&
|
|
78
|
+
(!Number.isFinite(policy.expirationMs) || policy.expirationMs <= 0)) {
|
|
79
|
+
return `"expirationMs" must be a finite number of milliseconds greater than zero, and was ${policy.expirationMs}.`;
|
|
80
|
+
}
|
|
81
|
+
if (policy.jitterRatio !== undefined &&
|
|
82
|
+
(!Number.isFinite(policy.jitterRatio) || policy.jitterRatio < 0 || policy.jitterRatio > 1)) {
|
|
83
|
+
return `"jitterRatio" must be a finite number between zero and one, inclusive, and was ${policy.jitterRatio}.`;
|
|
84
|
+
}
|
|
85
|
+
return undefined;
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* Data-shaped retry policy schema. Decoding enforces the same relational
|
|
89
|
+
* contract as {@link make}; persisted data cannot bypass constructor checks.
|
|
90
|
+
*
|
|
91
|
+
* @category models
|
|
92
|
+
* @since 0.1.0
|
|
93
|
+
*/
|
|
94
|
+
export const RetryPolicy = RetryPolicyFields.check(Schema.makeFilter((policy) => validationIssue(policy) ?? true, { title: "validRetryPolicy" }));
|
|
95
|
+
/**
|
|
96
|
+
* Creates a `RetryPolicy` value after checking every numeric bound.
|
|
97
|
+
* `initialMs` must be greater than zero: a zero initial interval would
|
|
98
|
+
* compute a zero delay for every attempt, which {@link nextDelay} reads as
|
|
99
|
+
* exhausted, so the policy would never retry. `jitterRatio` must be between
|
|
100
|
+
* zero and one, inclusive, and `jitterRatio: 0` disables jitter.
|
|
101
|
+
*
|
|
102
|
+
* @category constructors
|
|
103
|
+
* @since 0.1.0
|
|
104
|
+
*/
|
|
105
|
+
export const make = (options) => {
|
|
106
|
+
const issue = validationIssue(options);
|
|
107
|
+
if (issue !== undefined)
|
|
108
|
+
throw new RangeError(`RetryPolicy.make: ${issue}`);
|
|
109
|
+
return Object.freeze({
|
|
110
|
+
initialMs: options.initialMs,
|
|
111
|
+
factor: options.factor,
|
|
112
|
+
maxMs: options.maxMs,
|
|
113
|
+
...(options.maxAttempts !== undefined ? { maxAttempts: options.maxAttempts } : {}),
|
|
114
|
+
...(options.expirationMs !== undefined ? { expirationMs: options.expirationMs } : {}),
|
|
115
|
+
...(options.jitterRatio !== undefined ? { jitterRatio: options.jitterRatio } : {}),
|
|
116
|
+
...(options.nonRetryable !== undefined
|
|
117
|
+
? { nonRetryable: Object.freeze([...options.nonRetryable]) }
|
|
118
|
+
: {})
|
|
119
|
+
});
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* The default engine retry policy.
|
|
123
|
+
*
|
|
124
|
+
* Uses a 200ms initial delay growing by 1.5x, capped at 30s, and never gives
|
|
125
|
+
* up: it declares neither `maxAttempts` nor `expirationMs`. Bound long-lived
|
|
126
|
+
* retries with `make({ ..., expirationMs })` when a wall-clock give-up is
|
|
127
|
+
* required.
|
|
128
|
+
*
|
|
129
|
+
* @category constructors
|
|
130
|
+
* @since 0.1.0
|
|
131
|
+
*/
|
|
132
|
+
export const defaultRetryPolicy = Object.freeze(make({
|
|
133
|
+
initialMs: 200,
|
|
134
|
+
factor: 1.5,
|
|
135
|
+
maxMs: 30000
|
|
136
|
+
}));
|
|
137
|
+
/**
|
|
138
|
+
* Bounded infrastructure retry: 5 seconds doubling to 5 minutes, for 2 hours.
|
|
139
|
+
*
|
|
140
|
+
* @category constructors
|
|
141
|
+
* @since 1.0.0
|
|
142
|
+
*/
|
|
143
|
+
export const transient = make({
|
|
144
|
+
initialMs: 5000,
|
|
145
|
+
factor: 2,
|
|
146
|
+
maxMs: 300000,
|
|
147
|
+
expirationMs: 7200000
|
|
148
|
+
});
|
|
149
|
+
/**
|
|
150
|
+
* Creates a `RetryAfter` decision.
|
|
151
|
+
*
|
|
152
|
+
* @category constructors
|
|
153
|
+
* @since 0.1.0
|
|
154
|
+
*/
|
|
155
|
+
export const retryAfter = (delayMs) => ({
|
|
156
|
+
_tag: "RetryAfter",
|
|
157
|
+
delayMs
|
|
158
|
+
});
|
|
159
|
+
/**
|
|
160
|
+
* Creates a `GiveUp` decision.
|
|
161
|
+
*
|
|
162
|
+
* @category constructors
|
|
163
|
+
* @since 0.1.0
|
|
164
|
+
*/
|
|
165
|
+
export const giveUp = (reason) => ({
|
|
166
|
+
_tag: "GiveUp",
|
|
167
|
+
reason
|
|
168
|
+
});
|
|
169
|
+
/**
|
|
170
|
+
* A historical retry sequence crossed its `expirationMs` wall-clock bound.
|
|
171
|
+
* Current dispatch preserves the final declared failure instead of emitting this defect.
|
|
172
|
+
*
|
|
173
|
+
* @category errors
|
|
174
|
+
* @since 0.1.0
|
|
175
|
+
*/
|
|
176
|
+
export class RetryPolicyExpired extends Schema.TaggedError()("@smthrs/flow/RetryPolicyExpired", {
|
|
177
|
+
code: Schema.Literal("retry_policy_expired").pipe(Schema.withConstructorDefault(Effect.succeed("retry_policy_expired"))),
|
|
178
|
+
actionName: Schema.String,
|
|
179
|
+
attempt: Schema.Number,
|
|
180
|
+
expirationMs: Schema.Number,
|
|
181
|
+
lastError: Schema.optional(Schema.Unknown)
|
|
182
|
+
}) {
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* A historical retry sequence exhausted its `maxAttempts` bound.
|
|
186
|
+
* Current dispatch preserves the final declared failure instead of emitting this defect.
|
|
187
|
+
*
|
|
188
|
+
* @category errors
|
|
189
|
+
* @since 0.1.0
|
|
190
|
+
*/
|
|
191
|
+
export class RetryAttemptsExhausted extends Schema.TaggedError()("@smthrs/flow/RetryAttemptsExhausted", {
|
|
192
|
+
code: Schema.Literal("retry_attempts_exhausted").pipe(Schema.withConstructorDefault(Effect.succeed("retry_attempts_exhausted"))),
|
|
193
|
+
actionName: Schema.String,
|
|
194
|
+
attempt: Schema.Number,
|
|
195
|
+
maxAttempts: Schema.Number,
|
|
196
|
+
lastError: Schema.optional(Schema.Unknown)
|
|
197
|
+
}) {
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Computes the delay before attempt `attempt + 1` from the persisted attempt
|
|
201
|
+
* count, mirroring Temporal's `ComputeNextDelay`
|
|
202
|
+
* (`common/backoff/retrypolicy.go`).
|
|
203
|
+
*
|
|
204
|
+
* `attempt` is the 1-based attempt that just failed. Returns `None` when the
|
|
205
|
+
* policy gives up: `maxAttempts` reached, a non-positive computed interval,
|
|
206
|
+
* a cap below the initial interval, or — when the policy declares
|
|
207
|
+
* `expirationMs` and the caller supplies `elapsedMs` — an elapsed duration
|
|
208
|
+
* past the expiration bound. Otherwise the delay is capped to the remaining
|
|
209
|
+
* expiration window, expiring only when that window cannot fit one more
|
|
210
|
+
* full-value (`initialMs`) attempt.
|
|
211
|
+
*
|
|
212
|
+
* Jitter is deterministic-friendly: `options.random` is a `[0, 1]` sample
|
|
213
|
+
* supplied by the caller and defaults to `1`, which leaves the delay at its
|
|
214
|
+
* un-jittered value. Use {@link nextDelayEffect} to sample the `Random`
|
|
215
|
+
* service instead. A sample outside `[0, 1]`, or a persisted `jitterRatio`
|
|
216
|
+
* above one, gives up rather than returning a delay the policy never
|
|
217
|
+
* declared. A sample of zero under `jitterRatio: 1` is a delay of zero, which
|
|
218
|
+
* retries immediately.
|
|
219
|
+
*
|
|
220
|
+
* @category attempts
|
|
221
|
+
* @since 0.1.0
|
|
222
|
+
*/
|
|
223
|
+
export const nextDelay = (policy, attempt, options) => {
|
|
224
|
+
// Persisted policies can be decoded without `make`, so these guards treat a
|
|
225
|
+
// corrupt row as terminal instead of sending an invalid delay to the engine.
|
|
226
|
+
if (validationIssue(policy) !== undefined || !Number.isSafeInteger(attempt) || attempt < 1) {
|
|
227
|
+
return Option.none();
|
|
228
|
+
}
|
|
229
|
+
if (options?.elapsedMs !== undefined &&
|
|
230
|
+
(!Number.isFinite(options.elapsedMs) || options.elapsedMs < 0)) {
|
|
231
|
+
return Option.none();
|
|
232
|
+
}
|
|
233
|
+
if (policy.maxAttempts !== undefined && attempt >= policy.maxAttempts) {
|
|
234
|
+
return Option.none();
|
|
235
|
+
}
|
|
236
|
+
if (policy.expirationMs !== undefined &&
|
|
237
|
+
options?.elapsedMs !== undefined &&
|
|
238
|
+
options.elapsedMs > policy.expirationMs) {
|
|
239
|
+
return Option.none();
|
|
240
|
+
}
|
|
241
|
+
const raw = policy.initialMs * Math.pow(policy.factor, attempt - 1);
|
|
242
|
+
if (!(raw > 0)) {
|
|
243
|
+
return Option.none();
|
|
244
|
+
}
|
|
245
|
+
let delay = Math.min(raw, policy.maxMs);
|
|
246
|
+
// Temporal caps the delay to the remaining expiration window rather than
|
|
247
|
+
// refusing outright; the below-initial check then expires sequences whose
|
|
248
|
+
// remaining window cannot fit one more full-value attempt.
|
|
249
|
+
if (policy.expirationMs !== undefined && options?.elapsedMs !== undefined) {
|
|
250
|
+
delay = Math.min(delay, Math.max(0, policy.expirationMs - options.elapsedMs));
|
|
251
|
+
}
|
|
252
|
+
if (delay < policy.initialMs) {
|
|
253
|
+
return Option.none();
|
|
254
|
+
}
|
|
255
|
+
// `validationIssue` established finite `maxMs`, so `Math.min` made the
|
|
256
|
+
// un-jittered delay finite even when the exponential itself overflowed.
|
|
257
|
+
// This check belongs before jitter conceptually: a full-jitter sample of
|
|
258
|
+
// zero is a legitimate immediate retry rather than a give-up.
|
|
259
|
+
if (policy.jitterRatio !== undefined && policy.jitterRatio > 0) {
|
|
260
|
+
// Both jitter inputs are bounded to [0, 1] where they are accepted --
|
|
261
|
+
// `make` for `jitterRatio` and this function's contract for `random` --
|
|
262
|
+
// while `random` is a public option that still needs checking here.
|
|
263
|
+
const random = options?.random ?? 1;
|
|
264
|
+
if (!(random >= 0 && random <= 1)) {
|
|
265
|
+
return Option.none();
|
|
266
|
+
}
|
|
267
|
+
// In range, the result is between `delay * (1 - jitterRatio)` and `delay`,
|
|
268
|
+
// so it is finite and never negative. A jittered value of zero retries
|
|
269
|
+
// immediately; it does not exhaust the sequence.
|
|
270
|
+
//
|
|
271
|
+
// The two terms do not sum to exactly `delay` at `random: 1`: at
|
|
272
|
+
// `jitterRatio: 0.000002` a delay of 100 rounds up to 100.00000000000001,
|
|
273
|
+
// above the policy's own cap and above the remaining expiration window.
|
|
274
|
+
// Clamping down to the un-jittered delay is what makes the upper bound
|
|
275
|
+
// stated above exact rather than approximate.
|
|
276
|
+
const jittered = delay * (1 - policy.jitterRatio) + random * delay * policy.jitterRatio;
|
|
277
|
+
delay = Math.min(delay, jittered);
|
|
278
|
+
}
|
|
279
|
+
return Option.some(delay);
|
|
280
|
+
};
|
|
281
|
+
/**
|
|
282
|
+
* Computes the next retry delay, sampling the `Random` service for jitter.
|
|
283
|
+
*
|
|
284
|
+
* Deterministic under `Random.withSeed`. Policies without a `jitterRatio`
|
|
285
|
+
* never touch the service.
|
|
286
|
+
*
|
|
287
|
+
* @category attempts
|
|
288
|
+
* @since 0.1.0
|
|
289
|
+
*/
|
|
290
|
+
export const nextDelayEffect = (policy, attempt, options) => policy.jitterRatio === undefined || policy.jitterRatio <= 0
|
|
291
|
+
? Effect.sync(() => nextDelay(policy, attempt, { elapsedMs: options?.elapsedMs }))
|
|
292
|
+
: Effect.map(Random.next, (random) => nextDelay(policy, attempt, { random, elapsedMs: options?.elapsedMs }));
|
|
293
|
+
/**
|
|
294
|
+
* Extracts the stable identity tag of an error for non-retryable matching:
|
|
295
|
+
* an own string `_tag` when present, otherwise the first own `name` descriptor
|
|
296
|
+
* found while walking a bounded prototype chain. That first descriptor decides
|
|
297
|
+
* the result: only a string data value is a tag.
|
|
298
|
+
*
|
|
299
|
+
* Descriptors keep accessors inert instead of running author code through a
|
|
300
|
+
* property read. A bounded walk also terminates when a hostile proxy reports a
|
|
301
|
+
* cyclic prototype chain; any proxy trap that throws leaves the error untagged.
|
|
302
|
+
*
|
|
303
|
+
* @category attempts
|
|
304
|
+
* @since 0.1.0
|
|
305
|
+
*/
|
|
306
|
+
export const errorTag = (error) => {
|
|
307
|
+
if (typeof error !== "object" || error === null)
|
|
308
|
+
return undefined;
|
|
309
|
+
try {
|
|
310
|
+
const tag = Object.getOwnPropertyDescriptor(error, "_tag");
|
|
311
|
+
if (tag !== undefined && "value" in tag && typeof tag.value === "string")
|
|
312
|
+
return tag.value;
|
|
313
|
+
let current = error;
|
|
314
|
+
for (let depth = 0; current !== null && depth < 64; depth++) {
|
|
315
|
+
const name = Object.getOwnPropertyDescriptor(current, "name");
|
|
316
|
+
if (name !== undefined) {
|
|
317
|
+
return "value" in name && typeof name.value === "string" ? name.value : undefined;
|
|
318
|
+
}
|
|
319
|
+
current = Object.getPrototypeOf(current);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
catch {
|
|
323
|
+
// Proxies and hostile accessors are untrusted failure payloads. An error
|
|
324
|
+
// that cannot be inspected inertly simply has no stable retry tag.
|
|
325
|
+
}
|
|
326
|
+
return undefined;
|
|
327
|
+
};
|
|
328
|
+
/**
|
|
329
|
+
* Error tags that are non-retryable by type, under every policy (issue #156).
|
|
330
|
+
*
|
|
331
|
+
* These failures are integrity verdicts that must reach the driver without an
|
|
332
|
+
* action-level retry hiding the first detection. Their persistence seams
|
|
333
|
+
* take a quarantine state action before raising them, so a later dispatch can
|
|
334
|
+
* heal, but the detecting dispatch remains a non-retryable failure. No
|
|
335
|
+
* per-callsite or per-policy opt-out exists; the tags are matched by string so
|
|
336
|
+
* the classification does not invert the package dependency direction.
|
|
337
|
+
*
|
|
338
|
+
* `AttemptEvidenceQuarantined` (issue #171) is the succeeded-attempt-row
|
|
339
|
+
* counterpart: the corrupt boundary evidence is removed while the completed
|
|
340
|
+
* outcome stays durable. It reaches the driver unretried, which parks the
|
|
341
|
+
* first detection in the `quarantine` waiting state; the next explicit resume
|
|
342
|
+
* returns the recorded outcome without re-executing the action.
|
|
343
|
+
*
|
|
344
|
+
* @category attempts
|
|
345
|
+
* @since 0.1.0
|
|
346
|
+
*/
|
|
347
|
+
export const defaultNonRetryable = [
|
|
348
|
+
"@smthrs/engine-store/CacheCorruptionDetected",
|
|
349
|
+
"@smthrs/engine-store/AttemptEvidenceQuarantined"
|
|
350
|
+
];
|
|
351
|
+
/**
|
|
352
|
+
* Whether an error is classified non-retryable, either by type (see
|
|
353
|
+
* {@link defaultNonRetryable}) or by the policy's declared tag list.
|
|
354
|
+
*
|
|
355
|
+
* @category attempts
|
|
356
|
+
* @since 0.1.0
|
|
357
|
+
*/
|
|
358
|
+
export const isNonRetryable = (policy, error) => {
|
|
359
|
+
const tag = errorTag(error);
|
|
360
|
+
if (tag === undefined) {
|
|
361
|
+
return false;
|
|
362
|
+
}
|
|
363
|
+
if (defaultNonRetryable.includes(tag)) {
|
|
364
|
+
return true;
|
|
365
|
+
}
|
|
366
|
+
return policy.nonRetryable !== undefined && policy.nonRetryable.includes(tag);
|
|
367
|
+
};
|
|
368
|
+
/**
|
|
369
|
+
* The pure core of the engine's single retry decision point.
|
|
370
|
+
*
|
|
371
|
+
* Non-retryable classification is evaluated here and nowhere else. This is
|
|
372
|
+
* the default a pluggable `resolveRetry` resolution falls back to when no
|
|
373
|
+
* plugin claims the decision.
|
|
374
|
+
*
|
|
375
|
+
* @category attempts
|
|
376
|
+
* @since 0.1.0
|
|
377
|
+
*/
|
|
378
|
+
export const decide = (policy, options) => {
|
|
379
|
+
if (isNonRetryable(policy, options.error)) {
|
|
380
|
+
return giveUp("nonRetryable");
|
|
381
|
+
}
|
|
382
|
+
return Option.match(nextDelay(policy, options.attempt, { random: options.random, elapsedMs: options.elapsedMs }), {
|
|
383
|
+
onNone: () =>
|
|
384
|
+
// A policy can report `expired` only when it declares an expiration
|
|
385
|
+
// bound and dropping elapsed time would have allowed another attempt.
|
|
386
|
+
// A malformed elapsed value still gives up because the sequence cannot
|
|
387
|
+
// continue without a trustworthy clock reading; without an expiration
|
|
388
|
+
// bound, the public terminal reason for that refusal is `exhausted`.
|
|
389
|
+
policy.expirationMs !== undefined &&
|
|
390
|
+
Option.isSome(nextDelay(policy, options.attempt, { random: options.random }))
|
|
391
|
+
? giveUp("expired")
|
|
392
|
+
: giveUp("exhausted"),
|
|
393
|
+
onSome: (delay) => {
|
|
394
|
+
// Tool failures may supply a delay instead of using policy backoff.
|
|
395
|
+
// Inspect only an own data property: failure payloads can be untrusted.
|
|
396
|
+
let hint;
|
|
397
|
+
if (typeof options.error === "object" && options.error !== null) {
|
|
398
|
+
try {
|
|
399
|
+
const descriptor = Object.getOwnPropertyDescriptor(options.error, "retryAfterMs");
|
|
400
|
+
if (descriptor !== undefined && "value" in descriptor)
|
|
401
|
+
hint = descriptor.value;
|
|
402
|
+
}
|
|
403
|
+
catch {
|
|
404
|
+
// An uninspectable failure falls back to the policy delay.
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
if (typeof hint !== "number" || !Number.isFinite(hint) || hint < 0) {
|
|
408
|
+
return retryAfter(delay);
|
|
409
|
+
}
|
|
410
|
+
return retryAfter(Math.min(hint, policy.maxMs, policy.expirationMs !== undefined && options.elapsedMs !== undefined
|
|
411
|
+
? Math.max(0, policy.expirationMs - options.elapsedMs)
|
|
412
|
+
: policy.maxMs));
|
|
413
|
+
}
|
|
414
|
+
});
|
|
415
|
+
};
|
|
416
|
+
/**
|
|
417
|
+
* Effect form of {@link decide}, sampling the `Random` service for jitter.
|
|
418
|
+
*
|
|
419
|
+
* This is the engine-facing decision function: keep calls to it behind a
|
|
420
|
+
* single decision point so a plugin hook dispatch can later be inserted in
|
|
421
|
+
* front of it without touching call sites.
|
|
422
|
+
*
|
|
423
|
+
* @category attempts
|
|
424
|
+
* @since 0.1.0
|
|
425
|
+
*/
|
|
426
|
+
export const decideEffect = (policy, options) => policy.jitterRatio === undefined || policy.jitterRatio <= 0
|
|
427
|
+
? Effect.sync(() => decide(policy, options))
|
|
428
|
+
: Effect.map(Random.next, (random) => decide(policy, { ...options, random }));
|
|
429
|
+
//# sourceMappingURL=RetryPolicy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RetryPolicy.js","sourceRoot":"","sources":["../../src/RetryPolicy.ts"],"names":[],"mappings":"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","sourcesContent":["// Deep reviewed and polished by a human on 2026-08-10.\n\n/**\n * Defines data-shaped retry policies for durable action retries.\n *\n * A `RetryPolicy` is a plain value — initial interval, backoff factor, cap,\n * optional maximum attempts, optional jitter, and optional non-retryable\n * error tags — so the next retry delay can be derived from a persisted\n * attempt count instead of fiber-local `Schedule` state. `nextDelay` mirrors\n * Temporal's `ExponentialRetryPolicy.ComputeNextDelay` formula, and `decide`\n * is the engine's single retry decision point: the core default a pluggable\n * `resolveRetry` resolution can later dispatch in front of.\n *\n * The historical terminal-failure schemas below use the `@smthrs/flow/` tags settled for\n * 1.0.0-rc.0. The release candidate makes no compatibility promise to 0.x\n * journals, and these tags freeze at the RC. Current action dispatch preserves\n * the final declared failure when a retry policy is spent.\n *\n * See `docs/guides/retry-a-failing-action.md`; its \"Infrastructure\n * interrupts\" section covers the interrupt retry schedule.\n *\n * @since 0.1.0\n */\n\nimport * as Effect from \"effect/Effect\"\nimport * as Option from \"effect/Option\"\nimport * as Random from \"effect/Random\"\nimport * as Schema from \"effect/Schema\"\n\n/**\n * Data-shaped retry policy schema.\n *\n * The delay before attempt `n + 1` is\n * `min(initialMs * factor^(n - 1), maxMs)`, where `n` is the attempt that\n * just failed. `maxAttempts` bounds the total number of attempts;\n * `expirationMs` bounds the total wall-clock retry duration\n * (schedule-to-close, mirroring Temporal's `expirationInterval`);\n * `jitterRatio` spreads the final portion of each delay uniformly;\n * `nonRetryable` lists error tags that must never be retried.\n *\n * The bounds are per STEP KEY, which is what makes them the provider-retry\n * budget for one agent ask rather than a budget for the exchange the ask\n * belongs to. A structured-output correction re-prompts under a NEW session,\n * so the corrected ask is a different sealed step with its own attempt\n * sequence: `maxAttempts` bounds the provider retries inside one correction\n * session and does not bound the correction ladder, which `AgentAction`\n * bounds separately with its own `corrections` budget.\n *\n * @category models\n * @since 0.1.0\n */\nconst RetryPolicyFields = Schema.Struct({\n initialMs: Schema.Number,\n factor: Schema.Number,\n maxMs: Schema.Number,\n maxAttempts: Schema.optional(Schema.Number),\n expirationMs: Schema.optional(Schema.Number),\n jitterRatio: Schema.optional(Schema.Number),\n nonRetryable: Schema.optional(Schema.Array(Schema.String))\n})\n\ntype RetryPolicyFields = typeof RetryPolicyFields.Type\n\n/** Returns the first contract violation shared by decoding and construction. */\nconst validationIssue = (policy: RetryPolicyFields): string | undefined => {\n // Zero is refused rather than read as \"retry immediately\": every computed\n // delay would be zero, so such a policy would give up on its first failure\n // no matter what `maxAttempts` promised. Use `initialMs: 1` for a\n // near-immediate retry.\n if (!Number.isFinite(policy.initialMs) || policy.initialMs <= 0) {\n return `\"initialMs\" must be a finite number of milliseconds greater than zero, and was ${policy.initialMs}.`\n }\n if (!Number.isFinite(policy.factor) || policy.factor <= 0) {\n return `\"factor\" must be a finite number greater than zero, and was ${policy.factor}.`\n }\n if (!Number.isFinite(policy.maxMs) || policy.maxMs < policy.initialMs) {\n return `\"maxMs\" must be a finite number of milliseconds at least as large as initialMs, and was ${policy.maxMs}.`\n }\n if (\n policy.maxAttempts !== undefined &&\n (!Number.isSafeInteger(policy.maxAttempts) || policy.maxAttempts < 1)\n ) {\n return `\"maxAttempts\" must be a safe integer of at least one, and was ${policy.maxAttempts}.`\n }\n if (\n policy.expirationMs !== undefined &&\n (!Number.isFinite(policy.expirationMs) || policy.expirationMs <= 0)\n ) {\n return `\"expirationMs\" must be a finite number of milliseconds greater than zero, and was ${policy.expirationMs}.`\n }\n if (\n policy.jitterRatio !== undefined &&\n (!Number.isFinite(policy.jitterRatio) || policy.jitterRatio < 0 || policy.jitterRatio > 1)\n ) {\n return `\"jitterRatio\" must be a finite number between zero and one, inclusive, and was ${policy.jitterRatio}.`\n }\n return undefined\n}\n\n/**\n * Data-shaped retry policy schema. Decoding enforces the same relational\n * contract as {@link make}; persisted data cannot bypass constructor checks.\n *\n * @category models\n * @since 0.1.0\n */\nexport const RetryPolicy = RetryPolicyFields.check(\n Schema.makeFilter(\n (policy) => validationIssue(policy) ?? true,\n { title: \"validRetryPolicy\" }\n )\n)\n\n/**\n * The value form of a {@link RetryPolicy}.\n *\n * @category models\n * @since 0.1.0\n */\nexport type RetryPolicy = typeof RetryPolicy.Type\n\n/**\n * Creates a `RetryPolicy` value after checking every numeric bound.\n * `initialMs` must be greater than zero: a zero initial interval would\n * compute a zero delay for every attempt, which {@link nextDelay} reads as\n * exhausted, so the policy would never retry. `jitterRatio` must be between\n * zero and one, inclusive, and `jitterRatio: 0` disables jitter.\n *\n * @category constructors\n * @since 0.1.0\n */\nexport const make = (options: {\n readonly initialMs: number\n readonly factor: number\n readonly maxMs: number\n readonly maxAttempts?: number | undefined\n readonly expirationMs?: number | undefined\n readonly jitterRatio?: number | undefined\n readonly nonRetryable?: ReadonlyArray<string> | undefined\n}): RetryPolicy => {\n const issue = validationIssue(options)\n if (issue !== undefined) throw new RangeError(`RetryPolicy.make: ${issue}`)\n return Object.freeze({\n initialMs: options.initialMs,\n factor: options.factor,\n maxMs: options.maxMs,\n ...(options.maxAttempts !== undefined ? { maxAttempts: options.maxAttempts } : {}),\n ...(options.expirationMs !== undefined ? { expirationMs: options.expirationMs } : {}),\n ...(options.jitterRatio !== undefined ? { jitterRatio: options.jitterRatio } : {}),\n ...(options.nonRetryable !== undefined\n ? { nonRetryable: Object.freeze([...options.nonRetryable]) }\n : {})\n })\n}\n\n/**\n * The default engine retry policy.\n *\n * Uses a 200ms initial delay growing by 1.5x, capped at 30s, and never gives\n * up: it declares neither `maxAttempts` nor `expirationMs`. Bound long-lived\n * retries with `make({ ..., expirationMs })` when a wall-clock give-up is\n * required.\n *\n * @category constructors\n * @since 0.1.0\n */\nexport const defaultRetryPolicy: RetryPolicy = Object.freeze(\n make({\n initialMs: 200,\n factor: 1.5,\n maxMs: 30000\n })\n)\n\n/**\n * Bounded infrastructure retry: 5 seconds doubling to 5 minutes, for 2 hours.\n *\n * @category constructors\n * @since 1.0.0\n */\nexport const transient: RetryPolicy = make({\n initialMs: 5000,\n factor: 2,\n maxMs: 300000,\n expirationMs: 7200000\n})\n\n/**\n * A retry decision: wait `delayMs` before the next attempt.\n *\n * @category models\n * @since 0.1.0\n */\nexport interface RetryAfter {\n readonly _tag: \"RetryAfter\"\n readonly delayMs: number\n}\n\n/**\n * A retry decision: stop retrying.\n *\n * @category models\n * @since 0.1.0\n */\nexport interface GiveUp {\n readonly _tag: \"GiveUp\"\n readonly reason: \"nonRetryable\" | \"exhausted\" | \"expired\"\n}\n\n/**\n * The outcome of the engine's retry decision point.\n *\n * @category models\n * @since 0.1.0\n */\nexport type RetryDecision = RetryAfter | GiveUp\n\n/**\n * Creates a `RetryAfter` decision.\n *\n * @category constructors\n * @since 0.1.0\n */\nexport const retryAfter = (delayMs: number): RetryDecision => ({\n _tag: \"RetryAfter\",\n delayMs\n})\n\n/**\n * Creates a `GiveUp` decision.\n *\n * @category constructors\n * @since 0.1.0\n */\nexport const giveUp = (reason: GiveUp[\"reason\"]): RetryDecision => ({\n _tag: \"GiveUp\",\n reason\n})\n\n/**\n * A historical retry sequence crossed its `expirationMs` wall-clock bound.\n * Current dispatch preserves the final declared failure instead of emitting this defect.\n *\n * @category errors\n * @since 0.1.0\n */\nexport class RetryPolicyExpired extends Schema.TaggedError<RetryPolicyExpired>()(\n \"@smthrs/flow/RetryPolicyExpired\",\n {\n code: Schema.Literal(\"retry_policy_expired\").pipe(\n Schema.withConstructorDefault(Effect.succeed(\"retry_policy_expired\"))\n ),\n actionName: Schema.String,\n attempt: Schema.Number,\n expirationMs: Schema.Number,\n lastError: Schema.optional(Schema.Unknown)\n }\n) {}\n\n/**\n * A historical retry sequence exhausted its `maxAttempts` bound.\n * Current dispatch preserves the final declared failure instead of emitting this defect.\n *\n * @category errors\n * @since 0.1.0\n */\nexport class RetryAttemptsExhausted extends Schema.TaggedError<RetryAttemptsExhausted>()(\n \"@smthrs/flow/RetryAttemptsExhausted\",\n {\n code: Schema.Literal(\"retry_attempts_exhausted\").pipe(\n Schema.withConstructorDefault(Effect.succeed(\"retry_attempts_exhausted\"))\n ),\n actionName: Schema.String,\n attempt: Schema.Number,\n maxAttempts: Schema.Number,\n lastError: Schema.optional(Schema.Unknown)\n }\n) {}\n\n/**\n * Computes the delay before attempt `attempt + 1` from the persisted attempt\n * count, mirroring Temporal's `ComputeNextDelay`\n * (`common/backoff/retrypolicy.go`).\n *\n * `attempt` is the 1-based attempt that just failed. Returns `None` when the\n * policy gives up: `maxAttempts` reached, a non-positive computed interval,\n * a cap below the initial interval, or — when the policy declares\n * `expirationMs` and the caller supplies `elapsedMs` — an elapsed duration\n * past the expiration bound. Otherwise the delay is capped to the remaining\n * expiration window, expiring only when that window cannot fit one more\n * full-value (`initialMs`) attempt.\n *\n * Jitter is deterministic-friendly: `options.random` is a `[0, 1]` sample\n * supplied by the caller and defaults to `1`, which leaves the delay at its\n * un-jittered value. Use {@link nextDelayEffect} to sample the `Random`\n * service instead. A sample outside `[0, 1]`, or a persisted `jitterRatio`\n * above one, gives up rather than returning a delay the policy never\n * declared. A sample of zero under `jitterRatio: 1` is a delay of zero, which\n * retries immediately.\n *\n * @category attempts\n * @since 0.1.0\n */\nexport const nextDelay = (\n policy: RetryPolicy,\n attempt: number,\n options?: {\n readonly random?: number | undefined\n readonly elapsedMs?: number | undefined\n }\n): Option.Option<number> => {\n // Persisted policies can be decoded without `make`, so these guards treat a\n // corrupt row as terminal instead of sending an invalid delay to the engine.\n if (validationIssue(policy) !== undefined || !Number.isSafeInteger(attempt) || attempt < 1) {\n return Option.none()\n }\n if (\n options?.elapsedMs !== undefined &&\n (!Number.isFinite(options.elapsedMs) || options.elapsedMs < 0)\n ) {\n return Option.none()\n }\n if (policy.maxAttempts !== undefined && attempt >= policy.maxAttempts) {\n return Option.none()\n }\n if (\n policy.expirationMs !== undefined &&\n options?.elapsedMs !== undefined &&\n options.elapsedMs > policy.expirationMs\n ) {\n return Option.none()\n }\n const raw = policy.initialMs * Math.pow(policy.factor, attempt - 1)\n if (!(raw > 0)) {\n return Option.none()\n }\n let delay = Math.min(raw, policy.maxMs)\n // Temporal caps the delay to the remaining expiration window rather than\n // refusing outright; the below-initial check then expires sequences whose\n // remaining window cannot fit one more full-value attempt.\n if (policy.expirationMs !== undefined && options?.elapsedMs !== undefined) {\n delay = Math.min(delay, Math.max(0, policy.expirationMs - options.elapsedMs))\n }\n if (delay < policy.initialMs) {\n return Option.none()\n }\n // `validationIssue` established finite `maxMs`, so `Math.min` made the\n // un-jittered delay finite even when the exponential itself overflowed.\n // This check belongs before jitter conceptually: a full-jitter sample of\n // zero is a legitimate immediate retry rather than a give-up.\n if (policy.jitterRatio !== undefined && policy.jitterRatio > 0) {\n // Both jitter inputs are bounded to [0, 1] where they are accepted --\n // `make` for `jitterRatio` and this function's contract for `random` --\n // while `random` is a public option that still needs checking here.\n const random = options?.random ?? 1\n if (!(random >= 0 && random <= 1)) {\n return Option.none()\n }\n // In range, the result is between `delay * (1 - jitterRatio)` and `delay`,\n // so it is finite and never negative. A jittered value of zero retries\n // immediately; it does not exhaust the sequence.\n //\n // The two terms do not sum to exactly `delay` at `random: 1`: at\n // `jitterRatio: 0.000002` a delay of 100 rounds up to 100.00000000000001,\n // above the policy's own cap and above the remaining expiration window.\n // Clamping down to the un-jittered delay is what makes the upper bound\n // stated above exact rather than approximate.\n const jittered = delay * (1 - policy.jitterRatio) + random * delay * policy.jitterRatio\n delay = Math.min(delay, jittered)\n }\n return Option.some(delay)\n}\n\n/**\n * Computes the next retry delay, sampling the `Random` service for jitter.\n *\n * Deterministic under `Random.withSeed`. Policies without a `jitterRatio`\n * never touch the service.\n *\n * @category attempts\n * @since 0.1.0\n */\nexport const nextDelayEffect = (\n policy: RetryPolicy,\n attempt: number,\n options?: { readonly elapsedMs?: number | undefined }\n): Effect.Effect<Option.Option<number>> =>\n policy.jitterRatio === undefined || policy.jitterRatio <= 0\n ? Effect.sync(() => nextDelay(policy, attempt, { elapsedMs: options?.elapsedMs }))\n : Effect.map(Random.next, (random) => nextDelay(policy, attempt, { random, elapsedMs: options?.elapsedMs }))\n\n/**\n * Extracts the stable identity tag of an error for non-retryable matching:\n * an own string `_tag` when present, otherwise the first own `name` descriptor\n * found while walking a bounded prototype chain. That first descriptor decides\n * the result: only a string data value is a tag.\n *\n * Descriptors keep accessors inert instead of running author code through a\n * property read. A bounded walk also terminates when a hostile proxy reports a\n * cyclic prototype chain; any proxy trap that throws leaves the error untagged.\n *\n * @category attempts\n * @since 0.1.0\n */\nexport const errorTag = (error: unknown): string | undefined => {\n if (typeof error !== \"object\" || error === null) return undefined\n try {\n const tag = Object.getOwnPropertyDescriptor(error, \"_tag\")\n if (tag !== undefined && \"value\" in tag && typeof tag.value === \"string\") return tag.value\n\n let current: object | null = error\n for (let depth = 0; current !== null && depth < 64; depth++) {\n const name = Object.getOwnPropertyDescriptor(current, \"name\")\n if (name !== undefined) {\n return \"value\" in name && typeof name.value === \"string\" ? name.value : undefined\n }\n current = Object.getPrototypeOf(current)\n }\n } catch {\n // Proxies and hostile accessors are untrusted failure payloads. An error\n // that cannot be inspected inertly simply has no stable retry tag.\n }\n return undefined\n}\n\n/**\n * Error tags that are non-retryable by type, under every policy (issue #156).\n *\n * These failures are integrity verdicts that must reach the driver without an\n * action-level retry hiding the first detection. Their persistence seams\n * take a quarantine state action before raising them, so a later dispatch can\n * heal, but the detecting dispatch remains a non-retryable failure. No\n * per-callsite or per-policy opt-out exists; the tags are matched by string so\n * the classification does not invert the package dependency direction.\n *\n * `AttemptEvidenceQuarantined` (issue #171) is the succeeded-attempt-row\n * counterpart: the corrupt boundary evidence is removed while the completed\n * outcome stays durable. It reaches the driver unretried, which parks the\n * first detection in the `quarantine` waiting state; the next explicit resume\n * returns the recorded outcome without re-executing the action.\n *\n * @category attempts\n * @since 0.1.0\n */\nexport const defaultNonRetryable: ReadonlyArray<string> = [\n \"@smthrs/engine-store/CacheCorruptionDetected\",\n \"@smthrs/engine-store/AttemptEvidenceQuarantined\"\n]\n\n/**\n * Whether an error is classified non-retryable, either by type (see\n * {@link defaultNonRetryable}) or by the policy's declared tag list.\n *\n * @category attempts\n * @since 0.1.0\n */\nexport const isNonRetryable = (policy: RetryPolicy, error: unknown): boolean => {\n const tag = errorTag(error)\n if (tag === undefined) {\n return false\n }\n if (defaultNonRetryable.includes(tag)) {\n return true\n }\n return policy.nonRetryable !== undefined && policy.nonRetryable.includes(tag)\n}\n\n/**\n * The pure core of the engine's single retry decision point.\n *\n * Non-retryable classification is evaluated here and nowhere else. This is\n * the default a pluggable `resolveRetry` resolution falls back to when no\n * plugin claims the decision.\n *\n * @category attempts\n * @since 0.1.0\n */\nexport const decide = (\n policy: RetryPolicy,\n options: {\n readonly attempt: number\n readonly error: unknown\n readonly random?: number | undefined\n readonly elapsedMs?: number | undefined\n }\n): RetryDecision => {\n if (isNonRetryable(policy, options.error)) {\n return giveUp(\"nonRetryable\")\n }\n return Option.match(\n nextDelay(policy, options.attempt, { random: options.random, elapsedMs: options.elapsedMs }),\n {\n onNone: () =>\n // A policy can report `expired` only when it declares an expiration\n // bound and dropping elapsed time would have allowed another attempt.\n // A malformed elapsed value still gives up because the sequence cannot\n // continue without a trustworthy clock reading; without an expiration\n // bound, the public terminal reason for that refusal is `exhausted`.\n policy.expirationMs !== undefined &&\n Option.isSome(nextDelay(policy, options.attempt, { random: options.random }))\n ? giveUp(\"expired\")\n : giveUp(\"exhausted\"),\n onSome: (delay) => {\n // Tool failures may supply a delay instead of using policy backoff.\n // Inspect only an own data property: failure payloads can be untrusted.\n let hint: unknown\n if (typeof options.error === \"object\" && options.error !== null) {\n try {\n const descriptor = Object.getOwnPropertyDescriptor(options.error, \"retryAfterMs\")\n if (descriptor !== undefined && \"value\" in descriptor) hint = descriptor.value\n } catch {\n // An uninspectable failure falls back to the policy delay.\n }\n }\n if (typeof hint !== \"number\" || !Number.isFinite(hint) || hint < 0) {\n return retryAfter(delay)\n }\n return retryAfter(Math.min(\n hint,\n policy.maxMs,\n policy.expirationMs !== undefined && options.elapsedMs !== undefined\n ? Math.max(0, policy.expirationMs - options.elapsedMs)\n : policy.maxMs\n ))\n }\n }\n )\n}\n\n/**\n * Effect form of {@link decide}, sampling the `Random` service for jitter.\n *\n * This is the engine-facing decision function: keep calls to it behind a\n * single decision point so a plugin hook dispatch can later be inserted in\n * front of it without touching call sites.\n *\n * @category attempts\n * @since 0.1.0\n */\nexport const decideEffect = (\n policy: RetryPolicy,\n options: {\n readonly attempt: number\n readonly error: unknown\n readonly elapsedMs?: number | undefined\n }\n): Effect.Effect<RetryDecision> =>\n policy.jitterRatio === undefined || policy.jitterRatio <= 0\n ? Effect.sync(() => decide(policy, options))\n : Effect.map(Random.next, (random) => decide(policy, { ...options, random }))\n"]}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The system timer, as an ordinary declared action.
|
|
3
|
+
*
|
|
4
|
+
* `docs/concepts/flows-and-actions.md` names the timer primitive a
|
|
5
|
+
* gap and says how to close it: ship it over the existing `DurableClock`, so a
|
|
6
|
+
* wait is a visible, keyed plan node rather than a second execution mechanism.
|
|
7
|
+
* That is this module. {@link action} is a plain `Action.make` declaration —
|
|
8
|
+
* it appears in a catalog, `.call()` records a node, and `Graph.build` puts that
|
|
9
|
+
* node in the plan beside every other step — and {@link layer} is the
|
|
10
|
+
* implementation the hosts that can run a timer provide.
|
|
11
|
+
*
|
|
12
|
+
* The wait itself is `DurableClock`'s, not a new one. The implementation arms
|
|
13
|
+
* the durable clock and awaits its deferred, which is what parks the execution;
|
|
14
|
+
* the park is declared through the ordinary waiting vocabulary
|
|
15
|
+
* ({@link module:WaitingAnnotation.annotateWaiting}) under `timer`, with the
|
|
16
|
+
* deadline as `wakeAt`, so a durable driver records the same waiting row it
|
|
17
|
+
* records for a hand-written `DurableClock.sleep`. Replay is the deferred's:
|
|
18
|
+
* once the clock has fired, its result is persisted, so a re-driven round reads
|
|
19
|
+
* it and runs straight through instead of parking a second time.
|
|
20
|
+
*
|
|
21
|
+
* Which clock a wait arms is the dispatch's own, read from
|
|
22
|
+
* {@link module:Context.CurrentInvocationKey}: a keyed node already owns an
|
|
23
|
+
* identity that survives replay and separates two identical calls, so the timer
|
|
24
|
+
* inherits it rather than being addressed by the payload it was called with.
|
|
25
|
+
*
|
|
26
|
+
* @since 0.1.0
|
|
27
|
+
*/
|
|
28
|
+
import type * as Crypto from "effect/Crypto";
|
|
29
|
+
import type * as Layer from "effect/Layer";
|
|
30
|
+
import * as Schema from "effect/Schema";
|
|
31
|
+
import * as Action from "./Action/index.ts";
|
|
32
|
+
import type { FlowRuntime } from "./FlowRuntime/FlowRuntime.ts";
|
|
33
|
+
declare const SleepRequestInvalid_base: Schema.Class<SleepRequestInvalid, Schema.TaggedStruct<"@smthrs/flow/SleepRequestInvalid", {
|
|
34
|
+
readonly code: Schema.Literals<readonly ["missing_deadline", "ambiguous_deadline", "invalid_deadline"]>;
|
|
35
|
+
readonly message: Schema.String;
|
|
36
|
+
}>, import("effect/Cause").YieldableError>;
|
|
37
|
+
/**
|
|
38
|
+
* A sleep whose payload does not name exactly one deadline.
|
|
39
|
+
*
|
|
40
|
+
* A payload carries a relative `millis` or an absolute `until`, and naming
|
|
41
|
+
* both, or neither, leaves no deadline to arm a clock with. It is a typed
|
|
42
|
+
* failure rather than a defect because the payload of a driven node is
|
|
43
|
+
* assembled from plan values, so an author's mistake is recoverable through
|
|
44
|
+
* `Node.catch` like any other declared failure.
|
|
45
|
+
*
|
|
46
|
+
* @category errors
|
|
47
|
+
* @since 0.1.0
|
|
48
|
+
*/
|
|
49
|
+
export declare class SleepRequestInvalid extends SleepRequestInvalid_base {
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* The tag the sleep declaration is catalogued and resolved under.
|
|
53
|
+
*
|
|
54
|
+
* @category constructors
|
|
55
|
+
* @since 0.1.0
|
|
56
|
+
*/
|
|
57
|
+
export declare const tag = "system/sleep";
|
|
58
|
+
/**
|
|
59
|
+
* The declared sleep action: `millis` from now, or an absolute `until`.
|
|
60
|
+
*
|
|
61
|
+
* **When to use**
|
|
62
|
+
*
|
|
63
|
+
* Use it in a body wherever a round has to wait for time to pass —
|
|
64
|
+
* `Sleep.action.call({ millis: 60_000 })` — rather than reaching for
|
|
65
|
+
* `DurableClock.sleep`, which is only callable from a handler and leaves
|
|
66
|
+
* nothing in the plan. A sleep node is keyed, inspectable, and skippable by a
|
|
67
|
+
* branch exactly like an action that does work.
|
|
68
|
+
*
|
|
69
|
+
* Two waits of the same length are two waits: `sleep(1h)` followed by
|
|
70
|
+
* `sleep(1h)` sleeps for two hours, because each call is its own node with its
|
|
71
|
+
* own identity, exactly as two calls of any other declaration are.
|
|
72
|
+
*
|
|
73
|
+
* @category constructors
|
|
74
|
+
* @since 0.1.0
|
|
75
|
+
*/
|
|
76
|
+
export declare const action: Action.Declared<typeof tag, Schema.Struct<{
|
|
77
|
+
readonly millis: Schema.optional<Schema.Number>;
|
|
78
|
+
readonly until: Schema.optional<Schema.Number>;
|
|
79
|
+
}>, typeof Schema.Void, typeof SleepRequestInvalid, never>;
|
|
80
|
+
/**
|
|
81
|
+
* The sleep implementation: arm the durable clock, park under `timer`, wake.
|
|
82
|
+
*
|
|
83
|
+
* Provide it beside the other action implementation layers a body calls, over
|
|
84
|
+
* the {@link module:Implementations.layerImplementations} table they file
|
|
85
|
+
* themselves in:
|
|
86
|
+
*
|
|
87
|
+
* ```ts
|
|
88
|
+
* Layer.mergeAll(Sleep.layer, Interpreter.layer(Pipeline)).pipe(
|
|
89
|
+
* Layer.provideMerge(Action.layerImplementations)
|
|
90
|
+
* )
|
|
91
|
+
* ```
|
|
92
|
+
*
|
|
93
|
+
* @category layers
|
|
94
|
+
* @since 0.1.0
|
|
95
|
+
*/
|
|
96
|
+
export declare const layer: Layer.Layer<never, never, Crypto.Crypto | FlowRuntime>;
|
|
97
|
+
export {};
|
|
98
|
+
//# sourceMappingURL=Sleep.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Sleep.d.ts","sourceRoot":"","sources":["../../src/Sleep.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAG5C,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAE3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;;;;;AAG/D;;;;;;;;;;;GAWG;AACH,qBAAa,mBAAoB,SAAQ,wBAMxC;CAAG;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,GAAG,iBAAiB,CAAA;AAEjC;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,QAAQ,CAClC,OAAO,GAAG,EACV,MAAM,CAAC,MAAM,CAAC;IACZ,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC/C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;CAC/C,CAAC,EACF,OAAO,MAAM,CAAC,IAAI,EAClB,OAAO,mBAAmB,EAC1B,KAAK,CASL,CAAA;AA0IF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,GAAG,WAAW,CAuCxE,CAAA"}
|