@smthrs/flow 0.0.0-stage → 1.0.0-rc.3
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 +160 -0
- package/LICENSE +21 -0
- package/README.md +210 -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 +373 -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 +105 -0
- package/dist/cjs/Deadline.d.ts.map +1 -0
- package/dist/cjs/Deadline.js +104 -0
- package/dist/cjs/Deadline.js.map +7 -0
- package/dist/cjs/DurableClock.d.ts +61 -0
- package/dist/cjs/DurableClock.d.ts.map +1 -0
- package/dist/cjs/DurableClock.js +90 -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 +338 -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 +160 -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 +134 -0
- package/dist/cjs/Flow/make.d.ts.map +1 -0
- package/dist/cjs/Flow/make.js +104 -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 +198 -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 +175 -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 +1022 -0
- package/dist/cjs/Graph.js.map +7 -0
- package/dist/cjs/HumanTask.d.ts +440 -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 +222 -0
- package/dist/cjs/Interpreter.d.ts.map +1 -0
- package/dist/cjs/Interpreter.js +888 -0
- package/dist/cjs/Interpreter.js.map +7 -0
- package/dist/cjs/Poll.d.ts +238 -0
- package/dist/cjs/Poll.d.ts.map +1 -0
- package/dist/cjs/Poll.js +150 -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 +133 -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 +405 -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 +105 -0
- package/dist/esm/Deadline.d.ts.map +1 -0
- package/dist/esm/Deadline.js +152 -0
- package/dist/esm/Deadline.js.map +1 -0
- package/dist/esm/DurableClock.d.ts +61 -0
- package/dist/esm/DurableClock.d.ts.map +1 -0
- package/dist/esm/DurableClock.js +75 -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 +231 -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 +134 -0
- package/dist/esm/Flow/make.d.ts.map +1 -0
- package/dist/esm/Flow/make.js +106 -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 +198 -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 +175 -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 +1482 -0
- package/dist/esm/Graph.js.map +1 -0
- package/dist/esm/HumanTask.d.ts +440 -0
- package/dist/esm/HumanTask.d.ts.map +1 -0
- package/dist/esm/HumanTask.js +794 -0
- package/dist/esm/HumanTask.js.map +1 -0
- package/dist/esm/Interpreter.d.ts +222 -0
- package/dist/esm/Interpreter.d.ts.map +1 -0
- package/dist/esm/Interpreter.js +1269 -0
- package/dist/esm/Interpreter.js.map +1 -0
- package/dist/esm/Poll.d.ts +238 -0
- package/dist/esm/Poll.d.ts.map +1 -0
- package/dist/esm/Poll.js +282 -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 +230 -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 +150 -0
- package/docs/api.md +436 -0
- package/docs/concepts/bodies-and-plans.md +157 -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 +161 -0
- package/docs/guides/cancel-and-roll-back.md +112 -0
- package/docs/guides/implement-an-action.md +147 -0
- package/docs/guides/inspect-the-plan.md +154 -0
- package/docs/guides/poll-until-ready.md +167 -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 +122 -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 +82 -0
- package/docs/quickstart.md +155 -0
- package/docs/reference/flow.md +1831 -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 +657 -0
- package/src/Action/raceAll.ts +48 -0
- package/src/Action/retry.ts +92 -0
- package/src/Deadline.ts +185 -0
- package/src/DurableClock.ts +133 -0
- package/src/DurableDeferred.ts +753 -0
- package/src/DurableQueue.ts +519 -0
- package/src/ExternalJob.ts +432 -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 +309 -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 +279 -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 +333 -0
- package/src/FlowRuntime/NodeRecord.ts +183 -0
- package/src/FlowRuntime/WaitingAnnotation.ts +85 -0
- package/src/FlowRuntime/index.ts +17 -0
- package/src/Graph.ts +1860 -0
- package/src/HumanTask.ts +1003 -0
- package/src/Interpreter.ts +1593 -0
- package/src/Poll.ts +414 -0
- package/src/RetryPolicy.ts +550 -0
- package/src/Sleep.ts +267 -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
package/src/Fault.ts
ADDED
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One typed fault for every failure, and the one response table that reads it.
|
|
3
|
+
*
|
|
4
|
+
* Each owner of an error union registers its codes here with a class, so a
|
|
5
|
+
* failure crosses every seam as `{ class, tag }` rather than as prose. The
|
|
6
|
+
* control plane stamps it on a failed run, the gateway carries it to the
|
|
7
|
+
* worker, and every surface reads the same record.
|
|
8
|
+
*
|
|
9
|
+
* @since 1.0.0
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import * as Clock from "effect/Clock"
|
|
13
|
+
import * as Effect from "effect/Effect"
|
|
14
|
+
import * as Result from "effect/Result"
|
|
15
|
+
import * as Schema from "effect/Schema"
|
|
16
|
+
import type { HumanAnswerInvalid, HumanTaskFailed } from "./HumanTask.ts"
|
|
17
|
+
import * as RetryPolicy from "./RetryPolicy.ts"
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Whose problem a failure is. The first five are the wire registry; `factory`
|
|
21
|
+
* (the factory's own work failed and a replan may fix it) and `policy` (a cap
|
|
22
|
+
* stopped it) are the factory's.
|
|
23
|
+
*
|
|
24
|
+
* @category models
|
|
25
|
+
* @since 1.0.0
|
|
26
|
+
*/
|
|
27
|
+
export const Class = Schema.Literals(["user", "wait", "infra", "dependency", "bug", "factory", "policy"])
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* The decoded form of {@link Class}.
|
|
31
|
+
*
|
|
32
|
+
* @category models
|
|
33
|
+
* @since 1.0.0
|
|
34
|
+
*/
|
|
35
|
+
export type Class = typeof Class.Type
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* What happens next. `very_hard` is a ladder state the worker reaches, not a class.
|
|
39
|
+
*
|
|
40
|
+
* @category models
|
|
41
|
+
* @since 1.0.0
|
|
42
|
+
*/
|
|
43
|
+
export const Response = Schema.Literals(["retry", "backup", "park", "replan", "very_hard", "help", "close", "stop"])
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* The decoded form of {@link Response}.
|
|
47
|
+
*
|
|
48
|
+
* @category models
|
|
49
|
+
* @since 1.0.0
|
|
50
|
+
*/
|
|
51
|
+
export type Response = typeof Response.Type
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* The record stamped on a failed run. `tag` is `<_tag>/<code>`, or `<_tag>`
|
|
55
|
+
* for an error without a code.
|
|
56
|
+
*
|
|
57
|
+
* @category models
|
|
58
|
+
* @since 1.0.0
|
|
59
|
+
*/
|
|
60
|
+
export const Fault = Schema.Struct({ class: Class, tag: Schema.String })
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* The decoded form of {@link Fault}.
|
|
64
|
+
*
|
|
65
|
+
* @category models
|
|
66
|
+
* @since 1.0.0
|
|
67
|
+
*/
|
|
68
|
+
export type Fault = typeof Fault.Type
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* One class per code of an owner's union. `satisfies Rows<Code>` at the owner
|
|
72
|
+
* makes a new code without a class a compile error.
|
|
73
|
+
*
|
|
74
|
+
* @category models
|
|
75
|
+
* @since 1.0.0
|
|
76
|
+
*/
|
|
77
|
+
export type Rows<Code extends string> = Readonly<Record<Code, Class>>
|
|
78
|
+
|
|
79
|
+
interface Row {
|
|
80
|
+
readonly table: Class | Readonly<Record<string, Class>>
|
|
81
|
+
readonly field: string
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/*
|
|
85
|
+
* One registry per process, not per module instance: a process that loads
|
|
86
|
+
* both the ESM and the CommonJS build still reads every owner's rows.
|
|
87
|
+
*/
|
|
88
|
+
const rows: Map<string, Row> = ((globalThis as { [key: symbol]: Map<string, Row> | undefined })[
|
|
89
|
+
Symbol.for("@smthrs/flow/Fault/rows")
|
|
90
|
+
] ??= new Map())
|
|
91
|
+
|
|
92
|
+
const same = (left: Row, right: Row): boolean =>
|
|
93
|
+
left.field === right.field && JSON.stringify(left.table) === JSON.stringify(right.table)
|
|
94
|
+
|
|
95
|
+
/** Reads a property without running a throwing getter or proxy trap into the caller. */
|
|
96
|
+
const read = (value: object, key: string): unknown => {
|
|
97
|
+
try {
|
|
98
|
+
return (value as Record<string, unknown>)[key]
|
|
99
|
+
} catch {
|
|
100
|
+
return undefined
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Registers an owner's error tag: one class for the whole tag, or one per
|
|
106
|
+
* value of its `field` (`code` unless the union names it otherwise). A value
|
|
107
|
+
* the table does not name is `bug`. Registering a tag again with the same
|
|
108
|
+
* rows is a no-op (a module loaded twice); with different rows it throws,
|
|
109
|
+
* because two owners disagreeing about one tag is a defect.
|
|
110
|
+
*
|
|
111
|
+
* @category constructors
|
|
112
|
+
* @since 1.0.0
|
|
113
|
+
*/
|
|
114
|
+
export const register = <Code extends string>(tag: string, table: Class | Rows<Code>, field = "code"): void => {
|
|
115
|
+
const row: Row = { table, field }
|
|
116
|
+
const existing = rows.get(tag)
|
|
117
|
+
if (existing !== undefined && !same(existing, row)) {
|
|
118
|
+
throw new Error(`Fault: ${tag} is already registered with different rows`)
|
|
119
|
+
}
|
|
120
|
+
rows.set(tag, row)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const classOf = (row: Row, code: string | undefined): Class =>
|
|
124
|
+
typeof row.table === "string" ? row.table : code !== undefined && Object.hasOwn(row.table, code)
|
|
125
|
+
? row.table[code]!
|
|
126
|
+
: "bug"
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Every tag registered so far. The sweep test reads it.
|
|
130
|
+
*
|
|
131
|
+
* @category getters
|
|
132
|
+
* @since 1.0.0
|
|
133
|
+
*/
|
|
134
|
+
export const registered = (): ReadonlySet<string> => new Set(rows.keys())
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* The fault of a failure. Walks `cause` and answers the innermost registered
|
|
138
|
+
* tag, because a wrapper names where a failure surfaced and its cause names
|
|
139
|
+
* why: a harness `model_failed` over a model `quota_exceeded` is a wait. A
|
|
140
|
+
* failure no owner registered is a `bug`.
|
|
141
|
+
*
|
|
142
|
+
* @category constructors
|
|
143
|
+
* @since 1.0.0
|
|
144
|
+
*/
|
|
145
|
+
export const of = (error: unknown): Fault => {
|
|
146
|
+
let found: Fault = { class: "bug", tag: "unregistered" }
|
|
147
|
+
let current: unknown = error
|
|
148
|
+
const seen = new Set<unknown>()
|
|
149
|
+
for (let depth = 0; depth < 16 && typeof current === "object" && current !== null && !seen.has(current); depth++) {
|
|
150
|
+
seen.add(current)
|
|
151
|
+
const tag = RetryPolicy.errorTag(current)
|
|
152
|
+
const row = tag === undefined ? undefined : rows.get(tag)
|
|
153
|
+
if (row !== undefined) {
|
|
154
|
+
const value = read(current, row.field)
|
|
155
|
+
const code = typeof value === "string" ? value : undefined
|
|
156
|
+
found = { class: classOf(row, code), tag: code === undefined ? tag! : `${tag}/${code}` }
|
|
157
|
+
}
|
|
158
|
+
current = read(current, "cause")
|
|
159
|
+
}
|
|
160
|
+
return found
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Retries typed infrastructure failures of an effect the caller can safely repeat.
|
|
165
|
+
* Preserves its error channel when the bounded transient policy expires.
|
|
166
|
+
* Defects and interruption propagate without retry.
|
|
167
|
+
*
|
|
168
|
+
* @category combinators
|
|
169
|
+
* @since 1.0.0
|
|
170
|
+
*/
|
|
171
|
+
export const retryTransient = <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> =>
|
|
172
|
+
Effect.gen(function*() {
|
|
173
|
+
const start = yield* Clock.currentTimeMillis
|
|
174
|
+
let attempt = 1
|
|
175
|
+
while (true) {
|
|
176
|
+
const result = yield* Effect.result(effect)
|
|
177
|
+
if (Result.isSuccess(result)) return result.success
|
|
178
|
+
if (of(result.failure).class !== "infra") return yield* Effect.fail(result.failure)
|
|
179
|
+
const decision = yield* RetryPolicy.decideEffect(RetryPolicy.transient, {
|
|
180
|
+
attempt,
|
|
181
|
+
error: result.failure,
|
|
182
|
+
elapsedMs: (yield* Clock.currentTimeMillis) - start
|
|
183
|
+
})
|
|
184
|
+
if (decision._tag === "GiveUp") return yield* Effect.fail(result.failure)
|
|
185
|
+
yield* Effect.sleep(decision.delayMs)
|
|
186
|
+
attempt++
|
|
187
|
+
}
|
|
188
|
+
})
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* What the responder knows when it picks a response.
|
|
192
|
+
*
|
|
193
|
+
* @category models
|
|
194
|
+
* @since 1.0.0
|
|
195
|
+
*/
|
|
196
|
+
export interface State {
|
|
197
|
+
/** The action attempt that just failed. */
|
|
198
|
+
readonly attempt: number
|
|
199
|
+
/** Seats not tried in this frame and not cooling. */
|
|
200
|
+
readonly seatsLeft: number
|
|
201
|
+
/** Quota parks left before the run stops (`QuotaPolicy.defaultMaxParks` less those spent). */
|
|
202
|
+
readonly parksLeft: number
|
|
203
|
+
/** Replans spent: the worker's attempt minus one. */
|
|
204
|
+
readonly replans: number
|
|
205
|
+
/** Whether the item already had its very-hard continuation. */
|
|
206
|
+
readonly veryHard: boolean
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* The one ladder. A new class does not compile until it has a row.
|
|
211
|
+
*
|
|
212
|
+
* @category constructors
|
|
213
|
+
* @since 1.0.0
|
|
214
|
+
*/
|
|
215
|
+
export const respond = (fault: Fault, state: State): Response =>
|
|
216
|
+
({
|
|
217
|
+
wait: state.seatsLeft > 0 ? "backup" : state.parksLeft > 0 ? "park" : "stop",
|
|
218
|
+
dependency: state.seatsLeft > 0 ? "backup" : state.attempt < 3 ? "retry" : "stop",
|
|
219
|
+
infra: state.attempt < 3 ? "retry" : "park",
|
|
220
|
+
factory: state.replans < 2 ? "replan" : !state.veryHard ? "very_hard" : "help",
|
|
221
|
+
user: fault.tag === "coding/Error/declined" ? "close" : "help",
|
|
222
|
+
policy: "stop",
|
|
223
|
+
bug: "stop"
|
|
224
|
+
} as const satisfies Record<Class, Response>)[fault.class]
|
|
225
|
+
|
|
226
|
+
register("@smthrs/flow/InfraInterrupt", "infra")
|
|
227
|
+
register("@smthrs/flow/InfraInterruptRetriesExhausted", "infra")
|
|
228
|
+
register(
|
|
229
|
+
"@smthrs/flow/HumanTaskFailed",
|
|
230
|
+
{
|
|
231
|
+
rejected: "user",
|
|
232
|
+
timeout: "factory",
|
|
233
|
+
request_invalid: "bug"
|
|
234
|
+
} satisfies Rows<HumanTaskFailed["code"]>
|
|
235
|
+
)
|
|
236
|
+
register(
|
|
237
|
+
"@smthrs/flow/HumanAnswerInvalid",
|
|
238
|
+
{
|
|
239
|
+
answer_invalid: "user",
|
|
240
|
+
answer_not_open: "user"
|
|
241
|
+
} satisfies Rows<HumanAnswerInvalid["code"]>
|
|
242
|
+
)
|
|
243
|
+
// A spent polling or retry budget is the thing polled not answering in time.
|
|
244
|
+
register("@smthrs/flow/PollExhausted", "dependency")
|
|
245
|
+
register("@smthrs/flow/RetryAttemptsExhausted", "dependency")
|
|
246
|
+
register("@smthrs/flow/RetryPolicyExpired", "dependency")
|
|
247
|
+
// An attempt that outlives its bound is the thing it waited on not answering in time.
|
|
248
|
+
register("@smthrs/flow/AttemptTimedOut", "dependency")
|
|
249
|
+
// Invariant refusals: the program, not the person or the platform, is wrong.
|
|
250
|
+
for (
|
|
251
|
+
const tag of [
|
|
252
|
+
"MaxRoundsExceeded",
|
|
253
|
+
"IrreversibleRetryRequiresIdempotencyKey",
|
|
254
|
+
"WaitForRequestInvalid",
|
|
255
|
+
"SleepRequestInvalid",
|
|
256
|
+
"DurableDeferred/TokenInvalid",
|
|
257
|
+
"ExecutionIdRequired",
|
|
258
|
+
"FlowCycleDetected",
|
|
259
|
+
"CancelRequestFailed",
|
|
260
|
+
"Action/DuplicateImplementation",
|
|
261
|
+
"ConcurrentKeylessDispatch",
|
|
262
|
+
"FlowExecutionNotFound",
|
|
263
|
+
"ImplementationVersionMismatch",
|
|
264
|
+
"UncanonicalIdempotencyKey",
|
|
265
|
+
"InterpreterError"
|
|
266
|
+
]
|
|
267
|
+
) register(`@smthrs/flow/${tag}`, "bug")
|
|
268
|
+
|
|
269
|
+
// Lower host seams do not depend on flow authoring. Register their stable wire
|
|
270
|
+
// tags here so classification does not introduce an upward package dependency.
|
|
271
|
+
register("@smthrs/kernel/Unreachable", "infra")
|
|
272
|
+
register("@smthrs/sandbox/RemoteChildProcessSpawner/ProviderError", {
|
|
273
|
+
unavailable: "infra",
|
|
274
|
+
timeout: "infra",
|
|
275
|
+
spawn_error: "bug",
|
|
276
|
+
not_found: "bug",
|
|
277
|
+
aborted: "bug",
|
|
278
|
+
unknown: "bug"
|
|
279
|
+
})
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
// Deep reviewed and polished by a human on 2026-08-10.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Execution policies attached to flow definitions through Effect context.
|
|
5
|
+
*
|
|
6
|
+
* @since 0.1.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import * as PlanEffects from "@smthrs/plan/Effects"
|
|
10
|
+
import * as PlanPlacement from "@smthrs/plan/Placement"
|
|
11
|
+
import * as Plan from "@smthrs/plan/Plan"
|
|
12
|
+
import * as Context from "effect/Context"
|
|
13
|
+
import { constFalse, constTrue } from "effect/Function"
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Declared filesystem effects: the plan node effect contract itself.
|
|
17
|
+
*
|
|
18
|
+
* This is `@smthrs/plan`'s `Plan.NodeEffects`, not a copy of it. The two were
|
|
19
|
+
* field-for-field identical structs in two packages, which meant a change to
|
|
20
|
+
* one silently stopped `Plan.compile` decoding what this package wrote.
|
|
21
|
+
*
|
|
22
|
+
* @category schemas
|
|
23
|
+
* @since 0.1.0
|
|
24
|
+
*/
|
|
25
|
+
export const Effects = Plan.NodeEffects
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* The value form of {@link Effects}.
|
|
29
|
+
*
|
|
30
|
+
* @category models
|
|
31
|
+
* @since 0.1.0
|
|
32
|
+
*/
|
|
33
|
+
export type Effects = Plan.NodeEffects
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* A directive naming where a node runs, carried unchanged until planning.
|
|
37
|
+
*
|
|
38
|
+
* This is `@smthrs/plan`'s `Placement.Placement`, the one typed model. It was
|
|
39
|
+
* `Schema.Unknown` here while `@smthrs/core` held a four-variant enum of the
|
|
40
|
+
* same thing, which made every crossing a cast.
|
|
41
|
+
*
|
|
42
|
+
* @category models
|
|
43
|
+
* @since 0.1.0
|
|
44
|
+
*/
|
|
45
|
+
export type PlacementDirective = PlanPlacement.Placement
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Capability ceiling. An omitted annotation inherits; an explicit empty array denies.
|
|
49
|
+
* The reference default remains an empty metadata projection for catalog readers;
|
|
50
|
+
* execution distinguishes an absent annotation from an explicitly stored one.
|
|
51
|
+
*
|
|
52
|
+
* @category annotations
|
|
53
|
+
* @since 0.1.0
|
|
54
|
+
*/
|
|
55
|
+
export const Capabilities = Context.Reference<ReadonlyArray<string>>(
|
|
56
|
+
"@smthrs/flow/Flow/Capabilities",
|
|
57
|
+
{ defaultValue: () => [] }
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Required annotation key for a flow's declared filesystem effects.
|
|
62
|
+
*
|
|
63
|
+
* @category annotations
|
|
64
|
+
* @since 0.1.0
|
|
65
|
+
*/
|
|
66
|
+
export const EffectsDeclaration = Context.Service<Effects>("@smthrs/flow/Flow/EffectsDeclaration")
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* The effect AUTHORITY a flow declares: the ceiling every step spliced beneath
|
|
70
|
+
* it must stay inside.
|
|
71
|
+
*
|
|
72
|
+
* This is the one envelope model, `@smthrs/plan/Effects`, which `@smthrs/core`
|
|
73
|
+
* re-exports and `@smthrs/patterns` intersects against. It answers a different
|
|
74
|
+
* question from {@link EffectsDeclaration}: that one says which FILES a node
|
|
75
|
+
* touches, so a plan can order writers and a sandbox can enforce a boundary at
|
|
76
|
+
* run time, while this one says how much a flow is ALLOWED to touch, so
|
|
77
|
+
* {@link module:Graph.build} can refuse a composition that claims more than its
|
|
78
|
+
* caller granted.
|
|
79
|
+
*
|
|
80
|
+
* `Flow.make`'s `effects` option writes it, which is what makes it readable by
|
|
81
|
+
* a catalog that projects a declaration without importing this module.
|
|
82
|
+
*
|
|
83
|
+
* @category annotations
|
|
84
|
+
* @since 0.1.0
|
|
85
|
+
*/
|
|
86
|
+
export const EffectEnvelope = PlanEffects.Envelope
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Required annotation key for a flow's schema-encodable placement directive.
|
|
90
|
+
*
|
|
91
|
+
* @category annotations
|
|
92
|
+
* @since 0.1.0
|
|
93
|
+
*/
|
|
94
|
+
export const Placement = PlanPlacement.Annotation
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Captures defects for a flow and includes them in the result of the flow or its actions.
|
|
98
|
+
*
|
|
99
|
+
* **Details**
|
|
100
|
+
*
|
|
101
|
+
* By default, this annotation is set to `true`, meaning defects are captured.
|
|
102
|
+
*
|
|
103
|
+
* @category annotations
|
|
104
|
+
* @since 0.1.0
|
|
105
|
+
*/
|
|
106
|
+
export const CaptureDefects = Context.Reference<boolean>(
|
|
107
|
+
"@smthrs/flow/Flow/CaptureDefects",
|
|
108
|
+
{
|
|
109
|
+
defaultValue: constTrue
|
|
110
|
+
}
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Whether a catalog may offer this flow to a model, defaulting to yes.
|
|
115
|
+
*
|
|
116
|
+
* It answers a different question from {@link Capabilities}: that one says how
|
|
117
|
+
* much a flow is allowed to touch, this one says whether a model is shown the
|
|
118
|
+
* flow at all. A flow whose actions only one host implements is discoverable
|
|
119
|
+
* everywhere its file is, and teaching it to an agent running somewhere else
|
|
120
|
+
* offers a call that has no implementation to reach.
|
|
121
|
+
*
|
|
122
|
+
* `Flow.make`'s `modelInvocable` option writes it, which is what makes it
|
|
123
|
+
* readable by a catalog that projects a declaration from source text without
|
|
124
|
+
* importing this module, exactly as `capabilities` and `effects` are.
|
|
125
|
+
*
|
|
126
|
+
* @category annotations
|
|
127
|
+
* @since 0.1.0
|
|
128
|
+
*/
|
|
129
|
+
export const ModelInvocable = Context.Reference<boolean>(
|
|
130
|
+
"@smthrs/flow/Flow/ModelInvocable",
|
|
131
|
+
{
|
|
132
|
+
defaultValue: constTrue
|
|
133
|
+
}
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Marks a flow to suspend when it encounters any error.
|
|
138
|
+
*
|
|
139
|
+
* **Details**
|
|
140
|
+
*
|
|
141
|
+
* The suspended execution can later be resumed with the flow's `resume` method, for example `MyFlow.resume(executionId)`.
|
|
142
|
+
*
|
|
143
|
+
* @category annotations
|
|
144
|
+
* @since 0.1.0
|
|
145
|
+
*/
|
|
146
|
+
export const SuspendOnFailure = Context.Reference<boolean>(
|
|
147
|
+
"@smthrs/flow/Flow/SuspendOnFailure",
|
|
148
|
+
{
|
|
149
|
+
defaultValue: constFalse
|
|
150
|
+
}
|
|
151
|
+
)
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/** Declared capability ceilings shared by planning and execution.
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import * as Capability from "@smthrs/capability/Capability"
|
|
6
|
+
import * as CapabilitySet from "@smthrs/capability/CapabilitySet"
|
|
7
|
+
import * as Context from "effect/Context"
|
|
8
|
+
import * as Option from "effect/Option"
|
|
9
|
+
import { Capabilities } from "./Annotations.ts"
|
|
10
|
+
|
|
11
|
+
/** Returns only explicitly declared ceilings; omission inherits.
|
|
12
|
+
* @category accessors
|
|
13
|
+
* @since 1.0.0
|
|
14
|
+
*/
|
|
15
|
+
export const capabilityCeilings = (annotations: Context.Context<never>): ReadonlyArray<ReadonlyArray<string>> =>
|
|
16
|
+
annotations.mapUnsafe.has(Capabilities.key) ? [Context.get(annotations, Capabilities)] : []
|
|
17
|
+
|
|
18
|
+
/** Parses declaration patterns into ceiling groups. Invalid patterns are dropped, so they deny.
|
|
19
|
+
* @category constructors
|
|
20
|
+
* @since 1.0.0
|
|
21
|
+
*/
|
|
22
|
+
export const parseCapabilityCeilings = (
|
|
23
|
+
groups: ReadonlyArray<ReadonlyArray<string>>
|
|
24
|
+
): ReadonlyArray<ReadonlyArray<Capability.CapabilityPattern>> =>
|
|
25
|
+
groups.map((group) =>
|
|
26
|
+
group.flatMap((text) => {
|
|
27
|
+
const parsed = Capability.parsePattern(text)
|
|
28
|
+
return Option.isSome(parsed) ? [parsed.value] : []
|
|
29
|
+
})
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
/** Applies declaration patterns as an exact conjunction. Invalid patterns deny.
|
|
33
|
+
* @category combinators
|
|
34
|
+
* @since 1.0.0
|
|
35
|
+
*/
|
|
36
|
+
export const attenuateCapabilities = (groups: ReadonlyArray<ReadonlyArray<string>>) =>
|
|
37
|
+
CapabilitySet.attenuateGroups(parseCapabilityCeilings(groups))
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Defect recorded when an execution runs past its flow's declared deadline.
|
|
3
|
+
*
|
|
4
|
+
* @since 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import * as Effect from "effect/Effect"
|
|
8
|
+
import * as Schema from "effect/Schema"
|
|
9
|
+
import * as Fault from "../Fault.ts"
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* An execution was still unsettled when its flow's `deadline` elapsed.
|
|
13
|
+
*
|
|
14
|
+
* The deadline counts from the execution's first start, which the engine
|
|
15
|
+
* journals, so a resume after a restart honors the original deadline rather
|
|
16
|
+
* than starting a new one. Expiry is terminal: the execution settles with this
|
|
17
|
+
* defect whether it was running or parked, and its attached children are
|
|
18
|
+
* cancelled with it. It is not a typed `execute` failure.
|
|
19
|
+
*
|
|
20
|
+
* `startedAtMs` is the journaled start and `deadlineMs` the declared bound, so
|
|
21
|
+
* `startedAtMs + deadlineMs` is when the execution expired.
|
|
22
|
+
*
|
|
23
|
+
* @category errors
|
|
24
|
+
* @since 1.0.0
|
|
25
|
+
*/
|
|
26
|
+
export class DeadlineExceeded extends Schema.TaggedError<DeadlineExceeded>()(
|
|
27
|
+
"@smthrs/flow/DeadlineExceeded",
|
|
28
|
+
{
|
|
29
|
+
code: Schema.Literal("deadline_exceeded").pipe(
|
|
30
|
+
Schema.withConstructorDefault(Effect.succeed("deadline_exceeded"))
|
|
31
|
+
),
|
|
32
|
+
flowName: Schema.String,
|
|
33
|
+
executionId: Schema.String,
|
|
34
|
+
deadlineMs: Schema.Number,
|
|
35
|
+
startedAtMs: Schema.Number,
|
|
36
|
+
message: Schema.String
|
|
37
|
+
}
|
|
38
|
+
) {}
|
|
39
|
+
|
|
40
|
+
Fault.register("@smthrs/flow/DeadlineExceeded", "policy")
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Deep reviewed and polished by a human on 2026-08-10.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Failure raised when a flow execution has no explicit or derived identity.
|
|
5
|
+
*
|
|
6
|
+
* @since 0.1.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import * as Effect from "effect/Effect"
|
|
10
|
+
import * as Schema from "effect/Schema"
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* A flow execution has no selected identity.
|
|
14
|
+
*
|
|
15
|
+
* The opt-in `derived` execution-id source raises this when the payload
|
|
16
|
+
* cannot be canonicalized, for example a non-finite number, a lone surrogate,
|
|
17
|
+
* or a cycle. It dies with it before starting a run, so this is a defect and
|
|
18
|
+
* not a typed failure a body catches. The default `fresh` source instead
|
|
19
|
+
* mints a cryptographic UUID for every unkeyed invocation.
|
|
20
|
+
*
|
|
21
|
+
* A served resume raises it too: `FlowProxyServer` dies with it when the
|
|
22
|
+
* `ExecutionIdScope` configured on a layer returns `undefined` for a resume
|
|
23
|
+
* request, because the client value is not a fallback there.
|
|
24
|
+
*
|
|
25
|
+
* @category errors
|
|
26
|
+
* @since 0.1.0
|
|
27
|
+
*/
|
|
28
|
+
export class ExecutionIdRequired extends Schema.TaggedError<ExecutionIdRequired>()(
|
|
29
|
+
"@smthrs/flow/ExecutionIdRequired",
|
|
30
|
+
{
|
|
31
|
+
code: Schema.Literal("execution_id_required").pipe(
|
|
32
|
+
Schema.withConstructorDefault(Effect.succeed("execution_id_required"))
|
|
33
|
+
),
|
|
34
|
+
flowName: Schema.String
|
|
35
|
+
}
|
|
36
|
+
) {}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The ambient source of execution identity, for a flow executed without one.
|
|
3
|
+
*
|
|
4
|
+
* Identity has three sources, in this order: the `executionId` the caller
|
|
5
|
+
* named, the `idempotencyKey` the flow declared, and — when neither exists —
|
|
6
|
+
* the source in this module. The first two are decisions an author made at the
|
|
7
|
+
* call site or the declaration site; the third is a decision the *host* makes
|
|
8
|
+
* once, for every flow it drives, which is why it is a context reference and
|
|
9
|
+
* not another option on `execute`.
|
|
10
|
+
*
|
|
11
|
+
* The default mints a fresh cryptographic UUID for every unkeyed invocation.
|
|
12
|
+
* Equal payloads are independent requests. To reattach after a crash, retain
|
|
13
|
+
* the returned execution id, declare an idempotency key, or explicitly install
|
|
14
|
+
* the `derived` source. Changing this default does not rewrite stored ids.
|
|
15
|
+
*
|
|
16
|
+
* @since 0.1.0
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { Sha256 } from "@smthrs/crypto"
|
|
20
|
+
import { DerivedKey } from "@smthrs/keys"
|
|
21
|
+
import * as Context from "effect/Context"
|
|
22
|
+
import * as Crypto from "effect/Crypto"
|
|
23
|
+
import * as Effect from "effect/Effect"
|
|
24
|
+
import * as Layer from "effect/Layer"
|
|
25
|
+
import * as Schema from "effect/Schema"
|
|
26
|
+
import { ExecutionIdRequired } from "./ExecutionIdRequired.ts"
|
|
27
|
+
import type { Any } from "./Flow.ts"
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Mints the execution id of an invocation that named none.
|
|
31
|
+
*
|
|
32
|
+
* It is consulted only after the two explicit sources are absent, and it runs
|
|
33
|
+
* before the runtime is read, so a source that cannot name the invocation
|
|
34
|
+
* fails the execution rather than starting one under a guessed identity.
|
|
35
|
+
*
|
|
36
|
+
* @category models
|
|
37
|
+
* @since 0.1.0
|
|
38
|
+
*/
|
|
39
|
+
export interface ExecutionIdSource {
|
|
40
|
+
readonly mint: <W extends Any>(
|
|
41
|
+
flow: W,
|
|
42
|
+
payload: unknown
|
|
43
|
+
) => Effect.Effect<string, never, Crypto.Crypto | W["payloadSchema"]["EncodingServices"]>
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* The canonical key of an invocation: the flow's own payload codec, then RFC
|
|
48
|
+
* 8785, then SHA-256.
|
|
49
|
+
*
|
|
50
|
+
* Encoding first is what makes the key agree with the durable driver, which
|
|
51
|
+
* compares the ENCODED payload when it decides whether an existing run row is
|
|
52
|
+
* the same invocation. A payload with no canonical form — a non-finite number,
|
|
53
|
+
* a lone surrogate, a cycle — has no derivable identity at all, so it fails
|
|
54
|
+
* here instead of hashing something approximate.
|
|
55
|
+
*
|
|
56
|
+
* @private
|
|
57
|
+
*/
|
|
58
|
+
const canonicalKey = <W extends Any>(
|
|
59
|
+
flow: W,
|
|
60
|
+
payload: unknown
|
|
61
|
+
): Effect.Effect<string, ExecutionIdRequired, Crypto.Crypto | W["payloadSchema"]["EncodingServices"]> =>
|
|
62
|
+
(Schema.encodeEffect(Schema.toCodecJson(flow.payloadSchema))(payload) as Effect.Effect<
|
|
63
|
+
unknown,
|
|
64
|
+
unknown,
|
|
65
|
+
W["payloadSchema"]["EncodingServices"]
|
|
66
|
+
>).pipe(
|
|
67
|
+
Effect.flatMap((encoded) => Schema.decodeUnknownEffect(DerivedKey)(encoded)),
|
|
68
|
+
Effect.mapError(() => new ExecutionIdRequired({ flowName: flow._tag }))
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* An opt-in deterministic source over the flow tag and the payload's
|
|
73
|
+
* canonical form.
|
|
74
|
+
*
|
|
75
|
+
* Same tag and same encoded payload derive the same id, which is exactly the
|
|
76
|
+
* pair the durable driver already treats as one invocation, so a re-drive of a
|
|
77
|
+
* crashed program re-attaches to the run it left behind instead of opening a
|
|
78
|
+
* second one.
|
|
79
|
+
*
|
|
80
|
+
* The tag and canonical payload key are JSON-tuple framed before hashing.
|
|
81
|
+
* Their strings are used exactly as given and encoded as UTF-8, with no Unicode
|
|
82
|
+
* normalization. This preimage encoding freezes at rc.0.
|
|
83
|
+
*
|
|
84
|
+
* @category constructors
|
|
85
|
+
* @since 0.1.0
|
|
86
|
+
*/
|
|
87
|
+
export const derived: ExecutionIdSource = {
|
|
88
|
+
mint: (flow, payload) =>
|
|
89
|
+
canonicalKey(flow, payload).pipe(
|
|
90
|
+
// The JSON tuple prevents delimiter splicing. This exact framing freezes at rc.0.
|
|
91
|
+
Effect.flatMap((key) => Effect.orDie(Schema.decodeUnknownEffect(Sha256)(JSON.stringify([flow._tag, key])))),
|
|
92
|
+
Effect.orDie
|
|
93
|
+
)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Mints independent execution ids for unkeyed requests using host cryptography.
|
|
98
|
+
* @category constructors
|
|
99
|
+
* @since 0.1.0
|
|
100
|
+
*/
|
|
101
|
+
export const fresh: ExecutionIdSource = {
|
|
102
|
+
mint: () => Effect.flatMap(Crypto.Crypto, (crypto) => Effect.orDie(crypto.randomUUIDv4))
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Context reference carrying the host's execution-id source, defaulting to
|
|
107
|
+
* {@link fresh}.
|
|
108
|
+
*
|
|
109
|
+
* @category idempotency
|
|
110
|
+
* @since 0.1.0
|
|
111
|
+
*/
|
|
112
|
+
export const CurrentExecutionIds = Context.Reference<ExecutionIdSource>(
|
|
113
|
+
"@smthrs/flow/Flow/CurrentExecutionIds",
|
|
114
|
+
{
|
|
115
|
+
defaultValue: () => fresh
|
|
116
|
+
}
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Declares the host's execution-id source as a layer.
|
|
121
|
+
*
|
|
122
|
+
* **When to use**
|
|
123
|
+
*
|
|
124
|
+
* Install `derived` when equal payloads deliberately identify the same work,
|
|
125
|
+
* or provide a host-specific identity source. Explicit caller execution ids
|
|
126
|
+
* and declared idempotency keys take precedence over this source.
|
|
127
|
+
*
|
|
128
|
+
* @category idempotency
|
|
129
|
+
* @since 0.1.0
|
|
130
|
+
*/
|
|
131
|
+
export const layerExecutionIds = (
|
|
132
|
+
source: ExecutionIdSource
|
|
133
|
+
): Layer.Layer<never> => Layer.succeed(CurrentExecutionIds)(source)
|