import type Database from 'better-sqlite3';
/**
 * Migration registry. Entries are TS constants (not file reads) so the
 * built dist/ tree has no runtime filesystem dependency. Each migration's
 * `sql` string is also mirrored in src/cache/migrations/NNN-*.sql for
 * grep-ability and review.
 */
export interface Migration {
    /** Unique stable name. Must never be renamed after release. */
    name: string;
    sql: string;
    /** True if the migration depends on sqlite-vec being loaded. */
    requiresVec?: boolean;
    /**
     * Optional follow-up step run inside the same transaction as `sql`. Used
     * for migrations whose idempotency requires JS-level inspection (e.g.
     * conditional ADD COLUMN) that pure SQL can't express on SQLite.
     */
    postStep?: (db: Database.Database) => void;
}
export declare const MIGRATIONS: Migration[];
/** Test-only: reset the module-level read-only guard between cases. */
export declare function _resetMigrationGuard(): void;
/**
 * Apply pending migrations in order. Idempotent — already-applied migrations
 * are skipped via the schema_migrations table. Migrations marked
 * `requiresVec: true` are skipped when the sqlite-vec extension is absent so
 * FTS5-only flows still work on platforms without the native extension.
 * On a read-only database, logs a single warning and stops; subsequent
 * calls in the same process are no-ops.
 */
export declare function applyMigrations(db: Database.Database, opts?: {
    vecLoaded: boolean;
}): void;
//# sourceMappingURL=runner.d.ts.map