| import React, { useState, useEffect } from 'react'; |
| import { |
| Lightbulb, |
| Scale, |
| TrendingUp, |
| ShieldAlert, |
| Search, |
| MessageSquare, |
| CheckCircle, |
| AlertTriangle, |
| ExternalLink, |
| RefreshCw, |
| Clock, |
| ThumbsUp, |
| ThumbsDown, |
| ChevronDown, |
| ChevronUp, |
| FileText, |
| Zap, |
| Target, |
| Users, |
| BarChart3, |
| Globe, |
| AlertCircle, |
| Hash, |
| Eye, |
| Shield, |
| Database, |
| Wallet, |
| Bot, |
| Cpu, |
| Activity, |
| Server, |
| Lock, |
| Radio, |
| Satellite, |
| Crosshair, |
| Network, |
| Terminal, |
| Key, |
| Fingerprint, |
| Scan, |
| LayoutDashboard, |
| Settings, |
| Bell, |
| Flag, |
| Map, |
| Binoculars, |
| Brain, |
| Sparkles, |
| ChevronRight, |
| Pause, |
| Play, |
| Power, |
| AlertOctagon, |
| FileCode, |
| GitBranch, |
| Box, |
| Layers |
| } from 'lucide-react'; |
|
|
| |
| |
| |
| interface Advisor { |
| id: string; |
| name: string; |
| codename: string; |
| icon: React.ReactNode; |
| description: string; |
| lastUpdated: string; |
| insights: Insight[]; |
| actions: Action[]; |
| clearanceLevel: number; |
| } |
|
|
| interface Insight { |
| id: string; |
| type: 'suggestion' | 'alert' | 'opportunity' | 'warning' | 'trend' | 'intel' | 'threat'; |
| title: string; |
| description: string; |
| priority: 'critical' | 'high' | 'medium' | 'low'; |
| timestamp: string; |
| source?: string; |
| evidence?: string[]; |
| impact?: string; |
| classified?: boolean; |
| } |
|
|
| interface Action { |
| id: string; |
| label: string; |
| status: 'pending' | 'in_progress' | 'completed' | 'dismissed' | 'requires_approval'; |
| handler: () => void; |
| requiresAuth?: boolean; |
| } |
|
|
| interface DailyBriefing { |
| date: string; |
| threatLevel: 'green' | 'yellow' | 'orange' | 'red'; |
| totalActiveOperations: number; |
| newIntel: number; |
| requiresDecision: number; |
| chiefRecommendations: Recommendation[]; |
| } |
|
|
| interface Recommendation { |
| id: string; |
| priority: 'critical' | 'high' | 'medium' | 'low'; |
| category: 'operations' | 'legal' | 'technical' | 'financial' | 'security'; |
| title: string; |
| description: string; |
| estimatedTime: string; |
| potentialImpact: string; |
| reasoning: string[]; |
| } |
|
|
| interface BotStatus { |
| id: string; |
| name: string; |
| role: string; |
| status: 'active' | 'standby' | 'maintenance' | 'offline'; |
| lastActivity: string; |
| messagesHandled: number; |
| swarmsAllocated: number; |
| } |
|
|
| interface WalletData { |
| address: string; |
| purpose: string; |
| balance: string; |
| network: string; |
| lastTx: string; |
| requiresApproval: boolean; |
| } |
|
|
| interface DomainStatus { |
| domain: string; |
| status: 'active' | 'pending' | 'expiring' | 'expired'; |
| expiresAt: string; |
| traffic24h: number; |
| sslStatus: 'valid' | 'expiring' | 'expired'; |
| dnsHealth: 'healthy' | 'issues' | 'critical'; |
| } |
|
|
| interface DataUsageMetric { |
| category: string; |
| source: string; |
| recordsProcessed: number; |
| storageUsed: string; |
| lastUpdated: string; |
| humanVerified: boolean; |
| } |
|
|
| |
| |
| |
| const dailyBriefing: DailyBriefing = { |
| date: new Date().toISOString(), |
| threatLevel: 'orange', |
| totalActiveOperations: 23, |
| newIntel: 47, |
| requiresDecision: 5, |
| chiefRecommendations: [ |
| { |
| id: 'r1', |
| priority: 'critical', |
| category: 'security', |
| title: 'Address Active Phishing Campaign', |
| description: 'Fake RMI airdrop site detected. 23 wallets compromised. Immediate response required.', |
| estimatedTime: '30 minutes', |
| potentialImpact: 'Prevent $100K+ additional losses, protect brand reputation', |
| reasoning: [ |
| 'Active scam using RMI branding detected 10 minutes ago', |
| 'User losses already at $45K and increasing', |
| 'Social media mentions spreading rapidly', |
| 'Waiting >1 hour risks mainstream crypto news pickup' |
| ] |
| }, |
| { |
| id: 'r2', |
| priority: 'high', |
| category: 'technical', |
| title: 'Optimize Database Query Performance', |
| description: 'API latency degraded 275% over past week. Investigation table queries need indexing.', |
| estimatedTime: '2 hours', |
| potentialImpact: 'Restore 120ms response times, prevent user churn', |
| reasoning: [ |
| 'Response times increased from 120ms to 450ms', |
| 'User complaints in Discord increasing', |
| 'Competitor platforms average 150ms - we are 3x slower', |
| 'Database optimization scheduled, needs execution' |
| ] |
| }, |
| { |
| id: 'r3', |
| priority: 'high', |
| category: 'operations', |
| title: 'Publish Preemptive Scam Alert', |
| description: 'Intelligence suggests "MegaLaunch" presale is coordinated scam. 3 days to launch.', |
| estimatedTime: '1 hour', |
| potentialImpact: 'Save community $2M+, establish RMI as protective leader', |
| reasoning: [ |
| 'Multiple OSINT indicators confirm scam pattern', |
| '52K Telegram members at risk (80% are real users)', |
| 'High-profile target will generate media attention', |
| 'First-mover advantage on this intelligence' |
| ] |
| }, |
| { |
| id: 'r4', |
| priority: 'medium', |
| category: 'financial', |
| title: 'Review Q2 Tax Estimation', |
| description: 'Quarterly tax payment due June 15. Current estimate may be insufficient.', |
| estimatedTime: '45 minutes', |
| potentialImpact: 'Avoid penalties, ensure compliance', |
| reasoning: [ |
| 'Q2 revenue exceeded projections by 15%', |
| 'Safe harbor requires 110% of prior year payments', |
| 'Current estimate may underpay by ~$8K', |
| 'CFO review recommended before payment' |
| ] |
| }, |
| { |
| id: 'r5', |
| priority: 'medium', |
| category: 'operations', |
| title: 'Create Base Chain Scanner Landing Page', |
| description: '72% of new launches on Base but only 45% scanner coverage. Users searching but bouncing.', |
| estimatedTime: '3 hours', |
| potentialImpact: 'Capture 500+ daily searches, improve conversion 25%', |
| reasoning: [ |
| 'Search analytics show high intent Base queries', |
| '62% bounce rate on current landing pages', |
| 'No direct "Base token scanner" content exists', |
| 'Technical foundation ready, needs frontend' |
| ] |
| } |
| ] |
| }; |
|
|
| const botStatuses: BotStatus[] = [ |
| { id: 'b1', name: '@rugmunchbot', role: 'Primary Scanner', status: 'active', lastActivity: '2s ago', messagesHandled: 45230, swarmsAllocated: 4 }, |
| { id: 'b2', name: '@rmi_alerts_bot', role: 'Alert Distribution', status: 'active', lastActivity: '5s ago', messagesHandled: 128450, swarmsAllocated: 2 }, |
| { id: 'b3', name: '@rmi_alpha_bot', role: 'Premium Alpha', status: 'active', lastActivity: '1m ago', messagesHandled: 8930, swarmsAllocated: 3 }, |
| { id: 'b4', name: '@rmi_snitch_bot', role: 'Tip Collection', status: 'active', lastActivity: '12s ago', messagesHandled: 3420, swarmsAllocated: 1 }, |
| { id: 'b5', name: '@rmi_rehab_bot', role: 'Education', status: 'standby', lastActivity: '5m ago', messagesHandled: 12340, swarmsAllocated: 1 }, |
| { id: 'b6', name: '@rmi_whale_bot', role: 'Whale Tracking', status: 'maintenance', lastActivity: '2h ago', messagesHandled: 56700, swarmsAllocated: 0 }, |
| ]; |
|
|
| const walletData: WalletData[] = [ |
| { address: '0x742d...8f3a', purpose: 'Treasury Primary', balance: '245.5 ETH', network: 'Ethereum', lastTx: '2h ago', requiresApproval: false }, |
| { address: '0x91ab...2e4c', purpose: 'Operations', balance: '42.8 ETH', network: 'Ethereum', lastTx: '15m ago', requiresApproval: true }, |
| { address: '0x3f9c...7b1d', purpose: 'Staking Rewards', balance: '18.2 ETH', network: 'Base', lastTx: '1d ago', requiresApproval: false }, |
| { address: '0x8a2e...9f5b', purpose: 'Emergency Reserve', balance: '500.0 ETH', network: 'Ethereum', lastTx: '7d ago', requiresApproval: true }, |
| ]; |
|
|
| const domainStatuses: DomainStatus[] = [ |
| { domain: 'cryptorugmunch.com', status: 'active', expiresAt: '2027-04-14', traffic24h: 45200, sslStatus: 'valid', dnsHealth: 'healthy' }, |
| { domain: 'rugmunch.io', status: 'active', expiresAt: '2027-08-22', traffic24h: 12800, sslStatus: 'valid', dnsHealth: 'healthy' }, |
| { domain: 'rmintel.net', status: 'expiring', expiresAt: '2026-05-01', traffic24h: 3200, sslStatus: 'expiring', dnsHealth: 'issues' }, |
| { domain: 'munchmaps.io', status: 'pending', expiresAt: 'N/A', traffic24h: 0, sslStatus: 'valid', dnsHealth: 'healthy' }, |
| ]; |
|
|
| const dataUsageMetrics: DataUsageMetric[] = [ |
| { category: 'Contract Analysis', source: 'AI Swarm + User Scans', recordsProcessed: 2450000, storageUsed: '45.2 GB', lastUpdated: 'Just now', humanVerified: true }, |
| { category: 'Wallet Tracking', source: 'Blockchain Indexers', recordsProcessed: 89000000, storageUsed: '128.5 GB', lastUpdated: '2m ago', humanVerified: true }, |
| { category: 'Community Intel', source: 'Snitch Reports + Tips', recordsProcessed: 12500, storageUsed: '8.3 GB', lastUpdated: '5m ago', humanVerified: false }, |
| { category: 'Social Signals', source: 'X/Telegram Monitoring', recordsProcessed: 45000000, storageUsed: '156.2 GB', lastUpdated: '1m ago', humanVerified: true }, |
| { category: 'User Analytics', source: 'Frontend + API Logs', recordsProcessed: 890000, storageUsed: '23.1 GB', lastUpdated: '15m ago', humanVerified: true }, |
| ]; |
|
|
| const swarmStatus = { |
| totalAgents: 18, |
| activeAgents: 15, |
| tasksInQueue: 23, |
| avgProcessingTime: '1.2s', |
| lastDeployment: '4h ago', |
| healthScore: 94, |
| }; |
|
|
| |
| |
| |
| const AdvisorPanel: React.FC = () => { |
| const [activeTab, setActiveTab] = useState<string>('briefing'); |
| const [activeAdvisor, setActiveAdvisor] = useState<string>('project'); |
| const [expandedInsight, setExpandedInsight] = useState<string | null>(null); |
| const [expandedRec, setExpandedRec] = useState<string | null>('r1'); |
| const [refreshing, setRefreshing] = useState(false); |
| const [humanOverride, setHumanOverride] = useState(false); |
| const [terminalOpen, setTerminalOpen] = useState(false); |
| const [lastGlobalUpdate, setLastGlobalUpdate] = useState(new Date().toISOString()); |
|
|
| |
| const chiefAdvisor: Advisor = { |
| id: 'chief', |
| name: 'Chief of Staff', |
| codename: 'DIRECTOR', |
| icon: <Brain className="w-6 h-6 text-[#7c3aed]" />, |
| description: 'Daily strategic briefing and prioritized recommendations', |
| lastUpdated: 'Just now', |
| clearanceLevel: 5, |
| insights: [], |
| actions: [] |
| }; |
|
|
| |
| const projectAdvisor: Advisor = { |
| id: 'project', |
| name: 'Operations Intelligence', |
| codename: 'WATCHDOG', |
| icon: <Crosshair className="w-6 h-6 text-yellow-400" />, |
| description: 'Platform performance, user analytics, and growth opportunities', |
| clearanceLevel: 4, |
| lastUpdated: '2 minutes ago', |
| insights: [ |
| { |
| id: 'p1', |
| type: 'intel', |
| title: 'Real-Time Wallet Notifications Requested', |
| description: '67% of ELITE tier users requested push notifications for tracked wallet movements. WebSocket infrastructure ready for deployment.', |
| priority: 'high', |
| timestamp: '15 minutes ago', |
| source: 'SIGINT-USERFEEDBACK', |
| evidence: ['Survey: 450 responses', 'Support tickets: 89 related', 'Discord requests: 156'], |
| impact: '23% retention increase, $45K additional ARR', |
| classified: false |
| }, |
| { |
| id: 'p2', |
| type: 'opportunity', |
| title: 'MetaMask Partnership Opportunity', |
| description: 'MetaMask Snap integration could expose RMI to 30M+ users. No direct competitor in security Snap category.', |
| priority: 'high', |
| timestamp: '1 hour ago', |
| source: 'OSINT-MARKET', |
| evidence: ['MetaMask Snaps API released Q4 2024', 'User survey: 78% use MetaMask', 'No security competitor exists'], |
| impact: '10K-50K new users, $150K partnership revenue', |
| classified: false |
| }, |
| { |
| id: 'p4', |
| type: 'threat', |
| title: 'API Response Times Degrading', |
| description: 'Average response time increased from 120ms to 450ms over past week. Database queries on investigation_cases table are bottleneck.', |
| priority: 'critical', |
| timestamp: '30 minutes ago', |
| source: 'SIGINT-PERFORMANCE', |
| evidence: ['Avg latency: 450ms (was 120ms)', 'Slow query log: investigation_cases', 'Error rate: 0.3% increase'], |
| impact: 'User experience degradation, potential churn', |
| classified: false |
| } |
| ], |
| actions: [ |
| { id: 'pa1', label: 'Deploy WebSocket Notifications', status: 'requires_approval', requiresAuth: true, handler: () => {} }, |
| { id: 'pa2', label: 'Research MetaMask Partnership', status: 'in_progress', handler: () => {} }, |
| { id: 'pa3', label: 'Emergency Database Optimization', status: 'requires_approval', requiresAuth: true, handler: () => {} } |
| ] |
| }; |
|
|
| |
| const legalAdvisor: Advisor = { |
| id: 'legal', |
| name: 'Legal & Compliance', |
| codename: 'COUNSEL', |
| icon: <Scale className="w-6 h-6 text-blue-400" />, |
| description: 'Wyoming DAO LLC compliance, tax obligations, regulatory monitoring', |
| clearanceLevel: 5, |
| lastUpdated: '1 hour ago', |
| insights: [ |
| { |
| id: 'l1', |
| type: 'alert', |
| title: 'Wyoming Annual Report Due: 45 Days', |
| description: 'Annual report and $60 fee due by June 1st. Late filing penalty: $200 + loss of good standing.', |
| priority: 'high', |
| timestamp: 'Today, 9:00 AM', |
| source: 'COMPLIANCE-CALENDAR', |
| evidence: ['Filing deadline: June 1, 2026', 'Current status: Good standing', 'Fee: $60'], |
| impact: 'Avoid $200 penalty, maintain legal protection' |
| }, |
| { |
| id: 'l2', |
| type: 'threat', |
| title: 'SEC Increased Token Scrutiny', |
| description: 'SEC announced increased enforcement on DeFi tokens. Review $CRM V2 tokenomics for Howey Test compliance.', |
| priority: 'critical', |
| timestamp: '2 days ago', |
| source: 'OSINT-REGULATORY', |
| evidence: ['SEC statement: April 10, 2026', 'Focus: "utility" token classification', 'Recent enforcement: 3 similar projects'], |
| impact: 'Potential regulatory action, legal review needed immediately' |
| }, |
| { |
| id: 'l5', |
| type: 'alert', |
| title: 'Q2 Estimated Tax Payment Due June 15', |
| description: 'Projected Q2 revenue: $125K. Estimated tax obligation: ~$31K. Safe harbor requires 110% of prior year.', |
| priority: 'high', |
| timestamp: 'Yesterday', |
| source: 'FINANCE-TAX', |
| evidence: ['Q1 actual: $118K', 'Q2 projected: $125K', 'Tax rate: ~25% effective'], |
| impact: 'Avoid underpayment penalties (0.5%/month)' |
| } |
| ], |
| actions: [ |
| { id: 'la1', label: 'File Wyoming Annual Report', status: 'pending', handler: () => {} }, |
| { id: 'la2', label: 'Emergency Legal Review: Token Compliance', status: 'requires_approval', requiresAuth: true, handler: () => {} }, |
| { id: 'la3', label: 'Prepare Q2 Tax Payment', status: 'pending', handler: () => {} } |
| ] |
| }; |
|
|
| |
| const trendsAdvisor: Advisor = { |
| id: 'trends', |
| name: 'Social Intelligence', |
| codename: 'ECHO', |
| icon: <Radio className="w-6 h-6 text-purple-400" />, |
| description: 'Real-time crypto Twitter sentiment, trending narratives, viral opportunities', |
| clearanceLevel: 3, |
| lastUpdated: '5 minutes ago', |
| insights: [ |
| { |
| id: 't1', |
| type: 'trend', |
| title: '#RugPull Viral Surge: +340%', |
| description: 'Mentions of "rug pull" increased 340% in past 24h. Related to Base chain launchpad incident. Opportunity for RMI expertise positioning.', |
| priority: 'high', |
| timestamp: '20 minutes ago', |
| source: 'SIGINT-SOCIAL', |
| evidence: ['Mentions: 12,450 (24h)', 'Sentiment: 65% fearful', 'Top influencers: 15 discussing'], |
| impact: 'Thread opportunity: 500K+ impressions possible' |
| }, |
| { |
| id: 't2', |
| type: 'opportunity', |
| title: 'AI Agent Token Narrative Exploding', |
| description: '$AI and $AGENT tokens trending with $500M+ volume. RMI could position AI Swarm as security-focused alternative.', |
| priority: 'high', |
| timestamp: '2 hours ago', |
| source: 'OSINT-MARKET', |
| evidence: ['$AI volume: $230M (24h)', '$AGENT volume: $180M (24h)', 'Related keywords: +800%'], |
| impact: 'Positioning: "AI for good - security not speculation"' |
| }, |
| { |
| id: 't4', |
| type: 'intel', |
| title: 'Base Chain Dominating Launches: 72%', |
| description: '72% of new token launches now on Base. RMI scanner traffic shows only 45% Base coverage - intelligence gap identified.', |
| priority: 'high', |
| timestamp: '6 hours ago', |
| source: 'SIGINT-CHAIN', |
| evidence: ['New launches: 72% Base', 'RMI scans: 45% Base', 'Trend accelerating: +15% WoW'], |
| impact: 'Technical priority: Enhance Base chain detection' |
| } |
| ], |
| actions: [ |
| { id: 'ta1', label: 'Draft #RugPull Educational Thread', status: 'pending', handler: () => {} }, |
| { id: 'ta2', label: 'Create AI Security Positioning Content', status: 'in_progress', handler: () => {} } |
| ] |
| }; |
|
|
| |
| const scamAdvisor: Advisor = { |
| id: 'scam', |
| name: 'Threat Intelligence', |
| codename: 'SENTINEL', |
| icon: <ShieldAlert className="w-6 h-6 text-red-400" />, |
| description: 'Emerging threats, active scams, preemptive community alerts', |
| clearanceLevel: 5, |
| lastUpdated: 'Just now', |
| insights: [ |
| { |
| id: 's1', |
| type: 'threat', |
| title: 'ACTIVE: Fake RMI Token Airdrop', |
| description: 'Scammers impersonating RMI announcing fake $CRM V2 airdrop. Phishing site at rmi-airdrop[.]xyz stealing credentials.', |
| priority: 'critical', |
| timestamp: '10 minutes ago', |
| source: 'HUMINT-SNICHT + SIGINT-PHISHING', |
| evidence: ['Domain: rmi-airdrop.xyz', 'Wallets drained: 23 confirmed', 'Est. losses: $45K', 'Social posts: 8 fake accounts'], |
| impact: 'Immediate action required: Issue warning, report domain, track funds' |
| }, |
| { |
| id: 's2', |
| type: 'threat', |
| title: 'New "Sleep Minting" Attack Vector', |
| description: 'Novel honeypot: tokens appear tradable for 24h then become unsellable. 6 contracts deployed in past 48h.', |
| priority: 'high', |
| timestamp: '1 hour ago', |
| source: 'SIGINT-CONTRACTS', |
| evidence: ['Contracts flagged: 6', 'Pattern: Sell function disabled after block height', 'Est. victims: 180+ wallets'], |
| impact: 'Update scanner: Add sleep minting detection' |
| }, |
| { |
| id: 's3', |
| type: 'threat', |
| title: 'Coordinated Presale Scam: "MegaLaunch"', |
| description: 'Coordinated scam targeting 50K+ users. Fake team credentials, copied whitepaper, bot-filled social proof. Launch in 3 days.', |
| priority: 'critical', |
| timestamp: '3 hours ago', |
| source: 'HUMINT-SNICHT + OSINT-INVESTIGATION', |
| evidence: ['Telegram: 52K members (80% bots)', 'Team photos: AI-generated', 'Contract: Ownership not renounced', 'Soft cap: $2M target'], |
| impact: 'Preemptive alert: Save potential $2M in losses' |
| } |
| ], |
| actions: [ |
| { id: 'sa1', label: 'Issue Emergency Airdrop Warning', status: 'requires_approval', requiresAuth: true, handler: () => {} }, |
| { id: 'sa2', label: 'Report Phishing Domain to Registrars', status: 'pending', handler: () => {} }, |
| { id: 'sa3', label: 'Deploy Sleep Minting Detection', status: 'requires_approval', requiresAuth: true, handler: () => {} }, |
| { id: 'sa4', label: 'Publish MegaLaunch Investigation', status: 'in_progress', handler: () => {} } |
| ] |
| }; |
|
|
| |
| const searchAdvisor: Advisor = { |
| id: 'search', |
| name: 'Search Intelligence', |
| codename: 'SPECTER', |
| icon: <Scan className="w-6 h-6 text-green-400" />, |
| description: 'User search patterns, knowledge gaps, content opportunities', |
| clearanceLevel: 2, |
| lastUpdated: '15 minutes ago', |
| insights: [ |
| { |
| id: 'cs1', |
| type: 'intel', |
| title: '"Recover rugged funds" +450%', |
| description: 'Top search query this week. Users looking for recovery options after Base chain incidents.', |
| priority: 'high', |
| timestamp: '1 hour ago', |
| source: 'SIGINT-SEARCH', |
| evidence: ['Search volume: +450%', 'Support tickets: 78 related', 'Referral: Reddit/r/cryptorecovery'], |
| impact: 'Create recovery guide, promote 1-1 Reimbursement Program' |
| }, |
| { |
| id: 'cs4', |
| type: 'warning', |
| title: 'High Bounce Rate: "Token Scanner"', |
| description: '62% bounce rate for "token scanner" searches. Landing page not matching intent. Users expect instant scan tool.', |
| priority: 'high', |
| timestamp: '12 hours ago', |
| source: 'SIGINT-ANALYTICS', |
| evidence: ['Bounce rate: 62% (vs 35% avg)', 'Time on page: 8 seconds', 'Exit: /features, /pricing'], |
| impact: 'UX fix: Create dedicated scanner landing page' |
| } |
| ], |
| actions: [ |
| { id: 'csa1', label: 'Create Fund Recovery Content', status: 'pending', handler: () => {} }, |
| { id: 'csa2', label: 'Build Scanner Landing Page', status: 'pending', handler: () => {} } |
| ] |
| }; |
|
|
| const advisors = [chiefAdvisor, projectAdvisor, legalAdvisor, trendsAdvisor, scamAdvisor, searchAdvisor]; |
| const currentAdvisor = advisors.find(a => a.id === activeAdvisor) || projectAdvisor; |
|
|
| const handleRefresh = () => { |
| setRefreshing(true); |
| setTimeout(() => { |
| setRefreshing(false); |
| setLastGlobalUpdate(new Date().toISOString()); |
| }, 2000); |
| }; |
|
|
| const getInsightIcon = (type: string) => { |
| switch (type) { |
| case 'suggestion': return <Lightbulb className="w-5 h-5 text-yellow-400" />; |
| case 'alert': return <AlertCircle className="w-5 h-5 text-red-400" />; |
| case 'opportunity': return <Target className="w-5 h-5 text-green-400" />; |
| case 'warning': return <AlertTriangle className="w-5 h-5 text-orange-400" />; |
| case 'trend': return <TrendingUp className="w-5 h-5 text-purple-400" />; |
| case 'intel': return <Satellite className="w-5 h-5 text-blue-400" />; |
| case 'threat': return <ShieldAlert className="w-5 h-5 text-red-500" />; |
| default: return <Zap className="w-5 h-5 text-[#7c3aed]" />; |
| } |
| }; |
|
|
| const getPriorityColor = (priority: string) => { |
| switch (priority) { |
| case 'critical': return 'bg-red-600/30 text-red-400 border-red-500/50 animate-pulse'; |
| case 'high': return 'bg-orange-500/20 text-orange-400 border-orange-500/30'; |
| case 'medium': return 'bg-yellow-500/20 text-yellow-400 border-yellow-500/30'; |
| case 'low': return 'bg-green-500/20 text-green-400 border-green-500/30'; |
| default: return 'bg-gray-500/20 text-gray-400'; |
| } |
| }; |
|
|
| const getThreatLevelColor = (level: string) => { |
| switch (level) { |
| case 'green': return 'bg-green-500 shadow-[0_0_10px_rgba(34,197,94,0.5)]'; |
| case 'yellow': return 'bg-yellow-500 shadow-[0_0_10px_rgba(234,179,8,0.5)]'; |
| case 'orange': return 'bg-orange-500 shadow-[0_0_10px_rgba(249,115,22,0.5)]'; |
| case 'red': return 'bg-red-600 shadow-[0_0_15px_rgba(220,38,38,0.7)] animate-pulse'; |
| default: return 'bg-gray-500'; |
| } |
| }; |
|
|
| return ( |
| <div className="min-h-screen bg-[#0a0812] text-gray-100 font-mono selection:bg-[#7c3aed]/30"> |
| {/* Top Bar - Classified Header */} |
| <div className="bg-gradient-to-r from-[#0f0c1d] via-[#1a1525] to-[#0f0c1d] border-b border-[#7c3aed]/30"> |
| <div className="max-w-[1600px] mx-auto px-6 py-3"> |
| <div className="flex items-center justify-between"> |
| <div className="flex items-center gap-6"> |
| {/* Logo */} |
| <div className="flex items-center gap-3"> |
| <div className="w-10 h-10 bg-gradient-to-br from-[#7c3aed] to-[#4c1d95] rounded-lg flex items-center justify-center border border-[#7c3aed]/50 shadow-[0_0_15px_rgba(124,58,237,0.3)]"> |
| <Shield className="w-6 h-6 text-white" /> |
| </div> |
| <div> |
| <h1 className="text-lg font-bold tracking-wider text-white"> |
| RMI <span className="text-[#7c3aed]">COMMAND</span> |
| </h1> |
| <p className="text-xs text-gray-500 tracking-[0.2em]">ADVISOR PANEL // CLASSIFIED</p> |
| </div> |
| </div> |
| |
| {/* Classification Badge */} |
| <div className="flex items-center gap-2 px-4 py-1.5 bg-red-600/10 border border-red-500/30 rounded"> |
| <Lock className="w-4 h-4 text-red-400" /> |
| <span className="text-xs font-bold text-red-400 tracking-wider">TOP SECRET//SCI</span> |
| </div> |
| </div> |
| |
| <div className="flex items-center gap-6"> |
| {/* Threat Level */} |
| <div className="flex items-center gap-3"> |
| <span className="text-xs text-gray-500 uppercase tracking-wider">Threat Level</span> |
| <div className={`w-3 h-3 rounded-full ${getThreatLevelColor(dailyBriefing.threatLevel)}`} /> |
| <span className="text-sm font-bold uppercase text-orange-400">{dailyBriefing.threatLevel}</span> |
| </div> |
| |
| {/* Time */} |
| <div className="flex items-center gap-2 text-xs text-gray-500"> |
| <Clock className="w-4 h-4" /> |
| <span>{new Date().toUTCString()}</span> |
| </div> |
| |
| {/* Terminal Toggle */} |
| <button |
| onClick={() => setTerminalOpen(!terminalOpen)} |
| className="flex items-center gap-2 px-3 py-1.5 bg-[#7c3aed]/10 border border-[#7c3aed]/30 rounded hover:bg-[#7c3aed]/20 transition-all" |
| > |
| <Terminal className="w-4 h-4 text-[#7c3aed]" /> |
| <span className="text-xs">TERMINAL</span> |
| </button> |
| |
| {/* Human Override */} |
| <button |
| onClick={() => setHumanOverride(!humanOverride)} |
| className={`flex items-center gap-2 px-3 py-1.5 rounded border transition-all ${ |
| humanOverride |
| ? 'bg-green-500/20 border-green-500/50 text-green-400' |
| : 'bg-gray-800 border-gray-700 text-gray-400' |
| }`} |
| > |
| <Fingerprint className="w-4 h-4" /> |
| <span className="text-xs font-bold">{humanOverride ? 'HUMAN OVERRIDE ACTIVE' : 'AUTONOMOUS MODE'}</span> |
| </button> |
| |
| {/* Refresh */} |
| <button |
| onClick={handleRefresh} |
| disabled={refreshing} |
| className="flex items-center gap-2 px-3 py-1.5 bg-[#1a1525] border border-[#7c3aed]/30 rounded hover:bg-[#7c3aed]/10 transition-all" |
| > |
| <RefreshCw className={`w-4 h-4 text-[#7c3aed] ${refreshing ? 'animate-spin' : ''}`} /> |
| </button> |
| </div> |
| </div> |
| </div> |
| </div> |
| |
| {/* Secondary Navigation */} |
| <div className="bg-[#0f0c1d] border-b border-gray-800"> |
| <div className="max-w-[1600px] mx-auto px-6"> |
| <div className="flex items-center gap-1"> |
| {[ |
| { id: 'briefing', label: 'DAILY BRIEFING', icon: <LayoutDashboard className="w-4 h-4" /> }, |
| { id: 'intelligence', label: 'INTELLIGENCE', icon: <Binoculars className="w-4 h-4" /> }, |
| { id: 'operations', label: 'OPERATIONS', icon: <Server className="w-4 h-4" /> }, |
| { id: 'assets', label: 'ASSETS & WALLETS', icon: <Wallet className="w-4 h-4" /> }, |
| { id: 'domains', label: 'DOMAIN CONTROL', icon: <Globe className="w-4 h-4" /> }, |
| { id: 'data', label: 'DATA TRANSPARENCY', icon: <Database className="w-4 h-4" /> }, |
| ].map((tab) => ( |
| <button |
| key={tab.id} |
| onClick={() => setActiveTab(tab.id)} |
| className={`flex items-center gap-2 px-4 py-3 text-xs font-semibold tracking-wider transition-all border-b-2 ${ |
| activeTab === tab.id |
| ? 'text-[#7c3aed] border-[#7c3aed] bg-[#7c3aed]/5' |
| : 'text-gray-500 border-transparent hover:text-gray-300 hover:bg-gray-800/30' |
| }`} |
| > |
| {tab.icon} |
| {tab.label} |
| </button> |
| ))} |
| </div> |
| </div> |
| </div> |
| |
| {/* Main Content */} |
| <div className="max-w-[1600px] mx-auto p-6"> |
| {/* ============================================ */} |
| {/* DAILY BRIEFING TAB */} |
| {/* ============================================ */} |
| {activeTab === 'briefing' && ( |
| <div className="grid grid-cols-12 gap-6"> |
| {/* Chief Recommendations */} |
| <div className="col-span-8 space-y-4"> |
| <div className="flex items-center justify-between mb-2"> |
| <div className="flex items-center gap-3"> |
| <Brain className="w-6 h-6 text-[#7c3aed]" /> |
| <h2 className="text-xl font-bold tracking-wider"> |
| CHIEF OF STAFF <span className="text-[#7c3aed]">DIRECTIVE</span> |
| </h2> |
| </div> |
| <span className="text-xs text-gray-500">{dailyBriefing.chiefRecommendations.length} PRIORITY ACTIONS</span> |
| </div> |
| |
| {dailyBriefing.chiefRecommendations.map((rec, idx) => ( |
| <div |
| key={rec.id} |
| className="bg-gradient-to-r from-[#1a1525] to-[#0f0c1d] border border-gray-800 rounded-lg overflow-hidden hover:border-[#7c3aed]/30 transition-all" |
| > |
| <div |
| className="p-5 cursor-pointer" |
| onClick={() => setExpandedRec(expandedRec === rec.id ? null : rec.id)} |
| > |
| <div className="flex items-start gap-4"> |
| <div className="flex flex-col items-center gap-1"> |
| <span className="text-2xl font-bold text-gray-600">{String(idx + 1).padStart(2, '0')}</span> |
| <div className={`w-2 h-2 rounded-full ${ |
| rec.priority === 'critical' ? 'bg-red-500 animate-pulse' : |
| rec.priority === 'high' ? 'bg-orange-500' : |
| rec.priority === 'medium' ? 'bg-yellow-500' : |
| 'bg-green-500' |
| }`} /> |
| </div> |
| |
| <div className="flex-1"> |
| <div className="flex items-center gap-3 mb-2"> |
| <span className={`px-2 py-0.5 text-[10px] font-bold rounded uppercase ${ |
| rec.priority === 'critical' ? 'bg-red-500/20 text-red-400' : |
| rec.priority === 'high' ? 'bg-orange-500/20 text-orange-400' : |
| rec.priority === 'medium' ? 'bg-yellow-500/20 text-yellow-400' : |
| 'bg-green-500/20 text-green-400' |
| }`}> |
| {rec.priority} |
| </span> |
| <span className="px-2 py-0.5 text-[10px] bg-gray-800 text-gray-400 rounded uppercase"> |
| {rec.category} |
| </span> |
| <span className="text-xs text-gray-500">~{rec.estimatedTime}</span> |
| </div> |
| |
| <h3 className="text-lg font-semibold text-white mb-2">{rec.title}</h3> |
| <p className="text-sm text-gray-400 leading-relaxed">{rec.description}</p> |
| |
| <div className="flex items-center gap-2 mt-3 text-xs"> |
| <BarChart3 className="w-4 h-4 text-[#7c3aed]" /> |
| <span className="text-[#7c3aed]">Impact:</span> |
| <span className="text-gray-400">{rec.potentialImpact}</span> |
| </div> |
| </div> |
| |
| <div className="flex items-center gap-2"> |
| <button className="px-4 py-2 bg-[#7c3aed] hover:bg-[#6d28d9] text-white text-sm font-semibold rounded transition-all"> |
| EXECUTE |
| </button> |
| <button className="p-2 bg-gray-800 hover:bg-gray-700 rounded transition-all"> |
| {expandedRec === rec.id ? <ChevronUp className="w-5 h-5" /> : <ChevronDown className="w-5 h-5" />} |
| </button> |
| </div> |
| </div> |
| </div> |
| |
| {expandedRec === rec.id && ( |
| <div className="px-5 pb-5 border-t border-gray-800 pt-4 ml-12"> |
| <h4 className="text-xs font-bold text-gray-500 uppercase tracking-wider mb-3">Chief's Reasoning:</h4> |
| <ul className="space-y-2"> |
| {rec.reasoning.map((reason, ridx) => ( |
| <li key={ridx} className="flex items-start gap-3 text-sm text-gray-300"> |
| <ChevronRight className="w-4 h-4 text-[#7c3aed] mt-0.5 flex-shrink-0" /> |
| {reason} |
| </li> |
| ))} |
| </ul> |
| |
| <div className="flex gap-3 mt-4"> |
| <button className="flex items-center gap-2 px-4 py-2 bg-green-500/10 border border-green-500/30 rounded text-sm text-green-400 hover:bg-green-500/20 transition-all"> |
| <CheckCircle className="w-4 h-4" /> |
| APPROVE & ASSIGN |
| </button> |
| <button className="flex items-center gap-2 px-4 py-2 bg-red-500/10 border border-red-500/30 rounded text-sm text-red-400 hover:bg-red-500/20 transition-all"> |
| <AlertOctagon className="w-4 h-4" /> |
| DECLINE |
| </button> |
| <button className="flex items-center gap-2 px-4 py-2 bg-gray-800 border border-gray-700 rounded text-sm text-gray-400 hover:bg-gray-700 transition-all"> |
| <MessageSquare className="w-4 h-4" /> |
| REQUEST INFO |
| </button> |
| </div> |
| </div> |
| )} |
| </div> |
| ))} |
| </div> |
| |
| {/* Briefing Stats */} |
| <div className="col-span-4 space-y-4"> |
| <div className="bg-gradient-to-br from-[#1a1525] to-[#0f0c1d] border border-gray-800 rounded-lg p-5"> |
| <h3 className="text-sm font-bold text-gray-500 uppercase tracking-wider mb-4">Situation Summary</h3> |
| <div className="grid grid-cols-2 gap-4"> |
| <div className="bg-[#0a0812] rounded-lg p-4 border border-gray-800"> |
| <div className="text-3xl font-bold text-[#7c3aed]">{dailyBriefing.totalActiveOperations}</div> |
| <div className="text-xs text-gray-500 uppercase">Active Operations</div> |
| </div> |
| <div className="bg-[#0a0812] rounded-lg p-4 border border-gray-800"> |
| <div className="text-3xl font-bold text-green-400">{dailyBriefing.newIntel}</div> |
| <div className="text-xs text-gray-500 uppercase">New Intel Items</div> |
| </div> |
| <div className="bg-[#0a0812] rounded-lg p-4 border border-gray-800"> |
| <div className="text-3xl font-bold text-orange-400">{dailyBriefing.requiresDecision}</div> |
| <div className="text-xs text-gray-500 uppercase">Pending Decisions</div> |
| </div> |
| <div className="bg-[#0a0812] rounded-lg p-4 border border-gray-800"> |
| <div className="text-3xl font-bold text-blue-400">15/18</div> |
| <div className="text-xs text-gray-500 uppercase">Swarm Online</div> |
| </div> |
| </div> |
| </div> |
| |
| {/* Critical Alerts */} |
| <div className="bg-gradient-to-br from-red-900/20 to-[#0f0c1d] border border-red-500/30 rounded-lg p-5"> |
| <h3 className="text-sm font-bold text-red-400 uppercase tracking-wider mb-4 flex items-center gap-2"> |
| <AlertTriangle className="w-4 h-4" /> |
| Critical Alerts |
| </h3> |
| <div className="space-y-3"> |
| <div className="flex items-start gap-3 p-3 bg-red-500/10 rounded-lg border border-red-500/20"> |
| <ShieldAlert className="w-5 h-5 text-red-400 flex-shrink-0" /> |
| <div> |
| <div className="text-sm font-semibold text-red-400">Fake RMI Airdrop Active</div> |
| <div className="text-xs text-gray-400">10m ago • 23 wallets compromised</div> |
| </div> |
| </div> |
| <div className="flex items-start gap-3 p-3 bg-orange-500/10 rounded-lg border border-orange-500/20"> |
| <AlertTriangle className="w-5 h-5 text-orange-400 flex-shrink-0" /> |
| <div> |
| <div className="text-sm font-semibold text-orange-400">SEC Scrutiny Increase</div> |
| <div className="text-xs text-gray-400">2d ago • Token compliance review needed</div> |
| </div> |
| </div> |
| </div> |
| </div> |
| |
| {/* System Health */} |
| <div className="bg-gradient-to-br from-[#1a1525] to-[#0f0c1d] border border-gray-800 rounded-lg p-5"> |
| <h3 className="text-sm font-bold text-gray-500 uppercase tracking-wider mb-4">System Health</h3> |
| <div className="space-y-3"> |
| <div> |
| <div className="flex justify-between text-xs mb-1"> |
| <span className="text-gray-400">API Response Time</span> |
| <span className="text-orange-400">450ms ⚠️</span> |
| </div> |
| <div className="h-2 bg-gray-800 rounded-full overflow-hidden"> |
| <div className="h-full w-[75%] bg-orange-500 rounded-full" /> |
| </div> |
| </div> |
| <div> |
| <div className="flex justify-between text-xs mb-1"> |
| <span className="text-gray-400">Swarm Efficiency</span> |
| <span className="text-green-400">94% ✅</span> |
| </div> |
| <div className="h-2 bg-gray-800 rounded-full overflow-hidden"> |
| <div className="h-full w-[94%] bg-green-500 rounded-full" /> |
| </div> |
| </div> |
| <div> |
| <div className="flex justify-between text-xs mb-1"> |
| <span className="text-gray-400">Bot Uptime</span> |
| <span className="text-green-400">99.2% ✅</span> |
| </div> |
| <div className="h-2 bg-gray-800 rounded-full overflow-hidden"> |
| <div className="h-full w-[99%] bg-green-500 rounded-full" /> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| )} |
| |
| {/* ============================================ */} |
| {/* INTELLIGENCE TAB */} |
| {/* ============================================ */} |
| {activeTab === 'intelligence' && ( |
| <div className="grid grid-cols-12 gap-6"> |
| {/* Advisor Selection */} |
| <div className="col-span-2 space-y-2"> |
| {advisors.filter(a => a.id !== 'chief').map((advisor) => ( |
| <button |
| key={advisor.id} |
| onClick={() => setActiveAdvisor(advisor.id)} |
| className={`w-full p-3 rounded-lg border text-left transition-all ${ |
| activeAdvisor === advisor.id |
| ? 'bg-[#7c3aed]/20 border-[#7c3aed]' |
| : 'bg-[#1a1525]/50 border-gray-800 hover:border-[#7c3aed]/30' |
| }`} |
| > |
| <div className="flex items-center gap-2 mb-1"> |
| {advisor.icon} |
| <span className="text-xs font-bold text-gray-500">{advisor.codename}</span> |
| </div> |
| <div className="text-sm font-semibold">{advisor.name}</div> |
| <div className="text-xs text-gray-500 mt-1">{advisor.insights.filter(i => i.priority === 'critical' || i.priority === 'high').length} alerts</div> |
| </button> |
| ))} |
| </div> |
| |
| {/* Intelligence Feed */} |
| <div className="col-span-7 space-y-4"> |
| <div className="flex items-center justify-between"> |
| <div> |
| <h2 className="text-xl font-bold flex items-center gap-2"> |
| {currentAdvisor.icon} |
| {currentAdvisor.name} |
| </h2> |
| <p className="text-xs text-gray-500 mt-1">{currentAdvisor.description}</p> |
| </div> |
| <div className="flex items-center gap-2 text-xs text-gray-500"> |
| <span className="px-2 py-1 bg-gray-800 rounded">CLEARANCE L-{currentAdvisor.clearanceLevel}</span> |
| <span>Updated {currentAdvisor.lastUpdated}</span> |
| </div> |
| </div> |
| |
| {currentAdvisor.insights.map((insight) => ( |
| <div |
| key={insight.id} |
| className={`bg-gradient-to-r from-[#1a1525] to-[#0f0c1d] border rounded-lg overflow-hidden transition-all ${ |
| insight.classified ? 'border-red-500/30' : 'border-gray-800 hover:border-[#7c3aed]/30' |
| }`} |
| > |
| <div |
| className="p-5 cursor-pointer" |
| onClick={() => setExpandedInsight(expandedInsight === insight.id ? null : insight.id)} |
| > |
| <div className="flex items-start justify-between mb-3"> |
| <div className="flex items-center gap-3"> |
| {getInsightIcon(insight.type)} |
| <div> |
| <h3 className="font-semibold text-lg">{insight.title}</h3> |
| <span className="text-xs text-gray-500"> |
| {insight.source} • {insight.timestamp} |
| </span> |
| </div> |
| </div> |
| <div className="flex items-center gap-2"> |
| {insight.classified && ( |
| <span className="px-2 py-1 bg-red-500/20 text-red-400 text-xs font-bold rounded uppercase"> |
| Classified |
| </span> |
| )} |
| <span className={`px-3 py-1 rounded text-xs font-bold border ${getPriorityColor(insight.priority)}`}> |
| {insight.priority.toUpperCase()} |
| </span> |
| </div> |
| </div> |
| |
| <p className="text-gray-300 text-sm leading-relaxed">{insight.description}</p> |
| |
| {insight.impact && ( |
| <div className="mt-3 flex items-center gap-2 text-sm"> |
| <Target className="w-4 h-4 text-[#7c3aed]" /> |
| <span className="text-[#7c3aed] font-medium">Impact:</span> |
| <span className="text-gray-400">{insight.impact}</span> |
| </div> |
| )} |
| </div> |
| |
| {expandedInsight === insight.id && insight.evidence && ( |
| <div className="px-5 pb-5 border-t border-gray-800 pt-4"> |
| <h4 className="text-xs font-bold text-gray-500 uppercase tracking-wider mb-3">Evidence:</h4> |
| <ul className="space-y-2"> |
| {insight.evidence.map((item, idx) => ( |
| <li key={idx} className="flex items-start gap-2 text-sm text-gray-300"> |
| <CheckCircle className="w-4 h-4 text-[#7c3aed] mt-0.5 flex-shrink-0" /> |
| {item} |
| </li> |
| ))} |
| </ul> |
| </div> |
| )} |
| </div> |
| ))} |
| </div> |
| |
| {/* Action Queue */} |
| <div className="col-span-3 space-y-4"> |
| <div className="bg-gradient-to-br from-[#1a1525] to-[#0f0c1d] border border-gray-800 rounded-lg p-5"> |
| <h3 className="text-sm font-bold text-gray-500 uppercase tracking-wider mb-4">Action Queue</h3> |
| <div className="space-y-3"> |
| {currentAdvisor.actions.map((action) => ( |
| <div |
| key={action.id} |
| className="p-3 bg-[#0a0812] rounded-lg border border-gray-800" |
| > |
| <div className="text-sm mb-2">{action.label}</div> |
| <div className="flex items-center justify-between"> |
| <span className={`text-xs px-2 py-1 rounded ${ |
| action.status === 'completed' ? 'bg-green-500/20 text-green-400' : |
| action.status === 'in_progress' ? 'bg-blue-500/20 text-blue-400' : |
| action.status === 'requires_approval' ? 'bg-yellow-500/20 text-yellow-400' : |
| 'bg-gray-700 text-gray-400' |
| }`}> |
| {action.status.replace('_', ' ').toUpperCase()} |
| </span> |
| {action.requiresAuth && ( |
| <Lock className="w-4 h-4 text-yellow-400" /> |
| )} |
| </div> |
| {action.status === 'requires_approval' && humanOverride && ( |
| <button className="w-full mt-2 py-1.5 bg-[#7c3aed] text-white text-xs font-semibold rounded hover:bg-[#6d28d9] transition-all"> |
| AUTHORIZE |
| </button> |
| )} |
| </div> |
| ))} |
| </div> |
| </div> |
| </div> |
| </div> |
| )} |
| |
| {/* ============================================ */} |
| {/* OPERATIONS TAB */} |
| {/* ============================================ */} |
| {activeTab === 'operations' && ( |
| <div className="space-y-6"> |
| {/* Swarm Status */} |
| <div className="grid grid-cols-4 gap-4"> |
| <div className="bg-gradient-to-br from-[#1a1525] to-[#0f0c1d] border border-gray-800 rounded-lg p-5"> |
| <div className="flex items-center gap-2 mb-2"> |
| <Sparkles className="w-5 h-5 text-[#7c3aed]" /> |
| <span className="text-xs text-gray-500 uppercase">AI Swarm</span> |
| </div> |
| <div className="text-3xl font-bold">{swarmStatus.activeAgents}/{swarmStatus.totalAgents}</div> |
| <div className="text-xs text-green-400">Agents Online</div> |
| </div> |
| <div className="bg-gradient-to-br from-[#1a1525] to-[#0f0c1d] border border-gray-800 rounded-lg p-5"> |
| <div className="flex items-center gap-2 mb-2"> |
| <Activity className="w-5 h-5 text-blue-400" /> |
| <span className="text-xs text-gray-500 uppercase">Queue</span> |
| </div> |
| <div className="text-3xl font-bold">{swarmStatus.tasksInQueue}</div> |
| <div className="text-xs text-gray-400">Tasks Pending</div> |
| </div> |
| <div className="bg-gradient-to-br from-[#1a1525] to-[#0f0c1d] border border-gray-800 rounded-lg p-5"> |
| <div className="flex items-center gap-2 mb-2"> |
| <Clock className="w-5 h-5 text-yellow-400" /> |
| <span className="text-xs text-gray-500 uppercase">Avg Process</span> |
| </div> |
| <div className="text-3xl font-bold">{swarmStatus.avgProcessingTime}</div> |
| <div className="text-xs text-green-400">Per Task</div> |
| </div> |
| <div className="bg-gradient-to-br from-[#1a1525] to-[#0f0c1d] border border-gray-800 rounded-lg p-5"> |
| <div className="flex items-center gap-2 mb-2"> |
| <HeartPulse className="w-5 h-5 text-green-400" /> |
| <span className="text-xs text-gray-500 uppercase">Health</span> |
| </div> |
| <div className="text-3xl font-bold">{swarmStatus.healthScore}%</div> |
| <div className="text-xs text-green-400">Optimal</div> |
| </div> |
| </div> |
| |
| {/* Bot Management */} |
| <div className="bg-gradient-to-br from-[#1a1525] to-[#0f0c1d] border border-gray-800 rounded-lg p-6"> |
| <div className="flex items-center justify-between mb-6"> |
| <h3 className="text-lg font-bold flex items-center gap-2"> |
| <Bot className="w-5 h-5 text-[#7c3aed]" /> |
| Bot Fleet Management |
| </h3> |
| <div className="flex items-center gap-2"> |
| <span className="text-xs text-gray-500">Human Control:</span> |
| <span className={`text-xs font-bold ${humanOverride ? 'text-green-400' : 'text-gray-400'}`}> |
| {humanOverride ? 'ENABLED' : 'AUTONOMOUS'} |
| </span> |
| </div> |
| </div> |
| |
| <div className="grid grid-cols-3 gap-4"> |
| {botStatuses.map((bot) => ( |
| <div key={bot.id} className="bg-[#0a0812] rounded-lg p-4 border border-gray-800"> |
| <div className="flex items-center justify-between mb-3"> |
| <div className="flex items-center gap-2"> |
| <Bot className={`w-5 h-5 ${ |
| bot.status === 'active' ? 'text-green-400' : |
| bot.status === 'standby' ? 'text-yellow-400' : |
| bot.status === 'maintenance' ? 'text-orange-400' : |
| 'text-red-400' |
| }`} /> |
| <span className="font-semibold text-sm">{bot.name}</span> |
| </div> |
| <div className={`w-2 h-2 rounded-full ${ |
| bot.status === 'active' ? 'bg-green-500' : |
| bot.status === 'standby' ? 'bg-yellow-500' : |
| bot.status === 'maintenance' ? 'bg-orange-500' : |
| 'bg-red-500' |
| }`} /> |
| </div> |
| <div className="text-xs text-gray-500 mb-3">{bot.role}</div> |
| <div className="grid grid-cols-2 gap-2 text-xs mb-3"> |
| <div className="text-gray-400">Msgs: <span className="text-white">{bot.messagesHandled.toLocaleString()}</span></div> |
| <div className="text-gray-400">Swarms: <span className="text-white">{bot.swarmsAllocated}</span></div> |
| </div> |
| <div className="text-xs text-gray-500 mb-3">Last: {bot.lastActivity}</div> |
| {humanOverride && ( |
| <div className="flex gap-2"> |
| {bot.status === 'active' ? ( |
| <button className="flex-1 py-1.5 bg-red-500/10 border border-red-500/30 rounded text-xs text-red-400 hover:bg-red-500/20 transition-all"> |
| <Pause className="w-3 h-3 inline mr-1" /> |
| PAUSE |
| </button> |
| ) : ( |
| <button className="flex-1 py-1.5 bg-green-500/10 border border-green-500/30 rounded text-xs text-green-400 hover:bg-green-500/20 transition-all"> |
| <Play className="w-3 h-3 inline mr-1" /> |
| ACTIVATE |
| </button> |
| )} |
| <button className="flex-1 py-1.5 bg-gray-800 border border-gray-700 rounded text-xs text-gray-400 hover:bg-gray-700 transition-all"> |
| <Settings className="w-3 h-3 inline mr-1" /> |
| CONFIG |
| </button> |
| </div> |
| )} |
| </div> |
| ))} |
| </div> |
| </div> |
| </div> |
| )} |
| |
| {/* ============================================ */} |
| {/* ASSETS & WALLETS TAB */} |
| {/* ============================================ */} |
| {activeTab === 'assets' && ( |
| <div className="space-y-6"> |
| <div className="flex items-center justify-between"> |
| <h2 className="text-xl font-bold flex items-center gap-2"> |
| <Wallet className="w-6 h-6 text-[#7c3aed]" /> |
| Treasury Management |
| </h2> |
| <div className="flex items-center gap-2"> |
| <span className="text-xs text-gray-500">Human-in-the-Loop:</span> |
| <span className={`px-2 py-1 rounded text-xs font-bold ${humanOverride ? 'bg-green-500/20 text-green-400' : 'bg-gray-800 text-gray-400'}`}> |
| {humanOverride ? 'APPROVAL REQUIRED' : 'AUTONOMOUS'} |
| </span> |
| </div> |
| </div> |
| |
| <div className="grid grid-cols-2 gap-4"> |
| {walletData.map((wallet) => ( |
| <div key={wallet.address} className="bg-gradient-to-br from-[#1a1525] to-[#0f0c1d] border border-gray-800 rounded-lg p-5"> |
| <div className="flex items-center justify-between mb-4"> |
| <div className="flex items-center gap-3"> |
| <div className="w-10 h-10 bg-[#7c3aed]/10 rounded-lg flex items-center justify-center"> |
| <Key className="w-5 h-5 text-[#7c3aed]" /> |
| </div> |
| <div> |
| <div className="font-semibold">{wallet.purpose}</div> |
| <div className="text-xs text-gray-500 font-mono">{wallet.address}</div> |
| </div> |
| </div> |
| <div className={`px-2 py-1 rounded text-xs ${wallet.requiresApproval ? 'bg-yellow-500/20 text-yellow-400' : 'bg-green-500/20 text-green-400'}`}> |
| {wallet.requiresApproval ? 'MULTISIG' : 'OPERATIONAL'} |
| </div> |
| </div> |
| |
| <div className="grid grid-cols-3 gap-4 mb-4"> |
| <div> |
| <div className="text-2xl font-bold text-white">{wallet.balance}</div> |
| <div className="text-xs text-gray-500">Balance</div> |
| </div> |
| <div> |
| <div className="text-sm font-semibold text-gray-300">{wallet.network}</div> |
| <div className="text-xs text-gray-500">Network</div> |
| </div> |
| <div> |
| <div className="text-sm font-semibold text-gray-300">{wallet.lastTx}</div> |
| <div className="text-xs text-gray-500">Last Activity</div> |
| </div> |
| </div> |
| |
| {humanOverride && ( |
| <div className="flex gap-2"> |
| <button className="flex-1 py-2 bg-[#7c3aed]/10 border border-[#7c3aed]/30 rounded text-sm text-[#7c3aed] hover:bg-[#7c3aed]/20 transition-all"> |
| INITIATE TRANSFER |
| </button> |
| <button className="flex-1 py-2 bg-gray-800 border border-gray-700 rounded text-sm text-gray-400 hover:bg-gray-700 transition-all"> |
| VIEW HISTORY |
| </button> |
| </div> |
| )} |
| </div> |
| ))} |
| </div> |
| |
| {/* Transaction History */} |
| <div className="bg-gradient-to-br from-[#1a1525] to-[#0f0c1d] border border-gray-800 rounded-lg p-6"> |
| <h3 className="text-lg font-bold mb-4">Recent Transactions (Human-Approved)</h3> |
| <div className="overflow-x-auto"> |
| <table className="w-full text-sm"> |
| <thead> |
| <tr className="text-left text-xs text-gray-500 uppercase tracking-wider border-b border-gray-800"> |
| <th className="pb-3">Timestamp</th> |
| <th className="pb-3">Type</th> |
| <th className="pb-3">Amount</th> |
| <th className="pb-3">From → To</th> |
| <th className="pb-3">Purpose</th> |
| <th className="pb-3">Status</th> |
| </tr> |
| </thead> |
| <tbody className="text-gray-300"> |
| <tr className="border-b border-gray-800/50"> |
| <td className="py-3">2026-04-14 08:23:15 UTC</td> |
| <td className="py-3"><span className="text-green-400">IN</span></td> |
| <td className="py-3">+12.5 ETH</td> |
| <td className="py-3 font-mono text-xs">0x...a1b2 → Treasury</td> |
| <td className="py-3">Subscription Revenue</td> |
| <td className="py-3"><span className="text-green-400">✓ Confirmed</span></td> |
| </tr> |
| <tr className="border-b border-gray-800/50"> |
| <td className="py-3">2026-04-13 14:45:22 UTC</td> |
| <td className="py-3"><span className="text-red-400">OUT</span></td> |
| <td className="py-3">-5.2 ETH</td> |
| <td className="py-3 font-mono text-xs">Operations → 0x...c3d4</td> |
| <td className="py-3">Server Infrastructure</td> |
| <td className="py-3"><span className="text-green-400">✓ Approved</span></td> |
| </tr> |
| <tr> |
| <td className="py-3">2026-04-13 09:12:08 UTC</td> |
| <td className="py-3"><span className="text-red-400">OUT</span></td> |
| <td className="py-3">-2.0 ETH</td> |
| <td className="py-3 font-mono text-xs">Treasury → 0x...e5f6</td> |
| <td className="py-3">Staking Rewards Distribution</td> |
| <td className="py-3"><span className="text-green-400">✓ Approved</span></td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| </div> |
| </div> |
| )} |
| |
| {/* ============================================ */} |
| {/* DOMAIN CONTROL TAB */} |
| {/* ============================================ */} |
| {activeTab === 'domains' && ( |
| <div className="space-y-6"> |
| <div className="flex items-center justify-between"> |
| <h2 className="text-xl font-bold flex items-center gap-2"> |
| <Globe className="w-6 h-6 text-[#7c3aed]" /> |
| Domain Portfolio Control |
| </h2> |
| <button className="px-4 py-2 bg-[#7c3aed] hover:bg-[#6d28d9] text-white text-sm font-semibold rounded transition-all"> |
| + REGISTER NEW DOMAIN |
| </button> |
| </div> |
| |
| <div className="grid grid-cols-2 gap-4"> |
| {domainStatuses.map((domain) => ( |
| <div key={domain.domain} className="bg-gradient-to-br from-[#1a1525] to-[#0f0c1d] border border-gray-800 rounded-lg p-5"> |
| <div className="flex items-center justify-between mb-4"> |
| <div className="flex items-center gap-3"> |
| <Globe className="w-5 h-5 text-[#7c3aed]" /> |
| <span className="text-lg font-semibold">{domain.domain}</span> |
| </div> |
| <span className={`px-3 py-1 rounded text-xs font-bold ${ |
| domain.status === 'active' ? 'bg-green-500/20 text-green-400' : |
| domain.status === 'expiring' ? 'bg-red-500/20 text-red-400' : |
| domain.status === 'pending' ? 'bg-yellow-500/20 text-yellow-400' : |
| 'bg-gray-700 text-gray-400' |
| }`}> |
| {domain.status.toUpperCase()} |
| </span> |
| </div> |
| |
| <div className="grid grid-cols-4 gap-4 mb-4 text-center"> |
| <div className="bg-[#0a0812] rounded p-3"> |
| <div className="text-lg font-bold text-white">{domain.traffic24h.toLocaleString()}</div> |
| <div className="text-xs text-gray-500">24h Visits</div> |
| </div> |
| <div className="bg-[#0a0812] rounded p-3"> |
| <div className="text-lg font-bold text-white">{domain.expiresAt}</div> |
| <div className="text-xs text-gray-500">Expires</div> |
| </div> |
| <div className={`rounded p-3 ${domain.sslStatus === 'valid' ? 'bg-green-500/10' : 'bg-red-500/10'}`}> |
| <div className={`text-lg font-bold ${domain.sslStatus === 'valid' ? 'text-green-400' : 'text-red-400'}`}> |
| {domain.sslStatus === 'valid' ? '✓' : '✗'} |
| </div> |
| <div className="text-xs text-gray-500">SSL</div> |
| </div> |
| <div className={`rounded p-3 ${domain.dnsHealth === 'healthy' ? 'bg-green-500/10' : domain.dnsHealth === 'issues' ? 'bg-yellow-500/10' : 'bg-red-500/10'}`}> |
| <div className={`text-lg font-bold ${domain.dnsHealth === 'healthy' ? 'text-green-400' : domain.dnsHealth === 'issues' ? 'text-yellow-400' : 'text-red-400'}`}> |
| {domain.dnsHealth === 'healthy' ? '✓' : domain.dnsHealth === 'issues' ? '!' : '✗'} |
| </div> |
| <div className="text-xs text-gray-500">DNS</div> |
| </div> |
| </div> |
| |
| <div className="flex gap-2"> |
| <button className="flex-1 py-2 bg-[#7c3aed]/10 border border-[#7c3aed]/30 rounded text-sm text-[#7c3aed] hover:bg-[#7c3aed]/20 transition-all"> |
| DNS SETTINGS |
| </button> |
| <button className="flex-1 py-2 bg-gray-800 border border-gray-700 rounded text-sm text-gray-400 hover:bg-gray-700 transition-all"> |
| ANALYTICS |
| </button> |
| <button className="flex-1 py-2 bg-gray-800 border border-gray-700 rounded text-sm text-gray-400 hover:bg-gray-700 transition-all"> |
| RENEW |
| </button> |
| </div> |
| </div> |
| ))} |
| </div> |
| |
| {/* Traffic Analytics */} |
| <div className="bg-gradient-to-br from-[#1a1525] to-[#0f0c1d] border border-gray-800 rounded-lg p-6"> |
| <h3 className="text-lg font-bold mb-4 flex items-center gap-2"> |
| <BarChart3 className="w-5 h-5 text-[#7c3aed]" /> |
| Network Traffic Analysis |
| </h3> |
| <div className="h-64 bg-[#0a0812] rounded-lg flex items-center justify-center border border-gray-800"> |
| <div className="text-center text-gray-500"> |
| <Activity className="w-12 h-12 mx-auto mb-2 opacity-50" /> |
| <p>Traffic visualization loaded from Plausible/Analytics API</p> |
| <p className="text-sm mt-1">Total: 145.2K visits (24h) • Peak: 8,420 (14:00 UTC)</p> |
| </div> |
| </div> |
| </div> |
| </div> |
| )} |
| |
| {/* ============================================ */} |
| {/* DATA TRANSPARENCY TAB */} |
| {/* ============================================ */} |
| {activeTab === 'data' && ( |
| <div className="space-y-6"> |
| <div className="flex items-center justify-between"> |
| <h2 className="text-xl font-bold flex items-center gap-2"> |
| <Database className="w-6 h-6 text-[#7c3aed]" /> |
| Data Usage Transparency |
| </h2> |
| <div className="flex items-center gap-2 px-4 py-2 bg-green-500/10 border border-green-500/30 rounded-lg"> |
| <CheckCircle className="w-4 h-4 text-green-400" /> |
| <span className="text-sm text-green-400">Human Verification Active</span> |
| </div> |
| </div> |
| |
| <div className="bg-gradient-to-br from-[#1a1525] to-[#0f0c1d] border border-gray-800 rounded-lg p-6"> |
| <h3 className="text-lg font-bold mb-4">Data Processing Pipeline</h3> |
| <div className="overflow-x-auto"> |
| <table className="w-full text-sm"> |
| <thead> |
| <tr className="text-left text-xs text-gray-500 uppercase tracking-wider border-b border-gray-800"> |
| <th className="pb-3">Category</th> |
| <th className="pb-3">Source</th> |
| <th className="pb-3">Records Processed</th> |
| <th className="pb-3">Storage</th> |
| <th className="pb-3">Last Updated</th> |
| <th className="pb-3">Human Verified</th> |
| </tr> |
| </thead> |
| <tbody className="text-gray-300"> |
| {dataUsageMetrics.map((metric, idx) => ( |
| <tr key={idx} className="border-b border-gray-800/50"> |
| <td className="py-3 font-semibold">{metric.category}</td> |
| <td className="py-3 text-gray-400">{metric.source}</td> |
| <td className="py-3">{metric.recordsProcessed.toLocaleString()}</td> |
| <td className="py-3">{metric.storageUsed}</td> |
| <td className="py-3 text-gray-400">{metric.lastUpdated}</td> |
| <td className="py-3"> |
| {metric.humanVerified ? ( |
| <span className="flex items-center gap-1 text-green-400"> |
| <CheckCircle className="w-4 h-4" /> |
| Verified |
| </span> |
| ) : ( |
| <span className="flex items-center gap-1 text-yellow-400"> |
| <Clock className="w-4 h-4" /> |
| Pending |
| </span> |
| )} |
| </td> |
| </tr> |
| ))} |
| </tbody> |
| </table> |
| </div> |
| </div> |
| |
| <div className="grid grid-cols-2 gap-6"> |
| <div className="bg-gradient-to-br from-[#1a1525] to-[#0f0c1d] border border-gray-800 rounded-lg p-6"> |
| <h3 className="text-lg font-bold mb-4">Privacy & Retention</h3> |
| <div className="space-y-4"> |
| <div className="flex items-center justify-between p-3 bg-[#0a0812] rounded-lg"> |
| <div className="flex items-center gap-2"> |
| <Lock className="w-4 h-4 text-[#7c3aed]" /> |
| <span className="text-sm">Wallet addresses anonymized</span> |
| </div> |
| <CheckCircle className="w-4 h-4 text-green-400" /> |
| </div> |
| <div className="flex items-center justify-between p-3 bg-[#0a0812] rounded-lg"> |
| <div className="flex items-center gap-2"> |
| <Users className="w-4 h-4 text-[#7c3aed]" /> |
| <span className="text-sm">PII purged after 90 days</span> |
| </div> |
| <CheckCircle className="w-4 h-4 text-green-400" /> |
| </div> |
| <div className="flex items-center justify-between p-3 bg-[#0a0812] rounded-lg"> |
| <div className="flex items-center gap-2"> |
| <Database className="w-4 h-4 text-[#7c3aed]" /> |
| <span className="text-sm">Contract data retained indefinitely</span> |
| </div> |
| <span className="text-xs text-gray-500">Public blockchain data</span> |
| </div> |
| <div className="flex items-center justify-between p-3 bg-[#0a0812] rounded-lg"> |
| <div className="flex items-center gap-2"> |
| <MessageSquare className="w-4 h-4 text-[#7c3aed]" /> |
| <span className="text-sm">Snitch reports encrypted</span> |
| </div> |
| <CheckCircle className="w-4 h-4 text-green-400" /> |
| </div> |
| </div> |
| </div> |
| |
| <div className="bg-gradient-to-br from-[#1a1525] to-[#0f0c1d] border border-gray-800 rounded-lg p-6"> |
| <h3 className="text-lg font-bold mb-4">AI Decision Audit Log</h3> |
| <div className="space-y-3 max-h-64 overflow-y-auto"> |
| <div className="p-3 bg-[#0a0812] rounded-lg border-l-2 border-green-500"> |
| <div className="flex items-center justify-between mb-1"> |
| <span className="text-xs text-green-400">AUTO-APPROVED</span> |
| <span className="text-xs text-gray-500">2m ago</span> |
| </div> |
| <div className="text-sm">Low-risk contract scan (score: 23/100)</div> |
| <div className="text-xs text-gray-500 mt-1">No human intervention required</div> |
| </div> |
| <div className="p-3 bg-[#0a0812] rounded-lg border-l-2 border-yellow-500"> |
| <div className="flex items-center justify-between mb-1"> |
| <span className="text-xs text-yellow-400">HUMAN REVIEW REQUESTED</span> |
| <span className="text-xs text-gray-500">15m ago</span> |
| </div> |
| <div className="text-sm">High-value transfer (50+ ETH)</div> |
| <div className="text-xs text-gray-500 mt-1">Awaiting authorization</div> |
| </div> |
| <div className="p-3 bg-[#0a0812] rounded-lg border-l-2 border-red-500"> |
| <div className="flex items-center justify-between mb-1"> |
| <span className="text-xs text-red-400">HUMAN OVERRULED</span> |
| <span className="text-xs text-gray-500">1h ago</span> |
| </div> |
| <div className="text-sm">Auto-blocked contract marked safe by admin</div> |
| <div className="text-xs text-gray-500 mt-1">Transaction hash: 0x...a1b2</div> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| )} |
| </div> |
| |
| {/* Terminal Overlay */} |
| {terminalOpen && ( |
| <div className="fixed bottom-0 left-0 right-0 h-64 bg-[#0a0812] border-t border-[#7c3aed]/30 z-50"> |
| <div className="flex items-center justify-between px-4 py-2 bg-[#1a1525] border-b border-gray-800"> |
| <span className="text-xs text-gray-500 uppercase tracking-wider">Secure Terminal // Root Access</span> |
| <button onClick={() => setTerminalOpen(false)} className="text-gray-500 hover:text-white"> |
| <Power className="w-4 h-4" /> |
| </button> |
| </div> |
| <div className="p-4 font-mono text-sm text-green-400 overflow-y-auto h-[calc(100%-40px)]"> |
| <div className="text-gray-500"># RMI Command Interface v2.0</div> |
| <div className="text-gray-500"># Type 'help' for available commands</div> |
| <div className="mt-2"> |
| <span className="text-[#7c3aed]">root@rmi-command:~$</span> <span className="animate-pulse">_</span> |
| </div> |
| </div> |
| </div> |
| )} |
| |
| {/* Footer */} |
| <div className="max-w-[1600px] mx-auto mt-12 pt-6 border-t border-gray-800 text-center"> |
| <div className="flex items-center justify-center gap-6 text-xs text-gray-600"> |
| <span>RMI COMMAND v2.0</span> |
| <span>•</span> |
| <span>SECURITY CLASSIFICATION: TOP SECRET//SCI</span> |
| <span>•</span> |
| <span>Authorized Personnel Only</span> |
| <span>•</span> |
| <span>All Activity Logged</span> |
| </div> |
| </div> |
| </div> |
| ); |
| }; |
|
|
| |
| const HeartPulse = ({ className }: { className?: string }) => ( |
| <svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor"> |
| <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z" /> |
| </svg> |
| ); |
|
|
| export default AdvisorPanel; |
|
|