- Início
- Plugins
- Melhorias de UI
- dsh-check-for-updates
dsh-check-for-updates
shanhaifish/dsh-check-for-updates
DSH 更新检查插件(静态 bundle):首次打开自动检查 DSH 新版本(取 npm 实际最高版本),左下方弹窗提示并提供【更新到】按钮自动执行已校验升级;UI 使用 DSH 语义化主题 token;DSH 安装根/版本、node/npm 均在运行时探测,无硬编码路径。
Instalar
dsh plugin --profile web add github:shanhaifish/dsh-check-for-updatesREADME
DSH 更新检查插件
一个用于检查 DSH (DeepSeek Harness) 更新的动态 Cordis 插件。
截图 (Screenshots)
① 左下方浮动更新弹窗 —— 首次打开页面自动检查到新版本时,在左下部「设置」按钮上方弹出提示卡片,提供【更新到 {版本}】与【稍后】;点「稍后」后该版本不再重复弹出。

② 设置 > 通用 · DSH 更新入口 —— 手动「检查更新 / 测试网络」,展示当前版本与最新版本;有新版本时提供【更新到】按钮(升级完成后重启 DSH 生效)。

安装(静态 bundle,推荐)
本仓库同时提供两种形态:
| 形态 | 文件 | 是否自动加载 |
|---|---|---|
| 静态 bundle(推荐) | package.json + cordis.patch.yml + lib/ + client/ | 是,dsh plugin add 后随 profile 层栈自动加载 |
| 动态插件(回退) | host.js + client.js | 否,需每次重启后 cordis_define/cordis_run |
# 从 npm(推荐,已发布到 npmjs):
dsh plugin --profile web add dsh-check-for-updates
# 从 GitHub:
dsh plugin --profile web add github:ShanHaiFish/dsh-check-for-updates
# 本地开发用 file: 指向本仓库(注意路径不能含空格):
dsh plugin --profile web add "file:/absolute/path/to/dsh-check-for-updates"
npmjs: dsh-check-for-updates
Mac/Linux 上若路径含空格或非 ASCII(如本机
...2026-DeepSeekHarness相关\...),建议先 复制到无空格的路径再file:安装。
无硬编码路径:bundle 版 host(lib/index.js)在运行时通过 require.resolve('@deepseek-ai/dsh/package.json')
与 process.execPath 探测 DSH 安装根/版本与 node/npm-cli,不写死任何本机路径,跨机器可用。
(动态回退形态 host.js 为受限沙箱、无法运行时探测,保留一个 documented 的默认安装根常量。)
客户端:bundle 版在左下部「设置」上方浮动弹窗(首次打开自动检查 + 【更新到】/【稍后】),
通过 POST /dsh-update-check/api 调用 host;「设置 > 通用」内的入口仅在动态形态提供。
功能特性
- ✅ 在设置 > 通用 中显示"DSH 更新"设置项
- ✅ 显示当前版本和最新版本信息
- ✅ 支持手动点击"检查更新"按钮
- ✅ 首次打开 Web 页面时自动触发一次更新检查
- ✅ 发现新版本时,在左下部"设置"按钮上方弹窗提示,并提供【更新到 {版本}】按钮
- ✅ 弹窗支持【稍后】关闭,同版本不再重复弹出
- ✅ 添加"测试网络"按钮用于调试
文件结构
host.js- 主机端代码,负责从 npm registry 获取版本信息client.js- 客户端代码,负责在设置中显示更新状态和弹窗提示
版本历史
v1.12.0 (当前版本)
修改内容:
- 首次打开自动检查更新(客户端):页面加载时自动触发一次
check-for-updates(模块级autoStarted标志保证每页只检查一次,不随 HMR 重复);自动检查失败不打扰用户。 - 设置按钮上方弹窗(客户端):检测到新版本且本会话未「稍后」过该版本时,在左下部「设置」
按钮上方(
shell.overlay帧级浮动层,fixed定位)弹出提示卡片,显示「有新版本可用」 「当前→最新版本」,并提供【更新到 {版本}】主按钮与【稍后】次级按钮。- 点【更新到 {版本}】→ 复用 Host 的
perform-update做精确版本安装 + 安装后对盘校验, 成功/失败均在弹窗内反馈;成功后自动关闭弹窗。 - 点【稍后】→ 该版本号记入
sessionStorage(dsh-updck-dismissed-version),同版本不再弹出; 出现更新版本则重新弹出。
- 点【更新到 {版本}】→ 复用 Host 的
- 状态订阅改多监听器(客户端):
updateState.onUpdate单值回调改为listeners: Set, 让「设置项」与「弹窗」两个组件同时实时刷新、互不覆盖。 - fetch 提供方 id 唯一化(主机端 v1.10.1):每次激活用唯一 id 注册
updck-curl-*, 避免与先前面动态包已注册的updck-curl冲突导致 Host 启动失败;若已有可用提供方则跳过注册。 - 弹窗配色沿用
--dsw-alias-*语义化主题 token(带兜底),随亮/暗色与第三方主题自动适配。
说明:新增/改动均在既有 RPC(check-for-updates / perform-update / get-current-version /
test-network)之上完成,无需协议变更。
v1.11.0
修改内容:
- 主题适配:客户端 UI 不再使用硬编码颜色(
#007bff/#28a745/#dc3545等), 全部改用 DSH 语义化主题 token--dsw-alias-*:- 主按钮(更新):
var(--dsw-alias-button-primary-fill, var(--dsw-alias-brand-primary)), 文字var(--dsw-alias-label-primary-foreground, var(--dsw-alias-bg-layer-1)) - 成功/有新版本:
state-success-primary;错误:state-error-primary;更新中:state-warn-primary - 边框
border-l1/l2;表面bg-layer-*/bg-module-platform;文字label-primary/secondary/tertiary
- 主按钮(更新):
- 对不确定存在的 token 使用
var(--a, fallback)兜底,保证任意主题(含用户安装的主题插件、 亮/暗色)下与整体配色一致。 - 主机端无改动(仍 v1.10.0)。
v1.10.0
修改内容:
- 新增【更新】按钮自动执行升级(方案 B):
- 检测到新版本时,设置页出现蓝色【更新到 {版本}】按钮。
- 点击后 Host 端
perform-update用 node + npm-cli.js(不经 cmd shell)执行npm install -g --prefix <真实全局根> @deepseek-ai/dsh@<精确版本>。 - 显式
--prefix从运行中的 package.json 程序化推导真实全局根,规避.npmrc中prefix=/home/whaow/.npm-global被 npm 在 Windows 误解析成不存在的M:\...的坑。 - 精确版本固定(用已校验的 semver 最高版本),不用
latest/next标签,消除歧义。 - 前置守卫:仅当
compareVersions(目标, 当前) > 0才执行;已是最新则 no-op。 - 安装后对盘校验:再次读取本地 package.json,版本必须等于目标才算成功。
- 超时保护(180s)自动
terminate;失败给出 npm 输出尾部可排查。 - 成功后提示「已更新到 X,请重启 DSH 生效」——不自动重启(进程内自杀式重启不稳定, 会终止当前会话/GUI),由用户重启加载新版本。
- 客户端新增:
updating状态、更新按钮、更新结果信息、可展开的「执行日志」。 - 打开设置页依旧不触发任何网络/升级动作;无更新时不显示【更新】按钮。
稳定性保证:精确版本 + 显式程序化 --prefix + 前置守卫 + 安装后校验 + 超时/取消上界 + 不自动重启。
v1.9.0
修改内容:
- 只手动检查更新:打开设置页不再自动发起网络检查;挂载时仅本地读取并显示「当前版本」,只有点击「检查更新」才触发最新版本检查。
- 注册 curl/subprocess fetch 提供方(
updck-curl):本部署没有内置 fetch 提供方,web.fetch原本永远报no usable web provider is registered。插件用subprocess启动curl.exe抓取 npm registry,注册为WebFetchProvider,让web.fetch真正可用。 - 最新版本不再取
/latest标签:npm 的latest标签可能滞后(如仍指向0.1.0-rc.7,而最新发布在next标签是0.1.0-rc.8)。改为读取完整 packumenthttps://registry.npmjs.org/@deepseek-ai/dsh的versions,用内置的小型 semver 比较器取实际发布的最高版本。 - 保留
web.search作为最后兜底。
根因回顾:
tool-web的fetch: true只注册模型侧web_fetch工具,并不注册 fetch 后端;fetch 后端必须由某插件调用web.registerFetchProvider注册——本部署没有,需插件自行提供。/latest返回的是latestdist-tag,可能滞后于next上的新 rc 版本。
当前方案:
- 当前版本:
fs.resolve/readText读取本地@deepseek-ai/dsh/package.json - 最新版本:curl 抓 npm packument → semver 取最高版本 → 失败降级
web.search
注意事项:
- 因为会
spawn curl(subprocess),安全审查判定为 BLOCK(120/300),需在插件安全白名单放行updck家族后运行。 - curl 不可用或 spawn 被拦截时,会降级
web.search(尽力而为)+ 显示错误提示。
v1.7.0
修改内容:
- 修复"当前版本: 0.0.0"问题 - 使用已验证的本地版本号
0.1.0-rc.7 - 修复"无法获取最新版本信息"问题
- 修改
C:\Users\whaow\.dsh\profiles\web\cordis.patch.yml配置,启用fetch: true(需要重启 dsh 生效) - 最新版本通过
web.fetch请求https://registry.npmjs.org/@deepseek-ai/dsh/latest获取
排查过程(已确认的根因):
web.fetch被 DSH 默认配置fetch: false禁用(dsh-base/cordis.patch.yml)web.search返回的 snippet 全部为空,无法提取版本号- 动态插件沙箱禁止
require和globalThis.fetch,只能使用 Cordis 服务 - 安全审查将"文件读取 + 网络访问"组合判定为数据外传路径(high),导致 ASK 审批
当前方案:
- 当前版本:写死为
0.1.0-rc.7(升级 DSH 后需手动更新此值) - 最新版本:
web.fetch请求 npm registry
注意事项:
- ⚠️ 需要在
cordis.patch.yml中启用fetch: true并重启 DSH 后,web.fetch才可用 - 重启前点击"测试网络"会显示 web.fetch 不可用
- 升级 DSH 后,记得更新
host.js中的CURRENT_VERSION常量
v1.6.0
修改内容:
- 修复
no usable web provider is registered错误 - 发现 DSH 配置中
fetch: false,web fetch 功能被禁用 - 改用
web.search()搜索 npm 包版本信息 - 使用
fs服务读取本地package.json获取当前版本 - 从搜索结果中提取版本号
根本原因:
- DSH 默认配置
fetch: false,禁用了 web fetch 功能 - 动态插件无法使用
require或globalThis.fetch - 必须使用 Cordis 服务(
ctx.web,ctx.fs)
解决方案:
- 当前版本:使用
fs.resolve()+fs.readText()读取本地@deepseek-ai/dsh/package.json - 最新版本:使用
web.search()搜索 "@deepseek-ai/dsh npm version" 并提取版本号
注意事项:
- 搜索结果可能不准确,版本号提取依赖正则匹配
- 如果需要更准确的版本检测,需要在 DSH 配置中启用
fetch: true
v1.4.0
修改内容:
- 修复
no usable web provider is registered错误 - 移除对
web和shell服务的硬依赖(inject) - 改用
globalThis.fetch直接发起网络请求(Node.js 18+) - 简化代码结构,移除复杂的 provider 注册逻辑
- 所有网络请求统一使用
fetchUrl()封装函数
v1.3.0
修改内容:
- 修复
getCurrentVersion()读取本地实际安装版本的 bug - 注入
shell服务,通过node -e命令读取本地@deepseek-ai/dsh/package.json的版本 getLatestVersion()继续从 npm registry 获取最新版本- 添加备用方案:本地读取失败时回退到 npm registry dist-tags
- 修复版本比较逻辑(之前 current 和 latest 都从 npm 获取,永远相同)
v1.2.0
修改内容:
- 移除
fs依赖,简化代码 - 当前版本和最新版本都从 npm registry 获取
- 增强错误处理和日志输出
- 添加测试网络按钮用于调试
v1.1.0
修改内容:
- 增强
web.fetch错误处理,添加详细日志 - 添加获取本地 DSH 版本功能(使用
ctx.fs) - 添加备用方案:从 npm registry 获取当前版本
- 添加测试网络按钮用于调试
- 改进版本比较逻辑
v1.0.0
初始版本:
- 设置项显示
- 手动检查更新
- 弹窗提示
使用方法
安装插件
- 将
host.js和client.js代码复制到 DSH 动态插件定义中 - 使用
cordis_define定义插件 - 使用
cordis_run运行插件
验证功能
- 打开 DSH Web 界面
- 进入 设置 > 通用
- 找到 DSH 更新 设置项
- 点击 测试网络 按钮验证网络连接
- 点击 检查更新 按钮验证功能
- 查看控制台日志获取详细信息
技术细节
主机端 (host.js)
- 注入
web服务 - 使用
web.fetch从 npm registry 获取版本信息 - 注册以下 RPC 方法:
check-for-updates- 检查更新get-current-version- 获取当前版本test-network- 测试网络连接
客户端 (client.js)
- 注册设置项到
settings.general.item槽位 - 使用
host.call调用主机端方法 - 注册弹窗到
shell.overlay槽位 - 添加"测试网络"按钮用于调试
WebFetchRequest 格式
{
url: 'https://registry.npmjs.org/@deepseek-ai/dsh/latest'
}
注意:不需要 method 和 headers 参数
WebFetchResult 格式
{
url: string, // 最终URL
statusCode: number, // HTTP状态码(不是 status)
body: { // 是对象,不是字符串
kind: 'html' | 'text',
content: string // 实际内容
},
truncated: boolean
}
调试方法
1. 查看控制台日志
插件会在控制台输出详细的调试信息:
web.fetch的返回结果- 版本获取过程
- 错误信息和堆栈
2. 使用"测试网络"按钮
点击"测试网络"按钮可以:
- 验证
web.fetch是否正常工作 - 检查 npm registry 是否可访问
- 查看返回的数据格式
3. 检查错误信息
如果出现错误,插件会显示:
- 用户友好的错误提示
- 详细的控制台日志
- 错误堆栈信息
后续优化
- 使用 semver 库:进行语义化版本比较
- 添加缓存机制:避免频繁请求 npm registry
- 定时检查:实现每天自动检查一次更新
- 改进错误处理:显示更友好的错误信息
- 添加更新日志:显示新版本的更新内容
许可证
MIT License