fsalmansour commited on
Commit
a250410
·
verified ·
1 Parent(s): 16ac49c

أريد منك إنشاء واجهة ويب متكاملة لنظام FahadNeo AI - نظام ذكاء اصطناعي متعدد الوكلاء. ## المتطلبات الأساسية: 1. صفحة HTML واحدة تحتوي على كل شيء (Single Page Application) 2. تصميم عصري جداً باستخدام Glassmorphism و Neumorphism 3. Dark Mode كإعداد افتراضي مع زر للتبديل إلى Light Mode 4. دعم كامل للغة العربية (RTL) والإنجليزية (LTR) مع زر تبديل 5. Responsive Design يعمل على جميع الأجهزة (موبايل، تابلت، ديسكتوب) 6. يعمل مع Backend على http://localhost:5000 ## التقنيات المطلوبة: - HTML5 + CSS3 (inline في نفس الملف) - JavaScript ES6+ (inline في نفس الملف) - Tailwind CSS من CDN - Socket.io من CDN للاتصال المباشر - Lucide Icons من CDN - Chart.js من CDN للرسوم البيانية ## أقسام الواجهة المطلوبة: ### 1. Header (ثابت في الأعلى): - شعار "FahadNeo AI" مع أيقونة دماغ متحركة - مؤشر حالة الاتصال (أخضر = متصل، أحمر = غير متصل) - زر تبديل اللغة (عربي/English) - زر تبديل الثيم (Dark/Light) - زر الأوامر الصوتية مع مؤشر بصري عند التحدث - شريط بحث ذكي ### 2. Sidebar الأيسر (أو الأيمن في RTL): - قائمة بـ 9 Agents مع: - اسم الـ Agent - أيقونة مميزة لكل واحد - حالة (نشط/مشغول/متوقف) مع لون مختلف - عداد المهام المنجزة - زر لتشغيل/إيقاف - إمكانية سحب وإفلات لترتيب الـ Agents ### 3. المحتوى الرئيسي (وسط الصفحة): - Live Activity Feed: - آخر 50 نشاط مع تحديث فوري - أيقونة ملونة لكل نوع نشاط - وقت النشاط بالعربي - تأثير fade in عند إضافة نشاط جديد - Quick Stats Dashboard: - 6 بطاقات إحصائيات: - إجمالي المهام اليوم - معدل النجاح - الوقت الموفر - الرسائل المعالجة - الأكواد المكتوبة - المحتوى المنشأ - رسم بياني دائري للأداء - رسم بياني خطي للنشاط عبر الوقت ### 4. لوحة التحكم السفلية: - Command Input: - حقل إدخال كبير للأوامر - اقتراحات تلقائية أثناء الكتابة - تاريخ الأوامر (سهم لأعلى/أسفل) - Quick Actions: - 8 أزرار سريعة قابلة للتخصيص - أيقونات واضحة - Tooltip عند التمرير ### 5. النافذة الجانبية اليمنى (قابلة للإخفاء): - Unified Inbox: - كل الرسائل من جميع المنصات - فلترة حسب المصدر - بحث سريع - عدادات غير المقروء - Connected Devices: - الأجهزة المتصلة مع أيقونات - حالة كل جهاز - زر إضافة جهاز جديد ## الميزات التفاعلية المطلوبة: 1. **Animations:** - Loading spinner عند انتظار الرد - Pulse effect على الـ Agents النشطين - Smooth transitions عند التنقل - Parallax scrolling في الخلفية - Particle.js effect في الخلفية 2. **Real-time Updates:** - Socket.io connection للتحديثات الفورية - Auto-reconnect عند انقطاع الاتصال - Notification sound للأحداث المهمة - Browser notifications 3. **Voice Commands:** - Web Speech API للأوامر الصوتية - Visual feedback أثناء الاستماع - دعم العربية والإنجليزية - عرض النص المفهوم 4. **Drag & Drop:** - سحب الملفات للمعالجة - إعادة ترتيب الـ Agents - نقل المهام بين الـ Agents 5. **Keyboard Shortcuts:** - Ctrl/Cmd + K: فتح البحث السريع - Ctrl/Cmd + /: فتح الأوامر الصوتية - Ctrl/Cmd + 1-9: التنقل بين الـ Agents - Esc: إغلاق النوافذ المنبثقة ## التصميم والألوان: ### Dark Mode: - Background: gradient من #0a0a0a إلى #1a1a2e - Cards: rgba(255,255,255,0.05) مع backdrop-filter: blur(10px) - Text: #ffffff للرئيسي، #a0a0a0 للثانوي - Accent Colors: - Blue: #3b82f6 (Primary) - Purple: #8b5cf6 (Secondary) - Green: #10b981 (Success) - Yellow: #f59e0b (Warning) - Red: #ef4444 (Error) ### Light Mode: - Background: gradient من #f8f9fa إلى #e9ecef - Cards: rgba(0,0,0,0.03) مع box-shadow - Text: #1a1a1a للرئيسي، #6c757d للثانوي - نفس Accent Colors لكن أكثر إشراقاً ## كود JavaScript المطلوب: 1. Socket.io connection مع error handling 2. دالة لإرسال الأوامر للـ Agents 3. دالة لاستقبال وعرض النتائج 4. دالة للأوامر الصوتية 5. دالة لتحديث الإحصائيات 6. دالة لإدارة الثيم واللغة 7. LocalStorage للحفظ التفضيلات ## الـ Agents التسعة: 1. CodeMaster (أيقونة: code) - لون أخضر 2. MessageBot (أيقونة: message-circle) - لون أزرق 3. TradeMaster (أيقونة: trending-up) - لون أصفر 4. ContentCreator (أيقونة: palette) - لون بنفسجي 5. PublishPro (أيقونة: send) - لون وردي 6. BlogMaster (أيقونة: file-text) - لون نيلي 7. YouTubeGuru (أيقونة: video) - لون أحمر 8. EmailMaster (أيقونة: mail) - لون برتقالي 9. DesignPro (أيقونة: pen-tool) - لون سماوي ## متطلبات إضافية: - كل الكود في ملف HTML واحد - تعليقات بالعربية والإنجليزية - معالجة جميع الأخطاء المحتملة - Loading states لجميع العمليات - Empty states عند عدم وجود بيانات - Success/Error messages واضحة - يعمل offline مع cached data - PWA ready مع manifest الرجاء إنشاء هذا الملف كاملاً مع كل التفاصيل المذكورة. - Initial Deployment

Browse files
Files changed (2) hide show
  1. README.md +7 -5
  2. index.html +1452 -19
README.md CHANGED
@@ -1,10 +1,12 @@
1
  ---
2
- title: Fahadai
3
- emoji: 📈
4
- colorFrom: gray
5
- colorTo: yellow
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
  ---
2
+ title: fahadai
3
+ emoji: 🐳
4
+ colorFrom: pink
5
+ colorTo: gray
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite
10
  ---
11
 
12
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
index.html CHANGED
@@ -1,19 +1,1452 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="ar" dir="rtl">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>FahadNeo AI - نظام الذكاء الاصطناعي متعدد الوكلاء</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
9
+ <script src="https://cdn.jsdelivr.net/npm/lucide@latest/dist/umd/lucide.min.js"></script>
10
+ <script src="https://cdn.socket.io/4.7.2/socket.io.min.js"></script>
11
+ <script src="https://cdn.jsdelivr.net/npm/[email protected]/particles.min.js"></script>
12
+ <style>
13
+ /* Custom CSS for Glassmorphism and Neumorphism effects */
14
+ .glass-card {
15
+ background: rgba(255, 255, 255, 0.05);
16
+ backdrop-filter: blur(10px);
17
+ -webkit-backdrop-filter: blur(10px);
18
+ border: 1px solid rgba(255, 255, 255, 0.1);
19
+ }
20
+
21
+ .light-glass-card {
22
+ background: rgba(255, 255, 255, 0.7);
23
+ backdrop-filter: blur(10px);
24
+ -webkit-backdrop-filter: blur(10px);
25
+ border: 1px solid rgba(255, 255, 255, 0.2);
26
+ }
27
+
28
+ .neumorphism {
29
+ border-radius: 10px;
30
+ background: linear-gradient(145deg, #1a1a2e, #151525);
31
+ box-shadow: 5px 5px 10px #0d0d17, -5px -5px 10px #272745;
32
+ }
33
+
34
+ .light-neumorphism {
35
+ border-radius: 10px;
36
+ background: linear-gradient(145deg, #e9ecef, #f8f9fa);
37
+ box-shadow: 5px 5px 10px #d1d3d4, -5px -5px 10px #ffffff;
38
+ }
39
+
40
+ .pulse-active {
41
+ animation: pulse 2s infinite;
42
+ }
43
+
44
+ @keyframes pulse {
45
+ 0% {
46
+ box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.7);
47
+ }
48
+ 70% {
49
+ box-shadow: 0 0 0 10px rgba(59, 130, 246, 0);
50
+ }
51
+ 100% {
52
+ box-shadow: 0 0 0 0 rgba(59, 130, 246, 0);
53
+ }
54
+ }
55
+
56
+ .fade-in {
57
+ animation: fadeIn 0.5s ease-in;
58
+ }
59
+
60
+ @keyframes fadeIn {
61
+ from { opacity: 0; transform: translateY(10px); }
62
+ to { opacity: 1; transform: translateY(0); }
63
+ }
64
+
65
+ /* RTL and LTR specific styles */
66
+ [dir="rtl"] .sidebar {
67
+ border-right: none;
68
+ border-left: 1px solid rgba(255, 255, 255, 0.1);
69
+ }
70
+
71
+ [dir="ltr"] .sidebar {
72
+ border-left: none;
73
+ border-right: 1px solid rgba(255, 255, 255, 0.1);
74
+ }
75
+
76
+ .light-mode [dir="rtl"] .sidebar {
77
+ border-left: 1px solid rgba(0, 0, 0, 0.1);
78
+ }
79
+
80
+ .light-mode [dir="ltr"] .sidebar {
81
+ border-right: 1px solid rgba(0, 0, 0, 0.1);
82
+ }
83
+
84
+ /* Scrollbar styling */
85
+ ::-webkit-scrollbar {
86
+ width: 8px;
87
+ height: 8px;
88
+ }
89
+
90
+ ::-webkit-scrollbar-track {
91
+ background: rgba(255, 255, 255, 0.05);
92
+ }
93
+
94
+ ::-webkit-scrollbar-thumb {
95
+ background: rgba(255, 255, 255, 0.2);
96
+ border-radius: 4px;
97
+ }
98
+
99
+ ::-webkit-scrollbar-thumb:hover {
100
+ background: rgba(255, 255, 255, 0.3);
101
+ }
102
+
103
+ .light-mode ::-webkit-scrollbar-track {
104
+ background: rgba(0, 0, 0, 0.05);
105
+ }
106
+
107
+ .light-mode ::-webkit-scrollbar-thumb {
108
+ background: rgba(0, 0, 0, 0.2);
109
+ }
110
+
111
+ .light-mode ::-webkit-scrollbar-thumb:hover {
112
+ background: rgba(0, 0, 0, 0.3);
113
+ }
114
+
115
+ /* Voice command animation */
116
+ @keyframes listening {
117
+ 0% { opacity: 0.5; transform: scale(1); }
118
+ 50% { opacity: 1; transform: scale(1.1); }
119
+ 100% { opacity: 0.5; transform: scale(1); }
120
+ }
121
+
122
+ .listening-animation {
123
+ animation: listening 1.5s infinite;
124
+ }
125
+ </style>
126
+ </head>
127
+ <body class="bg-gradient-to-br from-gray-900 to-gray-800 text-white min-h-screen flex flex-col transition-colors duration-300" id="body">
128
+ <!-- Particles.js Background -->
129
+ <div id="particles-js" class="fixed inset-0 z-0 opacity-20"></div>
130
+
131
+ <!-- Header -->
132
+ <header class="glass-card sticky top-0 z-50 p-4 flex items-center justify-between border-b border-gray-800">
133
+ <div class="flex items-center space-x-4 rtl:space-x-reverse">
134
+ <div class="flex items-center">
135
+ <i data-lucide="brain" class="w-8 h-8 text-blue-400 animate-pulse"></i>
136
+ <h1 class="text-xl font-bold ml-2 rtl:mr-2 rtl:ml-0">FahadNeo AI</h1>
137
+ </div>
138
+
139
+ <div class="flex items-center space-x-2 rtl:space-x-reverse" id="connection-status">
140
+ <div class="w-3 h-3 rounded-full bg-red-500"></div>
141
+ <span class="text-sm">غير متصل</span>
142
+ </div>
143
+ </div>
144
+
145
+ <div class="flex items-center space-x-4 rtl:space-x-reverse">
146
+ <div class="relative">
147
+ <input type="text" placeholder="ابحث..." class="bg-gray-800 bg-opacity-50 rounded-full py-2 px-4 pl-10 w-64 focus:outline-none focus:ring-2 focus:ring-blue-500">
148
+ <i data-lucide="search" class="absolute left-3 top-2.5 rtl:right-3 rtl:left-auto text-gray-400"></i>
149
+ </div>
150
+
151
+ <button id="voice-command-btn" class="p-2 rounded-full bg-gray-800 hover:bg-gray-700 relative">
152
+ <i data-lucide="mic" class="w-5 h-5"></i>
153
+ <div id="voice-indicator" class="hidden absolute -top-1 -right-1 w-3 h-3 rounded-full bg-red-500"></div>
154
+ </button>
155
+
156
+ <button id="theme-toggle" class="p-2 rounded-full bg-gray-800 hover:bg-gray-700">
157
+ <i data-lucide="sun" class="w-5 h-5 hidden"></i>
158
+ <i data-lucide="moon" class="w-5 h-5"></i>
159
+ </button>
160
+
161
+ <button id="language-toggle" class="p-2 rounded-full bg-gray-800 hover:bg-gray-700">
162
+ <span class="text-sm font-medium">EN</span>
163
+ </button>
164
+ </div>
165
+ </header>
166
+
167
+ <div class="flex flex-1 overflow-hidden">
168
+ <!-- Left Sidebar - Agents -->
169
+ <aside class="sidebar w-64 bg-gray-900 bg-opacity-50 flex-shrink-0 overflow-y-auto hidden md:block">
170
+ <div class="p-4">
171
+ <h2 class="text-lg font-semibold mb-4 flex items-center">
172
+ <i data-lucide="users" class="w-5 h-5 mr-2 rtl:ml-2 rtl:mr-0"></i>
173
+ <span>الوكلاء</span>
174
+ </h2>
175
+
176
+ <div id="agents-list" class="space-y-3">
177
+ <!-- Agents will be added here dynamically -->
178
+ </div>
179
+ </div>
180
+ </aside>
181
+
182
+ <!-- Main Content -->
183
+ <main class="flex-1 overflow-auto p-4">
184
+ <!-- Quick Stats Dashboard -->
185
+ <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 mb-6">
186
+ <div class="glass-card rounded-lg p-4">
187
+ <div class="flex items-center justify-between">
188
+ <div>
189
+ <p class="text-gray-400 text-sm">إجمالي المهام اليوم</p>
190
+ <h3 class="text-2xl font-bold" id="total-tasks">0</h3>
191
+ </div>
192
+ <div class="p-3 rounded-full bg-blue-500 bg-opacity-20">
193
+ <i data-lucide="check-circle" class="w-6 h-6 text-blue-400"></i>
194
+ </div>
195
+ </div>
196
+ <div class="mt-2">
197
+ <p class="text-sm text-green-400 flex items-center">
198
+ <i data-lucide="trending-up" class="w-4 h-4 mr-1 rtl:ml-1 rtl:mr-0"></i>
199
+ <span>+12% من الأمس</span>
200
+ </p>
201
+ </div>
202
+ </div>
203
+
204
+ <div class="glass-card rounded-lg p-4">
205
+ <div class="flex items-center justify-between">
206
+ <div>
207
+ <p class="text-gray-400 text-sm">معدل النجاح</p>
208
+ <h3 class="text-2xl font-bold" id="success-rate">0%</h3>
209
+ </div>
210
+ <div class="p-3 rounded-full bg-green-500 bg-opacity-20">
211
+ <i data-lucide="award" class="w-6 h-6 text-green-400"></i>
212
+ </div>
213
+ </div>
214
+ <div class="mt-2">
215
+ <p class="text-sm text-green-400 flex items-center">
216
+ <i data-lucide="trending-up" class="w-4 h-4 mr-1 rtl:ml-1 rtl:mr-0"></i>
217
+ <span>+5% من الأسبوع الماضي</span>
218
+ </p>
219
+ </div>
220
+ </div>
221
+
222
+ <div class="glass-card rounded-lg p-4">
223
+ <div class="flex items-center justify-between">
224
+ <div>
225
+ <p class="text-gray-400 text-sm">الوقت الموفر</p>
226
+ <h3 class="text-2xl font-bold" id="time-saved">0 ساعة</h3>
227
+ </div>
228
+ <div class="p-3 rounded-full bg-purple-500 bg-opacity-20">
229
+ <i data-lucide="clock" class="w-6 h-6 text-purple-400"></i>
230
+ </div>
231
+ </div>
232
+ <div class="mt-2">
233
+ <p class="text-sm text-green-400 flex items-center">
234
+ <i data-lucide="trending-up" class="w-4 h-4 mr-1 rtl:ml-1 rtl:mr-0"></i>
235
+ <span>+3 ساعات من الأمس</span>
236
+ </p>
237
+ </div>
238
+ </div>
239
+
240
+ <div class="glass-card rounded-lg p-4">
241
+ <div class="flex items-center justify-between">
242
+ <div>
243
+ <p class="text-gray-400 text-sm">الرسائل المعالجة</p>
244
+ <h3 class="text-2xl font-bold" id="messages-processed">0</h3>
245
+ </div>
246
+ <div class="p-3 rounded-full bg-pink-500 bg-opacity-20">
247
+ <i data-lucide="message-square" class="w-6 h-6 text-pink-400"></i>
248
+ </div>
249
+ </div>
250
+ <div class="mt-2">
251
+ <p class="text-sm text-green-400 flex items-center">
252
+ <i data-lucide="trending-up" class="w-4 h-4 mr-1 rtl:ml-1 rtl:mr-0"></i>
253
+ <span>+24% من الأسبوع الماضي</span>
254
+ </p>
255
+ </div>
256
+ </div>
257
+
258
+ <div class="glass-card rounded-lg p-4">
259
+ <div class="flex items-center justify-between">
260
+ <div>
261
+ <p class="text-gray-400 text-sm">الأكواد المكتوبة</p>
262
+ <h3 class="text-2xl font-bold" id="code-written">0 سطر</h3>
263
+ </div>
264
+ <div class="p-3 rounded-full bg-indigo-500 bg-opacity-20">
265
+ <i data-lucide="code" class="w-6 h-6 text-indigo-400"></i>
266
+ </div>
267
+ </div>
268
+ <div class="mt-2">
269
+ <p class="text-sm text-green-400 flex items-center">
270
+ <i data-lucide="trending-up" class="w-4 h-4 mr-1 rtl:ml-1 rtl:mr-0"></i>
271
+ <span>+15% من الأسبوع الماضي</span>
272
+ </p>
273
+ </div>
274
+ </div>
275
+
276
+ <div class="glass-card rounded-lg p-4">
277
+ <div class="flex items-center justify-between">
278
+ <div>
279
+ <p class="text-gray-400 text-sm">المحتوى المنشأ</p>
280
+ <h3 class="text-2xl font-bold" id="content-created">0 قطعة</h3>
281
+ </div>
282
+ <div class="p-3 rounded-full bg-yellow-500 bg-opacity-20">
283
+ <i data-lucide="file-text" class="w-6 h-6 text-yellow-400"></i>
284
+ </div>
285
+ </div>
286
+ <div class="mt-2">
287
+ <p class="text-sm text-green-400 flex items-center">
288
+ <i data-lucide="trending-up" class="w-4 h-4 mr-1 rtl:ml-1 rtl:mr-0"></i>
289
+ <span>+8% من الأسبوع الماضي</span>
290
+ </p>
291
+ </div>
292
+ </div>
293
+ </div>
294
+
295
+ <!-- Charts Row -->
296
+ <div class="grid grid-cols-1 lg:grid-cols-2 gap-4 mb-6">
297
+ <div class="glass-card rounded-lg p-4">
298
+ <h3 class="font-semibold mb-4">توزيع الأداء</h3>
299
+ <canvas id="performanceChart" height="250"></canvas>
300
+ </div>
301
+ <div class="glass-card rounded-lg p-4">
302
+ <h3 class="font-semibold mb-4">النشاط عبر الوقت</h3>
303
+ <canvas id="activityChart" height="250"></canvas>
304
+ </div>
305
+ </div>
306
+
307
+ <!-- Activity Feed -->
308
+ <div class="glass-card rounded-lg p-4 mb-6">
309
+ <div class="flex items-center justify-between mb-4">
310
+ <h3 class="font-semibold text-lg flex items-center">
311
+ <i data-lucide="activity" class="w-5 h-5 mr-2 rtl:ml-2 rtl:mr-0"></i>
312
+ <span>سجل النشاط الحي</span>
313
+ </h3>
314
+ <button class="text-sm text-blue-400 hover:text-blue-300 flex items-center">
315
+ <i data-lucide="filter" class="w-4 h-4 mr-1 rtl:ml-1 rtl:mr-0"></i>
316
+ <span>تصفية</span>
317
+ </button>
318
+ </div>
319
+
320
+ <div id="activity-feed" class="space-y-3 max-h-96 overflow-y-auto">
321
+ <!-- Activity items will be added here dynamically -->
322
+ <div class="text-center py-8 text-gray-500" id="empty-activity">
323
+ <i data-lucide="inbox" class="w-12 h-12 mx-auto mb-2"></i>
324
+ <p>لا يوجد نشاط حتى الآن</p>
325
+ </div>
326
+ </div>
327
+ </div>
328
+ </main>
329
+
330
+ <!-- Right Sidebar - Inbox & Devices -->
331
+ <aside class="sidebar w-72 bg-gray-900 bg-opacity-50 flex-shrink-0 overflow-y-auto hidden lg:block">
332
+ <div class="p-4">
333
+ <!-- Unified Inbox -->
334
+ <div class="mb-8">
335
+ <div class="flex items-center justify-between mb-4">
336
+ <h2 class="text-lg font-semibold flex items-center">
337
+ <i data-lucide="inbox" class="w-5 h-5 mr-2 rtl:ml-2 rtl:mr-0"></i>
338
+ <span>صندوق الوارد الموحد</span>
339
+ </h2>
340
+ <span class="bg-blue-500 text-white text-xs px-2 py-1 rounded-full">12 جديد</span>
341
+ </div>
342
+
343
+ <div class="mb-3">
344
+ <div class="relative">
345
+ <input type="text" placeholder="ابحث في الرسائل..." class="bg-gray-800 bg-opacity-50 rounded-full py-2 px-4 pl-10 w-full focus:outline-none focus:ring-2 focus:ring-blue-500">
346
+ <i data-lucide="search" class="absolute left-3 top-2.5 rtl:right-3 rtl:left-auto text-gray-400"></i>
347
+ </div>
348
+ </div>
349
+
350
+ <div class="flex space-x-2 mb-4 rtl:space-x-reverse">
351
+ <button class="text-xs bg-blue-500 text-white px-3 py-1 rounded-full">الكل</button>
352
+ <button class="text-xs bg-gray-700 hover:bg-gray-600 px-3 py-1 rounded-full">البريد</button>
353
+ <button class="text-xs bg-gray-700 hover:bg-gray-600 px-3 py-1 rounded-full">الدردشة</button>
354
+ <button class="text-xs bg-gray-700 hover:bg-gray-600 px-3 py-1 rounded-full">التنبيهات</button>
355
+ </div>
356
+
357
+ <div id="inbox-messages" class="space-y-3 max-h-64 overflow-y-auto">
358
+ <!-- Messages will be added here dynamically -->
359
+ <div class="p-3 rounded-lg bg-gray-800 bg-opacity-50 hover:bg-gray-700 cursor-pointer border-l-4 border-blue-500">
360
+ <div class="flex items-start justify-between">
361
+ <div class="flex items-start space-x-3 rtl:space-x-reverse">
362
+ <div class="p-1 bg-blue-500 bg-opacity-20 rounded-full">
363
+ <i data-lucide="mail" class="w-4 h-4 text-blue-400"></i>
364
+ </div>
365
+ <div>
366
+ <h4 class="font-medium">رسالة جديدة من محمد</h4>
367
+ <p class="text-sm text-gray-400 truncate">مرحباً، هل يمكنك مساعدتي في مشروع...</p>
368
+ </div>
369
+ </div>
370
+ <span class="text-xs text-gray-500">منذ 5 دقائق</span>
371
+ </div>
372
+ </div>
373
+
374
+ <div class="p-3 rounded-lg bg-gray-800 bg-opacity-50 hover:bg-gray-700 cursor-pointer">
375
+ <div class="flex items-start justify-between">
376
+ <div class="flex items-start space-x-3 rtl:space-x-reverse">
377
+ <div class="p-1 bg-green-500 bg-opacity-20 rounded-full">
378
+ <i data-lucide="message-square" class="w-4 h-4 text-green-400"></i>
379
+ </div>
380
+ <div>
381
+ <h4 class="font-medium">رسالة واتساب</h4>
382
+ <p class="text-sm text-gray-400 truncate">أهلاً، متى سيكون الاجتماع...</p>
383
+ </div>
384
+ </div>
385
+ <span class="text-xs text-gray-500">منذ 15 دقيقة</span>
386
+ </div>
387
+ </div>
388
+
389
+ <div class="p-3 rounded-lg bg-gray-800 bg-opacity-50 hover:bg-gray-700 cursor-pointer">
390
+ <div class="flex items-start justify-between">
391
+ <div class="flex items-start space-x-3 rtl:space-x-reverse">
392
+ <div class="p-1 bg-yellow-500 bg-opacity-20 rounded-full">
393
+ <i data-lucide="alert-circle" class="w-4 h-4 text-yellow-400"></i>
394
+ </div>
395
+ <div>
396
+ <h4 class="font-medium">تنبيه النظام</h4>
397
+ <p class="text-sm text-gray-400 truncate">تم الانتهاء من معالجة المهمة #1234</p>
398
+ </div>
399
+ </div>
400
+ <span class="text-xs text-gray-500">منذ ساعة</span>
401
+ </div>
402
+ </div>
403
+
404
+ <div class="p-3 rounded-lg bg-gray-800 bg-opacity-50 hover:bg-gray-700 cursor-pointer">
405
+ <div class="flex items-start justify-between">
406
+ <div class="flex items-start space-x-3 rtl:space-x-reverse">
407
+ <div class="p-1 bg-purple-500 bg-opacity-20 rounded-full">
408
+ <i data-lucide="slack" class="w-4 h-4 text-purple-400"></i>
409
+ </div>
410
+ <div>
411
+ <h4 class="font-medium">إشعار من Slack</h4>
412
+ <p class="text-sm text-gray-400 truncate">لديك 3 رسائل غير مقروءة في #general</p>
413
+ </div>
414
+ </div>
415
+ <span class="text-xs text-gray-500">منذ 3 ساعات</span>
416
+ </div>
417
+ </div>
418
+ </div>
419
+ </div>
420
+
421
+ <!-- Connected Devices -->
422
+ <div>
423
+ <div class="flex items-center justify-between mb-4">
424
+ <h2 class="text-lg font-semibold flex items-center">
425
+ <i data-lucide="smartphone" class="w-5 h-5 mr-2 rtl:ml-2 rtl:mr-0"></i>
426
+ <span>الأجهزة المتصلة</span>
427
+ </h2>
428
+ <button class="text-blue-400 hover:text-blue-300">
429
+ <i data-lucide="plus" class="w-5 h-5"></i>
430
+ </button>
431
+ </div>
432
+
433
+ <div id="connected-devices" class="space-y-3">
434
+ <div class="p-3 rounded-lg bg-gray-800 bg-opacity-50 flex items-center justify-between">
435
+ <div class="flex items-center space-x-3 rtl:space-x-reverse">
436
+ <div class="p-2 bg-blue-500 bg-opacity-20 rounded-lg">
437
+ <i data-lucide="laptop" class="w-5 h-5 text-blue-400"></i>
438
+ </div>
439
+ <div>
440
+ <h4 class="font-medium">MacBook Pro</h4>
441
+ <p class="text-sm text-gray-400">متصل الآن</p>
442
+ </div>
443
+ </div>
444
+ <div class="w-2 h-2 rounded-full bg-green-500"></div>
445
+ </div>
446
+
447
+ <div class="p-3 rounded-lg bg-gray-800 bg-opacity-50 flex items-center justify-between">
448
+ <div class="flex items-center space-x-3 rtl:space-x-reverse">
449
+ <div class="p-2 bg-purple-500 bg-opacity-20 rounded-lg">
450
+ <i data-lucide="smartphone" class="w-5 h-5 text-purple-400"></i>
451
+ </div>
452
+ <div>
453
+ <h4 class="font-medium">iPhone 13</h4>
454
+ <p class="text-sm text-gray-400">متصل الآن</p>
455
+ </div>
456
+ </div>
457
+ <div class="w-2 h-2 rounded-full bg-green-500"></div>
458
+ </div>
459
+
460
+ <div class="p-3 rounded-lg bg-gray-800 bg-opacity-50 flex items-center justify-between">
461
+ <div class="flex items-center space-x-3 rtl:space-x-reverse">
462
+ <div class="p-2 bg-yellow-500 bg-opacity-20 rounded-lg">
463
+ <i data-lucide="tablet" class="w-5 h-5 text-yellow-400"></i>
464
+ </div>
465
+ <div>
466
+ <h4 class="font-medium">iPad Air</h4>
467
+ <p class="text-sm text-gray-400">غير متصل</p>
468
+ </div>
469
+ </div>
470
+ <div class="w-2 h-2 rounded-full bg-red-500"></div>
471
+ </div>
472
+ </div>
473
+ </div>
474
+ </div>
475
+ </aside>
476
+ </div>
477
+
478
+ <!-- Bottom Control Panel -->
479
+ <div class="glass-card border-t border-gray-800 p-4">
480
+ <div class="flex flex-col md:flex-row space-y-4 md:space-y-0 md:space-x-4 rtl:space-x-reverse">
481
+ <!-- Quick Actions -->
482
+ <div class="flex-shrink-0 flex items-center space-x-2 md:space-x-0 md:grid md:grid-cols-4 gap-2 rtl:space-x-reverse">
483
+ <button class="quick-action p-2 rounded-lg bg-gray-800 hover:bg-gray-700 flex flex-col items-center justify-center" data-tooltip="إنشاء محتوى">
484
+ <i data-lucide="file-text" class="w-5 h-5 mb-1 text-blue-400"></i>
485
+ <span class="text-xs">محتوى</span>
486
+ </button>
487
+ <button class="quick-action p-2 rounded-lg bg-gray-800 hover:bg-gray-700 flex flex-col items-center justify-center" data-tooltip="إرسال بريد">
488
+ <i data-lucide="mail" class="w-5 h-5 mb-1 text-green-400"></i>
489
+ <span class="text-xs">بريد</span>
490
+ </button>
491
+ <button class="quick-action p-2 rounded-lg bg-gray-800 hover:bg-gray-700 flex flex-col items-center justify-center" data-tooltip="جدولة مهمة">
492
+ <i data-lucide="calendar" class="w-5 h-5 mb-1 text-yellow-400"></i>
493
+ <span class="text-xs">جدولة</span>
494
+ </button>
495
+ <button class="quick-action p-2 rounded-lg bg-gray-800 hover:bg-gray-700 flex flex-col items-center justify-center" data-tooltip="تحليل بيانات">
496
+ <i data-lucide="bar-chart-2" class="w-5 h-5 mb-1 text-purple-400"></i>
497
+ <span class="text-xs">تحليل</span>
498
+ </button>
499
+ </div>
500
+
501
+ <!-- Command Input -->
502
+ <div class="flex-1 relative">
503
+ <input type="text" id="command-input" placeholder="اكتب أمراً هنا أو اضغط / للأوامر الصوتية..." class="bg-gray-800 bg-opacity-50 rounded-full py-3 px-5 w-full focus:outline-none focus:ring-2 focus:ring-blue-500">
504
+ <button class="absolute left-3 top-3 rtl:right-3 rtl:left-auto text-gray-400 hover:text-white">
505
+ <i data-lucide="chevron-right" class="w-5 h-5 rtl:rotate-180"></i>
506
+ </button>
507
+ <div class="absolute right-3 top-3 rtl:left-3 rtl:right-auto flex space-x-2 rtl:space-x-reverse">
508
+ <button id="command-history-btn" class="text-gray-400 hover:text-white">
509
+ <i data-lucide="history" class="w-5 h-5"></i>
510
+ </button>
511
+ <button id="voice-command-btn-bottom" class="text-gray-400 hover:text-white">
512
+ <i data-lucide="mic" class="w-5 h-5"></i>
513
+ </button>
514
+ </div>
515
+ </div>
516
+ </div>
517
+ </div>
518
+
519
+ <!-- Voice Command Modal -->
520
+ <div id="voice-modal" class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 hidden">
521
+ <div class="glass-card rounded-xl p-8 max-w-md w-full text-center">
522
+ <div class="mb-6">
523
+ <div id="voice-animation" class="w-20 h-20 mx-auto mb-4 rounded-full bg-blue-500 bg-opacity-20 flex items-center justify-center">
524
+ <i data-lucide="mic" class="w-10 h-10 text-blue-400"></i>
525
+ </div>
526
+ <h3 class="text-xl font-semibold mb-2">الأوامر الصوتية</h3>
527
+ <p id="voice-status" class="text-gray-400">اضغط على الميكروفون لبدء الاستماع...</p>
528
+ <div id="voice-transcript" class="mt-4 p-3 bg-gray-800 rounded-lg min-h-16 hidden"></div>
529
+ </div>
530
+ <div class="flex justify-center space-x-4 rtl:space-x-reverse">
531
+ <button id="cancel-voice-btn" class="px-6 py-2 bg-gray-700 hover:bg-gray-600 rounded-lg">إلغاء</button>
532
+ <button id="start-voice-btn" class="px-6 py-2 bg-blue-500 hover:bg-blue-600 rounded-lg flex items-center">
533
+ <i data-lucide="mic" class="w-5 h-5 mr-2 rtl:ml-2 rtl:mr-0"></i>
534
+ <span>بدء الاستماع</span>
535
+ </button>
536
+ </div>
537
+ </div>
538
+ </div>
539
+
540
+ <!-- Command History Modal -->
541
+ <div id="history-modal" class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 hidden">
542
+ <div class="glass-card rounded-xl p-6 max-w-md w-full">
543
+ <div class="flex items-center justify-between mb-4">
544
+ <h3 class="text-xl font-semibold">سجل الأوامر</h3>
545
+ <button id="close-history-btn" class="text-gray-400 hover:text-white">
546
+ <i data-lucide="x" class="w-6 h-6"></i>
547
+ </button>
548
+ </div>
549
+ <div id="command-history-list" class="space-y-2 max-h-96 overflow-y-auto">
550
+ <!-- Command history will be added here dynamically -->
551
+ <div class="p-3 rounded-lg bg-gray-800 hover:bg-gray-700 cursor-pointer">
552
+ <p class="text-sm">إنشاء محتوى عن الذكاء الاصطناعي</p>
553
+ <p class="text-xs text-gray-400 mt-1">منذ 5 دقائق</p>
554
+ </div>
555
+ <div class="p-3 rounded-lg bg-gray-800 hover:bg-gray-700 cursor-pointer">
556
+ <p class="text-sm">تحليل بيانات المبيعات لشهر يناير</p>
557
+ <p class="text-xs text-gray-400 mt-1">منذ ساعة</p>
558
+ </div>
559
+ <div class="p-3 rounded-lg bg-gray-800 hover:bg-gray-700 cursor-pointer">
560
+ <p class="text-sm">إرسال بريد إلى فريق التسويق</p>
561
+ <p class="text-xs text-gray-400 mt-1">منذ 3 ساعات</p>
562
+ </div>
563
+ </div>
564
+ </div>
565
+ </div>
566
+
567
+ <!-- Loading Overlay -->
568
+ <div id="loading-overlay" class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 hidden">
569
+ <div class="text-center">
570
+ <div class="inline-block animate-spin rounded-full h-12 w-12 border-t-2 border-b-2 border-blue-500 mb-4"></div>
571
+ <p id="loading-text" class="text-xl">جاري المعالجة...</p>
572
+ </div>
573
+ </div>
574
+
575
+ <!-- Notification Toast -->
576
+ <div id="toast-notification" class="fixed bottom-4 right-4 rtl:right-auto rtl:left-4 glass-card rounded-lg p-4 shadow-lg transform translate-y-10 opacity-0 transition-all duration-300 z-50 hidden">
577
+ <div class="flex items-start">
578
+ <div id="toast-icon" class="mr-3 rtl:ml-3 rtl:mr-0">
579
+ <i data-lucide="info" class="w-6 h-6 text-blue-400"></i>
580
+ </div>
581
+ <div class="flex-1">
582
+ <h4 id="toast-title" class="font-semibold">إشعار</h4>
583
+ <p id="toast-message" class="text-sm">هذه رسالة إشعار نموذجية</p>
584
+ </div>
585
+ <button id="close-toast" class="ml-4 rtl:mr-4 rtl:ml-0 text-gray-400 hover:text-white">
586
+ <i data-lucide="x" class="w-5 h-5"></i>
587
+ </button>
588
+ </div>
589
+ </div>
590
+
591
+ <script>
592
+ // Initialize Lucide icons
593
+ lucide.createIcons();
594
+
595
+ // System configuration
596
+ const config = {
597
+ backendUrl: 'http://localhost:5000',
598
+ isDarkMode: true,
599
+ isRTL: true,
600
+ language: 'ar',
601
+ agents: [
602
+ { id: 1, name: 'CodeMaster', icon: 'code', color: 'green', status: 'active', tasksCompleted: 42 },
603
+ { id: 2, name: 'MessageBot', icon: 'message-circle', color: 'blue', status: 'busy', tasksCompleted: 38 },
604
+ { id: 3, name: 'TradeMaster', icon: 'trending-up', color: 'yellow', status: 'inactive', tasksCompleted: 15 },
605
+ { id: 4, name: 'ContentCreator', icon: 'palette', color: 'purple', status: 'active', tasksCompleted: 27 },
606
+ { id: 5, name: 'PublishPro', icon: 'send', color: 'pink', status: 'active', tasksCompleted: 19 },
607
+ { id: 6, name: 'BlogMaster', icon: 'file-text', color: 'indigo', status: 'inactive', tasksCompleted: 8 },
608
+ { id: 7, name: 'YouTubeGuru', icon: 'video', color: 'red', status: 'busy', tasksCompleted: 23 },
609
+ { id: 8, name: 'EmailMaster', icon: 'mail', color: 'orange', status: 'active', tasksCompleted: 31 },
610
+ { id: 9, name: 'DesignPro', icon: 'pen-tool', color: 'cyan', status: 'inactive', tasksCompleted: 12 }
611
+ ],
612
+ activityTypes: [
613
+ { type: 'task-completed', icon: 'check-circle', color: 'green' },
614
+ { type: 'error', icon: 'alert-circle', color: 'red' },
615
+ { type: 'warning', icon: 'alert-triangle', color: 'yellow' },
616
+ { type: 'info', icon: 'info', color: 'blue' },
617
+ { type: 'message', icon: 'message-square', color: 'purple' },
618
+ { type: 'code', icon: 'code', color: 'green' },
619
+ { type: 'content', icon: 'file-text', color: 'indigo' },
620
+ { type: 'system', icon: 'server', color: 'gray' }
621
+ ],
622
+ quickStats: {
623
+ totalTasks: 0,
624
+ successRate: 0,
625
+ timeSaved: 0,
626
+ messagesProcessed: 0,
627
+ codeWritten: 0,
628
+ contentCreated: 0
629
+ }
630
+ };
631
+
632
+ // DOM Elements
633
+ const elements = {
634
+ body: document.getElementById('body'),
635
+ themeToggle: document.getElementById('theme-toggle'),
636
+ languageToggle: document.getElementById('language-toggle'),
637
+ voiceCommandBtn: document.getElementById('voice-command-btn'),
638
+ voiceCommandBtnBottom: document.getElementById('voice-command-btn-bottom'),
639
+ voiceIndicator: document.getElementById('voice-indicator'),
640
+ connectionStatus: document.getElementById('connection-status'),
641
+ agentsList: document.getElementById('agents-list'),
642
+ activityFeed: document.getElementById('activity-feed'),
643
+ emptyActivity: document.getElementById('empty-activity'),
644
+ commandInput: document.getElementById('command-input'),
645
+ voiceModal: document.getElementById('voice-modal'),
646
+ voiceAnimation: document.getElementById('voice-animation'),
647
+ voiceStatus: document.getElementById('voice-status'),
648
+ voiceTranscript: document.getElementById('voice-transcript'),
649
+ startVoiceBtn: document.getElementById('start-voice-btn'),
650
+ cancelVoiceBtn: document.getElementById('cancel-voice-btn'),
651
+ historyModal: document.getElementById('history-modal'),
652
+ commandHistoryBtn: document.getElementById('command-history-btn'),
653
+ closeHistoryBtn: document.getElementById('close-history-btn'),
654
+ commandHistoryList: document.getElementById('command-history-list'),
655
+ loadingOverlay: document.getElementById('loading-overlay'),
656
+ loadingText: document.getElementById('loading-text'),
657
+ toastNotification: document.getElementById('toast-notification'),
658
+ toastTitle: document.getElementById('toast-title'),
659
+ toastMessage: document.getElementById('toast-message'),
660
+ toastIcon: document.getElementById('toast-icon'),
661
+ closeToast: document.getElementById('close-toast'),
662
+ totalTasks: document.getElementById('total-tasks'),
663
+ successRate: document.getElementById('success-rate'),
664
+ timeSaved: document.getElementById('time-saved'),
665
+ messagesProcessed: document.getElementById('messages-processed'),
666
+ codeWritten: document.getElementById('code-written'),
667
+ contentCreated: document.getElementById('content-created')
668
+ };
669
+
670
+ // Initialize charts
671
+ let performanceChart, activityChart;
672
+
673
+ // Initialize socket.io connection
674
+ let socket;
675
+
676
+ // Initialize Speech Recognition
677
+ let recognition;
678
+
679
+ // Command history
680
+ let commandHistory = [];
681
+ let historyIndex = -1;
682
+
683
+ // Initialize the application
684
+ function init() {
685
+ // Load saved preferences
686
+ loadPreferences();
687
+
688
+ // Initialize UI components
689
+ initUI();
690
+
691
+ // Initialize charts
692
+ initCharts();
693
+
694
+ // Initialize socket connection
695
+ initSocket();
696
+
697
+ // Initialize voice recognition
698
+ initVoiceRecognition();
699
+
700
+ // Set up event listeners
701
+ setupEventListeners();
702
+
703
+ // Load initial data
704
+ loadInitialData();
705
+
706
+ // Initialize particles.js
707
+ particlesJS('particles-js', {
708
+ particles: {
709
+ number: { value: 30, density: { enable: true, value_area: 800 } },
710
+ color: { value: config.isDarkMode ? "#3b82f6" : "#2563eb" },
711
+ shape: { type: "circle" },
712
+ opacity: { value: 0.5, random: true },
713
+ size: { value: 3, random: true },
714
+ line_linked: { enable: true, distance: 150, color: config.isDarkMode ? "#3b82f6" : "#2563eb", opacity: 0.4, width: 1 },
715
+ move: { enable: true, speed: 2, direction: "none", random: true, straight: false, out_mode: "out" }
716
+ },
717
+ interactivity: {
718
+ detect_on: "canvas",
719
+ events: {
720
+ onhover: { enable: true, mode: "grab" },
721
+ onclick: { enable: true, mode: "push" }
722
+ },
723
+ modes: {
724
+ grab: { distance: 140, line_linked: { opacity: 1 } },
725
+ push: { particles_nb: 4 }
726
+ }
727
+ }
728
+ });
729
+ }
730
+
731
+ // Load user preferences from localStorage
732
+ function loadPreferences() {
733
+ const darkMode = localStorage.getItem('darkMode');
734
+ const language = localStorage.getItem('language');
735
+
736
+ if (darkMode !== null) {
737
+ config.isDarkMode = darkMode === 'true';
738
+ }
739
+
740
+ if (language !== null) {
741
+ config.language = language;
742
+ config.isRTL = language === 'ar';
743
+ }
744
+
745
+ // Apply preferences
746
+ applyTheme();
747
+ applyLanguage();
748
+ }
749
+
750
+ // Initialize UI components
751
+ function initUI() {
752
+ // Render agents
753
+ renderAgents();
754
+
755
+ // Update quick stats
756
+ updateQuickStats();
757
+
758
+ // Add tooltips to quick actions
759
+ document.querySelectorAll('.quick-action').forEach(button => {
760
+ const tooltip = document.createElement('div');
761
+ tooltip.className = 'hidden absolute z-10 bg-gray-900 text-white text-xs py-1 px-2 rounded whitespace-nowrap -top-8';
762
+ tooltip.textContent = button.dataset.tooltip;
763
+ button.appendChild(tooltip);
764
+
765
+ button.addEventListener('mouseenter', () => {
766
+ tooltip.classList.remove('hidden');
767
+ });
768
+
769
+ button.addEventListener('mouseleave', () => {
770
+ tooltip.classList.add('hidden');
771
+ });
772
+ });
773
+ }
774
+
775
+ // Initialize charts
776
+ function initCharts() {
777
+ // Performance Chart (Doughnut)
778
+ const performanceCtx = document.getElementById('performanceChart').getContext('2d');
779
+ performanceChart = new Chart(performanceCtx, {
780
+ type: 'doughnut',
781
+ data: {
782
+ labels: ['CodeMaster', 'MessageBot', 'TradeMaster', 'ContentCreator', 'PublishPro', 'BlogMaster', 'YouTubeGuru', 'EmailMaster', 'DesignPro'],
783
+ datasets: [{
784
+ data: [42, 38, 15, 27, 19, 8, 23, 31, 12],
785
+ backgroundColor: [
786
+ '#10b981', '#3b82f6', '#f59e0b', '#8b5cf6', '#ec4899', '#6366f1', '#ef4444', '#f97316', '#06b6d4'
787
+ ],
788
+ borderWidth: 0
789
+ }]
790
+ },
791
+ options: {
792
+ responsive: true,
793
+ maintainAspectRatio: false,
794
+ cutout: '70%',
795
+ plugins: {
796
+ legend: {
797
+ position: 'right',
798
+ rtl: config.isRTL,
799
+ labels: {
800
+ usePointStyle: true,
801
+ pointStyle: 'circle',
802
+ padding: 20,
803
+ font: {
804
+ family: 'Tajawal, sans-serif'
805
+ }
806
+ }
807
+ }
808
+ }
809
+ }
810
+ });
811
+
812
+ // Activity Chart (Line)
813
+ const activityCtx = document.getElementById('activityChart').getContext('2d');
814
+ activityChart = new Chart(activityCtx, {
815
+ type: 'line',
816
+ data: {
817
+ labels: ['1am', '4am', '7am', '10am', '1pm', '4pm', '7pm', '10pm'],
818
+ datasets: [{
819
+ label: 'النشاط',
820
+ data: [5, 8, 12, 18, 22, 15, 10, 7],
821
+ borderColor: '#3b82f6',
822
+ backgroundColor: 'rgba(59, 130, 246, 0.1)',
823
+ fill: true,
824
+ tension: 0.4,
825
+ pointBackgroundColor: '#3b82f6',
826
+ pointBorderColor: '#fff',
827
+ pointBorderWidth: 2
828
+ }]
829
+ },
830
+ options: {
831
+ responsive: true,
832
+ maintainAspectRatio: false,
833
+ plugins: {
834
+ legend: {
835
+ display: false
836
+ }
837
+ },
838
+ scales: {
839
+ y: {
840
+ beginAtZero: true,
841
+ grid: {
842
+ color: config.isDarkMode ? 'rgba(255, 255, 255, 0.1)' : 'rgba(0, 0, 0, 0.1)'
843
+ },
844
+ ticks: {
845
+ color: config.isDarkMode ? '#a0a0a0' : '#6c757d'
846
+ }
847
+ },
848
+ x: {
849
+ grid: {
850
+ color: config.isDarkMode ? 'rgba(255, 255, 255, 0.1)' : 'rgba(0, 0, 0, 0.1)'
851
+ },
852
+ ticks: {
853
+ color: config.isDarkMode ? '#a0a0a0' : '#6c757d'
854
+ }
855
+ }
856
+ }
857
+ }
858
+ });
859
+ }
860
+
861
+ // Initialize socket.io connection
862
+ function initSocket() {
863
+ try {
864
+ socket = io(config.backendUrl, {
865
+ reconnectionAttempts: 5,
866
+ reconnectionDelay: 1000,
867
+ transports: ['websocket']
868
+ });
869
+
870
+ socket.on('connect', () => {
871
+ updateConnectionStatus(true);
872
+ showToast('تم الاتصال', 'تم الاتصال بنجاح بالخادم الخلفي', 'check-circle', 'green');
873
+ });
874
+
875
+ socket.on('disconnect', () => {
876
+ updateConnectionStatus(false);
877
+ showToast('ا��قطع الاتصال', 'تم فقدان الاتصال بالخادم الخلفي', 'alert-circle', 'red');
878
+ });
879
+
880
+ socket.on('connect_error', (err) => {
881
+ console.error('Connection error:', err);
882
+ showToast('خطأ في الاتصال', 'فشل الاتصال بالخادم الخلفي', 'alert-triangle', 'yellow');
883
+ });
884
+
885
+ socket.on('activity', (activity) => {
886
+ addActivity(activity);
887
+ });
888
+
889
+ socket.on('stats', (stats) => {
890
+ updateStats(stats);
891
+ });
892
+
893
+ socket.on('agent-update', (agent) => {
894
+ updateAgentStatus(agent);
895
+ });
896
+
897
+ socket.on('command-result', (result) => {
898
+ hideLoading();
899
+ showToast('تم تنفيذ الأمر', result.message, 'check-circle', 'green');
900
+ });
901
+
902
+ socket.on('error', (error) => {
903
+ hideLoading();
904
+ showToast('خطأ', error.message, 'alert-circle', 'red');
905
+ });
906
+ } catch (err) {
907
+ console.error('Socket initialization error:', err);
908
+ showToast('خطأ', 'فشل في تهيئة اتصال Socket', 'alert-triangle', 'yellow');
909
+ }
910
+ }
911
+
912
+ // Initialize voice recognition
913
+ function initVoiceRecognition() {
914
+ try {
915
+ const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
916
+
917
+ if (!SpeechRecognition) {
918
+ console.warn('Speech recognition not supported');
919
+ elements.voiceCommandBtn.disabled = true;
920
+ elements.voiceCommandBtnBottom.disabled = true;
921
+ return;
922
+ }
923
+
924
+ recognition = new SpeechRecognition();
925
+ recognition.continuous = false;
926
+ recognition.interimResults = true;
927
+ recognition.lang = config.language === 'ar' ? 'ar-SA' : 'en-US';
928
+
929
+ recognition.onstart = () => {
930
+ elements.voiceStatus.textContent = config.isRTL ? 'جاري الاستماع...' : 'Listening...';
931
+ elements.voiceAnimation.classList.add('listening-animation');
932
+ elements.voiceTranscript.classList.remove('hidden');
933
+ elements.startVoiceBtn.disabled = true;
934
+ elements.startVoiceBtn.innerHTML = `<i data-lucide="mic" class="w-5 h-5 mr-2 rtl:ml-2 rtl:mr-0"></i><span>${config.isRTL ? 'جاري الاستماع...' : 'Listening...'}</span>`;
935
+ lucide.createIcons();
936
+ };
937
+
938
+ recognition.onresult = (event) => {
939
+ const transcript = Array.from(event.results)
940
+ .map(result => result[0])
941
+ .map(result => result.transcript)
942
+ .join('');
943
+
944
+ elements.voiceTranscript.textContent = transcript;
945
+
946
+ if (event.results[0].isFinal) {
947
+ elements.commandInput.value = transcript;
948
+ }
949
+ };
950
+
951
+ recognition.onend = () => {
952
+ elements.voiceStatus.textContent = config.isRTL ? 'اضغط على الميكروفون لبدء الاستماع...' : 'Press the microphone to start listening...';
953
+ elements.voiceAnimation.classList.remove('listening-animation');
954
+ elements.startVoiceBtn.disabled = false;
955
+ elements.startVoiceBtn.innerHTML = `<i data-lucide="mic" class="w-5 h-5 mr-2 rtl:ml-2 rtl:mr-0"></i><span>${config.isRTL ? 'بدء الاستماع' : 'Start Listening'}</span>`;
956
+ lucide.createIcons();
957
+ };
958
+
959
+ recognition.onerror = (event) => {
960
+ console.error('Speech recognition error', event.error);
961
+ elements.voiceStatus.textContent = config.isRTL ? `خطأ: ${getVoiceError(event.error)}` : `Error: ${getVoiceError(event.error)}`;
962
+ elements.voiceAnimation.classList.remove('listening-animation');
963
+ elements.startVoiceBtn.disabled = false;
964
+ elements.startVoiceBtn.innerHTML = `<i data-lucide="mic" class="w-5 h-5 mr-2 rtl:ml-2 rtl:mr-0"></i><span>${config.isRTL ? 'بدء الاستماع' : 'Start Listening'}</span>`;
965
+ lucide.createIcons();
966
+
967
+ showToast('خطأ في التعرف الصوتي', getVoiceError(event.error), 'alert-circle', 'red');
968
+ };
969
+ } catch (err) {
970
+ console.error('Voice recognition initialization error:', err);
971
+ showToast('خطأ', 'فشل في تهيئة التعرف الصوتي', 'alert-triangle', 'yellow');
972
+ }
973
+ }
974
+
975
+ // Get voice recognition error message
976
+ function getVoiceError(error) {
977
+ const errors = {
978
+ 'no-speech': config.isRTL ? 'لم يتم اكتشاف أي كلام' : 'No speech was detected',
979
+ 'audio-capture': config.isRTL ? 'لا يوجد ميكروفون متاح' : 'No microphone was found',
980
+ 'not-allowed': config.isRTL ? 'تم رفض إذن الميكروفون' : 'Permission to use microphone was denied',
981
+ 'aborted': config.isRTL ? 'تم إيقاف التعرف الصوتي' : 'Speech recognition was aborted',
982
+ 'network': config.isRTL ? 'خطأ في الشبكة' : 'Network error occurred',
983
+ 'language-not-supported': config.isRTL ? 'اللغة غير مدعومة' : 'Language not supported'
984
+ };
985
+
986
+ return errors[error] || (config.isRTL ? 'حدث خطأ غير معروف' : 'An unknown error occurred');
987
+ }
988
+
989
+ // Set up event listeners
990
+ function setupEventListeners() {
991
+ // Theme toggle
992
+ elements.themeToggle.addEventListener('click', toggleTheme);
993
+
994
+ // Language toggle
995
+ elements.languageToggle.addEventListener('click', toggleLanguage);
996
+
997
+ // Voice command buttons
998
+ elements.voiceCommandBtn.addEventListener('click', showVoiceModal);
999
+ elements.voiceCommandBtnBottom.addEventListener('click', showVoiceModal);
1000
+
1001
+ // Voice modal buttons
1002
+ elements.startVoiceBtn.addEventListener('click', startVoiceRecognition);
1003
+ elements.cancelVoiceBtn.addEventListener('click', hideVoiceModal);
1004
+
1005
+ // Command history
1006
+ elements.commandHistoryBtn.addEventListener('click', showHistoryModal);
1007
+ elements.closeHistoryBtn.addEventListener('click', hideHistoryModal);
1008
+
1009
+ // Command input
1010
+ elements.commandInput.addEventListener('keydown', (e) => {
1011
+ // Up arrow - navigate command history
1012
+ if (e.key === 'ArrowUp') {
1013
+ e.preventDefault();
1014
+ navigateHistory('up');
1015
+ }
1016
+
1017
+ // Down arrow - navigate command history
1018
+ if (e.key === 'ArrowDown') {
1019
+ e.preventDefault();
1020
+ navigateHistory('down');
1021
+ }
1022
+
1023
+ // Enter - send command
1024
+ if (e.key === 'Enter') {
1025
+ e.preventDefault();
1026
+ sendCommand();
1027
+ }
1028
+
1029
+ // Ctrl/Cmd + K - focus search
1030
+ if ((e.ctrlKey || e.metaKey) && e.key === 'k') {
1031
+ e.preventDefault();
1032
+ document.querySelector('header input[type="text"]').focus();
1033
+ }
1034
+
1035
+ // Ctrl/Cmd + / - voice command
1036
+ if ((e.ctrlKey || e.metaKey) && e.key === '/') {
1037
+ e.preventDefault();
1038
+ showVoiceModal();
1039
+ }
1040
+ });
1041
+
1042
+ // Close toast
1043
+ elements.closeToast.addEventListener('click', hideToast);
1044
+
1045
+ // Keyboard shortcuts for agents (1-9)
1046
+ document.addEventListener('keydown', (e) => {
1047
+ if ((e.ctrlKey || e.metaKey) && e.key >= '1' && e.key <= '9') {
1048
+ e.preventDefault();
1049
+ const agentIndex = parseInt(e.key) - 1;
1050
+ if (agentIndex < config.agents.length) {
1051
+ const agent = config.agents[agentIndex];
1052
+ showToast('وكيل مختار', agent.name, agent.icon, agent.color);
1053
+ }
1054
+ }
1055
+
1056
+ // Esc - close modals
1057
+ if (e.key === 'Escape') {
1058
+ hideVoiceModal();
1059
+ hideHistoryModal();
1060
+ }
1061
+ });
1062
+ }
1063
+
1064
+ // Load initial data
1065
+ function loadInitialData() {
1066
+ // Simulate loading initial activities
1067
+ setTimeout(() => {
1068
+ const initialActivities = [
1069
+ { type: 'system', message: 'تم تشغيل النظام بنجاح', timestamp: new Date(), agent: 'System' },
1070
+ { type: 'info', message: 'جاري تحميل الوكلاء...', timestamp: new Date(), agent: 'System' },
1071
+ { type: 'task-completed', message: 'تم تحميل 9 وكلاء بنجاح', timestamp: new Date(), agent: 'System' }
1072
+ ];
1073
+
1074
+ initialActivities.forEach(activity => addActivity(activity));
1075
+
1076
+ // Update quick stats
1077
+ updateStats({
1078
+ totalTasks: 215,
1079
+ successRate: 92,
1080
+ timeSaved: 47,
1081
+ messagesProcessed: 128,
1082
+ codeWritten: 5420,
1083
+ contentCreated: 38
1084
+ });
1085
+ }, 1000);
1086
+ }
1087
+
1088
+ // Render agents list
1089
+ function renderAgents() {
1090
+ elements.agentsList.innerHTML = '';
1091
+
1092
+ config.agents.forEach(agent => {
1093
+ const agentElement = document.createElement('div');
1094
+ agentElement.className = `agent-item p-3 rounded-lg bg-gray-800 bg-opacity-50 hover:bg-gray-700 cursor-move ${agent.status === 'active' ? 'pulse-active' : ''}`;
1095
+ agentElement.dataset.id = agent.id;
1096
+ agentElement.draggable = true;
1097
+
1098
+ agentElement.innerHTML = `
1099
+ <div class="flex items-center justify-between">
1100
+ <div class="flex items-center space-x-3 rtl:space-x-reverse">
1101
+ <div class="p-2 rounded-full bg-${agent.color}-500 bg-opacity-20">
1102
+ <i data-lucide="${agent.icon}" class="w-5 h-5 text-${agent.color}-400"></i>
1103
+ </div>
1104
+ <div>
1105
+ <h4 class="font-medium">${agent.name}</h4>
1106
+ <div class="flex items-center space-x-2 rtl:space-x-reverse">
1107
+ <div class="w-2 h-2 rounded-full ${getStatusColor(agent.status)}"></div>
1108
+ <span class="text-xs text-gray-400">${getStatusText(agent.status)}</span>
1109
+ </div>
1110
+ </div>
1111
+ </div>
1112
+ <div class="flex items-center space-x-2 rtl:space-x-reverse">
1113
+ <span class="text-xs bg-gray-700 px-2 py-1 rounded-full">${agent.tasksCompleted} مهام</span>
1114
+ <button class="agent-toggle p-1 rounded-full ${agent.status === 'active' ? 'bg-green-500 bg-opacity-20 text-green-400' : 'bg-gray-700 text-gray-400'}">
1115
+ <i data-lucide="${agent.status === 'active' ? 'power' : 'power-off'}" class="w-4 h-4"></i>
1116
+ </button>
1117
+ </div>
1118
+ </div>
1119
+ `;
1120
+
1121
+ elements.agentsList.appendChild(agentElement);
1122
+
1123
+ // Add event listener for toggle button
1124
+ const toggleBtn = agentElement.querySelector('.agent-toggle');
1125
+ toggleBtn.addEventListener('click', (e) => {
1126
+ e.stopPropagation();
1127
+ toggleAgentStatus(agent.id);
1128
+ });
1129
+
1130
+ // Add drag events
1131
+ agentElement.addEventListener('dragstart', handleDragStart);
1132
+ agentElement.addEventListener('dragover', handleDragOver);
1133
+ agentElement.addEventListener('drop', handleDrop);
1134
+ agentElement.addEventListener('dragend', handleDragEnd);
1135
+ });
1136
+
1137
+ lucide.createIcons();
1138
+ }
1139
+
1140
+ // Get status color
1141
+ function getStatusColor(status) {
1142
+ switch (status) {
1143
+ case 'active': return 'bg-green-500';
1144
+ case 'busy': return 'bg-yellow-500';
1145
+ case 'inactive': return 'bg-red-500';
1146
+ default: return 'bg-gray-500';
1147
+ }
1148
+ }
1149
+
1150
+ // Get status text
1151
+ function getStatusText(status) {
1152
+ if (config.isRTL) {
1153
+ switch (status) {
1154
+ case 'active': return 'نشط';
1155
+ case 'busy': return 'مشغول';
1156
+ case 'inactive': return 'متوقف';
1157
+ default: return 'غير معروف';
1158
+ }
1159
+ } else {
1160
+ switch (status) {
1161
+ case 'active': return 'Active';
1162
+ case 'busy': return 'Busy';
1163
+ case 'inactive': return 'Inactive';
1164
+ default: return 'Unknown';
1165
+ }
1166
+ }
1167
+ }
1168
+
1169
+ // Toggle agent status
1170
+ function toggleAgentStatus(agentId) {
1171
+ const agent = config.agents.find(a => a.id === agentId);
1172
+ if (!agent) return;
1173
+
1174
+ const newStatus = agent.status === 'active' ? 'inactive' : 'active';
1175
+
1176
+ // Simulate API call
1177
+ showLoading(config.isRTL ? 'جاري تحديث حالة الوكيل...' : 'Updating agent status...');
1178
+
1179
+ setTimeout(() => {
1180
+ agent.status = newStatus;
1181
+ renderAgents();
1182
+ hideLoading();
1183
+
1184
+ if (socket && socket.connected) {
1185
+ socket.emit('agent-status', { agentId, status: newStatus });
1186
+ }
1187
+
1188
+ showToast(
1189
+ config.isRTL ? 'تم تحديث الحالة' : 'Status updated',
1190
+ config.isRTL ? `${agent.name} الآن ${getStatusText(newStatus)}` : `${agent.name} is now ${getStatusText(newStatus)}`,
1191
+ newStatus === 'active' ? 'power' : 'power-off',
1192
+ newStatus === 'active' ? 'green' : 'red'
1193
+ );
1194
+ }, 500);
1195
+ }
1196
+
1197
+ // Update agent status
1198
+ function updateAgentStatus(updatedAgent) {
1199
+ const agentIndex = config.agents.findIndex(a => a.id === updatedAgent.id);
1200
+ if (agentIndex !== -1) {
1201
+ config.agents[agentIndex] = { ...config.agents[agentIndex], ...updatedAgent };
1202
+ renderAgents();
1203
+ }
1204
+ }
1205
+
1206
+ // Add activity to feed
1207
+ function addActivity(activity) {
1208
+ if (elements.emptyActivity) {
1209
+ elements.emptyActivity.remove();
1210
+ elements.emptyActivity = null;
1211
+ }
1212
+
1213
+ const activityType = config.activityTypes.find(t => t.type === activity.type) || config.activityTypes[0];
1214
+
1215
+ const activityElement = document.createElement('div');
1216
+ activityElement.className = 'fade-in p-3 rounded-lg bg-gray-800 bg-opacity-50 flex items-start space-x-3 rtl:space-x-reverse';
1217
+
1218
+ activityElement.innerHTML = `
1219
+ <div class="p-2 rounded-full bg-${activityType.color}-500 bg-opacity-20 flex-shrink-0">
1220
+ <i data-lucide="${activityType.icon}" class="w-5 h-5 text-${activityType.color}-400"></i>
1221
+ </div>
1222
+ <div class="flex-1">
1223
+ <p class="text-sm">${activity.message}</p>
1224
+ <div class="flex items-center justify-between mt-1">
1225
+ <span class="text-xs text-gray-400">${formatTime(activity.timestamp)}</span>
1226
+ <span class="text-xs bg-gray-700 px-2 py-1 rounded-full">${activity.agent || 'System'}</span>
1227
+ </div>
1228
+ </div>
1229
+ `;
1230
+
1231
+ // Add to top of activity feed
1232
+ if (elements.activityFeed.firstChild) {
1233
+ elements.activityFeed.insertBefore(activityElement, elements.activityFeed.firstChild);
1234
+ } else {
1235
+ elements.activityFeed.appendChild(activityElement);
1236
+ }
1237
+
1238
+ // Limit to 50 activities
1239
+ if (elements.activityFeed.children.length > 50) {
1240
+ elements.activityFeed.removeChild(elements.activityFeed.lastChild);
1241
+ }
1242
+
1243
+ lucide.createIcons();
1244
+ }
1245
+
1246
+ // Format time
1247
+ function formatTime(timestamp) {
1248
+ const date = timestamp instanceof Date ? timestamp : new Date(timestamp);
1249
+ const now = new Date();
1250
+ const diff = now - date;
1251
+
1252
+ if (config.isRTL) {
1253
+ if (diff < 60000) { // Less than 1 minute
1254
+ return 'الآن';
1255
+ } else if (diff < 3600000) { // Less than 1 hour
1256
+ const minutes = Math.floor(diff / 60000);
1257
+ return `منذ ${minutes} دقيقة${minutes > 1 ? 'ات' : ''}`;
1258
+ } else if (diff < 86400000) { // Less than 1 day
1259
+ const hours = Math.floor(diff / 3600000);
1260
+ return `منذ ${hours} ساعة${hours > 1 ? 'ات' : ''}`;
1261
+ } else {
1262
+ const days = Math.floor(diff / 86400000);
1263
+ return `منذ ${days} يوم${days > 1 ? 'ين' : ''}`;
1264
+ }
1265
+ } else {
1266
+ if (diff < 60000) { // Less than 1 minute
1267
+ return 'Just now';
1268
+ } else if (diff < 3600000) { // Less than 1 hour
1269
+ const minutes = Math.floor(diff / 60000);
1270
+ return `${minutes} minute${minutes > 1 ? 's' : ''} ago`;
1271
+ } else if (diff < 86400000) { // Less than 1 day
1272
+ const hours = Math.floor(diff / 3600000);
1273
+ return `${hours} hour${hours > 1 ? 's' : ''} ago`;
1274
+ } else {
1275
+ const days = Math.floor(diff / 86400000);
1276
+ return `${days} day${days > 1 ? 's' : ''} ago`;
1277
+ }
1278
+ }
1279
+ }
1280
+
1281
+ // Update quick stats
1282
+ function updateStats(stats) {
1283
+ config.quickStats = { ...config.quickStats, ...stats };
1284
+
1285
+ elements.totalTasks.textContent = config.quickStats.totalTasks;
1286
+ elements.successRate.textContent = `${config.quickStats.successRate}%`;
1287
+ elements.timeSaved.textContent = config.isRTL ?
1288
+ `${config.quickStats.timeSaved} ساعة` :
1289
+ `${config.quickStats.timeSaved} hour${config.quickStats.timeSaved > 1 ? 's' : ''}`;
1290
+ elements.messagesProcessed.textContent = config.quickStats.messagesProcessed;
1291
+ elements.codeWritten.textContent = config.isRTL ?
1292
+ `${config.quickStats.codeWritten} سطر` :
1293
+ `${config.quickStats.codeWritten} line${config.quickStats.codeWritten > 1 ? 's' : ''}`;
1294
+ elements.contentCreated.textContent = config.isRTL ?
1295
+ `${config.quickStats.contentCreated} قطعة` :
1296
+ `${config.quickStats.contentCreated} piece${config.quickStats.contentCreated > 1 ? 's' : ''}`;
1297
+
1298
+ // Update charts
1299
+ updateCharts();
1300
+ }
1301
+
1302
+ // Update charts with new data
1303
+ function updateCharts() {
1304
+ // Update performance chart
1305
+ performanceChart.data.datasets[0].data = config.agents.map(agent => agent.tasksCompleted);
1306
+ performanceChart.update();
1307
+
1308
+ // Update activity chart with random data for demo
1309
+ activityChart.data.datasets[0].data = Array(8).fill().map(() => Math.floor(Math.random() * 30));
1310
+ activityChart.update();
1311
+ }
1312
+
1313
+ // Toggle theme
1314
+ function toggleTheme() {
1315
+ config.isDarkMode = !config.isDarkMode;
1316
+ localStorage.setItem('darkMode', config.isDarkMode);
1317
+ applyTheme();
1318
+ }
1319
+
1320
+ // Apply theme
1321
+ function applyTheme() {
1322
+ if (config.isDarkMode) {
1323
+ elements.body.classList.remove('light-mode');
1324
+ elements.body.classList.add('bg-gradient-to-br', 'from-gray-900', 'to-gray-800', 'text-white');
1325
+ elements.themeToggle.innerHTML = '<i data-lucide="sun" class="w-5 h-5"></i>';
1326
+ } else {
1327
+ elements.body.classList.add('light-mode');
1328
+ elements.body.classList.remove('bg-gradient-to-br', 'from-gray-900', 'to-gray-800', 'text-white');
1329
+ elements.body.classList.add('bg-gradient-to-br', 'from-gray-50', 'to-gray-100', 'text-gray-900');
1330
+ elements.themeToggle.innerHTML = '<i data-lucide="moon" class="w-5 h-5"></i>';
1331
+ }
1332
+
1333
+ // Update charts theme
1334
+ if (activityChart) {
1335
+ activityChart.options.scales.x.grid.color = config.isDarkMode ? 'rgba(255, 255, 255, 0.1)' : 'rgba(0, 0, 0, 0.1)';
1336
+ activityChart.options.scales.x.ticks.color = config.isDarkMode ? '#a0a0a0' : '#6c757d';
1337
+ activityChart.options.scales.y.grid.color = config.isDarkMode ? 'rgba(255, 255, 255, 0.1)' : 'rgba(0, 0, 0, 0.1)';
1338
+ activityChart.options.scales.y.ticks.color = config.isDarkMode ? '#a0a0a0' : '#6c757d';
1339
+ activityChart.update();
1340
+ }
1341
+
1342
+ lucide.createIcons();
1343
+ }
1344
+
1345
+ // Toggle language
1346
+ function toggleLanguage() {
1347
+ config.language = config.language === 'ar' ? 'en' : 'ar';
1348
+ config.isRTL = config.language === 'ar';
1349
+ localStorage.setItem('language', config.language);
1350
+ applyLanguage();
1351
+ }
1352
+
1353
+ // Apply language
1354
+ function applyLanguage() {
1355
+ // Change HTML direction
1356
+ document.documentElement.dir = config.isRTL ? 'rtl' : 'ltr';
1357
+ document.documentElement.lang = config.language;
1358
+
1359
+ // Update language toggle button
1360
+ elements.languageToggle.textContent = config.isRTL ? 'EN' : 'AR';
1361
+
1362
+ // Update UI texts (simplified for demo)
1363
+ if (config.isRTL) {
1364
+ document.querySelector('title').textContent = 'FahadNeo AI - نظام الذكاء الاصطناعي متعدد الوكلاء';
1365
+ elements.connectionStatus.querySelector('span').textContent = 'غير متصل';
1366
+ elements.commandInput.placeholder = 'اكتب أمراً هنا أو اضغط / للأوامر الصوتية...';
1367
+ document.querySelector('header input[type="text"]').placeholder = 'ابحث...';
1368
+ elements.loadingText.textContent = 'جاري المعالجة...';
1369
+ elements.voiceStatus.textContent = 'اضغط على الميكروفون لبدء الاستماع...';
1370
+ elements.startVoiceBtn.innerHTML = '<i data-lucide="mic" class="w-5 h-5 mr-2 rtl:ml-2 rtl:mr-0"></i><span>بدء الاستماع</span>';
1371
+ } else {
1372
+ document.querySelector('title').textContent = 'FahadNeo AI - Multi-Agent AI System';
1373
+ elements.connectionStatus.querySelector('span').textContent = 'Disconnected';
1374
+ elements.commandInput.placeholder = 'Type a command here or press / for voice commands...';
1375
+ document.querySelector('header input[type="text"]').placeholder = 'Search...';
1376
+ elements.loadingText.textContent = 'Processing...';
1377
+ elements.voiceStatus.textContent = 'Press the microphone to start listening...';
1378
+ elements.startVoiceBtn.innerHTML = '<i data-lucide="mic" class="w-5 h-5 mr-2 rtl:ml-2 rtl:mr-0"></i><span>Start Listening</span>';
1379
+ }
1380
+
1381
+ // Re-render agents to update status texts
1382
+ renderAgents();
1383
+
1384
+ // Re-render activities to update timestamps
1385
+ if (elements.activityFeed.children.length > 0) {
1386
+ const activities = Array.from(elements.activityFeed.children).map(el => {
1387
+ return {
1388
+ message: el.querySelector('p').textContent,
1389
+ timestamp: new Date(), // Simplified for demo
1390
+ agent: el.querySelector('.bg-gray-700').textContent,
1391
+ type: el.querySelector('i').getAttribute('data-lucide') === 'check-circle' ? 'task-completed' : 'info'
1392
+ };
1393
+ });
1394
+
1395
+ elements.activityFeed.innerHTML = '';
1396
+ activities.forEach(activity => addActivity(activity));
1397
+ }
1398
+
1399
+ lucide.createIcons();
1400
+ }
1401
+
1402
+ // Update connection status
1403
+ function updateConnectionStatus(connected) {
1404
+ const statusElement = elements.connectionStatus;
1405
+ const dot = statusElement.querySelector('div');
1406
+ const text = statusElement.querySelector('span');
1407
+
1408
+ if (connected) {
1409
+ dot.classList.remove('bg-red-500');
1410
+ dot.classList.add('bg-green-500');
1411
+ text.textContent = config.isRTL ? 'متصل' : 'Connected';
1412
+ } else {
1413
+ dot.classList.remove('bg-green-500');
1414
+ dot.classList.add('bg-red-500');
1415
+ text.textContent = config.isRTL ? 'غير متصل' : 'Disconnected';
1416
+ }
1417
+ }
1418
+
1419
+ // Show voice modal
1420
+ function showVoiceModal() {
1421
+ elements.voiceModal.classList.remove('hidden');
1422
+ elements.voiceTranscript.classList.add('hidden');
1423
+ elements.voiceTranscript.textContent = '';
1424
+ elements.voiceStatus.textContent = config.isRTL ? 'اضغط على الميكروفون لبدء الاستماع...' : 'Press the microphone to start listening...';
1425
+ }
1426
+
1427
+ // Hide voice modal
1428
+ function hideVoiceModal() {
1429
+ elements.voiceModal.classList.add('hidden');
1430
+ if (recognition) {
1431
+ recognition.stop();
1432
+ }
1433
+ }
1434
+
1435
+ // Start voice recognition
1436
+ function startVoiceRecognition() {
1437
+ if (!recognition) {
1438
+ showToast('خطأ', 'التعرف الصوتي غير مدعوم في متصفحك', 'alert-circle', 'red');
1439
+ return;
1440
+ }
1441
+
1442
+ try {
1443
+ recognition.lang = config.language === 'ar' ? 'ar-SA' : 'en-US';
1444
+ recognition.start();
1445
+
1446
+ // Show voice indicator in header
1447
+ elements.voiceIndicator.classList.remove('hidden');
1448
+ } catch (err) {
1449
+ console.error('Voice recognition error:', err);
1450
+ showToast
1451
+ <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=fsalmansour/fahadai" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
1452
+ </html>