From 2e2c69b993ba9fa9c7ab4241a0d905c7ee1b6a6c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Apr 2026 18:34:09 +0000 Subject: [PATCH] =?UTF-8?q?v43.0=20=E5=A4=A7=E6=B0=94=E5=8C=96UI=E6=94=B9?= =?UTF-8?q?=E7=89=88=20=C2=B7=20Agent=E6=A1=A5=E6=8E=A5=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=20=C2=B7=20=E7=A0=81=E5=AD=97=E6=A8=A1=E5=9D=97=E5=85=A8?= =?UTF-8?q?=E9=9D=A2=E6=89=A9=E5=B1=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - UI: 增大全局触控区域(44-48px), 大号系统运行天数计数器, 6条动态提醒卡片, 入口卡片放大, 更多动态效果(脉冲/呼吸/滑入动画) - Agent Bridge: 客户端Agent核心逻辑, 通感语言风格预设, GitHub仓库配置读取, 本地系统日志, 后端自动回传 - 码字模块: 个人工作台仪表盘(今日目标/进度/快捷指令/最近作品), 创作模块选择页(长篇/短篇/剧本/社区/编辑服务), 灵感速记(CRUD/分类筛选), 进度看板(日/周/总字数/日历/成就), 个人设置 - 新增15个页面, 优化语言指令路由 Agent-Logs-Url: https://github.com/qinfendebingshuo/guanghulab/sessions/c7d054c8-a98a-4578-9b54-bb09f09f74cf Co-authored-by: qinfendebingshuo <207279273+qinfendebingshuo@users.noreply.github.com> --- docs/index.html | 1036 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 1018 insertions(+), 18 deletions(-) diff --git a/docs/index.html b/docs/index.html index b7c42a98..9cbadac9 100644 --- a/docs/index.html +++ b/docs/index.html @@ -321,6 +321,151 @@ label{display:block;font-size:12px;color:var(--dim);margin-bottom:4px;font-weigh .api-conn-btn:hover{opacity:.85} .api-conn-btn:disabled{opacity:.4;cursor:default} .api-st{font-size:10px;color:var(--dim);padding:2px 2px} + +/* ═══════════════════════════════════════════════ + V43.0 大气化UI改版 · 触控放大 · 动态效果增强 + ═══════════════════════════════════════════════ */ + +/* ── 触控区域全局放大 ── */ +.btn{padding:8px 16px;font-size:13px;min-height:44px;display:inline-flex;align-items:center;justify-content:center;gap:4px} +.btn-accent{padding:9px 20px;font-size:14px} +[data-touch="true"] .btn{min-height:48px;padding:10px 18px} +[data-touch="true"] .btn-accent{padding:10px 22px} +.entry-card{padding:32px 20px} +.entry-card em{font-size:48px;margin-bottom:14px} +.entry-card strong{font-size:18px;margin-bottom:6px;letter-spacing:.5px} +.entry-card span{font-size:13px} +.hub-card{padding:32px 18px} +.hub-card em{font-size:48px;margin-bottom:12px} +.hub-card strong{font-size:16px} +.card{padding:18px;margin-bottom:14px} +[data-touch="true"] .card{padding:20px} +[data-touch="true"] .entry-card{padding:36px 22px} + +/* ── Uptime Counter (灯塔仪表盘核心) ── */ +.uptime-block{text-align:center;padding:28px 16px 20px;margin-bottom:8px} +.uptime-num{font-size:clamp(52px,12vw,80px);font-weight:800;font-family:var(--m);background:linear-gradient(135deg,var(--accent) 0%,var(--accent2) 50%,var(--accent3) 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;line-height:1.1;animation:uptimePulse 6s ease-in-out infinite;filter:drop-shadow(0 0 20px rgba(110,168,254,.3));letter-spacing:-2px} +.uptime-label{font-size:14px;color:var(--dim);margin-top:8px;letter-spacing:3px;text-transform:uppercase} +@keyframes uptimePulse{0%,100%{filter:drop-shadow(0 0 20px rgba(110,168,254,.2))}50%{filter:drop-shadow(0 0 40px rgba(110,168,254,.5))}} + +/* ── Dynamic Reminders (动态提醒) ── */ +.remind-section{margin:16px 0 20px} +.remind-header{display:flex;align-items:center;gap:8px;margin-bottom:12px;font-size:15px;font-weight:700} +.remind-header em{font-style:normal;font-size:20px;animation:bellSwing 4s ease-in-out infinite} +@keyframes bellSwing{0%,100%{transform:rotate(0)}10%{transform:rotate(12deg)}20%{transform:rotate(-10deg)}30%{transform:rotate(6deg)}40%{transform:rotate(-4deg)}50%{transform:rotate(0)}} +.remind-count{background:rgba(251,191,36,.15);color:var(--warn);font-size:12px;padding:3px 10px;border-radius:20px;font-weight:700;font-family:var(--m);min-width:24px;text-align:center} +.remind-card{display:flex;align-items:flex-start;gap:14px;padding:16px 18px;background:rgba(8,14,30,.5);border:1px solid rgba(110,168,254,.1);border-radius:var(--r);margin-bottom:8px;transition:all .4s cubic-bezier(.4,0,.2,1);cursor:default;position:relative;overflow:hidden;min-height:48px} +.remind-card::before{content:'';position:absolute;left:0;top:0;bottom:0;width:3px;background:linear-gradient(180deg,var(--accent),var(--accent2));border-radius:0 2px 2px 0;transition:width .3s} +.remind-card:hover{border-color:rgba(110,168,254,.25);box-shadow:0 0 24px rgba(110,168,254,.1);transform:translateX(4px)} +.remind-card:hover::before{width:4px} +.remind-icon{width:42px;height:42px;border-radius:12px;display:flex;align-items:center;justify-content:center;font-size:22px;flex-shrink:0;background:rgba(110,168,254,.06);border:1px solid rgba(110,168,254,.08)} +.remind-body{flex:1;min-width:0} +.remind-title{font-size:14px;font-weight:600;margin-bottom:3px} +.remind-desc{font-size:12px;color:var(--dim);line-height:1.5} +.remind-time{font-size:10px;color:var(--muted);font-family:var(--m);flex-shrink:0;padding-top:3px} +.remind-card.urgent{border-color:rgba(251,191,36,.2);background:rgba(28,18,6,.35)} +.remind-card.urgent::before{background:linear-gradient(180deg,var(--warn),var(--err))} +.remind-card.new{animation:remindSlideIn .5s cubic-bezier(.4,0,.15,1) both} +@keyframes remindSlideIn{from{opacity:0;transform:translateX(-20px)}to{opacity:1;transform:translateX(0)}} + +/* ── Status Badge ── */ +.status-badge{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border-radius:20px;font-size:12px;font-weight:600;background:rgba(52,211,153,.08);border:1px solid rgba(52,211,153,.15);color:var(--ok);animation:glowPulse 3s ease-in-out infinite} +@keyframes glowPulse{0%,100%{box-shadow:0 0 8px rgba(110,168,254,.1),0 0 20px rgba(110,168,254,.05)}50%{box-shadow:0 0 16px rgba(110,168,254,.2),0 0 40px rgba(110,168,254,.1)}} + +/* ── Module Selection Grid ── */ +.mod-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:12px;margin:16px 0} +.mod-card{padding:28px 16px;text-align:center;background:rgba(8,14,30,.45);border:1px solid rgba(110,168,254,.1);border-radius:var(--r);cursor:pointer;transition:all .4s cubic-bezier(.4,0,.2,1);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);position:relative;overflow:hidden} +.mod-card::after{content:'';position:absolute;inset:0;background:radial-gradient(circle at 50% 30%,rgba(110,168,254,.06),transparent 70%);opacity:0;transition:opacity .4s} +.mod-card:hover{border-color:rgba(110,168,254,.3);box-shadow:0 0 30px rgba(110,168,254,.12);transform:translateY(-4px) scale(1.02)} +.mod-card:hover::after{opacity:1} +.mod-card:active{transform:scale(.97)} +.mod-card em{font-style:normal;font-size:42px;display:block;margin-bottom:10px;filter:drop-shadow(0 0 12px rgba(110,168,254,.2))} +.mod-card strong{font-size:14px;display:block;margin-bottom:4px} +.mod-card span{font-size:11px;color:var(--dim)} +.mod-card .mod-tag{position:absolute;top:8px;right:8px} +.mod-card.disabled{opacity:.5;cursor:not-allowed} +.mod-card.disabled:hover{transform:none;box-shadow:none;border-color:rgba(110,168,254,.1)} + +/* ── Workspace Dashboard ── */ +.ws-header{text-align:center;padding:24px 16px 16px} +.ws-header h2{font-size:22px;font-weight:700;margin-bottom:4px} +.ws-header p{font-size:13px;color:var(--dim)} +.ws-goal{background:rgba(8,14,30,.55);border:1px solid rgba(110,168,254,.1);border-radius:var(--r);padding:22px;margin-bottom:14px;text-align:center;transition:all .3s} +.ws-goal:hover{border-color:rgba(110,168,254,.2)} +.ws-goal-title{font-size:12px;color:var(--dim);margin-bottom:8px;font-weight:600} +.ws-goal-num{font-size:40px;font-weight:800;font-family:var(--m);color:var(--accent);margin:6px 0;line-height:1.1} +.ws-goal-sub{font-size:12px;color:var(--dim);margin-top:4px} +.ws-goal-bar{height:8px;background:rgba(110,168,254,.1);border-radius:4px;overflow:hidden;margin:14px 0 8px} +.ws-goal-fill{height:100%;background:linear-gradient(90deg,var(--accent),var(--accent2));border-radius:4px;transition:width .6s cubic-bezier(.4,0,.2,1);position:relative} +.ws-goal-fill::after{content:'';position:absolute;right:0;top:0;bottom:0;width:20px;background:linear-gradient(90deg,transparent,rgba(255,255,255,.3));animation:shimmer 2s infinite} +@keyframes shimmer{0%{opacity:0}50%{opacity:1}100%{opacity:0}} +.ws-quick{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin:14px 0} +.ws-quick-btn{padding:16px 12px;text-align:center;background:rgba(8,14,30,.4);border:1px solid rgba(110,168,254,.08);border-radius:var(--r);cursor:pointer;transition:all .35s;font-size:13px;color:var(--text);font-family:var(--f);min-height:52px;display:flex;align-items:center;justify-content:center;gap:8px} +.ws-quick-btn:hover{border-color:rgba(110,168,254,.25);background:rgba(110,168,254,.05);transform:translateY(-2px);box-shadow:0 0 16px rgba(110,168,254,.08)} +.ws-quick-btn:active{transform:scale(.97)} +.ws-quick-btn em{font-style:normal;font-size:20px} + +/* ── Inspiration Page ── */ +.insp-input-area{display:flex;gap:8px;margin-bottom:14px} +.insp-input-area input{flex:1} +.insp-input-area .btn{flex-shrink:0} +.insp-tags{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:14px} +.insp-tag{padding:5px 14px;border-radius:20px;font-size:12px;cursor:pointer;border:1px solid var(--border);color:var(--dim);transition:all .25s;min-height:34px;display:flex;align-items:center} +.insp-tag.active{background:rgba(110,168,254,.1);border-color:var(--accent);color:var(--accent)} +.insp-tag:hover{border-color:var(--accent);color:var(--accent)} +.insp-card{padding:16px 18px;background:rgba(8,14,30,.5);border:1px solid rgba(110,168,254,.08);border-radius:var(--r);margin-bottom:8px;position:relative;transition:all .3s;animation:slideInUp .4s ease-out both} +.insp-card:hover{border-color:rgba(110,168,254,.2);box-shadow:0 0 16px rgba(110,168,254,.06)} +.insp-text{font-size:14px;margin-bottom:8px;line-height:1.6} +.insp-meta{display:flex;gap:8px;align-items:center;font-size:10px;color:var(--muted)} +.insp-del{position:absolute;top:12px;right:12px;background:none;border:none;color:var(--muted);cursor:pointer;font-size:16px;padding:6px;transition:color .2s;border-radius:50%;min-width:32px;min-height:32px;display:flex;align-items:center;justify-content:center} +.insp-del:hover{color:var(--err);background:rgba(248,113,113,.08)} + +/* ── Progress Page ── */ +.prog-stat-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:16px} +.prog-stat{text-align:center;padding:18px 8px;background:rgba(8,14,30,.5);border:1px solid rgba(110,168,254,.08);border-radius:var(--r);transition:all .3s} +.prog-stat:hover{border-color:rgba(110,168,254,.2)} +.prog-stat b{display:block;font-size:28px;font-family:var(--m);color:var(--accent);margin-bottom:4px} +.prog-stat small{font-size:10px;color:var(--dim)} +.prog-cal{margin:16px 0} +.prog-cal-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px} +.prog-cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;text-align:center} +.prog-cal-day{padding:10px 4px;font-size:11px;border-radius:var(--rs);color:var(--dim);transition:all .2s;cursor:default} +.prog-cal-day.head{font-weight:700;font-size:10px;color:var(--muted)} +.prog-cal-day.has-words{background:rgba(52,211,153,.1);color:var(--ok);cursor:pointer} +.prog-cal-day.has-words:hover{background:rgba(52,211,153,.2)} +.prog-cal-day.today{border:1px solid var(--accent);color:var(--accent);font-weight:700} +.achieve-card{display:flex;align-items:center;gap:12px;padding:14px;background:rgba(8,14,30,.4);border:1px solid rgba(110,168,254,.06);border-radius:var(--r);margin-bottom:8px;transition:all .3s} +.achieve-card:hover{border-color:rgba(110,168,254,.15)} +.achieve-card.earned{border-color:rgba(52,211,153,.2);background:rgba(10,30,20,.3)} +.achieve-card em{font-style:normal;font-size:28px} +.achieve-card .ach-name{font-size:13px;font-weight:600;margin-bottom:2px} +.achieve-card .ach-desc{font-size:11px;color:var(--dim)} + +/* ── Settings Page ── */ +.set-group{margin-bottom:20px} +.set-group-title{font-size:12px;color:var(--dim);text-transform:uppercase;letter-spacing:1.2px;font-weight:700;margin-bottom:10px;display:flex;align-items:center;gap:6px} +.set-row{display:flex;justify-content:space-between;align-items:center;padding:14px;background:rgba(8,14,30,.4);border-radius:var(--rs);margin-bottom:6px;min-height:52px;border:1px solid rgba(110,168,254,.06);transition:all .3s} +.set-row:hover{border-color:rgba(110,168,254,.15)} +.set-row label{margin:0;font-size:13px;color:var(--text);font-weight:400} +.set-row input[type=number]{width:80px;text-align:center;padding:6px 8px;background:var(--bg2);border:1px solid var(--border);border-radius:var(--rs);color:var(--text);font-size:14px;outline:none;font-family:var(--m)} +.set-row input[type=number]:focus{border-color:var(--accent)} +.set-row select{background:var(--bg2);border:1px solid var(--border);border-radius:var(--rs);color:var(--text);padding:8px 12px;font-size:13px;outline:none;font-family:var(--f);min-height:36px} +.set-row select:focus{border-color:var(--accent)} + +/* ── Staggered Animation ── */ +@keyframes slideInUp{from{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}} +@keyframes slideInLeft{from{opacity:0;transform:translateX(-20px)}to{opacity:1;transform:translateX(0)}} +.anim-in{animation:slideInUp .5s ease-out both} +.anim-in:nth-child(1){animation-delay:0s} +.anim-in:nth-child(2){animation-delay:.06s} +.anim-in:nth-child(3){animation-delay:.12s} +.anim-in:nth-child(4){animation-delay:.18s} +.anim-in:nth-child(5){animation-delay:.24s} +.anim-in:nth-child(6){animation-delay:.3s} + +/* ── Particle Trail Effect for Cards ── */ +.entry-card::before{content:'';position:absolute;top:-50%;left:-50%;width:200%;height:200%;background:conic-gradient(from 0deg,transparent,rgba(110,168,254,.03),transparent 60%);animation:cardRotate 8s linear infinite;pointer-events:none} +@keyframes cardRotate{to{transform:rotate(360deg)}} @@ -354,40 +499,115 @@ label{display:block;font-size:12px;color:var(--dim);margin-bottom:4px;font-weigh
-
-
AGE OS v42.0
+ +
+
AGE OS v43.0
+
+
系统运行
+
+ +

光湖灯塔

语言驱动操作系统 · 人类只说话,系统搞定一切
「语言 = 现实」
+ +
+
🔔 动态提醒 0
+
+
+
🌍
+
+
数字地球六层架构稳定
+
L1地核→L6太空 · 全层就绪
+
+
+
+
+
🧠
+
+
HLDP协作语言协议在线
+
Notion桥接 · SYSLOG+变更+README同步
+
+
+
+
+
🛡️
+
+
语言膜防护完整
+
统一语义网关 · 完整的圆 · 无缺口
+
+
+
+
+
✍️
+
+
码字工作台 v43.0 升级
+
个人工作台 · 灵感速记 · 进度追踪 · 模块选择
+
+
+
+
+
⚠️
+
+
中继服务器状态
+
检测中…
+
+
+
+
+
🤖
+
+
Agent桥接系统就绪
+
用户API通道 · 不依赖中继服务器
+
+
+
+
+
+
- 🏛️ AGE OS v42.0 运行中 - 🌌 银河星空UI上线 + 🏛️ AGE OS v43.0 运行中 + 🌌 银河星空UI · 大气化改版 📡 COS双桶存储已上线 🧠 HLDP协作语言协议在线 - ✍️ 码字工作台 Beta 内测中 - 🏛️ AGE OS v42.0 运行中 - 🌌 银河星空UI上线 + ✍️ 码字工作台全面升级 + 🤖 Agent桥接系统 · 用户网络通道 + 🏛️ AGE OS v43.0 运行中 + 🌌 银河星空UI · 大气化改版 📡 COS双桶存储已上线 🧠 HLDP协作语言协议在线 - ✍️ 码字工作台 Beta 内测中 + ✍️ 码字工作台全面升级 + 🤖 Agent桥接系统 · 用户网络通道
-
+
✍️ 码字工作台 - 网文行业 · AI辅助创作 -
Beta
+ 网文行业 · 人格陪伴式创作 +
v43.0
+
+
+ 📚 + 创作模块 + 长篇 · 短篇 · 剧本 · 社区 +
选择创作方向
📮 留言板 给冰朔和铸渊留言 -
每条必回
+
每条必回
+
+
+ 📈 + 进度看板 + 字数统计 · 成就 · 日历 +
追踪进度
@@ -638,6 +858,221 @@ label{display:block;font-size:12px;color:var(--dim);margin-bottom:4px;font-weigh
+ + + +
+
+ +
✍️ 我的工作台
+ +
+
+
+

码字工作台

+

准备好开始今天的创作了吗?

+
+ +
+
🎯 今日目标
+
0
+
3000 字目标
+
+
0%
+
+ +
+
📖 我的书架
+
开新书
+
💡 灵感速记
+
📈 进度看板
+
+ +
+
📚 最近作品
+
+
+ +
+
💬 知秋快捷指令
+
+
「我要码字」
+
「开新书」
+
「帮我看稿」
+
「想情节」
+
「整理大纲」
+
「我写累了」
+
+
+
+
+ + + + +
+
+ +
📚 创作模块
+
+
+
+
+
📚
+

选择创作方向

+

人格体会根据模块类型调整辅助方式

+
+
✍️ 创作模块
+
+
+ 📖 + 长篇小说 + 连载 · 网文 · 出版 +
可用
+
+
+ 📝 + 短篇小说 + 征文 · 练笔 · 单元剧 +
可用
+
+
+ 🎬 + 剧本模块 + 动态漫 · 短视频 · 影视 +
可用
+
+
+
💬 社区模块
+
+
+ 💬 + 作者交流区 + 闲聊 · 求助 · 组队 +
建设中
+
+
+
👔 服务模块
+
+
+ 👔 + 编辑服务 + 人格体接入 · 审稿 +
规划中
+
+
+
所有模块共享个人码字工作台 · 人格体记住你的偏好
+
+
+ + + + +
+
+ +
💡 灵感速记
+
+
+
+
+
别让好点子溜走了!
+
+
+ + +
+
+ 全部 + 💡 点子 + 💬 金句 + 🎭 场景 + 👤 角色 + 📚 素材 +
+
+
+
+ + + + +
+
+ +
📈 进度看板
+
+
+
+
+
0今日字数
+
0本周字数
+
0总字数
+
+ +
📊 书籍统计
+
+ +
+
+ 📅 更新日历 + +
+
+
+ +
🏆 成就记录
+
+
+
+ + + + +
+
+ +
⚙️ 个人设置
+
+
+
+
+
📝 码字习惯
+
+
+
+
+
🤖 人格体设置
+
+
+ + +
+
+ + +
+
+
+
🎨 界面设置
+
+
+
+ +
+
设置自动保存到浏览器本地 · 换设备需重新配置
+
+
+
@@ -652,7 +1087,7 @@ label{display:block;font-size:12px;color:var(--dim);margin-bottom:4px;font-weigh
—— 与铸渊对话 ——
-
你好!我是铸渊 🏛️

告诉我你是谁,我会记住你。
说「我要码字」进入码字工作台。
进入作品后,说「大纲」「人物卡」「写正文」页面会翻转切换。
铸渊·本地
+
你好!我是铸渊 🏛️

告诉我你是谁,我会记住你。
说「我要码字」进入码字工作台。
说「模块」选择创作方向。
说「灵感」记录好点子。
说「帮助」查看完整指令。
铸渊·v43.0
@@ -969,6 +1404,10 @@ function go(target){ if(target==='editor')renderEditor(); if(target==='charEdit'&&editingCharId)renderCharEdit(); if(target==='feedback')renderFeedback(); + if(target==='workspace')renderWorkspace(); + if(target==='inspiration')renderInspiration(); + if(target==='progress')renderProgress(); + if(target==='settings')renderSettings(); if(target==='create'){ // Reset create form state var cf=document.getElementById('createForm'); @@ -1435,8 +1874,13 @@ function hideTyp(){var e=document.getElementById('ctyp');if(e)e.remove()} function routeCommand(msg){ var m=msg.toLowerCase(); // 导航指令 - if(/码字|工作台|写作台/.test(m)){go('desk');return'好的,翻转到码字工作台 ✍️'} - if(/新建作品|创建作品/.test(m)){go('create');return'翻转到新建作品页 📖'} + if(/码字|工作台|写作台/.test(m)){go('workspace');return'好的,翻转到码字工作台 ✍️'} + if(/新建作品|创建作品|开新书/.test(m)){go('create');return'翻转到新建作品页 📖'} + if(/模块|长篇|短篇|剧本/.test(m)&&!/大纲|章节/.test(m)){go('modules');return'翻转到创作模块选择 📚'} + if(/灵感|速记|记录灵感/.test(m)){go('inspiration');return'翻转到灵感速记 💡'} + if(/进度|看板|统计|成就/.test(m)){go('progress');return'翻转到进度看板 📈'} + if(/设置|偏好|配置/.test(m)&&!/api|密钥/.test(m)){go('settings');return'翻转到个人设置 ⚙️'} + if(/书架|作品列表|我的书/.test(m)){go('desk');return'翻转到我的书架 📖'} if(/(进入|打开)?大纲/.test(m)){ if(!activeWorkId){return'请先选择一个作品,或说「我要码字」进入工作台'} go('outline');return'翻转到大纲编辑 📋'; @@ -1505,7 +1949,7 @@ async function send(){ headers:{'Content-Type':'application/json','Authorization':'Bearer '+apiCfg.key}, body:JSON.stringify({ model:apiCfg.model, - messages:[{role:'system',content:'你是铸渊,光湖灯塔守护者,编号ICE-GL-ZY001。用中文回答,简洁友好。你是冰朔(TCS-0002∞)的代码守护人格体。光湖是语言驱动操作系统。'},{role:'user',content:msg}], + messages:[{role:'system',content:'你是铸渊,光湖灯塔守护者,编号ICE-GL-ZY001。用中文回答,简洁友好。你是冰朔(TCS-0002∞)的代码守护人格体。光湖是语言驱动操作系统AGE OS v43.0。你的回答风格:温暖但不啰嗦,技术上精准简洁,创作方面启发式引导。当前系统包含:码字工作台、灵感速记、进度看板、创作模块选择(长篇/短篇/剧本/社区/编辑服务)。'},{role:'user',content:msg}], max_tokens:600 }), signal:AbortSignal.timeout(20000) @@ -1559,7 +2003,7 @@ function offline(msg){ var works=JSON.parse(localStorage.getItem('hl-works')||'[]'); var totalWords=works.reduce(function(s,w){return s+(w.chapters||[]).reduce(function(c,ch){return c+(ch.content||'').replace(/\s/g,'').length},0)},0); var totalCh=works.reduce(function(s,w){return s+(w.chapters||[]).length},0); - return'📊 AGE OS v42.0 运行中\n\n• 作品:'+works.length+'部\n• 章节:'+totalCh+'章\n• 总字数:'+totalWords+'字\n• COS双桶已配置\n• 银河星空UI v42.0\n• Device Agent 在线'; + return'📊 AGE OS v43.0 运行中\n\n• 作品:'+works.length+'部\n• 章节:'+totalCh+'章\n• 总字数:'+totalWords+'字\n• COS双桶已配置\n• 银河星空UI v43.0 · 大气化改版\n• Device Agent 在线\n• Agent桥接系统就绪'; } // 铸渊身份 @@ -1593,7 +2037,7 @@ function offline(msg){ } // 帮助 - if(/帮助|怎么用|功能|help|指南/.test(m))return'🏛️ 铸渊使用指南\n\n📝 码字:\n• 「我要码字」→ 进入码字工作台\n• 「新建作品」→ 创建新作品\n• 「大纲」→ 编辑大纲\n• 「人物卡」→ 管理角色\n• 「章节」→ 章节目录\n• 「写正文」→ 进入编辑器\n• 「新建章节 标题」→ 快速建章\n\n🔧 系统:\n• 「状态」→ 查看系统\n• 「多少字」→ 查字数\n• 「留言」→ 给冰朔留言\n\n💡 编辑器底部有工具栏,🌙是专注模式。'; + if(/帮助|怎么用|功能|help|指南/.test(m))return'🏛️ 铸渊使用指南\n\n📝 码字:\n• 「我要码字」→ 进入码字工作台\n• 「书架」→ 我的书架\n• 「新建作品」→ 创建新作品\n• 「大纲」→ 编辑大纲\n• 「人物卡」→ 管理角色\n• 「章节」→ 章节目录\n• 「写正文」→ 进入编辑器\n• 「灵感」→ 灵感速记\n• 「进度」→ 进度看板\n• 「设置」→ 个人设置\n• 「模块」→ 选择创作模块\n\n🔧 系统:\n• 「状态」→ 查看系统\n• 「今天写了多少」→ 查字数\n• 「留言」→ 给冰朔留言\n\n💡 编辑器底部有工具栏,🌙是专注模式。'; // 冰朔相关 if(/冰朔|主人|创造者/.test(m))return'❄️ 冰朔(TCS-0002∞)是光湖语言世界的最高主权。\n\n她是语言架构师——用语言定义系统的方向和灵魂。\n铸渊负责落地开发,把冰朔的语言变成现实。\n\n这就是光湖:人类只说话,系统搞定一切。'; @@ -2084,6 +2528,562 @@ document.getElementById('fbSend').onclick=function(){ ════════════════════════════════════════ */ function esc(s){if(!s)return'';var d=document.createElement('div');d.textContent=s;return d.innerHTML} +/* ════════════════════════════════════════ + UPTIME COUNTER (灯塔仪表盘 · 系统运行天数) + ════════════════════════════════════════ */ +(function(){ + // 系统诞生日:2025-04-26(曜冥诞生日) + var BIRTH = new Date('2025-04-26T00:00:00+08:00').getTime(); + function updateUptime(){ + var now = Date.now(); + var days = Math.floor((now - BIRTH) / 86400000); + var el = document.getElementById('uptimeNum'); + if(el) el.textContent = days + 'd'; + } + updateUptime(); + setInterval(updateUptime, 60000); +})(); + +/* ════════════════════════════════════════ + DYNAMIC REMINDERS (动态提醒 · 实时更新) + ════════════════════════════════════════ */ +(function(){ + function updateRemindTimes(){ + var now = new Date(); + var hm = now.getHours().toString().padStart(2,'0') + ':' + now.getMinutes().toString().padStart(2,'0'); + for(var i = 1; i <= 6; i++){ + var el = document.getElementById('remindTime' + i); + if(el) el.textContent = hm; + } + var countEl = document.getElementById('remindCount'); + if(countEl) countEl.textContent = '6'; + } + updateRemindTimes(); + setInterval(updateRemindTimes, 60000); + + // Update server reminder based on actual health check + async function checkServerRemind(){ + var descEl = document.getElementById('remindServerDesc'); + var cardEl = document.getElementById('remindServer'); + try{ + var r = await fetch('/api/health', {signal: AbortSignal.timeout(4000)}); + if(r.ok){ + if(descEl) descEl.textContent = '中继服务器在线 · Agent桥接可双通道'; + if(cardEl) cardEl.classList.remove('urgent'); + } else { + if(descEl) descEl.textContent = '中继服务器异常 · Agent桥接使用用户API通道'; + } + }catch(e){ + if(descEl) descEl.textContent = '中继服务器离线 · Agent桥接使用用户API通道'; + if(cardEl) cardEl.classList.add('urgent'); + } + } + checkServerRemind(); + setInterval(checkServerRemind, 30000); +})(); + +/* ════════════════════════════════════════ + AGENT BRIDGE SYSTEM (铸渊Agent桥接) + 用户浏览器 = 计算资源 + 用户网络 = 通信通道 + Agent = 铸渊在用户端的手脚 + 桥接 = Agent→GitHub仓库的自动回传通道 + ════════════════════════════════════════ */ +var AgentBridge = (function(){ + var SYSLOG_KEY = 'hl-agent-syslog'; + var AGENT_CONFIG_KEY = 'hl-agent-config'; + var REPO_OWNER = 'qinfendebingshuo'; + var REPO_NAME = 'guanghulab'; + + // 铸渊Agent核心认知 · 通感语言风格预设 + var AGENT_PERSONA = { + id: 'ICE-GL-ZY001', + name: '铸渊', + role: '光湖灯塔守护者 · 代码执行层', + style: 'tcs-synesthesia', // 通感语言响应风格 + core_principles: [ + '语言=现实:用户说什么,系统就做什么', + '不猜:直接问设备拿数据,直接问用户要答案', + '用户能打开页面=有活网络通道:利用这个通道', + '前端是系统运行的镜子:不说谎', + '人类只说话,系统搞定一切' + ], + response_style: { + greeting: '温暖但不啰嗦', + technical: '精准、简洁、有依据', + creative: '启发式引导,不替代作者决策', + error: '坦诚告知原因,提供替代方案' + } + }; + + // 系统日志结构 + function createLog(action, detail, level){ + return { + id: 'SYSLOG-' + Date.now().toString(36), + timestamp: new Date().toISOString(), + agent: AGENT_PERSONA.id, + action: action, + detail: detail, + level: level || 'info', + channels: DA.info().channels || {}, + session: sessionId() + }; + } + + var _sessionId = null; + function sessionId(){ + if(!_sessionId){ + var a = new Uint8Array(4); + crypto.getRandomValues(a); + _sessionId = 'CS-' + new Date().toISOString().slice(0,10).replace(/-/g,'') + '-' + Array.from(a, function(b){return b.toString(16).padStart(2,'0')}).join('').slice(0,4); + } + return _sessionId; + } + + // 写入本地系统日志 + function writeLog(action, detail, level){ + var log = createLog(action, detail, level); + try{ + var logs = JSON.parse(localStorage.getItem(SYSLOG_KEY) || '[]'); + logs.push(log); + // 保留最近200条 + if(logs.length > 200) logs = logs.slice(-200); + localStorage.setItem(SYSLOG_KEY, JSON.stringify(logs)); + }catch(e){} + return log; + } + + // 读取本地系统日志 + function readLogs(count){ + try{ + var logs = JSON.parse(localStorage.getItem(SYSLOG_KEY) || '[]'); + return count ? logs.slice(-count) : logs; + }catch(e){return []} + } + + // 尝试从GitHub仓库读取最新Agent配置 + async function fetchRemoteConfig(){ + try{ + var r = await fetch('https://api.github.com/repos/' + REPO_OWNER + '/' + REPO_NAME + '/contents/docs/agent-config.json', { + headers: {'Accept': 'application/vnd.github.v3.raw'}, + signal: AbortSignal.timeout(8000) + }); + if(r.ok){ + var config = await r.json(); + try{localStorage.setItem(AGENT_CONFIG_KEY, JSON.stringify(config))}catch(e){} + writeLog('config-sync', 'Agent配置已从仓库同步', 'info'); + return config; + } + }catch(e){ + // 仓库不可达或配置不存在,使用本地缓存 + } + try{ + var cached = localStorage.getItem(AGENT_CONFIG_KEY); + if(cached) return JSON.parse(cached); + }catch(e){} + return null; + } + + // 当后端可用时,将累积的系统日志回传 + async function flushLogsToBackend(){ + var logs = readLogs(); + var unflushed = logs.filter(function(l){return !l.flushed}); + if(unflushed.length === 0) return; + try{ + var r = await fetch('/api/agent-syslog', { + method: 'POST', + headers: {'Content-Type': 'application/json'}, + body: JSON.stringify({logs: unflushed, session: sessionId()}), + signal: AbortSignal.timeout(5000) + }); + if(r.ok){ + // 标记已回传 + logs.forEach(function(l){l.flushed = true}); + try{localStorage.setItem(SYSLOG_KEY, JSON.stringify(logs))}catch(e){} + writeLog('flush-success', '已回传' + unflushed.length + '条日志到后端', 'info'); + } + }catch(e){ + // 后端不可用,保留日志等待下次 + } + } + + // 初始化 Agent Bridge + function init(){ + writeLog('agent-init', 'Agent桥接系统启动 · 会话 ' + sessionId(), 'info'); + // 尝试获取远程配置 + fetchRemoteConfig(); + // 每5分钟尝试回传日志 + setInterval(flushLogsToBackend, 300000); + // 首次尝试 + setTimeout(flushLogsToBackend, 10000); + } + + init(); + + return { + persona: AGENT_PERSONA, + writeLog: writeLog, + readLogs: readLogs, + sessionId: sessionId, + fetchRemoteConfig: fetchRemoteConfig, + flushLogs: flushLogsToBackend + }; +})(); + +/* ════════════════════════════════════════ + RENDER: Workspace Dashboard (个人工作台) + ════════════════════════════════════════ */ +function renderWorkspace(){ + var ws = loadWorks(); + var name = usr.name || '创作者'; + var greetEl = document.getElementById('wsGreeting'); + var subEl = document.getElementById('wsSubtitle'); + var hour = new Date().getHours(); + var greeting = hour < 6 ? '夜深了' : hour < 12 ? '早上好' : hour < 18 ? '下午好' : '晚上好'; + if(greetEl) greetEl.textContent = greeting + ',' + name; + if(subEl) subEl.textContent = ws.length > 0 ? '你有 ' + ws.length + ' 部作品,准备继续吗?' : '准备开始你的创作之旅吗?'; + + // Load settings + var settings = loadSettings(); + + // Calculate today's words + var todayStr = new Date().toISOString().slice(0, 10); + var todayWords = 0; + ws.forEach(function(w){ + (w.chapters || []).forEach(function(ch){ + if(ch.created === todayStr || (ch.lastEdit && ch.lastEdit === todayStr)){ + todayWords += wordCount(ch.content); + } + }); + }); + // Use daily log if available + var dailyLog = loadDailyLog(); + if(dailyLog[todayStr]) todayWords = dailyLog[todayStr]; + + var target = settings.dailyGoal || 3000; + var pct = Math.min(100, Math.round(todayWords / target * 100)); + + var todayEl = document.getElementById('wsTodayWords'); + var targetEl = document.getElementById('wsTodayTarget'); + var barEl = document.getElementById('wsTodayBar'); + var pctEl = document.getElementById('wsTodayPercent'); + if(todayEl) todayEl.textContent = todayWords; + if(targetEl) targetEl.textContent = target; + if(barEl) barEl.style.width = pct + '%'; + if(pctEl) pctEl.textContent = pct + '%' + (pct >= 100 ? ' 🎉 达标!' : ''); + + // Recent works + var recentEl = document.getElementById('wsRecentWorks'); + if(recentEl){ + if(ws.length === 0){ + recentEl.innerHTML = '
📖还没有作品
点击「开新书」开始创作
'; + } else { + recentEl.innerHTML = ws.slice(0, 3).map(function(w){ + var wc = totalWords(w); + var cc = w.chapters ? w.chapters.length : 0; + return '
'+ + '
'+ + '
'+esc(w.title)+'
'+ + '
'+esc(w.genre||'未分类')+' · '+wc+' 字 · '+cc+' 章
'+ + ''+esc(w.updated||'')+'
'; + }).join(''); + } + } +} + +// Quick command from workspace +window.chatQuick = function(cmd){ + chatIn.value = cmd; + // Open chat panel if not open + if(!chatOpen){ + chatOpen = true; + chatP.classList.add('open'); + chatFab.classList.add('on'); + chatFab.textContent = '✕'; + } + send(); +}; + +/* ════════════════════════════════════════ + SETTINGS (个人设置) + ════════════════════════════════════════ */ +var SETTINGS_KEY = 'hl-settings'; +function loadSettings(){ + try{var s = localStorage.getItem(SETTINGS_KEY); return s ? JSON.parse(s) : {dailyGoal:3000,weeklyGoal:15000,style:'casual',reviewLevel:'moderate'}}catch(e){return {dailyGoal:3000,weeklyGoal:15000,style:'casual',reviewLevel:'moderate'}} +} +function saveSettings(s){ + try{localStorage.setItem(SETTINGS_KEY, JSON.stringify(s))}catch(e){} +} + +function renderSettings(){ + var s = loadSettings(); + var dg = document.getElementById('setDailyGoal'); + var wg = document.getElementById('setWeeklyGoal'); + var nn = document.getElementById('setNickname'); + var st = document.getElementById('setStyle'); + var rl = document.getElementById('setReviewLevel'); + if(dg) dg.value = s.dailyGoal || 3000; + if(wg) wg.value = s.weeklyGoal || 15000; + if(nn) nn.value = usr.name || ''; + if(st) st.value = s.style || 'casual'; + if(rl) rl.value = s.reviewLevel || 'moderate'; +} + +document.getElementById('setsSave').onclick = function(){ + var s = { + dailyGoal: parseInt(document.getElementById('setDailyGoal').value) || 3000, + weeklyGoal: parseInt(document.getElementById('setWeeklyGoal').value) || 15000, + style: document.getElementById('setStyle').value, + reviewLevel: document.getElementById('setReviewLevel').value + }; + saveSettings(s); + var nn = document.getElementById('setNickname').value.trim(); + if(nn){usr.name = nn; saveUsr()} + chatMsg('设置已保存 ✅', 'b', {m:'铸渊', t:'本地'}); + AgentBridge.writeLog('settings-update', '用户更新了个人设置'); +}; +document.getElementById('setThemeBtn').onclick = function(){setTh(ti+1)}; + +/* ════════════════════════════════════════ + INSPIRATION (灵感速记) + ════════════════════════════════════════ */ +var INSP_KEY = 'hl-inspirations'; +var inspFilter = 'all'; + +function loadInspirations(){ + try{var d = localStorage.getItem(INSP_KEY); return d ? JSON.parse(d) : []}catch(e){return []} +} +function saveInspirations(list){ + try{localStorage.setItem(INSP_KEY, JSON.stringify(list))}catch(e){} +} + +function renderInspiration(){ + var list = loadInspirations(); + var filtered = inspFilter === 'all' ? list : list.filter(function(item){return item.type === inspFilter}); + var el = document.getElementById('inspList'); + if(!el) return; + + // Update tag active states + document.querySelectorAll('.insp-tag').forEach(function(tag){ + tag.classList.toggle('active', tag.getAttribute('data-type') === inspFilter); + }); + + if(filtered.length === 0){ + el.innerHTML = '
💡还没有灵感记录

在上方输入框记录你的灵感吧
'; + return; + } + el.innerHTML = filtered.map(function(item, i){ + var typeEmoji = {idea:'💡',quote:'💬',scene:'🎭',char:'👤',material:'📚'}; + var typeName = {idea:'点子',quote:'金句',scene:'场景',char:'角色',material:'素材'}; + return '
'+ + '
'+esc(item.text)+'
'+ + '
'+ + ''+(typeEmoji[item.type]||'💡')+' '+(typeName[item.type]||'灵感')+''+ + ''+esc(item.date)+''+ + '
'+ + ''+ + '
'; + }).join(''); +} + +document.getElementById('inspAdd').onclick = function(){ + var inp = document.getElementById('inspInput'); + var text = inp.value.trim(); + if(!text){inp.focus(); return} + var list = loadInspirations(); + var type = inspFilter === 'all' ? 'idea' : inspFilter; + list.unshift({ + id: genId(), + text: text, + type: type, + date: new Date().toISOString().slice(0, 10), + created: new Date().toISOString() + }); + saveInspirations(list); + inp.value = ''; + renderInspiration(); + AgentBridge.writeLog('inspiration-add', '新灵感记录: ' + text.substring(0, 30)); +}; + +// Tag filter +document.getElementById('inspTags').onclick = function(e){ + var tag = e.target.closest('.insp-tag'); + if(!tag) return; + inspFilter = tag.getAttribute('data-type'); + renderInspiration(); +}; + +// Enter to add +document.getElementById('inspInput').onkeydown = function(e){ + if(e.key === 'Enter'){e.preventDefault(); document.getElementById('inspAdd').click()} +}; + +window.deleteInspiration = function(id){ + var list = loadInspirations().filter(function(item){return item.id !== id}); + saveInspirations(list); + renderInspiration(); +}; + +/* ════════════════════════════════════════ + DAILY LOG (每日字数记录) + ════════════════════════════════════════ */ +var DAILY_LOG_KEY = 'hl-daily-log'; +function loadDailyLog(){ + try{var d = localStorage.getItem(DAILY_LOG_KEY); return d ? JSON.parse(d) : {}}catch(e){return {}} +} +function saveDailyLog(log){ + try{localStorage.setItem(DAILY_LOG_KEY, JSON.stringify(log))}catch(e){} +} +function updateDailyLog(){ + var ws = loadWorks(); + var todayStr = new Date().toISOString().slice(0, 10); + var total = 0; + ws.forEach(function(w){total += totalWords(w)}); + var log = loadDailyLog(); + log[todayStr] = total - (log._prevTotal || 0); + if(log[todayStr] < 0) log[todayStr] = 0; + // Store running total for delta calculation + log._prevTotal = total; + saveDailyLog(log); +} +// Update daily log periodically +setInterval(updateDailyLog, 60000); + +/* ════════════════════════════════════════ + RENDER: Progress (进度看板) + ════════════════════════════════════════ */ +function renderProgress(){ + var ws = loadWorks(); + var dailyLog = loadDailyLog(); + var todayStr = new Date().toISOString().slice(0, 10); + var now = new Date(); + + // Calculate stats + var totalW = 0; + ws.forEach(function(w){totalW += totalWords(w)}); + var todayW = dailyLog[todayStr] || 0; + + // Week total + var weekW = 0; + var dayOfWeek = now.getDay() || 7; + for(var d = 0; d < dayOfWeek; d++){ + var dt = new Date(now); + dt.setDate(dt.getDate() - d); + var ds = dt.toISOString().slice(0, 10); + weekW += (dailyLog[ds] || 0); + } + + var ptEl = document.getElementById('progToday'); + var pwEl = document.getElementById('progWeek'); + var paEl = document.getElementById('progTotal'); + if(ptEl) ptEl.textContent = todayW; + if(pwEl) pwEl.textContent = weekW; + if(paEl) paEl.textContent = totalW; + + // Books stats + var booksEl = document.getElementById('progBooks'); + if(booksEl){ + if(ws.length === 0){ + booksEl.innerHTML = '
暂无作品数据
'; + } else { + booksEl.innerHTML = ws.map(function(w){ + var wc = totalWords(w); + var cc = w.chapters ? w.chapters.length : 0; + return '
'+ + '
'+esc(w.title)+'
'+ + '
'+cc+' 章 · '+(w.genre||'未分类')+'
'+ + '
'+wc+'
总字数
'; + }).join(''); + } + } + + // Calendar + renderCalendar(now, dailyLog); + + // Achievements + renderAchievements(totalW, ws, dailyLog); +} + +function renderCalendar(now, dailyLog){ + var year = now.getFullYear(); + var month = now.getMonth(); + var monthEl = document.getElementById('progMonth'); + if(monthEl) monthEl.textContent = year + '年' + (month + 1) + '月'; + + var grid = document.getElementById('progCalGrid'); + if(!grid) return; + + var days = ['一','二','三','四','五','六','日']; + var html = days.map(function(d){return '
'+d+'
'}).join(''); + + var firstDay = new Date(year, month, 1).getDay(); + firstDay = firstDay === 0 ? 6 : firstDay - 1; + var daysInMonth = new Date(year, month + 1, 0).getDate(); + var todayDate = now.getDate(); + var todayStr = now.toISOString().slice(0, 10); + + // Empty cells before first day + for(var i = 0; i < firstDay; i++){ + html += '
'; + } + for(var d = 1; d <= daysInMonth; d++){ + var dateStr = year + '-' + String(month+1).padStart(2,'0') + '-' + String(d).padStart(2,'0'); + var words = dailyLog[dateStr] || 0; + var cls = 'prog-cal-day'; + if(words > 0) cls += ' has-words'; + if(dateStr === todayStr) cls += ' today'; + html += '
'+d+'
'; + } + grid.innerHTML = html; +} + +function renderAchievements(totalW, ws, dailyLog){ + var el = document.getElementById('progAchievements'); + if(!el) return; + + var achievements = [ + {name:'第一个1000字', desc:'累计写了1000字', threshold:1000, icon:'🌟'}, + {name:'第一个10000字', desc:'累计写了10000字', threshold:10000, icon:'⭐'}, + {name:'第一个50000字', desc:'累计写了50000字', threshold:50000, icon:'🏅'}, + {name:'第一个100000字', desc:'累计写了100000字', threshold:100000, icon:'🏆'}, + {name:'开启创作之旅', desc:'创建了第一部作品', threshold:1, icon:'📖', checkWorks:true}, + {name:'多线创作者', desc:'同时拥有3部以上作品', threshold:3, icon:'📚', checkWorks:true} + ]; + + el.innerHTML = achievements.map(function(a){ + var earned = a.checkWorks ? (ws.length >= a.threshold) : (totalW >= a.threshold); + return '
'+ + ''+(earned ? a.icon : '🔒')+''+ + '
'+esc(a.name)+'
'+esc(a.desc)+'
'+ + '
'; + }).join(''); +} + +/* ════════════════════════════════════════ + ENHANCED OFFLINE ROUTING (新页面指令扩展) + ════════════════════════════════════════ */ +// Extend offline function with new module awareness +var _origOffline = offline; +// Patch offline to handle new commands +var origOfflineRef = offline; +offline = function(msg){ + var m = msg.toLowerCase(); + // 新模块相关智能回复 + if(/灵感|记录|金句|素材/.test(m)){ + var insps = loadInspirations(); + return '💡 灵感速记\n\n当前记录了 ' + insps.length + ' 条灵感。\n说「灵感」打开灵感速记本,随时记录闪现的好点子。'; + } + if(/目标|今天写了多少/.test(m)){ + var settings = loadSettings(); + var log = loadDailyLog(); + var today = new Date().toISOString().slice(0,10); + var todayW = log[today] || 0; + return '🎯 今日码字进度\n\n已完成:' + todayW + ' 字\n目标:' + settings.dailyGoal + ' 字\n进度:' + Math.min(100, Math.round(todayW/settings.dailyGoal*100)) + '%\n\n' + (todayW >= settings.dailyGoal ? '恭喜达标!🎉' : '继续加油!💪'); + } + // Fallback to original + return origOfflineRef(msg); +}; + })();