import * as Cause from "../Cause.ts"; import * as Context from "../Context.ts"; import * as Effect from "../Effect.ts"; import * as Exit from "../Exit.ts"; import * as Layer from "../Layer.ts"; import type * as Option from "../Option.ts"; import type { ExitEncoded } from "../rpc/RpcMessage.ts"; import type * as Schedule from "../Schedule.ts"; import * as Schema from "../Schema.ts"; import * as Scope from "../Scope.ts"; import type { WorkflowEngine, WorkflowInstance } from "./WorkflowEngine.ts"; declare const TypeId = "~effect/workflow/Workflow"; /** * Durable workflow definition with typed payload, success, and error schemas * plus operations for execution, polling, interruption, resumption, and * registration. * * @stability unstable * @category models * @since 4.0.0 */ export interface Workflow { new (_: never): {}; readonly [TypeId]: typeof TypeId; readonly _tag: Tag; readonly payloadSchema: Payload; readonly successSchema: Success; readonly errorSchema: Error; readonly annotations: Context.Context; readonly idempotencyKey: (payload: Payload["Type"]) => string; readonly suspendedRetrySchedule?: Schedule.Schedule | undefined; /** * Add an annotation to the workflow. */ annotate(key: Context.Key, value: S): Workflow; /** * Merge multiple annotations into the workflow. */ annotateMerge(annotations: Context.Context): Workflow; /** * Execute the workflow with the given payload. * * **Details** * * `discard: true` returns the execution ID without waiting for the result. * The child remains linked to its parent for completion wakes and interruption. * * With `discard: true, detached: true`, the child neither wakes its parent * nor gets interrupted with it. The cluster engine retains the parent for * observability. * * **Gotchas** * * Do not await a detached execution later. Executing the same payload joins * it, but its completion will not wake the awaiting workflow. */ readonly execute: (payload: Payload["~type.make.in"], options?: { readonly discard?: Discard; readonly detached?: [Discard] extends [true] ? boolean | undefined : undefined; }) => Effect.Effect; /** * Poll the current status of a workflow execution. */ readonly poll: (executionId: string) => Effect.Effect>, never, WorkflowEngine | Success["DecodingServices"] | Error["DecodingServices"]>; /** * Interrupt a workflow execution for the given execution ID. */ readonly interrupt: (executionId: string) => Effect.Effect; /** * Manually resume a workflow execution for the given execution ID. */ readonly resume: (executionId: string) => Effect.Effect; /** * Create a layer that registers the workflow and provides an effect to * execute it. */ readonly toLayer: (execute: (payload: Payload["Type"], executionId: string) => Effect.Effect) => Layer.Layer | Scope.Scope> | Payload["DecodingServices"] | Payload["EncodingServices"] | Success["DecodingServices"] | Success["EncodingServices"] | Error["DecodingServices"] | Error["EncodingServices"]>; /** * For the given payload, compute the deterministic execution ID. */ readonly executionId: (payload: Payload["~type.make.in"]) => Effect.Effect; /** * Add compensation logic to an effect inside a Workflow. * * **Details** * * The compensation finalizer is called if the entire workflow fails, allowing you to perform cleanup or other actions based on the success value and the cause of the workflow failure. * * **Gotchas** * * Compensation finalizers are only registered for top-level effects in the workflow and do not work for nested activities. */ readonly withCompensation: { (compensation: (value: A, cause: Cause.Cause) => Effect.Effect): (effect: Effect.Effect) => Effect.Effect | Scope.Scope>; (effect: Effect.Effect, compensation: (value: A, cause: Cause.Cause) => Effect.Effect): Effect.Effect | Scope.Scope>; }; } /** * Schema constraint for workflow payload schemas that expose struct fields. * * @stability unstable * @category schemas * @since 4.0.0 */ export interface AnyStructSchema extends Schema.Top { readonly fields: Schema.Struct.Fields; } /** * Type-level marker for services associated with a specific workflow * execution tag. * * @stability unstable * @category utility types * @since 4.0.0 */ export interface Execution { readonly _: unique symbol; readonly _tag: Tag; } /** * Type-erased workflow shape for APIs that operate on workflows without * preserving their specific payload, success, or error types. * * @stability unstable * @category models * @since 4.0.0 */ export interface Any { new (_: never): {}; readonly [TypeId]: typeof TypeId; readonly _tag: string; readonly executionId: (payload: any) => Effect.Effect; readonly payloadSchema: AnyStructSchema; readonly successSchema: Schema.Top; readonly errorSchema: Schema.Top; readonly annotations: Context.Context; readonly idempotencyKey: (payload: any) => string; readonly suspendedRetrySchedule?: Schedule.Schedule | undefined; } /** * Type-erased workflow shape that also exposes executable operations needed by * workflow proxy and engine helpers. * * @stability unstable * @category models * @since 4.0.0 */ export interface AnyWithProps extends Any { readonly payloadSchema: AnyStructSchema; readonly successSchema: Schema.Top; readonly errorSchema: Schema.Top; readonly execute: (payload: any, options?: { readonly discard?: boolean; readonly detached?: boolean | undefined; }) => Effect.Effect; readonly resume: (executionId: string) => Effect.Effect; } /** * Extracts the payload schema from a `Workflow`. * * @stability unstable * @category utility types * @since 4.0.0 */ export type PayloadSchema = W extends Workflow ? _Payload : never; /** * Computes the schema services required by clients that execute or poll * workflows. * * @stability unstable * @category utility types * @since 4.0.0 */ export type RequirementsClient = Workflows extends Workflow ? _Payload["EncodingServices"] | _Success["DecodingServices"] | _Error["DecodingServices"] : never; /** * Computes the schema services required by handlers that decode workflow * payloads and encode workflow results. * * @stability unstable * @category utility types * @since 4.0.0 */ export type RequirementsHandler = Workflows extends Workflow ? _Payload["DecodingServices"] | _Payload["EncodingServices"] | _Success["DecodingServices"] | _Success["EncodingServices"] | _Error["DecodingServices"] | _Error["EncodingServices"] : never; /** * Creates a durable workflow definition with schemas, annotations, and * deterministic execution IDs derived from the workflow tag and idempotency * key. * * @stability unstable * @category constructors * @since 4.0.0 */ export declare const make: (tag: Tag, options: { readonly payload: Payload; readonly idempotencyKey: (payload: Payload extends Schema.Struct.Fields ? Schema.Struct.Type : Payload["Type"]) => string; readonly success?: Success; readonly error?: Error; readonly suspendedRetrySchedule?: Schedule.Schedule | undefined; readonly annotations?: Context.Context; }) => Workflow : Payload, Success, Error>; declare const ResultTypeId = "~effect/workflow/Workflow/Result"; /** * Returns `true` when a value is a workflow `Result`. * * @stability unstable * @category guards * @since 4.0.0 */ export declare const isResult: (u: unknown) => u is Result; /** * Result of a workflow execution, either a completed exit or a suspended * workflow state. * * @stability unstable * @category models * @since 4.0.0 */ export type Result = Complete | Suspended; /** * Encoded representation of a workflow `Result`. * * @stability unstable * @category models * @since 4.0.0 */ export type ResultEncoded = CompleteEncoded | typeof Suspended.Encoded; /** * Encoded representation of a completed workflow result containing an encoded * `Exit`. * * @stability unstable * @category models * @since 4.0.0 */ export interface CompleteEncoded { readonly _tag: "Complete"; readonly exit: ExitEncoded; } /** * Schema constructor for `Complete` workflow results using the supplied * success and error schemas. * * @stability unstable * @category schemas * @since 4.0.0 */ export interface CompleteSchema extends Schema.declareConstructor, Complete, readonly [Schema.Exit]> { readonly success: Success; readonly error: Error; } declare const Complete_base: new = {}>(args: import("../Types.ts").VoidIfEmpty<{ readonly [P in keyof A_1 as P extends "_tag" ? never : P]: A_1[P]; }>) => Readonly & { readonly _tag: "Complete"; } & import("../Pipeable.ts").Pipeable; /** * Represents a completed workflow execution with its success or failure `Exit`. * * @stability unstable * @category models * @since 4.0.0 */ export declare class Complete extends Complete_base<{ readonly exit: Exit.Exit; }> { /** * Marks this value as a workflow result for runtime guards. * * @stability unstable * @since 4.0.0 */ readonly [ResultTypeId] = "~effect/workflow/Workflow/Result"; /** * Builds the schema for completed workflow results from success and error schemas. * * @stability unstable * @since 4.0.0 */ static Schema(options: { readonly success: Success; readonly error: Error; }): CompleteSchema; } declare const Suspended_base: Schema.Class; readonly cause: Schema.optional>; readonly failed: Schema.optional; }>, {}>; /** * Represents a suspended workflow execution, optionally carrying the cause that * triggered suspension. * * **Details** * * `failed` marks this execution's own `SuspendOnFailure` and requires explicit * `resume` or `interrupt`. Inherited child failures do not set it. * * @stability unstable * @category schemas * @since 4.0.0 */ export declare class Suspended extends Suspended_base { /** * Marks this value as a workflow result for runtime guards. * * @stability unstable * @since 4.0.0 */ readonly [ResultTypeId] = "~effect/workflow/Workflow/Result"; } /** * Creates a schema for workflow results using the supplied success and error * schemas. * * @stability unstable * @category schemas * @since 4.0.0 */ export declare const Result: (options: { readonly success: Success; readonly error: Error; }) => Schema.Union, typeof Suspended]>; /** * Schema for encoded workflow results with generic success and error payloads. * * @stability unstable * @category schemas * @since 4.0.0 */ export declare const ResultEncoded: Schema.Codec>; /** * Runs an effect as a workflow execution and converts its outcome into a * `Result`, handling suspension, defect capture, interruption, and workflow * scope finalization. * * @stability unstable * @category converting * @since 4.0.0 */ export declare const intoResult: (effect: Effect.Effect) => Effect.Effect, never, Exclude | WorkflowInstance>; /** * Wraps an activity-like effect so workflow suspension waits for currently * running activities to finish or suspend. * * @stability unstable * @category resource management * @since 4.0.0 */ export declare const wrapActivityResult: (effect: Effect.Effect, isSuspend: (value: A) => boolean) => Effect.Effect; /** * Accesses the workflow scope, which is only closed when the workflow execution fully completes. * * @stability unstable * @category resource management * @since 4.0.0 */ export declare const scope: Effect.Effect; /** * Provides the workflow scope to the given effect, and closes the scope only when the workflow execution fully completes. * * @stability unstable * @category resource management * @since 4.0.0 */ export declare const provideScope: (effect: Effect.Effect) => Effect.Effect | WorkflowInstance>; /** * Adds an exit finalizer to the current workflow scope, preserving the * services available when the finalizer is registered. * * **Details** * * Body-level `Effect.onExit` finalizers cannot observe a deposited workflow * interrupt. Use this function for terminal-state work that must observe it. * Finalizers are skipped when a cluster owner abandons a run attempt for * replay; owner-local scope finalizers registered with {@link provideScope} * still run. * * @stability unstable * @category resource management * @since 4.0.0 */ export declare const addFinalizer: (f: (exit: Exit.Exit) => Effect.Effect) => Effect.Effect; /** * Adds compensation logic to an effect inside a Workflow. * * **When to use** * * Use when a top-level workflow step needs compensating cleanup if the overall * workflow later fails after the step succeeds. * * **Details** * * The compensation finalizer is called if the entire workflow fails, allowing you to perform cleanup or other actions based on the success value and the cause of the workflow failure. * * **Gotchas** * * Compensation finalizers are only registered for top-level effects in the workflow and do not work for nested activities. * * @stability unstable * @category compensation * @since 4.0.0 */ export declare const withCompensation: { /** * Adds compensation logic to an effect inside a Workflow. * * **When to use** * * Use when a top-level workflow step needs compensating cleanup if the overall * workflow later fails after the step succeeds. * * **Details** * * The compensation finalizer is called if the entire workflow fails, allowing you to perform cleanup or other actions based on the success value and the cause of the workflow failure. * * **Gotchas** * * Compensation finalizers are only registered for top-level effects in the workflow and do not work for nested activities. * * @stability unstable * @category compensation * @since 4.0.0 */ (compensation: (value: A, cause: Cause.Cause) => Effect.Effect): (effect: Effect.Effect) => Effect.Effect; /** * Adds compensation logic to an effect inside a Workflow. * * **When to use** * * Use when a top-level workflow step needs compensating cleanup if the overall * workflow later fails after the step succeeds. * * **Details** * * The compensation finalizer is called if the entire workflow fails, allowing you to perform cleanup or other actions based on the success value and the cause of the workflow failure. * * **Gotchas** * * Compensation finalizers are only registered for top-level effects in the workflow and do not work for nested activities. * * @stability unstable * @category compensation * @since 4.0.0 */ (effect: Effect.Effect, compensation: (value: A, cause: Cause.Cause) => Effect.Effect): Effect.Effect; }; /** * Marks a workflow instance as suspended and interrupts the current fiber to * stop execution until it is resumed. * * @stability unstable * @category interruption * @since 4.0.0 */ export declare const suspend: (instance: WorkflowInstance["Service"]) => Effect.Effect; /** * Captures defects for a workflow and includes them in the result of the workflow or its activities. * * **Details** * * By default, this annotation is set to `true`, meaning defects are captured. * * @stability unstable * @category services * @since 4.0.0 */ export declare const CaptureDefects: Context.Reference; /** * Marks a workflow to suspend when it encounters any error. * * **Details** * * The suspended execution can later be resumed with the workflow's `resume` method, for example `MyWorkflow.resume(executionId)`. * * @stability unstable * @category services * @since 4.0.0 */ export declare const SuspendOnFailure: Context.Reference; export {}; //# sourceMappingURL=Workflow.d.ts.map