export const CONTEXT7_API_BASE = "https://context7.com/api/v2"; export const EXA_URL = "https://api.exa.ai/search"; export const EXA_CONTENTS_URL = "https://api.exa.ai/contents"; export const BRAVE_URL = "https://api.search.brave.com/res/v1/web/search"; export const METASO_URL = "https://metaso.cn/api/v1/search"; export const METASO_READER_URL = "https://metaso.cn/api/v1/reader"; export const JINA_URL = "https://s.jina.ai/"; export const JINA_READER_URL = "https://r.jina.ai/"; export const OPENALEX_URL = "https://api.openalex.org"; export const OPENALEX_RESULTS_PER_PAGE = 10; export const TAVILY_EXTRACT_URL = "https://api.tavily.com/extract"; export const TAVILY_SEARCH_URL = "https://api.tavily.com/search"; export const MINERU_URL = "https://mineru.net"; export const DEFAULT_SEARCH_RESULTS = 10; export const PREVIEW_LINES = 25; export const SEARCH_ENGINES = ["exa", "brave", "metaso", "jina", "tavily"] as const; export const READ_ENGINES = ["tavily", "jina", "exa", "metaso"] as const; export type SearchEngine = typeof SEARCH_ENGINES[number]; export type ReadEngine = typeof READ_ENGINES[number]; export interface SpinnerState { frame: number; interval: ReturnType | null; } export interface SearchResult { title: string; url: string; snippet: string; source: SearchEngine; } export interface SearchDetails { query: string; engines?: SearchEngine[]; count?: number; phase: "searching" | "merging" | "done"; exaCount?: number; braveCount?: number; totalBeforeDedup?: number; totalAfterDedup?: number; metasoCount?: number; jinaCount?: number; tavilyCount?: number; metasoError?: string; jinaError?: string; exaError?: string; braveError?: string; tavilyError?: string; error?: string; } export interface WebReadDetails { urls: string[]; engines?: ReadEngine[]; succeeded: number; failed: number; error?: string; results?: { url: string; engine: ReadEngine; lines: number }[]; failedUrls?: { url: string; engine: ReadEngine; error: string }[]; } export interface DocsSearchDetails { library: string; query: string; phase: "resolving" | "fetching" | "done"; resolvedId?: string; resolvedName?: string; snippets?: number; lines?: number; error?: string; } export interface LibraryResult { id: string; name?: string; title?: string; } export interface LibrarySearchResponse { results?: LibraryResult[]; } export interface ExtractResult { url: string; raw_content: string; } export interface ExtractFailure { url: string; error: string; } export interface ExtractResponse { results: ExtractResult[]; failed_results: ExtractFailure[]; } export interface AcademicSearchDetails { query: string; phase: "searching" | "done"; totalResults?: number; returnedResults?: number; error?: string; } export interface DocumentParseDetails { source: string; phase: "submitting" | "uploading" | "parsing" | "downloading" | "done"; taskId?: string; totalPages?: number; lines?: number; bytes?: number; pages?: number; outputPath?: string; paginated?: boolean; error?: string; }