Files
html/wevia-memory-dashboard.html
Opus c7994d48be
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
phase45 doctrine 183 inject 29 pages PRIO3 - 121 pages UX total
29 pages PRIO3 enrichies via inject-d60-direct.py:
registries: wtp-orphans-registry agents-unified-registry ia-sovereign-registry
hubs: wevia-hub vsm-hub wevads-hub weval-data-hub wevia-unified-hub tools-hub toolhub
dashboards: office-365-dashboard-live crm-pipeline-live orphans-dashboard
           medreach-dashboard wevia-director-dashboard security-dashboard
           wevia-memory-dashboard
monitors: sso-monitor monitoring
centers: mega-command-center trust-center
studios: bpmn-studio-live admin-saas
others: ethica-hcp-manager ops-screens-live vsm-pipelines lean-6sigma
        office-admins weval-live-ops

Cumul session Opus:
- 121 pages UX doctrine 60 (92 + 29)
- 31 tags Opus (avec phase45)
- 28 doctrines vault (146-183)

Handler inject-d60-direct.py prouve robuste sur 65+ pages consecutives.
ZERO regression. ZERO ecrasement. NR 153/153 invariant.
2026-04-24 14:25:37 +02:00

215 lines
12 KiB
HTML

<!DOCTYPE html><html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>WEVIA Memory Unified · Wave 258 · Redis DB 5 + Qdrant</title>
<style>
:root{--bg:#060a14;--s:#0c1220;--s2:#111827;--b:#1e293b;--t:#e2e8f0;--d:#64748b;--cy:#22d3ee;--gn:#34d399;--am:#fbbf24;--rd:#f87171;--pu:#a78bfa;--bl:#60a5fa;--pk:#f472b6;--or:#fb923c}
*{margin:0;padding:0;box-sizing:border-box}
body{background:var(--bg);color:var(--t);font-family:-apple-system,'Segoe UI',sans-serif;font-size:13px;line-height:1.5}
.hdr{background:linear-gradient(180deg,var(--s),rgba(12,18,32,.95));border-bottom:1px solid var(--b);padding:18px 24px;display:flex;justify-content:space-between;align-items:center;position:sticky;top:0;z-index:10;backdrop-filter:blur(10px)}
.hdr h1{font-size:22px;font-weight:800;background:linear-gradient(135deg,var(--cy),var(--pu),var(--pk));-webkit-background-clip:text;-webkit-text-fill-color:transparent}
.hdr .meta{color:var(--d);font-size:11px;margin-top:4px;font-family:'JetBrains Mono',monospace}
.btn{padding:8px 14px;border-radius:8px;border:1px solid var(--b);background:var(--s2);color:var(--t);text-decoration:none;font-size:11px;font-weight:600;cursor:pointer}
.btn:hover{border-color:var(--cy)}
.wrap{padding:24px;max-width:1600px;margin:0 auto}
.banner{background:linear-gradient(135deg,rgba(52,211,153,.12),rgba(34,211,238,.10),rgba(167,139,250,.08));border:2px solid rgba(52,211,153,.4);border-radius:14px;padding:24px;margin-bottom:28px;text-align:center}
.banner .big{font-size:44px;font-weight:900;color:var(--gn);font-family:'JetBrains Mono',monospace;line-height:1}
.banner .sub{color:#cbd5e1;font-size:14px;margin-top:8px;font-weight:600}
.banner .desc{color:#94a3b8;font-size:11.5px;margin-top:6px}
.kpi{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:14px;margin-bottom:28px}
.k{background:var(--s);border:1px solid var(--b);border-radius:12px;padding:20px;text-align:center}
.k .n{font-family:'JetBrains Mono',monospace;font-size:28px;font-weight:800}
.k .l{font-size:10px;text-transform:uppercase;color:var(--d);margin-top:6px;letter-spacing:.8px;font-weight:600}
.k.gn .n{color:var(--gn)}.k.am .n{color:var(--am)}.k.cy .n{color:var(--cy)}.k.pu .n{color:var(--pu)}.k.bl .n{color:var(--bl)}.k.pk .n{color:var(--pk)}.k.or .n{color:var(--or)}
.grid2{display:grid;grid-template-columns:repeat(auto-fit,minmax(400px,1fr));gap:16px;margin-bottom:24px}
.card{background:var(--s);border:1px solid var(--b);border-radius:12px;padding:18px}
.card h3{font-size:14px;color:var(--cy);margin-bottom:12px;font-weight:700;display:flex;align-items:center;gap:8px;padding-bottom:10px;border-bottom:1px solid var(--b)}
.card .desc{color:#94a3b8;font-size:11.5px;margin-bottom:12px}
.row{display:flex;justify-content:space-between;padding:6px 0;font-size:12px;border-bottom:1px dotted rgba(255,255,255,.04)}
.row .l{color:var(--d)}.row .v{color:var(--t);font-family:'JetBrains Mono',monospace;font-weight:600}
.tag{display:inline-block;padding:2px 8px;background:var(--s2);border-radius:6px;font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.6px}
.tag.gn{background:rgba(52,211,153,.15);color:var(--gn)}
.tag.am{background:rgba(251,191,36,.15);color:var(--am)}
.tag.cy{background:rgba(34,211,238,.15);color:var(--cy)}
.tag.pk{background:rgba(244,114,182,.15);color:var(--pk)}
.code{display:block;background:#0a0e16;border:1px solid var(--b);border-radius:6px;padding:10px 14px;color:#5eead4;font-family:'JetBrains Mono',monospace;font-size:11px;cursor:pointer;margin-top:6px}
.code:hover{background:#0f1420;border-color:var(--cy)}
.sec-h{font-size:13px;font-weight:700;margin:24px 0 12px 0;padding-bottom:8px;border-bottom:1px solid var(--b);display:flex;align-items:center;gap:8px}
</style><!-- DOCTRINE-60-UX-ENRICH direct-inject-20260424-142446 -->
<style id="doctrine60-ux-direct">
/* DOCTRINE-60-UX-ENRICH injected-direct */
body::before {
content: '';
position: fixed;
top: 0; left: 0; width: 100vw; height: 100vh;
background: radial-gradient(circle at 50% 50%, rgba(100,180,255,0.08), transparent 60%);
pointer-events: none;
z-index: -1;
}
.card, .kpi, .panel, .btn {
transition: all 0.3s cubic-bezier(0.2,0,0.1,1);
}
.card:hover, .kpi:hover, .panel:hover {
box-shadow: 0 4px 20px rgba(100,180,255,0.2);
border-color: rgba(100,180,255,0.5);
}
@keyframes pulseD60 {
0%,100% { opacity: 1; transform: scale(1); }
50% { opacity: 0.7; transform: scale(1.05); }
}
.pulse, .live-indicator, .active, .online {
animation: pulseD60 3s ease-in-out infinite;
}
.modal, .chat, .speech, .overlay {
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
}
.enter-stagger {
animation: enterStagD60 0.5s cubic-bezier(0.2,0,0.1,1) forwards;
}
@keyframes enterStagD60 {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
</style>
</head><body>
<div class="hdr">
<div>
<h1>🧠 WEVIA Memory Unified · Wave 258 · Redis DB 5 + Qdrant</h1>
<div class="meta">Internal chats = unlimited persistent · Public widget = session-only · 22avr2026</div>
</div>
<div style="display:flex;gap:8px">
<a href="/wevia-master.html" class="btn">✨ WEVIA Master</a>
<a href="/wevia-multiagent-dashboard.html" class="btn">🤖 Multi-Agent</a>
<a href="/all-ia-hub.html" class="btn">🧠 IA Hub</a>
<a href="/weval-technology-platform.html" class="btn">⚙️ WTP</a>
</div>
</div>
<div class="wrap">
<div class="banner">
<div class="big" id="mem-status">PERSISTENT ✅</div>
<div class="sub">🎯 Memory illimitée pour chatbots internes · Session-only pour widget public</div>
<div class="desc">Redis DB 5 (no TTL internal, 1h TTL public) + Qdrant vector memory cross-session · Wave 258 backend live</div>
</div>
<div class="kpi">
<div class="k gn"><div class="n" id="k-redis">?</div><div class="l">Redis DB 5 Keys</div></div>
<div class="k cy"><div class="n" id="k-qdrant">17</div><div class="l">Qdrant Collections</div></div>
<div class="k pu"><div class="n">5</div><div class="l">Internal Scopes</div></div>
<div class="k am"><div class="n">-1</div><div class="l">TTL Internal (∞)</div></div>
<div class="k bl"><div class="n">3600s</div><div class="l">TTL Public (1h)</div></div>
<div class="k pk"><div class="n">768</div><div class="l">Vector Dims</div></div>
</div>
<div class="sec-h">🎯 Scope doctrinal</div>
<div class="grid2">
<div class="card">
<h3>🔒 INTERNAL chats · unlimited persistent <span class="tag gn">TTL=-1</span></h3>
<div class="desc">WEVIA Master, WEVIA Orchestrator, WEVCODE, Director, L99 Brain, All-IA Hub, Paperclip, Command Center. Mémoire cross-session illimitée pour apprentissage continu.</div>
<div class="row"><span class="l">Backend</span><span class="v">Redis DB 5</span></div>
<div class="row"><span class="l">Cross-session recall</span><span class="v">Qdrant wevia_memory_768</span></div>
<div class="row"><span class="l">User identification</span><span class="v">cookie/JWT user_id</span></div>
<div class="row"><span class="l">Messages loaded</span><span class="v">recent N per query</span></div>
<div class="row"><span class="l">Doctrine</span><span class="v">apprentissage continu</span></div>
</div>
<div class="card">
<h3>🌐 PUBLIC widget /wevia + / <span class="tag am">TTL=3600</span></h3>
<div class="desc">Widget racine du site (/) + /wevia. Privé visiteur. Session de 1h seulement. RGPD compliant - zéro historique long.</div>
<div class="row"><span class="l">Backend</span><span class="v">Redis DB 5 (1h TTL)</span></div>
<div class="row"><span class="l">Session ID</span><span class="v">anon-ip-ua hash</span></div>
<div class="row"><span class="l">Qdrant access</span><span class="v">read-only (KB)</span></div>
<div class="row"><span class="l">Session expire</span><span class="v">1 heure</span></div>
<div class="row"><span class="l">Doctrine</span><span class="v">privacy-first</span></div>
</div>
</div>
<div class="sec-h">📚 Qdrant collections knowledge base</div>
<div class="grid2" id="qdrant-grid"></div>
<div class="sec-h">🧪 Test API live</div>
<div class="card">
<h3>Endpoint: POST /api/wevia-chat-memory.php</h3>
<div class="desc">Test complet avec Redis persist + Qdrant recall multi-agent</div>
<div class="code" onclick="navigator.clipboard.writeText(this.innerText)">curl -X POST http://127.0.0.1/api/wevia-chat-memory.php -H 'Content-Type: application/json' -d '{"message":"Je suis Yacine PDG WEVAL","chat_id":"wevia-master","scope":"internal","user_id":"yacine-test"}'</div>
<div class="code" onclick="navigator.clipboard.writeText(this.innerText)">curl -X POST http://127.0.0.1/api/wevia-chat-memory.php -H 'Content-Type: application/json' -d '{"message":"Qui suis-je ?","chat_id":"wevia-master","scope":"internal","user_id":"yacine-test"}'</div>
</div>
<div class="sec-h">📊 Memory files inventory (14 files · organized · no duplicates)</div>
<div class="grid2">
<div class="card">
<h3>🎯 Central (endpoint unifié)</h3>
<div class="row"><span class="l">wevia-chat-memory.php</span><span class="v tag gn">CENTRAL · Wave 258</span></div>
<div class="row"><span class="l">wevia-memory-api.php</span><span class="v">API memory ops</span></div>
<div class="row"><span class="l">wevia-memory.php</span><span class="v">Core lib</span></div>
<div class="row"><span class="l">supermemory-api.php</span><span class="v">Qdrant long-term</span></div>
<div class="row"><span class="l">memory-history.php</span><span class="v">Historique query</span></div>
</div>
<div class="card">
<h3>👥 Multi-chatbots (specific)</h3>
<div class="row"><span class="l">ambre-internal-memory</span><span class="v">Ambre internal</span></div>
<div class="row"><span class="l">ambre-session-memory</span><span class="v">Ambre session</span></div>
<div class="row"><span class="l">ambre-pdf-memory</span><span class="v">PDF uploads</span></div>
<div class="row"><span class="l">ambre-memory-check</span><span class="v">Healthcheck</span></div>
<div class="row"><span class="l">intent-opus4-* (6 files)</span><span class="v">Intents memory ops</span></div>
</div>
</div>
<script>
async function loadStatus(){
try {
const q = await fetch('http://127.0.0.1:6333/collections').then(r=>r.json()).catch(()=>null);
if(q && q.result && q.result.collections){
document.getElementById('k-qdrant').textContent = q.result.collections.length;
const grid = document.getElementById('qdrant-grid');
grid.innerHTML = q.result.collections.map(c => {
const name = c.name;
const colors = ['gn','cy','pu','am','bl','pk','or'];
const cl = colors[name.charCodeAt(0) % colors.length];
return `<div class="card"><h3><span class="tag ${cl}">COLLECTION</span> ${name}</h3></div>`;
}).join('');
}
} catch(e){ console.log('Qdrant check failed', e); }
try {
// Test memory live
const r = await fetch('/api/wevia-chat-memory.php', {
method: 'POST',
headers: {'Content-Type':'application/json'},
body: JSON.stringify({message:"ping memory check","chat_id":"dashboard-check","scope":"internal","user_id":"dashboard-viewer"})
}).then(r=>r.json()).catch(()=>null);
if(r && r.memory_stats){
document.getElementById('k-redis').textContent = r.memory_stats.keys;
document.getElementById('mem-status').textContent = r.memory_stats.persistent ? 'PERSISTENT ✅' : 'SESSION-ONLY ⏱️';
}
} catch(e){ document.getElementById('k-redis').textContent = '?'; }
}
loadStatus();
setInterval(loadStatus, 30000);
</script>
</div>
<!-- DOCTRINE-60-UX-JS --><script id="doctrine60-ux-js-direct">
// DOCTRINE-60-UX-JS staggered entrance
(function(){
if (!('IntersectionObserver' in window)) return;
const obs = new IntersectionObserver((entries) => {
entries.forEach((e, i) => {
if (e.isIntersecting) {
setTimeout(() => e.target.classList.add('enter-stagger'), i * 80);
obs.unobserve(e.target);
}
});
});
document.querySelectorAll('.card, .kpi, .panel').forEach(el => obs.observe(el));
})();
</script>
</body></html>