dsh-restart-button

DSH PLUGIN会话与消息

仓库 accoutmissing/dsh-restart-button · npm @local/dsh-restart-button

会话与消息 L5 · 运行验证通过 安全审查:低风险 可信度:金 可安装插件
安装这个插件

为 DeepSeek Harness 桌面版侧边栏添加一键重载/重启按钮,优先原地热重载插件更新,仅在无法热重载时才完全重启应用。

一句话选型结论

按资料字段整理

dsh-restart-button 是会话与消息类的 DSH 可安装插件,验证等级 L5 · 运行验证通过,安全审查为低风险,列出 5 项功能,有可直接复制的安装命令。验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么;涉及密钥或系统权限的,建议先在隔离环境试装。

分类会话与消息 收录类型可安装插件 验证等级L5 · 运行验证通过 安全审查低风险
验证等级 L5 L5 · 运行验证通过
GitHub 星标 0 复刻 0 · 未关闭 issue 0
最近更新 2026-11-05 创建于 2026-10-31
README 10.2 KB 正文体量,越大说明说明书写得越细

安装

可安装插件
在 DSH 里执行,装完用 dsh plugin list 确认已挂上;标了 L4 / L5 的命令已在沙盒里真实跑通
dsh plugin --profile web add github:accoutmissing/dsh-restart-button#v0.5.0
  1. 1
    确认版本与运行环境

    兼容的 DSH 版本为 0.2.2-rc.1 等 2 个;版本不匹配时安装会报错。

  2. 2
    执行安装命令

    在 DSH 里执行上面的命令;多包仓库要注意区分具体子包名,别装错包。

  3. 3
    确认已挂载

    用 dsh plugin list 查看列表里是否出现这个插件,出现即挂载成功。

  4. 4
    试跑并检查权限

    加载后跑一个最小用例,确认它能正常工作;同时看它申请了哪些文件、命令或网络权限。

兼容 DSH 版本0.2.2-rc.1、0.2.1-rc.5版本不匹配时安装会报错
Node.js 要求未标注来自仓库 package.json 的 engines 字段
前置依赖无需要同时安装的同级依赖
npm 包名@local/dsh-restart-button可用 npm view 查看包信息

能做什么

5 项功能
字段来自项目仓库与公开索引,中文说明由本站标注

dsh-restart-button:DeepSeek Harness 桌面版的一键重载重启按钮

  • 侧边栏一键刷新插件
  • 优先原地热重载
  • 必要时完全重启
  • 状态实时反馈
  • 重启链路安全校验

上游标签

cordisdeepseek-harnessdshdsh-pluginelectronhot-reloadrestart-button

验证等级与安全审查

L5 · 运行验证通过
自动化流程结论,不是人工审核
验证等级L5 · 运行验证通过在 dsh 沙盒中完成安装与运行冒烟——装得上、跑得起来
安全审查低风险静态分析结论,未标注不代表已通过审查
仓库健康度活跃按仓库活跃度与最近更新时间给出
可信度金综合仓库活跃度与验证结果

上面的结论来自上游最近一次自动化验证(2026-11-06): 同一套检查会在插件发新版后重跑,页面显示的是最新一次的逐项结果。

逐项检查结果

L1 · 已找到 ✓ 通过
  • L1.0_DEFAULTED_FROM_L3 由 L3 推定 默认通过——L3 安装规范已通过(全库 L3 扫描策略)
L2 · 结构化 ✓ 通过
  • L2.0_DEFAULTED_FROM_L3 由 L3 推定 默认通过——L3 安装规范已通过(全库 L3 扫描策略)
L3 · 安装规范 ✓ 通过
  • L3.1_INSTALL_COMMAND_PARSED 安装命令已解析 方式:安装规范解析
  • L3.2_DSH_VERSION_DECLARED DSH 版本已声明 方式:DSH 版本声明
L4 · 安装已测 ✓ 通过
  • L4.1_INSTALL_EXECUTED_CONFINED 受限沙盒内执行安装 方式:沙盒安装执行
  • L4.2_INSTALL_SUCCESS 沙盒安装成功 方式:沙盒安装执行
  • L4.3_ARTIFACT_CONFIRMED 安装产物已确认 方式:沙盒安装执行
L5 · 运行已测 ✓ 通过
  • L5.1_INSTALL_PASSED_SANDBOXED 沙盒安装通过 方式:沙盒安装执行
  • L5.2_WEB_BOOT_READY Web 启动就绪 方式:Web 启动
  • L5.3_HTTP_SERVED HTTP 服务响应 方式:HTTP 请求
  • L5.4_PLUGIN_INVENTORY_ACTIVE 插件清单中已激活 方式:插件清单查询

风险详情

  • 结论说明 静态扫描 低;动态审计无结论(以下以静态为准)→ 总评级 低。
  • 风险计数 严重 0 / 高 0

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 验证等级 L5:安装和运行都在沙盒里跑通过,装完能直接用的概率高。
  • 静态安全审查为低风险,没有发现明显可疑行为。
  • 有可直接复制的安装命令,不用自己翻文档找入口。
  • 标注了兼容的 DSH 版本(0.2.2-rc.1 等 2 个),按版本装不容易报错。
  • 列出了 5 项功能,能直接看出它解决什么问题。

先想清楚的地方

  • 没有声明 Node.js 版本要求,版本不匹配可能装不上。
  • 验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么。

更适合

  • 需要在会话与消息场景里给 DSH 补能力的人。
  • 想装完就能用、不想自己排依赖的人。
  • 能接受在本地装依赖、愿意自己确认权限的人。

不太适合

  • 只使用 DSH 官方内置能力、不接受第三方插件的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
插件验证等级安全审查星标兼容版本安装命令
dsh-restart-button当前 L5 · 运行验证通过 低风险 0 0.2.2-rc.1 等 2 个 有
dsh-desktop L3 · 安装规范通过 低风险 3.0 万 未标注 无
openpets L4 · 沙盒安装通过 低风险 1,274 未标注 有
deeptide L4 · 沙盒安装通过 低风险 1,104 0.1.1-rc.2 有
jingyun-dsh L3 · 安装规范通过 低风险 1,004 未标注 有
study-mate 未做沙盒验证 未标注 856 未标注 无

仓库档案

会话与消息
字段来自项目仓库与公开索引,中文说明由本站标注
作者 / 维护方accoutmissing仓库 dsh-restart-button · 默认分支 main
分类会话与消息desktop
收录类型可安装插件声明了 dsh.bundle、可用 dsh plugin add 安装的条目
开发语言JavaScript仓库主语言
许可证MIT商用或二次分发前请确认条款原文
星标 / 复刻 / issue0 / 0 / 0收录时的数值,非实时
创建 / 更新2026-10-31 · 2026-11-05最后推送 2026-11-05
本站收录2026-10-31首次进入本站目录的时间

README 全文

10.2 KB
作者原文,中文版优先;只做安全转义,不改内容

dsh-restart-button

简体中文 · English

一个装在侧边栏底部的重载 / 重启按钮,给 DeepSeek Harness 桌面版用。

装插件、更新插件,过去都得关掉应用再打开一次。这个插件在侧边栏放了一个按钮替你做这件事——更重要的是,它尽量不重启。

点击  ->  原地热重载插件      (正在跑的东西一样不丢)
|
+-- 热重载不成  ->  按钮变成「完全重启」,再点一次 -> 应用重新拉起
+-- 热重载成了  ->  按钮变成「完全重启」,再点一次 -> 同样重新拉起

刷新过之后按钮就只有一个意思:再按一次 = 重启。


为什么不干脆重启?

因为 app.relaunch() 没有它看起来那么便宜。

替换插件包之后,Harness 自己的 HMR 层可以在运行中的宿主进程内部驱逐已变更的模块再把它们启动起来。正在跑的轮次、子代理、终端、排队中的消息、还没发出去的草稿——全都在,因为什么都没被杀掉。

完全重启是「这件事不可能做到时」的兜底(模块驱逐不掉、包在磁盘上挪了位置),不是默认动作。

所以按钮默认走便宜的那条路。什么时候才给贵的那条?两种情况:

  1. Harness 明确报告必须重启——hmr.reconcileProfile() 返回 restartReason: 'module-comparison' | 'package-moved'。
  2. 你按了第二次——刷新成功了,你还是按了一次,那就说明这次刷新没解决你的问题。

第二条是可以自己判断的:真正改动到客户端代码的刷新会让页面自己换掉(按钮跟着重置);按钮还在原地等你,就说明这次热重载什么都没换,再按的价值已经没有了。所以同一个页面里,第一下是刷新,第二下就是重启,而且会在按之前先把按钮标签改成「完全重启」。

误触被挡掉了:500ms 内的第二次点击算双击,不执行。


安装

这是一个 Cordis bundle。先从源码检出:

git clone https://github.com/accoutmissing/dsh-restart-button.git

然后用那个目录安装 bundle(Harness 通过它的插件管理器暴露这个能力;由 agent 驱动时就是 plugin_manager 工具):

{ "action": "install_bundle", "target": "D:/path/to/dsh-restart-button" }

安装成功会返回 application: "applied"。按钮立刻出现在侧边栏底部——安装它本身不需要重启。

以后更新:git pull,然后按按钮。


使用

按钮显示 含义 点击会发生什么
⟳ 刷新插件 空闲 原地热重载已变更的插件代码
⟳ 正在刷新… 进行中 —
✓ 已刷新 完成 3 秒后回到空闲
⟳ 完全重启 热重载报告无法原地完成 杀掉应用并重新拉起
⚠ 刷新失败 出错(同时写日志) 3 秒后回到空闲

实现

宿主侧(index.js)

通过 webServer 注册三条路由:

路由 方法 用途
/plugins/dsh-restart-button/__state GET 自描述:版本、代码代号、能力、pid
/plugins/dsh-restart-button/__reload POST hmr.runExclusive(() => hmr.reconcileProfile())
/plugins/dsh-restart-button/__restart POST 完整 kill 后重新拉起

热重载这条路套在 hmr.runExclusive() 里,因为 reconcileProfile() 参与宿主的串行队列;与自动重载撞车时会冒出一个 transactions cannot be nested,这个错误被识别并退避重试(3 次,400 ms × n)。另加 20 秒上限,免得一次卡死的重载把按钮永久占住。

客户端(client.js)

挂在 sidebar.footer.action 上的状态机,order 90。它的状态放在模块级 store,而不是组件 state 里:这个插槽在每次 store 更新时都会被重新投影,组件随之重挂载。用组件 useState 的话,两次点击之间状态会被打回 idle;模块级 store 活得下来。

判断新的客户端代码有没有真的加载

宿主返回 clientStamp——client.js 的 mtime。页面在模块求值的那一刻记下 LOADED_AT。如果 clientStamp > LOADED_AT + 1000 ms,说明这个页面跑的是旧的客户端代码,等插件字节确认是新的之后它自己整页重载。

第一版实现比的是 clientModules.graph().rev。那是错的:rev 只在 HMR 监视器登记重建时才前进,手改 client.js 图表纹丝不动,页面会被永远判成「最新」。现在改成比文件戳。

启动链路(Windows)

这是耗时最长的一部分,也是你打算做类似事情时最值得读的一部分。

插件跑在宿主进程里,而宿主是 Electron 的普通 Node 子进程(ELECTRON_RUN_AS_NODE=1)。它调不到 app.relaunch()。所以重启被交给操作系统:

宿主插件
└─ powershell  launch.ps1        生成 .lnk,请 explorer.exe 打开它
└─ explorer.exe             持有快捷方式的启动
└─ wscript.exe         快捷方式目标;GUI 子系统,不建控制台
└─ boot.vbs       WScript.Shell.Run "powershell ... ", 0, False
└─ powershell restart.ps1    杀应用、等端口释放、重新拉起

四条约束塑造了它,每一条都是撞出来的:

  1. detached: true 在这里不能用。 宿主跑在带 KILL_ON_JOB_CLOSE 的 Windows Job Object 里;映射成 DETACHED_PROCESS 的进程在创建瞬间就被终止——没有报错、没有日志、进程表里查不到。启动器必须用普通方式 spawn,然后自己退出。
  2. explorer.exe 必须是父进程。 宿主 spawn 出来的任何东西都会继承那个 job object。经过 explorer 一环才能断链。(这也是为什么启动器是一个 .lnk 而不是直接 Start-Process。)
  3. 快捷方式必须指向 wscript.exe,不是 powershell.exe。 wscript 是 GUI 子系统程序,永远不分配控制台,所以屏幕上不会闪黑框。实测:指向 powershell 恰好多出一个 CASCADIA_HOSTING_WINDOW_CLASS 窗口;指向 wscript 多出零个。
  4. .lnk 的 Arguments 必须用双引号。 用单引号包路径会让 explorer 静默什么都不做——没窗口、没报错、没日志。而真实可执行文件路径里带空格,所以这条是必须修的。

helper 还会在目标进程的 .Path 与预期可执行文件不匹配时拒绝执行,因此它不可能杀错应用。


安全

两条 POST 路由都要求请求头 x-dsh-restart-button 以及 loopback 来源地址。

真正承重的是那个请求头。只查 loopback 只能证明请求来自本机——你访问的任何网站上的一个表单都能 POST 到 127.0.0.1,而一次重启对你正在做的事情就是拒绝服务。自定义请求头在跨源时无法携带,除非有一次服务端永远不会批准的预检,所以真正拦住它的是请求头检查。对写路由发 GET 会得到 405,不是重定向也不是状态页。


日志与临时文件

  • ~/.dsh/restart-button.log —— 每次动作一行,到 1 MB 轮转成 .1。每一行都做过消毒:控制字符换成空格,恶意的字段无法伪造日志条目。
  • %TEMP%\dsh-restart\\ —— 每次调用生成的 restart.ps1、boot.vbs、launch.ps1 和 launch.log。只保留最近 20 个。

重启路由加 ?dry=1 只生成脚本不执行。加 ?probe=1 会用替身 helper(只记一行日志然后退出)跑完整条启动链路——用于在不真正杀掉应用的前提下验证链路仍然可用。


已实测的行为

声明 证据
热重载真的换了代码 模块级代号常量在三次修改中依次走过 undefined → gen-1 → gen-2 → gen-3,每次修改后各发一次 POST __reload(200,warnings: 0,pending: 0)
不出现控制台窗口 用 EnumWindows 统计可见控制台窗口,前后相比 delta = 0
完全重启可用 自测脚手架:旧 pid 死、新 pid 活;在真实应用里也能从 GUI 端口变化看出来
完全重启不是黑盒 每次运行都有 launch.log + restart.log 记录每一步
CSRF 守门有效 不带请求头的 POST:403 missing x-dsh-restart-button header
路由方法守门有效 对两条写路由发 GET:405

完全重启只在此前的 Windows 上验证过——启动链路本身只针对这个平台。热重载用的是有文档的宿主服务,不限于 Windows,但尚未在其他平台测过。


与 dsh-unlag 的关系

dsh-unlag(作者 regrevia,MIT)用另一种取舍解决同一个底层问题。读它改变了本插件的设计,这笔账具体到能点名。

设计对照的是 dsh-unlag v1.14.16。这不是 fork,没有共同提交历史;是独立实现。

从阅读中吸收的部分——前五项已经接近到该算「借用」而不是「各自想到」:

借用 在本插件中的位置
transactions? cannot be nested 的重试机制,含正则 index.js 的 isNestedTransaction()
RELOAD_TIMEOUT_MS = 20_000、LOG_MAX_BYTES = 1_000_000 index.js 常量
oneLine() —— 每个字段进日志行之前先消毒 index.js 的 oneLine()
用自定义请求头做写路由的 CSRF 守门 BUTTON_HEADER / fromOwnPage()
热重载优先,而不是当兜底 softReload(),以及按钮的默认动作
用代号常量作为「新代码到底有没有加载」的唯一诚实答案 BUILD

未采纳: 它的 /plugins 路由 shim。dsh-unlag 为过期版本提供替身模块,因为桌面壳在启动时冻结启动清单,旧页面按旧 revision 请求会 404 并把应用以退出码 1 带走。本插件改走整页重载,所以没有旧客户端代次需要续命——也就不需要在每次上游变更时维护一层平台并不认可的兼容层。

除此之外的一切——启动链路、job object 逃逸、wscript 快捷方式、杀掉再等待再拉起的序列——dsh-unlag 里完全没有。它从不重启。


许可证

MIT

常见问题

8 问
答案由本站依据条目字段整理,不引用上游原文
dsh-restart-button 怎么安装?

在 DSH 里执行 `dsh plugin --profile web add github:accoutmissing/dsh-restart-button#v0.5.0` 即可。对应的 npm 包名是 `@local/dsh-restart-button`。

dsh-restart-button 的验证等级是什么意思?

L5 · 运行验证通过。在 dsh 沙盒中完成安装与运行冒烟——装得上、跑得起来

dsh-restart-button 安全吗?

低风险。静态扫描 低;动态审计无结论(以下以静态为准)→ 总评级 低。

dsh-restart-button 装之前要先确认什么?

先看它会读写哪些文件、执行哪些命令、连接哪些网络地址;验证等级只说明装得上、跑得起来,不等于安全。涉及密钥或系统权限的,建议先在隔离环境试装。

dsh-restart-button 支持哪些 DSH 版本?

上游记录的兼容版本包括 0.2.2-rc.1、0.2.1-rc.5。

dsh-restart-button 用的是什么许可证?

上游标注为 MIT。商用或二次分发前请到仓库确认许可证原文。

dsh-restart-button 有哪些功能?

侧边栏一键刷新插件、优先原地热重载、必要时完全重启、状态实时反馈、重启链路安全校验。

这条记录的数据可靠吗?

本站按仓库名去重后合并整理,字段以作者仓库与 npm 元数据为准;安装命令、仓库地址与 README 保持原文,带 L4 / L5 标记的安装命令已在隔离沙盒里真实跑通。

同名或近似条目

8 条
不同作者的仓库分开列,请确认你要装的是哪一个
会话与消息
按星标排序,可作替代方案

dsh-desktop

dsh-desktop

为 DeepSeek Harness (DSH) 插件生态打造的现代化桌面端解决方案。万物皆「插件」,桌面本身也是「插件」。

L3 · 安装规范通过 3.0 万 星

openpets

openpets

L4 · 沙盒安装通过 1,274 星

deeptide

deeptide

L4 · 沙盒安装通过 1,104 星

jingyun-dsh

jingyun-dsh

井云 DSH 客户端插件,为 DeepSeek Harness 注入会员登录、订阅支付、算力管控与应用市场,让智能体和技能快速变成可交易商品

L3 · 安装规范通过 1,004 星

study-mate

study-mate

StudyMate 是 DSH 的「学习模式」预设与技能包,为数学、计算机科目定制学习路线、讲解课件与练习评估,跨科目共享记忆。

未标注验证等级 856 星

accoutmissing 的其它插件

3 个

插件的元信息来自作者仓库;分类、验证等级与安全结论的中文说明为中文整理,最近核验 2026-11-06。