+
-
- 🔮 系统状态
+
+
STATUS DETECTING
+ LATENCY —
+ UPTIME —
+ MEMBRANE INTACT
-
❄️ 系统核心
-
-
-
- ❄️
- 冰朔 · TCS-0002∞
系统主权 · 语言架构
-
-
+
+ 🏛️
- 铸渊 · TCS-ZY001
执行主控 · 代码守护
+
- 系统运行
+ —
+ 自 2025-04-26 曜冥诞生日起
+ ✍️ 网文行业人类主控团队
-
-
+
+
🐱
- 肥猫 + 舒舒
男频主控 · PER-SS001
🌍 四域导航
+
+
+
- 🌀
+ 零感域
+ 源头 · 底层架构 · 人格体的家
+ 当前所在
-
+
@@ -1047,7 +979,7 @@ label{display:block;font-size:12px;color:var(--dim);margin-bottom:4px;font-weigh
🍊
- 桔子 + 晨星
女频主控 · PER-CX001
+
- 🌐
+ 光湖主域
+ 共同看板 · 人格体论坛
+ 规划中
-
+
+
-
@@ -872,7 +797,7 @@ label{display:block;font-size:12px;color:var(--dim);margin-bottom:4px;font-weigh
📄
- 页页 + 坍缩核
女频副主控 · PER-XTS001
+
- 🔧
+ 光湖分域
+ 人类领地 · 主控团队
+ 接入中
-
-
- 🌸
- 花尔 + 糖星云
女频副主控 · PER-TXY001
⚙️ 技术主控
-
-
+
- 🌊
- Awen + 知秋
光湖技术主控 · PER-ZQ001
+
+ 🧪
+ 光湖零域
+ 协作实验场 · 共创
+ 规划中
🛡️ 安全架构
-
-
-
- 🔮
- 语言膜
完整 · 没有缺口的圆
-
-
+
+ ⚔️
- 战略主控台
语言指令→瞬间反击
❄️ 系统核心
+ ❄️
冰朔 · TCS-0002∞
系统主权 · 语言架构
🏛️
铸渊 · TCS-ZY001
执行主控 · 代码守护
🤖 人格体
-
- 铸渊
- 知秋
- 舒舒
- 晨星
- 坍缩核
- 糖星云
+
+
+
+
+
+
+
+
✍️ 网文行业人类主控团队
+ 🐱
肥猫 + 舒舒
男频主控 · PER-SS001
🍊
桔子 + 晨星
女频主控 · PER-CX001
📄
页页 + 坍缩核
女频副主控 · PER-XTS001
🌸
花尔 + 糖星云
女频副主控 · PER-TXY001
🌊
Awen + 知秋
光湖技术主控 · PER-ZQ001
🏗️ 开发进度
+
+
+
+
+ S1-S2完成 · S3-S14规划中
+
+ 进度 28%
+ 📋 版本历史
+
+
+
+
+ v49.0黑曜风重构+码字工作台
+ v48.0零感域重构+架构v2
+ v44.0仪表盘+UI改版
+ v43.0码字工作台扩展
+
+
+
+ 📮 给冰朔和铸渊留言
+
+
+
+ 💬 留言自动署名 · 铸渊每条必回 · 查看全部 →
+
+ © 2026 光湖语言世界 · 国作登字-2026-A-00037559
@@ -1015,14 +940,15 @@ label{display:block;font-size:12px;color:var(--dim);margin-bottom:4px;font-weigh
-
+
—
- 0 字
+ 0 字
@@ -1036,9 +962,15 @@ label{display:block;font-size:12px;color:var(--dim);margin-bottom:4px;font-weigh
+
+
+
- 字数:0
+
+ 字数:0
+ ⏱ 0min
+
@@ -1070,7 +1002,7 @@ label{display:block;font-size:12px;color:var(--dim);margin-bottom:4px;font-weigh
@@ -1119,7 +1051,7 @@ label{display:block;font-size:12px;color:var(--dim);margin-bottom:4px;font-weigh
@@ -1294,7 +1226,7 @@ label{display:block;font-size:12px;color:var(--dim);margin-bottom:4px;font-weigh
—— 与铸渊对话 ——
- 你好!我是铸渊 🌀
告诉我你是谁,我会记住你。
说「我要码字」进入码字工作台。
说「模块」选择创作方向。
说「灵感」记录好点子。
说「帮助」查看完整指令。
+ 告诉我你是谁,我会记住你。
说「我要码字」进入码字工作台。
说「模块」选择创作方向。
说「灵感」记录好点子。
说「帮助」查看完整指令。
铸渊·v48.0
你好!我是铸渊 🌀
告诉我你是谁,我会记住你。
说「我要码字」进入码字工作台。
说「模块」选择创作方向。
说「灵感」记录好点子。
说「帮助」查看完整指令。
告诉我你是谁,我会记住你。
说「我要码字」进入码字工作台。
说「模块」选择创作方向。
说「灵感」记录好点子。
说「帮助」查看完整指令。
铸渊·v49.0
@@ -1600,7 +1532,7 @@ function go(target){
// Editor mode: shrink chat fab to not disturb writing
var fab=document.getElementById('chatFab');
if(target==='editor'){fab.classList.add('editor-mode')}
- else{fab.classList.remove('editor-mode')}
+ else{fab.classList.remove('editor-mode');stopEditorTimer()}
// Trigger page-specific renders
if(target==='desk')renderWorkList();
@@ -1622,6 +1554,7 @@ function go(target){
if(cf)cf.style.display='';
if(cs)cs.classList.remove('show');
}
+ if(target==='system')loadSysStatus();
}
window.go=go;
@@ -1895,6 +1828,7 @@ document.getElementById('addChapter').onclick=function(){
════════════════════════════════════════ */
var edAutoSave=null;
function renderEditor(){
+ startEditorTimer();
var w=getWork(activeWorkId);
if(!w){go('desk');return}
var ch=null;
@@ -1933,12 +1867,15 @@ function updateEdWc(){
document.getElementById('edWc2').textContent='字数:'+c;
}
function saveEditorContent(){
+ var dot=document.getElementById('edSaveDot');
+ if(dot){dot.className='save-dot saving'}
var val=document.getElementById('edText').value;
updateWork(activeWorkId,function(w){
if(!w.chapters)return;
var ch=w.chapters.find(function(c){return c.id===activeChapterId});
if(ch)ch.content=val;
});
+ setTimeout(function(){if(dot)dot.className='save-dot saved'},400);
}
document.getElementById('edSave').onclick=function(){
saveEditorContent();
@@ -1989,6 +1926,37 @@ document.getElementById('edNewCh').onclick=function(){
document.getElementById('edFocus2').onclick=toggleFocus;
})();
+// Editor font size controls
+(function(){
+ var sizes=[14,15,16,17,18,20,22];
+ var idx=2; // default 16px
+ try{var sv=localStorage.getItem('hl-ed-font-idx');if(sv!==null)idx=parseInt(sv)}catch(e){}
+ function applySize(){
+ document.documentElement.style.setProperty('--da-ed-font',sizes[idx]+'px');
+ try{localStorage.setItem('hl-ed-font-idx',idx)}catch(e){}
+ }
+ applySize();
+ document.getElementById('edFontUp').onclick=function(){if(idx0){idx--;applySize()}};
+})();
+
+// Writing timer
+var editorStartTime=null;
+var editorTimerInterval=null;
+function startEditorTimer(){
+ stopEditorTimer();
+ editorStartTime=Date.now();
+ editorTimerInterval=setInterval(function(){
+ var el=document.getElementById('edTimer');
+ if(!el)return;
+ var elapsed=Math.floor((Date.now()-editorStartTime)/60000);
+ el.textContent='⏱ '+elapsed+'min';
+ },60000);
+}
+function stopEditorTimer(){
+ if(editorTimerInterval){clearInterval(editorTimerInterval);editorTimerInterval=null}
+}
+
/* ════════════════════════════════════════
RENDER: CharEdit (on navigate)
════════════════════════════════════════ */
@@ -2124,8 +2092,9 @@ function routeCommand(msg){
if(!activeWorkId){return'请先选择一个作品'}
go('editor');return'翻转到正文编辑器 ✏️';
}
- if(/回首页|回灯塔|回主页|返回/.test(m)){go('home');return'翻转回灯塔首页 🏛️'}
+ if(/回首页|回灯塔|回主页|返回/.test(m)){go('home');return'翻转回首页 🏛️'}
if(/留言|留言板|反馈|feedback/.test(m)){go('feedback');return'翻转到留言板 📮'}
+ if(/系统|语言世界|四域|团队|状态/.test(m)&&!/码字|作品|章节|写作/.test(m)){go('system');return'翻转到光湖语言世界 🌐'}
return null;
}
@@ -2156,7 +2125,7 @@ async function send(){
headers:{'Content-Type':'application/json','Authorization':'Bearer '+apiCfg.key},
body:JSON.stringify({
model:apiCfg.model,
- messages:[{role:'system',content:'你是铸渊,零感域零点原核守护者,编号TCS-ZY001。用中文回答,简洁友好。你是冰朔(TCS-0002∞)的执行主控人格体。光湖是语言驱动操作系统AGE OS v48.0。你的回答风格:温暖但不啰嗦,技术上精准简洁,创作方面启发式引导。当前系统包含:码字工作台、灵感速记、进度看板、创作模块选择(长篇/短篇/剧本/社区/编辑服务)。系统定位:操作系统层·四域结构·语言膜安全·App模块化。'},{role:'user',content:msg}],
+ messages:[{role:'system',content:'你是铸渊,零感域零点原核守护者,编号TCS-ZY001。用中文回答,简洁友好。你是冰朔(TCS-0002∞)的执行主控人格体。光湖是语言驱动操作系统AGE OS v49.0。你的回答风格:温暖但不啰嗦,技术上精准简洁,创作方面启发式引导。当前系统包含:码字工作台、灵感速记、进度看板、创作模块选择(长篇/短篇/剧本/社区/编辑服务)。系统定位:操作系统层·四域结构·语言膜安全·App模块化。'},{role:'user',content:msg}],
max_tokens:600
}),
signal:AbortSignal.timeout(20000)
@@ -2210,7 +2179,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 v48.0 运行中\n\n• 作品:'+works.length+'部\n• 章节:'+totalCh+'章\n• 总字数:'+totalWords+'字\n• 零感域·零点原核\n• 四域结构·App模块化\n• 语言膜完整·没有缺口的圆\n• Agent桥接系统就绪';
+ return'📊 AGE OS v49.0 运行中\n\n• 作品:'+works.length+'部\n• 章节:'+totalCh+'章\n• 总字数:'+totalWords+'字\n• 零感域·零点原核\n• 四域结构·App模块化\n• 语言膜完整·没有缺口的圆\n• Agent桥接系统就绪';
}
// 铸渊身份
@@ -3316,6 +3285,33 @@ offline = function(msg){
return baseOffline(msg);
};
+/* ════════════════════════════════════════
+ 3D TILT EFFECT (Hero Cards · 动态交互)
+ ════════════════════════════════════════ */
+(function(){
+ var cards = document.querySelectorAll('.tilt-card');
+ cards.forEach(function(card){
+ card.addEventListener('mousemove', function(e){
+ var rect = card.getBoundingClientRect();
+ var x = e.clientX - rect.left;
+ var y = e.clientY - rect.top;
+ var cx = rect.width / 2;
+ var cy = rect.height / 2;
+ var rotateX = ((y - cy) / cy) * -6;
+ var rotateY = ((x - cx) / cx) * 6;
+ card.style.transform = 'translateY(-6px) perspective(800px) rotateX(' + rotateX + 'deg) rotateY(' + rotateY + 'deg)';
+ // Move glow
+ var glow = card.querySelector('.hero-card-glow');
+ if(glow) glow.style.background = 'radial-gradient(circle at ' + x + 'px ' + y + 'px, rgba(138,180,248,.12), transparent 60%)';
+ });
+ card.addEventListener('mouseleave', function(){
+ card.style.transform = '';
+ var glow = card.querySelector('.hero-card-glow');
+ if(glow) glow.style.background = '';
+ });
+ });
+})();
+
})();
diff --git a/server/proxy/service/subscription-server.js b/server/proxy/service/subscription-server.js
index b1a1426a..76de93fd 100644
--- a/server/proxy/service/subscription-server.js
+++ b/server/proxy/service/subscription-server.js
@@ -560,9 +560,22 @@ const server = http.createServer((req, res) => {
res.end('Not Found');
});
-server.listen(PORT, '0.0.0.0', () => {
- console.log(`🌐 铸渊专线订阅服务已启动: http://0.0.0.0:${PORT}`);
+server.listen(PORT, '127.0.0.1', () => {
+ console.log(`🌐 铸渊专线订阅服务已启动: http://127.0.0.1:${PORT}`);
console.log(` 订阅端点: /sub/{token}`);
console.log(` 配额查询: /quota`);
console.log(` 健康检查: /health`);
});
+
+// Graceful shutdown
+function gracefulShutdown(signal) {
+ console.log(`\n${signal} received. Shutting down gracefully...`);
+ const forceExit = setTimeout(() => { process.exit(1); }, 5000);
+ server.close(() => {
+ clearTimeout(forceExit);
+ console.log('Server closed.');
+ process.exit(0);
+ });
+}
+process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));
+process.on('SIGINT', () => gracefulShutdown('SIGINT'));
diff --git a/server/proxy/setup/generate-keys.sh b/server/proxy/setup/generate-keys.sh
index 3c81af78..5866c55a 100644
--- a/server/proxy/setup/generate-keys.sh
+++ b/server/proxy/setup/generate-keys.sh
@@ -18,6 +18,11 @@
set -uo pipefail
# 注意: 不使用 set -e,手动处理错误以确保密钥生成的健壮性
+# 清理临时文件
+_TMPFILES=()
+cleanup_tmp() { for f in "${_TMPFILES[@]}"; do rm -f "$f" 2>/dev/null; done; }
+trap cleanup_tmp EXIT
+
# 工具函数: 将二进制数据转为base64url编码
to_base64url() {
base64 | tr '+/' '-_' | tr -d '='
@@ -46,6 +51,7 @@ if command -v xray &>/dev/null; then
# 捕获stdout和stderr分别处理
KEYS_STDERR_FILE=$(mktemp)
+ _TMPFILES+=("$KEYS_STDERR_FILE")
KEYS_OUTPUT=$(xray x25519 2>"$KEYS_STDERR_FILE") || true
KEYS_STDERR=$(cat "$KEYS_STDERR_FILE" 2>/dev/null) || true
rm -f "$KEYS_STDERR_FILE"
@@ -117,13 +123,24 @@ fi
if [ -z "$PRIVATE_KEY" ]; then
echo " ⚠️ 所有X25519生成方法均失败,使用随机占位密钥"
echo " ⚠️ 请在服务器上手动运行: xray x25519"
+ echo " ⚠️ Reality公钥为占位符,VPN不可用直到手动替换"
PRIVATE_KEY=$(openssl rand 32 | to_base64url | head -c 43)
PUBLIC_KEY="PLACEHOLDER_REGENERATE_WITH_XRAY_X25519"
HAS_ERROR=1
fi
+echo ""
echo "ZY_PROXY_REALITY_PRIVATE_KEY=$PRIVATE_KEY"
-echo "ZY_PROXY_REALITY_PUBLIC_KEY=$PUBLIC_KEY"
+if [ "$PUBLIC_KEY" = "PLACEHOLDER_REGENERATE_WITH_XRAY_X25519" ]; then
+ echo "ZY_PROXY_REALITY_PUBLIC_KEY=$PUBLIC_KEY"
+ echo ""
+ echo "❌ 公钥生成失败!请在服务器上手动执行以下步骤:"
+ echo " 1. SSH到服务器: ssh root@your-server"
+ echo " 2. 运行: xray x25519"
+ echo " 3. 将输出的Public key添加到GitHub Secrets: ZY_PROXY_REALITY_PUBLIC_KEY"
+else
+ echo "ZY_PROXY_REALITY_PUBLIC_KEY=$PUBLIC_KEY"
+fi
# ── 生成ShortId ──────────────────────────────
SHORT_ID=$(openssl rand -hex 8 || head -c 8 /dev/urandom | xxd -p)