import type { EngineOps } from "./engine.js"; /** The generic collection the LIVE rows live in (never a dedicated table). * Exactly one row per live placement, which is what the seam readers count. */ export declare const PLACEMENTS_COLLECTION = "vendo_placements"; /** The pointers, in their own generic collection so the live count above stays * the live count. Neither reserved nor dedicated, so it routes to the same * `vendo_records` table — no migration, and the erase cascade still sweeps it * on `refs.subject`. */ export declare const PLACEMENT_SLOTS_COLLECTION = "vendo_placement_slots"; export interface PlacementRow { slot: string; appId: string; placedBy: string; placedAt: string; } export interface PlacementStore { get(subject: string, slot: string): Promise; put(subject: string, row: PlacementRow): Promise; /** Take the slot and report what held it, as ONE decision. */ place(subject: string, row: PlacementRow): Promise; /** Clear the slot only while `appId` still holds it. */ delete(subject: string, slot: string, appId: string): Promise; /** Clear every placement of one app, whoever holds it (app-deletion cleanup). */ clearForApp(appId: string): Promise; list(subject: string, slots?: readonly string[]): Promise; } export declare function placementStore(engine: EngineOps): PlacementStore; //# sourceMappingURL=placements.d.ts.map