Files
html/dormant-dashboard.html
opus e30ddf5007
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
auto-sync via WEVIA git_sync_all intent 2026-04-20T13:11:38+02:00
2026-04-20 13:11:38 +02:00

357 lines
29 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="wakeOss('${o.path}','${o.remote}')">Réveiller</button><button class="action" style="background:#7c3aed" onclick="archiveOss('${o.path}')">Archiver</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>151709 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);
async function wakeOss(path, remote) {
if (!confirm('Réveiller ' + path + ' ?\n(pull upstream + notify chat)')) return;
const r = await fetch('/api/wevia-master-api.php', {method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify({message:'wake oss ' + path, user:'yacine'})});
const d = await r.json();
alert('Wake result: ' + JSON.stringify(d).slice(0, 300));
location.reload();
}
async function archiveOss(path) {
if (!confirm('Archiver ' + path + ' ?\n(stop + disable + marker, pas suppression)')) return;
const r = await fetch('/api/wevia-master-api.php', {method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify({message:'archive passive ' + path, user:'yacine'})});
const d = await r.json();
alert('Archive result: ' + JSON.stringify(d).slice(0, 300));
location.reload();
}
</script>
<!-- === OPUS UNIVERSAL DRILL-DOWN v1 19avr — append-only, doctrine #14 === -->
<script>
(function(){
if (window.__opusUniversalDrill) return; window.__opusUniversalDrill = true;
var d = document;
var m = d.createElement('div');
m.id = 'opus-udrill';
m.style.cssText = 'position:fixed;inset:0;background:rgba(0,0,0,0.82);backdrop-filter:blur(6px);display:none;align-items:center;justify-content:center;z-index:99995;padding:20px;cursor:pointer';
var inner = d.createElement('div');
inner.id = 'opus-udrill-in';
inner.style.cssText = 'max-width:900px;width:100%;max-height:90vh;overflow:auto;background:#0b0d15;border:1px solid rgba(99,102,241,0.35);border-radius:14px;padding:28px;cursor:default;box-shadow:0 20px 60px rgba(0,0,0,0.6);color:#e2e8f0;font:14px/1.55 Inter,system-ui,sans-serif';
inner.addEventListener('click', function(e){ e.stopPropagation(); });
m.appendChild(inner);
m.addEventListener('click', function(){ m.style.display='none'; });
d.addEventListener('keydown', function(e){ if(e.key==='Escape') m.style.display='none'; });
(d.body || d.documentElement).appendChild(m);
function openCard(card) {
// Clone card content + show close btn + increase font-size
var html = '<div style="display:flex;justify-content:flex-end;margin-bottom:14px"><button id="opus-udrill-close" style="padding:6px 14px;background:#171b2a;border:1px solid rgba(99,102,241,0.25);color:#e2e8f0;border-radius:8px;cursor:pointer;font-size:12px">✕ Fermer (Esc)</button></div>';
html += '<div style="transform-origin:top left;font-size:1.05em">' + card.outerHTML + '</div>';
inner.innerHTML = html;
d.getElementById('opus-udrill-close').onclick = function(){ m.style.display='none'; };
m.style.display = 'flex';
}
function wire(root) {
var sels = '.card,[class*="card"],.kpi,[class*="kpi"],.stat,[class*="stat"],.tile,[class*="tile"],.metric,[class*="metric"],.widget,[class*="widget"]';
var cards = root.querySelectorAll(sels);
for (var i = 0; i < cards.length; i++) {
var c = cards[i];
if (c.__opusWired) continue;
if (c.closest('button, a, input, select, textarea, #opus-udrill')) continue;
var r = c.getBoundingClientRect();
if (r.width < 60 || r.height < 40) continue;
c.__opusWired = true;
c.style.cursor = 'pointer';
c.setAttribute('role','button');
c.setAttribute('tabindex','0');
c.addEventListener('click', function(ev){
// If a more-specific drill is already active (e.g. pp-card custom), let it handle
if (ev.target.closest('[data-pp-id]') && window.__opusDrillInit) return;
if (ev.target.closest('a,button,input,select')) return;
ev.preventDefault(); ev.stopPropagation();
openCard(this);
});
c.addEventListener('keydown', function(ev){ if(ev.key==='Enter'||ev.key===' '){ev.preventDefault();openCard(this);} });
}
}
// Initial + mutation observer
var initRun = function(){ wire(d.body || d.documentElement); };
if (d.readyState === 'loading') d.addEventListener('DOMContentLoaded', initRun);
else initRun();
var mo = new MutationObserver(function(muts){
var newCard = false;
for (var i=0;i<muts.length;i++) if (muts[i].addedNodes.length) { newCard = true; break; }
if (newCard) initRun();
});
mo.observe(d.body || d.documentElement, {childList:true, subtree:true});
})();
</script>
<!-- === OPUS UNIVERSAL DRILL-DOWN END === -->
<!-- === OPUS HONEST NR/L99 OVERLAY v1 19avr - append-only doctrine #14 === -->
<script>
(function(){
if (window.__opusHonestOverlay) return; window.__opusHonestOverlay = true;
async function updateHonestValues(){
try {
const r = await fetch('/api/l99-honest.php', {cache:'no-store'});
const d = await r.json();
if (!d.ok) return;
const realNR = `${d.combined.pass}/${d.combined.total}`;
const realSigma = d.sigma;
// Find elements showing the myth values
const mythRegex = /(153\/153|304\/304|NR status 153\/153|L99 status 304\/304|NR 153\/153|L99 304\/304)/g;
// Walk text nodes
const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, null);
const toReplace = [];
let node;
while (node = walker.nextNode()) {
if (node.nodeValue && mythRegex.test(node.nodeValue)) toReplace.push(node);
}
toReplace.forEach(textNode => {
const parent = textNode.parentNode;
if (!parent || parent.hasAttribute('data-opus-honest-applied')) return;
const newText = textNode.nodeValue.replace(/153\/153/g, realNR).replace(/304\/304/g, realNR);
textNode.nodeValue = newText;
parent.setAttribute('data-opus-honest-applied', '1');
});
// Add a small badge bottom-right showing honest live status
if (!document.getElementById('opus-honest-badge')) {
const b = document.createElement('div');
b.id = 'opus-honest-badge';
b.style.cssText = 'position:fixed;bottom:12px;right:12px;background:linear-gradient(90deg,#14b8a6,#a855f7);color:#05060a;padding:6px 12px;font:10px/1.3 Inter,system-ui,sans-serif;font-weight:700;border-radius:8px;z-index:99993;box-shadow:0 4px 12px rgba(0,0,0,0.3);cursor:pointer;max-width:280px';
b.title = 'Cliquer pour détails';
b.innerHTML = `✓ NR ${realNR} · ${realSigma} live`;
b.onclick = () => {
alert(`HONEST NonReg (doctrine #4):\n\nmaster: ${d.master.pass}/${d.master.total}\nopus: ${d.opus.pass}/${d.opus.total}\ncombined: ${realNR}\nsigma: ${realSigma}\n\n${d.myth_153}\n${d.myth_304}`);
};
document.body.appendChild(b);
}
} catch(e){console.error('L99-honest fetch error:', e);}
}
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', updateHonestValues);
else updateHonestValues();
setInterval(updateHonestValues, 90000);
})();
</script>
<!-- === OPUS HONEST END === -->
<script src="/api/archi-meta-badge.js" defer></script>
</body></html>