SIMON Master Console Rebuild
True command center for SIMON + WEB360
This rebuild gives you a cleaner production spine: interactive tree, live viewer, guarded editor, dynamic graphics, architecture map, and note storage. It is designed to sit beside your existing
console.php
and become the stronger replacement path.
Dashboard
Tree
Viewer
System Map
File Registry
Notes
Files
15,325
Folders
409
Scanned Size
3.84 GB
PHP Files
885
Editable Text Files
12,586
File viewer
guarded to /htdocs
/live/ai_dashboard.php
<?php declare(strict_types=1); require __DIR__ . '/ai_engine.php'; $stats=simon_ai_stats(); ?> <!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>SIMON AI Layer</title> <style> :root{--bg:#05041a;--panel:rgba(16,14,48,.78);--line:rgba(75,227,255,.22);--text:#eaf2ff;--muted:#9aa3c4;--cyan:#4be3ff;--pink:#ff5bd1;--green:#7cff9e;--amber:#ffb347;--red:#ff6b8f}*{box-sizing:border-box}body{margin:0;background:radial-gradient(900px 600px at 20% 0,rgba(122,92,255,.24),transparent),linear-gradient(180deg,#05041a,#08072a);color:var(--text);font:14px/1.45 system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.wrap{max-width:1180px;margin:0 auto;padding:24px}.top{display:flex;gap:12px;align-items:center;flex-wrap:wrap}.logo{width:42px;height:42px;border-radius:14px;background:conic-gradient(var(--cyan),var(--pink),var(--cyan));box-shadow:0 0 30px rgba(75,227,255,.35)}h1{margin:0;font-size:30px}.muted{color:var(--muted)}.btn{border:1px solid var(--line);background:rgba(255,255,255,.04);color:var(--text);border-radius:999px;padding:10px 14px;text-decoration:none;cursor:pointer}.btn.hot{background:linear-gradient(135deg,var(--cyan),#7a5cff);color:#05041a;font-weight:800}.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin:20px 0}.card{background:var(--panel);border:1px solid var(--line);border-radius:18px;padding:16px;box-shadow:0 18px 50px rgba(0,0,0,.35)}.n{font-size:30px;font-weight:900}.label{color:var(--muted);font-size:11px;text-transform:uppercase;letter-spacing:.12em}.toolbar{display:flex;gap:10px;flex-wrap:wrap;margin:16px 0}.toolbar input,.toolbar select{background:rgba(255,255,255,.05);border:1px solid var(--line);border-radius:999px;padding:10px 14px;color:var(--text)}.events{display:grid;gap:12px}.event{background:rgba(16,14,48,.7);border:1px solid rgba(255,255,255,.08);border-radius:18px;padding:16px}.event h3{margin:0 0 6px}.chips{display:flex;gap:6px;flex-wrap:wrap;margin-top:10px}.chip{border:1px solid rgba(255,255,255,.12);border-radius:999px;padding:4px 8px;color:var(--muted);font-size:12px}.score{float:right;color:var(--green);font-weight:900}.summary{color:#dbe8ff}.actions{color:var(--amber);font-size:12px;margin-top:8px}a{color:var(--cyan)}</style></head> <body><div class="wrap"><div class="top"><div class="logo"></div><div><h1>SIMON AI Layer</h1><div class="muted">Local enrichment: summaries, keywords, entities, sentiment, importance, dedupe signatures, event storage.</div></div><span style="flex:1"></span><a class="btn" href="index.php">Dashboard</a><a class="btn" href="feed_manager.php">Feed Manager</a><button class="btn hot" onclick="processNow()">Process feeds now</button></div> <div class="grid"><div class="card"><div class="n" id="stCount"><?= (int)$stats['count'] ?></div><div class="label">Stored Events</div></div><div class="card"><div class="n" id="stImportant"><?= (int)$stats['important'] ?></div><div class="label">Important ≥80</div></div><div class="card"><div class="n"><?= count($stats['categories']) ?></div><div class="label">Categories</div></div><div class="card"><div class="n"><?= htmlspecialchars((string)($stats['sentiment']['negative']??0)) ?></div><div class="label">Negative Signals</div></div></div> <div class="toolbar"><input id="q" placeholder="Search stored events…"><select id="cat"><option value="">All categories</option><?php foreach(array_keys($stats['categories']) as $cat): ?><option><?= htmlspecialchars($cat) ?></option><?php endforeach ?></select><button class="btn" onclick="loadEvents()">Search</button><button class="btn" onclick="clearStore()">Clear store</button></div> <div class="events" id="events"><div class="muted">Loading…</div></div></div> <script> async function processNow(){ const r=await fetch('ai_processor.php?limit=150&store=1&force=1'); const j=await r.json(); alert('Processed '+j.count+' events. Stored new: '+j.stored); loadEvents(); } async function clearStore(){ if(!confirm('Clear stored AI events? A backup is created first.'))return; await fetch('event_store.php?action=clear'); loadEvents(); } async function loadEvents(){ const q=document.getElementById('q').value; const cat=document.getElementById('cat').value; const r=await fetch('event_store.php?limit=150&q='+encodeURIComponent(q)+'&category='+encodeURIComponent(cat)); const j=await r.json(); document.getElementById('stCount').textContent=j.stats.count; document.getElementById('stImportant').textContent=j.stats.important; const host=document.getElementById('events'); host.innerHTML=''; if(!j.items.length){host.innerHTML='<div class="event muted">No stored AI events yet. Click Process feeds now.</div>';return;} j.items.forEach(e=>{const ai=e.ai||{}; const d=document.createElement('div'); d.className='event'; d.innerHTML=`<span class="score">${ai.importance||e.score||0}</span><h3>${esc(e.title||'Untitled')}</h3><div class="muted">${esc(e.source||'')} · ${esc(e.category||'')} · ${esc(e.published||'')}</div><p class="summary">${esc(ai.summary||e.summary||'')}</p><div class="chips">${(ai.keywords||[]).slice(0,12).map(k=>`<span class="chip">${esc(k)}</span>`).join('')}</div><div class="chips">${(ai.entities||[]).slice(0,10).map(k=>`<span class="chip">${esc(k)}</span>`).join('')}</div><div class="actions">${esc((ai.actions||[]).join(' · '))}</div>${e.url?`<p><a href="${esc(e.url)}" target="_blank" rel="noopener">Open source ↗</a></p>`:''}`; host.appendChild(d);}); } function esc(s){return String(s??'').replace(/[&<>"']/g,c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]));} loadEvents(); </script></body></html>
Save file
Quick jump
open a path
Open