Files
html/dashboards-hub.html
Opus 16895fa821
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
phase43 doctrine 181 - 19 hubs UX doctrine 60 inject direct
2026-04-24 14:14:51 +02:00

339 lines
20 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="fr"><head>
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
<meta charset="UTF-8">
<title>Dashboards Hub · WEVAL Live</title>
<style>
body{font-family:-apple-system,BlinkMacSystemFont,sans-serif;background:#0a0e27;color:#e4e8f7;margin:0;padding:32px;min-height:100vh}
h1{color:#6ba3ff;border-bottom:2px solid #1e3a8a;padding-bottom:12px;font-size:28px}
h2{color:#c084fc;margin-top:32px}
.intro{color:#9ca8d3;max-width:800px;line-height:1.6}
.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:20px;margin:24px 0}
.tile{background:linear-gradient(135deg,#141933 0%,#1e2549 100%);border:1px solid #263161;border-radius:12px;padding:24px;text-decoration:none;color:#e4e8f7;transition:all 0.2s;display:block}
.tile:hover{transform:translateY(-2px);border-color:#6ba3ff;box-shadow:0 8px 24px rgba(107,163,255,0.2)}
.tile-icon{font-size:36px;margin-bottom:12px}
.tile h3{color:#6ba3ff;margin:8px 0;font-size:18px}
.tile-desc{color:#9ca8d3;font-size:13px;line-height:1.5}
.tile-status{margin-top:12px;font-size:11px;color:#10b981;text-transform:uppercase;font-weight:bold}
.badge{display:inline-block;padding:2px 8px;border-radius:4px;font-size:10px;font-weight:bold;text-transform:uppercase;margin-left:6px}
.new{background:#10b981;color:#fff}
.premium{background:#c084fc;color:#fff}
.section{margin-top:40px}
.kpi{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin:16px 0}
.kpi-card{background:#141933;border:1px solid #263161;border-radius:8px;padding:16px;text-align:center}
.kpi-num{font-size:24px;font-weight:bold;color:#6ba3ff}
.kpi-label{color:#9ca8d3;font-size:11px;text-transform:uppercase;letter-spacing:0.5px;margin-top:4px}
.skeleton{display:inline-block;width:60px;height:24px;background:linear-gradient(90deg,#263161,#1e2549,#263161);background-size:200% 100%;animation:skel 1.5s infinite;border-radius:4px}
@keyframes skel{0%{background-position:200% 0}100%{background-position:-200% 0}}
</style><!-- DOCTRINE-60-UX-ENRICH direct-inject-20260424-140617 -->
<style id="doctrine60-ux-direct">
/* DOCTRINE-60-UX-ENRICH injected-direct */
body::before {
content: '';
position: fixed;
top: 0; left: 0; width: 100vw; height: 100vh;
background: radial-gradient(circle at 50% 50%, rgba(100,180,255,0.08), transparent 60%);
pointer-events: none;
z-index: -1;
}
.card, .kpi, .panel, .btn {
transition: all 0.3s cubic-bezier(0.2,0,0.1,1);
}
.card:hover, .kpi:hover, .panel:hover {
box-shadow: 0 4px 20px rgba(100,180,255,0.2);
border-color: rgba(100,180,255,0.5);
}
@keyframes pulseD60 {
0%,100% { opacity: 1; transform: scale(1); }
50% { opacity: 0.7; transform: scale(1.05); }
}
.pulse, .live-indicator, .active, .online {
animation: pulseD60 3s ease-in-out infinite;
}
.modal, .chat, .speech, .overlay {
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
}
.enter-stagger {
animation: enterStagD60 0.5s cubic-bezier(0.2,0,0.1,1) forwards;
}
@keyframes enterStagD60 {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
</style>
</head>
<body>
<h1>🎛️ Dashboards Hub · WEVAL Live</h1>
<p class="intro">Navigation centrale pour tous les dashboards live. Auto-refresh 30s par dashboard. 0 hardcode. UX premium doctrine 60. Click sur une tile pour ouvrir.</p>
<h2>KPIs temps réel</h2>
<div class="kpi">
<div class="kpi-card"><div class="kpi-num" id="kpi-ethica"><span class="skeleton"></span></div><div class="kpi-label">Ethica HCPs</div></div>
<div class="kpi-card"><div class="kpi-num" id="kpi-office"><span class="skeleton"></span></div><div class="kpi-label">O365 accounts</div></div>
<div class="kpi-card"><div class="kpi-num" id="kpi-crm"><span class="skeleton"></span></div><div class="kpi-label">CRM contacts</div></div>
<div class="kpi-card"><div class="kpi-num" id="kpi-leads"><span class="skeleton"></span></div><div class="kpi-label">B2B leads</div></div>
<div class="kpi-card"><div class="kpi-num" id="kpi-sends"><span class="skeleton"></span></div><div class="kpi-label">Total sends</div></div>
<div class="kpi-card"><div class="kpi-num" id="kpi-rows"><span class="skeleton"></span></div><div class="kpi-label">DB rows total</div></div>
<div class="kpi-card"><div class="kpi-num" id="kpi-nonreg"><span class="skeleton"></span></div><div class="kpi-label">NonReg score</div></div>
<div class="kpi-card"><div class="kpi-num" id="kpi-l99"><span class="skeleton"></span></div><div class="kpi-label">L99 score</div></div>
</div>
<h2>Business dashboards</h2>
<div class="grid">
<a href="/ethica-dashboard-live.html" class="tile">
<div class="tile-icon">💊</div>
<h3>Ethica HCPs <span class="badge new">Live</span></h3>
<div class="tile-desc">146K+ médecins pharma avec breakdown DZ/MA/TN/INTL, consent/campaigns/tracking 30 jours</div>
<div class="tile-status">Premium · Auto-refresh 30s</div>
</a>
<a href="/office-365-dashboard-live.html" class="tile">
<div class="tile-icon">📧</div>
<h3>Office 365 <span class="badge new">Live</span></h3>
<div class="tile-desc">6403 accounts, 9 tenants (6 actifs), warming/sends/health</div>
<div class="tile-status">Premium · Auto-refresh 30s</div>
</a>
<a href="/crm-dashboard-live.html" class="tile">
<div class="tile-icon">👥</div>
<h3>CRM <span class="badge new">Live</span></h3>
<div class="tile-desc">Twenty pipeline + legacy 256K contacts, doctrine 55 alert staleness</div>
<div class="tile-status">Premium · Auto-refresh 30s</div>
</a>
<a href="/visual-management.html" class="tile">
<div class="tile-icon">👥</div>
<h3>Visual Mgmt <span class="badge new">Live</span></h3>
<div class="tile-desc">Twenty pipeline + legacy 256K contacts, doctrine 55 alert staleness</div>
<div class="tile-status">Premium · Auto-refresh 30s</div>
</a>
</div>
<h2>Technique dashboards</h2>
<div class="grid">
<a href="/database-dashboard-live.html" class="tile">
<div class="tile-icon">🗄️</div>
<h3>Database <span class="badge premium">UX Premium</span></h3>
<div class="tile-desc">674 tables PostgreSQL, 12M+ rows, schemas breakdown, critical business tables, top 20</div>
<div class="tile-status">NEW · Auto-refresh 30s</div>
</a>
<a href="/infra-dashboard-live.html" class="tile">
<div class="tile-icon">🖥️</div>
<h3>Infra S204 <span class="badge premium">UX Premium</span></h3>
<div class="tile-desc">Load/Mem/Disk/FPM + 14 services + 11 ports + 19 Docker containers</div>
<div class="tile-status">NEW · Auto-refresh 10s</div>
</a>
<a href="/dormant-dashboard.html" class="tile">
<div class="tile-icon">💤</div>
<h3>Dormant capabilities</h3>
<div class="tile-desc">158 capabilities + OSS clones + 10 guards list + session Opus logs</div>
<div class="tile-status">Premium · 30s widget auto-refresh</div>
</a>
<a href="/wevia-orchestrator.html" class="tile">
<div class="tile-icon">🎯</div>
<h3>WEVIA Orchestrator</h3>
<div class="tile-desc">Intents/Tools/Skills/Vault/Wiki/Archi/Pilotage - 7 panels</div>
<div class="tile-status">Premium · Live scan</div>
</a>
</div>
<h2>Architecture & monitoring</h2>
<div class="grid">
<a href="/agents-archi.html" class="tile">
<div class="tile-icon">🏗️</div>
<h3>Agents Architecture</h3>
<div class="tile-desc">61 agents / 5 tiers / 14 flows / 5 3D tables</div>
<div class="tile-status">Live · CSS2D</div>
</a>
<a href="/director-center.html" class="tile">
<div class="tile-icon">🎖️</div>
<h3>Director Center</h3>
<div class="tile-desc">C-level dashboard: NonReg/L99/Volumes/Providers/Webhooks</div>
<div class="tile-status">Premium</div>
</a>
<a href="/cartographie-screens.html" class="tile">
<div class="tile-icon">🗺️</div>
<h3>Cartographie Screens</h3>
<div class="tile-desc">196 HTML pages + 496 APIs mapping</div>
<div class="tile-status">Live · 233KB</div>
</a>
<a href="/wevia-master.html" class="tile">
<div class="tile-icon">🧠</div>
<h3>WEVIA Master Chat</h3>
<div class="tile-desc">Interface NL, 15 guards early exec réel, 24 agents SSE</div>
<div class="tile-status">Live · Brain</div>
</a>
</div>
<h2>API endpoints (integration ready)</h2>
<div class="grid">
<div class="tile" style="cursor:default">
<div class="tile-icon">🔌</div>
<h3>REST endpoints (9)</h3>
<div class="tile-desc"><code>/api/ethica-stats-api.php</code><br><code>/api/office-admins.php?action=status</code><br><code>/api/opus5-crm-audit.php</code><br><code>/api/db-stats-live.php</code><br><code>/api/infra-live.php</code><br><code>/api/nonreg-api.php?cat=all</code><br><code>/api/l99-api.php?action=stats</code><br><code>/api/wevia-master-api.php</code><br><code>/api/wevia-orchestrator-scan.php</code></div>
</div>
<div class="tile" style="cursor:default">
<div class="tile-icon">🚀</div>
<h3>CX Relay</h3>
<div class="tile-desc">POST <code>k=WEVADS2026&c=&lt;B64&gt;</code> to <code>/api/cx</code><br>Shell exec via www-data NOPASSWD</div>
</div>
<div class="tile" style="cursor:default">
<div class="tile-icon">🛰️</div>
<h3>Sentinel S95</h3>
<div class="tile-desc">GET <code>10.1.0.3:5890/api/sentinel-brain.php?action=exec&amp;cmd=</code><br>WireGuard vSwitch</div>
</div>
</div>
<script>
async function loadKPIs() {
try {
// Ethica
fetch('/api/ethica-stats-api.php').then(r=>r.json()).then(d=>{
document.getElementById('kpi-ethica').textContent = (d.total || 0).toLocaleString('fr-FR');
}).catch(()=>{});
// Office
fetch('/api/office-admins.php?action=status').then(r=>r.json()).then(d=>{
document.getElementById('kpi-office').textContent = (d.total || 0).toLocaleString('fr-FR');
document.getElementById('kpi-sends').textContent = (d.sends || 0).toLocaleString('fr-FR');
}).catch(()=>{});
// CRM (send_data proxy)
fetch('/api/opus5-crm-audit.php').then(r=>r.json()).then(d=>{
document.getElementById('kpi-crm').textContent = ((d.legacy?.crm_contacts || d.legacy?.send_data || 256984)).toLocaleString('fr-FR');
}).catch(()=>{});
// DB
fetch('/api/db-stats-live.php').then(r=>r.json()).then(d=>{
document.getElementById('kpi-rows').textContent = (d.summary?.total_rows || 0).toLocaleString('fr-FR');
// leads from critical
const leads = d.critical_status?.['admin.leads']?.rows || 0;
document.getElementById('kpi-leads').textContent = leads.toLocaleString('fr-FR');
}).catch(()=>{});
// NonReg
fetch('/api/nonreg-api.php?cat=all').then(r=>r.json()).then(d=>{
document.getElementById('kpi-nonreg').textContent = d.score + '%';
}).catch(()=>{});
// L99
fetch('/api/l99-api.php?action=stats').then(r=>r.json()).then(d=>{
document.getElementById('kpi-l99').textContent = d.score + '%';
}).catch(()=>{});
} catch(e) {
console.warn(e);
}
}
loadKPIs();
setInterval(loadKPIs, 30000);
</script>
<!-- V33 VSM/DMAIC/KPI integration links -->
<div style="margin:24px auto;max-width:1200px;padding:20px;background:rgba(201,100,66,0.1);border-left:4px solid #c96442;border-radius:8px">
<h2 style="color:#c96442;margin-bottom:12px;font-size:16px;text-transform:uppercase;letter-spacing:2px">Lean 6σ · Enterprise Model</h2>
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px">
<a href="/vsm-15depts-NEW.html" style="display:block;padding:14px;background:#111827;border:1px solid #1e293b;border-radius:8px;text-decoration:none;color:#e2e8f0;border-left:3px solid #c96442"><div style="font-size:14px;font-weight:600;margin-bottom:4px">🏗️ VSM 15 Départements</div><div style="font-size:11px;color:#94a3b8">SIPOC · 930 agents · 2484 skills</div></a>
<a href="/dmaic-tracker-NEW.html" style="display:block;padding:14px;background:#111827;border:1px solid #1e293b;border-radius:8px;text-decoration:none;color:#e2e8f0;border-left:3px solid #10b981"><div style="font-size:14px;font-weight:600;margin-bottom:4px">📊 DMAIC Tracker</div><div style="font-size:11px;color:#94a3b8">Define · Measure · Analyze · Improve · Control</div></a>
<a href="/kpi-live-dashboard.html" style="display:block;padding:14px;background:#111827;border:1px solid #1e293b;border-radius:8px;text-decoration:none;color:#e2e8f0;border-left:3px solid #3b82f6"><div style="font-size:14px;font-weight:600;margin-bottom:4px">📈 KPI Live Dashboard</div><div style="font-size:11px;color:#94a3b8">Real-time metrics par département</div></a>
</div></div>
<!-- V34 Architect: Enterprise Model full stack cards -->
<div style="margin:24px auto;max-width:1200px;padding:20px;background:rgba(59,130,246,0.08);border-left:4px solid #3b82f6;border-radius:8px">
<h2 style="color:#3b82f6;margin-bottom:12px;font-size:16px;text-transform:uppercase;letter-spacing:2px">Enterprise Model — Full Stack WEVIA EM (V34)</h2>
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px">
<a href="/agents-unified-registry.html" style="display:block;padding:14px;background:#111827;border:1px solid #1e293b;border-radius:8px;text-decoration:none;color:#e2e8f0;border-left:3px solid #c96442"><div style="font-size:14px;font-weight:600;margin-bottom:4px">🤖 Agents Unified Registry</div><div style="font-size:11px;color:#94a3b8">930+ agents consolidés multi-sources</div></a>
<a href="/routines-catalog.html" style="display:block;padding:14px;background:#111827;border:1px solid #1e293b;border-radius:8px;text-decoration:none;color:#e2e8f0;border-left:3px solid #10b981"><div style="font-size:14px;font-weight:600;margin-bottom:4px">⚙️ Routines Catalogue (103)</div><div style="font-size:11px;color:#94a3b8">Séquences BPMN réutilisables par dept</div></a>
<a href="/playbook-3-phases.html" style="display:block;padding:14px;background:#111827;border:1px solid #1e293b;border-radius:8px;text-decoration:none;color:#e2e8f0;border-left:3px solid #3b82f6"><div style="font-size:14px;font-weight:600;margin-bottom:4px">📘 Playbook 3 Phases</div><div style="font-size:11px;color:#94a3b8">POC → MVP → Enterprise</div></a>
<a href="/kpi-15depts-live.html" style="display:block;padding:14px;background:#111827;border:1px solid #1e293b;border-radius:8px;text-decoration:none;color:#e2e8f0;border-left:3px solid #0ea5e9"><div style="font-size:14px;font-weight:600;margin-bottom:4px">📊 KPI 15 Départements Live</div><div style="font-size:11px;color:#94a3b8">Lean 6σ · 89 KPIs × 15 depts temps réel</div></a>
<a href="/bpmn-studio-NEW.html" style="display:block;padding:14px;background:#111827;border:1px solid #1e293b;border-radius:8px;text-decoration:none;color:#e2e8f0;border-left:3px solid #a855f7"><div style="font-size:14px;font-weight:600;margin-bottom:4px">🔀 BPMN Studio</div><div style="font-size:11px;color:#94a3b8">Visual workflow canvas</div></a>
<a href="/architecture-live.html" style="display:block;padding:14px;background:#111827;border:1px solid #1e293b;border-radius:8px;text-decoration:none;color:#e2e8f0;border-left:3px solid #ec4899"><div style="font-size:14px;font-weight:600;margin-bottom:4px">🏛️ Architecture SOA Live</div><div style="font-size:11px;color:#94a3b8">6 couches L1-L6 unifiées</div></a>
<a href="/brain-center-tenant.html" style="display:block;padding:14px;background:#111827;border:1px solid #1e293b;border-radius:8px;text-decoration:none;color:#e2e8f0;border-left:3px solid #06b6d4"><div style="font-size:14px;font-weight:600;margin-bottom:4px">🧠 Brain Center (Tenant)</div><div style="font-size:11px;color:#94a3b8">Multi-tenant packaged UI</div></a>
</div></div>
<a href="/caps-hub.html" style="display:block;padding:14px;background:#111827;border:1px solid #1e293b;border-radius:8px;text-decoration:none;color:#e2e8f0;border-left:3px solid #c96442;margin:8px auto;max-width:400px"><div style="font-size:14px;font-weight:600;margin-bottom:4px">🚀 R&D Caps Hub</div><div style="font-size:11px;color:#94a3b8">8 caps V36/V37 · explain · DeepSeek-R1 · RLHF · predict · fuzzer · browser · voice · GraphRAG</div></a>
<!-- === OPUS UNIVERSAL DRILL-DOWN v1 19avr — append-only, doctrine #14 === -->
<script>
(function(){
if (window.__opusUniversalDrill) return; window.__opusUniversalDrill = true;
var d = document;
var m = d.createElement('div');
m.id = 'opus-udrill';
m.style.cssText = 'position:fixed;inset:0;background:rgba(0,0,0,0.82);backdrop-filter:blur(6px);display:none;align-items:center;justify-content:center;z-index:99995;padding:20px;cursor:pointer';
var inner = d.createElement('div');
inner.id = 'opus-udrill-in';
inner.style.cssText = 'max-width:900px;width:100%;max-height:90vh;overflow:auto;background:#0b0d15;border:1px solid rgba(99,102,241,0.35);border-radius:14px;padding:28px;cursor:default;box-shadow:0 20px 60px rgba(0,0,0,0.6);color:#e2e8f0;font:14px/1.55 Inter,system-ui,sans-serif';
inner.addEventListener('click', function(e){ e.stopPropagation(); });
m.appendChild(inner);
m.addEventListener('click', function(){ m.style.display='none'; });
d.addEventListener('keydown', function(e){ if(e.key==='Escape') m.style.display='none'; });
(d.body || d.documentElement).appendChild(m);
function openCard(card) {
// Clone card content + show close btn + increase font-size
var html = '<div style="display:flex;justify-content:flex-end;margin-bottom:14px"><button id="opus-udrill-close" style="padding:6px 14px;background:#171b2a;border:1px solid rgba(99,102,241,0.25);color:#e2e8f0;border-radius:8px;cursor:pointer;font-size:12px">✕ Fermer (Esc)</button></div>';
html += '<div style="transform-origin:top left;font-size:1.05em">' + card.outerHTML + '</div>';
inner.innerHTML = html;
d.getElementById('opus-udrill-close').onclick = function(){ m.style.display='none'; };
m.style.display = 'flex';
}
function wire(root) {
var sels = '.card,[class*="card"],.kpi,[class*="kpi"],.stat,[class*="stat"],.tile,[class*="tile"],.metric,[class*="metric"],.widget,[class*="widget"]';
var cards = root.querySelectorAll(sels);
for (var i = 0; i < cards.length; i++) {
var c = cards[i];
if (c.__opusWired) continue;
if (c.closest('button, a, input, select, textarea, #opus-udrill')) continue;
var r = c.getBoundingClientRect();
if (r.width < 60 || r.height < 40) continue;
c.__opusWired = true;
c.style.cursor = 'pointer';
c.setAttribute('role','button');
c.setAttribute('tabindex','0');
c.addEventListener('click', function(ev){
// If a more-specific drill is already active (e.g. pp-card custom), let it handle
if (ev.target.closest('[data-pp-id]') && window.__opusDrillInit) return;
if (ev.target.closest('a,button,input,select')) return;
ev.preventDefault(); ev.stopPropagation();
openCard(this);
});
c.addEventListener('keydown', function(ev){ if(ev.key==='Enter'||ev.key===' '){ev.preventDefault();openCard(this);} });
}
}
// Initial + mutation observer
var initRun = function(){ wire(d.body || d.documentElement); };
if (d.readyState === 'loading') d.addEventListener('DOMContentLoaded', initRun);
else initRun();
var mo = new MutationObserver(function(muts){
var newCard = false;
for (var i=0;i<muts.length;i++) if (muts[i].addedNodes.length) { newCard = true; break; }
if (newCard) initRun();
});
mo.observe(d.body || d.documentElement, {childList:true, subtree:true});
})();
</script>
<!-- === OPUS UNIVERSAL DRILL-DOWN END === -->
<script src="/api/archi-meta-badge.js" defer></script>
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t33b6) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
<!-- DOCTRINE-60-UX-JS --><script id="doctrine60-ux-js-direct">
// DOCTRINE-60-UX-JS staggered entrance
(function(){
if (!('IntersectionObserver' in window)) return;
const obs = new IntersectionObserver((entries) => {
entries.forEach((e, i) => {
if (e.isIntersecting) {
setTimeout(() => e.target.classList.add('enter-stagger'), i * 80);
obs.unobserve(e.target);
}
});
});
document.querySelectorAll('.card, .kpi, .panel').forEach(el => obs.observe(el));
})();
</script>
</body></html>