/**
 * Table columns → the closed DataProfile.
 *
 * The profiler reports facts; the catalog judges them. There is no threshold
 * here — `categoryCardinality` is a count, and rules like bar-chart's
 * `categoryCardinality <= 30` live in metadata, not in this file.
 *
 * Output carries all 15 DATA_PROFILE_KEYS, in the frozen order, every time:
 * the same table always serializes to the same bytes. Anything the columns do
 * not support is `false` / `0`, never a missing key and never a new key.
 */
import { type DataProfile } from '../spec/data-profile.js';
import { type Table } from './table.js';
/**
 * Host capabilities that no column can prove. A Mapbox token is injected by
 * the host, so it is passed in rather than guessed from a lat/lng pair.
 */
export type ProfileEnv = {
    hasMapToken?: boolean;
};
export declare function profileColumns(table: Table, env?: ProfileEnv): DataProfile;
/**
 * Guard for anything claiming to be a DataProfile — profiler output and
 * fixtures alike. An extra key fails; it is never dropped and never ignored.
 */
export declare function assertClosedProfile(profile: object, label?: string): void;
