Files
mcp-memory/server/src/dashboard.html
T

140 lines
6.5 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<title>Brain Monitor</title>
<style>
body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; padding: 40px; background-color: #f0f2f5; color: #333; }
h1 { color: #2c3e50; text-align: center; margin-bottom: 30px; }
.grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 20px; max-width: 1000px; margin: 0 auto; }
.stat-card { background: white; padding: 20px; border-radius: 8px; box-shadow: 0 4px 6px rgba(0,0,0,0.05); text-align: center; transition: transform 0.2s ease; }
.stat-card:hover { transform: translateY(-5px); }
.stat-value { font-size: 2.5em; font-weight: bold; color: #3498db; margin: 10px 0; }
.stat-label { font-size: 1.1em; color: #7f8c8d; text-transform: uppercase; letter-spacing: 1px; }
.status-dot { display: inline-block; width: 10px; height: 10px; background-color: #2ecc71; border-radius: 50%; margin-right: 8px; box-shadow: 0 0 5px #2ecc71; }
.header-bar { max-width: 1000px; margin: 0 auto 20px; display: flex; justify-content: space-between; align-items: center; }
</style>
</head>
<body>
<div class="header-bar">
<h1>🧠 Antigravity Brain Monitor</h1>
<div><span class="status-dot"></span>System Online</div>
</div>
<div class="grid">
<div class="stat-card">
<div class="stat-label">Entities</div>
<div class="stat-value" id="val-entities">-</div>
</div>
<div class="stat-card">
<div class="stat-label">Relations</div>
<div class="stat-value" id="val-relations">-</div>
</div>
<div class="stat-card">
<div class="stat-label">Active Tasks</div>
<div class="stat-value" id="val-tasks">-</div>
</div>
<div class="stat-card">
<div class="stat-label">Snippets</div>
<div class="stat-value" id="val-snippets">-</div>
</div>
<div class="stat-card">
<div class="stat-label">Tech Debt</div>
<div class="stat-value" id="val-tech_debts">-</div>
</div>
<div class="stat-card">
<div class="stat-label">ADRs</div>
<div class="stat-value" id="val-adrs">-</div>
</div>
<div class="stat-card">
<div class="stat-label">Audit Ledger</div>
<div class="stat-value" id="val-ledger">-</div>
</div>
<div class="stat-card">
<div class="stat-label">Sticky Notes</div>
<div class="stat-value" id="val-sticky">-</div>
</div>
<div class="stat-card">
<div class="stat-label">Error Fixes</div>
<div class="stat-value" id="val-error_fixes">-</div>
</div>
<div class="stat-card">
<div class="stat-label">Pinned Files</div>
<div class="stat-value" id="val-pinned_files">-</div>
</div>
<div class="stat-card">
<div class="stat-label">Session Summaries</div>
<div class="stat-value" id="val-session_summaries">-</div>
</div>
<div class="stat-card">
<div class="stat-label">Handoff Memos</div>
<div class="stat-value" id="val-handoff_memos">-</div>
</div>
<div class="stat-card">
<div class="stat-label">Env Fingerprints</div>
<div class="stat-value" id="val-env_fingerprints">-</div>
</div>
<div class="stat-card">
<div class="stat-label">Env Requirements</div>
<div class="stat-value" id="val-env_requirements">-</div>
</div>
<div class="stat-card">
<div class="stat-label">Milestones</div>
<div class="stat-value" id="val-milestones">-</div>
</div>
<div class="stat-card">
<div class="stat-label">Environments</div>
<div class="stat-value" id="val-environments">-</div>
</div>
<div class="stat-card">
<div class="stat-label">PR Checklists</div>
<div class="stat-value" id="val-pr_checklists">-</div>
</div>
<div class="stat-card">
<div class="stat-label">Safety Gates</div>
<div class="stat-value" id="val-gates">-</div>
</div>
<div class="stat-card">
<div class="stat-label">Workspaces</div>
<div class="stat-value" id="val-context_workspaces">-</div>
</div>
</div>
<script>
async function fetchStats() {
try {
const response = await fetch('/api/stats');
const data = await response.json();
document.getElementById('val-entities').innerText = data.entities;
document.getElementById('val-relations').innerText = data.relations;
document.getElementById('val-tasks').innerText = data.tasks;
document.getElementById('val-snippets').innerText = data.snippets;
document.getElementById('val-tech_debts').innerText = data.tech_debts;
document.getElementById('val-adrs').innerText = data.adrs;
document.getElementById('val-ledger').innerText = data.ledger;
document.getElementById('val-sticky').innerText = data.sticky;
document.getElementById('val-error_fixes').innerText = data.error_fixes;
document.getElementById('val-pinned_files').innerText = data.pinned_files;
document.getElementById('val-session_summaries').innerText = data.session_summaries;
document.getElementById('val-handoff_memos').innerText = data.handoff_memos;
document.getElementById('val-env_fingerprints').innerText = data.env_fingerprints;
document.getElementById('val-env_requirements').innerText = data.env_requirements;
document.getElementById('val-milestones').innerText = data.milestones;
document.getElementById('val-environments').innerText = data.environments;
document.getElementById('val-pr_checklists').innerText = data.pr_checklists;
document.getElementById('val-gates').innerText = data.gates;
document.getElementById('val-context_workspaces').innerText = data.context_workspaces;
} catch (err) {
console.error("Failed to fetch stats:", err);
}
}
// Initial fetch
fetchStats();
// Poll every 2 seconds
setInterval(fetchStats, 2000);
</script>
</body>
</html>