/** * Normalization from raw start.gg GraphQL shapes to flat, LLM-friendly objects. * * Rules: * - never invent data: anything the API did not return is null * - derived values (not present in the API) get a `derived` prefix * - raw enum-ish integers are kept alongside their decoded names */ export interface NormalizedPageInfo { page: number | null; perPage: number | null; total: number | null; totalPages: number | null; } export interface NormalizedVideogame { id: number; name: string | null; displayName: string | null; slug: string | null; } export interface NormalizedTournament { id: number; name: string | null; slug: string | null; shortSlug: string | null; url: string | null; city: string | null; addrState: string | null; countryCode: string | null; postalCode?: string | null; venueName: string | null; venueAddress?: string | null; timezone: string | null; startAt: string | null; endAt: string | null; registrationClosesAt: string | null; isRegistrationOpen: boolean | null; numAttendees: number | null; isOnline: boolean | null; hasOfflineEvents: boolean | null; hasOnlineEvents: boolean | null; links?: { facebook: string | null; discord: string | null; } | null; } export interface NormalizedEventSummary { id: number; name: string | null; slug: string | null; url: string | null; startAt: string | null; state: string | null; numEntrants: number | null; isOnline: boolean | null; videogame: NormalizedVideogame | null; } export interface NormalizedPhase { id: number; name: string | null; numSeeds: number | null; phaseOrder: number | null; bracketType: string | null; state: string | null; } export interface NormalizedPlayerRef { playerId: number | null; gamerTag: string | null; prefix: string | null; } export interface NormalizedEntrant { entrantId: number; name: string | null; seed: number | null; isDisqualified: boolean | null; players: NormalizedPlayerRef[]; } export interface NormalizedStanding { placement: number | null; isFinal: boolean | null; entrant: NormalizedEntrant | null; } export interface NormalizedSetSlot { entrantId: number | null; name: string | null; seed: number | null; players: NormalizedPlayerRef[]; /** Games won in this set. -1 means disqualification on start.gg. */ score: number | null; } export interface NormalizedSet { /** Usually numeric; unstarted "preview" sets have string ids like "preview_...". */ id: number | string; identifier: string | null; /** Human-readable round, e.g. "Winners Quarter-Final" (from fullRoundText). */ round: string | null; /** Numeric round; negative numbers are losers bracket. */ roundNumber: number | null; state: string | null; /** Raw integer state as returned by start.gg. */ stateRaw: number | null; startedAt: string | null; completedAt: string | null; entrant1: NormalizedSetSlot | null; entrant2: NormalizedSetSlot | null; score: { entrant1: number | null; entrant2: number | null; /** start.gg display string, e.g. "PlayerA 3 - PlayerB 1" or "DQ". */ displayScore: string | null; }; winnerEntrantId: number | null; totalGames: number | null; phase: { id: number; name: string | null; } | null; phaseGroup: { id: number; displayIdentifier: string | null; } | null; vodUrl: string | null; /** Only present in player-set results, where sets span events. */ event?: { id: number; name: string | null; slug: string | null; tournament: { id: number; name: string | null; slug: string | null; } | null; } | null; } export interface NormalizedStream { id: number | null; /** StreamSource enum: TWITCH | YOUTUBE | HITBOX | STREAMME | MIXER. */ source: string | null; /** Channel name as entered by the organizer. */ name: string | null; game: string | null; status: string | null; isOnline: boolean | null; enabled: boolean | null; /** * URL derived from source + name; not an API field. Only derived for TWITCH * (twitch.tv/ is canonical). YOUTUBE stream names are display names, * not reliable channel handles, so no URL is derived for them. */ derivedUrl: string | null; } export interface NormalizedStreamQueue { id: string | null; stream: NormalizedStream | null; sets: NormalizedSet[]; } export interface NormalizedPlayer { playerId: number; gamerTag: string | null; prefix: string | null; user: { id: number; slug: string | null; name: string | null; } | null; } /** * Set.state is an integer in the start.gg schema. Names below follow the * schema's ActivityState enum order (CREATED, ACTIVE, COMPLETED, READY, * INVALID, CALLED, QUEUED) read as 1-based ordinals. Verified against the live * API (2026-08-24): 1 = un-started preview set, 3 = completed set, * 5 = unplayed "Grand Final Reset". 2/4/6/7 follow the same ordinal rule but * were not directly observed; `stateRaw` always carries the original integer. */ export declare const SET_STATE_NAMES: Record; export declare function setStateName(state: number | null | undefined): string | null; export declare function toIso(epochSeconds: number | null | undefined): string | null; export declare function normalizePageInfo(raw: any): NormalizedPageInfo; export declare function normalizeVideogame(raw: any): NormalizedVideogame | null; export declare function normalizeTournament(raw: any): NormalizedTournament | null; export declare function normalizeEventSummary(raw: any): NormalizedEventSummary | null; export declare function normalizePhase(raw: any): NormalizedPhase | null; export declare function normalizeEntrant(raw: any): NormalizedEntrant | null; export declare function normalizeStanding(raw: any): NormalizedStanding | null; export declare function normalizeSet(raw: any): NormalizedSet | null; export declare function normalizeStream(raw: any): NormalizedStream | null; export declare function deriveStreamUrl(source: string | null, name: string | null): string | null; export declare function normalizeStreamQueue(raw: any): NormalizedStreamQueue | null; export interface NormalizedParticipant { participantId: number; gamerTag: string | null; prefix: string | null; playerId: number | null; userId: number | null; userSlug: string | null; } export declare function normalizeParticipant(raw: any): NormalizedParticipant | null; export declare function normalizePlayer(raw: any): NormalizedPlayer | null;