d50c05b120
Frontend half of the pre-launch audit campaign: - types/index.ts + kol/KolPageClient.tsx: add missing 'reduce' KolAction (backend emits it; frontend lacked the type + color/label maps → undefined styling). Adds ACTION_COLOR/actionLabel/postActionLabel entries. - proxy/[...path]/route.ts: relay real client IP (x-forwarded-for / x-real-ip) so the backend rate limiter buckets per-user instead of per-Next-server (BUG-02). - Settings/BotConfigPanel redesign, paper-mode clarity, copy cleanup. - Assorted page/display fixes, loading states, Pagination component. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
176 lines
4.5 KiB
TypeScript
176 lines
4.5 KiB
TypeScript
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
|
|
pnl_usd: number
|
|
hold_seconds: number
|
|
trigger_post_id: number
|
|
opened_at: string
|
|
closed_at: string
|
|
/** 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
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
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
|
|
}
|