Files
html/dormant-dashboard.html

226 lines
23 KiB
HTML

<!DOCTYPE html>
<html lang="fr"><head>
<meta charset="UTF-8"><title>Dormant Capabilities · NO-DORMANT</title>
<style>
body{font-family:-apple-system,sans-serif;background:#0a0e27;color:#e4e8f7;margin:0;padding:24px}
h1{color:#6ba3ff;border-bottom:2px solid #1e3a8a;padding-bottom:8px}
h2{color:#c084fc;margin-top:24px}
.card{background:#141933;border:1px solid #263161;border-radius:8px;padding:16px;margin:12px 0}
.flex{display:flex;gap:16px;flex-wrap:wrap}.flex>div{flex:1;min-width:180px;text-align:center}
.num{font-size:28px;font-weight:bold;color:#6ba3ff}.lbl{color:#9ca8d3;font-size:12px;text-transform:uppercase}
table{width:100%;border-collapse:collapse}th,td{padding:8px 12px;border-bottom:1px solid #263161;text-align:left;font-size:13px}
th{background:#1e2549;color:#9ca8d3;font-size:11px;text-transform:uppercase}
.badge{padding:2px 8px;border-radius:4px;font-size:10px;font-weight:bold}
.dormant{background:#ef4444;color:#fff}.active{background:#10b981;color:#fff}.warn{background:#f59e0b;color:#fff}
a{color:#6ba3ff;text-decoration:none}a:hover{text-decoration:underline}
.loading{color:#9ca8d3;text-align:center;padding:20px}
.action{background:#1e3a8a;color:#fff;border:0;padding:4px 10px;border-radius:4px;cursor:pointer;font-size:11px}
.action:hover{background:#2950a7}
</style></head>
<body>
<h1>🛌 Dormant Capabilities · NO-DORMANT Doctrine</h1>
<p>Scan de tout ce qui dort sur la plateforme : open-source clones, services, containers stopped, tools non-utilisés. Doctrine nouvelle : <strong>ne rien laisser dormant</strong>.</p>
<h2>📊 Stats live</h2>
<div class="flex">
<div class="card"><div class="num" id="oss_total"></div><div class="lbl">OSS clones /opt</div></div>
<div class="card"><div class="num" id="oss_dormant"></div><div class="lbl">Dormants (>60j)</div></div>
<div class="card"><div class="num" id="svc_dormant"></div><div class="lbl">Services inactive</div></div>
<div class="card"><div class="num" id="docker_stopped"></div><div class="lbl">Docker stopped</div></div>
<div class="card"><div class="num" id="opt_size"></div><div class="lbl">/opt total</div></div>
</div>
<h2>🛌 Open-source clones dormants (>60 jours)</h2>
<div class="card" id="oss_list"><div class="loading">Chargement…</div></div>
<h2>🛌 Tous les OSS clones (actifs et dormants)</h2>
<div class="card" id="oss_all"><div class="loading">Chargement…</div></div>
<h2>🔧 Services inactive détectés</h2>
<div class="card" id="svc_list"><div class="loading">Chargement…</div></div>
<h2>📌 Actions suggérées</h2>
<div class="card">
<ul>
<li><strong>claw-code (1.2 GB, 2.5 ans)</strong> → Supprimer ou wake-up via <code>systemctl start claw-code.service</code></li>
<li><strong>aios (30M, 5 mois)</strong> → Évaluer intégration ou archiver</li>
<li><strong>keyhacks (480K, 1.9 ans)</strong> → Outil sécurité — intégrer dans audit sec ou archive</li>
<li><strong>deepagent (13M, 3 mois)</strong> → Voir si skills pertinents pour Paperclip</li>
<li>Créer cron hebdo <code>/opt/weval-ops/dormant-audit.sh</code> qui alerte si nouveau dormant</li>
</ul>
</div>
<h2>🔗 Liens</h2>
<div class="card">
<ul>
<li><a href="/api/dormant-scan.php" target="_blank">API JSON dormant-scan</a></li>
<li><a href="/doctrine-53.html">Doctrine 53 (parent)</a></li>
<li><a href="/wevia-ops-hub.html">Ops Hub</a></li>
<li><a href="/faq-knowledge-base.html">FAQ KB unifiée</a></li>
</ul>
</div>
<script>
fetch('/api/dormant-scan.php').then(r=>r.json()).then(d=>{
document.getElementById('oss_total').textContent = d.oss_total || '?';
document.getElementById('oss_dormant').textContent = d.oss_dormant || '0';
document.getElementById('svc_dormant').textContent = (d.services_dormant||[]).length;
document.getElementById('docker_stopped').textContent = (d.docker_stopped||[]).length;
document.getElementById('opt_size').textContent = d.opt_total_size || '?';
// OSS dormant only
const dormant = (d.oss_samples||[]).filter(o => o.dormant);
const dl = document.getElementById('oss_list');
if (dormant.length) {
dl.innerHTML = '<table><tr><th>Path</th><th>GitHub</th><th>Size</th><th>Age</th><th>Action</th></tr>'+
dormant.map(o => `<tr>
<td><code>${o.path}</code></td>
<td><a href="https://${o.remote.replace(':','/')}" target="_blank">${o.remote.split('/').slice(-2).join('/')}</a></td>
<td>${o.size}</td>
<td><span class="badge dormant">${o.age_days}j</span></td>
<td><button class="action" onclick="alert('TODO: wake ou archive '+${JSON.stringify(o.path)})">Réveiller</button></td>
</tr>`).join('')+'</table>';
} else dl.innerHTML = '<div class="loading">Aucun dormant (>60j)</div>';
// All OSS
const all = (d.oss_samples||[]);
const al = document.getElementById('oss_all');
al.innerHTML = '<table><tr><th>Path</th><th>Size</th><th>Age</th><th>Statut</th></tr>'+
all.map(o => `<tr>
<td><code>${o.path.split('/').filter(x=>x).pop()}</code></td>
<td>${o.size}</td>
<td>${o.age_days}j</td>
<td>${o.dormant? '<span class="badge dormant">DORMANT</span>':'<span class="badge active">ACTIF</span>'}</td>
</tr>`).join('')+'</table>';
// Services
const sl = document.getElementById('svc_list');
const svcs = d.services_dormant||[];
if (svcs.length) {
sl.innerHTML = '<table><tr><th>Service</th><th>État</th></tr>'+
svcs.map(s => `<tr><td><code>${s}</code></td><td><span class="badge warn">inactive</span></td></tr>`).join('')+'</table>';
} else sl.innerHTML = '<div class="loading">Aucun service inactive pertinent</div>';
}).catch(e=>console.error(e));
</script>
<!-- OPUS_ENRICH_158_17AVR -->
<h2>Dormant WEVIA_IA — 125 fichiers (NOT LOADED by main API)</h2>
<div class="card"><table>
<thead><tr><th>File</th><th>Size</th><th>Role</th><th>Status</th></tr></thead>
<tbody><tr><td>WEVAL-providers-config.php</td><td>9824B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>all-screens.php</td><td>2745B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>consensus-class.php</td><td>6034B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>consensus-engine.php</td><td>6344B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>consensus-local.php</td><td>2652B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>cyber-api-fix.php</td><td>1248B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>gpu-test-direct.php</td><td>978B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>gpu-test.php</td><td>675B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>kb-global.php</td><td>10536B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>leads-capture.php</td><td>1656B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>mailstream-proxy.php</td><td>1832B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>mermaid-render.php</td><td>1646B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>nexus-api.php</td><td>7258B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>nexus-core.php</td><td>3568B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>nexus-dashboard-api.php</td><td>6854B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>nexus-ultimate.php</td><td>9535B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>office-admin-secure.php</td><td>11293B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>office-portal.php</td><td>2283B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>redis-cache.php</td><td>1256B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>sentinel-engine.php</td><td>9762B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>sentinel-v5.php</td><td>7259B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>sentinel-vault-controller.php</td><td>8756B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>sentinel-vault.php</td><td>6246B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>track.php</td><td>2549B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>visitor-tracker.php</td><td>4462B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>visual-brain.php</td><td>27542B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>weval-analytics-collect.php</td><td>997B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>weval-analytics-dashboard.php</td><td>4641B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>weval-chat-public.php</td><td>661B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>weval-chatbot-api-old.php</td><td>16614B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>weval-chatbot-wrapper.php</td><td>2149B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>weval-ia-relay.php</td><td>6205B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>weval-think-api.php</td><td>8724B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>wevia-admin-conversations.php</td><td>34236B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>wevia-admin.php</td><td>29345B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>wevia-agent.php</td><td>638B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>wevia-api-backup-23fev.php</td><td>5615B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>wevia-api-public.php</td><td>1069B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>wevia-api-v2-backup.php</td><td>11273B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>wevia-api.php</td><td>59316B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>wevia-architecture-doc.php</td><td>19054B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>wevia-arsenal-bridge.php</td><td>6765B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>wevia-artifact.php</td><td>3289B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>wevia-audit-logger.php</td><td>4384B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>wevia-auth.php</td><td>2064B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>wevia-backoffice.php</td><td>86530B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>wevia-benchmark.php</td><td>14101B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>wevia-bitvise.php</td><td>2096B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>wevia-brain-config.php</td><td>58305B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>wevia-brain-monitor.php</td><td>48078B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>wevia-bridge.php</td><td>2061B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>wevia-browser-act.php</td><td>5972B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>wevia-calendar.php</td><td>1691B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>wevia-canvas.php</td><td>14187B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>wevia-charts.php</td><td>709B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>wevia-claude.php</td><td>50993B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>wevia-cli.php</td><td>28910B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>wevia-code-exec.php</td><td>4665B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>wevia-code-ui.php</td><td>9914B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr><tr><td>wevia-code.php</td><td>1122B</td><td></td><td><span class='badge dormant'>dormant</span></td></tr></tbody>
</table></div>
<h2>S89 AI APIs — 33 fichiers (WEVADS archived)</h2>
<div class="card"><table>
<thead><tr><th>File</th><th>Size</th><th>Role</th><th>Status</th></tr></thead>
<tbody><tr><td>ai-bridge.php</td><td>892B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>ai-copywriter.php</td><td>8988B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>ai-discovery-api.php</td><td>10043B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>ai-failsafe.php</td><td>2160B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>ai-rotation.php</td><td>15216B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>brain-action.php</td><td>1804B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>brain-analyze.php</td><td>11759B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>brain-autofix.php</td><td>18248B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>brain-automation.php</td><td>98B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>brain-combo.php</td><td>1043B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>brain-config-inject.php</td><td>3228B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>brain-connector.php</td><td>11031B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>brain-core.php</td><td>10911B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>brain-creative-engine.php</td><td>25427B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>brain-creative-optimizer.php</td><td>5740B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>brain-engine.php</td><td>19793B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>brain-graph-api.php</td><td>617B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>brain-inject-api.php</td><td>1822B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>brain-nucleus.php</td><td>57500B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>brain-orchestrator.php</td><td>50996B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>brain-pmta-send.php</td><td>651B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>brain-productive.php</td><td>24283B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>brain-send-api.php</td><td>651B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>brain-send.php</td><td>651B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>brain-smart-send.php</td><td>651B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>brain-tracking-seeds.php</td><td>651B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>brain-trainer.php</td><td>7777B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>brain-unified-send.php</td><td>39983B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>kb-ingestor.php</td><td>20643B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>kb-ssr-generator.php</td><td>15004B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>kb-sync-cron.php</td><td>3193B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>kb-sync-monitor.php</td><td>6190B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr><tr><td>sentinel-brain.php</td><td>12142B</td><td>WEVADS brain engine</td><td><span class='badge warn'>s89</span></td></tr></tbody>
</table></div>
<h2>Top-IA Scripts — 42 scripts</h2>
<div class="card">
<p><code>/opt/weval-ops/top-ia/</code> — 37 wired, 5 à évaluer</p>
<p>Via chat: "proactive scan", "self heal", "self heal infra", "deep search", "memory recall", "memory store", "benchmark providers", "sync tout", "sentiment", "dialectical", "cot tree", "few shot", "finetune prep", "webhook send", "speculative decode"</p>
</div>
<h2>Guards Early-Priority — Doctrines 54-56 (10 guards)</h2>
<div class="card"><table>
<thead><tr><th>Guard</th><th>Trigger</th><th>Action</th></tr></thead>
<tbody>
<tr><td>sql_exec_real</td><td>SELECT/FROM</td><td>psql S95 direct</td></tr>
<tr><td>git_commit_real</td><td>commit fichier X.ext</td><td>git add + commit</td></tr>
<tr><td>crm_diagnostic_real</td><td>pipeline CRM vide</td><td>deals/stages query</td></tr>
<tr><td>count_business_real</td><td>combien/nombre X</td><td>SQL entity map (16 tables)</td></tr>
<tr><td>crons_diagnostic_real</td><td>crons import</td><td>crontabs grep</td></tr>
<tr><td>sovereign_diagnostic</td><td>sovereign timeout</td><td>curl :4000 health</td></tr>
<tr><td>auto_wire_ack</td><td>tu as halluciné</td><td>ACK fix</td></tr>
<tr><td>memory_op_real</td><td>memory recall/store</td><td>Qdrant exec</td></tr>
<tr><td>self_heal_infra_real</td><td>self heal infra</td><td>FPM/Docker/Svc fix</td></tr>
<tr><td>dormant_capabilities_list</td><td>dormant capabilities</td><td>archive reader</td></tr>
</tbody></table></div>
<h2>OSS Clones — 35 repos /opt/ (6 dormants identifiés)</h2>
<div class="card">
<p>Dormants : claw-code (1.2GB 2.5ans), aios, claude-mem, deepagent, keyhacks, rnd-swarm</p>
<p>Actifs : wevia-brain, deer-flow, librechat, open-webui-fresh, anythingllm, deepagent, vllm, HolyClaude, SuperClaude_Framework, skillsmith, huggingface-skills</p>
</div>
<h2>Session Opus 17 avril 2026 — 47+ commits</h2>
<div class="card">
<ul>
<li><strong>Doctrine 54</strong> : OPUS_ROOT_CAUSE_GUARDS_EARLY (anti-hallucination)</li>
<li><strong>Doctrine 55</strong> : CRM STALENESS (send_contacts_merge stoppé 2026-02-19)</li>
<li><strong>Doctrine 56</strong> : NO-DORMANT (158 capabilities accessibles)</li>
</ul>
<p>NonReg 153/153, L99 308/308, Zero régression. Tous pushés GitHub + Gitea auto-sync.</p>
</div>
<h2>📦 Archive DORMANT-CAPABILITIES (S88 cancel)</h2>
<div class="card">
<p>Capabilities archivées le 2026-03-16 avec raison documentée : "S88 cancel - archiving dormant capabilities for future use". <strong>Conforme doctrine 56 : dormant autorisé SI raison perf/inutilité documentée.</strong></p>
<div id="archive_table" class="loading">Chargement…</div>
<p><a href="/api/dormant-archive-api.php" target="_blank">API archive JSON</a></p>
</div>
<script>
fetch('/api/dormant-archive-api.php').then(r=>r.json()).then(d=>{
if (d.error) { document.getElementById('archive_table').innerHTML = '<div class="loading">Archive indisponible: '+d.error+'</div>'; return; }
const cats = d.categories || {};
let html = '<table><tr><th>Catégorie</th><th>Files</th><th>Location</th><th>Statut</th></tr>';
for (const [cat, info] of Object.entries(cats)) {
html += `<tr><td><code>${cat}</code></td><td>${info.count}</td><td><code>${info.location}</code></td><td><span class="badge warn">${info.status}</span></td></tr>`;
}
html += `<tr><td colspan=4><strong>Total archivé:</strong> ${d.total_files} fichiers · archive datée ${d.date}</td></tr>`;
html += '</table>';
document.getElementById('archive_table').innerHTML = html;
});
</script>
<!-- OPUS_LIVE_WIDGET_17AVR_04AM -->
<h2>📊 Live Business Volumes (auto-refresh toutes 30s)</h2>
<div class="card">
<div class="flex" id="live-stats">
<div><div class="num" id="lv-hcps">-</div><div class="lbl">Ethica HCPs</div></div>
<div><div class="num" id="lv-office">-</div><div class="lbl">Office Accts</div></div>
<div><div class="num" id="lv-deals">-</div><div class="lbl">Pipeline Deals</div></div>
<div><div class="num" id="lv-contacts">-</div><div class="lbl">CRM Contacts</div></div>
<div><div class="num" id="lv-leads">-</div><div class="lbl">Leads</div></div>
<div><div class="num" id="lv-inbox">-</div><div class="lbl">Inbox Accts</div></div>
</div>
</div>
<h2>🔌 Integration Points (Doctrine 58)</h2>
<div class="card"><table>
<thead><tr><th>Type</th><th>Endpoint</th><th>Usage</th></tr></thead>
<tbody>
<tr><td>NL chat</td><td><code>/api/wevia-master-api.php</code></td><td>POST message, 15 guards exec réel</td></tr>
<tr><td>REST stats</td><td><code>/api/nonreg-api.php?cat=all</code></td><td>NonReg 153/153</td></tr>
<tr><td>REST L99</td><td><code>/api/l99-api.php?action=stats</code></td><td>308/308 score=100</td></tr>
<tr><td>REST CRM audit</td><td><code>/api/crm-audit-live.php</code></td><td>0 fake data</td></tr>
<tr><td>REST Office</td><td><code>/api/office-admins.php?action=status</code></td><td>Live 6403/3828/118</td></tr>
<tr><td>REST Ethica</td><td><code>/api/ethica-stats-api.php</code></td><td>146694 HCPs</td></tr>
<tr><td>Shell CX</td><td>POST <code>/api/cx</code> k=WEVADS2026</td><td>Shell exec autonomous</td></tr>
<tr><td>Sentinel S95</td><td><code>http://10.1.0.3:5890/api/sentinel-brain.php</code></td><td>Shell S95 via Wireguard</td></tr>
<tr><td>Webhook MM</td><td>Mattermost hook <code>pt54hz...</code></td><td>Alerts deerflow</td></tr>
<tr><td>n8n workflows</td><td><code>n8n.weval-consulting.com</code></td><td>5 workflows actifs</td></tr>
</tbody></table></div>
<script>
async function refreshLive() {
try {
const crm = await fetch('/api/crm-audit-live.php').then(r => r.json()).catch(() => ({}));
const office = await fetch('/api/office-admins.php?action=status').then(r => r.json()).catch(() => ({}));
document.getElementById('lv-hcps').textContent = (crm.ethica_hcps || '-').toLocaleString();
document.getElementById('lv-office').textContent = (office.total || '-').toLocaleString();
document.getElementById('lv-deals').textContent = crm.twenty_deals ?? '-';
document.getElementById('lv-contacts').textContent = (crm.crm_contacts || '-').toLocaleString();
document.getElementById('lv-leads').textContent = '-';
document.getElementById('lv-inbox').textContent = (crm.inbox_accounts || '-').toLocaleString();
} catch(e) { console.warn('live refresh error', e); }
}
refreshLive();
setInterval(refreshLive, 30000);
</script>
</body></html>