dsh-update-status
Read-only DeepSeek Harness Web sidebar version chip that shows the running DSH version, npm latest/next/alpha channels, compatibility labels, and a copy-only upgrade command.
Install
dsh plugin --profile web add dsh-update-status
Sandbox test results
| Stage | Result |
|---|---|
| 1 install | ✓ |
| 2 list | ✓ |
| 3 mount | ✓ |
| 4 boot | — |
Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).
README
<h1 align="center">DSH Update Status</h1>
<p align="center">DeepSeek Harness Web 的版本状态、仅复制升级提示,以及需用户级服务监督的安全重启。</p>
<p align="center">
<a href="https://www.npmjs.com/package/dsh-update-status"><img src="https://img.shields.io/npm/v/dsh-update-status?label=npm&color=CB3837" alt="npm 版本"></a>
<a href="https://github.com/idoall/dsh-update-status/actions/workflows/ci.yml"><img src="https://github.com/idoall/dsh-update-status/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-0F172A" alt="MIT"></a>
</p>
<p align="center"><a href="README.md">English</a> | 中文</p>
<p align="center">
<a href="#功能">功能</a> ·
<a href="#安装">安装</a> ·
<a href="#使用">使用</a> ·
<a href="#更新检查">更新检查</a> ·
<a href="#受监督的重启">受监督的重启</a> ·
<a href="#局域网非回环页面访问">局域网访问</a> ·
<a href="#可加载性与更新提示">可加载性</a> ·
<a href="#配置">配置</a> ·
<a href="#故障排查">故障排查</a> ·
<a href="#安全边界">安全边界</a> ·
<a href="#卸载">卸载</a> ·
<a href="docs/RELEASING.md">发布指南</a>
</p>
DSH Update Status 是 DeepSeek Harness 社区插件。它不修改 DSH 核心,不会安装或升级 DSH、回滚 DSH 包、下载 release 或替换 DSH 文件,也绝不会自行安装更新或自行重启 DSH;只有你显式安装并接管了当前 DSH Web 的用户级后台服务后,它才会请求一次受限的安全重启。
插件只把展开侧栏中的品牌名称换成适配 24px 品牌行的 DeepSeek + 版本芯片,官方鱼标保持不变。版本号旁的绿点表示线上没有更新的版本;橙色呼吸圆点表示线上至少有一个更新的版本——无论是稳定版、RC 还是 Alpha。点击芯片即可看到当前运行版本、每个更新版本一张卡片(各带自己的“仅复制”升级命令),以及只有装好用户级监督后才会出现的重启按钮。
<p align="center">
<img src="./assets/update-panel.zh.png" width="400" alt="DSH 更新状态面板:缓存时长、正在运行的 0.2.1-alpha.1 显示已是最新与上次检查时间、检查更新/发布说明/重启三个操作,以及“只有受用户级服务监督时才允许安全重启”的说明">
</p>
功能
- 侧栏版本状态:展开侧栏显示当前 DSH 版本。收起侧栏时不渲染任何入口——DSH 的
sidebar.footer.action是「设置」上方的一格 36px 位置,第二个注册者会把这一行撑破(实测把相邻插件的入口顶出了屏幕左缘),所以品牌行芯片是唯一入口。 - 安静的更新提示:有新版本时不改变版本 Badge 的背景,只在版本号旁保留一个带小光晕的橙色圆点做放大缩小的呼吸动画(
prefers-reduced-motion下停用动画),让新版本表现为一盏小灯,而不是整条品牌行换色。 - 一眼三态:没有可做的事时,版本号旁是纯绿色小圆圈(取主题 success 色,不再跟随文字色——暗色外壳下不会再出现一个看起来像「熄灭」的深色点);检查中是中性灰呼吸点;有新版本才是橙色光晕呼吸点。只有更新态会动、会发光,也只有状态读取失败才会把 Badge 重绘成红色。
- 中性版本底框:Badge 在明暗两套主题下都用灰色二级面(浅色
#f1f3f5/ 深色#353638)配主题常规文字色,所以暗色下是「深灰底 + 白字」,不再是会把橙色光晕吃掉的白框。 - 浅色 / 深色 / 跟随系统,自动适配:插件渲染的每个颜色都是 DSH 语义令牌,Badge、圆点、光晕与面板都按 DSH 当前外观解析。DSH 设为浅色、深色或跟随系统,插件就跟着切换——插件侧没有自己的主题开关,也没有需要同步的媒体查询。hover 在两个方向上都是「抬起」:浅色下压深、深色下提亮(把主题文字色按比例混进底色实现)。
- 一个可升级版本一张卡片:凡是严格新于当前运行版本的已发布版本,各占一张卡片,最新的排在最上面;每张卡片带的是该版本自己的只复制命令。没有任何更新版本时不显示卡片,面板直接说明当前版本最新。
- 只有最新那张卡片被强调:最高版本用琥珀色描边加最新标签突出,其余卡片保持中性。没有手动排序控件:顺序就是版本顺序,只有最上面那张被强调。
- 只有一条发布线、零配置:一次 registry 请求读取 npm 的全部 dist-tags,保留所有比当前运行版本更新的版本——稳定版、RC、Alpha 一视同仁。没有需要关注的通道,也没有需要做的选择。
- 诚实的预发布比较:运行版本与每个候选版本按 SemVer 排序,因此
0.2.1-rc.4高于0.2.0-rc.2,而 RC 仍然低于它自己的正式版。 - 按版本给命令,只复制不执行:每张卡片上的命令都钉在该卡片的确切版本上,不用会移动的 dist-tag,插件也从不执行它。
- 不再维护兼容台账:面板不再声称某个 DeepSeek Harness 版本“与本构建一起测过”。能不能加载由 DSH 自己按声明的引擎范围与
@deepseek-ai/dsh-settingspeer 范围判定。 - 缓存但不轮询:Host 挂载时检查一次,缓存可设为 30–1,440 分钟并合并并发请求;前端没有轮询,只有“检查更新”按钮绕过缓存。
- 移动端可靠:详情使用浏览器 modal top layer;底部 sheet 可滚动、适配 safe area,并保持在 DSH 抽屉上方。
- 受监督的安全重启:一次性装好后台服务后,面板就能替你重启 DSH——它会先提醒会中断哪些工作,而终端直启或桌面应用托管的 DSH 会被直接拒绝。
安装
要求:
- 带 Web profile 的 DeepSeek Harness
- DeepSeek Harness
>=0.1.7-alpha.2 <0.3.0——这是插件在dsh.engines.dsh中声明的范围,@deepseek-ai/dsh-settingspeer 范围与之相同。超出范围的 bundle 会在 profile 加载时被 DSH 拒绝。没有“已验证发布清单”需要你对照:在范围内,插件不需要等某个版本被“批准”。 - Node.js 20 或更新版本
已经安装 dsh 命令:
dsh plugin --profile web add dsh-update-status@latest
直接使用 DeepSeek Harness 源码:
corepack enable pnpm install pnpm dsh plugin --profile web add dsh-update-status@latest
安装后重启原有 DSH 进程,再刷新 Web GUI。不要为本插件启动第二个 Web server。
本地开发 link:
pnpm install --frozen-lockfile pnpm run build dsh plugin --profile web add "link:$(pwd)"
使用
1. 打开 DSH 左侧抽屉。官方鱼标仍在;名称行显示 DeepSeek + 当前版本 Badge。
2. 点击 Badge。面板打开时不会触发外层“新建会话”按钮。
3. 看当前运行版本。线上没有更新的版本时,面板会说明当前就是最新版本,并且没有任何卡片可点。
4. 否则每个更新的已发布版本各有一张卡片,最新的在最上面。卡片显示版本号、承载它的 dist-tag(npm 有报告时)、所属发布线和发布时间。
5. 复制你想装的那张卡片上的命令(每条都钉在该卡片的确切版本上),在运行 DSH 的那台电脑的终端中自行执行。
6. 包管理器命令完成后,只有已完成[受监督的重启](#受监督的重启)接管时才使用面板里的重启;否则仍由你自行重启 DSH。
全局安装时,卡片上的命令可能长这样:
npm install -g @deepseek-ai/dsh@0.2.1-rc.4
每张卡片只显示一条与检测到的安装方式匹配、并写明该卡片确切版本号的命令,插件不会运行它。当这种安装方式给不出包管理器命令时(例如源码检出),面板只在整块面板上给一次说明,而不是给每张卡片配一个复制按钮去编造命令。
圆点含义
版本号旁那颗圆点承载全部状态,且只有更新态会动:
圆点 · 状态 · 含义
绿色小圆圈 · 已是最新 · 线上没有更新的已发布版本,芯片保持原底色。
灰点呼吸 · 检查中 · 状态读取正在进行(首次挂载,或点了检查更新)。
橙色圆点 + 光晕 · 有更新 · 线上至少有一个更新的版本。复制某张卡片的命令、自行执行,然后重启 DSH。
芯片变红 · 读取失败 · 插件无法判定状态:registry 读取失败,或两个版本无法按 SemVer 比较。
<p align="center">
<img src="./assets/sidebar-chip.png" width="300" alt="版本芯片在浅色外壳(浅灰底、深色字)与深色外壳(深灰底、白字)下的样子,右侧都是表示已是最新的绿点">
</p>
芯片本身是中性二级面——两套主题都是灰色,文字用主题常规色——所以橙色光晕始终看得清,而且它绝不会为了宣布更新而改变颜色。
更新检查
插件按缓存周期向 npm registry 请求一次 @deepseek-ai/dsh,收集所有被 dist-tag 指向的已发布版本,保留严格新于当前运行版本的那些,并按从新到旧列出。latest、next、alpha 是 npm 自己的记账方式,不是需要用户做的选择:哪个 tag 上挂着更新的版本,就计入哪个。
- npm 返回的每个 tag 都算,包括插件没听说过的 tag。同一个版本可能带多个 tag,卡片上只显示一个,按
latest、next、alpha、beta、rc、其他的顺序取。 - 按 SemVer 从高到低排列(含预发布):因此跑到稳定版前面的
alpha会被列出,而不是被藏起来。 - 比较是精确的:
0.2.1-rc.4比0.2.0-rc.2新,两者都低于0.2.1。 - 列表以当前运行版本为准:升级 DSH 后重新检查,卡片会变少;装回旧版本则会变多。
- npm 网页只在包首页显示
latest那个 tag,其他 tag 上的版本要到 Versions 页面才看得到。面板不照搬这个简化,它们都会被列出。 - 这里不会安装任何东西,也不会自动应用任何更新。跟随某条通道——以及保存它的
channel偏好——已在0.2.0移除。
受监督的重启
插件没法自己重启 DSH:它就住在那个要被换掉的进程里。所以只有让操作系统来托管这个进程,按钮才有意义——而每个系统本来就自带这个能力。
最短且安全的接管流程是显式在终端执行:
# 1. 只预览完整的原生服务计划:不写文件,不启动服务。 dsh plugin --profile web exec dsh-update-status-service plan \ --workspace "$PWD" --dry-run # 2. 只落盘用户服务定义:仍然不会启动它。 dsh plugin --profile web exec dsh-update-status-service install \ --workspace "$PWD" # 3. 由你自己在旧终端停止直启的 dsh web,再激活服务。 dsh plugin --profile web exec dsh-update-status-service activate
activate 发现端口还被占着就停手,绝不去杀进程,所以你正在用的 DSH 不会被突然掐掉;激活之后它还会确认服务真的接管了——一启动就不停失败的服务会被当作失败报出来,而不是假装成功。这之后就交给重启按钮:它先列出正在跑的东西,有东西在跑时再问一次,然后才让 DSH 退出;服务把新的拉起来,页面自己回来。
同一个端口只允许一个启动者。如果别的工具自己拉起了 dsh web——另一个插件的重启助手、nohup 脚本——那个进程会占着端口,而你的服务会一直启动失败。插件会直接问操作系统「这个服务真正拥有的是哪个进程」,所以这
…(truncated)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::27,最后更新 2026-10-28