export interface TrumpPost { id: number text: string // Was narrowed to 'x' | 'truth' when Trump was the only source. Now any string — // external signal modules POST to /api/signals/ingest with arbitrary source tags // (e.g. 'breakout', 'vcp_breakout', user's own strategy name). source: string published_at: string sentiment: 'bullish' | 'bearish' | 'neutral' signal: 'buy' | 'sell' | 'short' | 'hold' | null ai_confidence: number ai_reasoning: string | null prefilter_reason: 'rt_only' | 'url_only' | 'empty' | 'parse_error' | 'api_error' | null analysis_version: string | null relevant: boolean // v5 routing fields — null on pre-v5 posts target_asset: string | null category: string | null expected_move_pct: number | null price_impact: { // BUG-14 fix: tracked_asset is now target_asset ?? sentiment_asset, which // can be SOL/TRUMP/BNB/etc. — no longer restricted to BTC | ETH. asset: string m5: number | null // null = window still open (live rolling peak pending) m15: number | null m1h: number | null price_at_post: number correct_m5: boolean | null correct_m15: boolean | null correct_m1h: boolean | null } | null } export interface Candle { time: number open: number high: number low: number close: number volume: number } export interface BotTrade { id: number // Was narrowed to BTC/ETH; v5 routes trades to arbitrary HL perps (SOL, etc.). asset: string side: 'long' | 'short' entry_price: number exit_price: number | null // null = externally closed or position still open pnl_usd: number | null // null = unsettled / externally closed hold_seconds: number | null // null = not yet computed trigger_post_id: number | null // null = adopted/manual (no trigger post) opened_at: string closed_at: string | null // null for still-open positions trigger_post_text?: string | null /** Source of the triggering signal — 'truth' | 'breakout' | user's module name. */ trigger_source?: string | null /** True iff this was a paper-mode trade (no Hyperliquid call). */ is_paper?: boolean } export interface BotPerformance { period_days: number total_trades: number win_rate: number net_pnl_usd: number avg_hold_seconds: number max_drawdown_pct: number } // ── KOL module ──────────────────────────────────────────────────── export type KolAction = 'buy' | 'sell' | 'reduce' | 'bullish' | 'bearish' | 'mention' export interface KolTicker { ticker: string action: KolAction conviction: number quote: string timeframe?: string stance_change?: boolean } export type KolTier = 'trade_signal' | 'directional' | 'noise' export type KolPostType = 'original' | 'reply' | 'retweet' | 'quote' | 'thread_cont' export interface KolPostSummary { id: number kol_handle: string source: 'substack' | 'twitter' | string url: string title: string | null published_at: string summary: string | null tickers: KolTicker[] analyzed_at: string | null analysis_model: string | null tier?: KolTier | null post_type?: KolPostType | null talks_vs_trades_flag?: boolean sentiment?: 'bullish' | 'bearish' | 'neutral' | null } export interface KolPostDetail extends KolPostSummary { raw_text: string } export interface KolDigestCall { post_id: number kol_handle: string post_title: string | null published_at: string action: KolAction conviction: number quote: string } export interface KolDigestTicker { ticker: string dominant_action: KolAction side: 'long' | 'short' | 'neutral' max_conviction: number post_count: number kol_count: number kols: string[] calls: KolDigestCall[] } export interface KolDigest { window_days: number since: string post_count: number ticker_count: number tickers: KolDigestTicker[] } // ── KOL A-tier: on-chain holdings ───────────────────────────────────────── export interface KolWallet { id: number handle: string chain: string // ethereum | solana | hl address: string label: string | null source_url: string | null active: boolean added_at: string } export interface KolHolding { ticker: string amount: number usd_value: number chain: string side?: 'long' | 'short' // HL perps only } export interface KolHoldingChange { id: number wallet_id: number handle: string detected_at: string ticker: string change_type: 'new_position' | 'closed' | 'increased' | 'decreased' usd_before: number | null usd_after: number | null pct_change: number | null } export interface KolDivergence { id: number handle: string ticker: string signal_type: 'divergence' | 'alignment' direction: 'long' | 'short' post_id: number post_action: string // buy | sell | bullish | bearish post_conviction: number | null post_at: string onchain_action: string // new_position | increased | decreased | closed usd_before: number | null usd_after: number | null onchain_at: string days_apart: number | null created_at: string }