Files
wevia-brain/tools/html-builder.php
2026-04-16 16:09:59 +02:00

171 lines
10 KiB
PHP
Executable File

<?php
/**
* HTML Builder - Genere la page cartographie exhaustive
* Invoque par le multi_agent orchestrator via tool html_builder
*/
$OUT_S204 = "/var/www/html/cartographie-screens.html";
$OUT_S95_ARS = "/tmp/cartographie-screens-s95.html";
// --- Collect les listes d'ecrans ---
$s204_html = shell_exec("ls /var/www/html/*.html 2>/dev/null | xargs -n1 basename | sort");
$s204_php = shell_exec("ls /var/www/html/*.php 2>/dev/null | xargs -n1 basename | sort");
$s95_ars = shell_exec("sudo ssh -p 49222 -o StrictHostKeyChecking=no -i /var/www/.ssh/wevads_key root@10.1.0.3 \"ls /opt/wevads-arsenal/public/*.html 2>/dev/null | xargs -n1 basename | sort\" 2>/dev/null");
$s95_wv = shell_exec("sudo ssh -p 49222 -o StrictHostKeyChecking=no -i /var/www/.ssh/wevads_key root@10.1.0.3 \"ls /var/www/html/*.html 2>/dev/null | xargs -n1 basename | sort\" 2>/dev/null");
$s204_html_arr = array_filter(explode("\n", trim($s204_html ?: "")));
$s204_php_arr = array_filter(explode("\n", trim($s204_php ?: "")));
$s95_ars_arr = array_filter(explode("\n", trim($s95_ars ?: "")));
$s95_wv_arr = array_filter(explode("\n", trim($s95_wv ?: "")));
$total = count($s204_html_arr) + count($s204_php_arr) + count($s95_ars_arr) + count($s95_wv_arr);
// --- Categorisation auto par prefix/keyword ---
function categorize($name) {
$n = strtolower($name);
if (preg_match('/^api[-_]|api\./', $n) || strpos($n, 'api') === 0) return 'API';
if (strpos($n, 'brain') !== false || strpos($n, 'hamid') !== false) return 'Brain/IA';
if (strpos($n, 'account') !== false || strpos($n, 'factory') !== false) return 'Accounts';
if (strpos($n, 'email') !== false || strpos($n, 'send') !== false || strpos($n, 'pmta') !== false || strpos($n, 'mta') !== false) return 'Email/Send';
if (strpos($n, 'scrap') !== false || strpos($n, 'scout') !== false || strpos($n, 'harvest') !== false) return 'Scraping';
if (strpos($n, 'dashboard') !== false || strpos($n, 'monitor') !== false || strpos($n, 'health') !== false) return 'Monitoring';
if (strpos($n, 'offer') !== false || strpos($n, 'affiliate') !== false || strpos($n, 'conversion') !== false) return 'Offers/Conv';
if (strpos($n, 'admin') !== false || strpos($n, 'config') !== false || strpos($n, 'setting') !== false) return 'Admin';
if (strpos($n, 'wevia') !== false) return 'WEVIA';
if (strpos($n, 'claude') !== false || strpos($n, 'opus') !== false) return 'Claude';
return 'Autres';
}
$all_items = [];
foreach ($s95_ars_arr as $f) $all_items[] = ['name'=>$f, 'server'=>'S95-Arsenal', 'url'=>'https://wevads.weval-consulting.com/'.$f, 'cat'=>categorize($f)];
foreach ($s95_wv_arr as $f) $all_items[] = ['name'=>$f, 'server'=>'S95-WEVADS', 'url'=>'https://wevads.weval-consulting.com/wv/'.$f, 'cat'=>categorize($f)];
foreach ($s204_html_arr as $f) $all_items[] = ['name'=>$f, 'server'=>'S204', 'url'=>'https://weval-consulting.com/'.$f, 'cat'=>categorize($f)];
foreach ($s204_php_arr as $f) $all_items[] = ['name'=>$f, 'server'=>'S204-PHP', 'url'=>'https://weval-consulting.com/'.$f, 'cat'=>categorize($f)];
// --- Stats ---
$stats = ['S95-Arsenal'=>count($s95_ars_arr), 'S95-WEVADS'=>count($s95_wv_arr), 'S204'=>count($s204_html_arr), 'S204-PHP'=>count($s204_php_arr)];
$cat_stats = [];
foreach ($all_items as $it) { $cat_stats[$it['cat']] = ($cat_stats[$it['cat']] ?? 0) + 1; }
arsort($cat_stats);
$items_json = json_encode($all_items, JSON_UNESCAPED_SLASHES);
$cat_json = json_encode($cat_stats);
$ts = date('Y-m-d H:i');
// --- HTML ---
$html = <<<HTML
<!DOCTYPE html>
<html lang="fr"><head>
<meta charset="UTF-8"><title>WEVADS Cartographie Exhaustive Ecrans - $total</title>
<style>
*{box-sizing:border-box;margin:0;padding:0}
body{font-family:-apple-system,Segoe UI,Roboto,sans-serif;background:#0a0e27;color:#e4e6eb;padding:20px;line-height:1.5}
.header{background:linear-gradient(135deg,#1a1f4e,#2d1b5e);padding:24px;border-radius:12px;margin-bottom:24px;border:1px solid #3d4476}
h1{font-size:28px;margin-bottom:8px;color:#64ffda}
.subtitle{color:#8892b0;font-size:14px}
.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:12px;margin-bottom:20px}
.stat-card{background:#141931;padding:16px;border-radius:8px;border:1px solid #2a3061;text-align:center}
.stat-value{font-size:26px;font-weight:700;color:#64ffda}
.stat-label{font-size:12px;color:#8892b0;margin-top:4px;text-transform:uppercase;letter-spacing:.5px}
.controls{background:#141931;padding:16px;border-radius:8px;margin-bottom:16px;display:flex;gap:12px;flex-wrap:wrap;align-items:center;border:1px solid #2a3061}
#search{flex:1;min-width:240px;padding:10px 14px;border:1px solid #3d4476;background:#0a0e27;color:#fff;border-radius:6px;font-size:14px}
#search:focus{outline:none;border-color:#64ffda}
select{padding:10px;background:#0a0e27;color:#fff;border:1px solid #3d4476;border-radius:6px;cursor:pointer}
.cat-tabs{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:16px}
.cat-tab{padding:6px 12px;background:#141931;border:1px solid #2a3061;border-radius:20px;cursor:pointer;font-size:12px;color:#8892b0;transition:all .15s}
.cat-tab:hover{border-color:#64ffda;color:#e4e6eb}
.cat-tab.active{background:#64ffda;color:#0a0e27;border-color:#64ffda;font-weight:600}
.count-bar{color:#8892b0;font-size:13px;margin-bottom:12px}
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:10px}
.item{background:#141931;padding:12px;border-radius:6px;border:1px solid #2a3061;text-decoration:none;color:inherit;transition:all .15s;display:block;font-size:13px}
.item:hover{border-color:#64ffda;background:#1a2045;transform:translateY(-1px)}
.item-name{font-weight:600;color:#e4e6eb;margin-bottom:4px;word-break:break-all}
.item-meta{display:flex;gap:8px;font-size:11px;color:#8892b0}
.badge{padding:2px 8px;border-radius:10px;font-size:10px;text-transform:uppercase;letter-spacing:.5px}
.srv-S95-Arsenal{background:#1e3a5f;color:#79c0ff}
.srv-S95-WEVADS{background:#3a1e5f;color:#d79eff}
.srv-S204{background:#5f3a1e;color:#ffc879}
.srv-S204-PHP{background:#5f1e3a;color:#ff79c0}
.footer{margin-top:32px;padding:16px;background:#141931;border-radius:8px;font-size:12px;color:#8892b0;text-align:center;border:1px solid #2a3061}
</style>
</head><body>
<div class="header">
<h1>🗺️ WEVADS Cartographie Exhaustive Ecrans</h1>
<div class="subtitle">$total ecrans total reperes sur 2 serveurs applicatifs | Genere le $ts | WEVIAMaster multiagent</div>
</div>
<div class="stats">
<div class="stat-card"><div class="stat-value">$total</div><div class="stat-label">Total ecrans</div></div>
<div class="stat-card"><div class="stat-value">{$stats['S95-Arsenal']}</div><div class="stat-label">S95 Arsenal</div></div>
<div class="stat-card"><div class="stat-value">{$stats['S95-WEVADS']}</div><div class="stat-label">S95 WEVADS</div></div>
<div class="stat-card"><div class="stat-value">{$stats['S204']}</div><div class="stat-label">S204 HTML</div></div>
<div class="stat-card"><div class="stat-value">{$stats['S204-PHP']}</div><div class="stat-label">S204 PHP</div></div>
</div>
<div class="controls">
<input id="search" placeholder="🔍 Rechercher par nom d'ecran..." autofocus>
<select id="srv"><option value="">Tous serveurs</option><option>S95-Arsenal</option><option>S95-WEVADS</option><option>S204</option><option>S204-PHP</option></select>
</div>
<div class="cat-tabs" id="cat-tabs"></div>
<div class="count-bar" id="count-bar"></div>
<div class="grid" id="grid"></div>
<div class="footer">WEVADS — WEVIAMaster autonomous orchestrator — Infrastructure: S204 + S95 (Hetzner) — Regenere via agent html_builder</div>
<script>
const DATA = $items_json;
const CATS = $cat_json;
let curCat = "";
const grid = document.getElementById("grid");
const countBar = document.getElementById("count-bar");
const search = document.getElementById("search");
const srv = document.getElementById("srv");
const tabs = document.getElementById("cat-tabs");
// Category tabs
const catEntries = [["",DATA.length]].concat(Object.entries(CATS));
tabs.innerHTML = catEntries.map(([c,n])=>{
const lab = c || "Toutes";
return `<div class="cat-tab \${c===curCat?'active':''}" data-cat="\${c}">\${lab} (\${n})</div>`;
}).join("");
tabs.addEventListener("click", e=>{
if(!e.target.classList.contains("cat-tab")) return;
curCat = e.target.dataset.cat;
[...tabs.children].forEach(t=>t.classList.toggle("active", t.dataset.cat===curCat));
render();
});
function render(){
const q = search.value.toLowerCase().trim();
const s = srv.value;
const filtered = DATA.filter(it=>{
if(curCat && it.cat!==curCat) return false;
if(s && it.server!==s) return false;
if(q && !it.name.toLowerCase().includes(q)) return false;
return true;
});
countBar.textContent = `\${filtered.length} ecrans affiches (sur \${DATA.length})`;
grid.innerHTML = filtered.slice(0, 500).map(it=>`
<a class="item" href="\${it.url}" target="_blank" rel="noopener">
<div class="item-name">\${it.name}</div>
<div class="item-meta"><span class="badge srv-\${it.server}">\${it.server}</span><span>\${it.cat}</span></div>
</a>
`).join("") + (filtered.length > 500 ? `<div style="grid-column:1/-1;text-align:center;color:#8892b0;padding:16px">... \${filtered.length - 500} autres ecrans (affinez la recherche)</div>` : "");
}
search.addEventListener("input", render);
srv.addEventListener("change", render);
render();
</script>
</body></html>
HTML;
// Write files
file_put_contents($OUT_S204, $html);
// Push to S95 Arsenal
$b64 = base64_encode($html);
$cmd = "echo '$b64' | base64 -d > /opt/wevads-arsenal/public/cartographie-screens.html && ls -la /opt/wevads-arsenal/public/cartographie-screens.html";
$cmd_escaped = escapeshellarg($cmd);
$s95_out = shell_exec("sudo ssh -p 49222 -o StrictHostKeyChecking=no -i /var/www/.ssh/wevads_key root@10.1.0.3 $cmd_escaped 2>&1 | tail -3");
echo "CARTO_BUILT total=$total s204_file=$OUT_S204 size=" . filesize($OUT_S204) . "\n";
echo "S95_DEPLOY: " . trim($s95_out ?: "(no output)") . "\n";
echo "URL_S204: https://weval-consulting.com/cartographie-screens.html\n";
echo "URL_S95: https://wevads.weval-consulting.com/cartographie-screens.html\n";