150 lines
13 KiB
PHP
Executable File
150 lines
13 KiB
PHP
Executable File
<!DOCTYPE html><html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>WEVADS • Brain Report</title>
|
|
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet">
|
|
<style>
|
|
:root{--bg:#060a14;--s:#0c1220;--s2:#111827;--b:#1e293b;--t:#e2e8f0;--d:#64748b;--cy:#22d3ee;--gn:#34d399;--am:#fbbf24;--rd:#f87171;--pu:#a78bfa;--bl:#60a5fa;--pk:#f472b6;--og:#fb923c}
|
|
.light{--bg:#f0f2f5;--s:#ffffff;--s2:#f8fafc;--b:#e2e8f0;--t:#1e293b;--d:#64748b}
|
|
*{margin:0;padding:0;box-sizing:border-box}body{background:var(--bg);color:var(--t);font-family:'DM Sans',sans-serif;font-size:11px}
|
|
.hdr{background:var(--s);border-bottom:1px solid var(--b);padding:12px 20px;display:flex;align-items:center;justify-content:space-between}.hdr h1{font-size:16px;font-weight:700}.hdr h1 span{color:var(--pu)}
|
|
.wrap{padding:16px;max-width:1200px;margin:0 auto}
|
|
.report-section{background:var(--s);border:1px solid var(--b);border-radius:10px;padding:20px;margin-bottom:16px}
|
|
.report-section h2{font-size:14px;font-weight:700;margin-bottom:12px;padding-bottom:8px;border-bottom:1px solid var(--b)}
|
|
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:12px}.grid3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px}
|
|
.kpi{text-align:center;padding:16px;background:var(--s2);border:1px solid var(--b);border-radius:8px}
|
|
.kpi .n{font-family:'JetBrains Mono',monospace;font-size:28px;font-weight:700}.kpi .l{font-size:9px;text-transform:uppercase;color:var(--d);margin-top:4px}.kpi .trend{font-size:10px;margin-top:4px}
|
|
table{width:100%;border-collapse:collapse;font-size:10px}th{text-align:left;color:var(--d);text-transform:uppercase;font-size:9px;padding:6px 8px;border-bottom:1px solid var(--b)}td{padding:6px 8px;border-bottom:1px solid rgba(30,41,59,.3)}
|
|
.badge{font-size:8px;padding:2px 6px;border-radius:3px;font-weight:600}.badge-gn{background:rgba(52,211,153,.15);color:var(--gn)}.badge-am{background:rgba(251,191,36,.15);color:var(--am)}.badge-rd{background:rgba(248,113,113,.15);color:var(--rd)}
|
|
.flow{display:flex;align-items:center;gap:0;justify-content:center;margin:16px 0;flex-wrap:wrap}
|
|
.flow-step{background:var(--s2);border:1px solid var(--b);border-radius:8px;padding:10px 16px;text-align:center;min-width:110px;font-size:10px;cursor:pointer;transition:.2s}.flow-step:hover{border-color:var(--cy)}
|
|
.flow-step.active{border-color:var(--gn);background:rgba(52,211,153,.05)}
|
|
.flow-arrow{color:var(--d);font-size:16px;margin:0 4px}
|
|
.nav-pills{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:12px}
|
|
.nav-pill{background:var(--s2);border:1px solid var(--b);border-radius:6px;padding:4px 10px;font-size:9px;color:var(--d);text-decoration:none;transition:.2s}.nav-pill:hover{border-color:var(--cy);color:var(--t)}.nav-pill.active{border-color:var(--pu);color:var(--pu)}
|
|
.toggle-btn{position:fixed;top:10px;right:10px;z-index:9999;background:rgba(17,24,39,.9);border:1px solid #1e293b;border-radius:8px;padding:6px 12px;cursor:pointer;font-size:14px;color:#e2e8f0;backdrop-filter:blur(8px)}
|
|
.live-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--gn);margin-right:4px;animation:blink 2s infinite}@keyframes blink{0%,100%{opacity:1}50%{opacity:.3}}
|
|
@media(max-width:900px){.grid2,.grid3{grid-template-columns:1fr}.flow{flex-direction:column}.flow-arrow{transform:rotate(90deg)}}
|
|
</style>
|
|
</head><body>
|
|
<button id="theme-toggle" onclick="toggleTheme()" class="toggle-btn">🌙</button>
|
|
<div class="hdr"><div><h1>📋 WEVADS • <span>Brain Report</span></h1><span style="font-size:10px;color:var(--d)"><span class="live-dot"></span>Rapport de synthèse temps réel — Données PostgreSQL</span></div><div style="display:flex;gap:8px;align-items:center"><span id="report-date" style="font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--d)"></span></div></div>
|
|
<div class="wrap">
|
|
<div class="nav-pills">
|
|
<a href="bpms-command-center.html" class="nav-pill">🚀 BPMS</a>
|
|
<a href="brain-unified-send.html" class="nav-pill">🧠 Brain Send</a>
|
|
<a href="brain-drilldown.html" class="nav-pill">📊 Drilldown</a>
|
|
<a href="performance-dashboard.html" class="nav-pill">📈 Performance</a>
|
|
<a href="brain-report.html" class="nav-pill active">📋 Report</a>
|
|
<a href="health.html" class="nav-pill">💊 Health</a>
|
|
</div>
|
|
|
|
<!-- FLOW END-TO-END -->
|
|
<div class="report-section">
|
|
<h2>🔄 Flux End-to-End — Pipeline complet</h2>
|
|
<div class="flow">
|
|
<div class="flow-step active" onclick="location='data-manager.html'"><div style="font-size:16px">📦</div><div>Data Manager</div><div style="font-size:8px;color:var(--d)">Import/Clean</div></div>
|
|
<span class="flow-arrow">→</span>
|
|
<div class="flow-step active" onclick="location='trap-detector.html'"><div style="font-size:16px">🛡️</div><div>Trap Detector</div><div style="font-size:8px;color:var(--d)">Scan traps</div></div>
|
|
<span class="flow-arrow">→</span>
|
|
<div class="flow-step active" onclick="location='harvest-manager.html'"><div style="font-size:16px">🌾</div><div>Seed Harvest</div><div style="font-size:8px;color:var(--d)">Seeds inbox</div></div>
|
|
<span class="flow-arrow">→</span>
|
|
<div class="flow-step active" onclick="location='neural-dom-mutator.html'"><div style="font-size:16px">🧬</div><div>DOM Mutator</div><div style="font-size:8px;color:var(--d)">24 mutations</div></div>
|
|
<span class="flow-arrow">→</span>
|
|
<div class="flow-step active" onclick="location='fingerprint-sync.html'"><div style="font-size:16px">👤</div><div>Fingerprint</div><div style="font-size:8px;color:var(--d)">Humanise</div></div>
|
|
<span class="flow-arrow">→</span>
|
|
<div class="flow-step active" onclick="location='predictive-send-window.html'"><div style="font-size:16px">📈</div><div>Predictive</div><div style="font-size:8px;color:var(--d)">Best timing</div></div>
|
|
<span class="flow-arrow">→</span>
|
|
<div class="flow-step active" onclick="location='brain-unified-send.html'"><div style="font-size:16px">🚀</div><div>Unified Send</div><div style="font-size:8px;color:var(--d)">12 méthodes</div></div>
|
|
<span class="flow-arrow">→</span>
|
|
<div class="flow-step active" onclick="location='brain-drilldown.html'"><div style="font-size:16px">📊</div><div>Drilldown</div><div style="font-size:8px;color:var(--d)">3 niveaux</div></div>
|
|
<span class="flow-arrow">→</span>
|
|
<div class="flow-step active" onclick="location='auto-healing-rotation.html'"><div style="font-size:16px">🔄</div><div>Auto-Heal</div><div style="font-size:8px;color:var(--d)">Recovery</div></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- KPIs LIVE -->
|
|
<div class="report-section">
|
|
<h2 style="color:var(--cy)">📊 KPIs Temps Réel</h2>
|
|
<div class="grid3" id="kpi-grid">
|
|
<div class="kpi"><div class="n" style="color:var(--cy)" id="k-total">—</div><div class="l">Emails aujourd'hui</div><div class="trend" id="k-total-trend"></div></div>
|
|
<div class="kpi"><div class="n" style="color:var(--gn)" id="k-inbox">—</div><div class="l">Inbox Rate</div><div class="trend" id="k-inbox-trend"></div></div>
|
|
<div class="kpi"><div class="n" style="color:var(--am)" id="k-bounce">—</div><div class="l">Bounce Rate</div><div class="trend" id="k-bounce-trend"></div></div>
|
|
<div class="kpi"><div class="n" style="color:var(--pu)" id="k-accounts">—</div><div class="l">Comptes actifs</div></div>
|
|
<div class="kpi"><div class="n" style="color:var(--og)" id="k-pmta">—</div><div class="l">PMTA Queue</div></div>
|
|
<div class="kpi"><div class="n" style="color:var(--gn)" id="k-uptime">—</div><div class="l">System Status</div></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- ISP BREAKDOWN -->
|
|
<div class="report-section">
|
|
<h2>📧 Breakdown par ISP</h2>
|
|
<table><thead><tr><th>ISP</th><th>Volume 7j</th><th>Inbox %</th><th>Méthode recommandée</th><th>Brain Config</th></tr></thead><tbody id="report-isp"><tr><td colspan="5" style="color:var(--d);text-align:center;padding:20px">Chargement données PostgreSQL...</td></tr></tbody></table>
|
|
</div>
|
|
|
|
<!-- DB OVERVIEW -->
|
|
<div class="report-section">
|
|
<h2>💾 Base de données</h2>
|
|
<div class="grid2">
|
|
<div><table><thead><tr><th>Table</th><th>Rows</th><th>Size</th></tr></thead><tbody id="report-db"><tr><td colspan="3" class="loading" style="color:var(--d)">Chargement...</td></tr></tbody></table></div>
|
|
<div id="report-services"><div style="color:var(--d);padding:20px;text-align:center">Chargement services...</div></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- MODULES STATUS -->
|
|
<div class="report-section">
|
|
<h2>🧩 Status Modules Arsenal</h2>
|
|
<div class="grid3" id="module-status"></div>
|
|
</div>
|
|
</div>
|
|
<script>
|
|
var API='/api/arsenal-data.php';
|
|
function toggleTheme(){var b=document.body,t=document.getElementById('theme-toggle');if(b.classList.contains('light')){b.classList.remove('light');t.textContent='🌙';localStorage.setItem('wevads-theme','dark')}else{b.classList.add('light');t.textContent='☀️';localStorage.setItem('wevads-theme','light')}}
|
|
if(localStorage.getItem('wevads-theme')==='light'){document.body.classList.add('light');document.getElementById('theme-toggle').textContent='☀️'}
|
|
document.getElementById('report-date').textContent=new Date().toLocaleString('fr-FR');
|
|
|
|
async function fetchAPI(a){try{var r=await fetch(API+'?action='+a);return await r.json()}catch(e){return{error:e.message}}}
|
|
|
|
async function loadReport(){
|
|
var ss=await fetchAPI('send_stats');
|
|
if(ss.today){var t=parseInt(ss.today.total)||0;var d=parseInt(ss.today.delivered)||0;var b=parseInt(ss.today.bounced)||0;
|
|
document.getElementById('k-total').textContent=t.toLocaleString('fr-FR');
|
|
document.getElementById('k-inbox').textContent=t>0?Math.round(d/t*100)+'%':'N/A';
|
|
document.getElementById('k-bounce').textContent=t>0?(b/t*100).toFixed(1)+'%':'N/A';
|
|
}
|
|
if(ss.by_isp&&ss.by_isp.length>0){var h='';var methods={'gmail':'O365 Graph API','outlook':'O365 Exchange','hotmail':'O365 Exchange','t-online':'PMTA Exchange','gmx':'PMTA Exchange','web.de':'PMTA Exchange','yahoo':'Amazon SES','orange':'PMTA Minimal','free':'PMTA Minimal'};
|
|
ss.by_isp.forEach(function(r){var isp=r.isp?r.isp.toLowerCase():'';var m='Brain Auto-Route';Object.keys(methods).forEach(function(k){if(isp.indexOf(k)>=0)m=methods[k]});
|
|
var pct=parseFloat(r.inbox_rate)||0;var c=pct>=90?'var(--gn)':pct>=70?'var(--am)':'var(--rd)';
|
|
h+='<tr><td style="font-weight:600">'+r.isp+'</td><td>'+parseInt(r.cnt).toLocaleString()+'</td><td style="color:'+c+';font-weight:700">'+pct+'%</td><td>'+m+'</td><td><span class="badge badge-gn">Auto</span></td></tr>'});
|
|
document.getElementById('report-isp').innerHTML=h}
|
|
|
|
var ac=await fetchAPI('accounts');if(ac.total)document.getElementById('k-accounts').textContent=(ac.active_count||ac.total);
|
|
var pm=await fetchAPI('pmta_status');if(pm.queue_recipients)document.getElementById('k-pmta').textContent=pm.queue_recipients;
|
|
var sy=await fetchAPI('system');if(sy.services){
|
|
document.getElementById('k-uptime').textContent=sy.services.apache==='active'?'ALL OK':'ISSUE';document.getElementById('k-uptime').style.color=sy.services.apache==='active'?'var(--gn)':'var(--rd)';
|
|
var h='<h4 style="font-size:11px;margin-bottom:8px">Services</h4>';Object.keys(sy.services).forEach(function(k){var ok=sy.services[k]==='active';h+='<div style="display:flex;justify-content:space-between;padding:4px 0;font-size:10px;border-bottom:1px solid rgba(30,41,59,.2)"><span>'+k+'</span><span class="badge '+(ok?'badge-gn':'badge-rd')+'">'+(ok?'ACTIVE':'DOWN')+'</span></div>'});
|
|
h+='<div style="margin-top:8px;font-size:9px;color:var(--d)">CPU: '+sy.cpu_pct+'% • RAM: '+sy.mem_pct+'% • Disk: '+sy.disk_pct+'</div>';
|
|
document.getElementById('report-services').innerHTML=h}
|
|
|
|
var dt=await fetchAPI('db_tables');if(Array.isArray(dt)&&dt.length>0){var h='';dt.slice(0,12).forEach(function(r){h+='<tr><td style="font-family:JetBrains Mono,monospace;font-size:9px">'+r.table_name+'</td><td>'+parseInt(r.row_count).toLocaleString()+'</td><td>'+r.size+'</td></tr>'});document.getElementById('report-db').innerHTML=h}
|
|
|
|
// Module status
|
|
var modules=[
|
|
{name:'🧬 Neural DOM Mutator',url:'neural-dom-mutator.html',cat:'Contenu'},
|
|
{name:'🛡️ Trap Detector',url:'trap-detector.html',cat:'Defense'},
|
|
{name:'👤 Fingerprint Sync',url:'fingerprint-sync.html',cat:'Identité'},
|
|
{name:'📈 Predictive Window',url:'predictive-send-window.html',cat:'Operations'},
|
|
{name:'🔄 Auto-Healing',url:'auto-healing-rotation.html',cat:'Infra'},
|
|
{name:'🧠 Brain Unified Send',url:'brain-unified-send.html',cat:'Core'},
|
|
{name:'📊 Brain Drilldown',url:'brain-drilldown.html',cat:'Analytics'},
|
|
{name:'🌾 Harvest Manager',url:'harvest-manager.html',cat:'Seeds'},
|
|
{name:'🔀 Pattern Shuffler',url:'pattern-shuffler.html',cat:'Anti-FP'},
|
|
{name:'📦 Data Manager',url:'data-manager.html',cat:'Données'},
|
|
{name:'📊 Performance',url:'performance-dashboard.html',cat:'Monitoring'},
|
|
{name:'💊 Health Monitor',url:'health.html',cat:'System'}
|
|
];
|
|
var h='';modules.forEach(function(m){h+='<div style="background:var(--s2);border:1px solid var(--b);border-radius:8px;padding:10px;cursor:pointer" onclick="location=\''+m.url+'\'"><div style="font-size:11px;font-weight:600">'+m.name+'</div><div style="font-size:8px;color:var(--d);margin-top:2px">'+m.cat+'</div><span class="badge badge-gn">DEPLOYED</span></div>'});
|
|
document.getElementById('module-status').innerHTML=h;
|
|
}
|
|
loadReport();
|
|
</script>
|
|
</body></html>
|
|
|