/**
 * Pure rules-driven zone evaluator. Shared between every consumer
 * that gates items (motion regions, detections, future audio events,
 * …) by `(zones, rules)` pairs. Lives in `@camstack/types/utils` so
 * addon-motion-wasm + addon-detection-pipeline share one canonical
 * implementation.
 *
 * Semantics — match the analytics zone-engine introduced in Phase 2a:
 *   - any active include rule fires ⇒ whitelist mode (only items
 *     satisfying at least one include rule pass)
 *   - otherwise ⇒ blacklist mode (items in any exclude rule are
 *     dropped, the rest pass)
 *   - inactive rules (`enabled: false`) are skipped before the gate
 *   - a rule's `classFilter` narrows it to the listed classes; an
 *     item whose class isn't in the filter is invisible to that rule
 *
 * Test point: each item provides a normalised (0–1) center via the
 * `getCenter` accessor; rules fire when the center lies inside any
 * of the rule's referenced zone polygons (ray-cast point-in-polygon).
 * Bbox-area overlap would be marginally more intuitive on tiny
 * items but doubles the per-frame cost; the center test keeps the
 * hot path cheap and matches the operator's intuition for
 * "where is the activity centered".
 */
import type { Zone } from '../capabilities/zones.cap.js';
import type { ZoneRule } from '../capabilities/schemas/zone-rule.js';
export interface ZoneRuleEvalResult<T> {
    readonly passed: readonly T[];
    readonly excluded: readonly T[];
}
/**
 * Evaluate `rules` against `items`. Returns the items partitioned
 * into `passed` (kept by the gate) and `excluded` (dropped). When
 * `rules` is empty or `zones` is empty everything passes — the gate
 * is "off" without explicit configuration.
 *
 * `getCenter` returns the item's normalised (0–1) center point.
 * `getClassName` is optional — when omitted, every rule's
 * `classFilter` is treated as matching all classes (motion-stage
 * semantics). Provide it for object detections so per-class rules
 * narrow correctly.
 */
export declare function evaluateZoneRules<T>(items: readonly T[], zones: readonly Zone[], rules: readonly ZoneRule[], getCenter: (item: T) => {
    readonly x: number;
    readonly y: number;
}, getClassName?: (item: T) => string | undefined): ZoneRuleEvalResult<T>;
//# sourceMappingURL=zone-rule-eval.d.ts.map