durable-execution - v0.32.0
    Preparing search index...

    Variable makeEffectDurableExecutorConst

    makeEffectDurableExecutor: (
        ...args: [
            options: {
                logLevel?: null
                | "error"
                | "debug"
                | "info";
                expireLeewayMs?: null | number;
                backgroundProcessIntraBatchSleepMs?: null | number;
                maxConcurrentTaskExecutions?: null | number;
                maxTaskExecutionsPerBatch?: null | number;
                processOnChildrenFinishedTaskExecutionsBatchSize?: null | number;
                markFinishedTaskExecutionsAsCloseStatusReadyBatchSize?: null | number;
                closeFinishedTaskExecutionsBatchSize?: null | number;
                cancelNeedsPromiseCancellationTaskExecutionsBatchSize?: null | number;
                retryExpiredTaskExecutionsBatchSize?: null | number;
                maxChildrenPerTaskExecution?: null | number;
                maxSerializedInputDataSize?: null | number;
                maxSerializedOutputDataSize?: null | number;
                enableStorageBatching?: null | boolean;
                enableStorageStats?: null | boolean;
                storageBackgroundBatchingProcessIntraBatchSleepMs?: null | number;
                storageMaxRetryAttempts?: null | number;
            },
        ],
    ) => Effect<
        {
            id: string;
            task: <TInput = undefined, TOutput = unknown>(
                ...args: [taskOptions: TaskOptions<TInput, TOutput>],
            ) => Effect<Task<TInput, TOutput, "task">, DurableExecutionError, never>;
            sleepingTask: <TOutput = unknown>(
                ...args: [taskOptions: SleepingTaskOptions<TOutput>],
            ) => Effect<
                Task<string, TOutput, "sleepingTask">,
                DurableExecutionError,
                never,
            >;
            parentTask: <
                TInput = undefined,
                TRunOutput = unknown,
                TOutput = DefaultParentTaskOutput<TRunOutput>,
                TFinalizeTaskRunOutput = unknown,
            >(
                ...args: [
                    taskOptions: ParentTaskOptions<
                        TInput,
                        TRunOutput,
                        TOutput,
                        TFinalizeTaskRunOutput,
                    >,
                ],
            ) => Effect<
                Task<TInput, TOutput, "parentTask">,
                DurableExecutionError,
                never,
            >;
            sequentialTasks: <TSequentialTasks extends readonly AnyTask[]>(
                ...args: [id: string, tasks: SequentialTasks<TSequentialTasks>],
            ) => Effect<
                Task<
                    InferTaskInput<TSequentialTasks[0]>,
                    InferTaskOutput<LastTaskElementInArray<TSequentialTasks>>,
                    "sequentialTasks",
                >,
                DurableExecutionError,
                never,
            >;
            loopingTask: <TInput = undefined, TOutput = unknown>(
                ...args: [
                    id: string,
                    iterationTask: Task<
                        TInput,
                        { isDone: false }
                        | { isDone: true; output: TOutput },
                    >,
                    maxAttempts: number,
                    sleepMsBeforeRun?: number | ((attempt: number) => number),
                ],
            ) => Effect<
                Task<
                    TInput,
                    { isSuccess: false }
                    | { isSuccess: true; output: TOutput },
                    "parentTask",
                >,
                DurableExecutionError,
                never,
            >;
            validateInput: <TRunInput, TInput>(
                validateInputFn: (
                    input: TInput,
                ) => TRunInput | Promise<TRunInput> | Effect<TRunInput, unknown, never>,
            ) => {
                task: <TOutput = unknown>(
                    taskOptions: TaskOptions<TRunInput, TOutput>,
                ) => Effect<Task<TInput, TOutput, "task">, DurableExecutionError, never>;
                parentTask: <
                    TRunOutput = unknown,
                    TOutput = DefaultParentTaskOutput<TRunOutput>,
                    TFinalizeTaskRunOutput = unknown,
                >(
                    parentTaskOptions: ParentTaskOptions<
                        TRunInput,
                        TRunOutput,
                        TOutput,
                        TFinalizeTaskRunOutput,
                    >,
                ) => Effect<
                    Task<TInput, TOutput, "parentTask">,
                    DurableExecutionError,
                    never,
                >;
                sequentialTasks: <TSequentialTasks extends readonly AnyTask[]>(
                    id: string,
                    tasks: SequentialTasks<TSequentialTasks>,
                ) => InferTaskInput<TSequentialTasks[0]> extends TRunInput
                    ? Effect<
                        Task<TInput, InferTaskOutput<LastTaskElementInArray<(...)>>>,
                        DurableExecutionError,
                        never,
                    >
                    : never;
                loopingTask: <TOutput = unknown>(
                    id: string,
                    iterationTask: Task<
                        TRunInput,
                        { isDone: false }
                        | { isDone: true; output: TOutput },
                    >,
                    maxAttempts: number,
                    sleepMsBeforeRun?: number | ((attempt: number) => number),
                ) => Effect<
                    Task<
                        TInput,
                        { isSuccess: false }
                        | { isSuccess: true; output: TOutput },
                        "parentTask",
                    >,
                    DurableExecutionError,
                    never,
                >;
            };
            inputSchema: <TInputSchema extends AnySchema>(
                inputSchema: TInputSchema,
            ) => {
                task: <TOutput = unknown>(
                    taskOptions: TaskOptions<InferSchemaOutput<TInputSchema>, TOutput>,
                ) => Effect<
                    Task<InferSchemaInput<TInputSchema>, TOutput, "task">,
                    DurableExecutionError,
                    never,
                >;
                parentTask: <
                    TRunOutput = unknown,
                    TOutput = DefaultParentTaskOutput<TRunOutput>,
                    TFinalizeTaskRunOutput = unknown,
                >(
                    parentTaskOptions: ParentTaskOptions<
                        InferSchemaOutput<TInputSchema>,
                        TRunOutput,
                        TOutput,
                        TFinalizeTaskRunOutput,
                    >,
                ) => Effect<
                    Task<InferSchemaInput<TInputSchema>, TOutput, "parentTask">,
                    DurableExecutionError,
                    never,
                >;
                sequentialTasks: <TSequentialTasks extends readonly AnyTask[]>(
                    id: string,
                    tasks: SequentialTasks<TSequentialTasks>,
                ) => InferTaskInput<TSequentialTasks[0]> extends InferSchemaOutput<
                    TInputSchema,
                >
                    ? Effect<
                        Task<
                            InferSchemaInput<TInputSchema>,
                            InferTaskOutput<LastTaskElementInArray<(...)>>,
                        >,
                        DurableExecutionError,
                        never,
                    >
                    : never;
                loopingTask: <TOutput = unknown>(
                    id: string,
                    iterationTask: Task<
                        InferSchemaOutput<TInputSchema>,
                        { isDone: false } | { isDone: true; output: TOutput },
                    >,
                    maxAttempts: number,
                    sleepMsBeforeRun?: number | ((attempt: number) => number),
                ) => Effect<
                    Task<
                        InferSchemaInput<TInputSchema>,
                        { isSuccess: false } | { isSuccess: true; output: TOutput },
                        "parentTask",
                    >,
                    DurableExecutionError,
                    never,
                >;
            };
            enqueueTask: <TTask extends AnyTask>(
                ...args: undefined extends InferTaskInput<TTask>
                    ? [
                        task: TTask,
                        input?: InferTaskInput<TTask>,
                        options?: TaskEnqueueOptions<TTask> & {
                            taskExecutionsStorageTransaction?: Pick<(...), (...)>;
                        },
                    ]
                    : [
                        task: TTask,
                        input: InferTaskInput<TTask>,
                        options?: TaskEnqueueOptions<TTask> & {
                            taskExecutionsStorageTransaction?: Pick<(...), (...)>;
                        },
                    ],
            ) => Effect<
                {
                    taskId: string;
                    executionId: string;
                    getExecution: Effect<
                        TaskExecution<InferTaskOutput<TTask>>,
                        DurableExecutionError,
                        never,
                    >;
                    waitAndGetFinishedExecution: (
                        ...args: [{ pollingIntervalMs?: (...) | (...) }?],
                    ) => AsEffect<
                        Effect<
                            FinishedTaskExecution<InferTaskOutput<(...)>>,
                            DurableExecutionError,
                            never,
                        >,
                    >;
                    cancel: Effect<void, DurableExecutionError, never>;
                },
                DurableExecutionError,
                never,
            >;
            getTaskExecutionHandle: <TTask extends AnyTask>(
                ...args: [task: TTask, executionId: string],
            ) => Effect<
                {
                    taskId: string;
                    executionId: string;
                    getExecution: Effect<
                        TaskExecution<InferTaskOutput<TTask>>,
                        DurableExecutionError,
                        never,
                    >;
                    waitAndGetFinishedExecution: (
                        ...args: [{ pollingIntervalMs?: (...) | (...) }?],
                    ) => AsEffect<
                        Effect<
                            FinishedTaskExecution<InferTaskOutput<(...)>>,
                            DurableExecutionError,
                            never,
                        >,
                    >;
                    cancel: Effect<void, DurableExecutionError, never>;
                },
                DurableExecutionError,
                never,
            >;
            wakeupSleepingTaskExecution: <
                TTask extends Task<unknown, unknown, "sleepingTask">,
            >(
                ...args: [
                    task: TTask,
                    sleepingTaskUniqueId: string,
                    options: WakeupSleepingTaskExecutionOptions<InferTaskOutput<TTask>>,
                ],
            ) => Effect<
                FinishedTaskExecution<InferTaskOutput<TTask>>,
                DurableExecutionError,
                never,
            >;
            isRunning: Effect<boolean, never, never>;
            start: Effect<void, never, never>;
            shutdown: Effect<void, never, never>;
            getStorageMetrics: Effect<
                {
                    processName: string;
                    count: number;
                    min: number;
                    max: number;
                    quantiles: readonly (readonly [number, Option<number>])[];
                }[],
                never,
                never,
            >;
            getRunningTaskExecutionsCount: Effect<number, never, never>;
            getRunningTaskExecutionIds: Effect<Set<string>, never, never>;
        },
        DurableExecutionError,
        Scope
        | TaskExecutionsStorageService,
    > = ...

    Make an effect durable executor. It is used to execute tasks durably, reliably and resiliently.

    Multiple durable executors can share the same storage. In such a case, all the tasks should be present for all the durable executors. The work is distributed among the durable executors. See the usage and task examples sections for more details on creating and enqueuing tasks.

    It provides the same functionality as DurableExecutor but operates within the effect ecosystem, returning effect values instead of promises.

    • Effect integration: All methods return effect values for composability
    • Resource management: Automatic cleanup via effect's scoped resource management
    • Error handling: Uses effect's structured error handling with Cause
    • Concurrency: Built on effect's fiber-based concurrency model

    Type Declaration

      • (
            ...args: [
                options: {
                    logLevel?: null
                    | "error"
                    | "debug"
                    | "info";
                    expireLeewayMs?: null | number;
                    backgroundProcessIntraBatchSleepMs?: null | number;
                    maxConcurrentTaskExecutions?: null | number;
                    maxTaskExecutionsPerBatch?: null | number;
                    processOnChildrenFinishedTaskExecutionsBatchSize?: null | number;
                    markFinishedTaskExecutionsAsCloseStatusReadyBatchSize?: null | number;
                    closeFinishedTaskExecutionsBatchSize?: null | number;
                    cancelNeedsPromiseCancellationTaskExecutionsBatchSize?: null | number;
                    retryExpiredTaskExecutionsBatchSize?: null | number;
                    maxChildrenPerTaskExecution?: null | number;
                    maxSerializedInputDataSize?: null | number;
                    maxSerializedOutputDataSize?: null | number;
                    enableStorageBatching?: null | boolean;
                    enableStorageStats?: null | boolean;
                    storageBackgroundBatchingProcessIntraBatchSleepMs?: null | number;
                    storageMaxRetryAttempts?: null | number;
                },
            ],
        ): Effect<
            {
                id: string;
                task: <TInput = undefined, TOutput = unknown>(
                    ...args: [taskOptions: TaskOptions<TInput, TOutput>],
                ) => Effect<Task<TInput, TOutput, "task">, DurableExecutionError, never>;
                sleepingTask: <TOutput = unknown>(
                    ...args: [taskOptions: SleepingTaskOptions<TOutput>],
                ) => Effect<
                    Task<string, TOutput, "sleepingTask">,
                    DurableExecutionError,
                    never,
                >;
                parentTask: <
                    TInput = undefined,
                    TRunOutput = unknown,
                    TOutput = DefaultParentTaskOutput<TRunOutput>,
                    TFinalizeTaskRunOutput = unknown,
                >(
                    ...args: [
                        taskOptions: ParentTaskOptions<
                            TInput,
                            TRunOutput,
                            TOutput,
                            TFinalizeTaskRunOutput,
                        >,
                    ],
                ) => Effect<
                    Task<TInput, TOutput, "parentTask">,
                    DurableExecutionError,
                    never,
                >;
                sequentialTasks: <TSequentialTasks extends readonly AnyTask[]>(
                    ...args: [id: string, tasks: SequentialTasks<TSequentialTasks>],
                ) => Effect<
                    Task<
                        InferTaskInput<TSequentialTasks[0]>,
                        InferTaskOutput<LastTaskElementInArray<TSequentialTasks>>,
                        "sequentialTasks",
                    >,
                    DurableExecutionError,
                    never,
                >;
                loopingTask: <TInput = undefined, TOutput = unknown>(
                    ...args: [
                        id: string,
                        iterationTask: Task<
                            TInput,
                            { isDone: false }
                            | { isDone: true; output: TOutput },
                        >,
                        maxAttempts: number,
                        sleepMsBeforeRun?: number | ((attempt: number) => number),
                    ],
                ) => Effect<
                    Task<
                        TInput,
                        { isSuccess: false }
                        | { isSuccess: true; output: TOutput },
                        "parentTask",
                    >,
                    DurableExecutionError,
                    never,
                >;
                validateInput: <TRunInput, TInput>(
                    validateInputFn: (
                        input: TInput,
                    ) => TRunInput | Promise<TRunInput> | Effect<TRunInput, unknown, never>,
                ) => {
                    task: <TOutput = unknown>(
                        taskOptions: TaskOptions<TRunInput, TOutput>,
                    ) => Effect<Task<TInput, TOutput, "task">, DurableExecutionError, never>;
                    parentTask: <
                        TRunOutput = unknown,
                        TOutput = DefaultParentTaskOutput<TRunOutput>,
                        TFinalizeTaskRunOutput = unknown,
                    >(
                        parentTaskOptions: ParentTaskOptions<
                            TRunInput,
                            TRunOutput,
                            TOutput,
                            TFinalizeTaskRunOutput,
                        >,
                    ) => Effect<
                        Task<TInput, TOutput, "parentTask">,
                        DurableExecutionError,
                        never,
                    >;
                    sequentialTasks: <TSequentialTasks extends readonly AnyTask[]>(
                        id: string,
                        tasks: SequentialTasks<TSequentialTasks>,
                    ) => InferTaskInput<TSequentialTasks[0]> extends TRunInput
                        ? Effect<
                            Task<TInput, InferTaskOutput<LastTaskElementInArray<(...)>>>,
                            DurableExecutionError,
                            never,
                        >
                        : never;
                    loopingTask: <TOutput = unknown>(
                        id: string,
                        iterationTask: Task<
                            TRunInput,
                            { isDone: false }
                            | { isDone: true; output: TOutput },
                        >,
                        maxAttempts: number,
                        sleepMsBeforeRun?: number | ((attempt: number) => number),
                    ) => Effect<
                        Task<
                            TInput,
                            { isSuccess: false }
                            | { isSuccess: true; output: TOutput },
                            "parentTask",
                        >,
                        DurableExecutionError,
                        never,
                    >;
                };
                inputSchema: <TInputSchema extends AnySchema>(
                    inputSchema: TInputSchema,
                ) => {
                    task: <TOutput = unknown>(
                        taskOptions: TaskOptions<InferSchemaOutput<TInputSchema>, TOutput>,
                    ) => Effect<
                        Task<InferSchemaInput<TInputSchema>, TOutput, "task">,
                        DurableExecutionError,
                        never,
                    >;
                    parentTask: <
                        TRunOutput = unknown,
                        TOutput = DefaultParentTaskOutput<TRunOutput>,
                        TFinalizeTaskRunOutput = unknown,
                    >(
                        parentTaskOptions: ParentTaskOptions<
                            InferSchemaOutput<TInputSchema>,
                            TRunOutput,
                            TOutput,
                            TFinalizeTaskRunOutput,
                        >,
                    ) => Effect<
                        Task<InferSchemaInput<TInputSchema>, TOutput, "parentTask">,
                        DurableExecutionError,
                        never,
                    >;
                    sequentialTasks: <TSequentialTasks extends readonly AnyTask[]>(
                        id: string,
                        tasks: SequentialTasks<TSequentialTasks>,
                    ) => InferTaskInput<TSequentialTasks[0]> extends InferSchemaOutput<
                        TInputSchema,
                    >
                        ? Effect<
                            Task<
                                InferSchemaInput<TInputSchema>,
                                InferTaskOutput<LastTaskElementInArray<(...)>>,
                            >,
                            DurableExecutionError,
                            never,
                        >
                        : never;
                    loopingTask: <TOutput = unknown>(
                        id: string,
                        iterationTask: Task<
                            InferSchemaOutput<TInputSchema>,
                            { isDone: false } | { isDone: true; output: TOutput },
                        >,
                        maxAttempts: number,
                        sleepMsBeforeRun?: number | ((attempt: number) => number),
                    ) => Effect<
                        Task<
                            InferSchemaInput<TInputSchema>,
                            { isSuccess: false } | { isSuccess: true; output: TOutput },
                            "parentTask",
                        >,
                        DurableExecutionError,
                        never,
                    >;
                };
                enqueueTask: <TTask extends AnyTask>(
                    ...args: undefined extends InferTaskInput<TTask>
                        ? [
                            task: TTask,
                            input?: InferTaskInput<TTask>,
                            options?: TaskEnqueueOptions<TTask> & {
                                taskExecutionsStorageTransaction?: Pick<(...), (...)>;
                            },
                        ]
                        : [
                            task: TTask,
                            input: InferTaskInput<TTask>,
                            options?: TaskEnqueueOptions<TTask> & {
                                taskExecutionsStorageTransaction?: Pick<(...), (...)>;
                            },
                        ],
                ) => Effect<
                    {
                        taskId: string;
                        executionId: string;
                        getExecution: Effect<
                            TaskExecution<InferTaskOutput<TTask>>,
                            DurableExecutionError,
                            never,
                        >;
                        waitAndGetFinishedExecution: (
                            ...args: [{ pollingIntervalMs?: (...) | (...) }?],
                        ) => AsEffect<
                            Effect<
                                FinishedTaskExecution<InferTaskOutput<(...)>>,
                                DurableExecutionError,
                                never,
                            >,
                        >;
                        cancel: Effect<void, DurableExecutionError, never>;
                    },
                    DurableExecutionError,
                    never,
                >;
                getTaskExecutionHandle: <TTask extends AnyTask>(
                    ...args: [task: TTask, executionId: string],
                ) => Effect<
                    {
                        taskId: string;
                        executionId: string;
                        getExecution: Effect<
                            TaskExecution<InferTaskOutput<TTask>>,
                            DurableExecutionError,
                            never,
                        >;
                        waitAndGetFinishedExecution: (
                            ...args: [{ pollingIntervalMs?: (...) | (...) }?],
                        ) => AsEffect<
                            Effect<
                                FinishedTaskExecution<InferTaskOutput<(...)>>,
                                DurableExecutionError,
                                never,
                            >,
                        >;
                        cancel: Effect<void, DurableExecutionError, never>;
                    },
                    DurableExecutionError,
                    never,
                >;
                wakeupSleepingTaskExecution: <
                    TTask extends Task<unknown, unknown, "sleepingTask">,
                >(
                    ...args: [
                        task: TTask,
                        sleepingTaskUniqueId: string,
                        options: WakeupSleepingTaskExecutionOptions<InferTaskOutput<TTask>>,
                    ],
                ) => Effect<
                    FinishedTaskExecution<InferTaskOutput<TTask>>,
                    DurableExecutionError,
                    never,
                >;
                isRunning: Effect<boolean, never, never>;
                start: Effect<void, never, never>;
                shutdown: Effect<void, never, never>;
                getStorageMetrics: Effect<
                    {
                        processName: string;
                        count: number;
                        min: number;
                        max: number;
                        quantiles: readonly (readonly [number, Option<number>])[];
                    }[],
                    never,
                    never,
                >;
                getRunningTaskExecutionsCount: Effect<number, never, never>;
                getRunningTaskExecutionIds: Effect<Set<string>, never, never>;
            },
            DurableExecutionError,
            Scope
            | TaskExecutionsStorageService,
        >
      • Parameters

        • ...args: [
              options: {
                  logLevel?: null
                  | "error"
                  | "debug"
                  | "info";
                  expireLeewayMs?: null | number;
                  backgroundProcessIntraBatchSleepMs?: null | number;
                  maxConcurrentTaskExecutions?: null | number;
                  maxTaskExecutionsPerBatch?: null | number;
                  processOnChildrenFinishedTaskExecutionsBatchSize?: null | number;
                  markFinishedTaskExecutionsAsCloseStatusReadyBatchSize?: null | number;
                  closeFinishedTaskExecutionsBatchSize?: null | number;
                  cancelNeedsPromiseCancellationTaskExecutionsBatchSize?: null | number;
                  retryExpiredTaskExecutionsBatchSize?: null | number;
                  maxChildrenPerTaskExecution?: null | number;
                  maxSerializedInputDataSize?: null | number;
                  maxSerializedOutputDataSize?: null | number;
                  enableStorageBatching?: null | boolean;
                  enableStorageStats?: null | boolean;
                  storageBackgroundBatchingProcessIntraBatchSleepMs?: null | number;
                  storageMaxRetryAttempts?: null | number;
              },
          ]

        Returns Effect<
            {
                id: string;
                task: <TInput = undefined, TOutput = unknown>(
                    ...args: [taskOptions: TaskOptions<TInput, TOutput>],
                ) => Effect<Task<TInput, TOutput, "task">, DurableExecutionError, never>;
                sleepingTask: <TOutput = unknown>(
                    ...args: [taskOptions: SleepingTaskOptions<TOutput>],
                ) => Effect<
                    Task<string, TOutput, "sleepingTask">,
                    DurableExecutionError,
                    never,
                >;
                parentTask: <
                    TInput = undefined,
                    TRunOutput = unknown,
                    TOutput = DefaultParentTaskOutput<TRunOutput>,
                    TFinalizeTaskRunOutput = unknown,
                >(
                    ...args: [
                        taskOptions: ParentTaskOptions<
                            TInput,
                            TRunOutput,
                            TOutput,
                            TFinalizeTaskRunOutput,
                        >,
                    ],
                ) => Effect<
                    Task<TInput, TOutput, "parentTask">,
                    DurableExecutionError,
                    never,
                >;
                sequentialTasks: <TSequentialTasks extends readonly AnyTask[]>(
                    ...args: [id: string, tasks: SequentialTasks<TSequentialTasks>],
                ) => Effect<
                    Task<
                        InferTaskInput<TSequentialTasks[0]>,
                        InferTaskOutput<LastTaskElementInArray<TSequentialTasks>>,
                        "sequentialTasks",
                    >,
                    DurableExecutionError,
                    never,
                >;
                loopingTask: <TInput = undefined, TOutput = unknown>(
                    ...args: [
                        id: string,
                        iterationTask: Task<
                            TInput,
                            { isDone: false }
                            | { isDone: true; output: TOutput },
                        >,
                        maxAttempts: number,
                        sleepMsBeforeRun?: number | ((attempt: number) => number),
                    ],
                ) => Effect<
                    Task<
                        TInput,
                        { isSuccess: false }
                        | { isSuccess: true; output: TOutput },
                        "parentTask",
                    >,
                    DurableExecutionError,
                    never,
                >;
                validateInput: <TRunInput, TInput>(
                    validateInputFn: (
                        input: TInput,
                    ) => TRunInput | Promise<TRunInput> | Effect<TRunInput, unknown, never>,
                ) => {
                    task: <TOutput = unknown>(
                        taskOptions: TaskOptions<TRunInput, TOutput>,
                    ) => Effect<Task<TInput, TOutput, "task">, DurableExecutionError, never>;
                    parentTask: <
                        TRunOutput = unknown,
                        TOutput = DefaultParentTaskOutput<TRunOutput>,
                        TFinalizeTaskRunOutput = unknown,
                    >(
                        parentTaskOptions: ParentTaskOptions<
                            TRunInput,
                            TRunOutput,
                            TOutput,
                            TFinalizeTaskRunOutput,
                        >,
                    ) => Effect<
                        Task<TInput, TOutput, "parentTask">,
                        DurableExecutionError,
                        never,
                    >;
                    sequentialTasks: <TSequentialTasks extends readonly AnyTask[]>(
                        id: string,
                        tasks: SequentialTasks<TSequentialTasks>,
                    ) => InferTaskInput<TSequentialTasks[0]> extends TRunInput
                        ? Effect<
                            Task<TInput, InferTaskOutput<LastTaskElementInArray<(...)>>>,
                            DurableExecutionError,
                            never,
                        >
                        : never;
                    loopingTask: <TOutput = unknown>(
                        id: string,
                        iterationTask: Task<
                            TRunInput,
                            { isDone: false }
                            | { isDone: true; output: TOutput },
                        >,
                        maxAttempts: number,
                        sleepMsBeforeRun?: number | ((attempt: number) => number),
                    ) => Effect<
                        Task<
                            TInput,
                            { isSuccess: false }
                            | { isSuccess: true; output: TOutput },
                            "parentTask",
                        >,
                        DurableExecutionError,
                        never,
                    >;
                };
                inputSchema: <TInputSchema extends AnySchema>(
                    inputSchema: TInputSchema,
                ) => {
                    task: <TOutput = unknown>(
                        taskOptions: TaskOptions<InferSchemaOutput<TInputSchema>, TOutput>,
                    ) => Effect<
                        Task<InferSchemaInput<TInputSchema>, TOutput, "task">,
                        DurableExecutionError,
                        never,
                    >;
                    parentTask: <
                        TRunOutput = unknown,
                        TOutput = DefaultParentTaskOutput<TRunOutput>,
                        TFinalizeTaskRunOutput = unknown,
                    >(
                        parentTaskOptions: ParentTaskOptions<
                            InferSchemaOutput<TInputSchema>,
                            TRunOutput,
                            TOutput,
                            TFinalizeTaskRunOutput,
                        >,
                    ) => Effect<
                        Task<InferSchemaInput<TInputSchema>, TOutput, "parentTask">,
                        DurableExecutionError,
                        never,
                    >;
                    sequentialTasks: <TSequentialTasks extends readonly AnyTask[]>(
                        id: string,
                        tasks: SequentialTasks<TSequentialTasks>,
                    ) => InferTaskInput<TSequentialTasks[0]> extends InferSchemaOutput<
                        TInputSchema,
                    >
                        ? Effect<
                            Task<
                                InferSchemaInput<TInputSchema>,
                                InferTaskOutput<LastTaskElementInArray<(...)>>,
                            >,
                            DurableExecutionError,
                            never,
                        >
                        : never;
                    loopingTask: <TOutput = unknown>(
                        id: string,
                        iterationTask: Task<
                            InferSchemaOutput<TInputSchema>,
                            { isDone: false } | { isDone: true; output: TOutput },
                        >,
                        maxAttempts: number,
                        sleepMsBeforeRun?: number | ((attempt: number) => number),
                    ) => Effect<
                        Task<
                            InferSchemaInput<TInputSchema>,
                            { isSuccess: false } | { isSuccess: true; output: TOutput },
                            "parentTask",
                        >,
                        DurableExecutionError,
                        never,
                    >;
                };
                enqueueTask: <TTask extends AnyTask>(
                    ...args: undefined extends InferTaskInput<TTask>
                        ? [
                            task: TTask,
                            input?: InferTaskInput<TTask>,
                            options?: TaskEnqueueOptions<TTask> & {
                                taskExecutionsStorageTransaction?: Pick<(...), (...)>;
                            },
                        ]
                        : [
                            task: TTask,
                            input: InferTaskInput<TTask>,
                            options?: TaskEnqueueOptions<TTask> & {
                                taskExecutionsStorageTransaction?: Pick<(...), (...)>;
                            },
                        ],
                ) => Effect<
                    {
                        taskId: string;
                        executionId: string;
                        getExecution: Effect<
                            TaskExecution<InferTaskOutput<TTask>>,
                            DurableExecutionError,
                            never,
                        >;
                        waitAndGetFinishedExecution: (
                            ...args: [{ pollingIntervalMs?: (...) | (...) }?],
                        ) => AsEffect<
                            Effect<
                                FinishedTaskExecution<InferTaskOutput<(...)>>,
                                DurableExecutionError,
                                never,
                            >,
                        >;
                        cancel: Effect<void, DurableExecutionError, never>;
                    },
                    DurableExecutionError,
                    never,
                >;
                getTaskExecutionHandle: <TTask extends AnyTask>(
                    ...args: [task: TTask, executionId: string],
                ) => Effect<
                    {
                        taskId: string;
                        executionId: string;
                        getExecution: Effect<
                            TaskExecution<InferTaskOutput<TTask>>,
                            DurableExecutionError,
                            never,
                        >;
                        waitAndGetFinishedExecution: (
                            ...args: [{ pollingIntervalMs?: (...) | (...) }?],
                        ) => AsEffect<
                            Effect<
                                FinishedTaskExecution<InferTaskOutput<(...)>>,
                                DurableExecutionError,
                                never,
                            >,
                        >;
                        cancel: Effect<void, DurableExecutionError, never>;
                    },
                    DurableExecutionError,
                    never,
                >;
                wakeupSleepingTaskExecution: <
                    TTask extends Task<unknown, unknown, "sleepingTask">,
                >(
                    ...args: [
                        task: TTask,
                        sleepingTaskUniqueId: string,
                        options: WakeupSleepingTaskExecutionOptions<InferTaskOutput<TTask>>,
                    ],
                ) => Effect<
                    FinishedTaskExecution<InferTaskOutput<TTask>>,
                    DurableExecutionError,
                    never,
                >;
                isRunning: Effect<boolean, never, never>;
                start: Effect<void, never, never>;
                shutdown: Effect<void, never, never>;
                getStorageMetrics: Effect<
                    {
                        processName: string;
                        count: number;
                        min: number;
                        max: number;
                        quantiles: readonly (readonly [number, Option<number>])[];
                    }[],
                    never,
                    never,
                >;
                getRunningTaskExecutionsCount: Effect<number, never, never>;
                getRunningTaskExecutionIds: Effect<Set<string>, never, never>;
            },
            DurableExecutionError,
            Scope
            | TaskExecutionsStorageService,
        >

    import { makeEffectDurableExecutor } from 'durable-execution'
    import { Schema } from 'effect'

    const main = Effect.fn(() => Effect.gen(function* () {
    const executor = yield* makeEffectDurableExecutor(storage)

    // Create tasks
    const extractFileTitle = yield* executor
    .inputSchema(Schema.Struct({ filePath: Schema.String }))
    .task({
    id: 'extractFileTitle',
    timeoutMs: 30_000, // 30 seconds
    run: async (ctx, input) => {
    // ... extract the file title
    return {
    title: 'File Title',
    }
    },
    })

    const summarizeFile = yield* executor
    .validateInput(async (input: { filePath: string }) => {
    // Example validation function - implement your own validation logic
    if (!isValidFilePath(input.filePath)) {
    throw new Error('Invalid file path')
    }
    return {
    filePath: input.filePath,
    }
    })
    .task({
    id: 'summarizeFile',
    timeoutMs: 30_000, // 30 seconds
    run: async (ctx, input) => {
    // ... summarize the file
    return {
    summary: 'File summary',
    }
    },
    })

    const uploadFile = yield* executor
    .inputSchema(Schema.Struct({ filePath: Schema.String, uploadUrl: Schema.String }))
    .parentTask({
    id: 'uploadFile',
    timeoutMs: 60_000, // 1 minute
    runParent: async (ctx, input) => {
    // ... upload file to the given uploadUrl
    // Extract the file title and summarize the file in parallel
    return {
    output: {
    filePath: input.filePath,
    uploadUrl: input.uploadUrl,
    fileSize: 100,
    },
    children: [
    childTask(extractFileTitle, { filePath: input.filePath }),
    childTask(summarizeFile, { filePath: input.filePath }),
    ],
    }
    },
    finalize: {
    id: 'uploadFileFinalize',
    timeoutMs: 60_000, // 1 minute
    run: async (ctx, { output, children }) => {
    // ... combine the output of the run function and children tasks
    return {
    filePath: output.filePath,
    uploadUrl: output.uploadUrl,
    fileSize: 100,
    title: 'File Title',
    summary: 'File summary',
    }
    }
    },
    })

    // Start the durable executor
    yield* executor.start()

    // Enqueue task and manage its execution lifecycle
    const uploadFileHandle = yield* executor.enqueueTask(uploadFile, {
    filePath: 'file.txt',
    uploadUrl: 'https://example.com/upload',
    })
    const uploadFileExecution = yield* uploadFileHandle.getExecution()
    const uploadFileFinishedExecution = yield* uploadFileHandle.waitAndGetFinishedExecution()
    yield* uploadFileHandle.cancel()

    yield* Effect.log(uploadFileExecution)
    }).pipe(Effect.scoped)