Overrides DSH's default conversation stats line: displays turns, steps, time elapsed, cache, and tokens with a running status indicator. Allows custom status text for three states: thinking, working, and completed.
ⓘ This plugin is a sub-package of the CAPTAIN1275/dsh-ui-web monorepo — stars and activity count the whole repository.
- Language
- TypeScript
- License
- Apache-2.0
- Branch
- main
Install
$ dsh plugin --profile web add @captain1275/dsh-full-statsRun the command above in your terminal to install this plugin via the dsh CLI. You can switch Profile in the top-right corner. New to dsh? Read the beginner tutorial
Install via your agent
Install the DeepSeek Harness plugin CAPTAIN1275/dsh-ui-web/packages/dsh-full-stats for me: review the repository at https://github.com/CAPTAIN1275/dsh-ui-web first, then run the install command and verify the plugin loads successfully.
Paste this instruction to the DSH Web GUI assistant — it will install and verify for you.
At a Glance
dsh-full-stats replaces the truncated session statistics line in the DSH Web GUI official version with a full-line wrapped display of turns/steps/duration/first token/speed/cache hit/input-output token numbers, and adds an amber or green runtime status dot at the line start. It provides a collapsible configuration card in the "Web UI Plugins" group, allowing you to customize prompt text for three states: "thinking", "working", and "completed", while replacing the official hardcoded "Deep diving..." placeholder.
Core Capabilities
- Complete session statistics display: Session-level slot component (id=stats, priority=-1) outputs
${turns} turns · ${steps} steps | LLM ${llmMs} · Tool calls ${toolMs} | Avg first token ${ttftMs/steps} | ${decodeTokens/sec} tok/s | Cache hit % | Input tok · Output tok, with fullwhiteSpace:normalwithout omission (src/client/index.ts:121-160). - Runtime status indicator dot: Renders an 8px dot at the line start, amber during active sessions (#f59e0b with 6px shadow), green when idle (#4ade80), with 0.15s transition when switching between sessions (src/client/index.ts:163-196).
- Three-state custom text: Configuration card provides three input fields for "thinking/working/completed" states; leaving empty reverts to original content; after filling, displays corresponding prefix based on session state, followed by complete statistics (src/client/index.ts:152-159, src/client/FullStatsSettingsCard.tsx:104-137).
- Overrides official "Deep diving..." placeholder text: MutationObserver monitors
[class*="turnStatus"]nodes, replaces hardcoded "Deep diving..." text nodes in-place withthinkingText, preserving the clock span (src/client/index.ts:74-91). - Cross-process configuration persistence: Host page registers
GET / PUT /api/full-stats/config, writes to~/.dsh/full-stats.json($DSH_HOME preferred, fallback to~/.dsh); browser configuration card saves and dispatchesdshc-full-stats-configevent after save, statistics line refreshes instantly (src/index.ts:69-92, src/client/FullStatsSettingsCard.tsx:73-85). - WebUI settings card integration: Registers in
web-ui.plugin.itemslot with id=full-stats(order=120), appears alongside task board and skin center in DSH Web settings page (src/client/index.ts:218-226).
Technical Implementation
- Language: TypeScript (ESM, TSX + CSS Modules; compiled with tsdown, target es2024, jsx react-jsx)
- Key Dependencies:
@deepseek-ai/cordis(host plugin runtime, registers webServer routes),@deepseek-ai/dsh-client-runtimeand@deepseek-ai/dsh-client-ui-conversation(browser half injected targets),react ^18.2.0(memoized FullStatsLine and FullStatsSettingsCard rendering) - Architecture Pattern: Cordis dual-half plugin —
src/index.tsis the host half (ctx.inject(['webServer'], ...)registers GET/PUT routes for/api/full-stats/config+ reads/writes~/.dsh/full-stats.json, no-op without webServer),src/client/index.tsis the browser half (ctx.slots.injectoverridesconversation.composer.dock#statsslot + registersweb-ui.plugin.item#full-statsconfiguration card + listens to host routes and dshc-full-stats-config events);cordis.patch.ymlregisters plugin id=ui-full-stats,package.json#dsh.clientdeclaresplatform: "web",inject: [dsh-client-runtime, dsh-client-ui-conversation]. - Entry Files:
src/index.ts(host half entry, apply registers config routes),src/client/index.ts(browser half entry, overrides statistics line + MutationObserver replaces Deep diving + registers config card),src/client/FullStatsSettingsCard.tsx(collapsible config card UI),src/client/card.module.css(card styles, reuses official ui-plugin-config tokens)
Use Cases
Users who run project sessions in DSH Web GUI and want to instantly see the numbers for "how many steps, LLM vs tool time, first token latency, cache hit rate" in the current turn; plus players who want to customize the official "Deep diving..." message (e.g., changing to something like "Fatty fish is eating rice").
Prerequisites & Compatibility
| Dependency | Min Version | Description |
|---|---|---|
| DSH | 0.1.0-rc.6 | devDependencies locks @deepseek-ai/dsh-client-runtime and @deepseek-ai/dsh-client-ui-conversation to ^0.1.0-rc.6, @deepseek-ai/cordis to ^4.0.1 (package.json:33-42) |
| Client profile | web | cordis.patch.yml registers id: ui-full-stats, name: '@captain1275/dsh-full-stats'; package.json#dsh.client.platform is web, inject includes dsh-client-runtime + dsh-client-ui-conversation; browser half won't load under headless/CLI profiles (cordis.patch.yml:1-4, package.json:13-23) |
| React | ^18.2.0 | Browser half React 18 rendering (package.json:42) |
| Node.js | Not declared | Neither root package.json nor this package's package.json has engines field; host half only uses node:fs / node:path / node:os / node:http standard library (src/index.ts:11-13) |
| Platform | Cross-platform (macOS / Windows / Linux) | Only depends on Node standard library, no native bindings; host half path handling auto-adapts via path.join for win32 |
| Native modules | None | No koffi / node-pty / node:sqlite or other native bindings; tests use [email protected] (package.json:34-42) |
Installation
dsh plugin --profile web add github:CAPTAIN1275/dsh-ui-web/packages/dsh-full-stats
After installation, restart DSH Web and enter any project session to see the complete statistics line and status dot below the conversation dialog; a collapsible "Full Stats (Status Text)" configuration card will also appear in DSH Web Settings → Web UI Plugins group.
Configuration Options
| Config | Type | Description | Default |
|---|---|---|---|
| Thinking state text (replaces Deep diving...) | string | Replaces official hardcoded "Deep diving..." placeholder during session thinking phase; empty shows original text | Empty |
| Working state text | string | Custom prefix displayed before statistics line when session is generating a response; empty shows only statistics | Empty |
| Completed state text | string | Custom prefix displayed before statistics line when session is idle and non-empty; empty shows only statistics | Empty |
After filling these three text fields in the "Full Stats (Status Text)" card on the browser side, they are PUT to /api/full-stats/config and persisted to ~/.dsh/full-stats.json, then a dshc-full-stats-config event is dispatched to instantly refresh the statistics line.
FAQ
Q: Where can I see it after installation?
A: Enter any project session in DSH Web GUI, and you'll see a non-truncated statistics line below the conversation dialog (turns/steps/LLM and tool duration/first token/speed/cache hit/input-output tokens) with an amber or green status dot at the start; a collapsible "Full Stats (Status Text)" configuration card will also appear in DSH Web Settings under the Web UI Plugins group.
Q: Where is the config saved? Will it be lost if I uninstall or switch machines?
A: The three text fields are written to the host process side's ~/.dsh/full-stats.json (reads $DSH_HOME environment variable by default, falls back to ~/.dsh); the PUT interface validates field types and overwrites on write. You'll need to manually migrate this JSON file when switching machines; uninstalling the plugin doesn't delete this file.
Q: Which official text does "Thinking state text" replace?
A: It replaces the hardcoded "Deep diving..." placeholder text in the official ChatView inline JSX. The client uses a MutationObserver to monitor [class*="turnStatus"] nodes, matches that string, and replaces it in-place with the user-configured text; the clock span is preserved, only the text node is replaced.
Q: How do the three state texts trigger to display?
A: When session is running + workingText is non-empty, displays the "working" prefix; when session is idle and non-empty + doneText is non-empty, displays the "completed" prefix; if any configuration is an empty string, reverts to the original statistics line without custom prefix.
Q: Will it replace DSH's official statistics line? What about conflicts with other similar plugins?
A: It overrides rather than coexists. The browser half re-registers in conversation.composer.dock slot with same id=stats but lower priority=-1; rendering order between DSH's official component and this plugin's component is determined by priority. This plugin's source code doesn't have special mutual exclusion handling for similar plugins like dsh-live-stats.
Q: Is there a size limit on the config interface?
A: Yes. Requests to PUT /api/full-stats/config with body exceeding 100,000 bytes are rejected by the server and the request is destroyed (reject(new Error('body too large'))); the three text fields combined are far below this limit, so normal input won't trigger it.
Q: Must it be DSH Web to use?
A: Yes. package.json#dsh.client.platform is set to web, the browser half depends on DSH client runtime; the host route /api/full-stats/config is also mounted on DSH Web's webServer, won't load in headless/CLI mode.
Q: Will the statistics line automatically revert to official style after uninstall?
A: Yes. This plugin uses priority=-1 to replace the official id=stats; after plugin uninstall, that override disappears, and DSH Web's built-in statistics line restores — but the official original style is still a truncated whiteSpace:nowrap line.
Difficulty Level
Beginner — install the plugin and restart DSH Web to see the effect; to customize status text, go to Settings page → Web UI Plugins group → expand "Full Stats (Status Text)" and fill in the three text fields, no manual config or command line needed.
Known Issues & Limitations
- Config interface request body limit of 100,000 bytes: PUT
/api/full-stats/configdirectlyreject(new Error('body too large'))andreq.destroy()for requests exceeding this threshold inreadBody; the current three text fields cannot trigger this, but be aware if extending fields in the future (src/index.ts:54-67). - Custom status text prefix only works with "non-empty config": When
thinkingTextis empty,mountThinkingTextReplacerreturns directly; whenworkingText/doneTextis empty, that branch is skipped and reverts to original statistics line — all three text fields must be filled for full effect (src/client/index.ts:76, src/client/index.ts:152-159). cachedConfigis a module-level singleton:let cachedConfigat src/client/index.ts:46 may retain old values in scenarios with multiple plugin instantiations or HMR; config is refreshed viadshc-full-stats-configevent after save, but stale data may still be read when events don't fire (src/client/index.ts:46-63, src/client/index.ts:200-203).- Strongly depends on official DOM selectors and hardcoded text:
mountThinkingTextReplaceruses[class*="turnStatus"]and text "Deep diving..." to match official nodes; will directly become ineffective if official ChatView refactors (class name changes or text i18nization) (src/client/index.ts:74-91). - Aggregate package
dsh-web-ui-allwon't auto-load this plugin: aggregate.yml placesdsh-full-statsindeps:but doesn't list it inpatchFrom:, so dependency-only installation won't injectui-full-statsinto the profile registry — users of the aggregate package need to manually add@captain1275/dsh-full-statstodsh.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/[email protected]
然后在 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 官方立场。
Read the usage guide →
Install steps, key points, FAQ and compatibility for this plugin — auto-derived from indexed fields.
Listing badge
[](https://deepseek-plugin.org/plugins/CAPTAIN1275/dsh-ui-web/packages/dsh-full-stats)Paste this markdown into your GitHub README to link back to this listing. The badge only states the listing — not a security endorsement.