@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,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Prompt-backed flows"
|
|
3
|
+
description: "Declare a typed prompt with Flow.make and attach its host implementation to the ordinary action it lowers to."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Declare exactly one of `body` or `prompt` with the same tagged constructor:
|
|
7
|
+
|
|
8
|
+
```ts
|
|
9
|
+
import { Flow } from "@smthrs/flow"
|
|
10
|
+
import * as Schema from "effect/Schema"
|
|
11
|
+
|
|
12
|
+
export const Draft = Flow.make("draft", {
|
|
13
|
+
description: "Drafts a response.",
|
|
14
|
+
payload: { message: Schema.String },
|
|
15
|
+
success: Schema.String,
|
|
16
|
+
prompt: ({ message }) => `Respond to: ${message}`
|
|
17
|
+
})
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
`Draft` is an ordinary flow. Its body calls `Draft.action`, an ordinary action
|
|
21
|
+
named `draft/prompt`. Constructing the declaration and building its graph never
|
|
22
|
+
render the prompt or call a model. The host renders `Draft.prompt(payload)`
|
|
23
|
+
inside the implementation it attaches with `Draft.action.toLayer(...)`.
|
|
24
|
+
|
|
25
|
+
The prompt receives the decoded payload. Missing or incorrectly typed props
|
|
26
|
+
are TypeScript errors. A host may render an imported typed MDX component from
|
|
27
|
+
that callback; see [MDX prompts](/pkg/registry/guides/mdx-prompts).
|
|
28
|
+
|
|
29
|
+
`model` may name a seat or an ordered nonempty fallback list. When omitted,
|
|
30
|
+
the host supplies its resolved seat. `effort`, `flows`, `system`, and `chat`
|
|
31
|
+
retain host metadata. They do not start a model or widen authority. Declare
|
|
32
|
+
`capabilities` and `effects` for the same ceiling a body-backed flow uses.
|
|
33
|
+
|
|
34
|
+
Supply the model implementation's failure schema as `error`. For the existing
|
|
35
|
+
agent host, use `AgentAction.AgentFailure` from `@smthrs/agent/AgentAction`.
|
|
36
|
+
A prompt action defaults to the irreversible tier and has no content cache key.
|
|
37
|
+
Register `Interpreter.layer(Draft)` and the action implementation under the
|
|
38
|
+
host's ordinary runtime and `Action.layerImplementations`.
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Wait for a deadline"
|
|
3
|
+
description: "Park a round on a durable timer with Sleep.action, sleep inside an implementation with DurableClock, and read the refusals an unarmable deadline earns."
|
|
4
|
+
sidebar:
|
|
5
|
+
order: 4
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
There are two ways to wait for time to pass, and which one you reach for depends
|
|
9
|
+
on where you are standing.
|
|
10
|
+
|
|
11
|
+
- In a **body**, call `Sleep.action`. The wait becomes a keyed plan node: visible
|
|
12
|
+
in the graph, skippable by a branch, and replayed like any other step.
|
|
13
|
+
- In an **implementation**, call `DurableClock.sleep`. A body cannot see it, but
|
|
14
|
+
a handler can reach it.
|
|
15
|
+
|
|
16
|
+
Both park the execution rather than holding a fiber, so the wait outlives the
|
|
17
|
+
process.
|
|
18
|
+
|
|
19
|
+
## Wait inside a body
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
import { Action, Flow, Interpreter, Sleep } from "@smthrs/flow"
|
|
23
|
+
import { Node } from "@smthrs/plan"
|
|
24
|
+
import * as Layer from "effect/Layer"
|
|
25
|
+
import * as Schema from "effect/Schema"
|
|
26
|
+
|
|
27
|
+
const Notify = Action.make("release/Notify", {
|
|
28
|
+
payload: { build: Schema.String },
|
|
29
|
+
success: Schema.String
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
export const Cooldown = Flow.make("release/Cooldown", {
|
|
33
|
+
payload: { build: Schema.String },
|
|
34
|
+
success: Schema.String,
|
|
35
|
+
error: Sleep.SleepRequestInvalid,
|
|
36
|
+
body: ({ build }) =>
|
|
37
|
+
Sleep.action.call({ millis: 60_000 }).pipe(
|
|
38
|
+
Node.andThen(Notify.call({ build }))
|
|
39
|
+
)
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
export const layer = Layer.mergeAll(
|
|
43
|
+
Sleep.layer,
|
|
44
|
+
Notify.toLayer(({ build }) => notifyRelease(build)),
|
|
45
|
+
Interpreter.layer(Cooldown)
|
|
46
|
+
).pipe(Layer.provideMerge(Action.layerImplementations))
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
`Sleep.layer` is not optional. `Sleep.action` is declared with
|
|
50
|
+
`Action.makeSystem`, so it pushes no compile-time obligation onto callers, but a
|
|
51
|
+
composition without the layer has a plan node no implementation answers.
|
|
52
|
+
|
|
53
|
+
The implementation arms a durable clock, declares its park as `timer` with the
|
|
54
|
+
deadline as `wakeAt`, and awaits the clock's deferred. Once the clock has fired,
|
|
55
|
+
its result is persisted, so a re-driven round reads it and runs straight through
|
|
56
|
+
instead of parking a second time.
|
|
57
|
+
|
|
58
|
+
## Name exactly one deadline
|
|
59
|
+
|
|
60
|
+
A payload carries a relative `millis` or an absolute `until` in epoch
|
|
61
|
+
milliseconds, and exactly one of them. `Sleep.SleepRequestInvalid` is the typed
|
|
62
|
+
refusal, so a body can recover from it with `Node.catch` like any other declared
|
|
63
|
+
failure:
|
|
64
|
+
|
|
65
|
+
| Code | What was wrong |
|
|
66
|
+
| -------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
|
|
67
|
+
| `missing_deadline` | The payload named neither `millis` nor `until`. |
|
|
68
|
+
| `ambiguous_deadline` | It named both, which are the same fact stated twice. |
|
|
69
|
+
| `invalid_deadline` | It named a number that is not a length of time: a non-finite or negative `millis`, a non-finite `until`, or an addition that overflows. |
|
|
70
|
+
|
|
71
|
+
Two behaviors are worth knowing before you write the body:
|
|
72
|
+
|
|
73
|
+
- **Two waits of the same length are two waits.** Each call is its own node with
|
|
74
|
+
its own identity, so a sleep followed by a sleep waits twice.
|
|
75
|
+
- **A deadline that has already passed settles the node instead of parking it.**
|
|
76
|
+
A run that resumes after its own deadline has to make progress.
|
|
77
|
+
|
|
78
|
+
## Wait inside an implementation
|
|
79
|
+
|
|
80
|
+
`DurableClock.sleep` is the handler-side wait:
|
|
81
|
+
|
|
82
|
+
```ts
|
|
83
|
+
import { DurableClock } from "@smthrs/flow"
|
|
84
|
+
|
|
85
|
+
const wait = DurableClock.sleep({
|
|
86
|
+
name: "cooldown",
|
|
87
|
+
duration: "2 days",
|
|
88
|
+
inMemoryThreshold: "30 seconds"
|
|
89
|
+
})
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
The threshold decides the mechanism. A duration at or below
|
|
93
|
+
`inMemoryThreshold`, 60 seconds by default, runs as an in-memory sealed action.
|
|
94
|
+
A longer one schedules a durable clock and suspends the execution. A zero
|
|
95
|
+
duration returns immediately. Both the duration and the threshold must be finite
|
|
96
|
+
and not negative.
|
|
97
|
+
|
|
98
|
+
`DurableClock.make({ name, duration })` builds the clock value on its own, which
|
|
99
|
+
is what you want when you need the clock's deferred rather than the wait, for
|
|
100
|
+
example to race it against real work.
|
|
101
|
+
|
|
102
|
+
## Bound work with a clock
|
|
103
|
+
|
|
104
|
+
Racing a durable clock against the work is how you put a durable time limit on
|
|
105
|
+
something that can hang. The race records its winner, so a re-driven round reads
|
|
106
|
+
the recorded outcome instead of racing again:
|
|
107
|
+
|
|
108
|
+
```ts
|
|
109
|
+
import { DurableDeferred } from "@smthrs/flow"
|
|
110
|
+
import * as Duration from "effect/Duration"
|
|
111
|
+
import * as Effect from "effect/Effect"
|
|
112
|
+
|
|
113
|
+
const bounded = DurableDeferred.raceAll({
|
|
114
|
+
name: "deploy/status",
|
|
115
|
+
success: Schema.String,
|
|
116
|
+
error: Schema.Never,
|
|
117
|
+
effects: [
|
|
118
|
+
readDeployment("web"),
|
|
119
|
+
Effect.as(
|
|
120
|
+
DurableClock.sleep({
|
|
121
|
+
name: "deploy/status",
|
|
122
|
+
duration: Duration.seconds(30),
|
|
123
|
+
inMemoryThreshold: Duration.zero
|
|
124
|
+
}),
|
|
125
|
+
"unknown"
|
|
126
|
+
)
|
|
127
|
+
]
|
|
128
|
+
})
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
`inMemoryThreshold: Duration.zero` forces the durable path, so the bound outlives
|
|
132
|
+
the process waiting on it rather than living in a fiber.
|
|
133
|
+
|
|
134
|
+
## Related pages
|
|
135
|
+
|
|
136
|
+
- [Wait for an external signal](./wait-for-an-external-signal.md): the other
|
|
137
|
+
system wait, and the tokens that resolve it.
|
|
138
|
+
- [Poll until something is ready](./poll-until-ready.md): a timer and a check,
|
|
139
|
+
packaged as a lineage of rounds.
|
|
140
|
+
- [Suspension and replay](../concepts/suspension-and-replay.md): what parking
|
|
141
|
+
does to the run.
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Wait for an external signal"
|
|
3
|
+
description: "Park a round on a named wait point, resolve it from another process with a completion token, and use durable deferreds directly."
|
|
4
|
+
sidebar:
|
|
5
|
+
order: 5
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
A run often has to wait for something that is not time and not a step: an
|
|
9
|
+
approval, a webhook, a human closing a ticket. `WaitFor.action` is that wait as an
|
|
10
|
+
ordinary plan node, and a `DurableDeferred` token is how the outside world
|
|
11
|
+
resolves it.
|
|
12
|
+
|
|
13
|
+
## Park the body on a named wait point
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
import { Action, Flow, Interpreter, WaitFor } from "@smthrs/flow"
|
|
17
|
+
import { Node } from "@smthrs/plan"
|
|
18
|
+
import * as Layer from "effect/Layer"
|
|
19
|
+
import * as Schema from "effect/Schema"
|
|
20
|
+
|
|
21
|
+
const Deploy = Action.make("release/Deploy", {
|
|
22
|
+
payload: { build: Schema.String },
|
|
23
|
+
success: Schema.String
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
export const Ship = Flow.make("release/Ship", {
|
|
27
|
+
payload: { build: Schema.String },
|
|
28
|
+
success: Schema.String,
|
|
29
|
+
error: WaitFor.WaitForRequestInvalid,
|
|
30
|
+
body: ({ build }) =>
|
|
31
|
+
WaitFor.action.call({ name: "ship" }).pipe(
|
|
32
|
+
Node.andThen(Deploy.call({ build }))
|
|
33
|
+
)
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
export const layer = Layer.mergeAll(
|
|
37
|
+
WaitFor.layer,
|
|
38
|
+
Deploy.toLayer(({ build }) => deployBuild(build)),
|
|
39
|
+
Interpreter.layer(Ship)
|
|
40
|
+
).pipe(Layer.provideMerge(Action.layerImplementations))
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
The implementation parks the execution under the `event` waiting reason, carrying
|
|
44
|
+
the wake token a completion is matched against, and settles with whatever value
|
|
45
|
+
resolved the wait. `WaitFor.action` succeeds with `Schema.Json`, so decode the
|
|
46
|
+
answer with a schema when you need a typed value.
|
|
47
|
+
|
|
48
|
+
`WaitFor.layer` is required in the composition for the same reason `Sleep.layer`
|
|
49
|
+
is: the node is a system declaration, so the compiler does not ask for it, but
|
|
50
|
+
the run does.
|
|
51
|
+
|
|
52
|
+
## Resolve it from outside
|
|
53
|
+
|
|
54
|
+
`WaitFor.deferred(name)` is the resolver's half of the same wait point. Derive
|
|
55
|
+
the token from the flow and the execution id, then complete it:
|
|
56
|
+
|
|
57
|
+
```ts
|
|
58
|
+
import { DurableDeferred } from "@smthrs/flow"
|
|
59
|
+
import * as Effect from "effect/Effect"
|
|
60
|
+
|
|
61
|
+
const gate = WaitFor.deferred("ship")
|
|
62
|
+
|
|
63
|
+
export const approve = (executionId: string) =>
|
|
64
|
+
Effect.gen(function*() {
|
|
65
|
+
const token = DurableDeferred.tokenFromExecutionId(gate, { flow: Ship, executionId })
|
|
66
|
+
yield* DurableDeferred.succeed(gate, { token, value: { approved: true } })
|
|
67
|
+
})
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
The resolver needs the `FlowRuntime` the run was started on, because a completion
|
|
71
|
+
is recorded against the flow and execution that own the wait point. In practice
|
|
72
|
+
that means the resolver and the engine share a store.
|
|
73
|
+
|
|
74
|
+
`DurableDeferred.tokenFromPayload(gate, { flow, payload })` derives the same token
|
|
75
|
+
from a payload, for a resolver that knows what was asked for but not which id it
|
|
76
|
+
was admitted under. This requires the flow to declare `idempotencyKey`; use
|
|
77
|
+
`tokenFromExecutionId` when the caller supplied an execution id explicitly.
|
|
78
|
+
|
|
79
|
+
A token is an address, not a credential. Anyone who knows the flow and the
|
|
80
|
+
execution id, or the payload, can rebuild it, so a resolver that accepts
|
|
81
|
+
completions from other parties must authorize the caller before it calls
|
|
82
|
+
`DurableDeferred.succeed`.
|
|
83
|
+
|
|
84
|
+
## Name exactly one target
|
|
85
|
+
|
|
86
|
+
A `WaitFor` payload names the wait point by `name`, relative to the running
|
|
87
|
+
execution, or by an absolute `token`. `WaitFor.WaitForRequestInvalid` is the
|
|
88
|
+
typed refusal:
|
|
89
|
+
|
|
90
|
+
| Code | What was wrong |
|
|
91
|
+
| ------------------- | ------------------------------------------------------------------------------------------------- |
|
|
92
|
+
| `missing_target` | The payload named neither `name` nor `token`. |
|
|
93
|
+
| `ambiguous_target` | It named both. |
|
|
94
|
+
| `malformed_token` | The token does not parse. |
|
|
95
|
+
| `foreign_execution` | The token is addressed to another flow or another execution, which this execution cannot observe. |
|
|
96
|
+
|
|
97
|
+
`foreign_execution` is a refusal rather than a silent park because a foreign
|
|
98
|
+
token would park forever while the value it names was recorded somewhere else.
|
|
99
|
+
|
|
100
|
+
## Durable deferreds on their own
|
|
101
|
+
|
|
102
|
+
`WaitFor` is a thin declaration over `DurableDeferred`, and you can use the
|
|
103
|
+
primitive directly inside an implementation:
|
|
104
|
+
|
|
105
|
+
```ts
|
|
106
|
+
const Approval = DurableDeferred.make("Approval", {
|
|
107
|
+
success: Schema.Boolean,
|
|
108
|
+
error: Schema.String
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
// Inside a flow: park until it is completed.
|
|
112
|
+
const awaited = DurableDeferred.await(Approval)
|
|
113
|
+
|
|
114
|
+
// Or run an effect and record its exit into the deferred.
|
|
115
|
+
const computed = DurableDeferred.into(Effect.succeed(true), Approval)
|
|
116
|
+
|
|
117
|
+
// Race several, persisting the first exit under `raceAll/first-answer`.
|
|
118
|
+
const winner = DurableDeferred.raceAll({
|
|
119
|
+
name: "first-answer",
|
|
120
|
+
success: Schema.Boolean,
|
|
121
|
+
error: Schema.String,
|
|
122
|
+
effects: [awaited, computed]
|
|
123
|
+
})
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Four surfaces complete a deferred from outside, and all four take a token:
|
|
127
|
+
`DurableDeferred.succeed`, `fail`, `failCause`, and `done` with a full `Exit`.
|
|
128
|
+
Inside a running flow, `DurableDeferred.token(self)` mints the token for the
|
|
129
|
+
current execution.
|
|
130
|
+
|
|
131
|
+
Two rules govern every completion:
|
|
132
|
+
|
|
133
|
+
- **First writer wins.** The first recorded exit is the one every later read
|
|
134
|
+
replays. A second completion does not overwrite it.
|
|
135
|
+
- **A token names one deferred.** A token whose `deferredName` is not this
|
|
136
|
+
deferred's fails with `DurableDeferred.TokenInvalid` carrying
|
|
137
|
+
`deferred_mismatch`, and a token that does not parse fails with
|
|
138
|
+
`malformed_token`.
|
|
139
|
+
|
|
140
|
+
A token encodes the flow name, the execution id, and the deferred name, which is
|
|
141
|
+
exactly what another process needs to write to the right durable address.
|
|
142
|
+
`DurableDeferred.TokenParsed` is the decoded form.
|
|
143
|
+
|
|
144
|
+
## Related pages
|
|
145
|
+
|
|
146
|
+
- [Ask a person for a decision](./ask-a-person.md): the same wait point machinery
|
|
147
|
+
with validation, re-asking, and a deadline on top.
|
|
148
|
+
- [Wait for a deadline](./wait-for-a-deadline.md): the timer half of the same
|
|
149
|
+
vocabulary.
|
|
150
|
+
- [Hand work to a durable worker](./queue-work-to-a-worker.md): a deferred used
|
|
151
|
+
as a request and response channel.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Installation"
|
|
3
|
+
description: "Install @smthrs/flow, its runtime requirements and pinned effect version, its import forms, and the packages a runnable composition adds."
|
|
4
|
+
sidebar:
|
|
5
|
+
order: 1
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Install the package
|
|
9
|
+
|
|
10
|
+
`@smthrs/flow` is not on npm yet. Link the source packages as described in [Use the libraries](#use-the-libraries).
|
|
11
|
+
|
|
12
|
+
`effect` is a runtime dependency of this package and installs with it. Add it to
|
|
13
|
+
your own dependencies at the same version anyway: your declarations import
|
|
14
|
+
`effect/Schema` and your implementations import `effect/Effect` directly, and two
|
|
15
|
+
copies of `effect` in one program are two sets of service tags.
|
|
16
|
+
|
|
17
|
+
The package requires Node.js 26.4.0 or later. It ships as both ESM and
|
|
18
|
+
CommonJS with TypeScript declarations, and it pulls in
|
|
19
|
+
[`@smthrs/plan`](/api/plan), [`@smthrs/crypto`](/api/crypto),
|
|
20
|
+
[`@smthrs/keys`](/api/keys), and [`@smthrs/canonical`](/api/canonical), which
|
|
21
|
+
supply the node vocabulary a body is written in, the digests identity is built
|
|
22
|
+
from, and the canonical JSON checks applied to values.
|
|
23
|
+
|
|
24
|
+
## Use the libraries
|
|
25
|
+
|
|
26
|
+
First [install the source checkout](https://github.com/smithersai/smithers/blob/main/packages/smithers/docs/installation.md#install-the-cli). The checkout's `examples` workspace carries the packages used by the flow tutorials and their pinned `effect@4.0.0-rc.115`.
|
|
27
|
+
|
|
28
|
+
Create a project beside the checkout:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
mkdir my-flows && cd my-flows
|
|
32
|
+
echo '{ "type": "module" }' > package.json
|
|
33
|
+
ln -s /path/to/smithers/examples/node_modules node_modules
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Replace `/path/to/smithers` with the absolute path to your installed checkout. Run programs with `node <file>.ts`. Packages absent from the examples workspace, such as `@smthrs/artifacts`, resolve only inside the checkout; use the owning package's workspace for those examples. This linking recipe uses source exports and requires no package build.
|
|
37
|
+
|
|
38
|
+
## Import forms
|
|
39
|
+
|
|
40
|
+
The root entry point re-exports every module as a namespace:
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
import { Action, DurableDeferred, Flow, Interpreter, RetryPolicy } from "@smthrs/flow"
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Several modules are also importable from their own subpath, which is the form the
|
|
47
|
+
reference uses:
|
|
48
|
+
|
|
49
|
+
```ts
|
|
50
|
+
import * as CacheEnvironment from "@smthrs/flow/CacheEnvironment"
|
|
51
|
+
import * as Flow from "@smthrs/flow/Flow"
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
The `exports` map publishes `@smthrs/flow/Action`, `/CacheEnvironment`,
|
|
55
|
+
`/FileBoundary`, `/FileInput`, `/Flow`, `/FlowRuntime`, `/StepIdentity`, and one
|
|
56
|
+
subpath per top-level module (`DurableClock`, `DurableDeferred`, `DurableQueue`,
|
|
57
|
+
`Graph`, `HumanTask`, `Interpreter`, `Poll`, `RetryPolicy`, `Sleep`, `WaitFor`).
|
|
58
|
+
Four subpath shapes resolve to nothing on purpose: `@smthrs/flow/internal/*`,
|
|
59
|
+
`@smthrs/flow/*/index`, and the per-file paths under `Action/`, `Flow/`, and
|
|
60
|
+
`FlowRuntime/`. Reach those namespaces through their directory subpath instead.
|
|
61
|
+
`@smthrs/flow/package.json` is exported.
|
|
62
|
+
|
|
63
|
+
## What a runnable composition adds
|
|
64
|
+
|
|
65
|
+
This package declares the `FlowRuntime` port and implements none of it, so a
|
|
66
|
+
composition that runs a flow adds an engine and a platform crypto service.
|
|
67
|
+
|
|
68
|
+
- [`@smthrs/engine`](/api/engine) implements `FlowRuntime`. Its
|
|
69
|
+
`FlowEngine.layerMemory` keeps every recorded step in the process, which is
|
|
70
|
+
what the [Quickstart](./quickstart.md) and most tests use.
|
|
71
|
+
- `@effect/platform-node` supplies `NodeCrypto.layer`. An action dispatch is
|
|
72
|
+
recorded under a derived step identity, so the engine needs a `Crypto` service
|
|
73
|
+
even in memory. A browser host supplies its own, such as `BrowserCrypto` from
|
|
74
|
+
`@effect/platform-browser`; nothing in this package imports a Node built-in.
|
|
75
|
+
|
|
76
|
+
Add [`@smthrs/engine-store`](/api/engine-store) when the recorded steps have to
|
|
77
|
+
outlive the process. It backs the same port with SQLite, which is what turns a
|
|
78
|
+
suspended run into one a later process resumes.
|
|
79
|
+
|
|
80
|
+
## Next step
|
|
81
|
+
|
|
82
|
+
Run a flow end to end in the [Quickstart](./quickstart.md).
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Quickstart"
|
|
3
|
+
description: "Declare an action and a flow, compose the layers, run the flow on the in-memory engine, and read a typed result."
|
|
4
|
+
sidebar:
|
|
5
|
+
order: 2
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
This quickstart runs one flow end to end on the in-memory engine. Nothing here
|
|
9
|
+
touches a database or the network, and the result arrives as a typed value
|
|
10
|
+
decoded by the schema you declared.
|
|
11
|
+
|
|
12
|
+
A runnable copy of this program is published in the Smithers examples,
|
|
13
|
+
[`01-define-and-run.ts`](https://github.com/smithersai/smithers/blob/main/examples/src/01-define-and-run.ts).
|
|
14
|
+
|
|
15
|
+
## Prerequisites
|
|
16
|
+
|
|
17
|
+
- Node.js 26.4.0 or later.
|
|
18
|
+
- A package with the dependencies installed. Not on npm yet; see [Installation](./installation.md#use-the-libraries).
|
|
19
|
+
|
|
20
|
+
## Declare the action and the flow
|
|
21
|
+
|
|
22
|
+
Create `quickstart.ts`. `Action.make` with a string tag is the declared form:
|
|
23
|
+
schemas and a stable name, no code.
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
import { Action, Flow } from "@smthrs/flow"
|
|
27
|
+
import { Node } from "@smthrs/plan"
|
|
28
|
+
import * as Schema from "effect/Schema"
|
|
29
|
+
|
|
30
|
+
export const Greet = Action.make("examples/Greet", {
|
|
31
|
+
payload: { name: Schema.String },
|
|
32
|
+
success: Schema.String
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
export const Greeting = Flow.make("examples/Greeting", {
|
|
36
|
+
payload: { name: Schema.String },
|
|
37
|
+
success: Schema.String,
|
|
38
|
+
body: Node.capture(
|
|
39
|
+
{ action: Greet.name, implementationVersion: "greeting/v1" },
|
|
40
|
+
(payload) => Greet.call(payload)
|
|
41
|
+
)
|
|
42
|
+
})
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
`Greet.call(payload)` records one node and runs nothing. It also puts a
|
|
46
|
+
requirement in the node's type, which `Flow.make` reads off the body: the flow
|
|
47
|
+
now says in its own type that it names an implementation it does not carry.
|
|
48
|
+
|
|
49
|
+
## Attach the implementation and compose the layers
|
|
50
|
+
|
|
51
|
+
`Node.capture` declares every semantic value outside the callback source. Here
|
|
52
|
+
it names the action and versions the imported behavior. Change that version when
|
|
53
|
+
that behavior changes. JavaScript cannot verify capture completeness.
|
|
54
|
+
|
|
55
|
+
`toLayer` is where the code lives. `Interpreter.layerWithImplementations`
|
|
56
|
+
registers the flow and its implementations with stable callback admission. It
|
|
57
|
+
refuses uncaptured callbacks before dispatch. The lower-level `Graph.build` and
|
|
58
|
+
`Interpreter.layer` default to `process-local`, which makes no cross-process
|
|
59
|
+
callback identity guarantee.
|
|
60
|
+
|
|
61
|
+
Compose the layers:
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
import * as NodeCrypto from "@effect/platform-node/NodeCrypto"
|
|
65
|
+
import { FlowEngine } from "@smthrs/engine"
|
|
66
|
+
import { Interpreter } from "@smthrs/flow"
|
|
67
|
+
import * as Effect from "effect/Effect"
|
|
68
|
+
import * as Layer from "effect/Layer"
|
|
69
|
+
|
|
70
|
+
const GreetingLayer = Interpreter.layerWithImplementations(
|
|
71
|
+
Greeting,
|
|
72
|
+
Greet.toLayer(({ name }) => Effect.succeed(`Hello, ${name}.`))
|
|
73
|
+
).pipe(
|
|
74
|
+
Layer.provideMerge(FlowEngine.layerMemory),
|
|
75
|
+
Layer.provideMerge(NodeCrypto.layer)
|
|
76
|
+
)
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
`layerWithImplementations` supplies the action registry while building the
|
|
80
|
+
implementation layers. The remaining providers supply the runtime and digest:
|
|
81
|
+
|
|
82
|
+
- `FlowEngine.layerMemory` supplies the `FlowRuntime` port. Swap it for the
|
|
83
|
+
durable engine from [`@smthrs/engine-store`](/api/engine-store) and nothing
|
|
84
|
+
above changes.
|
|
85
|
+
- `NodeCrypto.layer` supplies `Crypto`. Every dispatch is recorded under a
|
|
86
|
+
derived step identity, so the engine needs a digest even in memory.
|
|
87
|
+
|
|
88
|
+
## Run it
|
|
89
|
+
|
|
90
|
+
`execute` takes the payload and an execution id:
|
|
91
|
+
|
|
92
|
+
```ts
|
|
93
|
+
export const main: Effect.Effect<string> = Greeting.execute(
|
|
94
|
+
{ name: "Ada" },
|
|
95
|
+
{ executionId: "greeting-ada-1" }
|
|
96
|
+
).pipe(
|
|
97
|
+
// A payload that misses the flow's schema is a typed failure, not a defect.
|
|
98
|
+
// This payload is statically valid, so a refusal here would be a bug.
|
|
99
|
+
Effect.orDie,
|
|
100
|
+
Effect.provide(GreetingLayer)
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
console.log(await Effect.runPromise(main))
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Run the file with your TypeScript runner. The output is the decoded success
|
|
107
|
+
value:
|
|
108
|
+
|
|
109
|
+
```text
|
|
110
|
+
Hello, Ada.
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Run it twice
|
|
114
|
+
|
|
115
|
+
Execute the same flow again under the same execution id. The action does not run
|
|
116
|
+
a second time:
|
|
117
|
+
|
|
118
|
+
```ts
|
|
119
|
+
export const twice: Effect.Effect<string> = Effect.gen(function*() {
|
|
120
|
+
const run = Effect.orDie(
|
|
121
|
+
Greeting.execute({ name: "Ada" }, { executionId: "greeting-ada-1" })
|
|
122
|
+
)
|
|
123
|
+
yield* run
|
|
124
|
+
return yield* run
|
|
125
|
+
}).pipe(Effect.provide(GreetingLayer))
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
An execution id names one run. The second call finds the run that already
|
|
129
|
+
settled and answers with its result instead of starting another, and a durable
|
|
130
|
+
engine behaves the same way across a restart: it rebuilds the plan, derives the
|
|
131
|
+
same key for the same node, reads the recorded result, and reaches only the
|
|
132
|
+
steps that never settled. That is what separating the plan from the code buys.
|
|
133
|
+
Identity is a function of the declaration, so a repeat is a read.
|
|
134
|
+
|
|
135
|
+
An execution id is also a claim about what the run is. Reusing one for a
|
|
136
|
+
different flow, or for a different payload, is refused rather than silently
|
|
137
|
+
joined.
|
|
138
|
+
|
|
139
|
+
## What just happened
|
|
140
|
+
|
|
141
|
+
`Greeting.execute` asked the runtime for an execution under
|
|
142
|
+
`greeting-ada-1`. The interpreter built the graph of the body, walked it, and
|
|
143
|
+
dispatched `examples/Greet` through the engine, which recorded the attempt and
|
|
144
|
+
its result. With a pure body, complete captures, and stable callback admission,
|
|
145
|
+
unchanged source, captures, declarations, and payload reproduce the same plan
|
|
146
|
+
keys across processes. Changed source, captures, or implementation versions
|
|
147
|
+
require a newly planned run.
|
|
148
|
+
|
|
149
|
+
## Next steps
|
|
150
|
+
|
|
151
|
+
- [Flows and actions](./concepts/flows-and-actions.md): why the implementation
|
|
152
|
+
attaches separately, and what the requirement channel buys you.
|
|
153
|
+
- [Build a body](./guides/build-a-body.md): sequencing, fan-out, branches, and
|
|
154
|
+
recovering from a typed failure.
|
|
155
|
+
- [Testing](./testing.md): the same in-memory composition as a test habit.
|