import { type StringValue } from 'ms';
import { TaskJob } from './job.js';
import { Task } from './task.js';
import type { StepTaskJobOptions, TaskFlowRun, TaskFlowRunNode, TaskGroupDefinitionRegistry, TaskGroupRegistry } from './types/index.js';
export declare class StepExecutor<JobType extends TaskJob = TaskJob, TAllTaskGroupsDefs extends TaskGroupDefinitionRegistry = TaskGroupDefinitionRegistry, TCurrentJobGroup extends keyof TAllTaskGroupsDefs = never, TGroups extends TaskGroupRegistry<TAllTaskGroupsDefs> = TaskGroupRegistry<TAllTaskGroupsDefs>, TJobPayload = JobType extends TaskJob<infer P, any, any> ? P : unknown, TJobResult = JobType extends TaskJob<any, infer R, any> ? R : unknown> {
    private job;
    private parentTask;
    private logger;
    private stepCounts;
    private client;
    constructor(job: JobType, parentTask: Task<TJobPayload, TJobResult, any>);
    private persistState;
    /**
     * Process step result before storing it in the job state.
     * This method automatically prepares TaskJob instances ready for serialization.
     * Recursively processes arrays and objects to find and serialize any TaskJob instances.
     *
     * @param result The result from a step's core logic
     * @param stepKind The kind of step that produced this result
     * @returns A processed version of the result suitable for storage
     */
    protected memoizeStepResult<T>(result: T, stepKind: string): Promise<any>;
    /**
     * Checks if the memoized data is a job that needs to be reconstructed.
     * Recursively processes arrays and objects to find and reconstruct any serialized jobs.
     *
     * @param memoizedData The data from the memoized result
     * @param userStepId The ID of the step for logging purposes
     * @returns The original data or a reconstructed job
     */
    protected reconstructJobIfNeeded<T>(memoizedData: any, userStepId: string): Promise<T>;
    /**
     * Centralized method to execute a step, handling memoization, state persistence, and errors.
     * @param userStepId User-defined ID for the step.
     * @param stepKind A string identifier for the kind of step (e.g., 'do', 'sleep').
     * @param coreLogic The async function that performs the actual work of the step.
     *                  If it initiates a pending state (e.g., sleep, wait), it should:
     *                  1. Update \`this.job.state.stepState\` with the new status (e.g., 'sleeping').
     *                  2. Call \`await this.persistState()\`.
     *                  3. Throw a \`WorkflowPendingError\` (e.g., \`DelayedError\`).
     *                  If it completes successfully, it returns the result.
     *                  If it fails with an unexpected error, it throws that error.
     * @param handleMemoizedState Optional handler for memoized states that are not 'completed' or 'errored'.
     *                                     Used for re-evaluating pending states (e.g., checking if sleep duration has passed).
     *                                     If it handles the state, it should return \`{ processed: true, ... }\`.
     *                                     If the step completes, it must update state and persist.
     * @param memoizeStepResult Optional function to customize how the step result is serialized before storage.
     *                        If not provided, the default memoizeStepResult method will be used.
     */
    private _executeStep;
    do<T>(userStepId: string, handler: () => Promise<T>): Promise<T>;
    sleep(userStepId: string, duration: number | StringValue): Promise<void>;
    sleepUntil(userStepId: string, datetime: Date | string | number): Promise<void>;
    runGroupTask<TargetGroup extends TGroups[TCurrentJobGroup] = TGroups[TCurrentJobGroup], TaskName extends keyof TargetGroup['tasks'] = keyof TargetGroup['tasks'], ActualTask extends TargetGroup['tasks'][TaskName] = TargetGroup['tasks'][TaskName], Payload = ActualTask extends Task<any, any, any, infer P> ? P : unknown, Result = ActualTask extends Task<any, infer R, any, any> ? R : unknown, ActualPayload extends Payload = Payload, TJob extends TaskJob<ActualPayload, Result> = TaskJob<ActualPayload, Result>>(userStepId: string, taskName: TaskName, payload: ActualPayload, options?: StepTaskJobOptions): Promise<TJob>;
    runGroupTaskAndWait<TargetGroup extends TGroups[TCurrentJobGroup] = TGroups[TCurrentJobGroup], TaskName extends keyof TargetGroup['tasks'] = keyof TargetGroup['tasks'], ActualTask extends TargetGroup['tasks'][TaskName] = TargetGroup['tasks'][TaskName], Payload = ActualTask extends Task<any, any, any, infer P> ? P : unknown, Result = ActualTask extends Task<any, infer R, any, any> ? R : unknown, ActualPayload extends Payload = Payload>(userStepId: string, taskName: TaskName, payload: ActualPayload, options?: StepTaskJobOptions): Promise<Result>;
    runTask<GroupName extends keyof TGroups, TargetGroup extends TGroups[GroupName] = TGroups[GroupName], TaskName extends keyof TargetGroup['tasks'] = keyof TargetGroup['tasks'], ActualTask extends TargetGroup['tasks'][TaskName] = TargetGroup['tasks'][TaskName], Payload = ActualTask extends Task<any, any, any, infer P> ? P : unknown, Result = ActualTask extends Task<any, infer R, any, any> ? R : unknown, ActualPayload extends Payload = Payload, TJob extends TaskJob<ActualPayload, Result> = TaskJob<ActualPayload, Result>>(userStepId: string, groupName: GroupName, taskName: TaskName, payload: ActualPayload, options?: StepTaskJobOptions): Promise<TJob>;
    runTaskAndWait<GroupName extends keyof TGroups, TargetGroup extends TGroups[GroupName] = TGroups[GroupName], TaskName extends keyof TargetGroup['tasks'] = keyof TargetGroup['tasks'], ActualTask extends TargetGroup['tasks'][TaskName] = TargetGroup['tasks'][TaskName], Payload = ActualTask extends Task<any, any, any, infer P> ? P : unknown, Result = ActualTask extends Task<any, infer R, any, any> ? R : unknown, ActualPayload extends Payload = Payload>(userStepId: string, groupName: GroupName, taskName: TaskName, payload: ActualPayload, options?: StepTaskJobOptions): Promise<Result>;
    runTasks<GroupName extends keyof TGroups, TargetGroup extends TGroups[GroupName] = TGroups[GroupName], TaskName extends keyof TargetGroup['tasks'] = keyof TargetGroup['tasks'], ActualTask extends TargetGroup['tasks'][TaskName] = TargetGroup['tasks'][TaskName], Payload = ActualTask extends Task<any, any, any, infer P> ? P : unknown, Result = ActualTask extends Task<any, infer R, any, any> ? R : unknown, ActualPayload extends Payload = Payload, TJob extends TaskJob<ActualPayload, Result> = TaskJob<ActualPayload, Result>>(userStepId: string, groupName: GroupName, taskName: TaskName, tasks: Array<{
        name?: string;
        payload?: ActualPayload;
        options?: StepTaskJobOptions;
    }>, options?: StepTaskJobOptions): Promise<TJob[]>;
    runFlow<TFlowRun extends TaskFlowRun<TAllTaskGroupsDefs> = TaskFlowRun<TAllTaskGroupsDefs>>(userStepId: string, task: TFlowRun, options?: StepTaskJobOptions): Promise<TaskFlowRunNode>;
    runFlows<TFlowRun extends TaskFlowRun<TAllTaskGroupsDefs> = TaskFlowRun<TAllTaskGroupsDefs>>(userStepId: string, tasks: TFlowRun[], options?: StepTaskJobOptions): Promise<TaskFlowRunNode[]>;
    waitForChildTasks(userStepId: string): Promise<any[]>;
    sendEvent(userStepId: string, eventName: string, eventData: any): Promise<void>;
}
//# sourceMappingURL=step-executor.d.ts.map