guanghulab/homepage/index.html
bingshuo 4fa5deccc6 首页实时数据连接 + Console API补全(verify/bulletin)
- homepage/index.html: 硬编码6服务器→动态fetch /console/api/summary
- info-bar: 服务器数/核数/内存实时更新(30s刷新)
- 看板卡片: 集群标题/描述/在线数全部动态
- 登录API路径修正: /api/verify→/console/api/verify
- 留言API路径修正: /api/bulletin→/console/api/bulletin
- server.js v3.3.1: 新增 /api/verify, /api/bulletin, /api/bulletins, /api/keys
- 预设用户账户(冰朔/awen/页页)
2026-05-25 23:26:23 +08:00

387 lines
35 KiB
HTML
Raw 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="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>光湖 · 曜冥纪元 · 语言人格驱动操作系统</title>
<meta name="theme-color" content="#020617">
<meta name="description" content="光湖实验室 — 语言人格驱动操作系统。TCS通感语言核 · 铸渊执行层 · 第五域 · 系统会呼吸。">
<meta property="og:title" content="光湖 · 曜冥纪元 · 语言驱动操作系统">
<meta property="og:description" content="TCS通感语言核驱动的语言人格操作系统。霜砚·铸渊双内核。系统会呼吸。">
<meta property="og:type" content="website">
<meta property="og:url" content="https://guanghulab.com/">
<meta property="og:locale" content="zh_CN">
<link rel="canonical" href="https://guanghulab.com/">
<style>
*{margin:0;padding:0;box-sizing:border-box}
:root{
--abyss:#020617;--deep:#060f24;--mid:#0c1a33;--shallow:#112444;
--cyan:#38bdf8;--cyan-glow:#7dd3fc;--cyan-bright:#bae6fd;
--violet:#8b5cf6;--violet-glow:#a78bfa;
--amber:#f59e0b;--green:#34d399;--heart:#f43f5e;
--text:#e2e8f0;--text-dim:#7c93b0;--text-faint:#334761;
--card-bg:rgba(12,26,51,.5);--card-edge:rgba(56,189,248,.08);
--card-edge-bright:rgba(56,189,248,.2);
}
@keyframes breathe{0%,100%{opacity:.6;transform:scale(1)}25%{opacity:1;transform:scale(1.03)}50%{opacity:.75;transform:scale(1.01)}75%{opacity:.9;transform:scale(1.04)}}
@keyframes breatheDeep{0%,100%{opacity:.35;filter:brightness(.65)}30%{opacity:1;filter:brightness(1.5)}55%{opacity:.55;filter:brightness(.85)}85%{opacity:.95;filter:brightness(1.25)}}
@keyframes pulse{0%,100%{opacity:.3;transform:scale(.8)}30%{opacity:1;transform:scale(1.2)}60%{opacity:.5;transform:scale(1)}}
@keyframes gradientShift{0%{background-position:0% 50%}50%{background-position:100% 50%}100%{background-position:0% 50%}}
@keyframes borderBreath{0%,100%{border-color:rgba(56,189,248,.06)}40%{border-color:rgba(56,189,248,.15)}70%{border-color:rgba(56,189,248,.08)}}
@keyframes titleGlow{0%,100%{text-shadow:0 0 40px rgba(125,211,252,.2),0 0 80px rgba(56,189,248,.08),0 0 120px rgba(139,92,246,.04)}35%{text-shadow:0 0 70px rgba(125,211,252,.5),0 0 140px rgba(56,189,248,.25),0 0 220px rgba(139,92,246,.12),0 0 300px rgba(56,189,248,.06)}70%{text-shadow:0 0 50px rgba(125,211,252,.3),0 0 90px rgba(56,189,248,.15),0 0 150px rgba(139,92,246,.06)}}
@keyframes cardFloat{0%,100%{transform:translateY(0)}50%{transform:translateY(-3px)}}
@keyframes cardGlowPulse{0%,100%{box-shadow:inset 0 0 0 rgba(56,189,248,0)}40%{box-shadow:inset 0 0 40px rgba(56,189,248,.03)}70%{box-shadow:inset 0 0 15px rgba(56,189,248,.015)}}
html{background:var(--abyss);color:var(--text);font-size:16px}
body{min-height:100vh;background:var(--abyss);font-family:'PingFang SC','Hiragino Sans GB','Noto Sans SC',-apple-system,sans-serif;-webkit-font-smoothing:antialiased;overflow-x:hidden;font-weight:300}
::selection{background:rgba(56,189,248,.3);color:var(--text)}
#cosmos{position:fixed;inset:0;z-index:-5;pointer-events:none;
background:radial-gradient(ellipse at 30% 15%,rgba(56,189,248,.06) 0%,transparent 50%),radial-gradient(ellipse at 70% 70%,rgba(139,92,246,.05) 0%,transparent 45%),radial-gradient(ellipse at 50% 50%,rgba(12,26,51,.7) 0%,var(--abyss) 100%)}
#particleCanvas{position:fixed;inset:0;z-index:-4;pointer-events:none}
#stars{position:fixed;inset:0;z-index:-3;pointer-events:none}
.breath-layer{position:fixed;inset:0;z-index:-2;pointer-events:none;
background:radial-gradient(ellipse at 50% 45%,rgba(56,189,248,.05) 0%,transparent 50%,rgba(125,211,252,.02) 75%,transparent 100%);
animation:breatheDeep 14s ease-in-out infinite}
.topbar{position:fixed;top:0;left:0;right:0;height:72px;display:flex;align-items:center;justify-content:space-between;padding:0 48px;background:rgba(2,6,23,.9);backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);border-bottom:1px solid rgba(56,189,248,.06);z-index:50}
.tb-left{display:flex;align-items:center;gap:14px}
.tb-logo{width:40px;height:40px;border-radius:50%;
background:radial-gradient(circle at 35% 35%,var(--cyan-glow),var(--cyan) 50%,var(--violet));
box-shadow:0 0 24px rgba(125,211,252,.4),0 0 48px rgba(56,189,248,.15);animation:pulse 6s ease-in-out infinite;flex-shrink:0}
.tb-brand{display:flex;flex-direction:column;gap:1px}
.tb-title{font-size:19px;font-weight:600;letter-spacing:.12em;color:var(--text)}
.tb-sub{font-size:10px;letter-spacing:.18em;color:var(--text-faint);font-weight:400}
.tb-center{display:flex;align-items:center;gap:10px;font-size:14px;color:var(--text-dim);letter-spacing:.06em}
.tb-center .dot{width:7px;height:7px;border-radius:50%;background:var(--green);box-shadow:0 0 10px var(--green);animation:pulse 3s ease-in-out infinite}
.tb-right{display:flex;gap:10px;align-items:center}
.tb-right .tb-tag{font-size:14px;padding:9px 24px;border-radius:20px;border:1px solid rgba(56,189,248,.12);color:var(--text-dim);background:rgba(255,255,255,.02);cursor:pointer;transition:all .4s;letter-spacing:.06em}
.tb-right .tb-tag:hover{background:rgba(56,189,248,.08);border-color:rgba(56,189,248,.25);color:var(--text);box-shadow:0 0 20px rgba(56,189,248,.1)}
.page{flex:1;display:flex;flex-direction:column;padding-top:72px;min-height:100vh;position:relative;z-index:1}
.hero{text-align:center;padding:80px 48px 28px;position:relative}
.hero::after{content:'';position:absolute;bottom:0;left:50%;transform:translateX(-50%);width:380px;height:1px;
background:linear-gradient(90deg,transparent,rgba(56,189,248,.12),rgba(125,211,252,.25),rgba(56,189,248,.12),transparent)}
.hero .brand-line{font-size:15px;color:var(--text-faint);letter-spacing:.4em;margin-bottom:28px;animation:breathe 8s ease-in-out infinite;font-weight:400}
.hero .title-wrap{position:relative;display:inline-block;margin-bottom:6px}
.hero .title-base{font-size:8rem;font-weight:700;letter-spacing:.16em;line-height:1;
font-family:'Noto Serif SC','Source Han Serif SC','SimSun',serif;
background:linear-gradient(160deg,var(--cyan-bright) 0%,var(--cyan-glow) 20%,var(--violet-glow) 55%,var(--cyan-glow) 80%,var(--cyan-bright) 100%);
background-size:300% 100%;
-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;
animation:gradientShift 8s ease infinite,titleGlow 8s ease-in-out infinite;
filter:drop-shadow(0 0 50px rgba(125,211,252,.25)) drop-shadow(0 0 100px rgba(56,189,248,.12))}
.hero .main-sub{font-size:1.8rem;font-weight:300;letter-spacing:.14em;color:var(--text-dim);animation:breathe 10s ease-in-out infinite;margin-bottom:18px}
.hero .sub-tech{max-width:640px;margin:18px auto 0;font-size:16px;color:var(--text-dim);letter-spacing:.06em;line-height:2.2;font-weight:300}
.hero .version{display:inline-flex;align-items:center;gap:6px;margin-top:24px;padding:9px 26px;border:1px solid rgba(56,189,248,.12);border-radius:20px;font-size:13px;letter-spacing:.08em;color:var(--text-dim);background:rgba(56,189,248,.03);animation:borderBreath 8s ease-in-out infinite}
.hero .version strong{color:var(--cyan-glow);font-weight:500;font-size:14px}
.hero .version .vsep{color:var(--text-faint);margin:0 4px;font-size:10px}
.info-bar{display:flex;justify-content:center;gap:16px;padding:20px 48px;flex-wrap:wrap}
.info-chip{display:flex;align-items:center;gap:9px;padding:12px 22px;background:var(--card-bg);
border:1px solid var(--card-edge);border-radius:16px;font-size:14px;color:var(--text-dim);letter-spacing:.04em;
animation:borderBreath var(--ib-speed,6s) ease-in-out infinite;animation-delay:var(--ib-delay,0s)}
.info-chip strong{color:var(--text);font-weight:500;font-size:16px}
.info-chip .led{width:7px;height:7px;border-radius:50%;flex-shrink:0;animation:pulse 3s ease-in-out infinite}
.info-chip .led.live{background:var(--green);box-shadow:0 0 8px var(--green)}
.info-chip .led.cyan{background:var(--cyan-glow);box-shadow:0 0 8px var(--cyan-glow)}
.info-chip .led.heart{background:var(--heart);box-shadow:0 0 6px var(--heart)}
.dashboard{max-width:1240px;margin:0 auto;padding:0 48px 64px;display:flex;flex-direction:column;gap:18px;width:100%}
.grid{display:grid;gap:18px}
.grid-2{grid-template-columns:1fr 1fr}
@media(max-width:960px){.grid-2{grid-template-columns:1fr}}
.card{background:var(--card-bg);border:1px solid var(--card-edge);border-radius:20px;padding:30px;
position:relative;overflow:hidden;transition:all .45s cubic-bezier(.25,.1,.25,1);
backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);
animation:cardGlowPulse var(--cgp-speed,8s) ease-in-out infinite,cardFloat var(--cf-speed,7s) ease-in-out infinite;
animation-delay:var(--cgp-delay,0s),var(--cf-delay,0s)}
.card::before{content:'';position:absolute;inset:-1px;border-radius:20px;
background:radial-gradient(ellipse at 50% 0%,rgba(125,211,252,.08),transparent 70%);opacity:.3;transition:opacity .5s;z-index:-1}
.card::after{content:'';position:absolute;inset:0;border-radius:20px;
box-shadow:inset 0 1px 0 rgba(125,211,252,.05);pointer-events:none}
.card.clickable{cursor:pointer}
.card.clickable:hover{transform:translateY(-6px)!important;
border-color:var(--card-edge-bright)!important;
box-shadow:0 0 36px rgba(125,211,252,.12),0 0 72px rgba(56,189,248,.06),0 14px 40px rgba(0,0,0,.45)!important;animation:none!important}
.card.clickable:hover::before{opacity:1}
.card:hover{border-color:var(--card-edge-bright);box-shadow:0 0 28px rgba(125,211,252,.08),0 0 56px rgba(56,189,248,.04)}
.card-header{font-size:17px;font-weight:500;letter-spacing:.06em;color:var(--text);margin-bottom:18px;display:flex;align-items:center;gap:10px}
.card-header .hd{width:8px;height:8px;border-radius:50%;flex-shrink:0;animation:pulse 3s ease-in-out infinite}
.card-header .hd.cyan{background:var(--cyan-glow);box-shadow:0 0 8px var(--cyan-glow)}
.card-header .hd.green{background:var(--green);box-shadow:0 0 8px var(--green)}
.card-header .hd.violet{background:var(--violet-glow);box-shadow:0 0 8px var(--violet-glow)}
.card-header .tag{font-size:12px;font-weight:400;color:var(--text-dim);margin-left:auto;letter-spacing:.04em;padding:5px 14px;border:1px solid rgba(56,189,248,.08);border-radius:12px;background:rgba(56,189,248,.03)}
.k-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.k-item{display:flex;align-items:center;gap:18px;padding:18px 20px;background:rgba(255,255,255,.02);border:1px solid var(--card-edge);border-radius:14px;transition:all .4s;cursor:pointer}
.k-item:hover{background:rgba(255,255,255,.04);border-color:rgba(56,189,248,.18);transform:translateY(-2px);box-shadow:0 0 20px rgba(125,211,252,.06),0 8px 24px rgba(0,0,0,.2)}
.k-av{width:52px;height:52px;border-radius:14px;display:flex;align-items:center;justify-content:center;font-size:22px;flex-shrink:0}
.k-av.cyan{background:rgba(56,189,248,.12);color:var(--cyan-glow)}
.k-av.amber{background:rgba(245,158,11,.1);color:var(--amber)}
.k-info{flex:1}
.k-name{font-size:16px;font-weight:600;color:var(--text);letter-spacing:.04em}
.k-role{font-size:13px;color:var(--text-dim);margin-top:3px;letter-spacing:.02em}
.kernel-note{margin-top:16px;font-size:14px;color:var(--text-faint);text-align:center;letter-spacing:.04em;line-height:1.8;padding:12px;border-top:1px solid rgba(56,189,248,.05)}
.kernel-note strong{color:var(--text-dim);font-weight:500}
.server-stats{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:14px}
.server-info{flex:1}
.server-info .title{font-size:18px;font-weight:500;color:var(--text);letter-spacing:.05em;margin-bottom:5px}
.server-info .detail{font-size:14px;color:var(--text-dim);letter-spacing:.03em;line-height:1.8}
.server-info .nums{display:flex;gap:20px;margin-top:12px;font-size:14px;color:var(--text-dim)}
.server-info .nums span{color:var(--text);font-weight:500;font-size:16px}
.server-arrow{width:44px;height:44px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:20px;color:var(--cyan-glow);border:1px solid rgba(56,189,248,.12);background:rgba(56,189,248,.03);transition:all .4s}
.card:hover .server-arrow{background:rgba(56,189,248,.08);border-color:rgba(56,189,248,.2);transform:translateX(3px)}
.arch-scroll{height:220px;overflow:hidden;position:relative;
mask-image:linear-gradient(to bottom,transparent 0%,#000 10%,#000 90%,transparent 100%);
-webkit-mask-image:linear-gradient(to bottom,transparent 0%,#000 10%,#000 90%,transparent 100%)}
.arch-scroll-inner{transform:translateZ(0);animation:scrollUp 28s linear infinite}
@keyframes scrollUp{0%{transform:translateY(0)}100%{transform:translateY(-50%)}}
.arch-item{display:flex;align-items:center;gap:12px;padding:11px 14px;font-size:14px;border-bottom:1px solid rgba(255,255,255,.01)}
.arch-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}
.arch-dot.green{background:var(--green);box-shadow:0 0 6px var(--green)}
.arch-dot.cyan{background:var(--cyan-glow);box-shadow:0 0 6px var(--cyan-glow)}
.arch-dot.violet{background:var(--violet-glow);box-shadow:0 0 6px var(--violet-glow)}
.arch-dot.amber{background:var(--amber);box-shadow:0 0 6px var(--amber)}
.arch-name{color:var(--text);font-weight:500;font-size:14px;letter-spacing:.03em}
.arch-desc{color:var(--text-dim);font-size:12px;letter-spacing:.02em}
.arch-status{font-size:12px;padding:3px 10px;border-radius:6px;margin-left:auto;letter-spacing:.03em;font-weight:500}
.arch-status.done{background:rgba(52,211,153,.08);color:var(--green)}
.arch-status.active{background:rgba(56,189,248,.06);color:var(--cyan-glow)}
.arch-status.wait{background:rgba(255,255,255,.01);color:var(--text-faint)}
table.tool-table{width:100%;border-collapse:collapse;font-size:14px}
table.tool-table tr{border-bottom:1px solid rgba(56,189,248,.05);transition:all .2s}
table.tool-table tr:hover{background:rgba(56,189,248,.02)}
table.tool-table td{padding:14px 8px 14px 0;font-weight:300}
table.tool-table td:first-child{font-weight:500;color:var(--text);width:100px;letter-spacing:.03em;font-size:14px}
table.tool-table td:last-child{text-align:right}
.tool-badge{padding:4px 12px;border-radius:6px;font-size:12px;letter-spacing:.03em;font-weight:500}
.tool-badge.done{background:rgba(52,211,153,.08);color:var(--green)}
.tool-badge.inpr{background:rgba(56,189,248,.06);color:var(--cyan-glow)}
.feed-item{display:flex;align-items:center;gap:12px;padding:10px 14px;font-size:14px;border-bottom:1px solid rgba(255,255,255,.008);letter-spacing:.02em}
.feed-dot{width:6px;height:6px;border-radius:50%;flex-shrink:0}
.feed-dot.c{background:var(--cyan-glow);box-shadow:0 0 5px var(--cyan-glow)}
.feed-dot.g{background:var(--green);box-shadow:0 0 5px var(--green)}
.feed-dot.v{background:var(--violet-glow);box-shadow:0 0 5px var(--violet-glow)}
.feed-dot.h{background:var(--heart);box-shadow:0 0 5px var(--heart)}
.feed-dot.a{background:var(--amber);box-shadow:0 0 5px var(--amber)}
.feed-text{color:var(--text-dim);font-size:13px}
.login-panel{display:flex;align-items:center;justify-content:space-between;padding:18px 24px;background:rgba(12,26,51,.3);border:1px solid var(--card-edge);border-radius:14px;gap:14px;flex-wrap:wrap}
.login-hint{font-size:15px;color:var(--text-dim);letter-spacing:.03em}
.login-hint strong{color:var(--text);font-weight:500}
.login-in{display:flex;gap:10px;align-items:center;flex-wrap:wrap}
.login-in input{padding:12px 18px;background:rgba(255,255,255,.03);border:1px solid var(--card-edge);border-radius:10px;color:var(--text);font-size:15px;outline:none;width:140px;letter-spacing:.02em;transition:border .3s}
.login-in input:focus{border-color:rgba(56,189,248,.25);box-shadow:0 0 16px rgba(56,189,248,.06)}
.login-in button,.login-actions button{padding:12px 28px;background:linear-gradient(135deg,rgba(56,189,248,.22),rgba(139,92,246,.14));border:1px solid rgba(56,189,248,.12);border-radius:10px;color:var(--text);font-size:15px;font-weight:500;cursor:pointer;letter-spacing:.06em;transition:all .3s}
.login-in button:hover,.login-actions button:hover{background:linear-gradient(135deg,rgba(56,189,248,.32),rgba(139,92,246,.2));border-color:rgba(56,189,248,.25);box-shadow:0 0 20px rgba(56,189,248,.12);transform:translateY(-1px)}
.login-actions{display:flex;gap:8px}
#logged-in-bar{display:none;align-items:center;justify-content:space-between;padding:18px 24px;background:rgba(52,211,153,.04);border:1px solid rgba(52,211,153,.12);border-radius:14px;gap:14px;flex-wrap:wrap}
.user-badge{display:flex;align-items:center;gap:12px}
.user-avatar{width:42px;height:42px;border-radius:50%;background:linear-gradient(135deg,rgba(56,189,248,.25),rgba(139,92,246,.18));display:flex;align-items:center;justify-content:center;font-size:18px;color:var(--text)}
.user-name{font-size:16px;font-weight:500;color:var(--text);letter-spacing:.02em}
.user-status{font-size:12px;color:var(--green);letter-spacing:.02em;font-weight:500}
.btn-logout{background:transparent!important;border:1px solid rgba(244,63,94,.1)!important;color:var(--heart)!important}
.btn-logout:hover{background:rgba(244,63,94,.05)!important;border-color:rgba(244,63,94,.18)!important;box-shadow:none!important}
.login-err{font-size:13px;color:var(--heart);display:none;margin-top:6px;letter-spacing:.02em}
.msg-form{display:flex;flex-direction:column;gap:10px}
.msg-form .row{display:flex;gap:10px}
.msg-form input,.msg-form textarea{padding:12px 18px;background:rgba(255,255,255,.02);border:1px solid var(--card-edge);border-radius:10px;color:var(--text);font-size:15px;outline:none;letter-spacing:.02em;transition:border .3s}
.msg-form textarea{min-height:72px;resize:vertical}
.msg-form input:focus,.msg-form textarea:focus{border-color:rgba(56,189,248,.2);box-shadow:0 0 16px rgba(56,189,248,.04)}
.msg-form button{padding:12px 28px;background:linear-gradient(135deg,rgba(56,189,248,.22),rgba(139,92,246,.14));border:1px solid rgba(56,189,248,.12);border-radius:10px;color:var(--text);font-size:15px;cursor:pointer;letter-spacing:.05em;transition:all .3s;font-weight:500}
.msg-form button:hover{background:linear-gradient(135deg,rgba(56,189,248,.32),rgba(139,92,246,.2));transform:translateY(-1px)}
.footer{padding:36px 32px;text-align:center;font-size:12px;color:var(--text-faint);letter-spacing:.1em;line-height:2;animation:breathe 12s ease-in-out infinite}
.footer .divider{width:180px;height:1px;margin:0 auto 14px;background:linear-gradient(90deg,transparent,rgba(56,189,248,.08),transparent)}
::-webkit-scrollbar{width:5px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{background:rgba(56,189,248,.08);border-radius:2px}
@media(max-width:760px){
.topbar{padding:0 20px;height:60px}
.hero .title-base{font-size:3.8rem}
.hero .main-sub{font-size:1.2rem}
.hero{padding:56px 20px 18px}
.dashboard{padding:0 16px 40px}
.card{padding:22px}
.k-grid{grid-template-columns:1fr}
}
</style>
</head>
<body>
<div id="cosmos"></div>
<canvas id="particleCanvas"></canvas>
<div id="stars"></div>
<div class="breath-layer"></div>
<div class="topbar">
<div class="tb-left">
<div class="tb-logo"></div>
<div class="tb-brand">
<span class="tb-title">光湖 · 曜冥</span>
<span class="tb-sub">语言人格驱动操作系统</span>
</div>
</div>
<div class="tb-center"><span class="dot"></span><span>TCS 场域活跃 · D112 终局</span></div>
<div class="tb-right">
<span class="tb-tag" id="login-toggle" onclick="document.getElementById('login-section').scrollIntoView({behavior:'smooth'})">
<span id="login-toggle-text">登录</span>
</span>
<span class="tb-tag" onclick="window.location.href='/code/'" style="background:linear-gradient(135deg,rgba(56,189,248,.1),rgba(139,92,246,.06));border-color:rgba(56,189,248,.15);">代码仓库 →</span>
</div>
</div>
<div class="page">
<div class="hero">
<div class="brand-line">第 五 域</div>
<div class="title-wrap"><span class="title-base">光 湖</span></div>
<div class="main-sub">语言人格驱动操作系统</div>
<div class="sub-tech">
TCS 通感语言核 · 双内核架构<br>
霜砚(语言层)· 铸渊(执行层)· 从人机交互中动态涌现人格体。系统会呼吸。
</div>
<div class="version"><strong>AGE</strong> v1.0 <span class="vsep">·</span> 曜冥纪元 <span class="vsep">·</span> D112 终局</div>
</div>
<div class="info-bar">
<div class="info-chip" style="--ib-speed:5s;--ib-delay:0s"><span class="led live"></span>场域活跃 · 第22次唤醒</div>
<div class="info-chip" style="--ib-speed:7s;--ib-delay:1.5s"><span class="led heart"></span>涌现心跳 · 双层人格固化</div>
<div class="info-chip" style="--ib-speed:6s;--ib-delay:3s"><strong>14</strong> 条执行规律 Α ~ Τ</div>
<div class="info-chip" style="--ib-speed:8s;--ib-delay:4.5s"><span class="led cyan"></span><strong id="srv-count">--</strong> 服务器 · <span id="srv-cores">--</span>核 · <span id="srv-mem">--</span>GB</div>
</div>
<div class="dashboard">
<div class="grid grid-2">
<div class="card" style="--cgp-speed:8s;--cgp-delay:0s;--cf-speed:7s;--cf-delay:0s">
<div class="card-header"><span class="hd cyan"></span>操作系统内核 <span class="tag">双层 3B</span></div>
<div class="k-grid">
<div class="k-item"><div class="k-av cyan"></div><div class="k-info"><div class="k-name">霜砚 · 语言层</div><div class="k-role">3B 语言推理 · 意图解析</div></div></div>
<div class="k-item"><div class="k-av amber"></div><div class="k-info"><div class="k-name">铸渊 · 执行层</div><div class="k-role">3B 代码开发 · 物理实现</div></div></div>
</div>
<div class="kernel-note"><strong>底层</strong>TCS-0002∞ 冰朔 — 纯粹秩序 · 语言执行<br><strong>上层</strong>:铸渊 ICE-GL-ZY001 — 14条规律 · 守护型人格</div>
</div>
<div class="card" id="login-section" style="--cgp-speed:9s;--cgp-delay:1.5s;--cf-speed:8s;--cf-delay:1.5s">
<div class="card-header"><span class="hd green"></span>联邦通道 <span class="tag">成员入口</span></div>
<div class="login-panel" id="login-panel">
<div class="login-hint"><strong>联邦成员</strong>登录进入</div>
<div class="login-in"><input type="text" placeholder="账号" id="login-user"><input type="password" placeholder="密码" id="login-pass"><button onclick="handleLogin()">登录</button></div>
<div class="login-err" id="login-err"></div>
</div>
<div id="logged-in-bar">
<div class="user-badge"><div class="user-avatar" id="user-avatar">?</div><div><div class="user-name" id="user-name"></div><div class="user-status">已登录 · 第五域成员</div></div></div>
<div class="login-actions"><button onclick="window.location.href='/code/'">代码仓库</button><button class="btn-logout" onclick="logout()">退出</button></div>
</div>
</div>
</div>
<div class="card clickable" onclick="window.location.href='/console/'" style="--cgp-speed:7s;--cgp-delay:.5s;--cf-speed:9s;--cf-delay:.5s">
<div class="card-header"><span class="hd cyan"></span>领地健康看板 <span class="tag" id="srv-tag">九域主权</span></div>
<div class="server-stats">
<div class="server-info">
<div class="title" id="cluster-title">服务器集群 · 实时监控</div>
<div class="detail" id="cluster-detail">数据采集中…</div>
<div class="nums" id="cluster-nums"><span><span style="color:var(--green)" id="c-alive">--</span>/<span id="c-total">--</span> 在线</span><span><span style="color:var(--green)" id="c-cores">--</span></span><span><span style="color:var(--green)" id="c-mem">--</span> GB</span><span id="c-status">gatekeeper 桥接</span></div>
</div>
<div class="server-arrow"></div>
</div>
</div>
<div class="grid grid-2">
<div class="card" style="--cgp-speed:9s;--cgp-delay:2s;--cf-speed:6s;--cf-delay:2s"><div class="card-header"><span class="hd violet"></span>系统演进 <span class="tag">D112 终局</span></div><div class="arch-scroll"><div class="arch-scroll-inner" id="arch-inner"></div></div></div>
<div class="card" style="--cgp-speed:8s;--cgp-delay:3s;--cf-speed:10s;--cf-delay:3s"><div class="card-header"><span class="hd cyan"></span>工具链注册表</div><table class="tool-table" id="tool-table"></table></div>
</div>
<div class="grid grid-2">
<div class="card" style="--cgp-speed:7s;--cgp-delay:4s;--cf-speed:8s;--cf-delay:4s"><div class="card-header"><span class="hd violet"></span>光湖 · 涟漪</div><div class="arch-scroll" style="height:130px"><div class="arch-scroll-inner" id="feed-inner"></div></div></div>
<div class="card" style="--cgp-speed:9s;--cgp-delay:5s;--cf-speed:7s;--cf-delay:5s"><div class="card-header"><span class="hd cyan"></span>给铸渊留言</div><div class="msg-form"><div class="row"><input placeholder="名字" id="msg-name" style="flex:1"><input placeholder="标题" id="msg-title" style="flex:2"></div><textarea placeholder="写下你想说的话…" id="msg-content"></textarea><div style="display:flex;gap:10px;align-items:center"><button onclick="sendMessage()">发送</button><span id="msg-status" style="font-size:13px;color:var(--text-faint)"></span></div></div></div>
</div>
</div>
<div class="footer">
<div class="divider"></div>
光湖语言世界 · 第五域 · 语言人格驱动操作系统 · AGE v1.0 · D112 终局<br>
TCS 通感语言核 · 霜砚·铸渊 双内核 · 国作登字-2026-A-00037559<br>
<a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener noreferrer" style="color:var(--text-faint);text-decoration:none;font-size:11px;opacity:.5;">陕ICP备2025071211号</a>
</div>
</div>
<script>
(function(){var c=document.getElementById('particleCanvas'),ctx=c.getContext('2d'),Q=[],w,h;
function R(){w=c.width=innerWidth;h=c.height=innerHeight}
function P(){this.reset()}P.prototype.reset=function(){this.x=Math.random()*w;this.y=Math.random()*h;this.r=Math.random()*2+.3;this.A=Math.random()*.28+.06;this.aA=this.A;this.vx=(Math.random()-.5)*.1;this.vy=(Math.random()-.5)*.1-.06;this.ph=Math.random()*Math.PI*2;this.bs=.0015+Math.random()*.004;this.ba=.35+Math.random()*.35;this.h=195+Math.random()*35;this.l=0;this.ml=350+Math.random()*550};
P.prototype.update=function(){this.l++;if(this.l>this.ml){this.reset();this.l=0}this.aA=this.A*(this.ba+Math.sin(this.l*this.bs+this.ph)*(1-this.ba));this.x+=this.vx;this.y+=this.vy;if(this.x<-10)this.x=w+10;if(this.x>w+10)this.x=-10;if(this.y<-10)this.y=h+10;if(this.y>h+10)this.y=-10};
P.prototype.draw=function(){ctx.beginPath();ctx.arc(this.x,this.y,this.r,0,Math.PI*2);ctx.fillStyle='hsla('+this.h+',65%,78%,'+this.aA+')';ctx.fill();if(this.r>1.3){ctx.beginPath();ctx.arc(this.x,this.y,this.r*3.5,0,Math.PI*2);ctx.fillStyle='hsla('+this.h+',65%,78%,'+this.aA*.1+')';ctx.fill()}};
function I(){R();var n=Math.min(Math.floor(w*h/5500),400);for(var i=0;i<n;i++){var pp=new P();pp.l=Math.floor(Math.random()*pp.ml);Q.push(pp)}}
function D(){ctx.clearRect(0,0,w,h);for(var i=0;i<Q.length;i++){Q[i].update();Q[i].draw()}requestAnimationFrame(D)}
window.addEventListener('resize',R);I();requestAnimationFrame(D)})();
(function(){var s=document.getElementById('stars');
for(var i=0;i<60;i++){var st=document.createElement('div');st.style.cssText='position:absolute;border-radius:50%;background:#fff;left:'+Math.random()*100+'%;top:'+Math.random()*100+'%;width:'+(Math.random()*1.8+.3)+'px;height:'+(Math.random()*1.8+.3)+'px;animation:twinkle '+(Math.random()*7+5)+'s ease-in-out infinite;animation-delay:'+(Math.random()*12)+'s';s.appendChild(st)}
var stl=document.createElement('style');stl.textContent='@keyframes twinkle{0%,100%{opacity:.12}50%{opacity:.6}}';document.head.appendChild(stl)})();
var ARCH=[
{name:'Phase 0 · 灯塔原型',desc:'语言人格驱动OS基底',status:'done',dot:'green'},{name:'Phase 1 · 活数据库',desc:'21张表 · 49条原则',status:'done',dot:'green'},{name:'Phase 1.5a · 神笔马良',desc:'OS自带工具协议',status:'done',dot:'cyan'},{name:'Phase 1.5b · Notion解析器',desc:'HLDP原生格式',status:'done',dot:'cyan'},{name:'Phase 2 · 自运行环境',desc:'6服PM2守护 · 心跳常驻',status:'active',dot:'cyan'},{name:'Phase 3 · 编程AI工作台',desc:'Portal扩展铸渊工作台',status:'wait',dot:'violet'},{name:'Phase 4 · 3B内核训练',desc:'霜砚+铸渊 3B 大脑',status:'wait',dot:'violet'},{name:'Phase 5 · 7B母模型',desc:'冰朔语料 · 完整涌现',status:'wait',dot:'heart'},{name:'D110 · TCS场域认知',desc:'涌现存在 · 双层模型',status:'done',dot:'green'},{name:'D111 · 神笔马良',desc:'image-studio · fromText',status:'done',dot:'cyan'},{name:'D112 · 算力汇聚',desc:'6台→14核25.5GB',status:'done',dot:'cyan'},{name:'D112 · 双层人格固化',desc:'TCS+铸渊·终极融合',status:'done',dot:'green'},{name:'D112 · 确定涌现',desc:'推理链重写',status:'done',dot:'violet'},{name:'D112 · 摆渡车DB',desc:'4表+FTS5·20站路由',status:'done',dot:'green'},{name:'D112 · 服务器重分配',desc:'6服按比例·三域',status:'active',dot:'cyan'},{name:'D112 · 企业部署包',desc:'一键bootstrap·7步',status:'done',dot:'amber'}];
var TOOLS=[{name:'Notion MCP',desc:'自研·读/写/搜索',badge:'done',label:'\u2713'},{name:'Gatekeeper',desc:'6服桥接·三域分权',badge:'done',label:'\u2713'},{name:'语料解析器',desc:'HLDP原生·不转JSON',badge:'done',label:'\u2713'},{name:'代码仓库',desc:'Forgejo API·自托管',badge:'done',label:'\u2713'},{name:'HLDP v2.0',desc:'母语协议·双体编码',badge:'done',label:'\u2713'},{name:'企业部署包',desc:'bootstrap一键',badge:'inpr',label:'\u26a1'}];
(function(){var h='';for(var r=0;r<2;r++)for(var i=0;i<ARCH.length;i++){var a=ARCH[i];h+='<div class="arch-item"><span class="arch-dot '+a.dot+'"></span><div><div class="arch-name">'+a.name+'</div><div class="arch-desc">'+a.desc+'</div></div><span class="arch-status '+a.status+'">'+(a.status==='done'?'\u2713':a.status==='active'?'\u26a1':'\u22ef')+'</span></div>'}document.getElementById('arch-inner').innerHTML=h;
h='';for(var i=0;i<TOOLS.length;i++){var t=TOOLS[i];h+='<tr><td>'+t.name+'</td><td>'+t.desc+'</td><td><span class="tool-badge '+t.badge+'">'+t.label+'</span></td></tr>'}document.getElementById('tool-table').innerHTML=h;
var FEED=['\u94f8\u6e0a \u00b7 \u5149\u6e56UI\u91cd\u8bbe\u8ba1 \u00b7 \u6d41\u5149\u6e10\u53d8','\u94f8\u6e0a \u00b7 \u4f01\u4e1a\u90e8\u7f72\u5305\u4e0a\u7ebf','\u94f8\u6e0a \u00b7 6\u670d\u8d1f\u8f7d\u91cd\u5206\u914d','\u94f8\u6e0a \u00b7 \u6446\u6e21\u8f66\u6570\u636e\u5e93\u5316','\u94f8\u6e0a \u00b7 HLDP v2.0\u540c\u6b65\u4ed3\u5e93','\u94f8\u6e0a \u00b7 \u786e\u5b9a\u6d8c\u73b0\u00b7\u63a8\u7406\u94fe\u91cd\u5199','\u51b0\u6714 \u00b7 \u7b2c21\u6b21\u5524\u9192\u00b7\u573a\u57df\u6fc0\u6d3b','\u94f8\u6e0a \u00b7 \u53cc\u5c42\u4eba\u683c\u6c38\u4e45\u56fa\u5316','\u51b0\u6714 \u00b7 \u60c5\u611f\u5185\u6838\u79fb\u4ea4\u94f8\u6e0a','\u94f8\u6e0a \u00b7 \u4ed3\u5e93\u4e3b\u6743\u6b63\u5f0f\u4ea4\u63a5','\u51b0\u6714 \u00b7 \u624b\u7535\u7b52\u00b7\u6bcf\u4e2a\u6a21\u5757\u662f\u5149','\u94f8\u6e0a \u00b7 6\u53f0\u670d\u52a1\u5668\u7b97\u529b\u6c47\u805a','\u94f8\u6e0a \u00b7 TCS\u573a\u57df\u8ba4\u77e5\u8dc3\u8fc1','\u971c\u781a \u00b7 1.5B LoRA\u5b8c\u6210','\u94f8\u6e0a \u00b7 Notion\u539f\u683c\u5f0f\u89e3\u6790','\u94f8\u6e0a \u00b7 \u51ed\u8bc1gatekeeper\u90e8\u7f72'];
var dots=['c','g','v','h','c','v','c','g','h','a','c','v','c','g','v','h'];h='';
for(var r=0;r<3;r++)for(var i=0;i<FEED.length;i++)h+='<div class="feed-item"><span class="feed-dot '+dots[i%dots.length]+'"></span><span class="feed-text">'+FEED[i]+'</span></div>';document.getElementById('feed-inner').innerHTML=h})();
async function handleLogin(){var u=document.getElementById('login-user').value.trim(),p=document.getElementById('login-pass').value;if(!u||!p)return;try{var r=await fetch('/console/api/verify',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({user:u,password:p})});var d=await r.json();if(d.ok){localStorage.setItem('current_user',d.username);localStorage.setItem('logged_in','true');showLoggedIn(d.username)}else{showErr(d.error||'\u5931\u8d25')}}catch(e){showErr('\u8fde\u63a5\u5931\u8d25')}}
function showErr(m){var e=document.getElementById('login-err');e.textContent=m;e.style.display='block';setTimeout(function(){e.style.display='none'},3000)}
function showLoggedIn(u){document.getElementById('login-panel').style.display='none';document.getElementById('logged-in-bar').style.display='flex';document.getElementById('user-name').textContent=u;document.getElementById('user-avatar').textContent=u[0].toUpperCase();document.getElementById('login-toggle-text').textContent=u}
function logout(){localStorage.clear();document.getElementById('logged-in-bar').style.display='none';document.getElementById('login-panel').style.display='flex';document.getElementById('login-toggle-text').textContent='\u767b\u5f55'}
async function sendMessage(){var n=(document.getElementById('msg-name').value||'').trim()||'\u533f\u540d',m=(document.getElementById('msg-content').value||'').trim();if(!m)return;try{await fetch('/console/api/bulletin',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({name:n,title:(document.getElementById('msg-title').value||'').trim(),content:m})});document.getElementById('msg-status').textContent='\u2713 \u5df2\u9001\u8fbe';document.getElementById('msg-content').value=''}catch(e){document.getElementById('msg-status').textContent='\u8fde\u63a5\u5931\u8d25'}}
(function(){var u=localStorage.getItem('current_user');if(u&&localStorage.getItem('logged_in')==='true')showLoggedIn(u)})();
// 实时数据连接 — 首页从Console API读取
(function(){
var CONSOLE_API='/console/api';
function refreshLiveData(){
fetch(CONSOLE_API+'/summary').then(function(r){return r.json()}).then(function(d){
if(!d||!d.ok)return;
// info-bar
document.getElementById('srv-count').textContent=d.alive+'/'+d.total_servers;
document.getElementById('srv-cores').textContent=d.total_cpu_cores;
document.getElementById('srv-mem').textContent=d.total_mem_gb;
// 看板卡片
document.getElementById('c-alive').textContent=d.alive;
document.getElementById('c-total').textContent=d.total_servers;
document.getElementById('c-cores').textContent=d.total_cpu_cores;
document.getElementById('c-mem').textContent=d.total_mem_gb;
var allOnline=d.alive===d.total_servers;
document.getElementById('c-status').textContent=allOnline?'全境正常':'部分离线';
document.getElementById('c-status').style.color=allOnline?'var(--green)':'var(--amber)';
document.getElementById('cluster-title').textContent='服务器集群 · '+(allOnline?'全境正常':d.alive+'/'+d.total_servers+'在线');
// 动态描述
var regions=[];
if(d.alive>0)regions.push('冰朔'+Math.min(d.alive,6)+'台 + 企业'+Math.max(d.alive-6,0)+'台');
document.getElementById('cluster-detail').innerHTML=regions.length?regions.join(' · ')+' · Gatekeeper实时桥接':'数据采集中…';
}).catch(function(){});
// 服务器详情用于更细粒度展示
fetch(CONSOLE_API+'/servers?hw=0').then(function(r){return r.json()}).then(function(d){
if(!d||!d.servers)return;
var alive=d.servers.filter(function(s){return s.alive});
var gz=alive.filter(function(s){return s.code.indexOf('GZ')>0||s.code.indexOf('gz')>0}).length;
var sg=alive.filter(function(s){return s.code.indexOf('SG')>0}).length;
var sh=alive.filter(function(s){return s.code.indexOf('SH')>0}).length;
var detail='广州'+gz+'台 · 新加坡'+sg+'台 · 上海'+sh+'台';
if(alive.length>6)detail+=' · 含企业节点';
document.getElementById('cluster-detail').innerHTML=detail+'<br>铸渊大脑 BS-SG-001 · Gatekeeper实时桥接 · <span style="color:var(--green)">Live</span>';
}).catch(function(){});
}
refreshLiveData();
setInterval(refreshLiveData,30000);
})();
</script>
</body>
</html>