export type Asset = { ticker: string; name: string; category: string; sector: string; industry: string; country: string; asset_type: string; currency: string; exchange: string; description: string; market_snapshot?: MarketSnapshot; }; export type MarketSnapshot = { ticker: string; currency: string; data_status: string; price: number | null; date: string | null; volume: number | null; provider: string | null; perf_1d: number | null; perf_5d: number | null; perf_1m: number | null; }; export type Signal = { ticker: string; classification: string; blum_score: number; risk_level: string; time_horizon: string; score_breakdown: Record; technical_summary?: Record; narrative_summary?: Record; explanation: string; watch_points: { items?: string[] }; created_at: string; asset?: Asset; market_snapshot?: MarketSnapshot; }; export type DashboardOverview = { market_pulse: { asset_count: number; article_count: number; average_sentiment: number; signal_count: number; price_row_count: number; classification_mix: Record; }; readiness: { price_row_count: number; news_article_count: number; signal_count: number; price_providers: Array<{ provider: string; rows: number }>; }; realtime: PipelineStatus; todays_strongest_signals: Signal[]; narrative_breakouts: Signal[]; technical_breakouts: Signal[]; sentiment_divergence: Signal[]; watchlist_candidates: Signal[]; etf_rotation_leaders: Array<{ ticker: string; category: string; asset?: Asset; market_snapshot?: MarketSnapshot; momentum_score: number; thematic_score: number; confirmation_score: number; }>; }; export type PipelineStatus = { started: boolean; running: boolean; last_started_at: string | null; last_completed_at: string | null; last_job: string | null; last_status: string; last_error: string; last_result: Record; }; export type SentimentPayload = { model_name: string; label: string; score: number; confidence: number; baseline_vader?: number | null; }; export type LiveNewsArticle = { id: number; title: string; summary: string; source: string; published_at: string | null; url: string; quality_score: number; theme_tags: { themes?: string[]; desk?: string; tier?: number }; sentiment: SentimentPayload | null; linked_assets: Array<{ ticker: string; name: string; sector: string; relevance_score: number }>; }; export type MarketSentiment = { window_hours: number; article_count: number; average_sentiment: number; label_counts: Record; models: Record; themes: Array<{ theme: string; headline_count: number; avg_sentiment: number }>; }; export type PricePoint = { date: string; open?: number; high?: number; low?: number; close: number; volume?: number; }; export type RelatedNews = { id: number; title: string; summary: string; source: string; published_at: string | null; url: string; quality_score: number; theme_tags: { themes?: string[] }; relevance_score?: number; };