/** Analytics engine: scoring calibration, drop patterns, and genre evolution. */ import type { AniListMediaListEntry } from "../types.js"; export interface GenreCalibration { genre: string; userMean: number; communityMean: number; delta: number; count: number; } export interface CalibrationResult { overallDelta: number; tendency: "high" | "low" | "balanced"; genreCalibrations: GenreCalibration[]; totalScored: number; } export interface DropCluster { label: string; type: "genre" | "tag"; dropCount: number; totalCount: number; dropRate: number; medianDropPoint: number; } export interface DropAnalysis { totalDropped: number; clusters: DropCluster[]; earlyDrops: number; avgDropProgress: number; } export interface GenreEra { period: string; startYear: number; endYear: number; topGenres: string[]; count: number; } export interface EvolutionResult { eras: GenreEra[]; shifts: string[]; } /** Per-genre scoring bias relative to community consensus */ export declare function computeCalibration(entries: AniListMediaListEntry[]): CalibrationResult; /** Genre and tag clusters in a user's dropped titles */ export declare function analyzeDrops(droppedEntries: AniListMediaListEntry[], allEntries: AniListMediaListEntry[]): DropAnalysis; /** How genre preferences shifted across time windows */ export declare function computeGenreEvolution(entries: AniListMediaListEntry[], windowYears?: number): EvolutionResult;