DSH 网页端的皮肤中心:在 GUI 设置页里即时试穿、一键应用皮肤,热载入无需重启。
- 语言
- TypeScript
- License
- Apache-2.0
- 分支
- main
安装
$ dsh plugin --profile web add github:CAPTAIN1275/dsh-ui-web/packages/skins/skin-center在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程
一句话定位
DSH 网页端的皮肤中心,把皮肤列表、试穿、一键应用内嵌进 GUI 的"插件配置 → Web UI 插件"卡片组。它通过 host 半区路由写入 ~/.dsh/cordis.patch.yml,DSH 配置 watcher 自动热载入,无需重启。
核心能力
- 在 GUI 设置页里集中浏览皮肤:"官方默认"+ 已安装的全部皮肤(aurora / ths / xp / blue-fantasy / dragon-heir / minecraft / whale-song / trading / miku),每条带名称、tagline、强调色色卡,当前激活目标带 Active 标记。
- 真实试穿:点击"试穿"按需加载皮肤的
lib/client.js,走页面自己的模块加载器(<script>同源注入 +__ModuleLoader__.load),不依赖eval;亮/暗主题切换走官方 theme 服务,"退出试穿"完整还原激活皮肤的状态。 - 一键应用:host 路由
/api/skin-center/apply执行与dsh-skin use等价的内嵌实现,写入~/.dsh/cordis.patch.yml的dsh-skin managed段,DSH 配置 watcher 秒级热载入后浏览器自动刷新页面,无需重启;official目标会把所有皮肤禁用,回到 DSH 官方原貌。 - 互斥保险:试穿期间按配方暂时撤掉当前激活皮肤的视觉写面(body 属性、背景内联样式、chrome 子节点),退出后按原顺序、原快照原样恢复;同一时刻页面上永远只有一套皮肤生效。
- 背景遮挡:卡片内置 0–100 的背景遮罩滑块,把数值写到
--dsw-skin-scrimCSS 变量;只对会画背景插画的皮肤(蓝色幻想 / 鲸吟)即时生效,官方默认无背景图时滑块保持持久但视觉无变化。 - 跨站围栏:host 路由对
Sec-Fetch-Site=cross-site与 Origin/Host 不匹配直接 403,仅同源 fetch 可调用/apply与/state,防止恶意网页通过 localhost CSRF 改写用户皮肤配置。
技术实现
- 语言: TypeScript + React 18(jsx: react-jsx,target es2024)
- 关键依赖:
@deepseek-ai/cordis(host 半区运行时)、@deepseek-ai/dsh-client-runtime/dsh-client-ui-theme/dsh-client-ui-settings/dsh-client-ui-slots/dsh-client-locale(client 半区 SDK)、schemastery(设置命名空间 Schema 定义) - 架构模式: cordis 双半区 bundle。
src/index.ts是 host 半区(cordis pluginui-skin-center,注册/api/skin-center/{state,apply,bundle/<id>}路由并声明skin-background设置命名空间);src/client/index.ts是 browser 半区(DSH 客户端插件,挂载到web-ui.plugin.item槽位下的"Skin Center"卡片);皮肤切换的 host 实现src/skin-switch.ts是scripts/dsh-skinCLI 的 1:1 ESM 端口——不再依赖dsh-skin二进制在 PATH。 - 入口文件:
src/index.ts(host apply)+src/client/index.ts(browser apply);cordis patch 在cordis.patch.yml中插入 idui-skin-center。
适用场景
觉得在终端里敲 dsh-skin use <name> 再等刷新太繁琐、想在 GUI 里直接看到皮肤实际效果再决定是否切换的人:卡片支持在真实 GUI 上"试穿 → 退出还原 → 一键应用"的完整流程,亮/暗主题在试穿时也可即时切换预览。想要在画插画背景的皮肤上加一层遮罩让面板更突出的人:卡片内置的 0–100 背景遮挡滑块只对画背景的皮肤生效。装了多个皮肤、希望把整套皮肤切换入口集中到一个地方的人:本插件同时承担"加载器 + 渲染器"职责,注册表由 packages/skins/<id>/skin.json 自动扫描生成,新皮肤加入即出现在卡片列表里。
前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| @deepseek-ai/dsh-* | ^0.1.0-rc.6 | host / client 半区都通过 SDK 注入服务;皮肤中心把对官方 DSH 的耦合吸收在内 |
| React | ^18.2.0 | peerDependency,SkinCenter.tsx 使用 React hooks |
| Node | ^22.19 || >=24 | 仓库根 AGENTS.md 强制要求;package.json 未声明 engines,但 host 侧使用 node:fs / node:os / node:path |
| 平台 | 跨平台 | macOS / Windows / Linux 全部支持;Windows 用目录 junction 兜底无权限场景,DSH 主目录优先 $DSH_HOME,仓库根从脚本位置推导 |
| 原生模块 | 无 | 无 native binding 依赖;样式由皮肤自带 CSS 提供,lightningcss 仅在仓库根 devDependencies |
安装方式
dsh plugin --profile web add github:CAPTAIN1275/dsh-ui-web/packages/skins/skin-center
配置项
| 配置 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| skin-background.backgroundOpacity | 0–100 | 主页背景遮罩强度;写入 body CSS 变量 --dsw-skin-scrim,仅对画背景插画的皮肤(蓝色幻想 / 鲸吟)即时生效,官方默认无背景图时视觉无变化但值仍持久化 | 0 |
常见问题
Q: 一键应用皮肤后需要重启 DSH 吗?
A: 不需要。点击"应用"或"恢复默认"后,host 端把目标皮肤写入 ~/.dsh/cordis.patch.yml 的 dsh-skin managed 段,DSH 自带的配置 watcher 在数秒内热载入新补丁,浏览器自动刷新页面即生效。
Q: 试穿会改动当前激活的皮肤吗?
A: 不会。试穿仅在浏览器侧临时收回当前皮肤的 body 属性、背景内联样式和 chrome 子节点,"退出试穿"会按原快照、原顺序原样恢复;激活皮肤自身的 cordis 纤维全程不被触碰,状态完全保留。
Q: 皮肤还没构建 lib/client.js 时试穿会怎样?
A: 试穿会报错并自动还原激活皮肤。host 路由 /api/skin-center/bundle/<id> 在目标 lib/client.js 不存在时返回 404,前端 catch 后调用 controller 的还原分支,绝不会留下半套皮肤。
Q: Windows 上能用吗?
A: 可以。皮肤切换在 Windows 下用目录 junction(绝对路径)创建 profile node_modules 链接,不需要开发者模式或管理员权限;DSH 主目录优先读 $DSH_HOME,缺省 ~/.dsh,仓库路径由脚本自身位置推导,不依赖 $HOME 或固定路径。
Q: 跨站请求会被拒绝吗?
A: 会。host 路由对 Sec-Fetch-Site=cross-site 直接返回 403,Origin 与 Host 不匹配同样拒绝,仅同源 fetch 可调用 /api/skin-center/apply 与 /state,防止恶意网页通过 localhost CSRF 改写用户的皮肤配置。
Q: 怎么添加一款新皮肤到列表里?
A: 在 packages/skins/<id>/ 放一份 skin.json(id 匹配 [a-z0-9-]+,package 与 wiring.id 必填),再为该皮肤构建 lib/client.js。注册表由脚本扫描 skin.json 自动生成,无需修改皮肤中心代码;重建 generated/skins.ts 即可在卡片里看到新条目。
Q: 背景遮挡滑块有什么用?
A: 它控制主页背景的遮罩强度(0–100,默认 0),把数值写到 document.body 的 --dsw-skin-scrim CSS 变量上。仅对会画背景插画的皮肤(蓝色幻想 / 鲸吟)即时生效,官方默认无背景图时该滑块不产生视觉变化,但值仍会被持久化到下一次切到画背景的皮肤。
Q: 官方默认也能"试穿"吗?
A: 可以。点击官方默认卡片上的"试穿"会触发同一套收回配方,临时撤掉当前皮肤的视觉写面,但不挂载任何皮肤,页面立即回到 DSH 官方原貌;点击"退出试穿"则恢复激活皮肤。
上手难度
入门 — 装好后打开"插件配置 → Web UI 插件 → 皮肤中心"就能看到所有已安装皮肤,"试穿"无需任何额外配置,"应用"一键完成且自动刷新;仅当要加自定义皮肤或调试 Windows 权限问题时才需要进一步了解。
已知问题与限制
- host 侧
wiredNames()暂时只读skin.json的wiring.bundleWired字段判定"bundle 层已注入";若皮肤是通过 active profile 的dsh.profile.bundles注入,源码注释里标了 TODO,暂未实现对应探测(src/skin-switch.ts:245-247)。 - 一键应用对未正确解析的皮肤是硬门槛:
/api/skin-center/apply会先调用checkResolvable校验目标 profile 中是否存在带package.json与 host 入口的目录,缺一即抛错;这意味着 npm 聚合包里的皮肤目录如果没带可解析包元数据,/apply会拒绝并报中文提示,让用户先dsh-skin install安装(src/skin-switch.ts:527-552)。 - 试穿过程按"快照当前激活皮肤 → 临时收回 → 加载新皮肤"的顺序进行;若加载中用户连续触发多次切换,前一个 in-flight 请求会被 epoch 机制识别为被超越,只清理自己挂载的资源、不会回退整张页面(src/client/try-on.ts:208-231)。
- profile node_modules 链接创建需要创建权限;Windows 上没有开发者模式时自动 fallback 到目录 junction,但仍可能因组策略受限失败,错误信息会被
symlinkFriendly包装成中文提示(src/skin-switch.ts:496-506)。
基于 zhu1090093659/dsh-web-ui(Apache-2.0)开发的 DeepSeek Harness(DSH)Web UI 插件套件。全套 22 个包已发布到 npm(
@captain1275/*)。
DSH Web UI 全家桶为 DeepSeek Harness 的 Web 界面提供一系列插件与皮肤:极光毛玻璃皮肤、任务看板、 SSH 运维、右侧文件/变更面板、Git 图谱、移动端远程控制、DeepSeek 娘看板娘(养成系)、实时令牌统计, 以及皮肤中心。所有插件既可独立安装,也可通过聚合包一次装齐。
极光 Aurora 皮肤效果(沉浸光感 / 深色 / 浅色)



特性
极光(Aurora)皮肤(支持动态背景)
- 毛玻璃输入框:高斯模糊(backdrop-filter 30px)+ 半透明玻璃底 + 细边框 + 内高光
- 自定义背景:URL / 本地图片 / 动图(GIF/WebP)/ 视频(mp4/webm) / 透明度 / 模糊调节,
深浅两套极光渐变;视频背景支持静音开关、本地文件持久化(存
~/.dsh/skin-aurora-media/,刷新不丢) - 仿Claude Code推理等级滑块:点击模型菜单的「推理等级」弹出 Effort 滑块面板——无极拖动、松手吸附、 WebGL 火焰跟随、OFF/MAX 刻度、Low/Medium/High/Ultracode 状态

- 用户消息气泡毛玻璃:与输入框统一的玻璃质感
DeepSeek 看板娘(养成系)
- 图片资源(社区同人资源,codex-pet-DeepSeek-girl)
- 养成系统:亲密度 4 级成长(幼鲸 / 伙伴 / 挚友 / 深海羁绊)、升级庆祝气泡、进度条、 Token 零食经济、使用时长成长(每 30 分钟 +1)
- 待机随机气泡:空闲时随机说话(live2d 风格文案)
- 摸头 / 喂食 / 改名 / 拖动,召唤按钮(live2d 同款贴边滑出)
Skill 人格设定
- 设置「人格设定」:开关启用/禁用常驻人格,编辑技能名、描述与人格正文
- 一键生效:保存后写入用户级技能
~/.dsh/skills/catgirl-rp/SKILL.md,DSH 技能系统实时加载, 所有新对话自动以该人格回应(含语气、动作表达、互动规则) - 内置猫娘人格:默认提供「小咪」猫娘人格(常驻生效、好感度系统、模式切换指令),可自由改写
- 可临时退出:对话中说「退出角色扮演模式」即切回普通助手,说「进入角色扮演模式」恢复

用量看板
- 彩色统计卡:累计 token、调用次数、缓存命中、估算费用(按 DeepSeek 官方定价)
- 近 14 天趋势:每日 token 消耗柱状图
- 模型分布:各 provider/model 用量环形图 + 图例
- 会话排行:Top 20 会话(标题 / 模型 / 调用数 / token / 费用)
- 自动记录:对话时自动采集 token 用量(会话快照替换语义,不双计),存
~/.dsh/usage.json - 侧边栏入口:彩色柱状按钮打开全屏看板
功能插件
| 插件 | 功能 |
|---|---|
| dsh-task-board | 侧边栏任务看板:多列 kanban、真实执行(驱动 agent 会话)、定时执行(cron) |
| dsh-ssh | SSH 运维:主机管理、远程执行、SFTP 传输、隧道、集群并发、Web 终端 |
| dsh-aionui-panel | 右侧「预览 / 文件 / 变更」面板:文件树、多格式预览、git 操作、文件拖拽 |
| dsh-git-graph | 会话头部 git 分支选择器 + 提交图 |
| dsh-live-stats | 实时 token 估算与生成速度 |
| dsh-full-stats | 完整统计行:覆盖官方统计(不省略)+ 运行状态指示 + 自定义状态文本(含替换官方 Deep diving...) |
| dsh-usage-dashboard | 用量看板:彩色统计卡 / 近 14 天趋势 / 模型分布 / 会话排行 / 费用估算 |
| dsh-web-ui-settings | 设置页「Web UI 插件」配置组 + 「人格设定」+「关于」版权页 |
| dsh-web-ui-all | 聚合包:一键安装全部插件 |
皮肤中心
10 套皮肤(ths / xp / blue-fantasy / dragon-heir / minecraft / miku / trading / whale-song / aurora / skin-center),支持皮肤启用互斥管理与一键切换。
其余皮肤(ths / xp / blue-fantasy / dragon-heir / minecraft / miku / trading / whale-song) 为上游 dsh-web-ui 自带皮肤。
安装
方式一:npm(推荐,已发布)
# 在 DSH profile 目录(~/.dsh/profiles/web)安装聚合包
npm install @captain1275/dsh-web-ui-all@0.2.8
然后在 profile 的 package.json 里把 @captain1275/dsh-web-ui-all 加入
dsh.profile.bundles:
{
"dsh": {
"profile": {
"bundles": [
"@deepseek-ai/dsh-base",
"@deepseek-ai/dsh-web-app",
"@captain1275/dsh-client-ui-skin-aurora",
"@captain1275/dsh-full-stats",
"@captain1275/dsh-web-ui-all"
]
}
}
}
重启 DSH 即生效。
方式二:从源码(开发)
git clone <your-repo-url> dsh-web-ui
cd dsh-web-ui
pnpm install
pnpm -r build
# 把本地包链接进 profile(junction)
node scripts/link-profile.mjs
开发
- 构建:
pnpm -r build(或pnpm --filter <package> build) - 新增皮肤:参考
packages/skins/aurora(skin.json+src/client+cordis.patch.yml), 然后用node scripts/skin-center-bundles重新生成注册表 - 聚合包 patch:编辑
packages/dsh-web-ui-all/aggregate.yml后node scripts/aggregate.mjs - 皮肤资产同步:
node packages/dsh-skins/build.mjs
目录结构
packages/
├─ dsh-task-board / dsh-ssh / dsh-aionui-panel / dsh-git-graph
├─ dsh-pet / dsh-live-stats / dsh-full-stats
├─ dsh-web-ui-settings / dsh-web-ui-all / dsh-skins
└─ skins/ # 皮肤源码(aurora、miku、ths 等)
scripts/ # 构建 / 注册表 / 链接工具
shared/ # 共享构建预设(tsdown.client.ts)
版权与许可
- 主体代码:zhu1090093659/dsh-web-ui,Apache-2.0
- 增强优化:@captain1275
- DeepSeek 娘精灵图:xpy12367/codex-pet-DeepSeek-girl, 社区同人资源,版权归原作者
- 人形图标:Font Awesome 6.7.2,CC BY 4.0
- 样式参考:live2d-widget(GPL-3.0,仅参考视觉风格,未搬用代码)
- 商标:DeepSeek 及其相关标识均为 DeepSeek 官方资产;本插件为社区开发者独立维护的非官方同人项目, 不代表 DeepSeek 官方立场。