/** * The host's mounted slots, as ROWS — the registry a surface reports itself * into, so anything that offers to build for a slot can name the real ones. * * A slot exists because a page RENDERS it, and nothing announces when one is * taken off a page: a row written once would outlive its surface forever. So * every render reports the slot again, refreshing `lastSeen`, and the read * filters on it — a slot that stopped rendering ages out of the registry on its * own after {@link SLOT_DECAY_MS}. * * The rows live in the GENERIC records collection, like the placement rows * beside them (`placements.ts`): `vendo_slots` is neither reserved nor * dedicated (`packages/vendo/src/store/routing.ts`), so it routes to `vendo_records` * on every adapter with no migration to run. * * `refs` carries `subject` and nothing else — the key the erase cascade matches * (`vendo_records WHERE refs @> '{"subject": …}'::jsonb`, `packages/vendo/src/store/ * erase.ts`), and the only query this surface ever makes. */ import { SLOT_DECAY_MS, type RunContext, type SlotEntry } from "@vendoai/core"; import type { EngineOps } from "./engine.js"; /** The generic collection the slot rows live in (never a dedicated table). */ export declare const SLOTS_COLLECTION = "vendo_slots"; export { SLOT_DECAY_MS }; /** One slot, as the host's surface reports it. */ export interface SlotDescriptor { id: string; label: string; /** What the spot is FOR, in the host developer's own words — the sentence an * agent reads to pick between two slots a label alone cannot separate. */ description?: string; } export type { SlotEntry }; export interface SlotRegistry { /** Idempotent: one row per (subject, slot), refreshed in place. */ report(input: { slots: readonly SlotDescriptor[]; }, ctx: RunContext): Promise; /** The caller's own slots inside the decay window, most recently seen first. */ list(ctx: RunContext): Promise; } export declare const createSlotRegistry: (engine: EngineOps) => SlotRegistry; //# sourceMappingURL=slots.d.ts.map