/**
 * Interval lane-packing — internal.
 *
 * Pure interval math: takes a list of `{ start, end, orderKey }` and assigns
 * each to a lane such that overlapping intervals never share a lane. Builds
 * "transitive overlap clusters" so that an isolated afternoon item isn't
 * forced to half-width because the morning was busy.
 *
 * Sort tiebreak is fully deterministic: `(start, end, orderKey)`. Callers
 * must supply orderKey — the algorithm never re-derives it.
 */
export type LanePackingInput = Readonly<{
    start: number;
    end: number;
    orderKey: string;
}>;
export type LanePackingResult = Readonly<{
    laneIndex: number;
    laneCount: number;
}>;
/**
 * Assign lanes to a list of intervals.
 *
 * Returns one result per input in the same order as the input. Internally
 * sorts a copy by `(start, end, orderKey)` to ensure determinism, then
 * permutes results back to input order.
 */
export declare function assignLanes(intervals: readonly LanePackingInput[]): LanePackingResult[];
