覆盖 DSH 官方会话统计行:完整展示轮/步/耗时/缓存/token,加运行状态指示点,并允许自定义思考中/工作中/完成时三种状态文本。
- 语言
- TypeScript
- License
- Apache-2.0
- 分支
- main
安装
$ dsh plugin --profile web add github:CAPTAIN1275/dsh-ui-web/packages/dsh-full-stats在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程
一句话定位
dsh-full-stats 覆盖 DSH Web GUI 官方那条会被截断的会话统计行,把它替换成一整行可换行展示的轮/步/耗时/首 token/速度/缓存命中/输入输出 token 数字串,并在行首加一颗琥珀色或绿色的运行状态点。它在「Web UI 插件」分组里提供一张可折叠配置卡,让你自定义「思考中 / 工作中 / 完成时」三种状态的提示文字,并替换官方硬编码的「Deep diving...」。
核心能力
- 完整展示会话统计:会话级插槽组件(id=stats,priority=-1)输出
${turns} 轮 · ${steps} 步 | LLM ${llmMs} · 工具调用 ${toolMs} | 首 token 平均 ${ttftMs/steps} | ${decodeTokens/秒} tok/s | 缓存命中 % | 输入 tok · 输出 tok,整行whiteSpace:normal不省略(src/client/index.ts:121-160)。 - 运行状态指示点:行首渲染 8px 圆点,会话运行中为琥珀色(#f59e0b 带 6px 阴影)、空闲为绿色(#4ade80),点击会话切换有 0.15s 过渡(src/client/index.ts:163-196)。
- 三种状态自定义文本:配置卡提供「思考中 / 工作中 / 完成时」三段输入框,留空即退回原始内容;填了之后按会话状态显示对应前缀,文本后仍接完整统计(src/client/index.ts:152-159、src/client/FullStatsSettingsCard.tsx:104-137)。
- 覆盖官方「Deep diving...」占位文本:MutationObserver 监听
[class*="turnStatus"]节点,遇到官方硬编码的「Deep diving...」文本节点即原位替换为thinkingText,保留时钟 span(src/client/index.ts:74-91)。 - 跨进程配置持久化:宿主页注册
GET / PUT /api/full-stats/config,写入~/.dsh/full-stats.json($DSH_HOME优先,否则~/.dsh),浏览器配置卡保存后即派发dshc-full-stats-config事件,统计行即时刷新(src/index.ts:69-92、src/client/FullStatsSettingsCard.tsx:73-85)。 - WebUI 设置卡接入:在
web-ui.plugin.item插槽注册 id=full-stats(order=120),与任务看板、皮肤中心同级出现在 DSH Web 设置页(src/client/index.ts:218-226)。
技术实现
- 语言: TypeScript(ESM,TSX + CSS Modules;tsdown 编译,target es2024、jsx react-jsx)
- 关键依赖:
@deepseek-ai/cordis(host 插件运行时,注册 webServer 路由)、@deepseek-ai/dsh-client-runtime与@deepseek-ai/dsh-client-ui-conversation(browser 半区被注入目标)、react ^18.2.0(memo 化 FullStatsLine 与 FullStatsSettingsCard 渲染) - 架构模式: Cordis 双半区插件 —
src/index.ts是 host 半区(ctx.inject(['webServer'], ...)注册/api/full-stats/configGET/PUT 路由 + 读写~/.dsh/full-stats.json,无 webServer 服务时为空操作),src/client/index.ts是 browser 半区(ctx.slots.inject覆盖conversation.composer.dock#stats插槽 + 注册web-ui.plugin.item#full-stats配置卡 + 监听宿主路由与 dshc-full-stats-config 事件);cordis.patch.yml注册插件 id=ui-full-stats,package.json#dsh.client声明platform: "web"、inject: [dsh-client-runtime, dsh-client-ui-conversation]。 - 入口文件:
src/index.ts(host 半区入口,apply 注册配置路由)、src/client/index.ts(browser 半区入口,覆盖统计行 + MutationObserver 替换 Deep diving + 注册配置卡)、src/client/FullStatsSettingsCard.tsx(可折叠配置卡 UI)、src/client/card.module.css(卡片样式,复用官方 ui-plugin-config token)
适用场景
已经在 DSH Web GUI 里跑项目会话、想要一眼看清本轮「跑了多少步、LLM 与工具各花了多久、首 token 多快、缓存命中几成」的数字党;以及想把官方「Deep diving...」改成自己人格化文案(如「大肥鱼正在吃白饭」)的玩家。
前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| DSH | 0.1.0-rc.6 | devDependencies 锁定 @deepseek-ai/dsh-client-runtime 与 @deepseek-ai/dsh-client-ui-conversation 为 ^0.1.0-rc.6,@deepseek-ai/cordis 为 ^4.0.1(package.json:33-42) |
| 客户端 profile | web | cordis.patch.yml 注册 id: ui-full-stats、name: '@captain1275/dsh-full-stats';package.json#dsh.client.platform 为 web,inject 含 dsh-client-runtime + dsh-client-ui-conversation;headless / CLI profile 下浏览器半区不会加载(cordis.patch.yml:1-4、package.json:13-23) |
| React | ^18.2.0 | 浏览器半区 React 18 渲染(package.json:42) |
| Node.js | 未声明 | 仓库根 package.json 与本包 package.json 均无 engines 字段;host 半区仅用 node:fs / node:path / node:os / node:http 标准库(src/index.ts:11-13) |
| 平台 | 跨平台(macOS / Windows / Linux) | 仅依赖 Node 标准库,无原生绑定;host 半区路径处理由 path.join 自动适配 win32 |
| 原生模块 | 无 | 没有 koffi / node-pty / node:sqlite 等原生绑定;测试用 jsdom@29.1.1(package.json:34-42) |
安装方式
dsh plugin --profile web add github:CAPTAIN1275/dsh-ui-web/packages/dsh-full-stats
安装后重启 DSH Web,进入任意项目会话即可看到对话框下方的完整统计行与行首状态点;DSH Web 设置页 → Web UI 插件分组里也会出现「完整统计行(状态文本)」可折叠配置卡。
配置项
| 配置 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| 思考中状态文本(替换 Deep diving...) | 字符串 | 会话思考阶段替换官方硬编码「Deep diving...」占位文本,留空则显示原文本 | 空 |
| 工作中状态文本 | 字符串 | 会话正在生成回复时显示在统计行前的自定义前缀,留空则只显示统计行 | 空 |
| 完成时状态文本 | 字符串 | 会话空闲且非空白时显示在统计行前的自定义前缀,留空则只显示统计行 | 空 |
以上三项文本在浏览器侧的「完整统计行(状态文本)」卡片填写后,PUT 到 /api/full-stats/config 持久化到 ~/.dsh/full-stats.json,并发 dshc-full-stats-config 事件让统计行即时刷新。
常见问题
Q: 安装后能在哪里看到它?
A: 进入 DSH Web GUI 任意项目会话,对话框下方会多出一行不省略的统计行(轮/步/LLM 与工具耗时/首 token/速度/缓存命中/输入输出 token),行首带琥珀色或绿色状态点;DSH Web 设置页的「Web UI 插件」分组里也会出现一张「完整统计行(状态文本)」可折叠配置卡。
Q: 配置保存到哪?卸载或换机器会丢吗?
A: 三项文本字段写到宿主进程侧的 ~/.dsh/full-stats.json(默认读取 $DSH_HOME 环境变量,回退 ~/.dsh),PUT 接口在写入前会校验字段类型并覆盖式写回。换机器需要手动迁移这个 JSON 文件;卸载插件不会删除该文件。
Q: 「思考中状态文本」是覆盖官方哪段话?
A: 覆盖官方 ChatView 内联 JSX 硬编码的「Deep diving...」占位文本。客户端用 MutationObserver 监听 [class*="turnStatus"] 节点,匹配到该字符串后原位替换为用户配置;保留时钟 span,仅替换文本节点。
Q: 三种状态文本要怎么触发显示?
A: 会话运行中 + workingText 非空时显示「工作中」前缀;会话空闲且非空白 + doneText 非空时显示「完成时」前缀;任意一种配置为空串就退回原始统计行,不显示自定义前缀。
Q: 它会替代 DSH 官方的统计行吗?其他类似插件冲突怎么办?
A: 是覆盖而非并存。浏览器半区以同 id=stats、更低 priority=-1 在 conversation.composer.dock 插槽里重新注册;DSH 自带的官方组件与本插件组件的渲染顺序由 priority 决定。本插件源码中未对 dsh-live-stats 等同类插件做特殊互斥处理。
Q: 配置接口有大小限制吗?
A: 有。PUT /api/full-stats/config 的请求体超过 100,000 字节会被服务端直接拒绝并销毁请求(reject(new Error('body too large')));三个文本字段加起来远低于该阈值,常规输入不会触发。
Q: 必须 DSH Web 才能用吗?
A: 是。package.json#dsh.client.platform 字段为 web,浏览器半区依赖 DSH 客户端运行时;宿主路由 /api/full-stats/config 同样挂在 DSH Web 的 webServer 上,headless / CLI 模式不会加载。
Q: 卸载后统计行会自动恢复成官方样式吗?
A: 会。本插件以 priority=-1 顶替官方 id=stats,移除插件后该覆盖项随插件卸载消失,DSH Web 自带的统计行即恢复显示——但官方原始样式仍是会被截断的 whiteSpace:nowrap 行。
上手难度
入门 — 装好插件、重启 DSH Web 即可看到效果;想要自定义状态文本时进入设置页 → Web UI 插件分组展开「完整统计行(状态文本)」填写三项文本即可,无需手写配置或命令行。
已知问题与限制
- 配置接口请求体上限 100,000 字节:PUT
/api/full-stats/config在readBody中对超过该阈值的请求直接reject(new Error('body too large'))并req.destroy();当前三个文本字段不可能触发,但若未来扩展字段需注意(src/index.ts:54-67)。 - 自定义状态文本前缀只在「非空配置」下生效:
thinkingText为空时mountThinkingTextReplacer直接 return,workingText/doneText为空时跳过对应分支退回原始统计行——三段文本必须都填才有完整效果(src/client/index.ts:76、src/client/index.ts:152-159)。 cachedConfig是模块级单例:src/client/index.ts:46的let cachedConfig在多次实例化插件或 HMR 场景下可能残留旧值;保存配置后通过dshc-full-stats-config事件刷新,但事件未触达时仍可能读到陈旧数据(src/client/index.ts:46-63、src/client/index.ts:200-203)。- 强依赖官方 DOM 选择器与硬编码文本:
mountThinkingTextReplacer用[class*="turnStatus"]与文本「Deep diving...」匹配官方节点;若官方 ChatView 重构(class 名变更或文本 i18n 化)将直接失效(src/client/index.ts:74-91)。 - 聚合包
dsh-web-ui-all不会自动加载本插件:aggregate.yml 把dsh-full-stats放在deps:但未列入patchFrom:,所以仅依赖安装不会把ui-full-stats注入 profile 名册——通过聚合包使用者需手动将@captain1275/dsh-full-stats加入dsh.profile.bundles(packages/dsh-web-ui-all/aggregate.yml:21-31、README.md:97-110)。
基于 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 官方立场。