export type TailSwapCarryAssignment = { id: string; height: number; }; export type TailSwapCarryResult = { carriedHeights: TailSwapCarryAssignment[]; reserveHeight: number; shouldClearReserve: boolean; shouldSnapAfterClear: boolean; }; export type ObserveTailSwapArgs = { currentIds: readonly string[]; getHeight: (_id: string) => number | undefined; estimatedHeight: number; canCarryTailRemoval: boolean; }; export declare const startsWithIds: (ids: readonly string[], prefix: readonly string[]) => boolean; /** * Tracks the one timing-sensitive shape the height cache intentionally does * not own: `[...prefix, measured-tail] -> [...prefix] -> [...prefix, new-id]`. * * The component uses the returned reserve to keep bottom geometry stable * during the empty tick, then seeds the appended id with the removed height if * it arrives before the pending carry is cleared. */ export declare class ChatTailSwapCarry { #private; clear(): void; observe({ currentIds, getHeight, estimatedHeight, canCarryTailRemoval }: ObserveTailSwapArgs): TailSwapCarryResult; }