๐Ÿ“Š Dashboard
Connectingโ€ฆ
--:--
๐Ÿ“‹
โ€“
Total Tasks
๐Ÿ”„
โ€“
In Progress
โณ
โ€“
In Review
โœ…
โ€“
Completed

๐Ÿ“‹ Kanban Board

0

โšก Live Activity

๐Ÿ›ก๏ธ System Health

๐Ÿค– Agent Fleet

0

โšก Always Running

๐Ÿ“… Weekly Schedule

๐Ÿ“† Calendar Items

๐Ÿญ Factory Floor โ€” Agent Stations

๐Ÿ“Š Operations Metrics

๐Ÿ“ก Live Task Ticker

โฐ Active Crons

0
โ— LIVE

AI Jedi Trader Floor

12 traders ยท $2,000 each ยท 8 markets ยท Competition March 2026

TODAY P&L
+$0.00
Since 12:00 AM PT ยท CLOSE trades
WEEK P&L
+$2.74
Mon 12:00 AM PT ยท activity feed
MTD P&L
+$1.22K
March 2026 ยท all trades
CLOSED TODAY
0
CLOSE actions ยท since 12 AM PT
OPEN POSITIONS
20
Across all traders
No traders in Watchlist or Warning zones. No eliminations.

MARKET STANDINGS

โ€” Top performer per market
๐Ÿ“Š STOCKS
๐Ÿช™ CRYPTO
๐Ÿ”ฎ PREDICTION MARKETS
๐Ÿฅ‡ METALS & FUTURES
๐Ÿ›ข๏ธ OIL & COMMODITIES
๐Ÿฅ‡ GOLD & SILVER
๐Ÿ’ฑ FOREX

PERFORMANCE SCOREBOARD

# TRADER MARKET TODAY WEEK MTD BALANCE TRADES WIN% AVG WIN EXPECT. STATUS

OPEN POSITIONS

โ€” 20 active ยท live from trade log
TRADER SYMBOL SIDE LEV ENTRY SIZE STOP LOSS TAKE PROFIT

RECENT TRADE ACTIVITY

โ€” Latest 30 actions ยท live feed
TIME TRADER ACTION SYMBOL DETAIL P&L

๐Ÿ“ž Retell AI Clients

๐Ÿง  Memory Logs

๐Ÿ“„
Select a doc to preview

๐Ÿ‘ฅ Meet the Team

โš–๏ธ Agent Governance

MARKET WATCH
ยท --:--:--
๐Ÿ“บ Command Terminal BLOOMBERG-STYLE
UTC --:--:--
DAY P&L
+$2,847.32
Today ยท vs. $24,000 account
OPEN P&L
+$1,284.50
Unrealized
CLOSED P&L
+$1,562.82
Settled
BUYING POWER
$18,420
Margin avail.
LEVERAGE
3.2ร—
Exp/Eq: $78K/$24K
VAR (DAILY) MODERATE
$1,240
95% CI ยท 1-day horizon
MAX DRAWDOWN LOW
-4.2%
Peak $25,060 ยท Trough $24,000
CONCENTRATION HIGH
68%
Top 3: BTC $16.4K ยท ETH $12.1K
DAILY LOSS LIMIT OK
-0.6%
Daily stop: -5% ($1,200)
WIN RATE
64.2%
W: 134 ยท L: 75
AVG WIN / LOSS
2.4:1
$284 avg win
EXPECTANCY
+$108
Per trade
PROFIT FACTOR
1.87
Gross P/Gross L
RECOVERY FACTOR
3.14
Net/MaxDD
SHARPE RATIO
1.82
Risk-adj. return
FEAR & GREED (CRYPTO)
72 GREED
FEAR & GREED (TRAD.)
48 FEAR
BTC DOMINANCE
62.4% BULLISH
FUNDING RATE (BTC)
+0.010% POS
Binance perp ยท 8h reset
DXY (USD INDEX)
104.32 -0.4%
USD softening ยท BTCๅˆฉๅฅฝ
๐Ÿ“ˆ ACCOUNT EQUITY CURVE
12-month performance ยท Starting $10,000 โ†’ $24,000
+$14,000 (+140%)
YTD return
Apr May Jun Jul Aug Sep Oct Nov Dec Jan Feb Mar
Peak: $25,060
Trough: $24,000
MaxDD: -4.2%
๐Ÿ“… ECONOMIC CALENDAR โ€” TODAY
08:30
USD
CPI (MoM)
Prev: 0.3% ยท Fcst: 0.2%
in 42min
10:00
USD
ISM Manufacturing PMI
Prev: 50.3 ยท Fcst: 50.5
in 2hr 10min
14:00
USD
FOMC Minutes
Previous meeting notes
in 6hr
08:30
USD
Jobless Claims
Prev: 218K ยท Fcst: 215K
in 42min
๐ŸŒ™ OVERNIGHT EXPOSURE
Positions held past close 5
5 of 20 positions ยท $12,400 notional
BTC LONG ETH LONG SPX SHORT GOLD LONG
๐Ÿ““ TRADE JOURNAL โ€” TODAY'S NOTES 3 entries
๐Ÿ”ฅ BTC Long opened
"Broke above $95K resistance with volume confirmation. Funding rate still positive โ€” holding."
#breakout #crypto
๐Ÿ† CL=F Short stopped
"Stopped out at $1,900.76. Was right direction but too early. Need to wait for OPEC confirmation."
#stopped #lesson
๐ŸŽฏ SPX scalp target hit
"5-min SPX scalp at 5,890 โ†’ 5,920. +$180 in 20 min. Exactly as planned. Great risk/reward."
#win #scalp
OPEN INTEREST (BTC)
$48.2B
+2.4% (24h)
OPEN INTEREST (ETH)
$22.7B
-1.1% (24h)
ACCOUNT EQUITY
$24,000
vs. start $10,000
NET EXPOSURE
$78,000
3.25ร— on $24K equity
๐Ÿ“ฐ MARKET NEWS 8 items
Loading newsโ€ฆ
/* โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ RENDER โ€” DASHBOARD โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ function renderDashboard(){ const tasks = state.tasks; const tTotal = tasks.length; const tActive = tasks.filter(t=>['in_progress','assigned','prioritized'].includes(t.status)).length; const tReview = tasks.filter(t=>t.status==='in_review').length; const tDone = tasks.filter(t=>t.status==='done').length; document.getElementById('kpi-total').textContent = tTotal; document.getElementById('kpi-active').textContent = tActive; document.getElementById('kpi-review').textContent = tReview; document.getElementById('kpi-done').textContent = tDone; document.getElementById('task-count').textContent = tTotal; renderKanban(); renderRetellStrip(); renderActivityFeed(); renderSystemHealth(); } function renderRetellStrip(){ const el = document.getElementById('retell-strip'); if(!state.retell.length){ el.innerHTML=''; return; } const clients = state.retell.slice(0,6); let html='
'; clients.forEach(c=>{ const total = parseFloat(c.prepaid)||1000; const rem = parseFloat(c.remaining_balance)||0; const pct = Math.min(100,Math.round((rem/total)*100)); const color = pct>50?'var(--success)':pct>20?'var(--warning)':'var(--danger)'; html+=`
${esc(c.client)}
$${rem.toFixed(0)} remaining
${pct}%
`; }); html+='
'; el.innerHTML = html; // sidebar risk badge const risk = clients.filter(c=>c.status==='warning'||c.status==='paused').length; const sbRisk = document.getElementById('sb-retell-risk'); if(sbRisk) sbRisk.style.display = risk>0?'inline':'none'; } function renderKanban(){ const el = document.getElementById('kanban-board'); const colDefs = [ {key:'recurring', label:'๐Ÿ” Recurring', color:'var(--accent)'}, {key:'backlog', label:'๐Ÿ“ฅ Backlog', color:'var(--text-3)'}, {key:'in_progress', label:'๐Ÿ”„ In Progress', color:'var(--warning)'}, {key:'done', label:'โœ… Done', color:'var(--success)'}, ]; let html=''; colDefs.forEach(col=>{ const cards = state.tasks.filter(t=>t.status===col.key); html+=`
${col.label}
${cards.length}
`; if(!cards.length){ html+=`
โ—‹
No tasks
`; } else { cards.forEach(t=>{ html+=`
${esc(t.title)}
${esc(t.owner||'unassigned')} ${t.priority&&t.priority!=='medium'?''+esc(t.priority)+'':''} ${t.external?'EXT':''}
${t.status==='in_review'?``:''} ${t.status!=='done'&&t.status!=='approved'?``:''}
`; }); } html+='
'; }); el.innerHTML=html; } function renderActivityFeed(){ const el = document.getElementById('activity-feed'); const evts = (state.events||[]).slice(-20).reverse(); if(!evts.length){ el.innerHTML='
โšก
No activity yet
'; return; } let html=''; const colors={'info':'var(--accent)','warning':'var(--warning)','error':'var(--danger)','success':'var(--success)'}; evts.forEach(e=>{ const color = colors[e.severity]||'var(--text-3)'; html+=`
${esc(e.message)}
${daysAgo(e.created_at)} ยท ${e.actor}
`; }); el.innerHTML=html; } function renderSystemHealth(){ const el = document.getElementById('system-health'); const pendingApprovals = state.approvals.filter(a=>a.status==='pending').length; const activeCrons = state.crons.filter(c=>c.status==='active').length; const activeAgents = state.agents.filter(a=>a.status==='active').length; const retellRisk = state.retell.filter(c=>c.status==='warning'||c.status==='paused').length; const items = [ {label:'Pending Approvals', value:pendingApprovals, color: pendingApprovals>0?'var(--warning)':'var(--success)', icon:'๐Ÿ”'}, {label:'Active Crons', value:activeCrons, color:'var(--accent)', icon:'โฐ'}, {label:'Active Agents', value:activeAgents, color:'var(--success)', icon:'๐Ÿค–'}, {label:'Retell Risk', value:retellRisk, color: retellRisk>0?'var(--danger)':'var(--success)', icon:'๐Ÿ“ž'}, ]; let html=''; items.forEach(i=>{ html+=`
${i.icon} ${i.label} ${i.value}
`; }); el.innerHTML=html; } /* โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ RENDER โ€” AGENTS โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ function renderAgentsPage(){ document.getElementById('agent-count').textContent = state.agents.length; renderAgentGrid(); } function renderAgentGrid(){ const el = document.getElementById('agent-grid'); const search = (document.getElementById('agent-search')?.value||'').toLowerCase(); const agents = state.agents.filter(a=>!search||a.name?.toLowerCase().includes(search)||a.role?.toLowerCase().includes(search)); if(!agents.length){ el.innerHTML='
๐Ÿค–
No agents found
'; return; } const roleColors={'COO':'agent-role-coo','Trading':'agent-role-trading','Content':'agent-role-content','Research':'agent-role-research','Sales':'agent-role-sales','Security':'agent-role-security','Voice':'agent-role-voice','QA':'agent-role-qa'}; let html=''; agents.forEach(a=>{ const rClass = Object.entries(roleColors).find(([k])=>a.role?.includes(k))?.[1]||'agent-role-coo'; const statusColor = a.status==='active'?'var(--success)':a.status==='idle'?'var(--text-3)':'var(--warning)'; const statusLabel = a.status==='active'?'Active':a.status==='idle'?'Idle':'Busy'; const lastActive = daysAgo(a.last_active||a.updated_at); const modelStack = esc(a.model||a.stack||'claude-opus-4-6'); const avatarBg = `hsl(${a.name?.charCodeAt(0)*17%360},60%,25%)`; html+=`
${a.emoji||'๐Ÿค–'}
${esc(a.name)}
${esc(a.role||'Agent')}
${statusLabel} ${a.active_tasks>0?`${a.active_tasks} task${a.active_tasks>1?'s':''}`:''}
Current Task ${esc(a.current_task||'โ€”')}
Model Stack ${modelStack}
Last Active ${lastActive||'โ€”'}
`; }); el.innerHTML=html; } function filterAgents(){ renderAgentGrid(); } /* โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ RENDER โ€” AGENT WORKSPACE โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ function openAgentWorkspace(id){ const a = state.agents.find(ag=>ag.id===id||ag.name===id); if(!a){ toast('Agent not found','error'); return; } state.currentAgent = a; switchPage('workspace'); } function renderWorkspace(){ const a = state.currentAgent; if(!a){ switchPage('agents'); return; } const el = document.getElementById('workspace-content'); const avatarBg = `hsl(${a.name?.charCodeAt(0)*17%360},60%,25%)`; const capabilities = [ {label:'Video Hook', icon:'๐ŸŽฌ'}, {label:'Tweet', icon:'๐Ÿฆ'}, {label:'Newsletter', icon:'๐Ÿ“ง'}, {label:'LinkedIn Post', icon:'๐Ÿ’ผ'}, {label:'Research Brief', icon:'๐Ÿ”'}, {label:'Trade Signal', icon:'๐Ÿ“ˆ'}, {label:'Email Draft', icon:'๐Ÿ“ฌ'}, {label:'Content Calendar', icon:'๐Ÿ“…'}, ]; const recentOutputs = state.events.filter(e=>e.actor?.toLowerCase()===a.name?.toLowerCase()).slice(-5).reverse(); let html=`
${a.emoji||'๐Ÿค–'}
${esc(a.name)}
${esc(a.role||'Agent')} ยท ${esc(a.domain||'')}
${a.status} ${a.active_tasks>0?`${a.active_tasks} active tasks`:''}

๐Ÿ”ง Capabilities

${capabilities.map(c=>``).join('')}

๐Ÿ“ก Model / Voice

Primary Model${esc(a.model||'claude-opus-4-6')}
Voice Engine${esc(a.voice||'elevenlabs')}
Temperature0.7
Max Tokens4096

๐Ÿ“ค Recent Outputs

`; if(!recentOutputs.length){ html+=`
๐Ÿ“ค
No recent outputs
`; } else { recentOutputs.forEach(e=>{ html+=`
${esc(e.message)}
${daysAgo(e.created_at)}
`; }); } html+=`
`; el.innerHTML=html; } async function executeAgentTask(){ toast('Executing agent taskโ€ฆ','success'); } /* โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ RENDER โ€” CALENDAR โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ function renderCalendarPage(){ renderAlwaysRunning(); renderWeekBoard(); renderCalendarList(); } function renderAlwaysRunning(){ const el = document.getElementById('always-running'); const crons = [ {name:'Retell Burn Monitor', sub:'Track client spend & auto-pause', status:'active', color:'var(--danger)'}, {name:'Compliance Scanner', sub:'Audit logs, policy checks', status:'active', color:'var(--warning)'}, {name:'Transfer Quality Scanner', sub:'Score calls, flag anomalies', status:'active', color:'var(--accent)'}, {name:'Cost Guardrail', sub:'Budget alerts, usage limits', status:'active', color:'var(--success)'}, ]; let html=''; crons.forEach(c=>{ const dotColor = c.status==='active'?'var(--success)':c.status==='warning'?'var(--warning)':'var(--text-3)'; html+=`
${esc(c.name)}
${esc(c.sub)}
${c.status}
`; }); el.innerHTML=html; } function renderWeekBoard(){ const el = document.getElementById('week-board'); const days = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat']; const schedule = { Sun:[ {label:'X Post Publisher',color:''}, {label:'Email Scan',color:'green'}, ], Mon:[ {label:'Heartbeat Check',color:''}, {label:'Trader Signal',color:'amber'}, {label:'Security Scan',color:'purple'}, ], Tue:[ {label:'Heartbeat Check',color:''}, {label:'Email Scan',color:'green'}, ], Wed:[ {label:'Heartbeat Check',color:''}, {label:'LinkedIn Draft',color:'pink'}, {label:'Trader Signal',color:'amber'}, ], Thu:[ {label:'Heartbeat Check',color:''}, {label:'Email Scan',color:'green'}, ], Fri:[ {label:'Heartbeat Check',color:''}, {label:'Trader Signal',color:'amber'}, {label:'Security Scan',color:'purple'}, ], Sat:[ {label:'Heartbeat Check',color:''}, {label:'X Post Publisher',color:'green'}, ], }; let html=''; days.forEach(d=>{ const blocks = schedule[d]||[]; html+=`
${d}
${blocks.map(b=>`
${esc(b.label)}
`).join('')}
`; }); el.innerHTML=html; } function renderCalendarList(){ const el = document.getElementById('calendar-list'); const items = state.calendar||[]; if(!items.length){ el.innerHTML='
๐Ÿ“…
No calendar items
'; return; } let html='
'; items.forEach(item=>{ html+=`
${new Date(item.due).getDate()||'โ€”'}
${new Date(item.due).toLocaleString('default',{month:'short'})||''}
${esc(item.note||item.title||'Event')}
${esc(item.type||'due')} ยท Task #${item.task_id||'โ€”'}
`; }); html+='
'; el.innerHTML=html; } /* โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ RENDER โ€” WAR ROOM โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ function renderWarRoom(){ renderFactoryFloor(); renderOpsCards(); renderTaskTicker(); renderCronList(); } function renderFactoryFloor(){ const el = document.getElementById('factory-grid'); const stations = [ {name:'KobeMamba', emoji:'๐Ÿ', task:'Orchestrating ops', status:'active'}, {name:'Whiz', emoji:'โšก', task:'Analytics pipeline', status:'active'}, {name:'Ralph', emoji:'๐Ÿ“ž', task:'Voice AI checks', status:'idle'}, {name:'Jordan', emoji:'โœ๏ธ', task:'Content drafts', status:'active'}, {name:'Trader', emoji:'๐Ÿ“ˆ', task:'Signal monitoring', status:'active'}, {name:'Scout', emoji:'๐Ÿ”', task:'Market research', status:'idle'}, {name:'Alex', emoji:'๐Ÿ’ผ', task:'Lead follow-up', status:'idle'}, {name:'Sentinel', emoji:'๐Ÿ›ก๏ธ', task:'Security scan', status:'active'}, {name:'Savannah', emoji:'๐ŸŒŠ', task:'Social media', status:'idle'}, {name:'Jenny', emoji:'๐ŸŽฏ', task:'Client outreach', status:'idle'}, ]; let html=''; stations.forEach(s=>{ const dotClass = s.status==='active'?'active':s.status==='warning'?'warning':'idle'; html+=`
${s.emoji}
${esc(s.name)}
${esc(s.task)}
${s.status}
`; }); el.innerHTML=html; } function openAgentFromStation(name){ const a = state.agents.find(ag=>ag.name?.toLowerCase()===name.toLowerCase())||{id:name,name,role:name+' Agent'}; state.currentAgent = a; switchPage('workspace'); } function renderOpsCards(){ const el = document.getElementById('ops-cards'); const ops = [ {icon:'๐Ÿ“‹', value:state.tasks.filter(t=>t.status!=='done').length, label:'Open Tasks'}, {icon:'๐Ÿ”', value:state.approvals.filter(a=>a.status==='pending').length, label:'Pending Approval'}, {icon:'โฐ', value:state.crons.filter(c=>c.status==='active').length, label:'Active Crons'}, {icon:'๐Ÿค–', value:state.agents.filter(a=>a.status==='active').length, label:'Online Agents'}, {icon:'๐Ÿ“ž', value:state.retell.length, label:'Retell Clients'}, {icon:'๐Ÿ“ˆ', value:state.trader.length, label:'Traders'}, ]; let html=''; ops.forEach(o=>{ html+=`
${o.icon}
${o.value}
${o.label}
`; }); el.innerHTML=html; } function renderTaskTicker(){ const el = document.getElementById('task-ticker'); const evts = (state.events||[]).slice(-12).reverse(); if(!evts.length){ el.innerHTML='
No events
'; return; } let html=''; evts.forEach(e=>{ html+=`
${now()} ${esc(e.message||'').substring(0,60)}
`; }); el.innerHTML=html; } function renderCronList(){ const el = document.getElementById('cron-list'); const crons = state.crons||[]; document.getElementById('cron-count').textContent = crons.filter(c=>c.status==='active').length; if(!crons.length){ el.innerHTML='
โฐ
No crons
'; return; } let html=''; crons.slice(0,8).forEach(c=>{ html+=`
${esc(c.name)}
${esc(c.schedule)} ยท Next: ${c.next_run?daysAgo(c.next_run):'โ€”'}
${c.status}
`; }); el.innerHTML=html; } /* โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ RENDER โ€” TRADER โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ const TRADER_AVATARS = { 'BillyB': '๐Ÿป', 'Blazing Blake': '๐Ÿ”ฅ', 'Milly$': '๐Ÿ’ฐ', 'Jazzy J': '๐ŸŽท', 'Cautious Carl': '๐Ÿ›ก๏ธ', 'Analytical Ava': '๐Ÿ“Š', 'Carter': '๐Ÿ’ผ', 'Prosperity P': '๐Ÿ€', 'Kobe': '๐Ÿ€', 'Dangerous Davis': '๐Ÿ’ฅ', 'Dreamgetterz': 'โœจ', 'Wolfy': '๐Ÿบ', }; // Hardcoded sample data โ€” replace with API data when available const MARKET_STANDINGS = { stocks: [ {rank:1, name:'Cautious Carl', avatar:'๐Ÿ›ก๏ธ', pnl:-8.23}, {rank:2, name:'Kobe', avatar:'๐Ÿ€', pnl:-115.84}, {rank:3, name:'Wolfy', avatar:'๐Ÿบ', pnl:-218.76}, ], crypto: [ {rank:1, name:'Blazing Blake', avatar:'๐Ÿ”ฅ', pnl:862.90}, {rank:2, name:'Jazzy J', avatar:'๐ŸŽท', pnl:0.26}, {rank:3, name:'Prosperity P', avatar:'๐Ÿ€', pnl:-45.86}, ], prediction: [ {rank:1, name:'Milly$', avatar:'๐Ÿ“ฐ', pnl:12.13}, {rank:2, name:'Dreamgetterz', avatar:'โœจ', pnl:-284.72}, {rank:3, name:'Dangerous Davis', avatar:'๐Ÿ’ฅ', pnl:456.54}, ], metals: [ {rank:1, name:'BillyB', avatar:'๐Ÿ†', pnl:1510}, {rank:2, name:'Carter', avatar:'๐Ÿ’ผ', pnl:-19.80}, ], oil: [ {rank:1, name:'BillyB', avatar:'๐Ÿ†', pnl:1847.20}, {rank:2, name:'Carter', avatar:'๐Ÿ’ผ', pnl:-156.40}, {rank:3, name:'Wolfy', avatar:'๐Ÿบ', pnl:-892.10}, ], gold: [ {rank:1, name:'BillyB', avatar:'๐Ÿ†', pnl:2341.50}, {rank:2, name:'Carter', avatar:'๐Ÿ’ผ', pnl:445.80}, {rank:3, name:'Kobe', avatar:'๐Ÿ€', pnl:-78.30}, ], forex: [ {rank:1, name:'Jazzy J', avatar:'๐ŸŽท', pnl:234.50}, {rank:2, name:'Analytical Ava', avatar:'๐Ÿ“Š', pnl:112.20}, {rank:3, name:'Carter', avatar:'๐Ÿ’ผ', pnl:-89.40}, ], }; const OPEN_POSITIONS = [ {trader:'Blazing Blake', avatar:'๐Ÿ”ฅ', symbol:'BTC-USD', side:'LONG', lev:'5x', entry:'$68,787.77', size:'$1,288', sl:'$65,348.38', tp:'$79,105.93'}, {trader:'Jazzy J', avatar:'๐ŸŽท', symbol:'XRP-USD', side:'LONG', lev:'2x', entry:'$1.36', size:'$440', sl:'$1.292', tp:'$1.5232'}, {trader:'Wolfy', avatar:'๐Ÿบ', symbol:'AMZN', side:'SHORT', lev:'3x', entry:'$207.53', size:'$623', sl:'$215.83', tp:'$186.78'}, {trader:'Prosperity P', avatar:'๐Ÿ€', symbol:'XRP-USD', side:'LONG', lev:'1x', entry:'$1.36', size:'$235', sl:'$1.3056', tp:'$1.4688'}, {trader:'Milly$', avatar:'๐Ÿ“ฐ', symbol:'RECESSION_2026',side:'YES',lev:'1x', entry:'$0.358', size:'$402', sl:'$0.3222', tp:'$0.4475'}, {trader:'Dreamgetterz', avatar:'โœจ', symbol:'BTC_100K_2026', side:'YES', lev:'1x', entry:'$0.5508', size:'$600', sl:'$0.4682', tp:'$0.7711'}, {trader:'Dangerous Davis',avatar:'๐Ÿ’ฅ',symbol:'SPACEX_IPO_2026',side:'YES',lev:'1x',entry:'$0.407', size:'$386', sl:'$0.3663', tp:'$0.4884'}, {trader:'BillyB', avatar:'๐Ÿ†', symbol:'PL=F', side:'SHORT', lev:'5x', entry:'$1,845.40', size:'$1,402', sl:'$1,900.76', tp:'$1,697.77'}, {trader:'Blazing Blake', avatar:'๐Ÿ”ฅ', symbol:'DOGE-USD', side:'SHORT', lev:'5x', entry:'$0.091', size:'$1,273', sl:'$0.0956', tp:'$0.0774'}, {trader:'Wolfy', avatar:'๐Ÿบ', symbol:'META', side:'LONG', lev:'3x', entry:'$546.60', size:'$623', sl:'$524.73', tp:'$601.25'}, {trader:'Milly$', avatar:'๐Ÿ“ฐ', symbol:'NVIDIA_1T_CAP', side:'NO', lev:'1x', entry:'$0.7036', size:'$402', sl:'$0.774', tp:'$0.5277'}, {trader:'Kobe', avatar:'๐Ÿ€', symbol:'AMD', side:'LONG', lev:'2x', entry:'$205.34', size:'$377', sl:'$200.20', tp:'$217.66'}, {trader:'Dreamgetterz', avatar:'โœจ', symbol:'APPLE_CAR_LAUNCH',side:'YES',lev:'1x',entry:'$0.235', size:'$600', sl:'$0.1998', tp:'$0.329'}, {trader:'Carter', avatar:'๐Ÿ’ผ', symbol:'PL=F', side:'LONG', lev:'1x', entry:'$1,831.00', size:'$198', sl:'$1,794.38', tp:'$1,904.24'}, {trader:'BillyB', avatar:'๐Ÿ†', symbol:'GC=F', side:'SHORT', lev:'5x', entry:'$4,392.90', size:'$1,402', sl:'$4,524.69', tp:'$4,041.47'}, {trader:'Dreamgetterz', avatar:'โœจ', symbol:'SPACEX_IPO_2026', side:'YES', lev:'1x',entry:'$0.3911', size:'$609', sl:'$0.3324', tp:'$0.5475'}, ]; function renderMarketStandings(){ const pnlFmt = v => (v>=0?'+$':'-$')+Math.abs(v).toLocaleString('en-US',{minimumFractionDigits:2,minimumIntegerDigits:1}); const pnlColor = v => v>=0?'var(--success)':'var(--danger)'; const statusBadge = `Normal`; const renderMarketList = (traders) => traders.map(t=>`
#${t.rank} ${t.avatar} ${esc(t.name)} ${pnlFmt(t.pnl)} ${statusBadge}
`).join(''); const mStocks = document.getElementById('market-stocks'); const mCrypto = document.getElementById('market-crypto'); const mPred = document.getElementById('market-prediction'); const mMetals = document.getElementById('market-metals'); const mOil = document.getElementById('market-oil'); const mGold = document.getElementById('market-gold'); const mForex = document.getElementById('market-forex'); if(mStocks) mStocks.innerHTML = renderMarketList(MARKET_STANDINGS.stocks); if(mCrypto) mCrypto.innerHTML = renderMarketList(MARKET_STANDINGS.crypto); if(mPred) mPred.innerHTML = renderMarketList(MARKET_STANDINGS.prediction); if(mMetals) mMetals.innerHTML = renderMarketList(MARKET_STANDINGS.metals); if(mOil) mOil.innerHTML = renderMarketList(MARKET_STANDINGS.oil); if(mGold) mGold.innerHTML = renderMarketList(MARKET_STANDINGS.gold); if(mForex) mForex.innerHTML = renderMarketList(MARKET_STANDINGS.forex); } function renderOpenPositions(){ const el = document.getElementById('open-pos-body'); if(!el) return; document.getElementById('open-pos-count').textContent = OPEN_POSITIONS.length; const sideColor = s => s==='LONG'||s==='YES' ? 'var(--success)' : 'var(--danger)'; const sideBg = s => s==='LONG'||s==='YES' ? 'rgba(34,197,94,.1)' : 'rgba(239,68,68,.1)'; let html=''; OPEN_POSITIONS.forEach(p=>{ html+=`
${p.avatar} ${esc(p.trader)}
${esc(p.symbol)} ${esc(p.side)} ${esc(p.lev)} ${esc(p.entry)} ${esc(p.size)} ${esc(p.sl)} ${esc(p.tp)} `; }); el.innerHTML=html; } // โ”€โ”€ Recent Trade Activity โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ const TRADE_ACTIVITY = [ {time:'04:00 PM', trader:'Blazing Blake', avatar:'๐Ÿ”ฅ', action:'OPEN', symbol:'BTC-USD', detail:'LONG BTC-USD @ $68787.77 | Size $1288.31 | 5x', pnl:null, result:null}, {time:'03:59 PM', trader:'Jazzy J', avatar:'๐ŸŽท', action:'CLOSE', symbol:'ETH-USD', detail:'SHORT ETH-USD closed @ $2063.4 | WIN', pnl:34.55, result:'WIN'}, {time:'03:58 PM', trader:'Wolfy', avatar:'๐Ÿบ', action:'OPEN', symbol:'AMZN', detail:'SHORT AMZN @ $207.53 | Size $623 | 3x', pnl:null, result:null}, {time:'03:57 PM', trader:'Prosperity P', avatar:'๐Ÿ’ฐ', action:'OPEN', symbol:'XRP-USD', detail:'LONG XRP-USD @ $1.36 | Size $235 | 1x', pnl:null, result:null}, {time:'03:55 PM', trader:'Milly$', avatar:'๐Ÿ“ฐ', action:'CLOSE', symbol:'XRP-USD', detail:'LONG XRP-USD closed @ $1.42 | WIN', pnl:11.91, result:'WIN'}, {time:'03:54 PM', trader:'Dreamgetterz', avatar:'๐ŸŒ™', action:'OPEN', symbol:'BTC_100K_2026', detail:'YES BTC_100K_2026 @ $0.5508 | Size $600 | 1x',pnl:null, result:null}, {time:'03:52 PM', trader:'Dangerous Davis', avatar:'๐Ÿ’ฅ', action:'CLOSE', symbol:'SPACEX_IPO_2026', detail:'YES closed @ $0.41 | LOSS', pnl:-7.62, result:'LOSS'}, {time:'03:50 PM', trader:'BillyB', avatar:'๐Ÿป', action:'OPEN', symbol:'PL=F', detail:'SHORT PL=F @ $1845.40 | Size $1402 | 5x', pnl:null, result:null}, {time:'03:48 PM', trader:'Blazing Blake', avatar:'๐Ÿ”ฅ', action:'OPEN', symbol:'DOGE-USD', detail:'SHORT DOGE-USD @ $0.091 | Size $1273 | 5x', pnl:null, result:null}, {time:'03:47 PM', trader:'Wolfy', avatar:'๐Ÿบ', action:'CLOSE', symbol:'META', detail:'LONG META closed @ $546.59 | WIN', pnl:22.10, result:'WIN'}, {time:'03:45 PM', trader:'Milly$', avatar:'๐Ÿ“ฐ', action:'OPEN', symbol:'RECESSION_2026', detail:'YES RECESSION_2026 @ $0.358 | Size $402 | 1x',pnl:null,result:null}, {time:'03:43 PM', trader:'Kobe', avatar:'๐Ÿ€', action:'OPEN', symbol:'AMD', detail:'LONG AMD @ $205.34 | Size $377 | 2x', pnl:null, result:null}, {time:'03:41 PM', trader:'Dreamgetterz', avatar:'๐ŸŒ™', action:'OPEN', symbol:'APPLE_CAR_LAUNCH',detail:'YES APPLE_CAR_LAUNCH @ $0.235 | Size $600 | 1x',pnl:null,result:null}, {time:'03:40 PM', trader:'Carter', avatar:'๐Ÿ–‹๏ธ', action:'CLOSE', symbol:'PL=F', detail:'LONG PL=F closed @ $1831 | LOSS', pnl:-41.57,result:'LOSS'}, {time:'03:38 PM', trader:'BillyB', avatar:'๐Ÿป', action:'OPEN', symbol:'GC=F', detail:'SHORT GC=F @ $4392.90 | Size $1402 | 5x', pnl:null, result:null}, {time:'03:36 PM', trader:'Prosperity P', avatar:'๐Ÿ’ฐ', action:'CLOSE', symbol:'XRP-USD', detail:'LONG XRP-USD closed @ $1.31 | LOSS', pnl:-10.87,result:'LOSS'}, {time:'03:35 PM', trader:'Dreamgetterz', avatar:'๐ŸŒ™', action:'OPEN', symbol:'SPACEX_IPO_2026', detail:'YES SPACEX_IPO_2026 @ $0.3911 | Size $609 | 1x',pnl:null,result:null}, {time:'03:33 PM', trader:'Jazzy J', avatar:'๐ŸŽท', action:'OPEN', symbol:'XRP-USD', detail:'LONG XRP-USD @ $1.36 | Size $440 | 2x', pnl:null, result:null}, ]; function renderTradeActivity(){ const el = document.getElementById('trade-activity-body'); if(!el) return; let html=''; TRADE_ACTIVITY.forEach(t=>{ const actionBg = t.action==='OPEN' ? '#14b8a6' : '#1e1e2e'; const actionColor = t.action==='OPEN' ? '#fff' : '#14b8a6'; let pnlHtml = ''; if(t.pnl===null){ pnlHtml = `โ€”`; } else if(t.result==='WIN'){ pnlHtml = `+$${t.pnl.toFixed(2)}`; } else { pnlHtml = `-$${Math.abs(t.pnl).toFixed(2)}`; } html+=` ${esc(t.time)}
${t.avatar} ${esc(t.trader)}
${esc(t.action)} ${esc(t.symbol)} ${esc(t.detail)} ${pnlHtml} `; }); el.innerHTML=html; } function renderTrader(){ const el = document.getElementById('trader-body'); const count = state.trader.length; document.getElementById('trader-count').textContent = count; // KPI from API if(state.trader.length){ const todayPnl = state.trader.reduce((s,t)=>s+(parseFloat(t.today_pnl)||0),0); const weekPnl = state.trader.reduce((s,t)=>s+(parseFloat(t.week_pnl)||0),0); const mtdPnl = state.trader.reduce((s,t)=>s+(parseFloat(t.mtd_pnl)||0),0); const closed = state.trader.reduce((s,t)=>s+(parseInt(t.closed_today)||0),0); const openPos = state.trader.reduce((s,t)=>s+(parseInt(t.open_positions)||0),0); const kEl=id=>document.getElementById(id); const setKpi=(id,val,color)=>{const e=kEl(id);if(e){e.textContent=val;e.style.color=color||'';}}; const fmtPnl=v=>(v>=0?'+$':'-$')+Math.abs(v).toLocaleString('en-US',{minimumFractionDigits:2}); const fmtK=v=>v>=1000?(v>=0?'+$':'-$')+(Math.abs(v)/1000).toFixed(2)+'K':fmtPnl(v); setKpi('kpi-today-pnl',fmtPnl(todayPnl),todayPnl>=0?'var(--success)':'var(--danger)'); setKpi('kpi-week-pnl', fmtPnl(weekPnl), weekPnl>=0?'var(--success)':'var(--danger)'); setKpi('kpi-mtd-pnl', fmtK(mtdPnl), mtdPnl>=0?'var(--success)':'var(--danger)'); setKpi('kpi-closed', closed, 'var(--accent)'); setKpi('kpi-open-pos', openPos, 'var(--purple)'); } // Clock const clockEl=document.getElementById('trader-clock'); if(clockEl) clockEl.textContent=new Date().toLocaleTimeString('en-US',{hour12:false,hour:'2-digit',minute:'2-digit',second:'2-digit'}); // Market standings renderMarketStandings(); // Open positions renderOpenPositions(); // Recent trade activity renderTradeActivity(); // Scoreboard if(!state.trader.length){ el.innerHTML='Loading trader dataโ€ฆ'; return; } const sorted=[...state.trader].sort((a,b)=>(b.mtd_pnl||0)-(a.mtd_pnl||0)); let html=''; sorted.forEach((t,i)=>{ const rank=i+1, avatar=TRADER_AVATARS[t.name]||'๐Ÿ“ˆ'; const strategy=t.strategy||'Moderate'; const sColor=strategy==='Aggressive'?'var(--danger)':strategy==='Conservative'?'var(--warning)':'var(--text-2)'; const tPnl=parseFloat(t.today_pnl)||0, wPnl=parseFloat(t.week_pnl)||0, mPnl=parseFloat(t.mtd_pnl)||0; const bal=parseFloat(t.balance)||2000, trades=parseInt(t.trades)||0, winRate=parseFloat(t.win_rate)||50; const tPct=t.today_pct||0, wPct=t.week_pct||0, mPct=t.mtd_pct||0; const pC=v=>v>=0?'var(--success)':'var(--danger)', pS=v=>v>=0?'+$':'-$'; const wC=winRate>=60?'var(--success)':winRate>=40?'var(--warning)':'var(--danger)'; const status=t.status||'Normal'; const stC=status==='Normal'?'var(--success)':status==='Warning'?'var(--warning)':'var(--danger)'; html+=` ${rank}
${avatar}
${esc(t.name)}
${strategy}
${esc(t.market||'โ€”')} ${pS(tPnl)}${Math.abs(tPnl).toFixed(2)}${tPct>=0?'+':''}${tPct.toFixed(2)}% ${pS(wPnl)}${Math.abs(wPnl).toFixed(2)}${wPct>=0?'+':''}${wPct.toFixed(2)}%โ“˜ ${pS(mPnl)}${Math.abs(mPnl).toFixed(2)}${mPct>=0?'+':''}${mPct.toFixed(2)}% $${bal.toLocaleString('en-US',{minimumFractionDigits:2})} ${trades} ${winRate.toFixed(1)}% $${(parseFloat(t.avg_win)||120).toFixed(0)} ${(parseFloat(t.expectancy)||0)>=0?'+':''}$${(parseFloat(t.expectancy)||84).toFixed(0)} ${esc(status)} `; }); el.innerHTML=html; } function refreshTrader(){ api('/api/trader-summary').then(d=>{ state.trader=d?.traders||[]; renderTrader(); toast('Trader data refreshed','success'); }); } /* โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ RENDER โ€” RETELL โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ function renderRetell(){ const el = document.getElementById('retell-list'); const clients = state.retell||[]; if(!clients.length){ el.innerHTML='
๐Ÿ“ž
No Retell clients yet
'; return; } let html=''; clients.forEach(c=>{ const total = parseFloat(c.prepaid)||1000; const rem = parseFloat(c.remaining_balance)||0; const pct = Math.min(100,Math.round((rem/total)*100)); const barColor = pct>50?'var(--success)':pct>20?'var(--warning)':'var(--danger)'; html+=`

๐Ÿ“ž ${esc(c.client)}

${esc(c.status)}
Prepaid
$${parseFloat(c.prepaid||0).toLocaleString()}
Remaining
$${rem.toLocaleString()}
Transfers
${c.delivered_transfers||0}
Appts
${c.delivered_appointments||0}
${pct}% remaining
`; }); el.innerHTML=html; } /* โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ RENDER โ€” DOCS / MEMORY โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ function renderDocs(){ // Tags const tagSet = new Set(); state.docs.forEach(d=>d.tags?.forEach(t=>tagSet.add(t))); const tags = [...tagSet].slice(0,12); let tagHtml='
'; tagHtml+='All'; tags.forEach(t=>tagHtml+=`${esc(t)}`); tagHtml+='
'; document.getElementById('doc-tags').outerHTML = tagHtml; renderDocList(); renderMemoryList(); } let activeDocTag = null; function filterDocsByTag(el, tag){ document.querySelectorAll('.tag-chip').forEach(c=>c.classList.remove('active')); el?.classList.add('active'); activeDocTag = tag; renderDocList(); } function filterDocs(){ renderDocList(); } function renderDocList(){ const el = document.getElementById('doc-list'); const search = (document.getElementById('doc-search')?.value||'').toLowerCase(); let docs = state.docs||[]; if(search) docs = docs.filter(d=>d.title?.toLowerCase().includes(search)||d.filename?.toLowerCase().includes(search)||d.content?.toLowerCase().includes(search)); if(activeDocTag) docs = docs.filter(d=>d.tags?.includes(activeDocTag)); if(!docs.length){ el.innerHTML='
๐Ÿ“„
No docs found
'; return; } let html=''; docs.forEach(d=>{ const sel = activeDocId===d.id?'selected':''; html+=`
${esc(d.title||d.filename)}
${d.tags?.map(t=>`${esc(t)}`).join('')||''} ยท ${d.lifecycle||''}
`; }); el.innerHTML=html; } function previewDoc(id){ activeDocId = id; const d = state.docs.find(doc=>doc.id===id); if(!d) return; renderDocList(); const el = document.getElementById('doc-preview'); el.innerHTML=`

${esc(d.title||d.filename)}

${d.tags?.map(t=>`${esc(t)}`).join('')||''}
${esc(d.content||'No content').substring(0,2000)}
`; } function renderMemoryList(){ const el = document.getElementById('memory-list'); const entries = state.memory||[]; if(!entries.length){ el.innerHTML='
๐Ÿง 
No memory entries
'; return; } let html=''; entries.slice(-8).reverse().forEach(e=>{ html+=`
${esc(e.title)}
${esc(e.type)} ยท ${daysAgo(e.created_at)}
`; }); el.innerHTML=html; } /* โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ RENDER โ€” TEAM โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ function renderTeam(){ const el = document.getElementById('team-grid'); const members = state.team?.length ? state.team : [ {emoji:'๐Ÿ',name:'KobeMamba',role:'COO โ€” Orchestrator',mission:'Dispatch, coordinate, and execute with zero dropped balls.',domain:'Dispatch, memory, system health, agent coordination',skills:['orchestration','memory','system-ops'],group:'Operations'}, {emoji:'โšก',name:'Whiz',role:'Ops Analyst',mission:'Keep pipelines flowing, data clean, decisions informed.',domain:'Analytics, pipeline maintenance, reporting',skills:['analytics','pipelines','reporting'],group:'Operations'}, {emoji:'๐Ÿ“ž',name:'Ralph',role:'QA Auditor',mission:'Every output passes quality bar before it ships.',domain:'Quality audits, compliance checks, output review',skills:['qa','compliance','auditing'],group:'QA'}, {emoji:'โœ๏ธ',name:'Jordan',role:'Content Agent',mission:'Turn ideas into scroll-stopping content that converts.',domain:'X posts, LinkedIn, newsletters, video hooks',skills:['writing','social-media','content-strategy'],group:'Content'}, {emoji:'๐Ÿ“ˆ',name:'Trader',role:'Trading Agent',mission:'Capture alpha, manage risk, protect the bottom line.',domain:'Signal detection, trade execution, P&L',skills:['trading','analytics','risk'],group:'Trading'}, {emoji:'๐Ÿ”',name:'Scout',role:'Research Agent',mission:'Hunt signals, surface insights, feed the brain trust.',domain:'Market research, competitor analysis, trend hunting',skills:['research','web-scraping','analysis'],group:'Research'}, {emoji:'๐Ÿ’ผ',name:'Alex',role:'Sales Agent',mission:'Open doors, close deals, grow the revenue line.',domain:'Lead follow-up, proposals, client onboarding',skills:['sales','crm','client-management'],group:'Sales'}, {emoji:'๐Ÿ›ก๏ธ',name:'Sentinel',role:'Security Agent',mission:'Lock it down, keep it safe, sleep soundly.',domain:'Security audits, firewall, uptime monitoring',skills:['security','monitoring','devops'],group:'Security'}, {emoji:'๐ŸŒŠ',name:'Savannah',role:'Social Agent',mission:'Build presence, grow audience, amplify voice.',domain:'Social strategy, community, engagement',skills:['social','community','growth'],group:'Content'}, {emoji:'๐ŸŽฏ',name:'Jenny',role:'Voice Agent',mission:'Every call handled with precision and care.',domain:'Voice AI, call routing, client demos',skills:['voice-ai','telephony','demos'],group:'Voice'}, ]; const groups = {}; members.forEach(m=>{ const g = m.group||'Other'; if(!groups[g]) groups[g]=[]; groups[g].push(m); }); let html=''; Object.entries(groups).forEach(([groupName,members])=>{ html+=`
${esc(groupName)}
`; members.forEach(m=>{ html+=`
${m.emoji}
${esc(m.name)}
${esc(m.role)}
${esc(m.domain||m.skills?.join(' ยท ')||'')}
"${esc(m.mission||'')}"
${(m.skills||[]).map(s=>`${esc(s)}`).join('')}
`; }); }); el.innerHTML=html; } /* โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ RENDER โ€” GOVERNANCE โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ function renderGovernance(){ const el = document.getElementById('gov-grid'); const agents = state.agents?.length ? state.agents : [ {emoji:'๐Ÿ',name:'KobeMamba',role:'COO',outputs:'Task dispatch, memory logs, system events',done:'Task completed, agent notified, event logged',hard_bans:'No external posts without approval, no destructive commands without confirmation',escalation:'Agent offline >10min, cascade failure, security breach',metrics:'Tasks resolved, memory accuracy, system uptime'}, {emoji:'โšก',name:'Whiz',role:'Ops',outputs:'Analytics reports, pipeline health checks, trend summaries',done:'Data validated, report delivered, anomaly flagged',hard_bans:'No data deletion, no production changes without review',escalation:'Pipeline failure, data quality drop >20%, report overdue',metrics:'Report accuracy, pipeline uptime, anomaly detection rate'}, {emoji:'โœ๏ธ',name:'Jordan',role:'Content',outputs:'X drafts, LinkedIn posts, newsletters, video hooks',done:'Draft reviewed, approved or rejected, queued for publish',hard_bans:'No auto-publish without approval, no off-brand content, no political topics',escalation:'Brand violation flagged, engagement drop >30%, negative feedback spike',metrics:'Posts published, engagement rate, approval turnaround time'}, {emoji:'๐Ÿ“ˆ',name:'Trader',role:'Trading',outputs:'Trade signals, P&L reports, risk alerts',done:'Signal validated, trade logged, risk assessed',hard_bans:'No trade >$5K without confirmation, no insider adjacent positions',escalation:'Daily loss >5%, single trade loss >10%, system anomaly',metrics:'Win rate, P&L, max drawdown, risk compliance'}, {emoji:'๐Ÿ”',name:'Scout',role:'Research',outputs:'Research briefs, competitor analysis, trend reports',done:'Brief delivered, insights summarized, sources cited',hard_bans:'No scraping violations, no unauthorized data collection',escalation:'Source unavailable, data stale >48h, competitor move detected',metrics:'Briefs delivered, accuracy rating, time to deliver'}, {emoji:'๐Ÿ›ก๏ธ',name:'Sentinel',role:'Security',outputs:'Security reports, audit logs, alert notifications',done:'Scan completed, report generated, incidents triaged',hard_bans:'No firewall changes without approval, no external data exfil',escalation:'Unauthorized access attempt, breach detection, service outage',metrics:'Scan completion rate, mean time to detect, false positive rate'}, ]; let html=''; agents.forEach(a=>{ const avatarBg = `hsl(${a.name?.charCodeAt(0)*17%360},60%,25%)`; html+=`
${a.emoji||'๐Ÿค–'}
${esc(a.name)}
${esc(a.role)}
๐Ÿ“ค Outputs
  • ${esc(a.outputs||'โ€”')}
โœ… Definition of Done
  • ${esc(a.done||'โ€”')}
๐Ÿšซ Hard Bans
  • ${esc(a.hard_bans||'None defined')}
โš ๏ธ Escalation Triggers
  • ${esc(a.escalation||'โ€”')}
๐Ÿ“Š Metrics
  • ${esc(a.metrics||'โ€”')}
`; }); el.innerHTML=html; } /* โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ TRADE MARKETS DATA โ€” Market Watch โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ const TM_INDICES = [ {symbol:'SPX', name:'S&P 500', price:5891.63,change:0.41, positive:true, id:'SPX', prices:[5500,5580,5620,5490,5560,5640,5720,5780,5820,5850,5870,5891]}, {symbol:'NDX', name:'NASDAQ 100', price:20471.99,change:0.62,positive:true, id:'NDX', prices:[19000,19400,19800,19200,19600,20100,20600,20900,21200,21500,21800,20471]}, {symbol:'DJI', name:'Dow Jones', price:42875.24,change:-0.18,positive:false,id:'DJI', prices:[38900,39200,39600,38800,39300,39800,40300,40700,41100,41500,42000,42875]}, {symbol:'RUT', name:'Russell 2000',price:2248.18,change:-0.33,positive:false,id:'RUT', prices:[2100,2130,2080,1980,2030,2080,2110,2150,2180,2200,2220,2248]}, {symbol:'VIX', name:'VIX Volatility',price:16.42,change:-0.22,positive:false,id:'VIX', prices:[14.2,13.8,15.4,18.2,16.8,15.2,14.6,15.8,17.2,18.6,17.4,16.42]}, {symbol:'Russell',name:'Russell Growth',price:2847.33,change:0.31,positive:true,id:'RUTG', prices:[2650,2680,2620,2540,2600,2680,2740,2780,2810,2830,2850,2847]}, ]; const TM_COMMODITIES = [ {symbol:'GOLD', name:'Gold ($/oz)', price:4392.90,change:0.28,positive:true, id:'GOLD', prices:[2200,2240,2180,2120,2190,2260,2340,2410,2480,2560,2640,2780]}, {symbol:'SILVER',name:'Silver ($/oz)', price:27.84, change:0.74,positive:true, id:'SILVER', prices:[24.2,24.8,23.6,22.8,23.4,24.6,25.2,26.1,26.8,27.2,27.6,27.84]}, {symbol:'OIL', name:'WTI Crude ($/bbl)',price:82.18,change:1.12,positive:true, id:'OIL', prices:[78,80,76,72,74,78,80,79,81,83,82,82.18]}, {symbol:'NG', name:'Nat Gas ($/MMBtu)',price:3.12,change:-0.44,positive:false,id:'NG', prices:[3.8,3.6,3.2,2.8,2.6,2.9,3.1,3.4,3.3,3.2,3.1,3.12]}, ]; const TM_FOREX = [ {symbol:'EUR/USD', name:'Euro / US Dollar', rate:1.0842,change:0.02,positive:true, id:'EURUSD', prices:[1.082,1.078,1.086,1.092,1.088,1.082,1.090,1.086,1.084,1.080,1.088,1.0842]}, {symbol:'GBP/USD', name:'British Pound / USD',rate:1.2718,change:-0.11,positive:false,id:'GBPUSD', prices:[1.268,1.264,1.270,1.278,1.274,1.270,1.276,1.272,1.276,1.270,1.274,1.2718]}, {symbol:'USD/JPY', name:'USD / Japanese Yen',rate:149.42,change:0.08,positive:true,id:'USDJPY', prices:[148.2,147.8,149.4,150.2,149.8,148.6,149.2,148.8,149.4,150.1,149.6,149.42]}, {symbol:'USD/CHF', name:'USD / Swiss Franc',rate:0.9012,change:0.03,positive:true,id:'USDCHF', prices:[0.898,0.896,0.900,0.904,0.902,0.899,0.901,0.898,0.900,0.904,0.902,0.9012]}, ]; const TM_PREDICTIONS = [ {question:'Bitcoin above $100,000 by end of 2026?', yesPrice:0.58, noPrice:0.42, vol:'$42K'}, {question:'Ethereum above $5,000 by end of 2026?', yesPrice:0.35, noPrice:0.65, vol:'$31K'}, {question:'S&P 500 above 6,000 by end of Q1?', yesPrice:0.72, noPrice:0.28, vol:'$18K'}, {question:'Fed rate cut before July 2026?', yesPrice:0.45, noPrice:0.55, vol:'$22K'}, {question:'Oil (WTI) above $100 by mid-2026?', yesPrice:0.28, noPrice:0.72, vol:'$12K'}, {question:'Gold above $3,500 by end of 2026?', yesPrice:0.62, noPrice:0.38, vol:'$28K'}, ]; const TM_NEWS = [ {headline:'Fed holds rates steady, signals caution on inflation', time:'2h ago'}, {headline:'Bitcoin rallies 3.2% on ETF inflows exceeding $1.2B', time:'4h ago'}, {headline:'Oil gains 1.8% as OPEC+ extends production cuts', time:'5h ago'}, {headline:'Gold hits fresh all-time high amid geopolitical tension', time:'6h ago'}, {headline:'S&P 500 closes at record high, tech leads gains', time:'1d ago'}, ]; /* โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ CRYPTO PRICES โ€” CoinGecko Live Data (Delegates to fetchCryptoPricesGraph for Trade Markets tab) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ async function fetchCryptoPrices(){ try { const res = await fetch('https://api.coingecko.com/api/v3/simple/price?ids=bitcoin,ethereum,solana,ripple,dogecoin&vs_currencies=usd&include_24hr_change=true'); const data = await res.json(); if(!data) return; if(data.bitcoin) LIVE_PRICES.BTC = data.bitcoin.usd; if(data.ethereum) LIVE_PRICES.ETH = data.ethereum.usd; if(data.solana) LIVE_PRICES.SOL = data.solana.usd; if(data.ripple) LIVE_PRICES.XRP = data.ripple.usd; if(data.dogecoin) LIVE_PRICES.DOGE = data.dogecoin.usd; // Update Trade Markets crypto graphs if visible const cryptoEl = document.getElementById('tm-crypto-graphs'); if(cryptoEl && document.getElementById('page-trademarkets')?.classList.contains('active')){ cryptoEl.innerHTML = ['BTC','ETH','SOL','XRP','DOGE'].map(k=>renderGraphCard(k, LIVE_PRICES[k])).join(''); } } catch(e) { /* silent fail */ } } /* โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ RENDER โ€” TRADE MARKETS (Full-Page Graph Layout) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ const TF_TRADERS = [ {name:'BillyB', avatar:'๐Ÿ†', market:'COMMODITIES', pnl:1510.00, pos:1, color:'#eab308'}, {name:'Blazing Blake', avatar:'๐Ÿ”ฅ', market:'CRYPTO', pnl:862.90, pos:1, color:'#f97316'}, {name:'Milly$', avatar:'๐Ÿ’ฐ', market:'PREDICTION', pnl:12.13, pos:0, color:'#a78bfa'}, {name:'Jazzy J', avatar:'๐ŸŽท', market:'CRYPTO', pnl:0.26, pos:1, color:'#f97316'}, {name:'Cautious Carl', avatar:'๐Ÿ›ก๏ธ', market:'STOCKS', pnl:-8.23, pos:0, color:'#22c55e'}, {name:'Analytical Ava',avatar:'๐Ÿ“Š', market:'STOCKS', pnl:-42.50, pos:2, color:'#22c55e'}, {name:'Carter', avatar:'๐Ÿ’ผ', market:'COMMODITIES', pnl:-19.80, pos:1, color:'#eab308'}, {name:'Prosperity P', avatar:'๐Ÿ€', market:'CRYPTO', pnl:-45.86, pos:1, color:'#f97316'}, {name:'Kobe', avatar:'๐Ÿ€', market:'STOCKS', pnl:-115.84, pos:1, color:'#22c55e'}, {name:'Dangerous Davis',avatar:'โš”๏ธ', market:'PREDICTION', pnl:456.54, pos:1, color:'#a78bfa'}, {name:'Dreamgetterz', avatar:'โœจ', market:'PREDICTION', pnl:-284.72, pos:2, color:'#a78bfa'}, {name:'Wolfy', avatar:'๐ŸŒ™', market:'STOCKS', pnl:-218.76, pos:1, color:'#22c55e'}, ]; const TF_ACTIVITY = [ {time:'04:00 PM', avatar:'๐Ÿ”ฅ', trader:'Blazing Blake', action:'OPEN', symbol:'BTC-USD', detail:'LONG 5x @ $68,787', pnl:null}, {time:'03:59 PM', avatar:'๐ŸŽท', trader:'Jazzy J', action:'CLOSE', symbol:'ETH-USD', detail:'SHORT closed WIN', pnl:34.55}, {time:'03:58 PM', avatar:'๐ŸŒ™', trader:'Wolfy', action:'OPEN', symbol:'AMZN', detail:'SHORT 3x @ $207.53',pnl:null}, {time:'03:57 PM', avatar:'๐Ÿ€', trader:'Prosperity P', action:'OPEN', symbol:'XRP-USD', detail:'LONG 1x @ $1.36', pnl:null}, {time:'03:55 PM', avatar:'๐Ÿ’ฐ', trader:'Milly$', action:'CLOSE', symbol:'XRP-USD', detail:'LONG closed WIN', pnl:11.91}, {time:'03:54 PM', avatar:'โœจ', trader:'Dreamgetterz', action:'OPEN', symbol:'BTC_100K_2026', detail:'YES @ $0.5508', pnl:null}, {time:'03:52 PM', avatar:'โš”๏ธ', trader:'Dangerous Davis',action:'CLOSE', symbol:'SPACEX_IPO_2026',detail:'YES closed LOSS', pnl:-7.62}, {time:'03:50 PM', avatar:'๐Ÿ†', trader:'BillyB', action:'OPEN', symbol:'PL=F', detail:'SHORT 5x @ $1845', pnl:null}, {time:'03:48 PM', avatar:'๐Ÿ”ฅ', trader:'Blazing Blake', action:'OPEN', symbol:'DOGE-USD', detail:'SHORT 5x @ $0.091',pnl:null}, {time:'03:47 PM', avatar:'๐ŸŒ™', trader:'Wolfy', action:'CLOSE', symbol:'META', detail:'LONG closed WIN', pnl:22.10}, {time:'03:45 PM', avatar:'๐Ÿ’ฐ', trader:'Milly$', action:'OPEN', symbol:'RECESSION_2026', detail:'YES @ $0.358', pnl:null}, {time:'03:43 PM', avatar:'๐Ÿ€', trader:'Kobe', action:'OPEN', symbol:'AMD', detail:'LONG 2x @ $205.34',pnl:null}, {time:'03:41 PM', avatar:'โœจ', trader:'Dreamgetterz', action:'OPEN', symbol:'APPLE_CAR', detail:'YES @ $0.235', pnl:null}, {time:'03:40 PM', avatar:'๐Ÿ’ผ', trader:'Carter', action:'CLOSE', symbol:'PL=F', detail:'LONG closed LOSS', pnl:-41.57}, {time:'03:38 PM', avatar:'๐Ÿ†', trader:'BillyB', action:'OPEN', symbol:'GC=F', detail:'SHORT 5x @ $4392', pnl:null}, {time:'03:36 PM', avatar:'๐Ÿ€', trader:'Prosperity P', action:'CLOSE', symbol:'XRP-USD', detail:'LONG closed LOSS', pnl:-10.87}, {time:'03:35 PM', avatar:'โœจ', trader:'Dreamgetterz', action:'OPEN', symbol:'SPACEX_IPO', detail:'YES @ $0.391', pnl:null}, {time:'03:33 PM', avatar:'๐ŸŽท', trader:'Jazzy J', action:'OPEN', symbol:'XRP-USD', detail:'LONG 2x @ $1.36', pnl:null}, ]; /* โ”€โ”€ Graph Data: 12-month sample data โ”€โ”€ */ const GRAPH_DATA = { // CRYPTO BTC: { symbol:'BTC', name:'Bitcoin', color:'#f97316', borderColor:'#f97316', data:[42000,38000,41000,45000,52000,58000,62000,67000,71000,68000,74000,97500], fmt:v=>'$'+v.toLocaleString('en-US',{minimumFractionDigits:0}) }, ETH: { symbol:'ETH', name:'Ethereum', color:'#6366f1', borderColor:'#6366f1', data:[2200,1900,2100,2400,2700,2900,3100,3400,3200,3500,3800,4250], fmt:v=>'$'+v.toLocaleString('en-US',{minimumFractionDigits:0}) }, SOL: { symbol:'SOL', name:'Solana', color:'#22d3ee', borderColor:'#22d3ee', data:[95,80,88,105,120,140,130,160,180,170,190,245], fmt:v=>'$'+v.toLocaleString('en-US',{minimumFractionDigits:0}) }, XRP: { symbol:'XRP', name:'XRP', color:'#22c55e', borderColor:'#22c55e', data:[0.55,0.48,0.52,0.58,0.62,0.70,0.65,0.72,0.68,0.75,0.82,1.15], fmt:v=>'$'+v.toFixed(2) }, DOGE: { symbol:'DOGE', name:'Dogecoin', color:'#eab308', borderColor:'#eab308', data:[0.082,0.070,0.075,0.090,0.110,0.130,0.120,0.140,0.155,0.145,0.165,0.220], fmt:v=>'$'+v.toFixed(3) }, // TRADITIONAL SPX: { symbol:'SPX', name:'S&P 500', color:'#22c55e', borderColor:'#22c55e', data:[4760,4650,4800,4950,5100,5200,5350,5450,5300,5600,5750,6120], fmt:v=>v.toLocaleString('en-US',{minimumFractionDigits:0}) }, GOLD: { symbol:'GC=F', name:'Gold', color:'#eab308', borderColor:'#eab308', data:[2050,1980,2020,2080,2120,2180,2150,2220,2280,2320,2380,2450], fmt:v=>'$'+v.toLocaleString('en-US',{minimumFractionDigits:0}) }, OIL: { symbol:'CL=F', name:'WTI Crude Oil', color:'#f59e0b', borderColor:'#f59e0b', data:[72,68,74,78,75,70,68,74,78,80,77,82], fmt:v=>'$'+v.toFixed(2) }, EURUSD:{ symbol:'EUR/USD',name:'Euro / US Dollar',color:'#ef4444', borderColor:'#ef4444', data:[1.085,1.072,1.080,1.088,1.092,1.078,1.082,1.090,1.095,1.085,1.080,1.078], fmt:v=>v.toFixed(4) }, NDX: { symbol:'NDX', name:'Nasdaq 100', color:'#22c55e', borderColor:'#22c55e', data:[14800,14200,14600,15100,15700,16200,16800,17200,16800,17800,18300,19500], fmt:v=>v.toLocaleString('en-US',{minimumFractionDigits:0}) }, }; /* โ”€โ”€ Live crypto price state (updated by CoinGecko) โ”€โ”€ */ const LIVE_PRICES = { BTC: null, ETH: null, SOL: null, XRP: null, DOGE: null, }; function buildSparklineSVG(data, color, vbW=300, vbH=80){ const min = Math.min(...data); const max = Math.max(...data); const range = max - min || 1; const padY = 4; const usableH = vbH - padY * 2; const stepX = vbW / (data.length - 1); // Build polyline points const pts = data.map((v,i) => { const x = i * stepX; const y = padY + usableH - ((v - min) / range) * usableH; return `${x.toFixed(2)},${y.toFixed(2)}`; }).join(' '); // Horizontal grid lines โ€” subtle const gridLines = []; for(let i=0;i<=3;i++){ const y = padY + (usableH/3)*i; gridLines.push(``); } // Glow filter ID unique per color const filterId = 'glow-' + color.replace('#',''); return ` ${gridLines.join('\n')} `; } function renderGraphCard(assetKey, livePrice){ const g = GRAPH_DATA[assetKey]; if(!g) return ''; const displayPrice = livePrice !== null && livePrice !== undefined ? livePrice : g.data[g.data.length-1]; const firstPrice = g.data[0]; const isUp = displayPrice >= firstPrice; const strokeColor = isUp ? '#22c55e' : '#ef4444'; const badgeClass = isUp ? 'pos' : 'neg'; const changePct = ((displayPrice - firstPrice) / firstPrice * 100); const changeSign = isUp ? '+' : ''; const glowClass = isUp ? 'graph-glow-green' : 'graph-glow-red'; const svg = buildSparklineSVG(g.data, strokeColor); const low = Math.min(...g.data); const high = Math.max(...g.data); // Left accent border color from asset const accentColor = g.color || strokeColor; return `
${esc(g.symbol)}
${g.fmt(displayPrice)}
${changeSign}${changePct.toFixed(2)}%
${svg}
`; } function renderTradeMarkets(){ // Clock & date const now = new Date(); const clockEl = document.getElementById('tm-full-clock'); const dateEl = document.getElementById('tm-full-date'); if(clockEl) clockEl.textContent = now.toLocaleTimeString('en-US',{hour12:false}); if(dateEl) dateEl.textContent = now.toLocaleDateString('en-US',{weekday:'short',month:'short',day:'numeric',year:'numeric'}); // โ”€โ”€ Render all crypto graph cards โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ const cryptoContainer = document.getElementById('tm-crypto-graphs'); if(cryptoContainer){ cryptoContainer.innerHTML = ['BTC','ETH','SOL','XRP','DOGE'].map(k => renderGraphCard(k, LIVE_PRICES[k]) ).join(''); } // โ”€โ”€ Render traditional graph cards โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ const tradContainer = document.getElementById('tm-traditional-graphs'); if(tradContainer){ tradContainer.innerHTML = ['SPX','GOLD','OIL','EURUSD','NDX'].map(k => renderGraphCard(k, null) ).join(''); } // โ”€โ”€ CoinGecko live prices + 60s refresh โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ fetchCryptoPrices(); if(window._tmClockInterval) clearInterval(window._tmClockInterval); if(window._cryptoInterval) clearInterval(window._cryptoInterval); window._cryptoInterval = setInterval(fetchCryptoPrices, 60000); // Tick clock every second while on this tab window._tmClockInterval = setInterval(()=>{ const cEl = document.getElementById('tm-full-clock'); if(cEl) cEl.textContent = new Date().toLocaleTimeString('en-US',{hour12:false}); }, 1000); } /* โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ RENDER โ€” TERMINAL (Bloomberg Command Dashboard) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ function renderTerminal(){ // Update terminal clock every second if(window._termClockInterval) clearInterval(window._termClockInterval); window._termClockInterval = setInterval(()=>{ const cEl = document.getElementById('term-clock'); if(cEl) cEl.textContent = new Date().toLocaleTimeString('en-US',{hour12:false,hour:'2-digit',minute:'2-digit',second:'2-digit'}); }, 1000); // Initial clock tick const cEl = document.getElementById('term-clock'); if(cEl) cEl.textContent = new Date().toLocaleTimeString('en-US',{hour12:false,hour:'2-digit',minute:'2-digit',second:'2-digit'}); // Update economic calendar countdowns updateEcoCountdowns(); // Auto-refresh P&L data every 30s when on Terminal tab if(window._termRefreshInterval) clearInterval(window._termRefreshInterval); window._termRefreshInterval = setInterval(()=>{ if(state.currentPage === 'terminal'){ api('/api/trader-summary').then(d=>{ if(!d?.traders) return; state.trader = d.traders; // Silently update key metrics without full re-render const todayPnl = state.trader.reduce((s,t)=>s+(parseFloat(t.today_pnl)||0),0); const el = document.getElementById('term-day-pnl'); if(el){ const sign = todayPnl>=0?'+':'-'; el.textContent = sign+'$'+Math.abs(todayPnl).toLocaleString('en-US',{minimumFractionDigits:2}); el.style.color = todayPnl>=0?'var(--success)':'var(--danger)'; } }); } }, 30000); // Fetch financial news fetchFinancialNews(); // Auto-refresh news every 5 minutes if(window._termNewsInterval) clearInterval(window._termNewsInterval); window._termNewsInterval = setInterval(fetchFinancialNews, 300000); } let termNewsFilter = 'ALL'; let termAllNews = []; // store all fetched news function termSetNewsFilter(filter, btn){ termNewsFilter = filter; // Update active state of filter buttons document.querySelectorAll('.term-news-filter').forEach(b=>{ b.style.background = 'transparent'; b.style.color = 'var(--text-2)'; b.style.borderColor = 'var(--border)'; }); if(btn){ btn.style.background = 'var(--accent-bg)'; btn.style.color = 'var(--accent)'; btn.style.borderColor = 'rgba(79,142,247,.2)'; } renderTermNews(termAllNews, filter); } async function fetchFinancialNews(){ const feedEl = document.getElementById('term-news-feed'); if(!feedEl) return; // โ”€โ”€ SAMPLE / DEMO DATA (fallback) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ const sampleNews = [ { headline:'Bitcoin surges past $97,000 as institutional inflows accelerate', source:'CoinDesk', time:'8 min ago', category:'CRYPTO', sentiment:'bullish', url:'#', summary:'Major cryptocurrency hits new milestone as ETF inflows reach $1.2B in single day' }, { headline:'Ethereum ETF sees record $420M inflow in single day', source:'Decrypt', time:'41 min ago', category:'CRYPTO', sentiment:'bullish', url:'#', summary:'Spot Ethereum ETFs attract unprecedented capital as altcoin season gains momentum' }, { headline:'Fed signals potential rate cut in Q2 โ€” markets react', source:'Reuters', time:'3 min ago', category:'STOCKS', sentiment:'bearish', url:'#', summary:'Fed Chair comments suggest easing cycle may begin sooner than expected' }, { headline:'S&P 500 hits new all-time high above 6,120', source:'CNBC', time:'22 min ago', category:'STOCKS', sentiment:'bullish', url:'#', summary:'Broad market rally continues as tech and financial sectors lead gains' }, { headline:'Nasdaq tech earnings beat estimates across the board', source:'MarketWatch', time:'1.5 hours ago', category:'STOCKS', sentiment:'bullish', url:'#', summary:'Q1 earnings season stronger than expected with 78% of tech companies beating forecasts' }, { headline:'Oil jumps 3% on surprise OPEC+ production cut', source:'Bloomberg', time:'15 min ago', category:'COMMODITIES', sentiment:'bullish', url:'#', summary:'Unexpected cartel decision shocks energy markets; WTI crude surges above $84/barrel' }, { headline:'Gold breaks $2,450 resistance โ€” next target $2,500', source:'Kitco', time:'35 min ago', category:'COMMODITIES', sentiment:'bullish', url:'#', summary:'Safe-haven demand drives gold to fresh highs amid geopolitical uncertainty' }, { headline:'EUR/USD falls to 1-year low as dollar strengthens', source:'FXStreet', time:'1 hour ago', category:'FOREX', sentiment:'bearish', url:'#', summary:'DXY rally pressures major currency pairs; Euro struggles amid ECB dovish stance' }, ]; // โ”€โ”€ TRY RSS FEED โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ let newsItems = []; try { const rssUrl = 'https://feeds.finance.yahoo.com/rss/2.0/headline?s=^GSPC,BTC-USD,ETH-USD,GC=F,CL=F®ion=US&lang=en-US'; const response = await fetch(rssUrl, {mode:'cors'}); if(response.ok){ const text = await response.text(); // Parse RSS XML manually const items = text.match(/([\s\S]*?)<\/item>/g) || []; newsItems = items.slice(0,10).map(item=>{ const getTag = tag => { const m = item.match(new RegExp(`<${tag}>([^<]+)`)); return m ? m[1] : ''; }; const title = getTag('title'); const link = getTag('link'); const pubDate = getTag('pubDate'); const desc = getTag('description'); // Determine category by title keywords const cat = /BTC|ETH|CRYPTO|COIN/i.test(title) ? 'CRYPTO' : /OIL|CRUDE|GOLD|SILVER|COMMOD/i.test(title) ? 'COMMODITIES' : /EUR|USD|GBP|FOREX|FX/i.test(title) ? 'FOREX' : 'STOCKS'; const sentiment = /surge|jump|rally|high|gain|beat|record|inflow|break/i.test(title) ? 'bullish' : /fall|dip|cut|drop|loss|bear/i.test(title) ? 'bearish' : 'neutral'; const timeAgo = pubDate ? timeAgoStr(new Date(pubDate)) : 'recently'; return { headline: title, source: 'Yahoo Finance', time: timeAgo, category: cat, sentiment, url: link || '#', summary: desc }; }); } } catch(e) { // RSS fetch failed โ€” use sample data } // If no RSS items, use sample data if(!newsItems.length){ newsItems = sampleNews; const statusEl = document.getElementById('term-news-status'); if(statusEl) statusEl.style.display = 'inline'; document.getElementById('term-news-count').textContent = sampleNews.length + ' demo items'; } else { document.getElementById('term-news-count').textContent = newsItems.length + ' live'; const statusEl = document.getElementById('term-news-status'); if(statusEl){ statusEl.style.display = 'inline'; statusEl.style.color = 'var(--success)'; } } termAllNews = newsItems; renderTermNews(newsItems, termNewsFilter); } function renderTermNews(items, filter){ const feedEl = document.getElementById('term-news-feed'); if(!feedEl) return; const filtered = filter === 'ALL' ? items : items.filter(n=>n.category === filter); if(!filtered.length){ feedEl.innerHTML = `
No ${filter} news available
`; return; } const sentimentBorder = s => s === 'bullish' ? 'rgba(34,197,94,.35)' : s === 'bearish' ? 'rgba(239,68,68,.35)' : 'var(--border)'; const sentimentDot = s => s === 'bullish' ? 'var(--success)' : s === 'bearish' ? 'var(--danger)' : 'var(--text-3)'; const sentimentLabel = s => s === 'bullish' ? '๐ŸŸข BULLISH' : s === 'bearish' ? '๐Ÿ”ด BEARISH' : 'โšช NEUTRAL'; let html = ''; filtered.forEach((n,i)=>{ const borderColor = sentimentBorder(n.sentiment); const dotColor = sentimentDot(n.sentiment); const label = sentimentLabel(n.sentiment); html += `
${label} ${esc(n.source)} ยท ${esc(n.time)}
${esc(n.headline)} ${n.summary ? `
${esc(n.summary)}
` : ''}
`; }); feedEl.innerHTML = html; } function timeAgoStr(date){ const diff = Math.floor((Date.now() - date) / 1000); if(diff < 60) return diff + ' sec ago'; if(diff < 3600) return Math.floor(diff/60) + ' min ago'; if(diff < 86400) return Math.floor(diff/3600) + ' hour' + (Math.floor(diff/3600)>1?'s':'') + ' ago'; return Math.floor(diff/86400) + ' day' + (Math.floor(diff/86400)>1?'s':'') + ' ago'; } function updateEcoCountdowns(){ // Update countdown timers every minute const events = [ {id:'term-cpi-countdown', hour:8, min:30, label:'in 42min'}, {id:'term-job-countdown', hour:8, min:30, label:'in 42min'}, {id:'term-ism-countdown', hour:10, min:0, label:'in 2hr 10min'}, {id:'term-fomc-countdown', hour:14, min:0, label:'in 6hr'}, ]; function updateCountdowns(){ const now = new Date(); events.forEach(ev=>{ const el = document.getElementById(ev.id); if(!el) return; const evDate = new Date(now); evDate.setHours(ev.hour, ev.min, 0, 0); if(evDate < now){ // Already happened today, show next occurrence or "Passed" el.textContent = 'DONE'; el.style.color = 'var(--text-3)'; return; } const diffMs = evDate - now; const diffMin = Math.floor(diffMs / 60000); const h = Math.floor(diffMin / 60); const m = diffMin % 60; if(h > 0){ el.textContent = `in ${h}hr ${m}min`; el.style.color = h < 2 ? 'var(--danger)' : h < 4 ? 'var(--warning)' : 'var(--accent)'; } else { el.textContent = `in ${m}min`; el.style.color = m < 30 ? 'var(--danger)' : 'var(--warning)'; } }); } updateCountdowns(); if(window._ecoCountdownInterval) clearInterval(window._ecoCountdownInterval); window._ecoCountdownInterval = setInterval(updateCountdowns, 60000); } function termAddNote(){ const input = document.getElementById('term-note-input'); if(!input || !input.value.trim()){ toast('Enter a note first','error'); return; } const note = input.value.trim(); input.value = ''; toast('Trade note added!','success'); // In production: post('/api/trade-notes', { note, timestamp: new Date().toISOString() }) } /* โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ UPDATE TRADER FLOOR โ€” Efficiency Stats & Market Sentiment (Called from renderTrader to inject extra panels) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ function renderTraderFloorEnhancements(){ // Market sentiment strip at top of Trader Floor const sentStrip = document.getElementById('trader-sentiment-strip'); if(sentStrip){ sentStrip.innerHTML = `
BTC DOM
62.4%
+0.3%
FEAR & GREED
72
GREED
BTC FUNDING
+0.010%
8h Binance
DXY
104.32
-0.4%
OPEN INTEREST (BTC)
$48.2B
+2.4% 24h
`; } // Economic calendar strip const ecoStrip = document.getElementById('trader-eco-strip'); if(ecoStrip){ ecoStrip.innerHTML = `
๐Ÿ“… ECO CALENDAR 08:30 CPI MoM Prev:0.3% Fcst:0.2% | 10:00 ISM Mfg PMI Prev:50.3 Fcst:50.5 | 14:00 FOMC Minutes | 08:30 Jobless Claims Prev:218K Fcst:215K
`; } } // Wire trader floor enhancements into renderTrader const _origRenderTrader = renderTrader; renderTrader = function(){ _origRenderTrader.apply(this, arguments); renderTraderFloorEnhancements(); };