561 lines
44 KiB
HTML
561 lines
44 KiB
HTML
<!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 - WEVADS Command Center</title>
|
||
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css" rel="stylesheet">
|
||
<style>
|
||
@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;700&family=DM+Sans:wght@300;500;700;900&display=swap');
|
||
*{margin:0;padding:0;box-sizing:border-box}
|
||
:root{--bg:#04080f;--s:#0a1020;--c:#111a2e;--cy:#22d3ee;--gn:#060a14;--rd:#ef4444;--or:#f59e0b;--pk:#ec4899;--pu:#a78bfa;--bl:#3b82f6;--tx:#1e293b;--t2:#64748b;--b:#1e293b}
|
||
body{background:#060a14;color:var(--tx);font-family:'DM Sans',sans-serif;overflow:hidden;height:100vh}
|
||
.shell{display:grid;grid-template-columns:1fr 380px;grid-template-rows:48px 1fr;height:100vh}
|
||
.topbar{grid-column:1/-1;background:var(--s);border-bottom:1px solid var(--b);display:flex;align-items:center;padding:0 14px;gap:10px}
|
||
.topbar h1{font-size:15px;font-weight:900;letter-spacing:2px;background:linear-gradient(135deg,var(--cy),var(--pk));-webkit-background-clip:text;-webkit-text-fill-color:transparent}
|
||
.tabs{display:flex;gap:2px;margin-left:12px}
|
||
.tab{padding:6px 12px;border-radius:5px;cursor:pointer;font-size:10px;font-weight:700;color:var(--t2);transition:.2s;letter-spacing:.5px}
|
||
.tab:hover{color:var(--tx);background:var(--c)}.tab.on{color:var(--cy);background:var(--c)}
|
||
.topbar .st{margin-left:auto;display:flex;gap:8px;align-items:center;font-size:9px}
|
||
.dot{width:6px;height:6px;border-radius:50%;display:inline-block;margin-right:2px}
|
||
.dot-g{background:var(--gn);box-shadow:0 0 4px var(--gn)}.dot-r{background:var(--rd)}.dot-y{background:var(--or)}
|
||
.main{overflow-y:auto;padding:12px;scrollbar-width:thin;scrollbar-color:var(--b) transparent}
|
||
.chat-panel{background:var(--s);border-left:1px solid var(--b);display:flex;flex-direction:column}
|
||
.pane{display:none}.pane.on{display:block}
|
||
.row{display:grid;gap:8px;margin-bottom:8px}.r4{grid-template-columns:repeat(4,1fr)}.r3{grid-template-columns:repeat(3,1fr)}.r2{grid-template-columns:repeat(2,1fr)}
|
||
.card{background:var(--s);border:1px solid var(--b);border-radius:7px;padding:10px;transition:.2s}.card:hover{border-color:var(--cy)}
|
||
.card h3{font-size:8px;font-weight:700;color:var(--t2);text-transform:uppercase;letter-spacing:1px;margin-bottom:5px}
|
||
.card .val{font-size:24px;font-weight:900;font-family:'JetBrains Mono',monospace}.card .sub{font-size:9px;color:var(--t2);margin-top:2px}
|
||
.cy{color:var(--cy)}.gn{color:var(--gn)}.rd{color:var(--rd)}.or{color:var(--or)}.pk{color:var(--pk)}.pu{color:var(--pu)}
|
||
.sup-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:8px}
|
||
.sup-box{background:var(--c);border-radius:8px;padding:10px;border:2px solid var(--b)}
|
||
.sup-box.sentinel{border-color:var(--gn)}.sup-box.mind{border-color:var(--pk)}
|
||
.sup-title{font-size:12px;font-weight:900;margin-bottom:6px;display:flex;align-items:center;gap:6px}
|
||
.sup-flow{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:6px}
|
||
.sup-node{background:var(--s);border:1px solid var(--b);border-radius:6px;padding:4px 8px;font-size:9px;text-align:center;min-width:72px}
|
||
.sup-node b{display:block;font-size:13px}.sup-node small{color:var(--t2)}
|
||
.sup-targets{font-size:9px;color:var(--t2);line-height:1.6}.sup-targets b{color:var(--tx)}
|
||
.sup-arrow{color:var(--cy);font-size:10px;display:flex;align-items:center}
|
||
.srv{background:var(--c);border:1px solid var(--b);border-radius:8px;padding:8px;transition:.2s}.srv:hover{border-color:var(--cy)}
|
||
.srv h4{font-size:11px;font-weight:700;margin-bottom:4px;display:flex;align-items:center;gap:4px}
|
||
.pg{display:grid;grid-template-columns:repeat(auto-fill,minmax(100px,1fr));gap:3px}
|
||
.pi{background:var(--s);border-radius:4px;padding:4px 6px;font-size:8px;font-family:'JetBrains Mono',monospace;display:flex;align-items:center;gap:3px;cursor:pointer;border:1px solid transparent}
|
||
.pi:hover{border-color:var(--cy)}.pi .pd{width:5px;height:5px;border-radius:50%;flex-shrink:0}
|
||
.cl{font-size:8px;color:var(--t2);padding:1px 0;border-left:2px solid var(--b);padding-left:6px;margin:1px 0}.cl b{color:var(--tx)}
|
||
.dg{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:5px}
|
||
.di{background:var(--c);border-radius:5px;padding:6px;font-size:9px;border:1px solid var(--b)}.di .dt{color:var(--t2);font-size:7px;text-transform:uppercase;letter-spacing:.5px;margin-bottom:2px}.di .dd{font-family:'JetBrains Mono',monospace;font-size:9px;word-break:break-all}
|
||
.fl{display:flex;align-items:center;gap:4px;padding:6px;background:var(--c);border-radius:5px;margin-bottom:8px;overflow-x:auto;border:1px solid var(--b)}
|
||
.fs{background:var(--s);border:1px solid var(--b);border-radius:5px;padding:4px 8px;font-size:8px;text-align:center;min-width:60px;flex-shrink:0}.fs b{display:block;font-size:12px;margin-bottom:1px}
|
||
.fa-arrow{color:var(--cy);font-size:12px;flex-shrink:0}
|
||
.ai-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:6px;margin-bottom:8px}
|
||
.ai-card{background:linear-gradient(135deg,var(--c),var(--s));border:1px solid var(--b);border-radius:8px;padding:8px;cursor:pointer;transition:.2s;text-decoration:none;color:var(--tx)}
|
||
.ai-card:hover{border-color:var(--cy);transform:translateY(-1px);box-shadow:0 4px 12px rgba(34,211,238,.1)}
|
||
.ai-card .ai-icon{font-size:18px;margin-bottom:3px}.ai-card .ai-name{font-size:10px;font-weight:700}.ai-card .ai-desc{font-size:8px;color:var(--t2)}
|
||
.tt{background:var(--c);border-radius:6px;padding:8px;margin-bottom:8px;border:1px solid var(--b)}.tt h4{font-size:10px;font-weight:700;color:var(--or);margin-bottom:5px}
|
||
.tr{display:flex;align-items:center;gap:5px;padding:2px 0;font-size:9px;font-family:'JetBrains Mono',monospace;border-bottom:1px solid var(--b)}.tr:last-child{border:none}
|
||
.tb{padding:1px 4px;border-radius:3px;font-size:7px;font-weight:700}.tb.ok{background:rgba(16,185,129,.15);color:var(--gn)}.tb.ko{background:rgba(239,68,68,.15);color:var(--rd)}.tb.wt{background:rgba(245,158,11,.15);color:var(--or)}
|
||
.sl{font-size:9px;color:var(--t2);line-height:1.6}.sl b{color:var(--tx)}
|
||
.chat-head{padding:8px;border-bottom:1px solid var(--b);display:flex;align-items:center;gap:5px}
|
||
.ctg{display:flex;gap:2px;background:var(--c);border-radius:4px;padding:2px}
|
||
.ct{padding:3px 8px;border-radius:3px;cursor:pointer;font-size:9px;font-weight:700;color:var(--t2);transition:.2s}.ct.on{background:var(--cy);color:var(--bg)}
|
||
.chat-msgs{flex:1;overflow-y:auto;padding:6px;scrollbar-width:thin}
|
||
.msg{margin-bottom:5px;padding:6px 8px;border-radius:6px;font-size:9px;line-height:1.4;white-space:pre-wrap;font-family:'JetBrains Mono',monospace;word-break:break-word;max-width:95%}
|
||
.msg.s{background:var(--c);border:1px solid var(--b);border-radius:6px 6px 6px 2px}
|
||
.msg.u{background:linear-gradient(135deg,rgba(34,211,238,.1),rgba(168,139,250,.1));border:1px solid rgba(34,211,238,.12);margin-left:auto;border-radius:6px 6px 2px 6px}
|
||
.msg.exec{background:rgba(16,185,129,.05);border:1px solid rgba(16,185,129,.12);font-size:8px}
|
||
.msg .pv{font-size:7px;color:var(--t2);text-align:right;margin-top:2px}
|
||
.chi{padding:5px;border-top:1px solid var(--b);display:flex;gap:4px}
|
||
.chi input{flex:1;background:var(--c);border:1px solid var(--b);border-radius:4px;padding:6px 8px;color:var(--tx);font-size:10px;outline:none;font-family:'JetBrains Mono',monospace}
|
||
.chi input:focus{border-color:var(--cy)}
|
||
.chi button{background:var(--cy);border:none;border-radius:4px;padding:6px 10px;color:var(--bg);font-weight:700;cursor:pointer;font-size:10px}
|
||
.qb-row{padding:4px 6px;display:flex;flex-wrap:wrap;gap:2px;border-bottom:1px solid var(--b)}
|
||
.qb{padding:2px 6px;border-radius:3px;font-size:7px;background:var(--c);border:1px solid var(--b);color:var(--t2);cursor:pointer;font-weight:600}.qb:hover{border-color:var(--cy);color:var(--cy)}
|
||
.ld{display:inline-block;width:9px;height:9px;border:2px solid var(--b);border-top-color:var(--cy);border-radius:50%;animation:spin .6s linear infinite}
|
||
@keyframes spin{to{transform:rotate(360deg)}}
|
||
.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}
|
||
</style><link rel="stylesheet" href="wevads-global.css?v1770777318">
|
||
</head><body>
|
||
|
||
|
||
<div class="shell">
|
||
<div class="topbar">
|
||
<h1>⚡ WEVADS COMMAND CENTER</h1>
|
||
<div class="tabs">
|
||
<div class="tab on" data-p="dashboard">📊 Dashboard</div>
|
||
<div class="tab" data-p="ai">🤖 IA Hub</div>
|
||
<div class="tab" data-p="arch">🏗️ Architecture</div>
|
||
<div class="tab" data-p="tracking">📡 Tracking</div>
|
||
<div class="tab" data-p="sentinel">🛡️ Sentinel</div>
|
||
</div>
|
||
<div class="st"><span><span class="dot dot-g"></span>Hetzner</span><span><span class="dot dot-g"></span>OVH</span><span><span class="dot dot-g"></span>Consulting</span><span style="color:var(--t2)" id="lu">—</span></div>
|
||
</div>
|
||
<div class="main">
|
||
|
||
<!-- DASHBOARD -->
|
||
<div class="pane on" id="p-dashboard">
|
||
<div class="row r4">
|
||
<div class="card"><h3>Score Sentinel</h3><div class="val gn" id="dS">—</div><div class="sub" id="dSs">—</div></div>
|
||
<div class="card"><h3>Fichiers scannés</h3><div class="val cy" id="dF">—</div><div class="sub">PHP analysés</div></div>
|
||
<div class="card"><h3>Issues / Fixes</h3><div class="val or" id="dI">—</div><div class="sub">issues / total fixes</div></div>
|
||
<div class="card"><h3>KB + Patterns</h3><div class="val pu" id="dK">—</div><div class="sub">knowledge + patterns</div></div>
|
||
</div>
|
||
<div class="row r4">
|
||
<div class="card"><h3>📧 Office 365</h3><div class="val cy" id="dO">—</div><div class="sub" id="dTn">— tenants</div></div>
|
||
<div class="card"><h3>🧠 Brain Winners</h3><div class="val gn" id="dB">—</div><div class="sub">88-100% inbox</div></div>
|
||
<div class="card"><h3>💬 WEVAL IA</h3><div class="val pk" id="dH">—</div><div class="sub" id="dHs">providers actifs</div></div>
|
||
<div class="card"><h3>📡 Tracking</h3><div class="val gn" id="dTr">—</div><div class="sub">culturellemejean.charity</div></div>
|
||
</div>
|
||
<div class="row r4">
|
||
<div class="card" onclick="window.open(profit-orchestrator.html,_blank)" style="cursor:pointer"><h3>💰 Profit</h3><div class="val gn" id="dProfit">€0</div><div class="sub" id="dRoas">ROAS: —</div></div>
|
||
<div class="card" onclick="window.open(ghost-network.html,_blank)" style="cursor:pointer"><h3>👻 Ghost Net</h3><div class="val pk" id="dProxy">0</div><div class="sub">proxies résidentiels</div></div>
|
||
<div class="card" onclick="window.open(auto-supply.html,_blank)" style="cursor:pointer"><h3>📦 Supply</h3><div class="val or" id="dSupply">—</div><div class="sub" id="dAlerts">stock alerts</div></div>
|
||
<div class="card" onclick="window.open(adversarial-sandbox.html,_blank)" style="cursor:pointer"><h3>🧪 Sandbox</h3><div class="val cy" id="dSandbox">0</div><div class="sub">tests run</div></div>
|
||
</div>
|
||
<div class="sup-grid">
|
||
<div class="sup-box sentinel">
|
||
<div class="sup-title">🛡️ Sentinel V4 — Réparateur Autonome</div>
|
||
<div class="sup-flow">
|
||
<div class="sup-node"><b>🔍</b>Scan<small>624 fichiers</small></div><span class="sup-arrow">→</span>
|
||
<div class="sup-node"><b>⚠️</b>Detect<small>24 patterns</small></div><span class="sup-arrow">→</span>
|
||
<div class="sup-node"><b>🔧</b>Fix<small>Auto-repair</small></div><span class="sup-arrow">→</span>
|
||
<div class="sup-node"><b>📚</b>Learn<small>KB entries</small></div><span class="sup-arrow">→</span>
|
||
<div class="sup-node"><b>📡</b>SSH<small>3 serveurs</small></div>
|
||
</div>
|
||
<div class="sup-targets">
|
||
<b>Servers:</b> Hetzner (local) + OVH (SSH) + Consulting (SSH)<br>
|
||
<b>Cron:</b> 22h daily auto-scan | <b>Anti-hallucination:</b> résultats SSH réels uniquement<br>
|
||
<b>Protection:</b> Jamais sed sur menu.html | Jamais rm -rf | Backup avant modif
|
||
</div>
|
||
</div>
|
||
<div class="sup-box mind">
|
||
<div class="sup-title">🧠 Weval Mind 2.0 — Superviseur Intelligent</div>
|
||
<div class="sup-flow">
|
||
<div class="sup-node"><b>👁️</b>Perception<small>Env scanning</small></div><span class="sup-arrow">→</span>
|
||
<div class="sup-node"><b>🔍</b>Diagnostic<small>Problem analysis</small></div><span class="sup-arrow">→</span>
|
||
<div class="sup-node"><b>📋</b>Planning<small>Action plans</small></div><span class="sup-arrow">→</span>
|
||
<div class="sup-node"><b>⚡</b>Execution<small>Auto-repair</small></div><span class="sup-arrow">→</span>
|
||
<div class="sup-node"><b>📚</b>Learning<small>Continuous</small></div>
|
||
</div>
|
||
<div class="sup-flow">
|
||
<div class="sup-node"><b>🩺</b>Surgery<small>Deep repair</small></div>
|
||
<div class="sup-node"><b>💬</b>Chat NLU<small>Natural lang</small></div>
|
||
<div class="sup-node"><b>📊</b>Monitoring<small>24/7 watch</small></div>
|
||
</div>
|
||
<div class="sup-targets">
|
||
<b>Pilote:</b> Brain Engine (10 winners, configs ISP) → Send Unified → Tracking OVH → Lead conversion<br>
|
||
<b>Monitore:</b> HAMID providers (7 IA), inbox rates, ISP scores, O365 accounts, domain reputation<br>
|
||
<b>Flux E2E:</b> Campaign → Brain select → O365/PMTA send → Inbox → Open pixel → Click redirect → Offer LP → Lead<br>
|
||
<b>API:</b> /api/weval-mind-core.php (status, diagnostic, brain_status, health)
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="row r3">
|
||
<div class="card"><h3>🖥️ Hetzner</h3><div class="sl" id="hM">Chargement...</div></div>
|
||
<div class="card"><h3>📡 OVH</h3><div class="sl" id="oM">Chargement...</div></div>
|
||
<div class="card"><h3>🏢 Consulting</h3><div class="sl" id="cM">Chargement...</div></div>
|
||
</div>
|
||
<div class="fl">
|
||
<div class="fs"><b>📝</b>Campaign</div><span class="fa-arrow">→</span>
|
||
<div class="fs" style="border-color:var(--pk)"><b>🧠</b>Brain</div><span class="fa-arrow">→</span>
|
||
<div class="fs"><b>📧</b>O365</div><span class="fa-arrow">→</span>
|
||
<div class="fs"><b>📬</b>Inbox</div><span class="fa-arrow">→</span>
|
||
<div class="fs"><b>👁️</b>Open</div><span class="fa-arrow">→</span>
|
||
<div class="fs"><b>🖱️</b>Click</div><span class="fa-arrow">→</span>
|
||
<div class="fs"><b>🎯</b>Offer</div><span class="fa-arrow">→</span>
|
||
<div class="fs"><b>💰</b>Lead</div><span class="fa-arrow">→</span>
|
||
<div class="fs"><b>📊</b>Report</div>
|
||
</div>
|
||
<div class="card"><h3>🔧 Recent Fixes</h3><div id="rF" style="font-size:9px;font-family:'JetBrains Mono',monospace;max-height:120px;overflow-y:auto">...</div></div>
|
||
</div>
|
||
|
||
<!-- IA HUB -->
|
||
<div class="pane" id="p-ai">
|
||
<h3 style="font-size:13px;font-weight:900;margin-bottom:10px;color:var(--cy)">🤖 Toutes les interfaces IA — Accès direct</h3>
|
||
<h4 style="font-size:10px;color:var(--pk);margin-bottom:6px">💬 WEVAL IA — Chat & Assistants</h4>
|
||
<div class="ai-grid">
|
||
<a class="ai-card" href="/deliverads/hamid.php" target="_blank"><div class="ai-icon">💬</div><div class="ai-name">HAMID Chat</div><div class="ai-desc">Chat IA principal (ADX)</div></a>
|
||
<a class="ai-card" href="/deliverads/hamid.php?q=Analyse%20tous%20les%20r%C3%A9sultats%20du%20Brain%20et%20recommande%20les%20meilleures%20strat%C3%A9gies%20par%20ISP" target="_blank"><div class="ai-icon">🧠</div><div class="ai-name">Brain Analyzer</div><div class="ai-desc">Analyse Brain + stratégies ISP</div></a>
|
||
<a class="ai-card" href="/hamid-fullscreen.php" target="_blank"><div class="ai-icon">🖥️</div><div class="ai-name">HAMID Fullscreen</div><div class="ai-desc">DM+Sansface plein écran</div></a>
|
||
<a class="ai-card" href="/hamid-claude.php" target="_blank"><div class="ai-icon">🤖</div><div class="ai-name">HAMID Claude</div><div class="ai-desc">Mode Claude direct</div></a>
|
||
<a class="ai-card" href="/hamid-ssh.php" target="_blank"><div class="ai-icon">🔐</div><div class="ai-name">HAMID SSH</div><div class="ai-desc">Terminal IA</div></a>
|
||
<a class="ai-card" href="/hamid-code.php" target="_blank"><div class="ai-icon">💻</div><div class="ai-name">HAMID Code</div><div class="ai-desc">Génération de code</div></a>
|
||
<a class="ai-card" href="/hamid-vision.php" target="_blank"><div class="ai-icon">👁️</div><div class="ai-name">HAMID Vision</div><div class="ai-desc">Analyse d'images</div></a>
|
||
<a class="ai-card" href="/hamid-voice.php" target="_blank"><div class="ai-icon">🎙️</div><div class="ai-name">HAMID Voice</div><div class="ai-desc">DM+Sansface vocale</div></a>
|
||
<a class="ai-card" href="/hamid-providers-config.php" target="_blank"><div class="ai-icon">⚙️</div><div class="ai-name">Providers Config</div><div class="ai-desc">11 providers IA config</div></a>
|
||
<a class="ai-card" href="/hamid-failover-monitor.php" target="_blank"><div class="ai-icon">🔄</div><div class="ai-name">Failover Monitor</div><div class="ai-desc">Auto-bascule providers</div></a>
|
||
</div>
|
||
<h4 style="font-size:10px;color:var(--gn);margin:10px 0 6px">🧠 Brain Engine — Configs & Analyse</h4>
|
||
<div class="ai-grid">
|
||
<a class="ai-card" href="/brain-combo-discovery.html" target="_blank"><div class="ai-icon">🔬</div><div class="ai-name">Brain Combo</div><div class="ai-desc">Découverte combinaisons gagnantes</div></a>
|
||
<a class="ai-card" href="/brain-drilldown.html" target="_blank"><div class="ai-icon">📊</div><div class="ai-name">Brain Drilldown</div><div class="ai-desc">Analyse détaillée par ISP</div></a>
|
||
<a class="ai-card" href="/analyse-brain.php" target="_blank"><div class="ai-icon">📈</div><div class="ai-name">Analyse Brain</div><div class="ai-desc">Vue d'ensemble résultats</div></a>
|
||
<a class="ai-card" href="/brain-report.html" target="_blank"><div class="ai-icon">📋</div><div class="ai-name">Brain Report</div><div class="ai-desc">Rapport détaillé</div></a>
|
||
<a class="ai-card" href="/brain-dashboard.php" target="_blank"><div class="ai-icon">🎯</div><div class="ai-name">Brain Dashboard</div><div class="ai-desc">Tableau de bord Brain</div></a>
|
||
<a class="ai-card" href="/hamid-brain-config.php" target="_blank"><div class="ai-icon">⚙️</div><div class="ai-name">Brain Config</div><div class="ai-desc">Configuration moteur</div></a>
|
||
<a class="ai-card" href="/hamid-brain-monitor.php" target="_blank"><div class="ai-icon">📡</div><div class="ai-name">Brain Monitor</div><div class="ai-desc">Surveillance temps réel</div></a>
|
||
</div>
|
||
<h4 style="font-size:10px;color:var(--or);margin:10px 0 6px">📧 Send Process — Envoi & Orchestration</h4>
|
||
<div class="ai-grid">
|
||
<a class="ai-card" href="/brain-unified-send.html" target="_blank"><div class="ai-icon">🚀</div><div class="ai-name">Unified Send</div><div class="ai-desc">Envoi unifié Brain+Tracking</div></a>
|
||
<a class="ai-card" href="/semi-auto-send.html" target="_blank"><div class="ai-icon">⚡</div><div class="ai-name">Semi-Auto Send</div><div class="ai-desc">Envoi semi-automatique</div></a>
|
||
<a class="ai-card" href="/send-process.html" target="_blank"><div class="ai-icon">📤</div><div class="ai-name">Send Process</div><div class="ai-desc">Processus d'envoi</div></a>
|
||
<a class="ai-card" href="/send-data-factory.html" target="_blank"><div class="ai-icon">🏭</div><div class="ai-name">Data Factory</div><div class="ai-desc">Préparation données</div></a>
|
||
<a class="ai-card" href="/test-send-tracking-full.html" target="_blank"><div class="ai-icon">🧪</div><div class="ai-name">Test Send+Track</div><div class="ai-desc">Test envoi complet</div></a>
|
||
<a class="ai-card" href="/predictive-send-window.html" target="_blank"><div class="ai-icon">🕐</div><div class="ai-name">Predictive Send</div><div class="ai-desc">Fenêtre d'envoi optimale</div></a>
|
||
</div>
|
||
<h4 style="font-size:10px;color:var(--pu);margin:10px 0 6px">🛡️ Superviseurs Autonomes</h4>
|
||
<div class="ai-grid">
|
||
<a class="ai-card" href="/command-center.html" target="_blank" style="border-color:var(--cy)"><div class="ai-icon">⚡</div><div class="ai-name">Command Center</div><div class="ai-desc">CE dashboard (ici)</div></a>
|
||
<a class="ai-card" href="/sentinel-v4.html" target="_blank" style="border-color:var(--gn)"><div class="ai-icon">🛡️</div><div class="ai-name">Sentinel V4</div><div class="ai-desc">Scan + Repair + SSH</div></a>
|
||
<a class="ai-card" href="/weval-mind-dashboard-enhanced.html" target="_blank" style="border-color:var(--pk)"><div class="ai-icon">🧠</div><div class="ai-name">Weval Mind 2.0</div><div class="ai-desc">Superviseur intelligent</div></a>
|
||
<a class="ai-card" href="/hamid-control-center.php" target="_blank"><div class="ai-icon">🎛️</div><div class="ai-name">HAMID Control</div><div class="ai-desc">Centre de contrôle IA</div></a>
|
||
</div>
|
||
<div style="background:var(--c);border-radius:8px;padding:10px;margin-top:10px;border:1px solid var(--b)">
|
||
<h4 style="font-size:10px;color:var(--cy);margin-bottom:8px">🔗 Connexions entre systèmes</h4>
|
||
<div style="display:grid;grid-template-columns:1fr 1fr;gap:8px;font-size:9px">
|
||
<div class="sup-targets"><b style="color:var(--pk)">WEVAL IA → Brain Engine</b><br>hamid-brain.php: analyse configs gagnantes<br>brain-analyze.php: recommandations par ISP<br>hamid_knowledge: 240+ entrées techniques<br><br><b style="color:var(--gn)">Brain Engine → Send Unified</b><br>brain_unified_send.php: sélection auto config<br>Tracking: std_track_open + std_track_click<br>culturellemejean.charity URLs injectées</div>
|
||
<div class="sup-targets"><b style="color:var(--or)">Send Unified → Tracking OVH</b><br>Open pixel: /op/{campaign_hash}<br>Click redirect: /cl/{campaign_hash}<br>Lead callback: /lead.php?id=...<br>Optout: /optout.php?email=...<br><br><b style="color:var(--pu)">Weval Mind ← Tout</b><br>brain_connected: true (winners, configs, ISP)<br>hamid_connected: true (7 providers, convos)<br>Health score: multi-factor scoring<br>Emergency: auto-diagnostic si KPIs chutent</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- ARCHITECTURE -->
|
||
<div class="pane" id="p-arch">
|
||
<div style="display:grid;grid-template-columns:2fr 1fr;gap:6px;margin-bottom:6px">
|
||
<div class="srv" style="border-color:var(--cy)">
|
||
<h4><span class="dot dot-g"></span>🖥️ HETZNER — 95.216.167.89 <small style="color:var(--t2)">(root:49222)</small></h4>
|
||
<div class="pg">
|
||
<div class="pi" onclick="window.open('http://95.216.167.89:5821')"><span class="pd" style="background:var(--gn)"></span>:5821 ADX</div>
|
||
<div class="pi" onclick="window.open('http://95.216.167.89:5821')"><span class="pd" style="background:var(--gn)"></span>:5890 Arsenal</div>
|
||
<div class="pi" onclick="window.open('http://95.216.167.89:5822')"><span class="pd" style="background:var(--gn)"></span>:5822 FMG</div>
|
||
<div class="pi"><span class="pd" style="background:var(--or)"></span>:5823 BCG</div>
|
||
<div class="pi" onclick="window.open('http://95.216.167.89:5824')"><span class="pd" style="background:var(--gn)"></span>:5824 DKIM</div>
|
||
<div class="pi" onclick="window.open('http://95.216.167.89:8080')"><span class="pd" style="background:var(--gn)"></span>:8080 N8N</div>
|
||
<div class="pi"><span class="pd" style="background:var(--gn)"></span>:5432 PG</div>
|
||
<div class="pi"><span class="pd" style="background:var(--gn)"></span>:11434 Ollama</div>
|
||
</div>
|
||
<div style="margin-top:5px;display:grid;grid-template-columns:1fr 1fr;gap:5px">
|
||
<div><div class="cl"><b>ADX :5821</b> → Java adxapp.jar + PHP views</div><div class="cl"><b>Arsenal :5890</b> → PHP APIs + HTML</div><div class="cl">ADX <b>ProxyPass /api/</b> → Arsenal:5890</div><div class="cl"><b>adx_system</b> (admin, 508 tables)</div></div>
|
||
<div><div class="cl">Apache2 + PG + PMTA + Ollama: <b>active</b></div><div class="cl">Disk: <span id="aD">—</span> | RAM: <span id="aR">—</span></div><div class="cl">Load: <span id="aL">—</span> | Up: <span id="aU">—</span></div><div class="cl">Sentinel: <span id="aS">—</span>% | KB: <span id="aKB">—</span></div></div>
|
||
</div>
|
||
</div>
|
||
<div class="srv">
|
||
<h4><span class="dot dot-g"></span>📡 OVH 151.80.235.110 <small style="color:var(--t2)">ubuntu:22</small></h4>
|
||
<div class="cl"><b>culturellemejean.charity</b> + <b>track.wevup.app</b></div>
|
||
<div class="cl">click.php, track.php, lead.php, optout.php</div>
|
||
<div class="cl">Nginx + PHP-FPM 7.4</div>
|
||
<div class="cl" style="color:var(--or)">help.php L206 (FIXED)</div>
|
||
</div>
|
||
</div>
|
||
<div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:6px;margin-bottom:6px">
|
||
<div class="srv"><h4>🏢 CONSULTING 46.62.220.135</h4><div class="cl">Apache 2.4.52 | 150G (5%) | 15.6G RAM</div></div>
|
||
<div class="srv"><h4>🗄️ DB admin tables</h4><div class="cl">brain_winners(10), hamid_*, office_accounts(1352), sentinel_*, sending_logs</div></div>
|
||
<div class="srv"><h4>🧠 Brain + HAMID</h4><div class="cl">10 configs | Cerebras, Groq, DeepSeek, Gemini, Claude, Hyperbolic, SambaNova, Ollama</div></div>
|
||
</div>
|
||
<div style="display:grid;grid-template-columns:1fr 1fr;gap:6px">
|
||
<div class="srv"><h3 style="font-size:10px;color:var(--cy);margin-bottom:4px">📄 ADX :5821</h3><div class="dg">
|
||
<div class="di"><div class="dt">Command</div><div class="dd">brain-combo, drilldown, scraping, send-data, data-mgr</div></div>
|
||
<div class="di"><div class="dt">Send</div><div class="dd">email-tester, bulk, test-send-tracking, orchestrator, semi-auto</div></div>
|
||
<div class="di"><div class="dt">O365</div><div class="dd">office365-mgr (1352), gsuite-mgr</div></div>
|
||
<div class="di"><div class="dt">Defense</div><div class="dd">reputation, blacklist, failover, warmup</div></div>
|
||
<div class="di"><div class="dt">Tracking</div><div class="dd">dashboard, deploy, manager, global, standalone</div></div>
|
||
<div class="di"><div class="dt">Brain IA</div><div class="dd">analyse, report, dashboard, bpms, config, monitor</div></div>
|
||
<div class="di"><div class="dt">HAMID</div><div class="dd">chat, fullscreen, claude, ssh, code, vision, voice</div></div>
|
||
</div></div>
|
||
<div class="srv"><h3 style="font-size:10px;color:var(--pk);margin-bottom:4px">🚀 Arsenal :5890</h3><div class="dg">
|
||
<div class="di"><div class="dt">Command</div><div class="dd">brain-combo, drilldown, scraping, send-data</div></div>
|
||
<div class="di"><div class="dt">Infra</div><div class="dd">cloud, cloudflare, dns, tracking(5), n8n</div></div>
|
||
<div class="di"><div class="dt">Send</div><div class="dd">unified-send, semi-auto, send-process, data-factory, predictive</div></div>
|
||
<div class="di"><div class="dt">Superviseurs</div><div class="dd">command-center, sentinel-v3, weval-mind-2.0, hamid-chef</div></div>
|
||
</div></div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- TRACKING -->
|
||
<div class="pane" id="p-tracking">
|
||
<div class="row r4">
|
||
<div class="card"><h3>Server</h3><div class="val" id="tS">—</div><div class="sub">OVH 151.80.235.110</div></div>
|
||
<div class="card"><h3>Domain</h3><div class="val" id="tD">—</div><div class="sub">culturellemejean.charity</div></div>
|
||
<div class="card"><h3>Nginx</h3><div class="val" id="tN">—</div></div>
|
||
<div class="card"><h3>PHP-FPM</h3><div class="val" id="tP">—</div></div>
|
||
</div>
|
||
<div class="tt"><h4>🧪 E2E Test <button id="btnE2E" style="background:var(--cy);border:none;color:var(--bg);padding:2px 8px;border-radius:3px;cursor:pointer;font-weight:700;font-size:8px">▶ RUN</button></h4><div id="tT"></div></div>
|
||
<div class="fl">
|
||
<div class="fs" style="border-color:var(--cy)"><b>📧</b>Send</div><span class="fa-arrow">→</span>
|
||
<div class="fs" style="border-color:var(--gn)"><b>📬</b>Inbox</div><span class="fa-arrow">→</span>
|
||
<div class="fs" style="border-color:var(--or)"><b>👁️</b>/op/</div><span class="fa-arrow">→</span>
|
||
<div class="fs" style="border-color:var(--pk)"><b>🖱️</b>/cl/</div><span class="fa-arrow">→</span>
|
||
<div class="fs" style="border-color:var(--pu)"><b>🔀</b>offer</div><span class="fa-arrow">→</span>
|
||
<div class="fs" style="border-color:var(--gn)"><b>🎯</b>LP</div><span class="fa-arrow">→</span>
|
||
<div class="fs" style="border-color:var(--cy)"><b>💰</b>lead</div>
|
||
</div>
|
||
<div class="row r2">
|
||
<div class="card"><h3>📂 OVH Files</h3><div class="sl"><b>/var/www/html/</b><br>index.php→tracking.php (router)<br>click.php redirect→offer<br>track.php log open/click<br>lead.php conversions<br>optout.php unsubscribe<br>.htaccess mod_rewrite<br><b>/var/www/scripts/</b> help.php L206 fixed</div></div>
|
||
<div class="card"><h3>🔧 Nginx</h3><div class="sl"><b>:80</b> /var/www/html + HTTPS redirect<br><b>:443</b> track.wevup.app + culturellemejean.charity<br>SSL Let's Encrypt | PHP-FPM 7.4 socket<br><b>Flow:</b> /cl/{hash} → index.php → tracking.php → redirect<br>/op/{hash} → 1px GIF</div></div>
|
||
</div>
|
||
<div class="card"><h3>📊 OVH Live</h3><div id="oLS" style="font-family:'JetBrains Mono',monospace;font-size:9px;white-space:pre-wrap">Run E2E test...</div></div>
|
||
</div>
|
||
|
||
<!-- SENTINEL -->
|
||
<div class="pane" id="p-sentinel">
|
||
<div class="row r4">
|
||
<div class="card"><h3>Score</h3><div class="val gn" id="sS">—</div></div>
|
||
<div class="card"><h3>Scans</h3><div class="val cy" id="sSc">—</div></div>
|
||
<div class="card"><h3>Fixes</h3><div class="val or" id="sF">—</div></div>
|
||
<div class="card"><h3>Patterns</h3><div class="val pu" id="sP">—</div></div>
|
||
</div>
|
||
<div class="row r2">
|
||
<div class="card"><h3>📜 Scan History</h3><div id="sH" style="font-size:9px;font-family:'JetBrains Mono',monospace;max-height:250px;overflow-y:auto">...</div></div>
|
||
<div class="card"><h3>🧠 Top Patterns</h3><div id="pL" style="font-size:9px;max-height:250px;overflow-y:auto">...</div></div>
|
||
</div>
|
||
<div class="card"><h3>🔧 Fix Timeline</h3><div id="fT" style="font-size:9px;font-family:'JetBrains Mono',monospace;max-height:180px;overflow-y:auto">...</div></div>
|
||
</div>
|
||
|
||
</div><!-- end main -->
|
||
|
||
<!-- CHAT PANEL -->
|
||
<div class="chat-panel">
|
||
<div class="chat-head">
|
||
<div class="ctg">
|
||
<div class="ct on" data-m="sentinel">🛡️ Sentinel</div>
|
||
<div class="ct" data-m="mind">🧠 Mind</div>
|
||
<div class="ct" data-m="hamid">💬 HAMID</div>
|
||
<div class="ct" data-m="chef">👑 Chef</div>
|
||
</div>
|
||
<span style="margin-left:auto;font-size:7px;color:var(--t2)" id="cP">—</span>
|
||
</div>
|
||
<div class="qb-row" id="qbRow"></div>
|
||
<div class="chat-msgs" id="chatMsgs"></div>
|
||
<div class="chi"><input id="cI" placeholder="Commande..."><button id="btnSend">→</button></div>
|
||
</div>
|
||
</div>
|
||
<script>
|
||
var SENT='/api/sentinel-brain.php';
|
||
var chatMode='sentinel';
|
||
var chatModes={
|
||
sentinel:{
|
||
welcome:'🛡️ Sentinel V4 — SSH réel, anti-hallucination actif\nRésultats authentiques uniquement\nCommandes: scan, fix, status, ports, exec [cmd]',
|
||
qb:[['🔍Scan','scan complet'],['🔧Fix','fix les problèmes'],['📊Status','status tous serveurs'],['📡Tracking','vérifie tracking OVH'],['🏢Consulting','vérifie consulting'],['🔌Ports','ports et services'],['🧪E2E','test e2e tracking'],['💾Resources','disk mémoire serveurs']]
|
||
},
|
||
mind:{
|
||
welcome:'🧠 Weval Mind 2.0 — Superviseur intelligent\nBrain: connecté ✅ | HAMID: connecté ✅\nDashboard: /weval-mind-dashboard-enhanced.html',
|
||
qb:[['🧠Brain','brain status'],['🩺Health','health check'],['🔍Diagnostic','diagnostic complet'],['🤖Providers','providers status']]
|
||
},
|
||
hamid:{
|
||
welcome:'💬 WEVAL IA — 12 providers (Cerebras primary)\nSpécialisé délivrabilité email\nOuvrir: /deliverads/hamid.php',
|
||
qb:[['🧠Brain ISP','analyse brain par ISP'],['📧Gmail','recommande config gmail'],['📧Outlook','meilleur config outlook'],['🎯Strategy','stratégie deliverability']]
|
||
},
|
||
chef:{
|
||
welcome:'👑 HAMID CHEF — IA Maîtresse / Chef Généraliste\nAgrège: Brain+Sentinel+Mind+O365+Tracking+KB\nVue globale système WEVADS | 12 providers | 10 winners | 1352 O365',
|
||
qb:[['📊Global','status global système'],['🎯Stratégie','recommandation stratégie ISP'],['🧠Brain+Track','analyse croisée Brain tracking'],['📧Warmup','plan warmup O365'],['🏗️Infra','diagnostic complet infrastructure'],['📬Inbox','optimise inbox gmail outlook']]
|
||
}
|
||
};
|
||
|
||
// Tab switching
|
||
document.querySelectorAll('.tab').forEach(function(t){
|
||
t.addEventListener('click',function(){
|
||
document.querySelectorAll('.pane').forEach(function(p){p.classList.remove('on')});
|
||
document.querySelectorAll('.tab').forEach(function(x){x.classList.remove('on')});
|
||
document.getElementById('p-'+t.dataset.p).classList.add('on');
|
||
t.classList.add('on');
|
||
});
|
||
});
|
||
|
||
// Chat mode switching
|
||
document.querySelectorAll('.ct').forEach(function(c){
|
||
c.addEventListener('click',function(){
|
||
chatMode=c.dataset.m;
|
||
document.querySelectorAll('.ct').forEach(function(x){x.classList.remove('on')});
|
||
c.classList.add('on');
|
||
var m=chatModes[chatMode];
|
||
document.getElementById('chatMsgs').innerHTML='<div class="msg s">'+m.welcome+'</div>';
|
||
var qh='';
|
||
m.qb.forEach(function(q){qh+='<div class="qb" data-q="'+q[1]+'">'+q[0]+'</div>';});
|
||
document.getElementById('qbRow').innerHTML=qh;
|
||
document.querySelectorAll('.qb').forEach(function(b){b.addEventListener('click',function(){document.getElementById('cI').value=b.dataset.q;sendChat();});});
|
||
});
|
||
});
|
||
|
||
// Init default mode
|
||
(function(){
|
||
var m=chatModes.sentinel;
|
||
document.getElementById('chatMsgs').innerHTML='<div class="msg s">'+m.welcome+'</div>';
|
||
var qh='';
|
||
m.qb.forEach(function(q){qh+='<div class="qb" data-q="'+q[1]+'">'+q[0]+'</div>';});
|
||
document.getElementById('qbRow').innerHTML=qh;
|
||
document.querySelectorAll('.qb').forEach(function(b){b.addEventListener('click',function(){document.getElementById('cI').value=b.dataset.q;sendChat();});});
|
||
})();
|
||
|
||
function addMsg(txt,cls,prov){
|
||
var d=document.createElement('div');d.className='msg '+cls;
|
||
d.textContent=txt;
|
||
if(prov){var p=document.createElement('div');p.className='pv';p.textContent='via '+prov;d.appendChild(p);}
|
||
document.getElementById('chatMsgs').appendChild(d);
|
||
d.scrollIntoView({behavior:'smooth'});
|
||
}
|
||
|
||
function sendChat(){
|
||
var inp=document.getElementById('cI');
|
||
var msg=inp.value.trim();
|
||
if(!msg)return;
|
||
inp.value='';
|
||
addMsg(msg,'u');
|
||
var loader=document.createElement('div');loader.className='msg s';loader.innerHTML='<span class="ld"></span> Exécution...';
|
||
document.getElementById('chatMsgs').appendChild(loader);
|
||
loader.scrollIntoView({behavior:'smooth'});
|
||
|
||
var endpoint,body,isGet=false;
|
||
if(chatMode==='hamid'){
|
||
endpoint='/api/hamid-engine.php';
|
||
body=new FormData();body.append('action','chat');body.append('message',msg);
|
||
} else if(chatMode==='chef'){
|
||
endpoint='/api/hamid-chef.php';
|
||
body=new FormData();body.append('message',msg);
|
||
} else if(chatMode==='mind'){
|
||
var act=msg.match(/brain|winner/i)?'brain':msg.match(/health|diag/i)?'diagnostic':'status';
|
||
endpoint='/api/weval-mind-core.php?action='+act;
|
||
isGet=true;
|
||
} else {
|
||
endpoint=SENT;
|
||
body=new FormData();body.append('action','chat');body.append('message',msg);
|
||
}
|
||
|
||
var opts=isGet?{}:{method:'POST',body:body};
|
||
fetch(endpoint,opts).then(function(r){return r.json()}).then(function(d){
|
||
loader.remove();
|
||
if(chatMode==='mind'){
|
||
document.getElementById('cP').textContent='Mind 2.0';
|
||
var t='🧠 '+d.message+'\n';
|
||
if(d.brain_connected!==undefined)t+='Brain: '+(d.brain_connected?'✅':'❌')+' | HAMID: '+(d.hamid_connected?'✅':'❌')+'\nProviders: '+d.providers_count+' | Winners: '+d.brain_winners;
|
||
if(d.data)t+='\nCycles: '+(d.data.cycles||'-')+' | Health: '+(d.data.health_score||'-')+'%\nInbox: '+(d.data.avg_inbox_rate||'-')+'% | Repairs: '+(d.data.repairs||'-');
|
||
if(d.brain){t+='\n\n🧠 Brain: '+d.brain.winners+' winners ('+d.brain.isps_covered+' ISPs)\nAvg Inbox: '+d.brain.avg_inbox_rate+'%';
|
||
if(d.brain.top_winners){d.brain.top_winners.forEach(function(w){t+='\n '+w.isp_target+': '+w.inbox_rate+'% (stab:'+w.stability_score+'%)';});}
|
||
}
|
||
addMsg(t,'s','Mind 2.0');
|
||
} else if(chatMode==='chef'){
|
||
document.getElementById('cP').textContent='Chef '+(d.provider||'');
|
||
addMsg(d.response||'—','s','Chef '+(d.provider||''));
|
||
} else if(chatMode==='hamid'){
|
||
document.getElementById('cP').textContent=d.provider||'HAMID';
|
||
addMsg(d.response||d.error||'—','s',d.provider);
|
||
} else {
|
||
document.getElementById('cP').textContent=d.provider||'—';
|
||
addMsg(d.response||'—','s',d.provider);
|
||
if(d.executed&&d.executed.length){
|
||
d.executed.forEach(function(e){
|
||
var sv=e.cmd.indexOf('[OVH]')===0?'📡OVH':e.cmd.indexOf('[HETZNER]')===0?'🖥️Hetzner':e.cmd.indexOf('[CONSULTING]')===0?'🏢Consulting':'💻';
|
||
addMsg(sv+' '+e.cmd+'\n'+(e.ok?'✅':'❌')+' '+e.output,'exec');
|
||
});
|
||
}
|
||
}
|
||
}).catch(function(err){loader.remove();addMsg('❌ '+err.message,'s');});
|
||
}
|
||
|
||
document.getElementById('btnSend').addEventListener('click',sendChat);
|
||
document.getElementById('cI').addEventListener('keydown',function(e){if(e.key==='Enter')sendChat();});
|
||
|
||
// E2E button
|
||
document.getElementById('btnE2E').addEventListener('click',runE2E);
|
||
|
||
function runE2E(){
|
||
var tests=[
|
||
{n:'Click /cl/',c:'curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1/cl/1_md/1/1/1/0/0'},
|
||
{n:'Open /op/ GIF',c:'curl -s -o /dev/null -w "%{http_code}|%{size_download}" http://127.0.0.1/op/1_md/1/1/1/0/0'},
|
||
{n:'track.php',c:'curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1/track.php'},
|
||
{n:'lead.php',c:'curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1/lead.php'},
|
||
{n:'optout.php',c:'curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1/optout.php'},
|
||
{n:'HTTPS domain',c:'curl -sLk -o /dev/null -w "%{http_code}" https://culturellemejean.charity/'},
|
||
{n:'Nginx',c:'sudo systemctl is-active nginx'},
|
||
{n:'PHP-FPM',c:'sudo systemctl is-active php7.4-fpm'}
|
||
];
|
||
var el=document.getElementById('tT');
|
||
el.innerHTML=tests.map(function(t){return '<div class="tr"><span class="tb wt">⏳</span>'+t.n+'</div>';}).join('');
|
||
tests.forEach(function(t,i){
|
||
fetch(SENT+'?action=exec_remote&server=ovh&cmd='+encodeURIComponent(t.c))
|
||
.then(function(r){return r.json()})
|
||
.then(function(r){
|
||
var o=(r.output||'').trim();var ok=r.ok&&(o.charAt(0)==='2'||o.charAt(0)==='3'||o==='active');
|
||
el.querySelectorAll('.tr')[i].innerHTML='<span class="tb '+(ok?'ok':'ko')+'">'+(ok?'✅':'❌')+'</span>'+t.n+' → <b>'+o+'</b>';
|
||
}).catch(function(){el.querySelectorAll('.tr')[i].innerHTML='<span class="tb ko">❌</span>'+t.n+' → ERR';});
|
||
});
|
||
// OVH live status
|
||
fetch(SENT+'?action=exec_remote&server=ovh&cmd='+encodeURIComponent('echo "UP:"; uptime; echo "DISK:"; df -h / | tail -1; echo "MEM:"; free -m|head -2; echo "NGINX:"; ps aux|grep nginx|grep -c worker; echo "FPM:"; ps aux|grep php-fpm|grep -c pool'))
|
||
.then(function(r){return r.json()}).then(function(r){document.getElementById('oLS').textContent=r.output||'—';});
|
||
}
|
||
|
||
// Load dashboard data
|
||
function loadAll(){
|
||
fetch(SENT+'?action=arch').then(function(r){return r.json()}).then(function(ar){
|
||
var db=ar.databases||{};var se=ar.sentinel||{};var ls=se.last_scan||{};var sy=ar.system||{};var sv=ar.services||{};
|
||
// Dashboard cards
|
||
document.getElementById('dS').textContent=(ls.score||'—')+'%';
|
||
document.getElementById('dSs').textContent='Last: '+(ls.scan_date||'—').substring(0,16);
|
||
document.getElementById('dF').textContent=ls.files_scanned||'—';
|
||
document.getElementById('dI').textContent=(ls.issues_found||'—')+'/'+(se.total_fixes||'—');
|
||
document.getElementById('dK').textContent=(db.sentinel_knowledge||'—')+'+'+(se.patterns_known||'—');
|
||
document.getElementById('dO').textContent=db.office_accounts||'—';
|
||
document.getElementById('dTn').textContent='176 tenants';
|
||
document.getElementById('dB').textContent=db.brain_winners||'—';
|
||
document.getElementById('dH').textContent=db.hamid_conversations||'—';
|
||
document.getElementById('dHs').textContent='12 providers actifs';
|
||
document.getElementById('dTr').textContent='ONLINE';
|
||
fetch('/api/profit-orchestrator.php?action=dashboard').then(r=>r.json()).then(d=>{if(d.today){document.getElementById('dProfit').textContent='EUR'+parseFloat(d.today.profit||0).toFixed(0);var cost=parseFloat(d.today.cost||0);document.getElementById('dRoas').textContent='ROAS: '+(cost>0?(parseFloat(d.today.revenue||0)/cost).toFixed(1)+'x':'---');}}).catch(function(){});
|
||
fetch('/api/ghost-network.php?action=status').then(r=>r.json()).then(d=>{document.getElementById('dProxy').textContent=d.residential||0;}).catch(function(){});
|
||
fetch('/api/auto-supply.php?action=status').then(r=>r.json()).then(d=>{var a=(d.alerts||[]).length;document.getElementById('dSupply').textContent=a>0?a+' alerts':'OK';document.getElementById('dAlerts').textContent=a+' stock alerts';}).catch(function(){});
|
||
fetch('/api/adversarial-sandbox.php?action=status').then(r=>r.json()).then(d=>{document.getElementById('dSandbox').textContent=d.tests_run||0;}).catch(function(){});
|
||
// Arch cards
|
||
document.getElementById('aD').textContent=sy.disk||'—';
|
||
document.getElementById('aR').textContent=sy.memory||'—';
|
||
document.getElementById('aL').textContent=(sy.load||'—').split(' ')[0];
|
||
document.getElementById('aU').textContent=(sy.uptime||'—').replace('up ','');
|
||
document.getElementById('aS').textContent=ls.score||'—';
|
||
document.getElementById('aKB').textContent=db.sentinel_knowledge||'—';
|
||
// Hetzner card
|
||
document.getElementById('hM').innerHTML='<b>Apache</b>: '+(sv.apache2||'?')+' | <b>PG</b>: '+(sv.postgresql||'?')+'<br><b>PMTA</b>: '+(sv.pmta||'?')+' | <b>Ollama</b>: '+(sv.ollama||'?')+'<br>Disk: '+(sy.disk||'?')+' | RAM: '+(sy.memory||'?');
|
||
// Sentinel tab
|
||
document.getElementById('sS').textContent=(ls.score||'—')+'%';
|
||
document.getElementById('sSc').textContent=se.total_scans||'—';
|
||
document.getElementById('sF').textContent=se.total_fixes||'—';
|
||
document.getElementById('sP').textContent=se.patterns_known||'—';
|
||
// Timestamp
|
||
document.getElementById('lu').textContent=new Date().toLocaleTimeString('fr-FR');
|
||
}).catch(function(e){console.error('arch:',e)});
|
||
|
||
// OVH remote
|
||
fetch(SENT+'?action=exec_remote&server=ovh&cmd='+encodeURIComponent('sudo systemctl is-active nginx php7.4-fpm; df -h / | tail -1; free -m | grep Mem'))
|
||
.then(function(r){return r.json()}).then(function(o){
|
||
if(o.ok){var l=(o.output||'').trim().split('\n');
|
||
document.getElementById('oM').innerHTML='<b>Nginx</b>: '+(l[0]||'?')+' | <b>FPM</b>: '+(l[1]||'?')+'<br>'+(l[2]||'');
|
||
document.getElementById('tN').innerHTML=l[0]==='active'?'<span class="gn">✅</span>':'<span class="rd">❌</span>';
|
||
document.getElementById('tP').innerHTML=l[1]==='active'?'<span class="gn">✅</span>':'<span class="rd">❌</span>';
|
||
document.getElementById('tS').innerHTML='<span class="gn">✅ UP</span>';
|
||
document.getElementById('tD').innerHTML='<span class="gn">✅</span>';
|
||
}
|
||
}).catch(function(){});
|
||
// Consulting remote
|
||
fetch(SENT+'?action=exec_remote&server=consulting&cmd='+encodeURIComponent('uptime; df -h / | tail -1'))
|
||
.then(function(r){return r.json()}).then(function(c){
|
||
if(c.ok)document.getElementById('cM').innerHTML=(c.output||'').replace(/\n/g,'<br>');
|
||
}).catch(function(){});
|
||
|
||
// History, fixes, patterns
|
||
fetch(SENT+'?action=history&limit=10').then(function(r){return r.json()}).then(function(h){
|
||
if(h.scans)document.getElementById('sH').innerHTML=h.scans.map(function(s){
|
||
return '<div style="padding:2px 0;border-bottom:1px solid var(--b)">'+(s.scan_date||'').substring(5,16)+' | '+s.files_scanned+'f | <span class="'+(parseFloat(s.score)>98?'gn':'or')+'">'+s.score+'%</span> | '+s.issues_found+'i '+s.fixes_applied+'fx</div>';
|
||
}).join('');
|
||
}).catch(function(){});
|
||
fetch(SENT+'?action=fixes&limit=25').then(function(r){return r.json()}).then(function(f){
|
||
if(f.fixes){
|
||
document.getElementById('fT').innerHTML=f.fixes.map(function(x){return '<div style="padding:2px 0;border-bottom:1px solid var(--b)"><span class="or">'+(x.issue_type||'fix')+'</span> '+x.file_path+' <span style="color:var(--t2)">'+(x.fix_date||'').substring(11,16)+'</span></div>';}).join('');
|
||
document.getElementById('rF').innerHTML=f.fixes.slice(0,5).map(function(x){return '<div style="padding:2px 0;border-bottom:1px solid var(--b)"><span style="color:var(--or)">'+(x.issue_type||'fix')+'</span> '+x.file_path+'</div>';}).join('');
|
||
}
|
||
}).catch(function(){});
|
||
fetch(SENT+'?action=patterns').then(function(r){return r.json()}).then(function(p){
|
||
if(p.patterns)document.getElementById('pL').innerHTML=p.patterns.map(function(x){return '<div style="padding:2px 0;border-bottom:1px solid var(--b)"><b>'+x.pattern_name+'</b> <small style="color:var(--t2)">'+(x.times_detected||0)+'x — '+(x.severity||'')+'</small></div>';}).join('');
|
||
}).catch(function(){});
|
||
}
|
||
|
||
loadAll();
|
||
setInterval(loadAll,60000);
|
||
</script>
|
||
<script src="arsenal-common.js?v1770778169">
|
||
</body></html>
|
||
</script>
|