Zum Hauptinhalt springen
Y

dsh-about-plugin

yaways/dsh-about-plugin

About panel and self-upgrade facade for DeepSeek Harness: version facts, channel-aware update checks, and a supervised source upgrade with restart, exposed to the Web Settings dialog over Typert Remote

Installation

dsh plugin --profile web add github:yaways/dsh-about-plugin

README

dsh-about-plugin

DeepSeek Harness 的「关于」面板与自助升级插件:在 Web 设置对话框中展示版本事实、按渠道检查更新,并通过受监督的脱离进程完成源码升级与重启。

设置 → 关于面板

截图:设置 → 关于。版本卡片(版本 / 源码安装形态 / 安装位置 / 插件版本)、双渠道检查结果(「已是最新」+「工作树有未提交修改」+ SHA 对比),以及底部的升级记录。此例中工作树有未提交改动,故「升级并重启」保持禁用。

设置 → 关于
├── DeepSeek Harness    版本 / 安装形态 / 安装位置 / 插件版本
├── 升级渠道            源码渠道(git)与 npm 渠道,检查按钮 + 待更新提交预览
├── 升级并重启          风险确认 → 受监督升级 → 自动重连
└── 升级记录            $DSH_HOME/update-log.jsonl 的尾部条目

安装

# 从 npm:
dsh plugin --profile web add dsh-about-plugin
# 或从 GitHub / 本地路径:
dsh plugin --profile web add github:yaways/dsh-about-plugin
dsh plugin --profile web add /path/to/dsh-about-plugin
# 重启 dsh 后生效(安装只是新增惰性依赖,不触碰运行中的进程)

源码检出的 dsh(git clone 运行):命令需经 pnpm 脚本——pnpm dsh plugin --profile web add dsh-about-plugin,其余 dsh ... 命令同理(官方 publish 教程的同一约定)。npm 安装的 dsh 直接用裸 dsh

pnpm 安装时会提示 peer dependencies 未满足(@deepseek-ai/cordis 等)——这是预期行为:对等依赖在运行时经 profile 模块回退解析到 dsh 安装本身,不从 registry 安装。

卸载:dsh plugin --profile web remove dsh-about-plugin(源码检出形态为 pnpm dsh plugin ...)。

架构

一个包、两半、五个构建产物(pnpm run build 先 tsc 输出到 lib/types —— 该趟同时把标准装饰器 @Remote 降级为 __esDecorate —— 再由 tsdown 打包):

产物角色
lib/index.js宿主半:UpdateGateway extends TypertRemoteService,服务键 update,方法 status / check / apply
lib/typert.js手写 TYPERT 宿主工件(./typert 导出),dsh-typert-loader 挂载 Loader 行时注册,为每个 update/* 端点提供严格网关校验
lib/remote.js手写 TYPERT_REMOTE 客户端工件(./remote 导出),浏览器半自己 ctx.remote.$mount() 挂载
lib/supervisor.js脱离的升级监督进程,仅 Node 内建依赖(它运行时正要改写自己所在的树)
lib/client.js浏览器闭包工厂包(window.__ModuleLoader__.load),除冻结平台表(React、cordis、静态 UI 库)外全部内联

手写工件逐字段对齐 dsh-typert-generator 为包内插件生成的形状(对照 @deepseek-ai/dsh-host-plugin-inventorylib/typert.host.js / lib/typert.remote-client.js):独立插件没有仓库代码生成管线,但不损失严格校验。两份工件的 zod schema 同源于 src/schemas.ts,不会漂移。

升级时序(核心安全规则)

源码树与 node_modules 绝不在活进程下被改动。 apply 依序:

  1. 预检(干净工作树 + 源在允许清单内),失败即拒绝、不动任何东西;
  2. 快照本次启动器调用(execPath + execArgv + argv + cwd)写入计划文件;
  3. $DSH_HOME/update-log.jsonl 追加 started
  4. 脱离式(detached)spawn node lib/supervisor.js <plan>
  5. 调用 ctx.get('appExit')?.() 让本面优雅退出。

监督进程等待记录的 pid 全部退出后,按固定命令表执行:git fetchgit pull --ff-onlypnpm installpnpm run build → 重启快照的启动器。任一步失败则回滚到记录的 SHA(reset --hard + 重装 + 重建)再重启。每一步前后都写状态文件;重启后的新进程在挂载时把 restarted 补写为 verified,把死掉的半途尝试标记为 orphaned

命令表只含 git/pnpm/构建/重启器,绝不执行来自远端内容的命令。默认允许清单钉死官方源:

https://github.com/deepseek-ai/deepseek-harness.git
git@github.com:deepseek-ai/deepseek-harness.git

配置(Loader 行 config)

默认说明
trackedRefmaster源码渠道跟踪的 ref
originAllowlist官方源清单允许 fetch/pull 的 git origin
npmPackage@deepseek-ai/dshnpm 渠道读取的包
npmDistTaglatestnpm 渠道读取的 dist-tag
incomingLimit / dirtyFileLimit20变更预览上限
historyLimit30面板读取的状态文件条数

开发

pnpm install   # prepare 链接同级 deepseek-harness 检出中的 @deepseek-ai/* 对等依赖(DSH_ABOUT_HARNESS_CHECKOUT 可覆盖)
pnpm test      # 83 项:版本比较、安装识别、渠道探测、状态文件、监督进程(真实产物级集成)、RPC schema、组件
pnpm run build # tsc → lib/types,tsdown → 五个产物
node scripts/verify-browser.mjs "<带 token 的服务器 URL>" [截图目录]   # 浏览器级端到端验证

verify-browser 的 playwright 取自同级 deepseek-harness 检出(apps/web 的 devDependency);DSH_ABOUT_HARNESS_CHECKOUT / DSH_ABOUT_PLAYWRIGHT 可覆盖解析锚点。

对等依赖在运行时通过 profile 模块回退($DSH_HOME/profiles/node_modules)解析,与 @yaways/dsh-subagent-claude-code-wrapper 的先例一致;本地开发由 scripts/link-dev-deps.mjs 提供同样的解析(无同级检出时优雅跳过,git 克隆安装不受影响)。

已验证

  • npm 发布实装dsh-about-plugin@0.1.0 发布后从 registry 干净安装进一次性 profile,启动图行、client.js 下发、update/status RPC、浏览器级 9 项检查全部通过;
  • 一次性 profile 本地/tarball 安装 + 启动;
  • 启动图(window.__DSH_BOOT__)含 dsh-about-plugin 行与正确的 inject 边;/plugins/??dsh-about-plugin/client.js 可取;
  • HTTP RPC:update/status(版本事实)、update/check(真实网络 fetch、领先/落后/脏树判定)、update/apply(脏树安全拒绝)全部往返;
  • Playwright 浏览器级:设置 → 关于 打开、版本/形态/插件版本渲染、检查按钮真实 RPC、脏树提示、升级按钮禁用、零页面错误。

限制

  • npm 渠道目前只做比较展示(不执行升级);打包可执行文件自带更新生命周期,插件只报告形态。
  • 升级序列只等本面自己的 pid:同一源码 checkout 上若还跑着其他 dsh 面(headless、第二个 web),它们存活期间树仍会被改写。多面协调停机需要上游 pid 注册表(官方未规划);短期缓解是把同锚点进程纳入等待。
  • engines.dsh>=0.1.0,声明性下限(当前没有需要拒绝的旧版本)。

Ähnliche Plugins