export interface WebSearchResult { title: string; url: string; snippet: string; content?: string; // page content, present only when the provider returns it } export interface WebSearchOpts { count?: number; markdown?: boolean; } export interface WebSearchAuth { key?: string; searxngUrl?: string; } export type WebSearchProviderId = 'tavily' | 'firecrawl' | 'brave' | 'searxng'; export interface WebSearchProvider { id: WebSearchProviderId; name: string; auth: 'key' | 'url'; nativeContent: boolean; // true if search results already include page content buildRequest(query: string, opts: WebSearchOpts, auth: WebSearchAuth): { url: string; init: RequestInit }; normalize(raw: any): WebSearchResult[]; }