
Research
/Security News
OpenAPI React Query Codegen Compromised in Mini Shai-Hulud npm Supply Chain Attack
Ten malicious OpenAPI React Query Codegen versions were published to npm in the Mini Shai-Hulud attack, all with valid provenance.
dsh-updater
Advanced tools
DeepSeek Harness 更新检查插件:检测当前 DSH 版本与 npm registry 最新版本,弹窗提示并在 full access 模式下自动更新
DeepSeek Harness(DSH)更新检查插件。在设置面板中新增「更新」页:显示当前 DSH 版本,一键检查 npm registry 上的最新版本,弹窗提示是否有新版本(含预览版醒目提示),并在 full access 沙箱模式下支持自动更新。
dsh --version,回退读取 npx 缓存中的 @deepseek-ai/dsh/package.json)@deepseek-ai/dsh 的 latest 与 next(预览版)dist-tagdsh-updater 包自身的 npm 最新版本,提示是否有插件新版本danger-full-access → 弹窗显示 [自动更新](执行 npm install -g)workspace-write / read-only → 提示切换模式,并给出可复制的更新命令dsh-updater/
├── package.json # 包声明(含 dsh.client 声明)
├── lib/
│ ├── index.js # Host 端(Node):connection.rpc 注册 RPC 通道
│ └── client.js # Client 端(浏览器):settings.section UI
├── README.md
└── LICENSE
本插件是纯 JavaScript 手写实现,无需构建,可直接 npm publish。
connection.rpc)lib/index.js):导出 apply(ctx),通过 ctx.get("connection").rpc.handle("/rpc/dsh-updater", handler, { authority: "loopback" }) 注册四个 RPC 端点:get-state、check-npm、check-self、perform-update。lib/client.js):window.__ModuleLoader__.load({ id, factory }) 注册,通过 ctx.get("connection").rpc.call("/rpc/dsh-updater", endpoint, payload) 调用 Host。RPC 返回值遵循 DSH 的 RpcResult 协议:
// 成功
{ ok: true, value: { /* …业务数据… */ } }
// 失败
{ ok: false, error: { code: "internal", message: "错误描述", details: {} } }
ctx.get("slots").inject("settings.section", …) 注册到设置面板require("react") 获取(由 DSH client module system 提供)document.head 注入 <style>,颜色走 DSH 主题变量(--dsw-alias-*)ctx.get 读取,均为可选):connection、shell、sandboxPolicyinject 声明):slots、connectionSELF_PACKAGE 与 SELF_VERSION 已经在模块加载时从 package.json 读取(通过 import.meta.url 定位自身所在目录),因此版本只有一处维护:改 package.json 的 version 即可,lib/index.js 无需再同步。仅当 package.json 读不到(异常兜底)时才用内置的兜底值。
插件自更新检测以实际安装位置的版本为准:运行时仍会从安装目录的 node_modules/dsh-updater/package.json 再读一次版本,捕捉安装后又改版的场景;读不到才回退到模块加载时读到的 SELF_VERSION。
发布新版本时只需:
package.json 的 version(name 同理,也仅由 package.json 决定。)
sourceRepoUpdateGuide(),当 DSH 是源码工作区、且 npm registry 有更高版本时,提示:
git checkout master(版本发布按 tag,master 即主分支最新;若在 detached HEAD 或其它分支,第一步即回到 master);git pull 拿最新代码,然后 pnpm install / pnpm run build:lib / pnpm run build:web / pnpm dsh web;git checkout master && git pull && pnpm install && pnpm run build:lib && pnpm run build:web && pnpm dsh web。diagnoseUpdateFailure(),根据失败输出分类给出针对性提示——网络/registry 瞬时问题(重试一次往往成功)、镜像未同步(建议官方源)、pnpm store 不一致、构建脚本未放行、超时、锁文件/发布年龄、未知原因等。失败弹窗不再只有原始日志,而是「这是什么问题 + 下一步怎么办」。git pull && pnpm install && pnpm dsh 升级为 git pull && pnpm install && pnpm run build:lib && pnpm run build:web && pnpm dsh web;弹窗展示 5 步升级步骤表(拉取/安装/构建lib/构建web/启动)+ 未安装 pnpm 时的安装警告。runPnpmAdd 改为 pnpm add --reporter=ndjson,pnpm 逐行流式输出进度(此前非 TTY 下几乎不流式,只到结束才一次性返回,client 轮询拿不到逐步进度,只显示「正在准备中」)。新增 summarizeNdjson() 把每行 JSON 解析成可读进度摘要(阶段 + 包 + 下载进度/大小),client 滚动台实时展示。check-self 刷新 selfVersion,用户立即看到新版本号(此前保持旧值)。cd 前缀(方案 A):项目根目录已由【复制文件地址】按钮和弹窗「项目根目录」单独给到,命令保持短小 —— 用户先进入该目录再粘贴执行:
git pull && pnpm install && pnpm dshpnpm add dsh-updater@<版本>findProfileRoot()——从插件实际加载位置向上找含 dsh.profile.bundles 标记的 package.json,即真实 profile 根(如任意用户的 $DSH_HOME/profiles/web),对任意 DSH_HOME / npm workspace 布局都成立,不再假设固定路径或层级。pnpm add:在定位到的 profile 根直接 pnpm add dsh-updater@<版本>(官方源),返回正确命令与项目根目录。updateProgress 单例 + get-update-progress 轮询端点;client 在【一键更新】时轮询并显示阶段 + 滚动输出台,用户能看到 pnpm 实时进度,不再觉得卡死。explorer.exe 经 child_process.spawn 在 Windows 上常静默失败(探针启动但窗口不弹出),不可靠。改为复制项目根目录地址到剪贴板(100% 可用),用户粘贴到资源管理器地址栏或终端 cd 即可。open-dir RPC 端点与 openDirInExplorer()(Host 端死代码);client 端「打开目录」按钮替换为「复制目录地址 / 已复制地址」。findGitRoot(),定位 git 源码仓库根目录(穿透 junction 后的真实路径)。D:\...\deepseek-harness」,复制命令改为 带 cd 的 cd /d "<项目根>" && git pull && pnpm install && pnpm dsh——任意 cmd 粘贴即可在正确目录执行。open-dir RPC 端点 + openDirInExplorer():Windows explorer.exe / macOS open / Linux xdg-open。get-state / check-npm / perform-update 统一返回 dir(项目根目录)。git pull && pnpm install;npx -y @deepseek-ai/dsh@latest(此前误给 npm install -g);npm install -g @deepseek-ai/dsh@latest。perform-update 返回的正确命令(result.command)覆盖 check 阶段存的旧 popup.command,结果弹窗复制/显示的不再是旧的 npm install。detectDshInstallType() / classifyEntry(),探测 DSH 是 npx 缓存 / git 源码工作区 / npm 全局 / 局部安装:
realpathSync 穿透 junction/symlink,判断 dsh 真实指向(git 源码 → .git 在上级)。git pull && pnpm install / npx @deepseek-ai/dsh@latest),不再误装无关 npm 包进 profile。get-state 返回 installType / updatable,「版本信息」行显示「安装方式:源码工作区(需手动升级)」等。detectCurrentDshVersion() 原先会无脑遍历 npx 缓存、把任意历史版本(如 0.1.0-rc.7)当成「当前 DSH 版本」,导致 compareVersions 把现有 0.1.1-rc.x 错判为「有更新」。重写为先定位真正运行的入口(process.argv[1]):
_npx\...\node_modules\@deepseek-ai\dsh);apps/cli 等)→ 向上读其 package.json 的真实版本(dev-repo);detectCurrentDshVersion() 三级探测当前版本(dsh --version → 全局 npm 包 → npx 缓存),check-npm/get-state 返回带来源;「版本信息」行标注来源(本机运行 / 全局安装 / npx 缓存)。perform-update 前进 assertUpdatable():只在 DSH 是 npm 全局安装时才允许一键更新;若是源码工作区 / npx 运行,明确提示「此刻一键更新无法生效」,并给出正确升级命令,避免装出一个与运行代码无关的 npm 包。manualCommand() 从 npx ... --version(只是打印版本)改为 npm install -g @deepseek-ai/dsh@<ver>(真正执行全局更新)。dsh plugin add(child_process),client 端更新按钮恒为「更新」,并附「复制命令」兜底。latestFromNpm 失败时给出明确报错("npm registry 不可达")而非静默失败。'dsh.cmd' is not recognized」:更新/自更新不再依赖 PATH 上的 dsh。
process.argv[1]),PATH 上的裸 dsh 仅作兜底;nodeBinDir),并记住装好 pnpm 后的全局 bin 目录;.cmd shim 改用 cmd.exe /d /s /c + 逐 token 引用,避开 Node 已废弃的 shell:true。taskkill /t /f、POSIX 进程组 SIGTERM→SIGKILL),不再遗留 pnpm 孙进程。TARGET_RE 校验,拒绝 ; / $() / 含空格等注入载荷。npm install -g @deepseek-ai/dsh 建议。readCurrentVersion 的 dsh --version 也走重召 CLI,没有 PATH dsh 时也能读到正确版本。SELF_PACKAGE / SELF_VERSION 改为模块加载时从 package.json 读取,版本/名称只在一处决定,不再与代码里的硬编码漂移。pnpm(dsh plugin 通过 pnpm 安装)dsh plugin 一键安装(推荐)dsh-updater 已声明 dsh.bundle,因此可直接一键安装并自动激活:
dsh plugin --profile web add dsh-updater
安装完成后重启 DSH,设置面板中即出现「更新」页。
dsh plugin add会通过 pnpm 把包装进 profile,并因dsh.bundle.patch自动把它加入 profile 的 layer 栈——无需手动编辑cordis.patch.yml。
cd $DSH_HOME/profiles # Windows: %USERPROFILE%\.dsh\profiles
npm install dsh-updater
然后编辑 $DSH_HOME/profiles/web/cordis.patch.yml(web profile),追加:
- insert:
- id: dsh-updater
name: 'dsh-updater'
重启 DSH。
cd $DSH_HOME/profiles
npm install <path-to-this-package>
同样需要步骤 2(手动 insert)和重启。
# npm(发布前请确认 name 未被占用,必要时改为 scope 如 @yourname/dsh-updater)
npm publish --dry-run
npm publish
# GitHub
git init && git add . && git commit -m "feat: dsh-updater plugin"
git remote add origin https://github.com/<your-org>/dsh-updater.git
git push -u origin main
MIT
FAQs
DeepSeek Harness 更新检查插件:检测当前 DSH 版本与 npm registry 最新版本,弹窗提示并在 full access 模式下自动更新
We found that dsh-updater demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Research
/Security News
Ten malicious OpenAPI React Query Codegen versions were published to npm in the Mini Shai-Hulud attack, all with valid provenance.

Security News
Socket joins more than 100 technology, cybersecurity, and financial organizations calling for a global surge in cyber defense.

Product
Enterprise security teams can now detect malware, credential theft, suspicious network activity, and risky updates across Microsoft Edge extensions.