Review revise and update with refined refactoring and upscaled optimization expanding this out to be at least four times its original size and magnitude.
Browse files- agents.html +156 -0
- components/chart.js +143 -0
- components/stat-card.js +107 -0
- components/terminal.js +187 -0
- index.html +176 -5
- settings.html +55 -0
- tasks.html +192 -0
agents.html
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Agents | Operation Void Control</title>
|
| 7 |
+
<link rel="stylesheet" href="style.css">
|
| 8 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 9 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 10 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 11 |
+
<script>
|
| 12 |
+
tailwind.config = {
|
| 13 |
+
theme: {
|
| 14 |
+
extend: {
|
| 15 |
+
colors: {
|
| 16 |
+
void: { 900: '#050505', 800: '#0a0a0a', 700: '#121212' },
|
| 17 |
+
neon: { green: '#22c55e', orange: '#f97316', gold: '#ffd700', red: '#ef4444' }
|
| 18 |
+
},
|
| 19 |
+
fontFamily: { mono: ['ui-monospace', 'SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', "Liberation Mono", "Courier New", 'monospace'] }
|
| 20 |
+
}
|
| 21 |
+
}
|
| 22 |
+
}
|
| 23 |
+
</script>
|
| 24 |
+
</head>
|
| 25 |
+
<body class="bg-void-900 text-gray-300 font-sans antialiased overflow-hidden h-screen flex flex-col relative">
|
| 26 |
+
<div class="absolute inset-0 z-0 pointer-events-none opacity-[0.03] pattern-metatron"></div>
|
| 27 |
+
<div class="absolute inset-0 z-0 pointer-events-none opacity-[0.05] pattern-flower"></div>
|
| 28 |
+
|
| 29 |
+
<custom-navbar></custom-navbar>
|
| 30 |
+
|
| 31 |
+
<div class="flex flex-1 overflow-hidden relative z-10">
|
| 32 |
+
<custom-sidebar></custom-sidebar>
|
| 33 |
+
|
| 34 |
+
<main class="flex-1 overflow-y-auto p-6 md:p-8">
|
| 35 |
+
<header class="mb-8 border-b border-gray-800 pb-4">
|
| 36 |
+
<h1 class="text-3xl font-bold text-white tracking-wider uppercase font-mono">Agent Fleet</h1>
|
| 37 |
+
<p class="text-sm text-neon-green mt-1">Manage and monitor deployed agents</p>
|
| 38 |
+
</header>
|
| 39 |
+
|
| 40 |
+
<!-- Agent Stats -->
|
| 41 |
+
<div class="grid grid-cols-1 md:grid-cols-4 gap-6 mb-8">
|
| 42 |
+
<div class="bg-void-800 border border-gray-800 rounded-lg p-5">
|
| 43 |
+
<h3 class="text-gray-400 text-xs uppercase">Total Agents</h3>
|
| 44 |
+
<div class="text-2xl font-bold text-white mt-2 font-mono">156</div>
|
| 45 |
+
</div>
|
| 46 |
+
<div class="bg-void-800 border border-gray-800 rounded-lg p-5">
|
| 47 |
+
<h3 class="text-gray-400 text-xs uppercase">Online</h3>
|
| 48 |
+
<div class="text-2xl font-bold text-neon-green mt-2 font-mono">142</div>
|
| 49 |
+
</div>
|
| 50 |
+
<div class="bg-void-800 border border-gray-800 rounded-lg p-5">
|
| 51 |
+
<h3 class="text-gray-400 text-xs uppercase">Busy</h3>
|
| 52 |
+
<div class="text-2xl font-bold text-neon-orange mt-2 font-mono">12</div>
|
| 53 |
+
</div>
|
| 54 |
+
<div class="bg-void-800 border border-gray-800 rounded-lg p-5">
|
| 55 |
+
<h3 class="text-gray-400 text-xs uppercase">Offline</h3>
|
| 56 |
+
<div class="text-2xl font-bold text-gray-500 mt-2 font-mono">2</div>
|
| 57 |
+
</div>
|
| 58 |
+
</div>
|
| 59 |
+
|
| 60 |
+
<!-- Agent Filters -->
|
| 61 |
+
<div class="bg-void-800 border border-gray-800 rounded-lg p-4 mb-6 flex flex-wrap gap-4 items-center">
|
| 62 |
+
<input type="text" placeholder="Search agents..." class="bg-void-900 border border-gray-700 rounded-lg px-4 py-2 text-sm text-white focus:border-neon-green focus:outline-none">
|
| 63 |
+
<select class="bg-void-900 border border-gray-700 rounded-lg px-4 py-2 text-sm text-gray-300 focus:border-neon-green focus:outline-none">
|
| 64 |
+
<option>All Status</option>
|
| 65 |
+
<option>Online</option>
|
| 66 |
+
<option>Busy</option>
|
| 67 |
+
<option>Offline</option>
|
| 68 |
+
</select>
|
| 69 |
+
<select class="bg-void-900 border border-gray-700 rounded-lg px-4 py-2 text-sm text-gray-300 focus:border-neon-green focus:outline-none">
|
| 70 |
+
<option>All Regions</option>
|
| 71 |
+
<option>US-East-1</option>
|
| 72 |
+
<option>US-West-2</option>
|
| 73 |
+
<option>EU-West-1</option>
|
| 74 |
+
<option>Asia-Pac-1</option>
|
| 75 |
+
</select>
|
| 76 |
+
<button class="ml-auto bg-neon-green/10 text-neon-green border border-neon-green/30 px-4 py-2 rounded-lg text-sm hover:bg-neon-green/20 transition-colors flex items-center gap-2">
|
| 77 |
+
<i data-feather="plus" class="w-4 h-4"></i> Deploy New
|
| 78 |
+
</button>
|
| 79 |
+
</div>
|
| 80 |
+
|
| 81 |
+
<!-- Agent List -->
|
| 82 |
+
<div class="bg-void-800 border border-gray-800 rounded-xl overflow-hidden">
|
| 83 |
+
<table class="w-full text-left border-collapse">
|
| 84 |
+
<thead>
|
| 85 |
+
<tr class="text-xs text-gray-500 uppercase bg-void-900 border-b border-gray-800">
|
| 86 |
+
<th class="px-6 py-3">Agent ID</th>
|
| 87 |
+
<th class="px-6 py-3">Status</th>
|
| 88 |
+
<th class="px-6 py-3">Region</th>
|
| 89 |
+
<th class="px-6 py-3">IP Address</th>
|
| 90 |
+
<th class="px-6 py-3">Latency</th>
|
| 91 |
+
<th class="px-6 py-3">Uptime</th>
|
| 92 |
+
<th class="px-6 py-3">Last Seen</th>
|
| 93 |
+
<th class="px-6 py-3 text-right">Actions</th>
|
| 94 |
+
</tr>
|
| 95 |
+
</thead>
|
| 96 |
+
<tbody class="text-sm divide-y divide-gray-800" id="agent-table">
|
| 97 |
+
<!-- Populated by JS -->
|
| 98 |
+
</tbody>
|
| 99 |
+
</table>
|
| 100 |
+
</div>
|
| 101 |
+
</main>
|
| 102 |
+
</div>
|
| 103 |
+
|
| 104 |
+
<script src="components/navbar.js"></script>
|
| 105 |
+
<script src="components/sidebar.js"></script>
|
| 106 |
+
<script src="script.js"></script>
|
| 107 |
+
<script>
|
| 108 |
+
feather.replace();
|
| 109 |
+
|
| 110 |
+
// Sample agent data
|
| 111 |
+
const agents = [
|
| 112 |
+
{ id: 'AGNT-001', status: 'online', region: 'US-East-1', ip: '192.168.1.42', latency: '24ms', uptime: '47d 12h', lastSeen: '2s ago' },
|
| 113 |
+
{ id: 'AGNT-002', status: 'busy', region: 'EU-West-1', ip: '10.0.0.156', latency: '89ms', uptime: '32d 8h', lastSeen: '5s ago' },
|
| 114 |
+
{ id: 'AGNT-003', status: 'online', region: 'Asia-Pac-1', ip: '172.16.0.78', latency: '156ms', uptime: '15d 4h', lastSeen: '1s ago' },
|
| 115 |
+
{ id: 'AGNT-004', status: 'online', region: 'US-West-2', ip: '203.0.113.45', latency: '67ms', uptime: '61d 19h', lastSeen: '3s ago' },
|
| 116 |
+
{ id: 'AGNT-005', status: 'offline', region: 'EU-Central-1', ip: '198.51.100.23', latency: '--', uptime: '0d 0h', lastSeen: '2h ago' },
|
| 117 |
+
{ id: 'AGNT-006', status: 'online', region: 'US-East-1', ip: '192.0.2.167', latency: '31ms', uptime: '28d 14h', lastSeen: '1s ago' },
|
| 118 |
+
{ id: 'AGNT-007', status: 'busy', region: 'Asia-Pac-2', ip: '10.1.2.89', latency: '203ms', uptime: '19d 7h', lastSeen: '8s ago' },
|
| 119 |
+
{ id: 'AGNT-008', status: 'online', region: 'SA-East-1', ip: '177.44.12.9', latency: '178ms', uptime: '52d 3h', lastSeen: '2s ago' },
|
| 120 |
+
];
|
| 121 |
+
|
| 122 |
+
const statusColors = {
|
| 123 |
+
online: 'bg-neon-green/10 text-neon-green border-neon-green/20',
|
| 124 |
+
busy: 'bg-neon-orange/10 text-neon-orange border-neon-orange/20',
|
| 125 |
+
offline: 'bg-gray-700/30 text-gray-400 border-gray-600'
|
| 126 |
+
};
|
| 127 |
+
|
| 128 |
+
const tbody = document.getElementById('agent-table');
|
| 129 |
+
tbody.innerHTML = agents.map(agent => `
|
| 130 |
+
<tr class="group hover:bg-white/5 transition-colors">
|
| 131 |
+
<td class="px-6 py-4 font-mono text-neon-green">${agent.id}</td>
|
| 132 |
+
<td class="px-6 py-4"><span class="px-2 py-1 rounded text-[10px] border ${statusColors[agent.status]}">${agent.status.toUpperCase()}</span></td>
|
| 133 |
+
<td class="px-6 py-4 text-gray-400">${agent.region}</td>
|
| 134 |
+
<td class="px-6 py-4 text-gray-400 font-mono">${agent.ip}</td>
|
| 135 |
+
<td class="px-6 py-4 text-gray-400 font-mono">${agent.latency}</td>
|
| 136 |
+
<td class="px-6 py-4 text-gray-400 font-mono">${agent.uptime}</td>
|
| 137 |
+
<td class="px-6 py-4 text-gray-400">${agent.lastSeen}</td>
|
| 138 |
+
<td class="px-6 py-4 text-right">
|
| 139 |
+
<div class="flex justify-end gap-2">
|
| 140 |
+
<button class="p-1 rounded hover:bg-gray-700 text-gray-400 hover:text-white" title="View Details">
|
| 141 |
+
<i data-feather="eye" class="w-4 h-4"></i>
|
| 142 |
+
</button>
|
| 143 |
+
<button class="p-1 rounded hover:bg-gray-700 text-gray-400 hover:text-white" title="Connect">
|
| 144 |
+
<i data-feather="link" class="w-4 h-4"></i>
|
| 145 |
+
</button>
|
| 146 |
+
<button class="p-1 rounded hover:bg-gray-700 text-gray-400 hover:text-neon-red" title="Terminate">
|
| 147 |
+
<i data-feather="x-circle" class="w-4 h-4"></i>
|
| 148 |
+
</button>
|
| 149 |
+
</div>
|
| 150 |
+
</td>
|
| 151 |
+
</tr>
|
| 152 |
+
`).join('');
|
| 153 |
+
feather.replace();
|
| 154 |
+
</script>
|
| 155 |
+
</body>
|
| 156 |
+
</html>
|
components/chart.js
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
class CustomChart extends HTMLElement {
|
| 2 |
+
constructor() {
|
| 3 |
+
super();
|
| 4 |
+
}
|
| 5 |
+
|
| 6 |
+
connectedCallback() {
|
| 7 |
+
this.attachShadow({ mode: 'open' });
|
| 8 |
+
|
| 9 |
+
const type = this.getAttribute('type') || 'line';
|
| 10 |
+
const data = (this.getAttribute('data') || '').split(',').map(Number);
|
| 11 |
+
const labels = (this.getAttribute('labels') || '').split(',');
|
| 12 |
+
|
| 13 |
+
const max = Math.max(...data);
|
| 14 |
+
const min = Math.min(...data);
|
| 15 |
+
const range = max - min || 1;
|
| 16 |
+
|
| 17 |
+
const width = 600;
|
| 18 |
+
const height = 200;
|
| 19 |
+
const padding = 30;
|
| 20 |
+
|
| 21 |
+
// Generate points for line chart
|
| 22 |
+
const points = data.map((value, index) => {
|
| 23 |
+
const x = padding + (index / (data.length - 1)) * (width - 2 * padding);
|
| 24 |
+
const y = height - padding - ((value - min) / range) * (height - 2 * padding);
|
| 25 |
+
return `${x},${y}`;
|
| 26 |
+
}).join(' ');
|
| 27 |
+
|
| 28 |
+
// Generate grid lines
|
| 29 |
+
let gridLines = '';
|
| 30 |
+
for (let i = 0; i <= 4; i++) {
|
| 31 |
+
const y = padding + (i / 4) * (height - 2 * padding);
|
| 32 |
+
gridLines += `<line x1="${padding}" y1="${y}" x2="${width - padding}" y2="${y}" class="chart-grid"/>`;
|
| 33 |
+
}
|
| 34 |
+
|
| 35 |
+
// Generate data points (circles)
|
| 36 |
+
let pointCircles = '';
|
| 37 |
+
data.forEach((value, index) => {
|
| 38 |
+
const x = padding + (index / (data.length - 1)) * (width - 2 * padding);
|
| 39 |
+
const y = height - padding - ((value - min) / range) * (height - 2 * padding);
|
| 40 |
+
pointCircles += `<circle cx="${x}" cy="${y}" class="chart-point" data-value="${value}"/>`;
|
| 41 |
+
});
|
| 42 |
+
|
| 43 |
+
// Generate labels
|
| 44 |
+
let xLabels = '';
|
| 45 |
+
labels.forEach((label, index) => {
|
| 46 |
+
const x = padding + (index / (labels.length - 1)) * (width - 2 * padding);
|
| 47 |
+
xLabels += `<text x="${x}" y="${height - 8}" class="chart-label" text-anchor="middle">${label}</text>`;
|
| 48 |
+
});
|
| 49 |
+
|
| 50 |
+
// Generate y-axis labels
|
| 51 |
+
let yLabels = '';
|
| 52 |
+
for (let i = 0; i <= 4; i++) {
|
| 53 |
+
const y = padding + (i / 4) * (height - 2 * padding);
|
| 54 |
+
const value = Math.round(max - (i / 4) * range);
|
| 55 |
+
yLabels += `<text x="${padding - 8}" y="${y + 4}" class="chart-label" text-anchor="end">${value}</text>`;
|
| 56 |
+
}
|
| 57 |
+
|
| 58 |
+
this.shadowRoot.innerHTML = `
|
| 59 |
+
<style>
|
| 60 |
+
:host {
|
| 61 |
+
display: block;
|
| 62 |
+
width: 100%;
|
| 63 |
+
}
|
| 64 |
+
svg {
|
| 65 |
+
width: 100%;
|
| 66 |
+
height: 100%;
|
| 67 |
+
overflow: visible;
|
| 68 |
+
}
|
| 69 |
+
.chart-line {
|
| 70 |
+
fill: none;
|
| 71 |
+
stroke: #22c55e;
|
| 72 |
+
stroke-width: 2;
|
| 73 |
+
stroke-linecap: round;
|
| 74 |
+
stroke-linejoin: round;
|
| 75 |
+
filter: drop-shadow(0 0 4px rgba(34, 197, 94, 0.5));
|
| 76 |
+
}
|
| 77 |
+
.chart-grid {
|
| 78 |
+
stroke: #1f2937;
|
| 79 |
+
stroke-width: 1;
|
| 80 |
+
stroke-dasharray: 4 4;
|
| 81 |
+
}
|
| 82 |
+
.chart-label {
|
| 83 |
+
fill: #6b7280;
|
| 84 |
+
font-size: 10px;
|
| 85 |
+
font-family: monospace;
|
| 86 |
+
}
|
| 87 |
+
.chart-point {
|
| 88 |
+
fill: #0a0a0a;
|
| 89 |
+
stroke: #22c55e;
|
| 90 |
+
stroke-width: 2;
|
| 91 |
+
r: 4;
|
| 92 |
+
transition: all 0.2s;
|
| 93 |
+
cursor: pointer;
|
| 94 |
+
}
|
| 95 |
+
.chart-point:hover {
|
| 96 |
+
r: 6;
|
| 97 |
+
fill: #22c55e;
|
| 98 |
+
}
|
| 99 |
+
.tooltip {
|
| 100 |
+
position: absolute;
|
| 101 |
+
background: #1f2937;
|
| 102 |
+
color: #fff;
|
| 103 |
+
padding: 4px 8px;
|
| 104 |
+
border-radius: 4px;
|
| 105 |
+
font-size: 12px;
|
| 106 |
+
pointer-events: none;
|
| 107 |
+
opacity: 0;
|
| 108 |
+
transition: opacity 0.2s;
|
| 109 |
+
}
|
| 110 |
+
</style>
|
| 111 |
+
<div style="height: 200px; position: relative;">
|
| 112 |
+
<svg viewBox="0 0 ${width} ${height}">
|
| 113 |
+
${gridLines}
|
| 114 |
+
<polyline points="${points}" class="chart-line"/>
|
| 115 |
+
${pointCircles}
|
| 116 |
+
${xLabels}
|
| 117 |
+
${yLabels}
|
| 118 |
+
</svg>
|
| 119 |
+
</div>
|
| 120 |
+
`;
|
| 121 |
+
|
| 122 |
+
// Add tooltips
|
| 123 |
+
const points = this.shadowRoot.querySelectorAll('.chart-point');
|
| 124 |
+
points.forEach(point => {
|
| 125 |
+
point.addEventListener('mouseenter', (e) => {
|
| 126 |
+
const tooltip = document.createElement('div');
|
| 127 |
+
tooltip.className = 'tooltip';
|
| 128 |
+
tooltip.textContent = `Value: ${e.target.dataset.value}`;
|
| 129 |
+
tooltip.style.left = `${e.target.cx.baseVal.value + 10}px`;
|
| 130 |
+
tooltip.style.top = `${e.target.cy.baseVal.value - 30}px`;
|
| 131 |
+
this.shadowRoot.appendChild(tooltip);
|
| 132 |
+
setTimeout(() => tooltip.style.opacity = '1', 10);
|
| 133 |
+
});
|
| 134 |
+
|
| 135 |
+
point.addEventListener('mouseleave', () => {
|
| 136 |
+
const tooltip = this.shadowRoot.querySelector('.tooltip');
|
| 137 |
+
if (tooltip) tooltip.remove();
|
| 138 |
+
});
|
| 139 |
+
});
|
| 140 |
+
}
|
| 141 |
+
}
|
| 142 |
+
|
| 143 |
+
customElements.define('custom-chart', CustomChart);
|
components/stat-card.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
class CustomStatCard extends HTMLElement {
|
| 2 |
+
constructor() {
|
| 3 |
+
super();
|
| 4 |
+
}
|
| 5 |
+
|
| 6 |
+
connectedCallback() {
|
| 7 |
+
this.attachShadow({ mode: 'open' });
|
| 8 |
+
|
| 9 |
+
const title = this.getAttribute('title') || 'Metric';
|
| 10 |
+
const value = this.getAttribute('value') || '0';
|
| 11 |
+
const color = this.getAttribute('color') || 'green';
|
| 12 |
+
const icon = this.getAttribute('icon') || 'activity';
|
| 13 |
+
const trend = this.getAttribute('trend') || '';
|
| 14 |
+
|
| 15 |
+
const colorMap = {
|
| 16 |
+
green: '#22c55e',
|
| 17 |
+
orange: '#f97316',
|
| 18 |
+
gold: '#ffd700',
|
| 19 |
+
red: '#ef4444',
|
| 20 |
+
blue: '#3b82f6',
|
| 21 |
+
purple: '#a855f7'
|
| 22 |
+
};
|
| 23 |
+
|
| 24 |
+
const accentColor = colorMap[color] || colorMap.green;
|
| 25 |
+
|
| 26 |
+
let trendHtml = '';
|
| 27 |
+
if (trend) {
|
| 28 |
+
const isPositive = trend.includes('+') || trend === 'record';
|
| 29 |
+
const isNegative = trend.includes('-');
|
| 30 |
+
const isNeutral = trend === 'stable';
|
| 31 |
+
|
| 32 |
+
if (isPositive) {
|
| 33 |
+
trendHtml = `<div class="text-xs text-neon-green mt-1 flex items-center">
|
| 34 |
+
<svg class="w-3 h-3 mr-1" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="23 6 13.5 15.5 8.5 10.5 1 18"></polyline><polyline points="17 6 23 6 23 12"></polyline></svg>
|
| 35 |
+
${trend}
|
| 36 |
+
</div>`;
|
| 37 |
+
} else if (isNegative) {
|
| 38 |
+
trendHtml = `<div class="text-xs text-neon-red mt-1 flex items-center">
|
| 39 |
+
<svg class="w-3 h-3 mr-1" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="23 18 13.5 8.5 8.5 13.5 1 6"></polyline><polyline points="17 18 23 18 23 12"></polyline></svg>
|
| 40 |
+
${trend}
|
| 41 |
+
</div>`;
|
| 42 |
+
} else {
|
| 43 |
+
trendHtml = `<div class="text-xs text-gray-400 mt-1">${trend}</div>`;
|
| 44 |
+
}
|
| 45 |
+
}
|
| 46 |
+
|
| 47 |
+
this.shadowRoot.innerHTML = `
|
| 48 |
+
<style>
|
| 49 |
+
:host {
|
| 50 |
+
display: block;
|
| 51 |
+
}
|
| 52 |
+
.card {
|
| 53 |
+
background-color: #0a0a0a;
|
| 54 |
+
border: 1px solid #1f2937;
|
| 55 |
+
border-radius: 0.5rem;
|
| 56 |
+
padding: 1rem;
|
| 57 |
+
position: relative;
|
| 58 |
+
overflow: hidden;
|
| 59 |
+
transition: all 0.2s;
|
| 60 |
+
}
|
| 61 |
+
.card:hover {
|
| 62 |
+
border-color: ${accentColor};
|
| 63 |
+
box-shadow: 0 0 20px rgba(${parseInt(accentColor.slice(1,3),16)}, ${parseInt(accentColor.slice(3,5),16)}, ${parseInt(accentColor.slice(5,7),16)}, 0.15);
|
| 64 |
+
}
|
| 65 |
+
.icon-bg {
|
| 66 |
+
position: absolute;
|
| 67 |
+
right: 8px;
|
| 68 |
+
top: 8px;
|
| 69 |
+
opacity: 0.1;
|
| 70 |
+
transition: opacity 0.2s;
|
| 71 |
+
}
|
| 72 |
+
.card:hover .icon-bg {
|
| 73 |
+
opacity: 0.2;
|
| 74 |
+
}
|
| 75 |
+
.title {
|
| 76 |
+
color: #9ca3af;
|
| 77 |
+
font-size: 0.65rem;
|
| 78 |
+
text-transform: uppercase;
|
| 79 |
+
letter-spacing: 0.1em;
|
| 80 |
+
font-weight: 700;
|
| 81 |
+
}
|
| 82 |
+
.value {
|
| 83 |
+
color: #fff;
|
| 84 |
+
font-size: 1.25rem;
|
| 85 |
+
font-weight: 700;
|
| 86 |
+
margin-top: 0.5rem;
|
| 87 |
+
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
|
| 88 |
+
}
|
| 89 |
+
</style>
|
| 90 |
+
<div class="card">
|
| 91 |
+
<div class="icon-bg">
|
| 92 |
+
<svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="${accentColor}" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" data-feather="${icon}"></svg>
|
| 93 |
+
</div>
|
| 94 |
+
<div class="title">${title}</div>
|
| 95 |
+
<div class="value">${value}</div>
|
| 96 |
+
${trendHtml}
|
| 97 |
+
</div>
|
| 98 |
+
`;
|
| 99 |
+
|
| 100 |
+
// Load feather icons for this component
|
| 101 |
+
if (typeof feather !== 'undefined') {
|
| 102 |
+
feather.replace();
|
| 103 |
+
}
|
| 104 |
+
}
|
| 105 |
+
}
|
| 106 |
+
|
| 107 |
+
customElements.define('custom-stat-card', CustomStatCard);
|
components/terminal.js
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
class CustomTerminal extends HTMLElement {
|
| 2 |
+
constructor() {
|
| 3 |
+
super();
|
| 4 |
+
this.commands = [];
|
| 5 |
+
this.history = [];
|
| 6 |
+
this.historyIndex = -1;
|
| 7 |
+
}
|
| 8 |
+
|
| 9 |
+
connectedCallback() {
|
| 10 |
+
this.attachShadow({ mode: 'open' });
|
| 11 |
+
|
| 12 |
+
this.shadowRoot.innerHTML = `
|
| 13 |
+
<style>
|
| 14 |
+
:host {
|
| 15 |
+
display: block;
|
| 16 |
+
}
|
| 17 |
+
.terminal {
|
| 18 |
+
background: #050505;
|
| 19 |
+
border: 1px solid #1f2937;
|
| 20 |
+
border-radius: 8px;
|
| 21 |
+
overflow: hidden;
|
| 22 |
+
}
|
| 23 |
+
.terminal-header {
|
| 24 |
+
background: #0a0a0a;
|
| 25 |
+
padding: 8px 16px;
|
| 26 |
+
border-bottom: 1px solid #1f2937;
|
| 27 |
+
display: flex;
|
| 28 |
+
align-items: center;
|
| 29 |
+
gap: 8px;
|
| 30 |
+
}
|
| 31 |
+
.terminal-dot {
|
| 32 |
+
width: 12px;
|
| 33 |
+
height: 12px;
|
| 34 |
+
border-radius: 50%;
|
| 35 |
+
}
|
| 36 |
+
.terminal-dot.red { background: #ef4444; }
|
| 37 |
+
.terminal-dot.yellow { background: #f97316; }
|
| 38 |
+
.terminal-dot.green { background: #22c55e; }
|
| 39 |
+
.terminal-title {
|
| 40 |
+
flex: 1;
|
| 41 |
+
text-align: center;
|
| 42 |
+
color: #6b7280;
|
| 43 |
+
font-size: 12px;
|
| 44 |
+
font-family: monospace;
|
| 45 |
+
}
|
| 46 |
+
.terminal-body {
|
| 47 |
+
padding: 16px;
|
| 48 |
+
height: 300px;
|
| 49 |
+
overflow-y: auto;
|
| 50 |
+
font-family: monospace;
|
| 51 |
+
font-size: 13px;
|
| 52 |
+
}
|
| 53 |
+
.terminal-line {
|
| 54 |
+
padding: 4px 0;
|
| 55 |
+
line-height: 1.5;
|
| 56 |
+
}
|
| 57 |
+
.terminal-prompt {
|
| 58 |
+
color: #22c55e;
|
| 59 |
+
}
|
| 60 |
+
.terminal-input {
|
| 61 |
+
background: transparent;
|
| 62 |
+
border: none;
|
| 63 |
+
outline: none;
|
| 64 |
+
color: #fff;
|
| 65 |
+
font-family: inherit;
|
| 66 |
+
font-size: inherit;
|
| 67 |
+
width: calc(100% - 20px);
|
| 68 |
+
}
|
| 69 |
+
.timestamp {
|
| 70 |
+
color: #4b5563;
|
| 71 |
+
margin-right: 8px;
|
| 72 |
+
}
|
| 73 |
+
.cmd { color: #22c55e; }
|
| 74 |
+
.error { color: #ef4444; }
|
| 75 |
+
.warn { color: #f97316; }
|
| 76 |
+
.info { color: #3b82f6; }
|
| 77 |
+
.success { color: #22c55e; }
|
| 78 |
+
.muted { color: #6b7280; }
|
| 79 |
+
|
| 80 |
+
::-webkit-scrollbar {
|
| 81 |
+
width: 6px;
|
| 82 |
+
}
|
| 83 |
+
::-webkit-scrollbar-track {
|
| 84 |
+
background: #050505;
|
| 85 |
+
}
|
| 86 |
+
::-webkit-scrollbar-thumb {
|
| 87 |
+
background: #1f2937;
|
| 88 |
+
border-radius: 3px;
|
| 89 |
+
}
|
| 90 |
+
</style>
|
| 91 |
+
<div class="terminal">
|
| 92 |
+
<div class="terminal-header">
|
| 93 |
+
<div class="terminal-dot red"></div>
|
| 94 |
+
<div class="terminal-dot yellow"></div>
|
| 95 |
+
<div class="terminal-dot green"></div>
|
| 96 |
+
<div class="terminal-title">clawdbot-terminal</div>
|
| 97 |
+
</div>
|
| 98 |
+
<div class="terminal-body" id="output"></div>
|
| 99 |
+
<div style="padding: 12px 16px; display: flex; align-items: center;">
|
| 100 |
+
<span class="terminal-prompt">$</span>
|
| 101 |
+
<input type="text" class="terminal-input" id="input" placeholder="Enter command..." autofocus>
|
| 102 |
+
</div>
|
| 103 |
+
</div>
|
| 104 |
+
`;
|
| 105 |
+
|
| 106 |
+
this.output = this.shadowRoot.getElementById('output');
|
| 107 |
+
this.input = this.shadowRoot.getElementById('input');
|
| 108 |
+
|
| 109 |
+
// Built-in commands
|
| 110 |
+
this.commands = {
|
| 111 |
+
help: () => this.print('Available commands: help, clear, status, agents, tasks, scan, deploy, version, date, echo [text]'),
|
| 112 |
+
clear: () => this.output.innerHTML = '',
|
| 113 |
+
status: () => this.print('SYSTEM STATUS: ONLINE\nActive Agents: 42\nPending Tasks: 8\nSecurity Level: HIGH', 'success'),
|
| 114 |
+
agents: () => this.print('Active Agents:\n- AGNT-099 (ONLINE)\n- AGNT-104 (BUSY)\n- AGNT-112 (OFFLINE)', 'info'),
|
| 115 |
+
tasks: () => this.print('Pending Tasks:\n1. Network scan (Priority: HIGH)\n2. Data extraction (Priority: MED)\n3. System update (Priority: LOW)', 'info'),
|
| 116 |
+
scan: () => {
|
| 117 |
+
this.print('Initiating network scan...', 'warn');
|
| 118 |
+
setTimeout(() => this.print('Scan complete. 156 nodes detected. 0 vulnerabilities found.', 'success'), 2000);
|
| 119 |
+
},
|
| 120 |
+
deploy: () => this.print('Deployment requires authorization level 4.', 'error'),
|
| 121 |
+
version: () => this.print('Clawdbot C2 v3.2.0\nBuild: 2024.01.15', 'info'),
|
| 122 |
+
date: () => this.print(new Date().toString(), 'info'),
|
| 123 |
+
echo: (args) => this.print(args.join(' ')),
|
| 124 |
+
whoami: () => this.print('Commander Shepard (Level 4 Access)', 'success'),
|
| 125 |
+
ls: () => this.print('agents/ tasks/ logs/ config/ keys/', 'info'),
|
| 126 |
+
pwd: () => this.print('/root/clawdbot', 'info'),
|
| 127 |
+
top: () => this.print('CPU: 67% MEM: 4.2GB NET: 1.2GB/s', 'info')
|
| 128 |
+
};
|
| 129 |
+
|
| 130 |
+
this.print('Clawdbot Terminal v1.0', 'success');
|
| 131 |
+
this.print('Type "help" for available commands.\n', 'muted');
|
| 132 |
+
|
| 133 |
+
this.input.addEventListener('keydown', (e) => {
|
| 134 |
+
if (e.key === 'Enter') {
|
| 135 |
+
const command = this.input.value.trim();
|
| 136 |
+
if (command) {
|
| 137 |
+
this.executeCommand(command);
|
| 138 |
+
this.history.push(command);
|
| 139 |
+
this.historyIndex = this.history.length;
|
| 140 |
+
}
|
| 141 |
+
this.input.value = '';
|
| 142 |
+
} else if (e.key === 'ArrowUp') {
|
| 143 |
+
e.preventDefault();
|
| 144 |
+
if (this.historyIndex > 0) {
|
| 145 |
+
this.historyIndex--;
|
| 146 |
+
this.input.value = this.history[this.historyIndex];
|
| 147 |
+
}
|
| 148 |
+
} else if (e.key === 'ArrowDown') {
|
| 149 |
+
e.preventDefault();
|
| 150 |
+
if (this.historyIndex < this.history.length - 1) {
|
| 151 |
+
this.historyIndex++;
|
| 152 |
+
this.input.value = this.history[this.historyIndex];
|
| 153 |
+
} else {
|
| 154 |
+
this.historyIndex = this.history.length;
|
| 155 |
+
this.input.value = '';
|
| 156 |
+
}
|
| 157 |
+
}
|
| 158 |
+
});
|
| 159 |
+
}
|
| 160 |
+
|
| 161 |
+
print(text, type = '') {
|
| 162 |
+
const line = document.createElement('div');
|
| 163 |
+
line.className = `terminal-line ${type}`;
|
| 164 |
+
line.innerHTML = `<span class="timestamp">[${new Date().toLocaleTimeString()}]</span>${text.replace(/\n/g, '<br>')}`;
|
| 165 |
+
this.output.appendChild(line);
|
| 166 |
+
this.output.scrollTop = this.output.scrollHeight;
|
| 167 |
+
}
|
| 168 |
+
|
| 169 |
+
executeCommand(input) {
|
| 170 |
+
this.print(`$ ${input}`, 'cmd');
|
| 171 |
+
const parts = input.split(' ');
|
| 172 |
+
const cmd = parts[0].toLowerCase();
|
| 173 |
+
const args = parts.slice(1);
|
| 174 |
+
|
| 175 |
+
if (this.commands[cmd]) {
|
| 176 |
+
try {
|
| 177 |
+
this.commands[cmd](args);
|
| 178 |
+
} catch (error) {
|
| 179 |
+
this.print(`Error executing command: ${error.message}`, 'error');
|
| 180 |
+
}
|
| 181 |
+
} else {
|
| 182 |
+
this.print(`Command not found: ${cmd}. Type "help" for available commands.`, 'error');
|
| 183 |
+
}
|
| 184 |
+
}
|
| 185 |
+
}
|
| 186 |
+
|
| 187 |
+
customElements.define('custom-terminal', CustomTerminal);
|
index.html
CHANGED
|
@@ -62,7 +62,6 @@
|
|
| 62 |
<div class="text-sm font-mono text-gray-300" id="clock">00:00:00</div>
|
| 63 |
</div>
|
| 64 |
</header>
|
| 65 |
-
|
| 66 |
<!-- Stats Row -->
|
| 67 |
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-8">
|
| 68 |
<!-- Stat Card 1 -->
|
|
@@ -108,10 +107,60 @@
|
|
| 108 |
</div>
|
| 109 |
</div>
|
| 110 |
|
| 111 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 112 |
|
| 113 |
<!-- Operation Control Panel (Feature Request) -->
|
| 114 |
-
|
| 115 |
<div class="absolute top-0 right-0 p-4 opacity-20">
|
| 116 |
<i data-feather="crosshair" class="w-24 h-24 text-gray-500"></i>
|
| 117 |
</div>
|
|
@@ -219,8 +268,122 @@
|
|
| 219 |
|
| 220 |
</div>
|
| 221 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 222 |
<!-- Recent Activity Table -->
|
| 223 |
-
|
| 224 |
<div class="px-6 py-4 border-b border-gray-700 flex justify-between items-center">
|
| 225 |
<h3 class="text-lg font-bold text-white">Agent Fleet</h3>
|
| 226 |
<button class="text-xs bg-neon-green/10 text-neon-green border border-neon-green/30 px-3 py-1 rounded hover:bg-neon-green/20 transition-colors flex items-center gap-1">
|
|
@@ -270,13 +433,21 @@
|
|
| 270 |
</table>
|
| 271 |
</div>
|
| 272 |
</div>
|
| 273 |
-
|
| 274 |
</main>
|
| 275 |
</div>
|
| 276 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 277 |
<!-- Script Includes -->
|
| 278 |
<script src="components/navbar.js"></script>
|
| 279 |
<script src="components/sidebar.js"></script>
|
|
|
|
|
|
|
|
|
|
| 280 |
<script src="script.js"></script>
|
| 281 |
<script>
|
| 282 |
feather.replace();
|
|
|
|
| 62 |
<div class="text-sm font-mono text-gray-300" id="clock">00:00:00</div>
|
| 63 |
</div>
|
| 64 |
</header>
|
|
|
|
| 65 |
<!-- Stats Row -->
|
| 66 |
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-8">
|
| 67 |
<!-- Stat Card 1 -->
|
|
|
|
| 107 |
</div>
|
| 108 |
</div>
|
| 109 |
|
| 110 |
+
<!-- Extended Stats Row 2 -->
|
| 111 |
+
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-5 gap-4 mb-8">
|
| 112 |
+
<custom-stat-card title="CPU Load" value="67%" color="green" icon="cpu" trend="+2%"></custom-stat-card>
|
| 113 |
+
<custom-stat-card title="Memory" value="4.2 GB" color="orange" icon="hard-drive" trend="stable"></custom-stat-card>
|
| 114 |
+
<custom-stat-card title="Network" value="1.2 GB/s" color="gold" icon="wifi" trend="-5%"></custom-stat-card>
|
| 115 |
+
<custom-stat-card title="Uptime" value="47d 12h" color="green" icon="clock" trend="record"></custom-stat-card>
|
| 116 |
+
<custom-stat-card title="Nodes" value="156" color="blue" icon="server" trend="+8"></custom-stat-card>
|
| 117 |
+
</div>
|
| 118 |
+
<!-- Stat Card 1 -->
|
| 119 |
+
<div class="bg-void-800 border border-gray-800 rounded-lg p-5 shadow-lg relative overflow-hidden group hover:border-neon-green transition-colors">
|
| 120 |
+
<div class="absolute right-2 top-2 opacity-10 group-hover:opacity-20 transition-opacity">
|
| 121 |
+
<i data-feather="cpu" class="w-12 h-12 text-neon-green"></i>
|
| 122 |
+
</div>
|
| 123 |
+
<h3 class="text-gray-400 text-xs uppercase font-bold tracking-widest">Active Agents</h3>
|
| 124 |
+
<div class="text-3xl font-bold text-white mt-2 font-mono">42</div>
|
| 125 |
+
<div class="text-xs text-neon-green mt-1 flex items-center">
|
| 126 |
+
<i data-feather="arrow-up" class="w-3 h-3 mr-1"></i> 12% increase
|
| 127 |
+
</div>
|
| 128 |
+
</div>
|
| 129 |
+
|
| 130 |
+
<!-- Stat Card 2 -->
|
| 131 |
+
<div class="bg-void-800 border border-gray-800 rounded-lg p-5 shadow-lg relative overflow-hidden group hover:border-neon-orange transition-colors">
|
| 132 |
+
<div class="absolute right-2 top-2 opacity-10 group-hover:opacity-20 transition-opacity">
|
| 133 |
+
<i data-feather="activity" class="w-12 h-12 text-neon-orange"></i>
|
| 134 |
+
</div>
|
| 135 |
+
<h3 class="text-gray-400 text-xs uppercase font-bold tracking-widest">Pending Tasks</h3>
|
| 136 |
+
<div class="text-3xl font-bold text-white mt-2 font-mono">08</div>
|
| 137 |
+
<div class="text-xs text-neon-orange mt-1">Critical Queue</div>
|
| 138 |
+
</div>
|
| 139 |
+
|
| 140 |
+
<!-- Stat Card 3 -->
|
| 141 |
+
<div class="bg-void-800 border border-gray-800 rounded-lg p-5 shadow-lg relative overflow-hidden group hover:border-neon-gold transition-colors">
|
| 142 |
+
<div class="absolute right-2 top-2 opacity-10 group-hover:opacity-20 transition-opacity">
|
| 143 |
+
<i data-feather="shield" class="w-12 h-12 text-neon-gold"></i>
|
| 144 |
+
</div>
|
| 145 |
+
<h3 class="text-gray-400 text-xs uppercase font-bold tracking-widest">Security Level</h3>
|
| 146 |
+
<div class="text-3xl font-bold text-white mt-2 font-mono">HIGH</div>
|
| 147 |
+
<div class="text-xs text-neon-gold mt-1">Encryption Active</div>
|
| 148 |
+
</div>
|
| 149 |
+
|
| 150 |
+
<!-- Stat Card 4 -->
|
| 151 |
+
<div class="bg-void-800 border border-gray-800 rounded-lg p-5 shadow-lg relative overflow-hidden group hover:border-neon-red transition-colors">
|
| 152 |
+
<div class="absolute right-2 top-2 opacity-10 group-hover:opacity-20 transition-opacity">
|
| 153 |
+
<i data-feather="alert-triangle" class="w-12 h-12 text-neon-red"></i>
|
| 154 |
+
</div>
|
| 155 |
+
<h3 class="text-gray-400 text-xs uppercase font-bold tracking-widest">Threats Blocked</h3>
|
| 156 |
+
<div class="text-3xl font-bold text-white mt-2 font-mono">1,024</div>
|
| 157 |
+
<div class="text-xs text-neon-red mt-1">Last 24h</div>
|
| 158 |
+
</div>
|
| 159 |
+
</div>
|
| 160 |
+
<div class="grid grid-cols-1 lg:grid-cols-3 gap-8 mb-8">
|
| 161 |
|
| 162 |
<!-- Operation Control Panel (Feature Request) -->
|
| 163 |
+
<div class="lg:col-span-2 bg-void-800 border border-gray-700 rounded-xl shadow-2xl relative overflow-hidden">
|
| 164 |
<div class="absolute top-0 right-0 p-4 opacity-20">
|
| 165 |
<i data-feather="crosshair" class="w-24 h-24 text-gray-500"></i>
|
| 166 |
</div>
|
|
|
|
| 268 |
|
| 269 |
</div>
|
| 270 |
|
| 271 |
+
<!-- System Health & Resource Monitoring -->
|
| 272 |
+
<div class="grid grid-cols-1 lg:grid-cols-2 gap-8 mb-8">
|
| 273 |
+
<!-- Resource Usage Chart -->
|
| 274 |
+
<div class="bg-void-800 border border-gray-800 rounded-xl shadow-lg">
|
| 275 |
+
<div class="p-4 border-b border-gray-700 flex justify-between items-center">
|
| 276 |
+
<h3 class="text-lg font-bold text-white">Resource Usage</h3>
|
| 277 |
+
<div class="flex gap-2">
|
| 278 |
+
<span class="w-3 h-3 rounded-full bg-neon-green"></span>
|
| 279 |
+
<span class="w-3 h-3 rounded-full bg-neon-orange"></span>
|
| 280 |
+
<span class="w-3 h-3 rounded-full bg-neon-gold"></span>
|
| 281 |
+
</div>
|
| 282 |
+
</div>
|
| 283 |
+
<div class="p-6">
|
| 284 |
+
<custom-chart type="line" data="65,72,68,75,80,78,82,85,79,73" labels="00,02,04,06,08,10,12,14,16,18"></custom-chart>
|
| 285 |
+
</div>
|
| 286 |
+
</div>
|
| 287 |
+
|
| 288 |
+
<!-- Network Topology -->
|
| 289 |
+
<div class="bg-void-800 border border-gray-800 rounded-xl shadow-lg">
|
| 290 |
+
<div class="p-4 border-b border-gray-700 flex justify-between items-center">
|
| 291 |
+
<h3 class="text-lg font-bold text-white">Network Topology</h3>
|
| 292 |
+
<button class="text-xs bg-gray-700 hover:bg-gray-600 px-3 py-1 rounded text-gray-300 transition-colors">Refresh</button>
|
| 293 |
+
</div>
|
| 294 |
+
<div class="p-6 relative h-64" id="network-map">
|
| 295 |
+
<div class="absolute inset-0 flex items-center justify-center">
|
| 296 |
+
<div class="w-32 h-32 rounded-full border-2 border-neon-green/30 flex items-center justify-center animate-pulse">
|
| 297 |
+
<div class="w-20 h-20 rounded-full border border-neon-green/50 flex items-center justify-center">
|
| 298 |
+
<div class="w-12 h-12 rounded-full bg-neon-green/20 flex items-center justify-center">
|
| 299 |
+
<i data-feather="server" class="w-6 h-6 text-neon-green"></i>
|
| 300 |
+
</div>
|
| 301 |
+
</div>
|
| 302 |
+
</div>
|
| 303 |
+
</div>
|
| 304 |
+
<!-- Satellite nodes -->
|
| 305 |
+
<div class="absolute top-4 left-1/4 w-8 h-8 rounded-full bg-neon-orange/20 border border-neon-orange flex items-center justify-center">
|
| 306 |
+
<i data-feather="box" class="w-4 h-4 text-neon-orange"></i>
|
| 307 |
+
</div>
|
| 308 |
+
<div class="absolute top-8 right-1/4 w-8 h-8 rounded-full bg-neon-gold/20 border border-neon-gold flex items-center justify-center">
|
| 309 |
+
<i data-feather="database" class="w-4 h-4 text-neon-gold"></i>
|
| 310 |
+
</div>
|
| 311 |
+
<div class="absolute bottom-8 left-1/3 w-8 h-8 rounded-full bg-blue-500/20 border border-blue-500 flex items-center justify-center">
|
| 312 |
+
<i data-feather="cloud" class="w-4 h-4 text-blue-500"></i>
|
| 313 |
+
</div>
|
| 314 |
+
<div class="absolute bottom-4 right-1/3 w-8 h-8 rounded-full bg-purple-500/20 border border-purple-500 flex items-center justify-center">
|
| 315 |
+
<i data-feather="lock" class="w-4 h-4 text-purple-500"></i>
|
| 316 |
+
</div>
|
| 317 |
+
</div>
|
| 318 |
+
</div>
|
| 319 |
+
</div>
|
| 320 |
+
|
| 321 |
+
<!-- Quick Actions Panel -->
|
| 322 |
+
<div class="bg-void-800 border border-gray-800 rounded-xl shadow-lg mb-8">
|
| 323 |
+
<div class="p-4 border-b border-gray-700">
|
| 324 |
+
<h3 class="text-lg font-bold text-white">Quick Actions</h3>
|
| 325 |
+
</div>
|
| 326 |
+
<div class="p-6">
|
| 327 |
+
<div class="grid grid-cols-2 md:grid-cols-4 lg:grid-cols-6 gap-4">
|
| 328 |
+
<button class="quick-action flex flex-col items-center gap-2 p-4 bg-void-700 rounded-lg border border-gray-700 hover:border-neon-green hover:bg-void-900 transition-all group">
|
| 329 |
+
<i data-feather="play-circle" class="w-8 h-8 text-neon-green group-hover:scale-110 transition-transform"></i>
|
| 330 |
+
<span class="text-xs text-gray-400 group-hover:text-white">Deploy</span>
|
| 331 |
+
</button>
|
| 332 |
+
<button class="quick-action flex flex-col items-center gap-2 p-4 bg-void-700 rounded-lg border border-gray-700 hover:border-neon-orange hover:bg-void-900 transition-all group">
|
| 333 |
+
<i data-feather="refresh-cw" class="w-8 h-8 text-neon-orange group-hover:scale-110 transition-transform"></i>
|
| 334 |
+
<span class="text-xs text-gray-400 group-hover:text-white">Sync</span>
|
| 335 |
+
</button>
|
| 336 |
+
<button class="quick-action flex flex-col items-center gap-2 p-4 bg-void-700 rounded-lg border border-gray-700 hover:border-neon-gold hover:bg-void-900 transition-all group">
|
| 337 |
+
<i data-feather="download" class="w-8 h-8 text-neon-gold group-hover:scale-110 transition-transform"></i>
|
| 338 |
+
<span class="text-xs text-gray-400 group-hover:text-white">Export</span>
|
| 339 |
+
</button>
|
| 340 |
+
<button class="quick-action flex flex-col items-center gap-2 p-4 bg-void-700 rounded-lg border border-gray-700 hover:border-blue-500 hover:bg-void-900 transition-all group">
|
| 341 |
+
<i data-feather="upload" class="w-8 h-8 text-blue-500 group-hover:scale-110 transition-transform"></i>
|
| 342 |
+
<span class="text-xs text-gray-400 group-hover:text-white">Import</span>
|
| 343 |
+
</button>
|
| 344 |
+
<button class="quick-action flex flex-col items-center gap-2 p-4 bg-void-700 rounded-lg border border-gray-700 hover:border-purple-500 hover:bg-void-900 transition-all group">
|
| 345 |
+
<i data-feather="search" class="w-8 h-8 text-purple-500 group-hover:scale-110 transition-transform"></i>
|
| 346 |
+
<span class="text-xs text-gray-400 group-hover:text-white">Analyze</span>
|
| 347 |
+
</button>
|
| 348 |
+
<button class="quick-action flex flex-col items-center gap-2 p-4 bg-void-700 rounded-lg border border-gray-700 hover:border-neon-red hover:bg-void-900 transition-all group">
|
| 349 |
+
<i data-feather="power" class="w-8 h-8 text-neon-red group-hover:scale-110 transition-transform"></i>
|
| 350 |
+
<span class="text-xs text-gray-400 group-hover:text-white">Shutdown</span>
|
| 351 |
+
</button>
|
| 352 |
+
</div>
|
| 353 |
+
</div>
|
| 354 |
+
</div>
|
| 355 |
+
|
| 356 |
+
<!-- Terminal Output Panel -->
|
| 357 |
+
<div class="bg-void-800 border border-gray-800 rounded-xl shadow-lg mb-8">
|
| 358 |
+
<div class="p-4 border-b border-gray-700 flex justify-between items-center">
|
| 359 |
+
<h3 class="text-lg font-bold text-white flex items-center gap-2">
|
| 360 |
+
<i data-feather="terminal" class="text-neon-green"></i>
|
| 361 |
+
System Terminal
|
| 362 |
+
</h3>
|
| 363 |
+
<div class="flex gap-2">
|
| 364 |
+
<button id="clear-terminal" class="text-xs bg-gray-700 hover:bg-gray-600 px-3 py-1 rounded text-gray-300 transition-colors">Clear</button>
|
| 365 |
+
<button class="text-xs bg-neon-green/10 hover:bg-neon-green/20 text-neon-green border border-neon-green/30 px-3 py-1 rounded transition-colors">Expand</button>
|
| 366 |
+
</div>
|
| 367 |
+
</div>
|
| 368 |
+
<div id="terminal-output" class="p-4 h-48 overflow-y-auto font-mono text-sm space-y-1 bg-void-900">
|
| 369 |
+
<div class="text-gray-500">[SYSTEM] Initializing Clawdbot C2 v3.2.0...</div>
|
| 370 |
+
<div class="text-neon-green">[OK] Core modules loaded</div>
|
| 371 |
+
<div class="text-neon-green">[OK] Network interface active</div>
|
| 372 |
+
<div class="text-neon-green">[OK] Security protocols engaged</div>
|
| 373 |
+
<div class="text-gray-500">[INFO] 42 agents connected</div>
|
| 374 |
+
<div class="text-neon-orange">[WARN] High memory usage on Node-07</div>
|
| 375 |
+
<div class="text-gray-500">[SYSTEM] Ready for commands</div>
|
| 376 |
+
</div>
|
| 377 |
+
<div class="p-3 border-t border-gray-700 bg-void-900">
|
| 378 |
+
<div class="flex items-center gap-2">
|
| 379 |
+
<span class="text-neon-green font-mono">$</span>
|
| 380 |
+
<input type="text" id="terminal-input" placeholder="Enter command..." class="flex-1 bg-transparent border-none outline-none text-white font-mono text-sm">
|
| 381 |
+
</div>
|
| 382 |
+
</div>
|
| 383 |
+
</div>
|
| 384 |
+
|
| 385 |
<!-- Recent Activity Table -->
|
| 386 |
+
<div class="mt-8 bg-void-800 border border-gray-800 rounded-xl overflow-hidden shadow-lg">
|
| 387 |
<div class="px-6 py-4 border-b border-gray-700 flex justify-between items-center">
|
| 388 |
<h3 class="text-lg font-bold text-white">Agent Fleet</h3>
|
| 389 |
<button class="text-xs bg-neon-green/10 text-neon-green border border-neon-green/30 px-3 py-1 rounded hover:bg-neon-green/20 transition-colors flex items-center gap-1">
|
|
|
|
| 433 |
</table>
|
| 434 |
</div>
|
| 435 |
</div>
|
|
|
|
| 436 |
</main>
|
| 437 |
</div>
|
| 438 |
|
| 439 |
+
<!-- Notification Toast Container -->
|
| 440 |
+
<div id="toast-container" class="fixed bottom-4 right-4 z-50 space-y-2"></div>
|
| 441 |
+
|
| 442 |
+
<!-- Modal Container -->
|
| 443 |
+
<div id="modal-container"></div>
|
| 444 |
+
|
| 445 |
<!-- Script Includes -->
|
| 446 |
<script src="components/navbar.js"></script>
|
| 447 |
<script src="components/sidebar.js"></script>
|
| 448 |
+
<script src="components/stat-card.js"></script>
|
| 449 |
+
<script src="components/chart.js"></script>
|
| 450 |
+
<script src="components/terminal.js"></script>
|
| 451 |
<script src="script.js"></script>
|
| 452 |
<script>
|
| 453 |
feather.replace();
|
settings.html
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
```html
|
| 2 |
+
<!DOCTYPE html>
|
| 3 |
+
<html lang="en">
|
| 4 |
+
<head>
|
| 5 |
+
<meta charset="UTF-8">
|
| 6 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 7 |
+
<title>Settings | Operation Void Control</title>
|
| 8 |
+
<link rel="stylesheet" href="style.css">
|
| 9 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 10 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 11 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 12 |
+
<script>
|
| 13 |
+
tailwind.config = {
|
| 14 |
+
theme: {
|
| 15 |
+
extend: {
|
| 16 |
+
colors: {
|
| 17 |
+
void: { 900: '#050505', 800: '#0a0a0a', 700: '#121212' },
|
| 18 |
+
neon: { green: '#22c55e', orange: '#f97316', gold: '#ffd700', red: '#ef4444' }
|
| 19 |
+
},
|
| 20 |
+
fontFamily: { mono: ['ui-monospace', 'SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', "Liberation Mono", "Courier New", 'monospace'] }
|
| 21 |
+
}
|
| 22 |
+
}
|
| 23 |
+
}
|
| 24 |
+
</script>
|
| 25 |
+
</head>
|
| 26 |
+
<body class="bg-void-900 text-gray-300 font-sans antialiased overflow-hidden h-screen flex flex-col relative">
|
| 27 |
+
<div class="absolute inset-0 z-0 pointer-events-none opacity-[0.03] pattern-metatron"></div>
|
| 28 |
+
|
| 29 |
+
<custom-navbar></custom-navbar>
|
| 30 |
+
|
| 31 |
+
<div class="flex flex-1 overflow-hidden relative z-10">
|
| 32 |
+
<custom-sidebar></custom-sidebar>
|
| 33 |
+
|
| 34 |
+
<main class="flex-1 overflow-y-auto p-6 md:p-8">
|
| 35 |
+
<header class="mb-8 border-b border-gray-800 pb-4">
|
| 36 |
+
<h1 class="text-3xl font-bold text-white tracking-wider uppercase font-mono">System Settings</h1>
|
| 37 |
+
<p class="text-sm text-neon-green mt-1">Configure Clawdbot C2 parameters</p>
|
| 38 |
+
</header>
|
| 39 |
+
|
| 40 |
+
<div class="grid grid-cols-1 lg:grid-cols-3 gap-8">
|
| 41 |
+
<!-- Settings Navigation -->
|
| 42 |
+
<div class="lg:col-span-1">
|
| 43 |
+
<div class="bg-void-800 border border-gray-800 rounded-xl overflow-hidden">
|
| 44 |
+
<div class="p-4 border-b border-gray-700">
|
| 45 |
+
<h3 class="font-bold text-white">Categories</h3>
|
| 46 |
+
</div>
|
| 47 |
+
<nav class="p-2">
|
| 48 |
+
<a href="#" class="flex items-center gap-3 p-3 rounded-lg bg-neon-green/10 text-neon-green">
|
| 49 |
+
<i data-feather="sliders" class="w-4 h-4"></i>
|
| 50 |
+
<span>General</span>
|
| 51 |
+
</a>
|
| 52 |
+
<a href="#" class="flex items-center gap-
|
| 53 |
+
___METADATA_START___
|
| 54 |
+
{"repoId":"00Boobs00/operation-void-control","isNew":false,"userName":"00Boobs00"}
|
| 55 |
+
___METADATA_END___
|
tasks.html
ADDED
|
@@ -0,0 +1,192 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Tasks | Operation Void Control</title>
|
| 7 |
+
<link rel="stylesheet" href="style.css">
|
| 8 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 9 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 10 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 11 |
+
<script>
|
| 12 |
+
tailwind.config = {
|
| 13 |
+
theme: {
|
| 14 |
+
extend: {
|
| 15 |
+
colors: {
|
| 16 |
+
void: { 900: '#050505', 800: '#0a0a0a', 700: '#121212' },
|
| 17 |
+
neon: { green: '#22c55e', orange: '#f97316', gold: '#ffd700', red: '#ef4444' }
|
| 18 |
+
},
|
| 19 |
+
fontFamily: { mono: ['ui-monospace', 'SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', "Liberation Mono", "Courier New", 'monospace'] }
|
| 20 |
+
}
|
| 21 |
+
}
|
| 22 |
+
}
|
| 23 |
+
</script>
|
| 24 |
+
</head>
|
| 25 |
+
<body class="bg-void-900 text-gray-300 font-sans antialiased overflow-hidden h-screen flex flex-col relative">
|
| 26 |
+
<div class="absolute inset-0 z-0 pointer-events-none opacity-[0.03] pattern-metatron"></div>
|
| 27 |
+
|
| 28 |
+
<custom-navbar></custom-navbar>
|
| 29 |
+
|
| 30 |
+
<div class="flex flex-1 overflow-hidden relative z-10">
|
| 31 |
+
<custom-sidebar></custom-sidebar>
|
| 32 |
+
|
| 33 |
+
<main class="flex-1 overflow-y-auto p-6 md:p-8">
|
| 34 |
+
<header class="mb-8 border-b border-gray-800 pb-4 flex justify-between items-end">
|
| 35 |
+
<div>
|
| 36 |
+
<h1 class="text-3xl font-bold text-white tracking-wider uppercase font-mono">Task Queue</h1>
|
| 37 |
+
<p class="text-sm text-neon-green mt-1">Manage operations and mission directives</p>
|
| 38 |
+
</div>
|
| 39 |
+
<button class="bg-neon-green/10 text-neon-green border border-neon-green/30 px-4 py-2 rounded-lg text-sm hover:bg-neon-green/20 transition-colors flex items-center gap-2">
|
| 40 |
+
<i data-feather="plus" class="w-4 h-4"></i> New Task
|
| 41 |
+
</button>
|
| 42 |
+
</header>
|
| 43 |
+
|
| 44 |
+
<!-- Task Stats -->
|
| 45 |
+
<div class="grid grid-cols-1 md:grid-cols-4 gap-6 mb-8">
|
| 46 |
+
<div class="bg-void-800 border border-gray-800 rounded-lg p-5">
|
| 47 |
+
<h3 class="text-gray-400 text-xs uppercase">Total Tasks</h3>
|
| 48 |
+
<div class="text-2xl font-bold text-white mt-2 font-mono">1,247</div>
|
| 49 |
+
</div>
|
| 50 |
+
<div class="bg-void-800 border border-gray-800 rounded-lg p-5">
|
| 51 |
+
<h3 class="text-gray-400 text-xs uppercase">Pending</h3>
|
| 52 |
+
<div class="text-2xl font-bold text-neon-orange mt-2 font-mono">23</div>
|
| 53 |
+
</div>
|
| 54 |
+
<div class="bg-void-800 border border-gray-800 rounded-lg p-5">
|
| 55 |
+
<h3 class="text-gray-400 text-xs uppercase">In Progress</h3>
|
| 56 |
+
<div class="text-2xl font-bold text-neon-blue-400 mt-2 font-mono">8</div>
|
| 57 |
+
</div>
|
| 58 |
+
<div class="bg-void-800 border border-gray-800 rounded-lg p-5">
|
| 59 |
+
<h3 class="text-gray-400 text-xs uppercase">Completed</h3>
|
| 60 |
+
<div class="text-2xl font-bold text-neon-green mt-2 font-mono">1,216</div>
|
| 61 |
+
</div>
|
| 62 |
+
</div>
|
| 63 |
+
|
| 64 |
+
<!-- Task Columns -->
|
| 65 |
+
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
|
| 66 |
+
<!-- Pending Column -->
|
| 67 |
+
<div class="bg-void-800 border border-gray-800 rounded-xl overflow-hidden">
|
| 68 |
+
<div class="p-4 border-b border-gray-700 bg-void-900 flex justify-between items-center">
|
| 69 |
+
<h3 class="font-bold text-neon-orange flex items-center gap-2">
|
| 70 |
+
<i data-feather="clock" class="w-4 h-4"></i> Pending
|
| 71 |
+
</h3>
|
| 72 |
+
<span class="bg-neon-orange/10 text-neon-orange px-2 py-0.5 rounded text-xs">23</span>
|
| 73 |
+
</div>
|
| 74 |
+
<div class="p-4 space-y-4 max-h-[600px] overflow-y-auto">
|
| 75 |
+
<div class="bg-void-700 border border-gray-700 rounded-lg p-4 hover:border-neon-orange/50 transition-colors cursor-pointer">
|
| 76 |
+
<div class="flex justify-between items-start mb-2">
|
| 77 |
+
<span class="badge badge-orange">HIGH</span>
|
| 78 |
+
<button class="text-gray-500 hover:text-white"><i data-feather="more-horizontal" class="w-4 h-4"></i></button>
|
| 79 |
+
</div>
|
| 80 |
+
<h4 class="text-white font-medium mb-1">Network Reconnaissance</h4>
|
| 81 |
+
<p class="text-gray-400 text-sm mb-3">Scan target subnet for vulnerabilities</p>
|
| 82 |
+
<div class="flex items-center justify-between text-xs text-gray-500">
|
| 83 |
+
<span><i data-feather="map-pin" class="w-3 h-3 inline"></i> EU-West-1</span>
|
| 84 |
+
<span><i data-feather="calendar" class="w-3 h-3 inline"></i> Due in 2h</span>
|
| 85 |
+
</div>
|
| 86 |
+
</div>
|
| 87 |
+
<div class="bg-void-700 border border-gray-700 rounded-lg p-4 hover:border-neon-orange/50 transition-colors cursor-pointer">
|
| 88 |
+
<div class="flex justify-between items-start mb-2">
|
| 89 |
+
<span class="badge badge-gold">MEDIUM</span>
|
| 90 |
+
<button class="text-gray-500 hover:text-white"><i data-feather="more-horizontal" class="w-4 h-4"></i></button>
|
| 91 |
+
</div>
|
| 92 |
+
<h4 class="text-white font-medium mb-1">Data Extraction</h4>
|
| 93 |
+
<p class="text-gray-400 text-sm mb-3">Extract encrypted payload from Node-42</p>
|
| 94 |
+
<div class="flex items-center justify-between text-xs text-gray-500">
|
| 95 |
+
<span><i data-feather="map-pin" class="w-3 h-3 inline"></i> US-East-1</span>
|
| 96 |
+
<span><i data-feather="calendar" class="w-3 h-3 inline"></i> Due in 6h</span>
|
| 97 |
+
</div>
|
| 98 |
+
</div>
|
| 99 |
+
</div>
|
| 100 |
+
</div>
|
| 101 |
+
|
| 102 |
+
<!-- In Progress Column -->
|
| 103 |
+
<div class="bg-void-800 border border-gray-800 rounded-xl overflow-hidden">
|
| 104 |
+
<div class="p-4 border-b border-gray-700 bg-void-900 flex justify-between items-center">
|
| 105 |
+
<h3 class="font-bold text-blue-400 flex items-center gap-2">
|
| 106 |
+
<i data-feather="activity" class="w-4 h-4"></i> In Progress
|
| 107 |
+
</h3>
|
| 108 |
+
<span class="bg-blue-400/10 text-blue-400 px-2 py-0.5 rounded text-xs">8</span>
|
| 109 |
+
</div>
|
| 110 |
+
<div class="p-4 space-y-4 max-h-[600px] overflow-y-auto">
|
| 111 |
+
<div class="bg-void-700 border border-blue-400/30 rounded-lg p-4">
|
| 112 |
+
<div class="flex justify-between items-start mb-2">
|
| 113 |
+
<span class="badge badge-red">CRITICAL</span>
|
| 114 |
+
<button class="text-gray-500 hover:text-white"><i data-feather="more-horizontal" class="w-4 h-4"></i></button>
|
| 115 |
+
</div>
|
| 116 |
+
<h4 class="text-white font-medium mb-1">Security Patch Deployment</h4>
|
| 117 |
+
<p class="text-gray-400 text-sm mb-3">Deploy critical security update to all nodes</p>
|
| 118 |
+
<div class="mb-3">
|
| 119 |
+
<div class="flex justify-between text-xs text-gray-400 mb-1">
|
| 120 |
+
<span>Progress</span>
|
| 121 |
+
<span>78%</span>
|
| 122 |
+
</div>
|
| 123 |
+
<div class="progress-bar">
|
| 124 |
+
<div class="progress-fill blue" style="width: 78%"></div>
|
| 125 |
+
</div>
|
| 126 |
+
</div>
|
| 127 |
+
<div class="flex items-center justify-between text-xs text-gray-500">
|
| 128 |
+
<span><i data-feather="cpu" class="w-3 h-3 inline"></i> AGNT-001</span>
|
| 129 |
+
<span class="text-neon-green animate-pulse">● Active</span>
|
| 130 |
+
</div>
|
| 131 |
+
</div>
|
| 132 |
+
<div class="bg-void-700 border border-gray-700 rounded-lg p-4">
|
| 133 |
+
<div class="flex justify-between items-start mb-2">
|
| 134 |
+
<span class="badge badge-green">NORMAL</span>
|
| 135 |
+
<button class="text-gray-500 hover:text-white"><i data-feather="more-horizontal" class="w-4 h-4"></i></button>
|
| 136 |
+
</div>
|
| 137 |
+
<h4 class="text-white font-medium mb-1">Log Analysis</h4>
|
| 138 |
+
<p class="text-gray-400 text-sm mb-3">Analyze system logs for anomalies</p>
|
| 139 |
+
<div class="mb-3">
|
| 140 |
+
<div class="flex justify-between text-xs text-gray-400 mb-1">
|
| 141 |
+
<span>Progress</span>
|
| 142 |
+
<span>45%</span>
|
| 143 |
+
</div>
|
| 144 |
+
<div class="progress-bar">
|
| 145 |
+
<div class="progress-fill green" style="width: 45%"></div>
|
| 146 |
+
</div>
|
| 147 |
+
</div>
|
| 148 |
+
<div class="flex items-center justify-between text-xs text-gray-500">
|
| 149 |
+
<span><i data-feather="cpu" class="w-3 h-3 inline"></i> AGNT-099</span>
|
| 150 |
+
<span class="text-neon-green animate-pulse">● Active</span>
|
| 151 |
+
</div>
|
| 152 |
+
</div>
|
| 153 |
+
</div>
|
| 154 |
+
</div>
|
| 155 |
+
|
| 156 |
+
<!-- Completed Column -->
|
| 157 |
+
<div class="bg-void-800 border border-gray-800 rounded-xl overflow-hidden">
|
| 158 |
+
<div class="p-4 border-b border-gray-700 bg-void-900 flex justify-between items-center">
|
| 159 |
+
<h3 class="font-bold text-neon-green flex items-center gap-2">
|
| 160 |
+
<i data-feather="check-circle" class="w-4 h-4"></i> Completed
|
| 161 |
+
</h3>
|
| 162 |
+
<span class="bg-neon-green/10 text-neon-green px-2 py-0.5 rounded text-xs">1,216</span>
|
| 163 |
+
</div>
|
| 164 |
+
<div class="p-4 space-y-4 max-h-[600px] overflow-y-auto">
|
| 165 |
+
<div class="bg-void-700/50 border border-gray-700 rounded-lg p-4 opacity-70">
|
| 166 |
+
<div class="flex justify-between items-start mb-2">
|
| 167 |
+
<span class="badge badge-gray">DONE</span>
|
| 168 |
+
<span class="text-gray-500 text-xs">2m ago</span>
|
| 169 |
+
</div>
|
| 170 |
+
<h4 class="text-white font-medium mb-1">System Backup</h4>
|
| 171 |
+
<p class="text-gray-400 text-sm">Completed full system backup</p>
|
| 172 |
+
</div>
|
| 173 |
+
<div class="bg-void-700/50 border border-gray-700 rounded-lg p-4 opacity-70">
|
| 174 |
+
<div class="flex justify-between items-start mb-2">
|
| 175 |
+
<span class="badge badge-gray">DONE</span>
|
| 176 |
+
<span class="text-gray-500 text-xs">15m ago</span>
|
| 177 |
+
</div>
|
| 178 |
+
<h4 class="text-white font-medium mb-1">Agent Health Check</h4>
|
| 179 |
+
<p class="text-gray-400 text-sm">All agents verified operational</p>
|
| 180 |
+
</div>
|
| 181 |
+
</div>
|
| 182 |
+
</div>
|
| 183 |
+
</div>
|
| 184 |
+
</main>
|
| 185 |
+
</div>
|
| 186 |
+
|
| 187 |
+
<script src="components/navbar.js"></script>
|
| 188 |
+
<script src="components/sidebar.js"></script>
|
| 189 |
+
<script src="script.js"></script>
|
| 190 |
+
<script>feather.replace();</script>
|
| 191 |
+
</body>
|
| 192 |
+
</html>
|