Files
dsh_shenxian/dsh-server-docs/04-调整方案/139-品牌中文名改为能力网络.md
T
admin c2b7c5ef71 平台共享模型改为「管理员逐用户授权」+ 品牌中文名改「能力网络」+ 修掉跨机模型落地/语言偏好静默失效
三条线合并入库(同一次部署批次,源码与生产此前已一致):

一、档案 138 · 平台共享模型:管理员逐用户授权(默认关闭)
  用户口径原文:「admin 设置的共享模型,需要 admin 在用户列表中开启(新增选项,默认关闭),
  用户才能在会话中使用(以及在设置的模型设置页面展示)」。
  · DB 迁移 v11:新增 users.shared_model_granted(DEFAULT 0 = 默认关闭)。
    ⚠️ 刻意**不**复用 v6 的 shared_model_enabled —— 那是用户侧偏好(用户能自己关,默认 1),
    而本需求要的是**管理员门禁**;共用一列则用户点一下就给自己授权,门禁形同不存在。
    生效 = granted ∧ enabled(server.ts#sharedLandingRows)。
  · 新路由 POST /api/admin/users/:id/models/shared(requireAdmin)+ 审计 shared_model_grant
    + **尽力而为**重启该用户实例(租约被占/实例未运行都不算失败)。
  · admin 用户列表新增「共享模型」列;用户侧 /api/me/keys 增 shared.granted / sharedModelGranted;
    插件 0.3.24:未授权时「平台共享模型」整块不渲染。

二、顺带修掉一个既有真缺陷:平台侧写用户 home 必须走 UserFs(用户卷在 worker 上)
  landModels 原先 join(owner.home_dir, …) + 本机 fs ⇒ 对「实例不在控制面本机」的用户
  读到空串(**不报错**)⇒ 模型落地一直是**静默空操作**(托管清单还被清空)
  ——即档案 87 的模型设置页对 guest 这类用户**从未生效**。
  · UserFs 新增 readHomeFile/writeHomeFile + 文件名白名单(settings.yaml / .credentials.yaml)
  · worker agent 新增 /fs/home-read /fs/home-write(只认白名单裸文件名)
  · landModels 改走 userFs(与"文件面"同一份按归属路由 ⇒ 落地与实例必然同机)
  · 同轮把 /api/me/locale(档案 102 语言偏好)也改成同一套(原先同样失效)
  · home-files.ts 抽出 backupHomeFile(备份留平台侧,命名规则逐字不变)

三、档案 139 · 品牌中文名:能力枢纽 → 能力网络(其他语言仍 CapabilityNet)
  落点四处:i18n 中文词条 / admin.html 顶栏 / favicon.svg 的 title+aria-label / design.css 注释;
  test/i18n-brand.test.mjs 期望值同步。档案 137 顶部加"后续"指针,不改历史。

验证(全部真机实测):
  · 红腿:未授权 → 106 上 guest 的 .credentials.yaml refs 变空(共享 key 被撤)
  · 绿腿:授权 → key 回来 + 托管清单恢复 ["DEEPSEEK_API_KEY"]
  · admin 列表带出 sharedModelGranted;用户侧 granted 随授权翻面(true/shared ↔ false/none)
  · 开关两次均 200(不再假失败);插件实装 0.3.24 且含 gating 字符串
  · 语言偏好:106 上 settings.yaml 出现 locale.preference=en(属主=实例属主,既有段逐字保留)
  · 本机 npm test 226 tests / 225 pass / 0 fail / 1 skipped;四个 verify 脚本全绿

部署:47 推 51 个 lib 产物、106 推 12 个(lib/ 是 gitignore ⇒ 回滚点物化在
/opt/dsh/backups/seq138b-20260919-125345/,逐文件对账 0 不一致;先 106 后 47);
插件 business-plugins 0.3.24(两机 artifacts 与本机 pack md5 一致)。
2026-09-19 13:51:01 +08:00

4.5 KiB
Raw Blame History

139 · 品牌中文名:能力枢纽 → 能力网络

  • 日期:2026-09-19
  • 状态:✅ 已上线(静态资源直覆,无需重启;页面与接口双端实测)
  • 触发(用户口径,原话):「把页面上的能力枢纽 改为能力网络」(同轮先说过「能力领域」,随即更正为「能力网络」)
  • 上游:档案 137(品牌标识去 DeepSeek 图形,定名「能力枢纽」)—— 本档只改名,不动结构
  • 落点:web/i18n.js、web/admin.html、web/favicon.svg、web/design.css(注释)、test/i18n-brand.test.mjs

TL;DR|中文品牌名 「能力枢纽」→「能力网络」;其他语言不变(仍 CapabilityNet, 走 en 词条 = 所有其他语言的回退)。改名落在四处:i18n 的中文词条、admin.html 顶栏文字、 favicon.svg 的 <title> 与 aria-label(浏览器标签页/读屏可见 —— 最容易漏)、design.css 注释。 回归测试与 verify-static(含 SVG 真解析)全绿;线上 4 文件两端 md5 一致。


一、为什么改这几处(判据:用户可见面,不是"字符串出现即改")

落点 是否用户可见 处置
web/i18n.js 的 zh 表 brand.name ✅ 登录 / 注册 / 唤醒 / 工作台页头 改 为 能力网络
web/i18n.js 的 en 表 brand.name ✅ 其他语言全靠它回退 不动(仍是 CapabilityNet)
web/admin.html 顶栏 <span class="wordmark"> ✅ 管理页页头(该页纯中文、未接 i18n) 改
web/favicon.svg 的 <title> / aria-label ✅ 标签页提示 / 读屏 改 —— 只 grep 改 .html/.js 会漏掉它(本轮第一版就漏了)
web/design.css 第 53 行注释 ❌ 不可见,但写的是现行事实 顺手更正(留着会误导下一个人)
test/i18n-brand.test.mjs — 测试断言 六条语言路径的期望值同步
档案 137 / 本档引用的历史记述 — 不改历史(137 保持原样,仅由 TOP 指针指过来)

二、验证

项 结果
品牌回归测试 test/i18n-brand.test.mjs 2/2 通过(中文三条路径 = 能力网络;英文与未支持语言 = CapabilityNet)
静态校验 verify-static.mjs 全合格(含 favicon.svg 段)
SVG 真解析 xml.etree.ElementTree.parse('web/favicon.svg') = OK(⚠️ 137 那次踩过"注释含 -- 导致整份 SVG 静默失效",本档只改文本节点,仍逐次复验)
旧名残留 grep -rn 能力枢纽|能力领域 web/ test/ scripts/ poc/ src/ ⇒ 仅剩 i18n 注释里一句"此前用过哪个名"的留痕(有意保留)
线上 4 文件(admin.html / i18n.js / design.css / favicon.svg)本机 ↔ /opt/dshs/web/ md5 逐一致;回滚点 /opt/dsh/backups/seq138-web-20260919-125345/(4 个旧文件)
零回归 全量 npm test 226 / 225 pass / 0 fail / 1 skipped

三、两个执行细节(都是既有经验的重用,不是新坑)

  1. 行尾按"目标目录既有风格"逐文件对齐(⛔ 不按 HEAD 判):服务器 web/ 目录实测 admin.html = CRLF / design.css = CRLF / i18n.js = LF / favicon.svg = LF ⇒ 推 admin.html 前先用 脚本转 CRLF 并断言 CR 数 == 行数(本机工作树是 LF,直接 scp 会把整文件行尾翻掉)。
  2. 改 i18n 的"改名类"改动必须配断言:品牌词条漏配/写错是静默失败(中文用户看到英文名), 所以 test/i18n-brand.test.mjs 用 node:vm 跑仓库里那份真实 i18n.js,断言六条语言解析路径的 实际渲染结果 —— 本轮把期望值从「能力枢纽」改为「能力网络」,跑通即证。

四、未做 / 待办

  1. 🔴 alotbuy.com 的旧域页面仍会显示旧名? 不会 —— 旧域已降级为 301 过渡装置(档案 135), 页面由同一份 /opt/dshs/web/ 直出 ⇒ 旧域访客看到的也是新名。
  2. ⚠️ 会话页面左上角(用户实例内的 dsh 会话窗口)不属本仓 web/,由官方 @deepseek-ai/dsh 的 client bundle 渲染、受 R2 约束 ⇒ 本档不涉及(与档案 137 的范围声明一致)。
  3. ⚠️ 词条语义澄清:用户曾提到「小写 CapabilityNet」;本档按「中文=能力网络/其他语言=CapabilityNet」实现。 若原意是"再加一行小写英文",改动量 = i18n.js 一处 + design.css 一行(⛔ 不碰 HTML)。