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,551
Folders
418
Scanned Size
3.85 GB
PHP Files
915
Editable Text Files
12,812
File viewer
guarded to /htdocs
/connlink/test1/ui/old/simon_safe_lib.php
<?php declare(strict_types=1); /** * SIMON Emergency Safe Library * Standalone no-fatal helper for recovery dashboards. */ ini_set('display_errors', '1'); ini_set('display_startup_errors', '1'); error_reporting(E_ALL); if (!function_exists('mb_substr')) { function mb_substr($string, $start, $length = null, $encoding = null) { return $length === null ? substr((string)$string, (int)$start) : substr((string)$string, (int)$start, (int)$length); } } function sr_h($v): string { return htmlspecialchars((string)$v, ENT_QUOTES, 'UTF-8'); } function sr_root(): string { return __DIR__; } function sr_path(string $r): string { return rtrim(__DIR__, '/\\') . '/' . ltrim($r, '/\\'); } function sr_dirs(): void { foreach (['cache/jobs','cache/feeds','data/events','logs/jobs','logs/compat'] as $d) { $p = sr_path($d); if (!is_dir($p)) @mkdir($p, 0775, true); } } function sr_default_feeds(): array { return [ ['id'=>'newsapi','name'=>'NewsAPI','group'=>'News','category'=>'news','endpoint'=>'/connlink/test1/ui/newsapi_proxy.php','enabled'=>true,'refresh'=>300,'priority'=>100,'icon'=>'NEWS'], ['id'=>'webhook','name'=>'Webhook Inbox','group'=>'SIMON Internal','category'=>'internal','endpoint'=>'/connlink/test1/ui/webhook_inbox.php?stream=default','enabled'=>true,'refresh'=>30,'priority'=>100,'icon'=>'HOOK'], ['id'=>'google_search','name'=>'Google Search Proxy','group'=>'Search','category'=>'search','endpoint'=>'/connlink/test1/ui/gsearch_proxy.php?q=simon','enabled'=>true,'refresh'=>0,'priority'=>70,'icon'=>'SEARCH'], ]; } function sr_load_registry(): array { $file = sr_path('carrier_registry.json'); if (!is_file($file)) return ['version'=>'fallback','feeds'=>sr_default_feeds()]; $raw = @file_get_contents($file); $json = json_decode((string)$raw, true); if (!is_array($json) || !isset($json['feeds']) || !is_array($json['feeds'])) { return ['version'=>'fallback_bad_json','feeds'=>sr_default_feeds()]; } return $json; } function sr_save_registry(array $registry): bool { $registry['updated'] = gmdate('c'); return @file_put_contents(sr_path('carrier_registry.json'), json_encode($registry, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES), LOCK_EX) !== false; } function sr_feeds(bool $enabledOnly=false): array { $reg = sr_load_registry(); $feeds = []; foreach (($reg['feeds'] ?? []) as $f) { if (!is_array($f) || empty($f['id'])) continue; $f['name'] = (string)($f['name'] ?? ucfirst(str_replace('_',' ', $f['id']))); $f['group'] = (string)($f['group'] ?? ($f['category'] ?? 'General')); $f['category'] = (string)($f['category'] ?? 'general'); $f['endpoint'] = (string)($f['endpoint'] ?? ($f['url'] ?? '')); $f['enabled'] = (bool)($f['enabled'] ?? true); $f['refresh'] = (int)($f['refresh'] ?? 300); $f['priority'] = (int)($f['priority'] ?? 50); $f['icon'] = (string)($f['icon'] ?? 'FEED'); if ($enabledOnly && !$f['enabled']) continue; $feeds[] = $f; } usort($feeds, fn($a,$b) => ($b['priority'] <=> $a['priority']) ?: strcmp($a['name'], $b['name'])); return $feeds; } function sr_feed(string $id): ?array { foreach (sr_feeds(false) as $f) if ($f['id'] === $id) return $f; return null; } function sr_cache_file(string $id): string { $safe = preg_replace('/[^a-zA-Z0-9_\-]/', '_', $id) ?: 'unknown'; return sr_path('cache/jobs/' . $safe . '.json'); } function sr_cache_read(string $id): ?array { $file = sr_cache_file($id); if (!is_file($file)) return null; $json = json_decode((string)@file_get_contents($file), true); return is_array($json) ? $json : null; } function sr_cache_write(string $id, array $payload): bool { sr_dirs(); $payload['cached_at'] = $payload['cached_at'] ?? gmdate('c'); return @file_put_contents(sr_cache_file($id), json_encode($payload, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES), LOCK_EX) !== false; } function sr_abs_url(string $url): string { if ($url === '') return ''; if (preg_match('~^https?://~i', $url)) return $url; if (str_starts_with($url, '/')) { $scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http'; $host = $_SERVER['HTTP_HOST'] ?? 'localhost'; return $scheme . '://' . $host . $url; } return $url; } function sr_fetch(string $url): array { $started = microtime(true); $abs = sr_abs_url($url); if ($abs === '') return ['ok'=>false,'json'=>null,'latency_ms'=>0,'error'=>'missing_endpoint','url'=>'']; $ctx = stream_context_create(['http'=>[ 'method'=>'GET', 'timeout'=>18, 'header'=>"Accept: application/json, text/plain, */*\r\nUser-Agent: SIMON-Recovery/2.1\r\n" ]]); $raw = @file_get_contents($abs, false, $ctx); $latency = (int)round((microtime(true)-$started)*1000); if ($raw === false) return ['ok'=>false,'json'=>null,'latency_ms'=>$latency,'error'=>'request_failed','url'=>$abs]; $json = json_decode($raw, true); return ['ok'=>true,'json'=>is_array($json)?$json:null,'latency_ms'=>$latency,'error'=>is_array($json)?null:'non_json_response','url'=>$abs]; } function sr_extract_items(array $json): array { foreach (['items','articles','events','results','features','data'] as $k) { if (isset($json[$k]) && is_array($json[$k])) return $json[$k]; } return array_is_list($json) ? $json : []; } function sr_run_feed(string $id): array { $feed = sr_feed($id); if (!$feed) return ['ok'=>false,'id'=>$id,'name'=>$id,'status'=>'missing_feed','message'=>'Feed not in registry','items'=>[],'item_count'=>0,'latency_ms'=>0,'updated'=>gmdate('c')]; if (!$feed['enabled']) { $r = ['ok'=>false,'id'=>$id,'name'=>$feed['name'],'group'=>$feed['group'],'category'=>$feed['category'],'endpoint'=>$feed['endpoint'],'status'=>'disabled','message'=>'Feed disabled','items'=>[],'item_count'=>0,'latency_ms'=>0,'updated'=>gmdate('c')]; sr_cache_write($id, $r); return $r; } $fetch = sr_fetch($feed['endpoint']); $items = $fetch['json'] ? sr_extract_items($fetch['json']) : []; $r = [ 'ok'=>$fetch['ok'] && $fetch['json'] !== null, 'id'=>$id, 'name'=>$feed['name'], 'group'=>$feed['group'], 'category'=>$feed['category'], 'endpoint'=>$feed['endpoint'], 'request_url'=>$fetch['url'], 'status'=>($fetch['ok'] && $fetch['json'] !== null) ? 'online' : 'failed', 'message'=>$fetch['error'] ?: 'Endpoint called successfully.', 'items'=>$items, 'item_count'=>count($items), 'latency_ms'=>$fetch['latency_ms'], 'updated'=>gmdate('c') ]; sr_cache_write($id, $r); return $r; } function sr_run_all(int $limit=60): array { $out = []; foreach (array_slice(sr_feeds(true), 0, $limit) as $feed) $out[] = sr_run_feed($feed['id']); return $out; } function sr_rows(): array { $rows = []; foreach (sr_feeds(false) as $feed) { $cache = sr_cache_read($feed['id']); $items = isset($cache['items']) && is_array($cache['items']) ? $cache['items'] : []; $rows[] = [ 'id'=>$feed['id'], 'name'=>$feed['name'], 'group'=>$feed['group'], 'category'=>$feed['category'], 'endpoint'=>$feed['endpoint'], 'enabled'=>$feed['enabled'], 'priority'=>$feed['priority'], 'refresh'=>$feed['refresh'], 'icon'=>$feed['icon'], 'status'=>$cache['status'] ?? ($feed['enabled'] ? 'not_tested' : 'disabled'), 'ok'=>(bool)($cache['ok'] ?? false), 'items'=>$items, 'item_count'=>count($items), 'latency_ms'=>(int)($cache['latency_ms'] ?? 0), 'cached_at'=>$cache['cached_at'] ?? null, 'message'=>$cache['message'] ?? '', ]; } return $rows; } function sr_title(array $item): string { return (string)($item['title'] ?? $item['name'] ?? $item['headline'] ?? $item['subject'] ?? '(untitled)'); } function sr_summary(array $item): string { return (string)($item['summary'] ?? $item['snippet'] ?? $item['description'] ?? $item['message'] ?? $item['text'] ?? ''); } function sr_events(): array { $events = []; foreach (sr_rows() as $feed) { foreach ($feed['items'] as $item) { if (!is_array($item)) continue; $title = sr_title($item); $summary = sr_summary($item); $events[] = ['source'=>$feed['name'],'category'=>$feed['category'],'title'=>$title,'summary'=>$summary]; } } return $events; } function sr_css(): string { return <<<'CSS' :root{--bg:#05041a;--line:rgba(75,227,255,.25);--text:#eaf2ff;--muted:#9aa3c4;--cyan:#4be3ff;--green:#7cff9e;--amber:#ffb347;--red:#ff6b8f;--pink:#ff5bd1;--vio:#7a5cff} *{box-sizing:border-box}body{margin:0;min-height:100vh;background:radial-gradient(900px 600px at 20% 0%,rgba(122,92,255,.25),transparent 60%),radial-gradient(700px 500px at 100% 10%,rgba(255,91,209,.18),transparent 60%),linear-gradient(180deg,#05041a,#08072a);color:var(--text);font:14px/1.45 system-ui,-apple-system,Segoe UI,Roboto,sans-serif;padding:24px} .wrap{max-width:1240px;margin:0 auto}.top{display:flex;align-items:flex-start;justify-content:space-between;gap:18px;flex-wrap:wrap;margin-bottom:18px}.brand{display:flex;align-items:center;gap:14px}.logo{width:54px;height:54px;border-radius:16px;background:conic-gradient(from 220deg,var(--vio),var(--cyan),var(--pink),var(--vio));box-shadow:0 0 38px rgba(75,227,255,.28)}h1{margin:0;font-size:30px}.sub,.muted,.small{color:var(--muted)}.kicker{color:var(--muted);font-size:11px;letter-spacing:.18em;text-transform:uppercase}.grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin:18px 0}.card,.panel{background:linear-gradient(180deg,rgba(22,18,60,.88),rgba(14,10,40,.92));border:1px solid var(--line);border-radius:18px;padding:16px;box-shadow:0 18px 48px rgba(0,0,0,.35)}.card .k{color:var(--muted);font-size:11px;letter-spacing:.12em;text-transform:uppercase}.card .v{font-size:28px;font-weight:900;margin-top:4px}.actions{display:flex;gap:10px;flex-wrap:wrap;margin:12px 0 20px}a.btn,button.btn{display:inline-flex;align-items:center;gap:8px;padding:10px 14px;border-radius:999px;border:1px solid var(--line);background:rgba(75,227,255,.08);color:var(--text);text-decoration:none;font:inherit;cursor:pointer}table{width:100%;border-collapse:separate;border-spacing:0 10px}th{text-align:left;color:var(--muted);font-size:11px;text-transform:uppercase;letter-spacing:.12em;padding:0 12px}td{background:rgba(16,14,48,.72);border-top:1px solid rgba(255,255,255,.07);border-bottom:1px solid rgba(255,255,255,.07);padding:13px 12px}td:first-child{border-left:1px solid rgba(255,255,255,.07);border-radius:14px 0 0 14px;font-weight:800}td:last-child{border-right:1px solid rgba(255,255,255,.07);border-radius:0 14px 14px 0}.pill{display:inline-flex;padding:4px 9px;border-radius:999px;border:1px solid rgba(255,255,255,.1);font-size:12px}.online{color:var(--green)}.warn{color:var(--amber)}.bad{color:var(--red)}.quick{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin:14px 0}.quick a{display:block;border:1px solid rgba(255,255,255,.08);border-radius:16px;background:rgba(255,255,255,.035);padding:12px;text-decoration:none;color:var(--text)}.quick span{display:block;color:var(--muted);font-size:12px}.list{display:grid;gap:10px}.event{border:1px solid rgba(255,255,255,.08);border-radius:16px;background:rgba(255,255,255,.035);padding:14px}input{border:1px solid rgba(255,255,255,.08);background:rgba(0,0,0,.22);color:var(--text);border-radius:14px;padding:10px 12px;width:100%}label{display:grid;gap:5px;color:var(--muted);font-size:12px}.formgrid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.checkrow{display:flex;gap:8px;align-items:center}.checkrow input{width:auto}@media(max-width:900px){.grid,.quick,.formgrid{grid-template-columns:1fr}body{padding:14px}table{font-size:12px}td,th{padding:10px 8px}} CSS; } function sr_top(string $title, string $sub=''): void { echo '<!doctype html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>'.sr_h($title).'</title><style>'.sr_css().'</style></head><body><div class="wrap"><div class="top"><div class="brand"><div class="logo"></div><div><div class="kicker">SIMON Emergency Recovery</div><h1>'.sr_h($title).'</h1><div class="sub">'.sr_h($sub).'</div></div></div><div class="actions"><a class="btn" href="compat/compat.php">Compat</a><a class="btn" href="jobs_dashboard.php">Jobs</a><a class="btn" href="feed_manager.php">Feed Manager</a><a class="btn" href="ai_dashboard.php">AI</a><a class="btn" href="graph_dashboard.php">Graph</a></div></div>'; } function sr_bottom(): void { echo '</div></body></html>'; } ?>
Save file
Quick jump
open a path
Open