/** One file in a prototype bundle. `path` is POSIX-relative to the bundle root
 *  (e.g. `assets/index-abc.js`); `content` is base64-encoded bytes. This is the
 *  wire shape the client uploads and the host stores — kept dependency-free so
 *  no tar/zip library is needed on either side. */
export interface BundleFile {
    path: string;
    content: string;
}
export interface BundleStore {
    /** Write a bundle's files under `deployId`. Overwrites any prior content. */
    put(deployId: string, files: BundleFile[]): Promise<void>;
    /** Read a single asset (already validated/normalized by the caller's router).
     *  Returns null when the bundle or asset doesn't exist. */
    read(deployId: string, assetPath: string): Promise<Buffer | null>;
    /** True when a bundle directory exists for `deployId`. */
    has(deployId: string): Promise<boolean>;
    /** Absolute on-disk root for a bundle (used by the static-serving worker). */
    rootFor(deployId: string): string;
}
/**
 * Filesystem-backed bundle store. Extracts each uploaded file under
 * `<root>/<deployId>/`. Single-instance only (a Render persistent disk is not
 * shared across instances) — fine for the MVP; swap for object storage later
 * behind this same interface.
 */
export declare class DiskBundleStore implements BundleStore {
    private readonly root;
    constructor(root: string);
    rootFor(deployId: string): string;
    put(deployId: string, files: BundleFile[]): Promise<void>;
    has(deployId: string): Promise<boolean>;
    read(deployId: string, assetPath: string): Promise<Buffer | null>;
}
/** Best-effort check that the configured bundle root is writable at boot. */
export declare const ensureBundleRoot: (root: string) => Promise<void>;
//# sourceMappingURL=BundleStore.d.ts.map