export interface LaneCandidate { id: TId; cost: number; } export interface PickLaneOptions { /** The lane currently taken — kept unless a rival is decisively cheaper. */ current?: TId | null; /** How much cheaper a rival must be to displace `current`: it wins only when `cost < currentCost / stickiness`. Default `1.2`. */ stickiness?: number; /** Candidates within this cost of the best tie for the win; the tie is broken by `rng`. Default `0`. */ tieEpsilon?: number; rng?: () => number; } /** * Live cost-based selection over parallel corridors (#286.7) — the racing-line / lane-merge pick * every AI driver hand-rolled. Evaluate each lane's cost this tick (crowding, hazards, distance) * and let stickiness hysteresis stop the agent flip-flopping between near-equal lanes. * @internal */ export declare function pickLane(candidates: readonly LaneCandidate[], options?: PickLaneOptions): TId | null; /** Sum a live cost function over a corridor's sample points — the standard way to build `LaneCandidate.cost`. * @internal */ export declare function corridorCost(points: readonly (readonly [number, number])[], costAt: (x: number, z: number) => number): number;