export type ContestedPhase = "idle" | "active" | "paused" | "contested" | "complete" | "interrupted"; export type ContestReaction = "pause" | "decay"; export interface ContestedChannelConfig { duration: number; interruptOnDamage?: boolean; resetOnInterrupt?: boolean; favorability?: Record; ratePerOccupant?: boolean; contested?: ContestReaction; decayRate?: number; } export type ContestedEventKind = "start" | "tick" | "contested" | "paused" | "complete" | "interrupted"; export interface ContestedEvent { kind: ContestedEventKind; owner: string | null; progress: number; reason?: string; } export interface ContestedSnapshot { phase: ContestedPhase; progress: number; owner: string | null; remaining: number; } export interface ContestedChannel { start(team: string): ContestedEvent | null; tick(dt: number, occupants?: Record): ContestedEvent[]; damage(reason?: string): ContestedEvent | null; reset(): void; progress(): number; phase(): ContestedPhase; owner(): string | null; remaining(): number; snapshot(): ContestedSnapshot; } /** @internal */ export declare function createContestedChannel(config: ContestedChannelConfig): ContestedChannel;