export interface FeedItem { id: string; source: string; title: string; url: string; publishedAt: Date; content?: string; summary?: string; } export interface FetchInput { url: string; expectedFormat: "rss" | "atom"; } export interface FetchError { source: string; reason: string; code: "NETWORK" | "TIMEOUT" | "PARSE" | "UNKNOWN"; } export interface FeedResponse { source: string; body: string; contentType: string; statusCode: number; } export interface FetchResult { responses: FeedResponse[]; errors: FetchError[]; fetchedAt: Date; } export interface FeedSource { id: string; // Hash of URL url: string; // Feed URL name: string | null; // Display name format: 'rss' | 'atom'; // Expected format pollIntervalMs: number; // How often to check isActive: boolean; // Whether to poll lastFetchedAt: Date | null; // Last attempt timestamp lastSuccessAt: Date | null; // Last successful fetch consecutiveFailures: number; // Error streak counter createdAt: Date; updatedAt: Date; }