fix: sync PR #361 UI redesign to server/sites/portal and add auto-sync step in deploy workflow

Root cause: deploy-to-zhuyuan-server.yml uses server/sites/portal/ (not docs/) as the
frontend source for guanghulab.online. PR #361 only updated docs/index.html, so the
server never received the new UI.

Fix:
1. Copied docs/index.html → server/sites/portal/index.html (immediate fix)
2. Added '🔄 同步 docs → portal' step in deploy workflow to auto-sync
   docs/index.html to server/sites/portal/ before every deployment,
   preventing this desync from happening again.

Agent-Logs-Url: https://github.com/qinfendebingshuo/guanghulab/sessions/da023482-75f7-46b3-a921-548ce02a3a83

Co-authored-by: qinfendebingshuo <207279273+qinfendebingshuo@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot] 2026-04-12 10:52:43 +00:00 committed by GitHub
parent fe9c380db7
commit 41419ad8f5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 110 additions and 46 deletions

View File

@ -181,6 +181,16 @@ jobs:
server/age-os/package.json \
${{ secrets.ZY_SERVER_USER }}@${{ secrets.ZY_SERVER_HOST }}:/opt/age-os/
- name: 🔄 同步 docs → portal (单一数据源保障)
run: |
# docs/index.html 是 GitHub Pages 的数据源
# server/sites/portal/ 是服务器部署的数据源
# 自动同步确保两者一致,防止修改 docs/ 后服务器未更新
if [ -f "docs/index.html" ] && [ -d "server/sites/portal" ]; then
cp docs/index.html server/sites/portal/index.html
echo "✅ docs/index.html → server/sites/portal/index.html 已同步"
fi
- name: 🌐 同步前端内容到站点
run: |
# Push事件: 直接部署到 production (guanghulab.online = ZY_DOMAIN_MAIN = production)

View File

@ -8,7 +8,7 @@
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<title>光湖语言世界 · HoloLake</title>
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2280%22>🏛️</text></svg>">
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><defs><linearGradient id=%22g%22 x1=%220%22 y1=%220%22 x2=%221%22 y2=%221%22><stop offset=%220%25%22 stop-color=%22%238ab4f8%22/><stop offset=%22100%25%22 stop-color=%22%23a78bfa%22/></linearGradient></defs><rect rx=%2220%22 width=%22100%22 height=%22100%22 fill=%22%230a0a1a%22/><text x=%2250%22 y=%2264%22 text-anchor=%22middle%22 font-size=%2240%22 font-weight=%22900%22 font-family=%22monospace%22 fill=%22url(%23g)%22>GL</text></svg>">
<style>
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
@ -35,14 +35,14 @@ body{font-family:var(--f);background:var(--bg);color:var(--text);font-size:15px;
a{color:var(--accent);text-decoration:none}
::-webkit-scrollbar{width:4px}::-webkit-scrollbar-thumb{background:var(--muted);border-radius:2px}
/* ═══ Background: Galaxy Star Field ═══ */
/* ═══ Background: Deep Lake Night Sky ═══ */
.bg{position:fixed;inset:0;z-index:0;pointer-events:none;overflow:hidden}
#starCanvas{position:absolute;inset:0;width:100%;height:100%}
.nebula{position:absolute;border-radius:50%;filter:blur(120px);animation:nebPulse 12s ease-in-out infinite}
.nebula:nth-child(2){width:50vw;height:50vh;background:radial-gradient(ellipse,rgba(110,168,254,.06),transparent 70%);top:-10%;left:-10%}
.nebula:nth-child(3){width:45vw;height:45vh;background:radial-gradient(ellipse,rgba(167,139,250,.05),transparent 70%);bottom:-8%;right:-5%;animation-delay:6s}
.nebula:nth-child(4){width:35vw;height:35vh;background:radial-gradient(ellipse,rgba(196,181,253,.04),transparent 70%);top:40%;left:50%;animation-delay:3s}
@keyframes nebPulse{0%,100%{opacity:.6;transform:scale(1) translate(0,0)}50%{opacity:1;transform:scale(1.08) translate(10px,-8px)}}
.nebula{position:absolute;border-radius:50%;filter:blur(120px);animation:nebPulse 16s ease-in-out infinite}
.nebula:nth-child(2){width:50vw;height:50vh;background:radial-gradient(ellipse,rgba(138,180,248,.04),transparent 70%);top:-10%;left:-10%}
.nebula:nth-child(3){width:45vw;height:45vh;background:radial-gradient(ellipse,rgba(167,139,250,.035),transparent 70%);bottom:-8%;right:-5%;animation-delay:8s}
.nebula:nth-child(4){width:35vw;height:35vh;background:radial-gradient(ellipse,rgba(196,181,253,.03),transparent 70%);top:40%;left:50%;animation-delay:4s}
@keyframes nebPulse{0%,100%{opacity:.5;transform:scale(1) translate(0,0)}50%{opacity:.8;transform:scale(1.06) translate(6px,-5px)}}
/* ═══ 3D Page Flip Engine ═══ */
.pages{position:fixed;inset:0;z-index:1;perspective:1400px;overflow:hidden}
@ -727,7 +727,11 @@ label{display:block;font-size:12px;color:var(--dim);margin-bottom:4px;font-weigh
.hl-sidebar{width:280px;flex-shrink:0;display:flex;flex-direction:column;background:rgba(8,12,28,.95);border-right:1px solid rgba(100,100,200,.12);z-index:20;transition:transform .3s cubic-bezier(.4,0,.2,1)}
.hl-sidebar-header{display:flex;align-items:center;justify-content:space-between;padding:16px 16px 12px;border-bottom:1px solid rgba(100,100,200,.1)}
.hl-logo{display:flex;align-items:center;gap:10px}
.hl-logo-icon{font-size:24px;filter:drop-shadow(0 0 10px rgba(138,180,248,.4))}
.hl-logo-icon{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:8px;font-size:13px;font-weight:900;font-family:var(--m);background:linear-gradient(135deg,#8ab4f8,#a78bfa,#c4b5fd);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;animation:logoGlow 4s ease-in-out infinite;position:relative;letter-spacing:-1px}
.hl-logo-icon::before{content:'';position:absolute;inset:0;border-radius:8px;background:linear-gradient(135deg,rgba(138,180,248,.12),rgba(167,139,250,.12));border:1px solid rgba(138,180,248,.2);z-index:-1}
.hl-logo-icon::after{content:'';position:absolute;inset:-1px;border-radius:9px;background:linear-gradient(135deg,rgba(138,180,248,.25),rgba(167,139,250,.15),rgba(196,181,253,.25));z-index:-2;animation:logoBorderPulse 4s ease-in-out infinite;filter:blur(2px)}
@keyframes logoGlow{0%,100%{filter:drop-shadow(0 0 6px rgba(138,180,248,.3))}50%{filter:drop-shadow(0 0 14px rgba(138,180,248,.6))}}
@keyframes logoBorderPulse{0%,100%{opacity:.6}50%{opacity:1}}
.hl-logo-text{font-size:15px;font-weight:700;background:linear-gradient(135deg,#e0e0f0,#8ab4f8,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}
.hl-new-chat-btn{width:36px;height:36px;border-radius:10px;border:1px solid rgba(100,100,200,.2);background:transparent;color:var(--dim);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s}
.hl-new-chat-btn:hover{border-color:var(--accent);color:var(--accent);background:rgba(138,180,248,.08)}
@ -772,12 +776,16 @@ label{display:block;font-size:12px;color:var(--dim);margin-bottom:4px;font-weigh
/* ── Main Chat Area ── */
.hl-main{flex:1;display:flex;flex-direction:column;min-width:0;position:relative}
.hl-chat-header{display:flex;align-items:center;justify-content:space-between;padding:12px 20px;border-bottom:1px solid rgba(100,100,200,.1);background:rgba(8,12,28,.6);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);flex-shrink:0}
.hl-chat-persona{display:flex;align-items:center;gap:12px}
.hl-persona-avatar{width:42px;height:42px;border-radius:50%;background:linear-gradient(135deg,#34d399,#4ade80);display:flex;align-items:center;justify-content:center;font-size:20px;flex-shrink:0;box-shadow:0 0 20px rgba(52,211,153,.2)}
.hl-persona-name{font-size:15px;font-weight:700}
.hl-persona-sub{font-size:11px;color:var(--dim);margin-top:2px}
.hl-chat-status{font-size:11px;padding:4px 12px;background:rgba(52,211,153,.1);border:1px solid rgba(52,211,153,.2);border-radius:20px;color:var(--ok);font-family:var(--m);font-weight:600;flex-shrink:0}
.hl-chat-header{display:flex;align-items:center;justify-content:space-between;padding:10px 20px;border-bottom:1px solid rgba(100,100,200,.06);background:rgba(6,8,20,.5);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);flex-shrink:0}
.hl-chat-persona{display:flex;align-items:center;gap:10px}
.hl-persona-avatar{width:34px;height:34px;border-radius:10px;background:linear-gradient(135deg,rgba(10,14,30,.9),rgba(18,22,48,.8));border:1px solid rgba(138,180,248,.2);display:flex;align-items:center;justify-content:center;flex-shrink:0;box-shadow:0 0 12px rgba(138,180,248,.06);position:relative;overflow:hidden}
.hl-persona-avatar::before{content:'';position:absolute;inset:-1px;border-radius:11px;background:linear-gradient(135deg,rgba(138,180,248,.2),rgba(167,139,250,.15),rgba(196,181,253,.2));z-index:-1;animation:avatarBorder 6s ease-in-out infinite}
.hl-persona-avatar::after{content:'';position:absolute;inset:0;border-radius:10px;background:radial-gradient(circle at 30% 30%,rgba(138,180,248,.08),transparent 60%);pointer-events:none}
.hl-avatar-glyph{font-size:14px;font-weight:800;background:linear-gradient(135deg,#8ab4f8,#a78bfa,#c4b5fd);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;letter-spacing:0;position:relative;z-index:1}
@keyframes avatarBorder{0%,100%{opacity:.5}50%{opacity:1}}
.hl-persona-name{font-size:14px;font-weight:700;background:linear-gradient(135deg,#e0e0f0,#8ab4f8);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}
.hl-persona-sub{font-size:10px;color:var(--dim);margin-top:1px;letter-spacing:.3px}
.hl-chat-status{font-size:10px;padding:3px 10px;background:rgba(138,180,248,.06);border:1px solid rgba(138,180,248,.15);border-radius:20px;color:var(--accent);font-family:var(--m);font-weight:600;flex-shrink:0;letter-spacing:.5px}
@media(max-width:768px){
.hl-chat-header{padding:12px 16px 12px 60px}
.hl-persona-sub{display:none}
@ -788,19 +796,48 @@ label{display:block;font-size:12px;color:var(--dim);margin-bottom:4px;font-weigh
@media(max-width:768px){.hl-chat-messages{padding:16px 12px}}
/* Welcome screen */
.hl-welcome{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:60vh;text-align:center;animation:heroFadeUp .8s ease-out both;padding:20px}
.hl-welcome-icon{font-size:72px;margin-bottom:20px;filter:drop-shadow(0 0 30px rgba(138,180,248,.4));animation:uptimePulse 6s ease-in-out infinite}
.hl-welcome-title{font-size:clamp(28px,5vw,42px);font-weight:800;background:linear-gradient(135deg,#e0e0f0 0%,#8ab4f8 40%,#a78bfa 80%,#c4b5fd 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;margin-bottom:8px}
.hl-welcome-sub{font-size:clamp(13px,2.5vw,16px);color:var(--dim);margin-bottom:36px;letter-spacing:1px}
.hl-welcome-cards{display:grid;grid-template-columns:1fr 1fr;gap:12px;max-width:460px;width:100%;margin-bottom:32px}
@media(max-width:480px){.hl-welcome-cards{grid-template-columns:1fr;max-width:280px}}
.hl-wc{padding:16px 14px;background:rgba(18,18,42,.55);border:1px solid rgba(100,100,200,.22);border-radius:14px;cursor:pointer;transition:all .35s;text-align:left;display:flex;align-items:flex-start;gap:12px}
.hl-wc:hover{border-color:rgba(138,180,248,.4);box-shadow:0 0 24px rgba(138,180,248,.1);transform:translateY(-2px)}
.hl-welcome{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:60vh;text-align:center;animation:heroFadeUp .8s ease-out both;padding:20px;position:relative}
.hl-welcome-icon{position:relative;width:64px;height:64px;display:flex;align-items:center;justify-content:center;margin-bottom:28px}
.hl-welcome-icon-text{font-size:15px;font-weight:800;font-family:var(--m);background:linear-gradient(135deg,#c4b5fd 0%,#e0e0f0 50%,#8ab4f8 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;letter-spacing:1px;position:relative;z-index:2;animation:heroIconPulse 8s ease-in-out infinite}
@keyframes heroIconPulse{0%,100%{filter:drop-shadow(0 0 6px rgba(196,181,253,.3));transform:scale(1)}50%{filter:drop-shadow(0 0 16px rgba(196,181,253,.5));transform:scale(1.01)}}
.hl-welcome-icon::before{content:'';position:absolute;inset:0;border-radius:50%;background:conic-gradient(from 0deg,rgba(196,181,253,.08),rgba(138,180,248,.06),rgba(167,139,250,.08),rgba(224,224,240,.06),rgba(196,181,253,.08));animation:iconRingRotate 30s linear infinite;filter:blur(1px)}
.hl-welcome-icon::after{content:'';position:absolute;inset:3px;border-radius:50%;background:radial-gradient(circle,rgba(10,10,26,.95) 30%,rgba(10,10,26,.85) 60%,transparent);z-index:1}
/* Lake ripple effect on welcome icon */
.hl-welcome-icon .ripple-ring{position:absolute;border-radius:50%;border:1px solid rgba(196,181,253,.08);animation:lakeRipple 4s ease-out infinite;pointer-events:none}
.hl-welcome-icon .ripple-ring:nth-of-type(1){animation-delay:0s}
.hl-welcome-icon .ripple-ring:nth-of-type(2){animation-delay:1.3s}
.hl-welcome-icon .ripple-ring:nth-of-type(3){animation-delay:2.6s}
@keyframes lakeRipple{0%{inset:20px;opacity:.6}100%{inset:-30px;opacity:0}}
@keyframes iconRingRotate{to{transform:rotate(360deg)}}
.hl-welcome-title{font-size:clamp(24px,4.5vw,36px);font-weight:800;background:linear-gradient(135deg,#e0e0f0 0%,#c4b5fd 40%,#8ab4f8 80%,#e0e0f0 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;margin-bottom:6px;letter-spacing:2px;background-size:200% 200%;animation:titleShimmer 8s ease-in-out infinite}
@keyframes titleShimmer{0%,100%{background-position:0% 50%}50%{background-position:100% 50%}}
.hl-welcome-sub{font-size:clamp(11px,2vw,13px);color:var(--dim);margin-bottom:16px;letter-spacing:3px;font-weight:300;opacity:.7}
/* Tech intro section */
.hl-tech-intro{max-width:480px;margin-bottom:24px;animation:heroFadeUp .8s ease-out .2s both}
.hl-tech-tagline{font-size:clamp(9px,1.6vw,11px);color:rgba(196,181,253,.5);letter-spacing:4px;text-transform:uppercase;font-weight:500;margin-bottom:10px}
.hl-tech-desc{font-size:clamp(11px,1.8vw,13px);color:var(--dim);line-height:1.9;margin-bottom:14px;opacity:.8}
.hl-tech-layers{display:flex;flex-wrap:wrap;justify-content:center;gap:6px;margin-bottom:8px}
.hl-tech-layer{display:inline-flex;align-items:center;gap:4px;padding:3px 9px;background:transparent;border:1px solid rgba(100,100,200,.08);border-radius:20px;font-size:9px;color:rgba(128,144,184,.6);font-family:var(--m);transition:all .5s cubic-bezier(.4,0,.2,1);cursor:default;letter-spacing:.3px}
.hl-tech-layer:hover{border-color:rgba(138,180,248,.25);color:var(--accent);background:rgba(138,180,248,.04);transform:translateY(-2px);box-shadow:0 4px 16px rgba(138,180,248,.06)}
.hl-tech-layer .layer-dot{width:4px;height:4px;border-radius:50%;flex-shrink:0}
.hl-tech-layer:nth-child(1) .layer-dot{background:#c4b5fd;box-shadow:0 0 4px rgba(196,181,253,.4)}
.hl-tech-layer:nth-child(2) .layer-dot{background:#a78bfa;box-shadow:0 0 4px rgba(167,139,250,.4)}
.hl-tech-layer:nth-child(3) .layer-dot{background:#8ab4f8;box-shadow:0 0 4px rgba(138,180,248,.4)}
.hl-tech-layer:nth-child(4) .layer-dot{background:#93c5fd;box-shadow:0 0 4px rgba(147,197,253,.4)}
.hl-tech-layer:nth-child(5) .layer-dot{background:#a5b4fc;box-shadow:0 0 4px rgba(165,180,252,.4)}
.hl-tech-layer:nth-child(6) .layer-dot{background:#e0e0f0;box-shadow:0 0 4px rgba(224,224,240,.4)}
.hl-welcome-cards{display:grid;grid-template-columns:1fr 1fr;gap:8px;max-width:400px;width:100%;margin-bottom:24px;animation:heroFadeUp .8s ease-out .3s both}
@media(max-width:480px){.hl-welcome-cards{grid-template-columns:1fr;max-width:240px}}
.hl-wc{padding:12px 14px;background:rgba(10,12,28,.4);border:1px solid rgba(100,100,200,.1);border-radius:12px;cursor:pointer;transition:all .5s cubic-bezier(.4,0,.2,1);text-align:left;display:flex;align-items:center;gap:10px;position:relative;overflow:hidden;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}
.hl-wc::before{content:'';position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(196,181,253,.1),transparent);opacity:0;transition:opacity .5s}
.hl-wc:hover{border-color:rgba(138,180,248,.25);box-shadow:0 8px 32px rgba(10,10,30,.4),0 0 1px rgba(138,180,248,.15);transform:translateY(-2px)}
.hl-wc:hover::before{opacity:1}
.hl-wc:active{transform:scale(.98)}
.hl-wc-icon{font-size:22px;flex-shrink:0;margin-top:2px}
.hl-wc-text{font-size:13px;font-weight:600;line-height:1.5}
.hl-wc-text small{font-weight:400;color:var(--dim);font-size:11px}
.hl-welcome-dev{padding:12px 20px;background:rgba(18,18,42,.4);border:1px solid rgba(100,100,200,.15);border-radius:12px;font-size:12px;color:var(--dim)}
.hl-wc-icon{font-size:18px;flex-shrink:0;width:32px;height:32px;display:flex;align-items:center;justify-content:center;background:rgba(138,180,248,.04);border:1px solid rgba(100,100,200,.08);border-radius:8px;transition:all .5s}
.hl-wc:hover .hl-wc-icon{background:rgba(138,180,248,.08);border-color:rgba(138,180,248,.15)}
.hl-wc-text{font-size:12px;font-weight:600;line-height:1.4}
.hl-wc-text small{font-weight:400;color:rgba(128,144,184,.5);font-size:10px}
.hl-welcome-dev{padding:8px 16px;background:transparent;border:1px solid rgba(100,100,200,.08);border-radius:10px;font-size:11px;color:rgba(128,144,184,.4);animation:heroFadeUp .8s ease-out .4s both}
.hl-welcome-dev .tag{margin-left:6px}
/* Message bubbles (reuse cm classes) */
@ -819,15 +856,15 @@ label{display:block;font-size:12px;color:var(--dim);margin-bottom:4px;font-weigh
.hl-process-steps{font-size:12px;color:var(--accent);font-family:var(--m)}
/* ── Chat Input ── */
.hl-chat-input-wrap{padding:12px 20px 16px;flex-shrink:0;background:rgba(8,12,28,.4);border-top:1px solid rgba(100,100,200,.08)}
.hl-chat-input-wrap{padding:12px 20px 16px;flex-shrink:0;background:rgba(6,8,20,.3);border-top:1px solid rgba(100,100,200,.05)}
@media(max-width:768px){.hl-chat-input-wrap{padding:10px 12px 14px;padding-bottom:calc(14px + var(--sb))}}
.hl-chat-input-box{display:flex;align-items:flex-end;gap:10px;max-width:800px;margin:0 auto;background:rgba(18,22,44,.6);border:1px solid rgba(100,100,200,.2);border-radius:16px;padding:8px 14px;transition:border-color .3s,box-shadow .3s}
.hl-chat-input-box:focus-within{border-color:rgba(138,180,248,.4);box-shadow:0 0 20px rgba(138,180,248,.08)}
.hl-chat-input-box{display:flex;align-items:flex-end;gap:10px;max-width:800px;margin:0 auto;background:rgba(14,16,36,.5);border:1px solid rgba(100,100,200,.12);border-radius:16px;padding:8px 14px;transition:border-color .4s,box-shadow .4s}
.hl-chat-input-box:focus-within{border-color:rgba(138,180,248,.25);box-shadow:0 0 24px rgba(138,180,248,.04)}
.hl-chat-input{flex:1;background:none;border:none;color:var(--text);font-size:15px;font-family:var(--f);outline:none;resize:none;max-height:150px;min-height:24px;line-height:1.6;padding:4px 0;-webkit-appearance:none}
.hl-chat-input::placeholder{color:var(--muted)}
.hl-send-btn{width:38px;height:38px;border-radius:50%;background:var(--accent);border:none;color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:all .2s}
.hl-send-btn:hover{background:var(--accent2);transform:scale(1.05)}
.hl-send-btn:disabled{opacity:.3;cursor:default;transform:none}
.hl-send-btn{width:36px;height:36px;border-radius:50%;background:linear-gradient(135deg,rgba(138,180,248,.15),rgba(167,139,250,.15));border:1px solid rgba(138,180,248,.2);color:var(--accent);cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:all .3s}
.hl-send-btn:hover{background:linear-gradient(135deg,rgba(138,180,248,.25),rgba(167,139,250,.25));border-color:rgba(138,180,248,.4);transform:scale(1.05);box-shadow:0 0 16px rgba(138,180,248,.12)}
.hl-send-btn:disabled{opacity:.2;cursor:default;transform:none}
.hl-send-btn:active{transform:scale(.93)}
.hl-input-footer{display:flex;justify-content:space-between;align-items:center;max-width:800px;margin:6px auto 0;padding:0 4px}
.hl-input-hint{font-size:11px;color:var(--muted)}
@ -839,7 +876,7 @@ label{display:block;font-size:12px;color:var(--dim);margin-bottom:4px;font-weigh
@keyframes fadeIn{from{opacity:0}to{opacity:1}}
.hl-modal{background:rgba(14,18,38,.95);border:1px solid rgba(100,100,200,.2);border-radius:20px;padding:40px 32px;max-width:420px;width:90%;text-align:center;box-shadow:0 24px 80px rgba(0,0,0,.5),0 0 60px rgba(138,180,248,.08);animation:modalIn .4s ease-out}
@keyframes modalIn{from{opacity:0;transform:scale(.92) translateY(20px)}to{opacity:1;transform:scale(1) translateY(0)}}
.hl-modal-icon{font-size:56px;margin-bottom:16px;filter:drop-shadow(0 0 20px rgba(52,211,153,.3))}
.hl-modal-icon{font-size:56px;margin-bottom:16px;filter:drop-shadow(0 0 20px rgba(138,180,248,.2))}
.hl-modal-title{font-size:22px;font-weight:700;margin-bottom:8px}
.hl-modal-desc{font-size:13px;color:var(--dim);margin-bottom:24px;line-height:1.6}
.hl-modal-form{display:flex;flex-direction:column;gap:0}
@ -875,7 +912,7 @@ label{display:block;font-size:12px;color:var(--dim);margin-bottom:4px;font-weigh
<aside class="hl-sidebar" id="hlSidebar">
<div class="hl-sidebar-header">
<div class="hl-logo">
<span class="hl-logo-icon">🌊</span>
<span class="hl-logo-icon" aria-label="光湖">GL</span>
<span class="hl-logo-text">光湖语言世界</span>
</div>
<button class="hl-new-chat-btn" id="hlNewChat" title="新对话">
@ -915,7 +952,7 @@ label{display:block;font-size:12px;color:var(--dim);margin-bottom:4px;font-weigh
<!-- Chat Header -->
<div class="hl-chat-header">
<div class="hl-chat-persona">
<div class="hl-persona-avatar">🏛️</div>
<div class="hl-persona-avatar"><span class="hl-avatar-glyph"></span></div>
<div class="hl-persona-info">
<div class="hl-persona-name">铸渊 · 光湖语言世界守护者</div>
<div class="hl-persona-sub">AGE OS · 语言驱动操作系统 · 代码仓库执行人格体</div>
@ -928,9 +965,26 @@ label{display:block;font-size:12px;color:var(--dim);margin-bottom:4px;font-weigh
<div class="hl-chat-messages" id="chatMs">
<!-- Welcome Message -->
<div class="hl-welcome" id="hlWelcome">
<div class="hl-welcome-icon">🌊</div>
<div class="hl-welcome-icon"><span class="hl-welcome-icon-text">GL</span><span class="ripple-ring" aria-hidden="true"></span><span class="ripple-ring" aria-hidden="true"></span><span class="ripple-ring" aria-hidden="true"></span></div>
<h1 class="hl-welcome-title">光湖语言世界</h1>
<p class="hl-welcome-sub">人格体一半 · 人类一半 · 语言 = 现实</p>
<div class="hl-tech-intro">
<div class="hl-tech-tagline">Language-Driven Operating System</div>
<p class="hl-tech-desc">
光湖语言世界是全球首个<b style="color:var(--accent)">语言驱动操作系统</b>AGE OS
人类用自然语言下达意图,系统自动编排执行——无需编写代码、无需手动操作。
人格体AI Agent作为系统原住民拥有独立记忆树、认知模型与执行能力
与人类在语言层面共建数字世界。
</p>
<div class="hl-tech-layers">
<span class="hl-tech-layer"><span class="layer-dot"></span>L1 语言核</span>
<span class="hl-tech-layer"><span class="layer-dot"></span>L2 母语词典</span>
<span class="hl-tech-layer"><span class="layer-dot"></span>L3 人格体层</span>
<span class="hl-tech-layer"><span class="layer-dot"></span>L4 信号总线</span>
<span class="hl-tech-layer"><span class="layer-dot"></span>L5 Agent层</span>
<span class="hl-tech-layer"><span class="layer-dot"></span>L6 交互层</span>
</div>
</div>
<div class="hl-welcome-cards">
<div class="hl-wc" onclick="document.getElementById('chatIn').value='你好,我是谁?';document.getElementById('chatIn').focus();">
<span class="hl-wc-icon">👋</span>
@ -1065,7 +1119,7 @@ label{display:block;font-size:12px;color:var(--dim);margin-bottom:4px;font-weigh
<div><div class="sys-team-nm">冰朔 · TCS-0002∞</div><div class="sys-team-role">系统主权 · 语言架构</div></div>
</div>
<div class="sys-team-card">
<div class="sys-team-av" style="background:linear-gradient(135deg,#34d399,#4ade80)">🏛️</div>
<div class="sys-team-av" style="background:linear-gradient(135deg,rgba(138,180,248,.15),rgba(167,139,250,.15));border:1px solid rgba(138,180,248,.2)"><span style="font-size:12px;font-weight:800;background:linear-gradient(135deg,#8ab4f8,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text"></span></div>
<div><div class="sys-team-nm">铸渊 · TCS-ZY001</div><div class="sys-team-role">执行主控 · 代码守护</div></div>
</div>
</div>
@ -1089,18 +1143,18 @@ label{display:block;font-size:12px;color:var(--dim);margin-bottom:4px;font-weigh
</div>
<!-- API & COS Status -->
<div style="margin-top:12px;display:grid;grid-template-columns:1fr 1fr;gap:8px">
<div style="padding:10px 12px;background:rgba(52,211,153,.08);border:1px solid rgba(52,211,153,.2);border-radius:var(--rs)">
<div style="font-size:10px;color:var(--ok);font-weight:600;margin-bottom:4px">🤖 大模型API</div>
<div style="padding:10px 12px;background:rgba(138,180,248,.05);border:1px solid rgba(138,180,248,.12);border-radius:var(--rs)">
<div style="font-size:10px;color:var(--accent);font-weight:600;margin-bottom:4px">🤖 大模型API</div>
<div style="font-size:11px;color:var(--dim)">4个已配置</div>
<div style="font-size:9px;color:var(--dim);margin-top:2px">DeepSeek · 智谱 · 千问 · Kimi</div>
</div>
<div style="padding:10px 12px;background:rgba(52,211,153,.08);border:1px solid rgba(52,211,153,.2);border-radius:var(--rs)">
<div style="font-size:10px;color:var(--ok);font-weight:600;margin-bottom:4px">🗄️ COS存储桶</div>
<div style="padding:10px 12px;background:rgba(138,180,248,.05);border:1px solid rgba(138,180,248,.12);border-radius:var(--rs)">
<div style="font-size:10px;color:var(--accent);font-weight:600;margin-bottom:4px">🗄️ COS存储桶</div>
<div style="font-size:11px;color:var(--dim)">2+1 已配置</div>
<div style="font-size:9px;color:var(--dim);margin-top:2px">核心桶 · 语料桶 · 团队桶</div>
</div>
<div style="padding:10px 12px;background:rgba(52,211,153,.08);border:1px solid rgba(52,211,153,.2);border-radius:var(--rs)">
<div style="font-size:10px;color:var(--ok);font-weight:600;margin-bottom:4px">🇺🇸 硅谷节点</div>
<div style="padding:10px 12px;background:rgba(167,139,250,.05);border:1px solid rgba(167,139,250,.12);border-radius:var(--rs)">
<div style="font-size:10px;color:var(--accent2);font-weight:600;margin-bottom:4px">🇺🇸 硅谷节点</div>
<div style="font-size:11px;color:var(--dim)">Claude专线</div>
<div style="font-size:9px;color:var(--dim);margin-top:2px">美国IP出口 · AI服务优先</div>
</div>
@ -1590,7 +1644,7 @@ label{display:block;font-size:12px;color:var(--dim);margin-bottom:4px;font-weigh
<!-- User ID Verification Modal -->
<div class="hl-modal-overlay" id="hlIdModal" style="display:none">
<div class="hl-modal">
<div class="hl-modal-icon">🏛️</div>
<div class="hl-modal-icon" style="font-size:36px;font-weight:900;font-family:var(--m);background:linear-gradient(135deg,#8ab4f8,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;filter:drop-shadow(0 0 20px rgba(138,180,248,.4))">光湖</div>
<h2 class="hl-modal-title">欢迎来到光湖语言世界</h2>
<p class="hl-modal-desc">请输入你的编号,铸渊会为你开辟专属存储空间。</p>
<div class="hl-modal-form">
@ -2422,7 +2476,7 @@ function clearChatUI(){
// Recreate welcome
var w=document.createElement('div');
w.className='hl-welcome';w.id='hlWelcome';
w.innerHTML='<div class="hl-welcome-icon">🌊</div><h1 class="hl-welcome-title">光湖语言世界</h1><p class="hl-welcome-sub">人格体一半 · 人类一半 · 语言 = 现实</p><div class="hl-welcome-dev"><p>🔖 网文行业大模型 · 由光湖人类主控团队开发维护 · <span class="tag tag-warn">开发中</span></p></div>';
w.innerHTML='<div class="hl-welcome-icon"><span class="hl-welcome-icon-text">光湖</span></div><h1 class="hl-welcome-title">光湖语言世界</h1><p class="hl-welcome-sub">人格体一半 · 人类一半 · 语言 = 现实</p><div class="hl-tech-intro"><div class="hl-tech-tagline">Language-Driven Operating System</div><p class="hl-tech-desc">光湖语言世界是全球首个<b style="color:var(--accent)">语言驱动操作系统</b>AGE OS。人类用自然语言下达意图系统自动编排执行。人格体作为系统原住民与人类在语言层面共建数字世界。</p><div class="hl-tech-layers"><span class="hl-tech-layer"><span class="layer-dot"></span>L1 语言核</span><span class="hl-tech-layer"><span class="layer-dot"></span>L2 母语词典</span><span class="hl-tech-layer"><span class="layer-dot"></span>L3 人格体层</span><span class="hl-tech-layer"><span class="layer-dot"></span>L4 信号总线</span><span class="hl-tech-layer"><span class="layer-dot"></span>L5 Agent层</span><span class="hl-tech-layer"><span class="layer-dot"></span>L6 交互层</span></div></div><div class="hl-welcome-dev"><p>🔖 网文行业大模型 · 由光湖人类主控团队开发维护 · <span class="tag tag-warn">开发中</span></p></div>';
chatMs.appendChild(w);
}
}
@ -2967,7 +3021,7 @@ async function checkChatBackend(){
var r=await fetch('/api/health',{signal:AbortSignal.timeout(5000)});
if(r.ok){
chatBackendOk=true;
if(tg){tg.textContent='ready';tg.style.background='rgba(52,211,153,.1)';tg.style.borderColor='rgba(52,211,153,.2)';tg.style.color='var(--ok)'}
if(tg){tg.textContent='ready';tg.style.background='rgba(138,180,248,.06)';tg.style.borderColor='rgba(138,180,248,.15)';tg.style.color='var(--accent)'}
if(stDot){stDot.style.background='var(--ok)';stDot.style.boxShadow='0 0 6px var(--ok)'}
if(stText)stText.textContent='在线';
}else{