@smthrs/flow 0.0.0-stage → 1.0.0-rc.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +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 +1021 -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 +1483 -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 +1862 -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
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Bodies are plans"
|
|
3
|
+
description: "Why a flow body runs at plan time, what a planned value is and the one rule it obeys, and how branches, fan-out, and recovery stay static topology."
|
|
4
|
+
sidebar:
|
|
5
|
+
order: 2
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
A flow's `body` is a pure function from the decoded payload to a
|
|
9
|
+
[`Node`](/api/plan). Calling it builds topology. It runs nothing, reads nothing,
|
|
10
|
+
and returns a description that `Graph.build` can walk without dispatching a
|
|
11
|
+
single step.
|
|
12
|
+
|
|
13
|
+
A flow authored with `prompt` has the same body contract: `Flow.make` supplies
|
|
14
|
+
a body that records one ordinary action call. Planning never renders the prompt
|
|
15
|
+
or calls a model. The host implements the exposed `flow.action` and renders
|
|
16
|
+
`flow.prompt` with the decoded payload when that action runs.
|
|
17
|
+
|
|
18
|
+
Reproducible plans require complete, stable declaration identities as well as
|
|
19
|
+
the same payload. Use `Node.capture` to declare semantic captures and imported
|
|
20
|
+
implementation versions, and select stable callback validation. The low-level
|
|
21
|
+
process-local callback policy permits inspection but does not promise the same
|
|
22
|
+
plan across processes. Stable node addresses alone do not prove unchanged
|
|
23
|
+
behavior.
|
|
24
|
+
|
|
25
|
+
## What a body may not do
|
|
26
|
+
|
|
27
|
+
The body's source digest enters the flow's content identity, so the body must not
|
|
28
|
+
depend on anything the digest cannot observe. In practice:
|
|
29
|
+
|
|
30
|
+
- No mutable module state, clocks, random values, services, or environment
|
|
31
|
+
values captured outside `payload`.
|
|
32
|
+
- No conditionals on a step result written as ordinary JavaScript. A decision
|
|
33
|
+
between two continuations is `Node.branch`, which stores both arms.
|
|
34
|
+
- No work that genuinely wants opaque code. That work is an action, and its
|
|
35
|
+
implementation attaches as a layer.
|
|
36
|
+
|
|
37
|
+
`Flow.make` cannot enforce purity or verify capture completeness. An omitted
|
|
38
|
+
semantic input can change behavior without changing a key, allowing stale
|
|
39
|
+
replay. Do not rely on a key mismatch to detect undeclared behavior changes.
|
|
40
|
+
|
|
41
|
+
## Planned values
|
|
42
|
+
|
|
43
|
+
The payload a body receives is real data. Every step result inside it is a value
|
|
44
|
+
that does not exist yet, and the body sees it as a `Planned` placeholder.
|
|
45
|
+
|
|
46
|
+
A planned value obeys one rule: **pass it, never compute on it.** Passing it into
|
|
47
|
+
a payload field, into a branch, or into a `map` is fine, and field access is
|
|
48
|
+
allowed because it records a reference path rather than reading anything.
|
|
49
|
+
|
|
50
|
+
```ts
|
|
51
|
+
import { Node } from "@smthrs/plan"
|
|
52
|
+
|
|
53
|
+
// Allowed: the placeholder is passed on, and `report.summary` records a path.
|
|
54
|
+
Build.call({ target: "site" }).pipe(
|
|
55
|
+
Node.bindPlanned((report) => Publish.call({ summary: report.summary }))
|
|
56
|
+
)
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Misuse fails twice, and both failures are deliberate. `Planned` is branded, so
|
|
60
|
+
arithmetic and template interpolation are compile errors. At run time the
|
|
61
|
+
placeholder is a strict proxy whose `Symbol.toPrimitive`, `valueOf`, `toString`,
|
|
62
|
+
`toJSON`, and call traps throw a `GraphBuildError` with the code
|
|
63
|
+
`planned_value_computed`, rather than let a plan be built around `NaN` or
|
|
64
|
+
`"[object Object]"`.
|
|
65
|
+
|
|
66
|
+
Two operations JavaScript exposes no trap for, `Boolean(value)` and strict
|
|
67
|
+
identity, cannot be refused at run time. They reveal only the proxy's truthiness
|
|
68
|
+
or identity, never the result. Decide on real values with `Node.branch`.
|
|
69
|
+
|
|
70
|
+
## The node vocabulary
|
|
71
|
+
|
|
72
|
+
A body is written in [`@smthrs/plan`](/api/plan)'s `Node` combinators, and each
|
|
73
|
+
one has a job:
|
|
74
|
+
|
|
75
|
+
| Combinator | What it is for |
|
|
76
|
+
| ----------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
|
|
77
|
+
| `Node.succeed(value)` | A constant, for a body that settles without a step. |
|
|
78
|
+
| `Node.all({ ... })` | Independent children, settled concurrently, keyed by name. Width is fixed here, at plan time. |
|
|
79
|
+
| `Node.map(node, f)` | Computation on a step result. The function is digested, not run; it executes later on the real value. |
|
|
80
|
+
| `Node.andThen(node, next)` | A success barrier: no part of the next subtree starts until the first node succeeds. Bound long chains as described below. |
|
|
81
|
+
| `Node.bindPlanned(node, build)` | Builds data dependencies from a placeholder. Independent descendants may run concurrently with the producer. |
|
|
82
|
+
| `Node.branch(node, { if, then, else })` | A decision. Both arms are built once at plan time and both are stored. |
|
|
83
|
+
| `Node.catch(node, { onFailure, error? })` | Recovery. The failure arm is topology too, and a schema narrows which failures it handles. |
|
|
84
|
+
| `Node.priority(node, n)` | Scheduling order for ready work. It never enters key material, so raising it cannot invalidate a recorded result. |
|
|
85
|
+
|
|
86
|
+
Nested explicit `andThen` subtrees carry only their nearest success barrier.
|
|
87
|
+
That prerequisite already depends on the outer barriers, so ordering remains
|
|
88
|
+
transitive and a right-nested chain has linear continuation edges and `Pending`
|
|
89
|
+
inputs.
|
|
90
|
+
|
|
91
|
+
Structural node IDs retain the `.andThen` and `.then` path segments because
|
|
92
|
+
these addresses participate in durable dispatch identity. Each ID grows with
|
|
93
|
+
nesting depth, and total ID bytes in a sequential chain grow quadratically,
|
|
94
|
+
including fluent left-nested chains. Plans repeat IDs in inputs and dependency
|
|
95
|
+
lists. Split long chains into bounded [trampoline rounds](./trampoline-rounds.md)
|
|
96
|
+
or `.child()` flow boundaries; shorter barrier lists do not bound ID bytes.
|
|
97
|
+
|
|
98
|
+
A `map` that decides what happens next is a `branch` written wrongly. Both a
|
|
99
|
+
branch's arms and a catch's failure arm contribute their requirements to the
|
|
100
|
+
node, because both are topology the plan carries: a run takes one of them, but
|
|
101
|
+
which one is not known until the predicate sees the real value.
|
|
102
|
+
|
|
103
|
+
## Fixed width, and what to do instead
|
|
104
|
+
|
|
105
|
+
`Node.all` settles its members concurrently with no bound, and the member set is
|
|
106
|
+
fixed when the plan is built. Fanning out over something a step discovered is not
|
|
107
|
+
this. End the round and carry the list in the next flow's payload, where it is
|
|
108
|
+
real data. See [Trampoline rounds](./trampoline-rounds.md).
|
|
109
|
+
|
|
110
|
+
For explicit batches, sequence whole `Node.all` subtrees with `Node.andThen`.
|
|
111
|
+
Members within an opened batch remain concurrent. A `bindPlanned` reference
|
|
112
|
+
orders its consumers, not every independent member of the continuation; it is
|
|
113
|
+
not a whole-batch admission barrier. This manual batching is distinct from the
|
|
114
|
+
compiled scheduler's admission caps, which the public interpreter does not yet
|
|
115
|
+
consume.
|
|
116
|
+
|
|
117
|
+
## What the build refuses
|
|
118
|
+
|
|
119
|
+
`Graph.build` reports what it can and throws what it cannot. Recoverable topology
|
|
120
|
+
issues land in `Graph.diagnostics(graph)`, and a graph carrying diagnostics is
|
|
121
|
+
inspectable but deliberately not compilable, so an incomplete body is reported
|
|
122
|
+
rather than half-driven.
|
|
123
|
+
|
|
124
|
+
Fatal refusals throw a `GraphBuildError` naming the site and the fix. The ones an
|
|
125
|
+
author meets are:
|
|
126
|
+
|
|
127
|
+
| Code | What happened |
|
|
128
|
+
| ------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------- |
|
|
129
|
+
| `planned_value_computed` | A body computed on a step result. |
|
|
130
|
+
| `invalid_all_member`, `invalid_continuation` | An `all` member or a branch arm was not a node. |
|
|
131
|
+
| `invalid_join` | A race, any, or quorum had a non-node member, no members, or a quorum count its members cannot reach. |
|
|
132
|
+
| `recursion_requires_boundary` | A flow called itself inline. Use `flow.to` or `flow.child`. |
|
|
133
|
+
| `placement_requires_boundary` | An inline callee declares a placement the caller cannot satisfy. Use `flow.child`. |
|
|
134
|
+
| `duplicate_node` | Two structural addresses resolved to one durable node id, which would let a later settlement overwrite an earlier one. |
|
|
135
|
+
| `graph_too_deep`, `payload_too_deep`, `cyclic_payload` | Topology or payload past the build bound, or a payload that contains itself. |
|
|
136
|
+
| `invalid_priority`, `invalid_payload` | A priority that is not a safe integer, or a payload member that cannot be captured as inert JSON. |
|
|
137
|
+
|
|
138
|
+
The two depth refusals exist because the build walks with an explicit stack and
|
|
139
|
+
refuses at a bound, rather than recursing until the native stack overflows
|
|
140
|
+
without a typed error.
|
|
141
|
+
|
|
142
|
+
## The walk
|
|
143
|
+
|
|
144
|
+
`Interpreter.interpret` builds the graph in full and then drives it, demand
|
|
145
|
+
driven from the root rather than as a sweep over the node list. Dependency order
|
|
146
|
+
puts both branch arms before the branch that chooses between them, and executing
|
|
147
|
+
an arm to discover it was not taken is exactly what static topology exists to
|
|
148
|
+
avoid.
|
|
149
|
+
|
|
150
|
+
## Related pages
|
|
151
|
+
|
|
152
|
+
- [Compose a body from branches and fan-out](../guides/build-a-body.md): the same
|
|
153
|
+
vocabulary as worked code.
|
|
154
|
+
- [Inspect the plan a body builds](../guides/inspect-the-plan.md): read nodes,
|
|
155
|
+
edges, and diagnostics before anything runs.
|
|
156
|
+
- [Execution identity](./execution-identity.md): how a node address becomes a
|
|
157
|
+
durable step key.
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Execution identity"
|
|
3
|
+
description: "How a run gets its execution id, how one dispatch gets its step key, and what enters each of those keys."
|
|
4
|
+
sidebar:
|
|
5
|
+
order: 3
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Durability is identity. A re-driven run reads a recorded result only if it asks
|
|
9
|
+
under the same name, so this package is careful about two names: the id of a
|
|
10
|
+
whole execution, and the key of one dispatch inside it.
|
|
11
|
+
|
|
12
|
+
## The execution id
|
|
13
|
+
|
|
14
|
+
`Flow.execute` resolves identity from the first source that has one:
|
|
15
|
+
|
|
16
|
+
1. The `executionId` the caller named on `execute`.
|
|
17
|
+
2. The flow's declared `idempotencyKey`, JSON-tuple framed with the flow tag and
|
|
18
|
+
hashed.
|
|
19
|
+
3. The ambient `Flow.CurrentExecutionIds` source. Its default, `Flow.fresh`,
|
|
20
|
+
mints a cryptographic UUID, so equal unkeyed requests start independent work.
|
|
21
|
+
|
|
22
|
+
A declared key beats the ambient source because it is the narrower statement:
|
|
23
|
+
this author said what makes two invocations of _this_ flow the same, where the
|
|
24
|
+
source is the host's blanket answer for every flow it drives. Both preimage
|
|
25
|
+
encodings freeze at rc.0, and neither applies Unicode normalization.
|
|
26
|
+
|
|
27
|
+
Install `Flow.derived` explicitly when equal encoded payloads of one flow are
|
|
28
|
+
one piece of work. It encodes the payload with the flow's own codec,
|
|
29
|
+
canonicalizes it under RFC 8785, hashes it, and hashes that together with the
|
|
30
|
+
flow tag:
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
const derivedIdentity = Flow.layerExecutionIds(Flow.derived)
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Install the deterministic `derived` source only when equal payloads deliberately
|
|
37
|
+
identify one request. Its existing codec, canonicalization and hash framing are
|
|
38
|
+
unchanged, so this is also the migration path for callers that need to reattach
|
|
39
|
+
to historical automatically derived executions.
|
|
40
|
+
|
|
41
|
+
```ts
|
|
42
|
+
import { Flow } from "@smthrs/flow"
|
|
43
|
+
|
|
44
|
+
const intentionalPayloadIdentity = Flow.layerExecutionIds(Flow.derived)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
`flow.start(payload)` always creates fresh work and returns its id, including
|
|
48
|
+
when the declaration carries an idempotency key. `flow.ensure(payload, { key })`
|
|
49
|
+
returns the id of an explicitly keyed new or existing execution. After a crash,
|
|
50
|
+
reattach with the saved id or the same explicit key; calling unkeyed `execute`
|
|
51
|
+
again starts new work. Read a run with `poll(id)`, or await it with
|
|
52
|
+
`execute(payload, { executionId: id })`.
|
|
53
|
+
|
|
54
|
+
Callers that name an `executionId` and flows that declare an `idempotencyKey` are
|
|
55
|
+
unaffected, because both are decided before the source is consulted.
|
|
56
|
+
|
|
57
|
+
### When identity cannot be derived
|
|
58
|
+
|
|
59
|
+
`Flow.ExecutionIdRequired` is a defect, not a typed failure. The opt-in derived source raises it when the payload has no canonical
|
|
60
|
+
form: a non-finite number, a lone surrogate, or a cycle. Derivation fails before the
|
|
61
|
+
engine is invoked, because a run under the wrong id is worse than a run that
|
|
62
|
+
does not start.
|
|
63
|
+
|
|
64
|
+
`Flow.executionId(payload)` asks the configured source for an id. With the fresh
|
|
65
|
+
source, pass that returned id explicitly to `execute`; asking again mints a new id. It dies when the payload
|
|
66
|
+
fails the flow's own schema, where `Flow.execute` fails with a typed
|
|
67
|
+
`Schema.SchemaError` for the same input. Precompute an id only for a payload you
|
|
68
|
+
have already validated. Identity and `tokenFromPayload` helpers carry the payload schema's
|
|
69
|
+
`EncodingServices` requirement because the ambient source may encode the payload.
|
|
70
|
+
|
|
71
|
+
### Child executions
|
|
72
|
+
|
|
73
|
+
A `flow.child(payload)` boundary derives its child's id from the parent
|
|
74
|
+
execution id, the node's address, the callee tag, and a digest of the payload.
|
|
75
|
+
`Interpreter.childExecutionId` is that derivation, exported so a host can name a
|
|
76
|
+
child the same way the interpreter does. Because the id is derived from the
|
|
77
|
+
node's address rather than minted, a re-driven parent lands on the child it
|
|
78
|
+
already started.
|
|
79
|
+
|
|
80
|
+
## The step key
|
|
81
|
+
|
|
82
|
+
Inside one execution, every dispatch is recorded under a key derived from three
|
|
83
|
+
things.
|
|
84
|
+
|
|
85
|
+
**The allocation scope** comes from `StepIdentity.AllocationIdentity`: the `kind`
|
|
86
|
+
(`action` for user dispatches, `internal` for engine-owned operations, which own
|
|
87
|
+
disjoint counter namespaces), the declaration `name`, an optional `idempotency`
|
|
88
|
+
refinement, and the optional `site`, which is the replay-stable address of the
|
|
89
|
+
graph node driving the dispatch. Distinct graph sites are distinct scopes, so two
|
|
90
|
+
call sites of one declaration never contend for one counter.
|
|
91
|
+
|
|
92
|
+
**The ordinal** is allocated per scope and pinned by dispatch position.
|
|
93
|
+
`Action.CurrentOrdinal` carries an `OrdinalSlot` (`{ values, cursors }`) rather
|
|
94
|
+
than a number, which is what lets every attempt of one `Action.retry` sequence
|
|
95
|
+
reuse its own action's ordinals even when the block dispatches several
|
|
96
|
+
declarations. A nested block shares the pinned `values` with the enclosing block
|
|
97
|
+
and owns a private `cursors` view seeded at entry and merged back on exit, so a
|
|
98
|
+
concurrent sibling never rewinds another block's mid-flight cursor.
|
|
99
|
+
|
|
100
|
+
**The tier** distinguishes an unsealed key from a compensable or irreversible
|
|
101
|
+
one. `StepIdentity.invocationKey` is the single derivation.
|
|
102
|
+
|
|
103
|
+
Concurrent dispatch of one allocation scope is refused with
|
|
104
|
+
`Action.ConcurrentKeylessDispatch`, because arrival order would otherwise decide
|
|
105
|
+
which fiber got which ordinal, and with it which attempt row and which recorded
|
|
106
|
+
outcome. Only a sealed action with a declared `idempotencyKey` is exempt: that
|
|
107
|
+
key is a pure cache key rather than an ordinal, and distinct keys are distinct
|
|
108
|
+
scopes that overlap freely.
|
|
109
|
+
|
|
110
|
+
## What enters a sealed action's cache key
|
|
111
|
+
|
|
112
|
+
A sealed action's recorded result can be replayed, and with the right
|
|
113
|
+
declarations reused. What the key covers is deliberate:
|
|
114
|
+
|
|
115
|
+
- **Caller-owned identity.** A string `idempotencyKey` is namespaced by the
|
|
116
|
+
action name and the declared schemas. An object key is caller-owned canonical
|
|
117
|
+
JSON and stays stable across an action rename. An object key carrying material
|
|
118
|
+
canonical serialization rejects, such as a `Date`, an `undefined`, a class
|
|
119
|
+
instance, or a `Redacted`, is refused with `Action.UncanonicalIdempotencyKey`
|
|
120
|
+
naming the offending path, and the refusal is not retryable because the same
|
|
121
|
+
declaration derives it on every attempt.
|
|
122
|
+
- **Runtime facts the engine adds.** The complete `Action.CacheEnvironment`
|
|
123
|
+
(`layers` and `capabilities`) and any file boundary derived from the action's
|
|
124
|
+
`metadata`. The engine adds these separately, so caller identity cannot
|
|
125
|
+
override them. When the environment is absent, the engine scopes the key to the
|
|
126
|
+
current execution rather than presenting incomplete data as reusable identity.
|
|
127
|
+
|
|
128
|
+
A flow call node folds the declared schemas into its key material as their JSON
|
|
129
|
+
Schema documents, so changing what a callee accepts or produces re-keys the call.
|
|
130
|
+
The limit is worth stating plainly: two schemas whose decoders disagree can
|
|
131
|
+
serialize to the same document, so changing only a codec's behavior does **not**
|
|
132
|
+
re-key the call, and a result recorded under the old codec is replayed under the
|
|
133
|
+
new one. Effect codecs are not serializable, so nothing can close this
|
|
134
|
+
automatically. Rename the declaration when a transformation changes and the call
|
|
135
|
+
has to be re-keyed.
|
|
136
|
+
|
|
137
|
+
## Related pages
|
|
138
|
+
|
|
139
|
+
- [Reuse a recorded result](../guides/reuse-a-recorded-result.md): cache policy,
|
|
140
|
+
scope, and the three declarations a shareable result needs.
|
|
141
|
+
- [Suspension and replay](./suspension-and-replay.md): what a replay actually
|
|
142
|
+
does with these keys.
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Flows and actions"
|
|
3
|
+
description: "The two nouns of the authoring model: an action carries an implementation attached as a layer, a flow carries a pure body, and the requirement channel is what connects them."
|
|
4
|
+
sidebar:
|
|
5
|
+
order: 1
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
The package has two nouns and one rule about each.
|
|
9
|
+
|
|
10
|
+
- An **action** is the atom that does the work. It carries an implementation,
|
|
11
|
+
and that implementation attaches separately, as a layer.
|
|
12
|
+
- A **flow** is the composite. It carries a `body`, and never opaque executable
|
|
13
|
+
code.
|
|
14
|
+
|
|
15
|
+
A typed `prompt` declaration lowers to a flow whose body calls one ordinary
|
|
16
|
+
action. The host attaches the model implementation to `flow.action`; the
|
|
17
|
+
renderer is `flow.prompt`. See [Prompt-backed flows](../guides/use-a-prompt.md).
|
|
18
|
+
|
|
19
|
+
Everything else follows from that split, including the surprising part: there is
|
|
20
|
+
no `toLayer` on a flow. A flow has exactly one behavior and it is the body, so
|
|
21
|
+
there is no second behavior to attach.
|
|
22
|
+
|
|
23
|
+
## Two forms of action
|
|
24
|
+
|
|
25
|
+
`Action.make` selects its form by whether the first argument is a string.
|
|
26
|
+
|
|
27
|
+
The **declared** form is the one you write in a body. It is pure data: a tag,
|
|
28
|
+
schemas, a tier, and optional identity. It holds no code.
|
|
29
|
+
|
|
30
|
+
```ts
|
|
31
|
+
import { Action } from "@smthrs/flow"
|
|
32
|
+
import * as Schema from "effect/Schema"
|
|
33
|
+
|
|
34
|
+
export const Charge = Action.make("payments/Charge", {
|
|
35
|
+
payload: { customer: Schema.String, cents: Schema.Number },
|
|
36
|
+
success: Schema.String,
|
|
37
|
+
tier: "irreversible",
|
|
38
|
+
idempotencyKey: { charge: "checkout-v1" }
|
|
39
|
+
})
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
The **inline** form carries its `execute` effect directly and is itself an
|
|
43
|
+
`Effect`. It is what an implementation reaches for when it needs a nested durable
|
|
44
|
+
operation of its own, and it is what `Action.retry` and `Action.raceAll` take.
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
import * as Effect from "effect/Effect"
|
|
48
|
+
|
|
49
|
+
const probe = Action.make({
|
|
50
|
+
name: "payments/Probe",
|
|
51
|
+
success: Schema.String,
|
|
52
|
+
execute: Effect.succeed("ok")
|
|
53
|
+
})
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## The requirement channel
|
|
57
|
+
|
|
58
|
+
`Action.make(tag, ...)` mints one context key for that declaration, derived from
|
|
59
|
+
the tag. `Charge.call(payload)` records a node whose type carries that key.
|
|
60
|
+
`Flow.make` reads the union of those keys off the node its body returns, so a
|
|
61
|
+
flow states in its own type which implementations it names and does not hold:
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
Checkout.execute({ customer: "ada", cents: 4_200 }, { executionId: "checkout-1" })
|
|
65
|
+
// Effect<string, ..., FlowRuntime | Crypto.Crypto | Action.Requirement<"payments/Charge">>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
`Charge.toLayer(...)` provides that key. A composition missing an implementation
|
|
69
|
+
therefore fails to compile at the call site instead of dying partway through a
|
|
70
|
+
run. Planning stays requirement-free: building the plan a body describes asks for
|
|
71
|
+
no service at all, and `execute` is the one place the obligations are collected.
|
|
72
|
+
|
|
73
|
+
Three propagation rules follow from where a plan actually goes:
|
|
74
|
+
|
|
75
|
+
| Where | What happens to the requirement |
|
|
76
|
+
| -------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
77
|
+
| `flow.call(payload)` | Propagates. The callee's steps join the caller's plan, so its obligations are the caller's. |
|
|
78
|
+
| `flow.child(payload)` and `flow.to(payload)` | Dropped. Each opens a new execution whose own driver supplies its context. Dropping at `to` is also what keeps a self-looping lineage's type finite. |
|
|
79
|
+
| `poll`, `interrupt`, `resume` | Not collected. The first two never drive a body, and a re-driven round runs under the context the flow was registered with, not the resumer's. |
|
|
80
|
+
|
|
81
|
+
## System actions mint nothing
|
|
82
|
+
|
|
83
|
+
`Action.makeSystem` is the declared form with the requirement erased. `Sleep`,
|
|
84
|
+
`WaitFor`, `HumanTask`, and `Poll`'s exhaustion step all use it, so a body that
|
|
85
|
+
waits pushes no layer obligation onto its callers. The engine owns those
|
|
86
|
+
implementations, and an author cannot be the party who forgot them. You still
|
|
87
|
+
provide `Sleep.layer` or `WaitFor.layer` in the composition; the compiler does
|
|
88
|
+
not force you to.
|
|
89
|
+
|
|
90
|
+
## The name-keyed table
|
|
91
|
+
|
|
92
|
+
The requirement is the compile-time half. `Action.Implementations` is the
|
|
93
|
+
run-time half: a table keyed by action tag that `toLayer` files itself into. A
|
|
94
|
+
driver expanding a plan it read back out of a journal has no types left to
|
|
95
|
+
consult, so it resolves by tag.
|
|
96
|
+
|
|
97
|
+
That is why `Action.layerImplementations` goes **under** the implementation
|
|
98
|
+
layers rather than beside them:
|
|
99
|
+
|
|
100
|
+
```ts
|
|
101
|
+
import { Interpreter } from "@smthrs/flow"
|
|
102
|
+
import * as Layer from "effect/Layer"
|
|
103
|
+
|
|
104
|
+
Layer.mergeAll(Charge.toLayer(chargeCard), Interpreter.layer(Checkout)).pipe(
|
|
105
|
+
Layer.provideMerge(Action.layerImplementations)
|
|
106
|
+
)
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Filing an implementation happens while its layer is built, so the table has to
|
|
110
|
+
exist first. The table is optional: a composition that only executes handlers
|
|
111
|
+
registered directly with the runtime never needs it.
|
|
112
|
+
|
|
113
|
+
## Tiers
|
|
114
|
+
|
|
115
|
+
Every action declares a `tier`, which tells the engine what a retry of it means.
|
|
116
|
+
|
|
117
|
+
| Tier | Meaning |
|
|
118
|
+
| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
119
|
+
| `sealed` | The default. The result is a pure function of the inputs, so a recorded result can be replayed and, with the right declarations, reused across runs. |
|
|
120
|
+
| `compensable` | The body changes the workspace. The engine takes a pre-image before an attempt and restores it before the next one, so the undo is the engine's rather than the body's. |
|
|
121
|
+
| `irreversible` | The body changes the world outside the workspace. Retrying one without a declared `idempotencyKey` fails with `IrreversibleRetryRequiresIdempotencyKey`. |
|
|
122
|
+
|
|
123
|
+
## Related pages
|
|
124
|
+
|
|
125
|
+
- [Bodies are plans](./bodies-and-plans.md): what a body may and may not do.
|
|
126
|
+
- [Attach an implementation to an action](../guides/implement-an-action.md): the
|
|
127
|
+
layer, the tier, and the ordering rules, in one place.
|
|
128
|
+
- [The runtime port](./the-runtime-port.md): what an engine has to supply for any
|
|
129
|
+
of this to run.
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Suspension and replay"
|
|
3
|
+
description: "The three results a flow settles with, what parking on a durable wait actually does, and what a re-driven round replays."
|
|
4
|
+
sidebar:
|
|
5
|
+
order: 4
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
A flow round settles with one of three results, and the difference between them
|
|
9
|
+
is the whole durability story.
|
|
10
|
+
|
|
11
|
+
| Result | Meaning |
|
|
12
|
+
| ---------------- | --------------------------------------------------------------------------------- |
|
|
13
|
+
| `Flow.Complete` | The round finished. It carries an `Exit`, so a typed failure is a completion too. |
|
|
14
|
+
| `Flow.Suspended` | The round parked on a durable wait and will be re-driven. |
|
|
15
|
+
| `Flow.Handoff` | The round ended by handing off to the next round of a trampoline lineage. |
|
|
16
|
+
|
|
17
|
+
`Flow.isResult` is the guard, `Flow.Result({ success, error })` builds the schema,
|
|
18
|
+
and `Flow.ResultEncoded` is the stored form.
|
|
19
|
+
|
|
20
|
+
## What parking does
|
|
21
|
+
|
|
22
|
+
A durable wait is not a held fiber. When a body reaches `Sleep.action`,
|
|
23
|
+
`WaitFor.action`, `HumanTask.action`, or an unresolved `DurableDeferred`, the
|
|
24
|
+
implementation declares how it is about to wait through
|
|
25
|
+
`FlowRuntime.annotateWaiting` and then suspends. The engine records a waiting row
|
|
26
|
+
carrying that annotation and releases the run. The process can exit.
|
|
27
|
+
|
|
28
|
+
A `WaitingAnnotation` is `{ reason, wakeAt?, token? }`, and the reason is what an
|
|
29
|
+
operator reads off the run:
|
|
30
|
+
|
|
31
|
+
| Reason | Declared by |
|
|
32
|
+
| ---------- | ------------------------------------------------------------------- |
|
|
33
|
+
| `timer` | `Sleep`, with the deadline as `wakeAt`. |
|
|
34
|
+
| `event` | `WaitFor`, carrying the wake token a completion is matched against. |
|
|
35
|
+
| `approval` | `HumanTask`, carrying the current attempt's token. |
|
|
36
|
+
|
|
37
|
+
`execute(payload, { discard: true })`, `start(payload)`, and
|
|
38
|
+
`ensure(payload, { key })` acknowledge admission without awaiting the result;
|
|
39
|
+
the run can stay parked after the caller receives its execution id.
|
|
40
|
+
Ordinary `execute` follows the run instead: a parked run keeps its caller waiting.
|
|
41
|
+
`flow.poll(executionId)` answers `Option.none` for a run that is known and has
|
|
42
|
+
not settled. An id the
|
|
43
|
+
runtime never recorded is `FlowRuntime.FlowExecutionNotFound` instead, which is a
|
|
44
|
+
different fact and a different failure.
|
|
45
|
+
|
|
46
|
+
## What a re-drive replays
|
|
47
|
+
|
|
48
|
+
`flow.resume(executionId)` re-drives a suspended execution. The round starts over
|
|
49
|
+
from the top of the body, which is safe precisely because the body is a plan:
|
|
50
|
+
|
|
51
|
+
1. The graph is rebuilt. Same declarations, same payload, same node addresses.
|
|
52
|
+
2. Every node whose result the engine already recorded settles from that record.
|
|
53
|
+
No dispatch happens.
|
|
54
|
+
3. The walk reaches the node that was unsettled and drives it. If its wait is now
|
|
55
|
+
resolved, the recorded completion is what it reads.
|
|
56
|
+
|
|
57
|
+
Nothing about a resume collects the flow's requirements. The runtime captures the
|
|
58
|
+
context a flow was registered under and merges it beneath whatever the run
|
|
59
|
+
supplies, so the implementations that made the first round possible are the ones
|
|
60
|
+
a re-driven round reaches. A party holding an execution id is not the party
|
|
61
|
+
holding the layers.
|
|
62
|
+
|
|
63
|
+
Completion is first-writer-wins. A `DurableDeferred` records the first exit
|
|
64
|
+
submitted against it, and every later read replays that exit. A second completion
|
|
65
|
+
does not overwrite the first.
|
|
66
|
+
|
|
67
|
+
## The caller's polling budget
|
|
68
|
+
|
|
69
|
+
Ordinary `execute` follows a suspended run, polling and re-driving it instead
|
|
70
|
+
of returning a suspended result. Its default `suspendedRetryPolicy` has no
|
|
71
|
+
attempt or expiry bound, so the caller can keep waiting while the run is parked.
|
|
72
|
+
A bounded `Flow.make` `suspendedRetryPolicy` limits **one caller**: if its
|
|
73
|
+
schedule is spent, `execute` fails with a `SuspendedResumeGaveUp` defect, but
|
|
74
|
+
the execution stays parked. The next caller starts a budget of its own. This
|
|
75
|
+
budget is not durable and does not cancel the run.
|
|
76
|
+
|
|
77
|
+
What bounds work durably is an action's own `RetryPolicy`. The engine restores
|
|
78
|
+
`maxAttempts` from the persisted attempt sequence and the `expirationMs` origin
|
|
79
|
+
from the first attempt's start time, so those survive park, resume, and process
|
|
80
|
+
death. See [Retry a failing action](../guides/retry-a-failing-action.md).
|
|
81
|
+
|
|
82
|
+
## Failures, defects, and parking on either
|
|
83
|
+
|
|
84
|
+
Two annotations on the flow decide what a round does with something that went
|
|
85
|
+
wrong:
|
|
86
|
+
|
|
87
|
+
```ts
|
|
88
|
+
import { Flow } from "@smthrs/flow"
|
|
89
|
+
|
|
90
|
+
const Hardened = Review
|
|
91
|
+
.annotate(Flow.CaptureDefects, true)
|
|
92
|
+
.annotate(Flow.SuspendOnFailure, true)
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
- `Flow.CaptureDefects` defaults to `true`. It includes defects in the result of
|
|
96
|
+
the flow and its actions instead of letting them escape the execution.
|
|
97
|
+
- `Flow.SuspendOnFailure` defaults to `false`. Set it when a round should park on
|
|
98
|
+
any error rather than fail, so an operator can fix the cause and resume.
|
|
99
|
+
|
|
100
|
+
`Flow.intoResult` is what turns a handler effect into a `Result` under those two
|
|
101
|
+
annotations, and it closes the round's flow scope on completion or handoff.
|
|
102
|
+
|
|
103
|
+
## Scope and cleanup
|
|
104
|
+
|
|
105
|
+
Each round has its own flow scope. Suspension keeps that scope open for a
|
|
106
|
+
re-drive of the same instance. Terminal completion closes it with the round's
|
|
107
|
+
success or failure exit. Handoff closes it with a success exit; the next round
|
|
108
|
+
has a fresh scope.
|
|
109
|
+
|
|
110
|
+
A handoff completes the round successfully and discards its `withRollback` registrations.
|
|
111
|
+
A later round's failure cannot invoke an earlier round's rollback. The engine
|
|
112
|
+
does not provide lineage-scoped compensation. Compensation across rounds
|
|
113
|
+
requires an explicit durable design, not an in-memory scope finalizer. Open
|
|
114
|
+
scopes and their resources do not survive process death.
|
|
115
|
+
|
|
116
|
+
- `Flow.scope` is the scope itself.
|
|
117
|
+
- `Flow.provideScope(effect)` runs an effect against it.
|
|
118
|
+
- `Flow.addFinalizer(f)` registers an exit finalizer, preserving the services
|
|
119
|
+
available where it was registered.
|
|
120
|
+
- `Flow.withRollback(effect, rollback)` registers how to undo a successful effect
|
|
121
|
+
if the current round later exits unsuccessfully. See
|
|
122
|
+
[Cancel a run and undo its effects](../guides/cancel-and-roll-back.md).
|
|
123
|
+
|
|
124
|
+
## Related pages
|
|
125
|
+
|
|
126
|
+
- [Wait for a deadline](../guides/wait-for-a-deadline.md) and
|
|
127
|
+
[wait for an external signal](../guides/wait-for-an-external-signal.md): the
|
|
128
|
+
two ways a body parks on purpose.
|
|
129
|
+
- [Trampoline rounds](./trampoline-rounds.md): the third result, and the loops it
|
|
130
|
+
makes possible.
|