'use client'; import React, { useState, useEffect } from 'react'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Brain, Activity, Rocket, BarChart3, Zap, CheckCircle, AlertCircle, TrendingUp, Clock, Cpu, RefreshCw, ArrowRight, Play, Settings, Eye, Download } from 'lucide-react'; import AIArchitectPanel from './AIArchitectPanel'; import BackendStatusIndicator from './BackendStatusIndicator'; interface AIArchitectStats { total_workflows: number; completed_workflows: number; failed_workflows: number; running_workflows: number; success_rate: number; average_consciousness_score: number; domain_distribution: Record; system_status: string; architect_initialized: boolean; } interface RealtimeMetrics { requests_last_hour: number; success_rate_last_hour: number; avg_consciousness_last_hour: number; active_domains_last_hour: number; total_requests_today: number; timestamp: string; } export default function EnhancedDashboard() { const [activeTab, setActiveTab] = useState('architect'); const [aiStats, setAiStats] = useState(null); const [realtimeMetrics, setRealtimeMetrics] = useState(null); const [isLoading, setIsLoading] = useState(false); const [lastRefresh, setLastRefresh] = useState(new Date()); const [isClient, setIsClient] = useState(false); // Mock quick templates const quickTemplates = [ { name: 'Image Classification CNN', description: 'CNN with attention mechanisms for image classification', consciousness: 92, prompt: 'Create a deep learning image classification system using CNN with attention mechanisms for high accuracy image recognition' }, { name: 'Transformer for NLP', description: 'BERT-based transformer for natural language processing', consciousness: 88, prompt: 'Build a BERT-based transformer model for natural language processing tasks like sentiment analysis and text classification' }, { name: 'Time Series LSTM', description: 'LSTM network for time series prediction', consciousness: 85, prompt: 'Create an LSTM neural network for time series forecasting and prediction with feature engineering' }, { name: 'Multimodal Fusion', description: 'Combines text and image processing', consciousness: 94, prompt: 'Build a multimodal AI system that combines computer vision and natural language processing for comprehensive analysis' } ]; // Smart API base detection with fallbacks const getApiBase = () => { if (typeof window === 'undefined') return process.env.NEXT_PUBLIC_TRAINING_API_BASE || 'http://localhost:9006'; const fallbacks = [ process.env.NEXT_PUBLIC_TRAINING_API_BASE, 'http://localhost:9006', 'http://127.0.0.1:9006', 'http://0.0.0.0:9006' ].filter(Boolean) as string[]; return fallbacks[0]; // Use first fallback for now }; // duplicate smartFetch removed (using single robust smartFetch below) // Function to handle quick template generation const API_BASE = getApiBase(); // Robust fetch that tries alternative backends if the primary base is unreachable const smartFetch = async (path: string, init?: RequestInit) => { const candidates = [ API_BASE, 'http://127.0.0.1:9006', (typeof window !== 'undefined' && window.location ? window.location.origin.replace(':9002', ':9006') : ''), 'http://0.0.0.0:9006' ].filter(Boolean) as string[]; let lastErr: any = null; for (const base of candidates) { try { const res = await fetch(`${base}${path}`, init); if (res.ok || res.status < 500) return res; lastErr = new Error(`HTTP ${res.status}`); } catch (e) { lastErr = e; } } throw lastErr || new Error('Failed to fetch'); }; const handleQuickGeneration = async (template: any) => { try { setIsLoading(true); console.log(`🚀 Generating quick template: ${template.name}`); // Call the real AI architect with the template prompt const controller = new AbortController(); const timeout = setTimeout(() => controller.abort(), 6000); const response = await fetch(`${API_BASE}/api/ai-architect/process-prompt`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Cache-Control': 'no-cache' }, body: JSON.stringify({ prompt: template.prompt }), signal: controller.signal }); clearTimeout(timeout); if (response.ok) { const result = await response.json(); console.log('✅ Quick template generated successfully!', result); // Switch to architect tab to show results setActiveTab('architect'); // Refresh stats to show the new workflow setTimeout(() => { fetchAIStats(); fetchRealtimeMetrics(); }, 1000); } else { console.error('❌ Quick template generation failed'); } } catch (error) { console.error('❌ Quick template generation error:', error); } finally { setIsLoading(false); } }; useEffect(() => { setIsClient(true); fetchAIStats(); fetchRealtimeMetrics(); // Set up periodic refresh const interval = setInterval(() => { fetchRealtimeMetrics(); }, 30000); // Refresh every 30 seconds return () => clearInterval(interval); }, []); const fetchAIStats = async () => { try { setIsLoading(true); // Call REAL AI Architect statistics endpoint const response = await smartFetch(`/api/ai-architect/statistics`, { headers: { 'Cache-Control': 'no-cache' }, cache: 'no-store' }); if (response.ok) { const stats = await response.json(); // Map the real backend data to frontend structure setAiStats({ total_workflows: stats.total_workflows || 0, completed_workflows: stats.completed_workflows || 0, failed_workflows: stats.failed_workflows || 0, running_workflows: stats.running_workflows || 0, success_rate: stats.success_rate || 0, average_consciousness_score: stats.average_consciousness_score * 100 || 0, // Convert to percentage domain_distribution: stats.domain_distribution || {}, system_status: stats.system_status || 'Unknown', architect_initialized: stats.architect_initialized || false }); console.log('✅ Loaded REAL AI Architect statistics:', stats); } else { console.warn('⚠️ Failed to fetch real stats, using fallback'); // Fallback data only if API fails setAiStats({ total_workflows: 0, completed_workflows: 0, failed_workflows: 0, running_workflows: 0, success_rate: 0, average_consciousness_score: 0, domain_distribution: {}, system_status: 'Connecting...', architect_initialized: false }); } } catch (error) { console.error('❌ Failed to fetch AI stats:', error); // Fallback data on error setAiStats({ total_workflows: 0, completed_workflows: 0, failed_workflows: 0, running_workflows: 0, success_rate: 0, average_consciousness_score: 0, domain_distribution: {}, system_status: 'Connection Error', architect_initialized: false }); } finally { setIsLoading(false); } }; const fetchRealtimeMetrics = async () => { try { // Call REAL MLE-STAR status endpoint for live metrics const [mleResponse, workflowResponse] = await Promise.all([ smartFetch('/api/mle-star/status', { cache: 'no-store' }), smartFetch('/api/workflow-status/all', { cache: 'no-store' }) ]); let realTimeData = { requests_last_hour: 0, success_rate_last_hour: 0, avg_consciousness_last_hour: 0, active_domains_last_hour: 0, total_requests_today: 0, timestamp: new Date().toISOString() }; if (mleResponse.ok) { const mleStatus = await mleResponse.json(); console.log('✅ Got MLE-STAR status:', mleStatus); // Extract real metrics from MLE-STAR backend if (mleStatus.status === 'active' && mleStatus.metrics) { realTimeData.requests_last_hour = mleStatus.metrics.requests_last_hour || 0; realTimeData.success_rate_last_hour = mleStatus.metrics.success_rate || 0; realTimeData.avg_consciousness_last_hour = mleStatus.metrics.consciousness_level * 100 || 0; } } if (workflowResponse.ok) { const workflows = await workflowResponse.json(); console.log('✅ Got workflow status:', workflows); // Count active workflows and calculate metrics if (Array.isArray(workflows)) { const activeWorkflows = workflows.filter(w => w.status === 'running' || w.status === 'processing'); const completedToday = workflows.filter(w => { const workflowDate = new Date(w.created_at || w.timestamp); const today = new Date(); return workflowDate.toDateString() === today.toDateString(); }); realTimeData.active_domains_last_hour = new Set(workflows.map(w => w.domain)).size; realTimeData.total_requests_today = completedToday.length; } } setRealtimeMetrics(realTimeData); console.log('📊 Updated real-time metrics:', realTimeData); } catch (error) { console.error('❌ Failed to fetch realtime metrics:', error); // Keep existing metrics or set defaults if (!realtimeMetrics) { setRealtimeMetrics({ requests_last_hour: 0, success_rate_last_hour: 0, avg_consciousness_last_hour: 0, active_domains_last_hour: 0, total_requests_today: 0, timestamp: new Date().toISOString() }); } } }; const manualRefresh = () => { setIsLoading(true); fetchAIStats(); fetchRealtimeMetrics(); setLastRefresh(new Date()); setTimeout(() => setIsLoading(false), 1000); }; const getSystemStatusBadge = () => { if (!aiStats) return ( Loading... ); const status = aiStats.system_status; const isReady = aiStats.architect_initialized; if (isReady && (status === 'operational' || status === 'active')) { return ( Online & Ready ); } else if (status === 'Connecting...' || status === 'Initializing') { return ( {status} ); } else if (status === 'Connection Error') { return ( Connection Error ); } else { return ( {status} ); } }; return (
{/* Neon grid overlay */}
{/* Custom scrollbar styles */}