/**
 * 4-layer dedup (Task 308).
 *
 * Strict superset of the previous nodeId-only dedup. Catches duplicate
 * representations the typed-edge hook (Task 305) and document-ingest
 * pipeline will inevitably create: slug variants, canonical-name
 * variants, and content-hash duplicates.
 *
 * Order: hits are sorted by descending score FIRST, then walked. The
 * highest-score representative wins on every layer; later entries with
 * the same key on any active layer are dropped. Missing values on a
 * layer (no `slug`, no `canonicalName`, no derivable hash) are not
 * collisions — they simply skip that layer for that row.
 */
export type DedupLayer = "nodeId" | "slug" | "canonicalName" | "contentHash";
export declare const DEFAULT_LAYERS: DedupLayer[];
interface DedupHit {
    nodeId: string;
    properties: Record<string, unknown>;
    score: number;
}
/**
 * Dedup `hits` across the requested layers. Returns a new array with the
 * highest-scoring representative per collision class, in original
 * descending-score order.
 */
export declare function dedup<T extends DedupHit>(hits: T[], layers?: DedupLayer[]): T[];
export {};
//# sourceMappingURL=dedup.d.ts.map