dsh-ui-beautify
Verified@guowenzhang/dsh-ui-beautify · v1.0.0 · Apache-2.0 · Web UI
Page beautification for DeepSeek Harness: download open-source CJK webfonts on demand and let the Web GUI pick its body font
Install
dsh plugin add @guowenzhang/dsh-ui-beautify Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Readme
@guowenzhang/dsh-ui-beautify
English | 中文
背景:DeepSeek Harness
DeepSeek Harness(dsh)是 DeepSeek AI 开源的 agent harness,几乎所有能力都是 Cordis 插件。它处于 developer preview 阶段、迭代很快,会有破坏性变更(文档站,0.1.7-alpha.*);本插件是独立第三方包,@deepseek-ai/* 运行时从宿主解析。
这个插件解决什么问题
Web GUI 的正文与代码字体只能用系统回退字体、无法更改;本插件在 设置 → 通用设置 里各加一行字体选择,字体首次使用时才下载。
截图
设置 → 通用设置:正文字体与代码字体就在字号大小正下方,各自显示所选字体的描述与缓存状态。
安装
npx @deepseek-ai/dsh plugin --profile web add @guowenzhang/dsh-ui-beautify
来自 npm 官方源:https://www.npmjs.com/package/@guowenzhang/dsh-ui-beautify。装完重启宿主;本地目录开发安装、git 源与排查见 AGENTS.md。
用法
选择正文字体
设置 → 通用设置,「字号大小」下方的那一行 正文字体。点右侧胶囊下拉选一款字体;选中即生效、无需确认,选择会写进当前 profile 的设置文件。
选择代码字体
代码字体 行,在正文字体下一行、工作过程展示上方。它默认是 system,所以全新安装不会改变代码显示的任何观感,直到你自己选。
理解 system 的含义
system 移除插件的样式表链接与 token 覆盖,让 token 回到 ui-theme 自己的声明。它不是把今天的默认值冻结一份——上游改默认字体这里会跟随。选中它也是把自定义字体关掉的唯一方式,不需要卸载插件。
看懂缓存状态行
每一行都有标题、当前字体的描述,以及一行状态,例如 已缓存 103 KB · 1/101 片。这里没有下载按钮:字体按需拉取,页面需要多少就取多少。那个分数是按需下载的进度读数,不是失败——你继续浏览、页面出现新字符,它会自己涨。数字只在这一行渲染时与切换字体后约 1.5 秒读取,不是实时订阅;因此状态行末尾常驻一句提示,告诉用户**刷新页面(F5)**即可重新统计。
理解下载行为
下载是按分片进行的,不是整包预取。先取所选字体的样式表,然后只取页面实际用到的字符所属的那几片。同一文件的并发请求会合并;之后再次加载页面全部走本地磁盘,不再联网。
| Situation | What you see |
|---|---|
| The host machine has no outbound network | Downloads fail; the GUI keeps rendering with its fallback fonts |
| The browser has network access but the host does not | Downloads still fail — the browser never contacts an external site |
输入框上方的骑车道
输入框正上方那条带子里有一个骑车的小人:模型在写它就动,不写它就滑行着停下来——输出快就飞快地穿过去,输出慢就慢慢挪,输出一停则保持当时的速度、用 8 秒慢慢减到停住。它是输出的报告,不是一个只顾自己循环的装饰。
它是纯装饰,而且刻意做得很安静:
- 它不读你输入的任何内容、不往任何地方发东西;它唯一测量的是已经到达的助手输出有多少。
- 屏幕阅读器会跳过它(
aria-hidden)。
打开或关掉它
设置 → 通用设置 → 输入框上方的动画,就在两行字体正下方:
| 选项 | 行为 |
|---|---|
| 跟随浏览器(默认) | 默认播放;浏览器要求减少动效时不播放,输入框上方那条带子保持空白 |
| 始终播放 | 即使浏览器要求减少动效也照常播放 |
| 关闭 | 完全不显示 |
这一行的状态行会写出那条带子为什么是空的。如果它说你浏览器报告了 prefers-reduced-motion: reduce,那就是全部原因——**「始终播放」**就是绕过它的方式。
选中即写入设置,但 Host 需要重启一次才会认识这个字段:在那之前,这一行会写「宿主仍在运行本插件的旧版本」。这是本插件每个新设置都要付的一次性代价。
注意事项
- 字体首次使用需要宿主机能联网。 浏览器只跟 DSH 自己的源说话,取文件的是宿主。这是本插件唯一依赖宿主联网的地方,也是浏览器自己通网、首次使用却仍可能失败的唯一原因。
system是代码字体的默认值,所以全新安装在你不选之前视觉上什么都不会变。- 只有
maple-mono-cn覆盖中文。 其余四款只覆盖拉丁字符,中文回退到内置栈;maple-mono-cn还有 9 MB,并且只能走 jsDelivr,因为 npm 镜像没同步这个包。 - 字体没下下来时界面不会坏。 先用回退字体渲染,分片到位后再替换;彻底失败就一直用回退字体。
- 有两处不认字体 token,因为它们的字体是写死的:集成终端(xterm 构造参数,不走 CSS)和队列面板样式表里写死的
Inter前缀。 - 镜像列表与缓存目录是宿主启动时的配置,不是实时设置——改完要重启宿主。
- 骑车道是装饰,不是读数。 它不显示数字,速度也只是输出速度的近似,和状态栏里那个
tok/s不是同一个数:step 还在流式输出时 provider 根本没报 token 数,所以车道量的是字符。 - 新增设置需要重启一次宿主。 浏览器半边刷新页面就换新产物,但宿主每个进程只加载一次设置 schema——所以新加字段对应的那一行在重启 dsh 之前是禁用的。
- 字体不在本插件的许可范围内。 每款字体各自保留自己的许可,见 LICENSE 与 NOTICE。
许可
插件本体是 Apache-2.0——见 LICENSE 与 NOTICE。
插件不分发任何字体文件。 字体按需从 npm 镜像下载到本机缓存,各自保留原始许可。Noto Sans SC、Noto Serif SC、ZCOOL XiaoWei、ZCOOL KuaiLe、ZCOOL QingKe HuangYou、Ma Shan Zheng、Zhi Mang Xing、Long Cang、Liu Jian Mao Cao、Inter、Geist、JetBrains Mono、Fira Code、Geist Mono、Noto Sans Mono 与 Maple Mono CN 为 SIL Open Font License 1.1,由 Fontsource 或字体发布方打包。LXGW WenKai、LXGW WenKai TC 与 LXGW WenKai Screen 同为 SIL Open Font License 1.1;承载它们的 npm 包 lxgw-wenkai-webfont、lxgw-wenkai-tc-webfont 与 lxgw-wenkai-screen-webfont 为 MIT。
延伸阅读
- AGENTS.md —— 完整字体表、下载链路、缓存布局、骑车道的机制、开发命令、加字体流程与排查。
- dsh-web-design —— 姊妹插件,在 DSH 侧栏里预览与编辑 HTML。
- DeepSeek Harness 文档。