/** * Trouve-KA — types du contrat d'API (recherche, statut, admin) * Author: Simon-Pierre Boucher * Contact: contact@spboucher.ai */ /** Un résultat de recherche tel que renvoyé par `GET /api/search`. */ export interface SearchResult { title: string; url: string; display_url: string; /** HTML restreint : seuls les segments `` de surlignage sont rendus. */ snippet: string; domain: string; language: string; quebec_score: number; badges?: string[]; published_at?: string | null; /** URL de l'og:image de la page (hotlink), ou null si absente. */ image: string | null; } /** Réponse complète de `GET /api/search`. */ export interface SearchResponse { query: string; total: number; took_ms: number; page: number; limit: number; results: SearchResult[]; } /** Réponse de `GET /api/status` (état public du moteur). */ export interface StatusResponse { pages_indexed: number; domains_count: number; indexed_last_hour: number; fetched_last_hour: number; crawler_state: string; frontier_pending: number; frontier_in_progress: number; errors_last_hour: number; search_ok: boolean; } /** Réponse de `POST /api/submit`. */ export interface SubmitResponse { accepted: boolean; message: string; } /** Réponse de `GET /api/admin/overview`. */ export interface AdminOverview { paused: boolean; frontier: { pending: number; in_progress: number; done: number; failed: number; blocked: number; }; rates: { fetched_1h: number; parsed_1h: number; indexed_1h: number; errors_1h: number; robots_blocked_1h: number; duplicates_1h: number; }; http_status: Record; top_domains: { domain: string; pages: number; quebec_score: number }[]; recent_errors: { url: string; error_code: string; at: string }[]; latency: { fetch_p50_ms: number; fetch_p95_ms: number }; } /** Un événement du flux live de crawl (`GET /api/admin/recent`). */ export interface CrawlEvent { at: string; url: string; status: number; outcome: string; quebec_score?: number | null; title?: string | null; } /** Réponse de `GET /api/admin/recent`. */ export interface AdminRecentResponse { events: CrawlEvent[]; }