Files
wevads-platform/public/command-center.html

561 lines
44 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. 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 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>