import type { Context } from '../core/context';
import type { MiddlewareFn } from '../core/middleware';
import type { ScenarioController, ScenarioDefinition, ScenarioEngineOptions, ScenarioSession, ScenarioTransition } from './types';
export declare const defineScenario: <C extends Context, Data extends object>() => <Step extends string>(definition: ScenarioDefinition<C, Data, Step>) => ScenarioDefinition<C, Data, Step>;
/** Явные переходы делают изменение шага заметным в коде сценария. */
export declare const transition: {
    stay<Data extends object>(data?: Partial<Data>): Extract<ScenarioTransition<Data, string>, {
        type: "stay";
    }>;
    goto<Step extends string, Data extends object = Record<string, never>>(step: Step, data?: Partial<Data>): Extract<ScenarioTransition<Data, Step>, {
        type: "goto";
    }>;
    complete(): {
        type: "complete";
    };
    cancel(): {
        type: "cancel";
    };
};
/** Выполняет сценарии с именованными шагами и хранит прогресс в session. */
export declare class ScenarioEngine<C extends Context & {
    session?: ScenarioSession;
    scenario: ScenarioController<C>;
}> {
    private readonly definitions;
    private readonly now;
    constructor(options?: ScenarioEngineOptions);
    register<Data extends object, Step extends string>(definition: ScenarioDefinition<C, Data, Step>): this;
    middleware(): MiddlewareFn<C>;
    /** Добавляет `ctx.scenario`, не передавая событие активному сценарию. */
    controllerMiddleware(): MiddlewareFn<C>;
    /** Передаёт событие активному сценарию, а при его отсутствии продолжает цепочку. */
    interceptMiddleware(): MiddlewareFn<C>;
    /** Создаёт обработчик для запуска переданного сценария. */
    start<Data extends object, Step extends string>(definition: ScenarioDefinition<C, Data, Step>, createData?: (ctx: C) => Data | Promise<Data>): MiddlewareFn<C>;
    private controller;
    private execute;
    private apply;
    private requireSession;
    private deadline;
    private validate;
}
