/**
 * File-per-message body storage backend.
 *
 * Disk layout: {basePath}/{accountId}/<xx>/<uuid>.eml
 * Filename is an opaque UUID. Two-char prefix dir for filesystem fan-out.
 *
 * CRITICAL: the on-disk filename carries NO semantic meaning — not folder
 * id, not UID, not Message-ID. A new UUID is minted on every `putMessage`.
 * Moves, UID renumbers, UIDVALIDITY bumps cannot shadow a body because no
 * filename is ever reused. DB's `body_path` column is the sole authority
 * on where a given message's body lives.
 */
import type { MessageStore } from "@bobfrankston/mailx-types";
export declare class FileMessageStore implements MessageStore {
    private basePath;
    constructor(basePath: string);
    /** Fresh opaque path per call. No inputs from the caller affect the name. */
    private newMessagePath;
    /** Verify a given path resolves inside this store's basePath — refuses
     *  any value that doesn't (cheap directory-traversal guard). */
    private inStore;
    /** Write a new body. Always a fresh UUID path. Caller MUST persist the
     *  returned path in the DB (`body_path`) and use it for all reads. The
     *  (folderId, uid) args are kept for interface compatibility; they do
     *  NOT affect the filename. */
    putMessage(accountId: string, _folderId: number, _uid: number, raw: Buffer): Promise<string>;
    /** Read by absolute path (DB `body_path`). The primary read API. */
    readByPath(fullPath: string): Promise<Buffer>;
    hasByPath(fullPath: string): Promise<boolean>;
    unlinkByPath(fullPath: string): Promise<void>;
    getMessagePath(_accountId: string, _folderId: number, _uid: number): string;
    getMessage(_accountId: string, _folderId: number, _uid: number): Promise<Buffer>;
    hasMessage(_accountId: string, _folderId: number, _uid: number): Promise<boolean>;
    deleteMessage(_accountId: string, _folderId: number, _uid: number): Promise<void>;
}
//# sourceMappingURL=file-store.d.ts.map