Files
wevia-brain/s89-arsenal-screens/chef-boss.html
2026-04-12 23:01:36 +02:00

229 lines
16 KiB
HTML
Executable File

<?php include_once("/opt/wevads-arsenal/public/api/wevads-metrics.php"); ?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>WEVADS - 👑 HAMID Chef BOSS</title>
<style>
*{margin:0;padding:0;box-sizing:border-box}
:root{--bg:#0a0a14;--c1:#10101e;--c2:#18182a;--gd:#ffd700;--gn:#00ff88;--rd:#ff4466;--yl:#ffaa00;--cy:#00ddff;--pu:#aa66ff;--pk:#ff66aa;--t1:#e8ecf4;--t2:#8892a6;--brd:#252545}
body{background:var(--bg);color:var(--t1);font-family:'Segoe UI',system-ui,sans-serif;height:100vh;display:flex;flex-direction:column;overflow:hidden}
.top{display:flex;align-items:center;padding:8px 16px;background:linear-gradient(135deg,#1a1025,#0f1520);border-bottom:1px solid var(--gd);gap:12px;flex-shrink:0}
.top h1{font-size:16px;font-weight:800;background:linear-gradient(90deg,#ffd700,#ffaa00);-webkit-background-clip:text;-webkit-text-fill-color:transparent}
.top .badge{background:var(--gd);color:#e2e8f0;padding:2px 8px;border-radius:10px;font-size:9px;font-weight:800}
.top .st{margin-left:auto;display:flex;gap:12px;font-size:9px}
.top .st span{padding:2px 8px;border-radius:8px;border:1px solid var(--brd)}
.top .st .ok{border-color:var(--gn);color:var(--gn)}
.top .st .warn{border-color:var(--yl);color:var(--yl)}
.main{display:flex;flex:1;overflow:hidden}
.left{flex:1;display:flex;flex-direction:column;overflow:hidden;border-right:1px solid var(--brd)}
.right{width:420px;display:flex;flex-direction:column;background:var(--c1)}
.kpi{display:grid;grid-template-columns:repeat(5,1fr);gap:6px;padding:8px;flex-shrink:0}
.kpi-box{background:var(--c2);border:1px solid var(--brd);border-radius:8px;padding:10px;text-align:center}
.kpi-box .v{font-size:22px;font-weight:800}.kpi-box .l{font-size:8px;color:var(--t2);margin-top:2px}
.kpi-box .sub{font-size:8px;color:var(--t2)}
.panels{display:grid;grid-template-columns:1fr 1fr 1fr;gap:6px;padding:0 8px 8px;flex:1;overflow:hidden}
.panel{background:var(--c2);border:1px solid var(--brd);border-radius:8px;display:flex;flex-direction:column;overflow:hidden}
.panel h3{font-size:10px;padding:6px 10px;background:rgba(255,215,0,0.04);border-bottom:1px solid var(--brd);color:var(--gd);flex-shrink:0;display:flex;align-items:center;gap:4px}
.panel .content{flex:1;overflow-y:auto;padding:6px 8px;font-size:9px;line-height:1.6}
.brain-row{display:flex;justify-content:space-between;padding:4px 6px;border-bottom:1px solid rgba(255,255,255,0.03)}
.brain-row .isp{font-weight:700;color:var(--cy)}.brain-row .rate{font-weight:700}
.alert{padding:5px 8px;margin:3px 0;border-radius:4px;border-left:3px solid var(--yl);background:rgba(255,170,0,0.05)}
.alert.red{border-color:var(--rd);background:rgba(255,68,102,0.05)}
.alert.green{border-color:var(--gn);background:rgba(0,255,136,0.05)}
.svc{display:flex;align-items:center;gap:6px;padding:3px 6px;border-bottom:1px solid rgba(255,255,255,0.03)}
.svc .dot{width:8px;height:8px;border-radius:50%}.dot.on{background:var(--gn)}.dot.off{background:var(--rd)}
.chat-head{padding:10px 14px;border-bottom:1px solid var(--gd);font-size:12px;font-weight:800;background:linear-gradient(135deg,rgba(255,215,0,0.08),transparent);display:flex;align-items:center;gap:8px}
.chat-head span{color:var(--gd)}
.chat-head .info{margin-left:auto;font-size:8px;color:var(--t2);font-weight:400}
.chat-msgs{flex:1;overflow-y:auto;padding:10px}
.msg{margin:8px 0;padding:10px 12px;border-radius:10px;font-size:11px;line-height:1.6;white-space:pre-wrap;word-break:break-word}
.msg.u{background:var(--c2);border:1px solid var(--brd);margin-left:60px}
.msg.s{background:rgba(255,215,0,0.04);border:1px solid rgba(255,215,0,0.12);margin-right:20px}
.msg .hdr{font-size:9px;color:var(--gd);margin-bottom:4px;font-weight:700}
.qbtns{display:flex;flex-wrap:wrap;gap:4px;padding:8px 10px;border-top:1px solid var(--brd);flex-shrink:0}
.qb{background:rgba(255,215,0,0.06);border:1px solid rgba(255,215,0,0.2);color:var(--gd);padding:5px 10px;border-radius:14px;font-size:9px;cursor:pointer;font-weight:600}
.qb:hover{background:rgba(255,215,0,0.12);border-color:var(--gd)}
.chi{display:flex;padding:8px 10px;gap:6px;border-top:1px solid var(--brd);flex-shrink:0}
.chi input{flex:1;background:var(--c2);border:1px solid var(--brd);color:var(--t1);padding:10px 14px;border-radius:8px;font-size:12px;outline:none}
.chi input:focus{border-color:var(--gd)}
.chi button{background:linear-gradient(135deg,#ffd700,#ffaa00);color:#e2e8f0;border:none;padding:10px 20px;border-radius:8px;font-weight:800;cursor:pointer;font-size:12px}
.ld{display:inline-block;width:14px;height:14px;border:2px solid var(--gd);border-top-color:transparent;border-radius:50%;animation:spin .8s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.gn{color:var(--gn)}.rd{color:var(--rd)}.yl{color:var(--yl)}.cy{color:var(--cy)}.pu{color:var(--pu)}.gd{color:var(--gd)}
.wv-status{position:fixed;top:12px;right:140px;z-index:9998;background:rgba(52,211,153,.15);border:1px solid #34d399;border-radius:12px;padding:3px 10px;color:#34d399;font-size:10px;font-weight:700;font-family:'JetBrains Mono',monospace}
.sc,.card,[class*="stat-card"]{transition:all .25s ease;position:relative;overflow:hidden}
.sc:hover,.card:hover,[class*="stat-card"]:hover{transform:translateY(-2px);box-shadow:0 8px 24px rgba(0,0,0,.25)}
.sc::after,.card::after{content:'';position:absolute;bottom:0;left:0;right:0;height:2px;background:var(--cy,#22d3ee);opacity:0;transition:opacity .25s}
.sc:hover::after,.card:hover::after{opacity:.7}
.btn,.button,[class*="btn-"]{transition:all .2s ease}
.btn:hover,.button:hover{transform:translateY(-1px)}
@keyframes fadeIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}
.sc,.card{animation:fadeIn .4s ease both}
.sc:nth-child(2),.card:nth-child(2){animation-delay:.05s}
.sc:nth-child(3),.card:nth-child(3){animation-delay:.1s}
.sc:nth-child(4),.card:nth-child(4){animation-delay:.15s}
.sc:nth-child(5),.card:nth-child(5){animation-delay:.2s}
.sc:nth-child(6),.card:nth-child(6){animation-delay:.25s}
</style>
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;700&family=DM+Sans:wght@400;600;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="wevads-global.css?v1770777318">
</head>
<body>
<div class="top">
<h1>👑 HAMID CHEF BOSS</h1>
<p style="font-size:12px;color:#64748b;margin:6px 0 16px;max-width:600px;line-height:1.6">HAMID Chef BOSS — orchestrateur IA maître, stratégie ISP, diagnostic infra.</p>
<span class="badge">MASTER ORCHESTRATOR</span>
<div class="st">
<span id="stBrain" class="ok">🧠 Brain —</span>
<span id="stSent" class="ok">🛡️ Sentinel —%</span>
<span id="stTrack" class="ok">📡 Track —</span>
<span id="stO365" class="ok">📧 O365 —</span>
</div>
</div>
<div class="main">
<div class="left">
<div class="kpi">
<div class="kpi-box"><div class="v gn" id="kBrain"></div><div class="l">BRAIN WINNERS</div><div class="sub" id="kBrainSub">— configs</div></div>
<div class="kpi-box"><div class="v cy" id="kO365"></div><div class="l">O365 ACCOUNTS</div><div class="sub" id="kTenants">— tenants</div></div>
<div class="kpi-box"><div class="v pu" id="kProviders"></div><div class="l">IA PROVIDERS</div><div class="sub" id="kKB">— KB entries</div></div>
<div class="kpi-box"><div class="v yl" id="kSent"></div><div class="l">SENT TODAY</div><div class="sub" id="kTrack">— tracking events</div></div>
<div class="kpi-box"><div class="v" id="kVault"></div><div class="l">VAULT RESTORES</div><div class="sub" id="kScore">sentinel —%</div></div>
</div>
<div class="panels">
<div class="panel"><h3>🧠 Brain Winners</h3><div class="content" id="pBrain">Loading...</div></div>
<div class="panel"><h3>⚡ Strategy Alerts</h3><div class="content" id="pAlerts">Loading...</div></div>
<div class="panel"><h3>🖥️ Infrastructure</h3><div class="content" id="pInfra">Loading...</div></div>
</div>
</div>
<div class="right">
<div class="chat-head">
<span>👑</span> HAMID Chef BOSS
<div class="info" id="chatInfo">12 providers • Master IA</div>
</div>
<div class="chat-msgs" id="chatMsgs">
<div class="msg s"><div class="hdr">👑 HAMID Chef BOSS — Master Orchestrator</div>Je supervise TOUS les systèmes WEVADS:
🧠 Brain Engine (configs ISP, inbox rates)
🛡️ Sentinel V4 (scan, repair, vault guard)
📧 O365 (comptes, tenants, warmup)
📡 Tracking (opens, clicks, conversions)
🤖 12 IA Providers (Cerebras → Ollama)
📚 Knowledge Base (84+ entries)
Je prends des décisions basées sur les données croisées.
Demandez-moi une stratégie, un diagnostic, ou une action.</div>
</div>
<div class="qbtns">
<div class="qb" data-q="status global de tous les systèmes">📊 Status Global</div>
<div class="qb" data-q="stratégie ISP pour maximiser inbox gmail et outlook">🎯 Stratégie ISP</div>
<div class="qb" data-q="analyse croisée Brain + Tracking + O365">🧠 Brain+Track</div>
<div class="qb" data-q="plan warmup O365 optimal">📧 Plan Warmup</div>
<div class="qb" data-q="diagnostic complet infrastructure 3 serveurs">🏗️ Diagnostic Infra</div>
<div class="qb" data-q="optimise inbox rates gmail outlook yahoo">📬 Optimize Inbox</div>
<div class="qb" data-q="recommandation anti-regression et stabilité">🔒 Anti-Regression</div>
<div class="qb" data-q="analyse KB et recommandations prioritaires">📚 KB Analysis</div>
</div>
<div class="chi">
<select id="provSelect" style="background:var(--c);color:var(--t);border:1px solid var(--b);border-radius:8px;padding:8px 12px;font-size:12px;min-width:180px;font-family:var(--m);cursor:pointer"><option value="">🔄 Auto (Failover)</option></select><input id="cI" placeholder="Demandez au Chef..." style="flex:1">
<button id="btnSend"></button>
</div>
</div>
</div>
<script>
var API='/api/hamid-chef.php';
function $(id){return document.getElementById(id)}
function addMsg(txt,type,provider){
var d=document.createElement('div');d.className='msg '+type;
if(type==='s')txt='<div class="hdr">👑 '+(provider||'Chef BOSS')+'</div>'+txt;
d.innerHTML=txt;$('chatMsgs').appendChild(d);d.scrollIntoView({behavior:'smooth'});
}
function sendChat(){
var inp=$('cI'),msg=inp.value.trim();if(!msg)return;
inp.value='';addMsg(msg,'u');
var ld=document.createElement('div');ld.className='msg s';ld.innerHTML='<span class="ld"></span> Intelligence gathering...';
$('chatMsgs').appendChild(ld);ld.scrollIntoView({behavior:'smooth'});
var fd=new FormData();fd.append('action','chat');fd.append('message',msg);var prov=$('provSelect').value;if(prov)fd.append('provider',prov);
fetch(API,{method:'POST',body:fd}).then(r=>r.json()).then(d=>{
ld.remove();
var info=d.provider+(d.latency_ms?' | '+d.latency_ms+'ms':'');
$('chatInfo').textContent=info;
var resp=(d.response||'Erreur').replace(/\*\*([^*]+)\*\*/g,'<b style="color:var(--gd)">$1</b>').replace(/\n/g,'<br>');
addMsg(resp,'s',d.provider+' via Chef BOSS');
if(d.systems){
$('kBrain').textContent=d.systems.brain_winners;$('kBrainSub').textContent=d.systems.brain_configs+' configs';
$('kO365').textContent=d.systems.o365_accounts;$('kTenants').textContent=d.systems.o365_tenants+' tenants';
$('kProviders').textContent=d.systems.providers_active;$('kKB').textContent=d.systems.kb_entries+' KB';
$('kSent').textContent=d.systems.sent_today;$('kTrack').textContent=d.systems.tracking_today+' events';
$('kVault').textContent=d.systems.vault_restores;$('kScore').textContent='sentinel '+d.systems.sentinel_score+'%';
}
}).catch(e=>{ld.remove();addMsg('❌ '+e.message,'s');});
}
function loadDashboard(){
fetch(API+'?action=dashboard').then(r=>r.json()).then(d=>{
var i=d.intelligence||{};
$('kBrain').textContent=(i.brain||[]).length;$('kBrainSub').textContent=(i.configs_total||0)+' configs';
$('kO365').textContent=i.o365||0;$('kTenants').textContent=(i.tenants||0)+' tenants';
$('kProviders').textContent=(i.providers||[]).length;$('kKB').textContent=(i.kb_total||0)+' KB';
$('kSent').textContent=i.sent_today||0;$('kTrack').textContent=(i.tracking_today||0)+' events';
$('kVault').textContent=i.vault_restores||0;$('kScore').textContent='sentinel '+(i.sentinel_score||0)+'%';
// Top bar
$('stBrain').textContent='🧠 Brain '+(i.brain||[]).length;
$('stSent').textContent='🛡️ Sentinel '+(i.sentinel_score||0)+'%';
$('stSent').className=(i.sentinel_score||0)>=90?'ok':'warn';
$('stTrack').textContent='📡 Track '+(i.tracking_today||0);
$('stO365').textContent='📧 O365 '+(i.o365||0);
// Brain winners
var bh='';(i.brain||[]).forEach(w=>{
var cl=parseFloat(w.inbox_rate)>=95?'gn':parseFloat(w.inbox_rate)>=85?'yl':'rd';
bh+='<div class="brain-row"><span class="isp">'+w.isp_target+'</span><span class="rate '+cl+'">'+w.inbox_rate+'%</span><span style="color:var(--t2)">'+w.total_tests+' tests | stab:'+w.stability_score+'%</span></div>';
});$('pBrain').innerHTML=bh||'<div style="color:var(--t2)">No winners yet</div>';
// Infrastructure
var ih='';
ih+='<div class="svc"><div class="dot '+(i.svc_apache2==='active'?'on':'off')+'"></div>Apache2</div>';
ih+='<div class="svc"><div class="dot '+(i.svc_postgresql==='active'?'on':'off')+'"></div>PostgreSQL</div>';
ih+='<div class="svc"><div class="dot '+(i.svc_pmta==='active'?'on':'off')+'"></div>PMTA</div>';
ih+='<div class="svc"><div class="dot '+(i.svc_ollama==='active'?'on':'off')+'"></div>Ollama</div>';
ih+='<div style="margin:8px 0;border-top:1px solid var(--brd);padding-top:6px">Disk: <b>'+i.disk+'</b> | RAM: <b>'+i.ram+'</b><br>Load: <b>'+i.load+'</b><br>'+i.uptime+'</div>';
ih+='<div style="border-top:1px solid var(--brd);padding-top:6px;font-size:8px">';
(i.providers||[]).forEach(p=>{ih+=p.provider_name+' ('+p.model.split('/').pop().substr(0,15)+'), ';});
ih+='</div>';
$('pInfra').innerHTML=ih;
}).catch(()=>{});
// Strategy alerts
fetch(API+'?action=strategy').then(r=>r.json()).then(d=>{
var ah='';
(d.alerts||[]).forEach(a=>{ah+='<div class="alert '+(a.includes('🚨')?'red':'')+'">'+a+'</div>';});
if(!d.alerts||!d.alerts.length)ah='<div class="alert green">✅ All systems nominal</div>';
ah+='<div style="margin-top:8px;padding-top:6px;border-top:1px solid var(--brd)">';
var sh=d.systems_health||{};
for(var k in sh){ah+='<div class="svc"><div class="dot '+(sh[k]==='healthy'||sh[k]==='active'||sh[k]==='strong'||sh[k]==='stable'?'on':'off')+'"></div>'+k+': '+sh[k]+'</div>';}
ah+='</div>';
if(d.recommendation)ah+='<div style="margin-top:6px;padding:6px;background:rgba(255,215,0,0.05);border-radius:4px;font-size:9px">💡 '+d.recommendation+'</div>';
$('pAlerts').innerHTML=ah;
}).catch(()=>{});
}
$('btnSend').onclick=sendChat;
$('cI').onkeydown=function(e){if(e.key==='Enter')sendChat()};
document.querySelectorAll('.qb').forEach(b=>b.onclick=function(){$('cI').value=b.dataset.q;sendChat()});
loadDashboard();setInterval(loadDashboard,60000);
// Load providers dropdown
fetch("/api/hamid-chef.php?action=status").then(r=>r.json()).then(d=>{
var sel=$("provSelect");if(!sel)return;
(d.providers||[]).forEach(p=>{
var o=document.createElement("option");
o.value=p.provider_name;
o.textContent=(p.is_active?"● ":"○ ")+p.provider_name+" — "+p.model.split("/").pop().substr(0,20);
sel.appendChild(o);
});
}).catch(()=>{});
</script>
<script src="arsenal-common.js?v1770778169">
<?php include("/opt/wevads-arsenal/public/universal-drill.html"); ?>
</body>
</html></script>