import type { BrowseQuery } from "./types.js"; /** Largest `limit` the UNTRUSTED boundary accepts. Enforced only when a caller passes * `maxLimit` — in-process callers (the CLI's 10 000-row consolidation scan) are * trusted and exempt; the HTTP route is not. */ export declare const BROWSE_MAX_LIMIT = 1000; /** Applied by the stores when `limit` is absent. */ export declare const BROWSE_DEFAULT_LIMIT = 50; export declare const BROWSE_SORT_FIELDS: readonly ["updatedAt", "createdAt", "confidence", "namespace", "kind", "status"]; /** Every rejection this module raises. The Inspector maps it to 400 `{error}`; the * stores let it propagate, so a bad query fails loudly instead of silently matching * zero rows. */ export declare class BrowseQueryError extends Error { readonly code: string; constructor(message: string, code?: string); } /** * The single reading of "is this browse query legal". Runs at the Inspector HTTP * boundary (mapped to 400) and defensively inside every store (thrown). Pass * `maxLimit` at untrusted boundaries only — see BROWSE_MAX_LIMIT. * * The empty set is spelled two ways and they do NOT mean the same thing. The shorthand * `status: []` / `kind: []` is legal and means "match nothing" (see `BrowseQuery`), while * `filters: [{ field: "status", op: "in", values: [] }]` is rejected: a filter entry exists * only because a caller constructed one, so an empty value list is a construction bug * rather than a narrowing. A caller translating UI state must use the shorthand to say * "narrowed to nothing". */ export declare function validateBrowseQuery(query: BrowseQuery, opts?: { readonly maxLimit?: number; }): void; //# sourceMappingURL=browse-validate.d.ts.map