Files
html/dormant-dashboard-v2.html
Opus cf8108658d feat(chrome-cdp): wave 308 - 8/8 CDP live + doctrine no-overlap
- chrome-profile-launch.sh: CDP port mapping 9222-9229 per profile
- chrome-profile-launch.sh: --remote-debugging-port ajoute + address 0.0.0.0
- chrome-profile-launch.sh: PID extraction direct pgrep (no tmpfile)
- chrome-profile-launch.sh: JSON output include cdp_port + cdp_listening verify
- api/cdp-status.php NEW: proxy 8 CDP ports + bypass CORS 127.0.0.1
- vnc-picker.html: toast-stack BR->BL (doctrine zero overlap)
- vnc-picker.html: live polling 5s via /api/cdp-status.php
- vnc-picker.html: summary badge CDP LIVE x/8 coverage %
- 8/8 Chrome profiles running (openai/anthropic/google/deepseek/mistral/poe/perplexity/hf)
- 49 chrome processes active with CDP ports 9222-9229 listening
- Doctrine 308 wired: CDP port mapping + status proxy centralise
- GOLD: gold_vnc_picker_toast_fix + gold_chrome_launch_w308 + gold_vnc_picker_live_status_w308
2026-04-24 11:26:27 +02:00

205 lines
9.5 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. 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 charset="UTF-8"><title>Dormant Dashboard — WEVIA EM</title><style>
*{box-sizing:border-box;margin:0;padding:0}body{font-family:-apple-system,sans-serif;background:#0a0e1a;color:#e2e8f0;padding:20px}
.hd{background:linear-gradient(135deg,#7c3aed,#4c1d95);padding:22px 28px;border-radius:12px;margin-bottom:20px}
.hd h1{color:white;font-size:26px}.hd .sub{color:rgba(255,255,255,.85);margin-top:6px;font-size:13px}
.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card{background:#111827;border:1px solid #1e293b;border-radius:10px;padding:16px}
.card h3{color:#a855f7;font-size:14px;margin-bottom:10px;text-transform:uppercase;letter-spacing:1px}
.row{display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px solid #1e293b;font-size:12px}
.row:last-child{border:none}
.ok{color:#4ade80}.ko{color:#f87171}.warn{color:#facc15}
.actions{margin-top:12px;display:flex;gap:8px;flex-wrap:wrap}
.btn{padding:6px 12px;background:#1e293b;border-radius:4px;color:#a855f7;text-decoration:none;font-size:11px;font-weight:600}
.btn:hover{background:#7c3aed;color:white}
.sep{margin:30px 0 15px;color:#a855f7;font-size:13px;border-bottom:1px solid #1e293b;padding-bottom:5px;text-transform:uppercase;letter-spacing:2px}
</style><!-- DOCTRINE-60-UX-ENRICH cerebras-qwen-235b 20260424-110948 --><style id="doctrine60-ux-dormant-dashboard-v2">
body::before {
content: '';
position: fixed;
width: 100%;
height: 100%;
background: radial-gradient(circle, rgba(0,0,0,0.12), transparent 70%);
z-index: -1;
pointer-events: none;
}
.card, .btn, .kpi, .panel {
opacity: 0;
transform: translateY(20px);
transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);
}
.enter-stagger {
opacity: 1;
transform: translateY(0);
}
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.6; }
}
.pulse, .active, .live-indicator, .online {
animation: pulse 3s ease-in-out infinite;
}
.card:hover {
box-shadow: 0 8px 24px rgba(0,0,0,0.15);
border-color: var(--accent);
}
.modal, .chat, .speech, .overlay {
backdrop-filter: blur(12px);
}
</style>
</head><body>
<div class="hd"><h1>🎯 Dormant Dashboard</h1><div class="sub">WEVIA EM — Aucune capability inactive, tout wired, tout visible</div></div>
<div class="sep">Capabilities Open-Source (12 services)</div>
<div class="grid" id="cap-grid">Loading...</div>
<div class="sep">Intégrations Universelles (104 connecteurs)</div>
<div class="grid" id="uc-grid">Loading...</div>
<div class="sep">Actions rapides</div>
<div class="grid">
<div class="card"><h3>🚀 Gérer via chat</h3>
<div class="row">Widget WEVIA Master</div>
<div class="actions"><a class="btn" href="/wevia-master.html">Ouvrir chat</a></div>
</div>
<div class="card"><h3>🧪 Full NonReg EM</h3>
<div class="row">22 endpoints + 8 pages UI</div>
<div class="actions"><a class="btn" href="/api/em-webhooks.php?action=em-nonreg" target="_blank">Run NonReg</a></div>
</div>
<div class="card"><h3>🎯 Lean 6σ Dashboard</h3>
<div class="row">Muda/Poka/Kaizen/Gemba/PDCA/Andon/5S/A3</div>
<div class="actions"><a class="btn" href="/lean6sigma-dashboard.html">Ouvrir</a></div>
</div>
<div class="card"><h3>🔌 Universal Hub</h3>
<div class="row">Tout ERP · CRM · IA · Cloud · Hardware</div>
<div class="actions"><a class="btn" href="/universal-integration-hub.html">Explorer</a></div>
</div>
</div>
<script>
async function loadCaps(){
const services=[
['Paperclip','http://127.0.0.1:3088/'],['Twenty CRM','http://127.0.0.1:3000/healthz'],
['Mattermost','http://127.0.0.1:8065/api/v4/system/ping'],['Uptime-Kuma','http://127.0.0.1:3002/'],
['Searxng','http://127.0.0.1:8080/'],['Prometheus','http://127.0.0.1:9095/-/ready'],
['Loki','http://127.0.0.1:3100/ready'],['Gitea','http://127.0.0.1:3300/'],
['Qdrant','http://localhost:6333/'],['N8N','http://127.0.0.1:5678/healthz'],
['Ollama','http://localhost:11434/'],['Sovereign AI','http://127.0.0.1:4000/']
];
const r=await fetch('/api/wevia-master-api.php',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({message:'capabilities inventory',session:'ui',history:[]})}).then(r=>r.json());
const txt=r.content||'';
const lines=txt.split('\n').filter(l=>l.includes('✅')||l.includes('❌'));
document.getElementById('cap-grid').innerHTML=lines.map(l=>{
const ok=l.includes('✅');
const name=l.replace(/^.*[✅❌]\s+/,'').replace(/\s*\(HTTP.*\)\s*$/,'').trim();
const http=(l.match(/HTTP\s+(\d+)/)||[])[1]||'-';
return `<div class="card"><h3>${ok?'✅':'❌'} ${name}</h3>
<div class="row"><span>Status</span><span class="${ok?'ok':'ko'}">HTTP ${http}</span></div>
<div class="row"><span>Wired WEVIA</span><span class="ok">YES</span></div>
<div class="row"><span>Type</span><span>open-source</span></div>
</div>`;
}).join('');
}
async function loadUC(){
const d=await fetch('/api/em/universal-stats').then(r=>r.json());
document.getElementById('uc-grid').innerHTML=(d.by_category||[]).map(c=>`
<div class="card"><h3>${c.category.toUpperCase()}</h3>
<div class="row"><span>Connecteurs</span><span class="ok">${c.c}</span></div>
<div class="row"><span>Status</span><span class="ok">available</span></div>
<div class="actions"><a class="btn" href="/universal-integration-hub.html?cat=${c.category}">Voir détail</a></div>
</div>
`).join('');
}
(async()=>{await loadCaps();await loadUC()})();
</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 === -->
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t34final) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
<!-- DOCTRINE-60-UX-JS --><script id="doctrine60-ux-js-dormant-dashboard-v2">
const observer = new IntersectionObserver((entries) => {
entries.forEach((entry, index) => {
if (entry.isIntersecting) {
setTimeout(() => {
entry.target.classList.add('enter-stagger');
}, index * 80);
}
});
}, { threshold: 0.1 });
document.querySelectorAll('.card, .btn, .kpi, .panel').forEach(el => {
observer.observe(el);
});
</script>
</body></html>