import type { MigrateFn } from '../storage.interface';
/**
 * Решение о миграции персистентного состояния, принимаемое до записи. Чистая функция —
 * не трогает хранилище; применяет результат вызывающий (`initializeWithMiddlewares`),
 * т.к. запись отличается в sync/async адаптерах.
 */
export type MigrationDecision<T> = 
/** Данных нет — записать `initialState` (если задан) и текущую версию. */
{
    kind: 'seed';
}
/** Данные старой версии — записать `state` (результат `migrate`) и текущую версию. */
 | {
    kind: 'migrate';
    state: T;
}
/** Данные актуальной формы, но версию надо обновить (например, поднята без `migrate`). */
 | {
    kind: 'bump';
}
/** Ничего не делать (версии совпадают либо сохранённая новее текущей). */
 | {
    kind: 'none';
};
export interface DecideMigrationOptions<T extends Record<string, any>> {
    hasExisting: boolean;
    existingState: any;
    persistedVersion: number | undefined;
    targetVersion: number;
    migrate?: MigrateFn<T>;
}
/**
 * Сравнивает сохранённую версию схемы с текущей (`config.version`) и решает, что делать
 * с персистентными данными при инициализации. Dev-предупреждения (в non-production) —
 * только при потенциально опасных рассогласованиях (версия поднята без `migrate`,
 * сохранённая версия новее текущей).
 */
export declare function decideMigration<T extends Record<string, any>>(options: DecideMigrationOptions<T>): MigrationDecision<T>;
