← 返回列表
⚠ 装前注意
DeepSeek Harness 的自包含电源与生命周期控制插件:侧边栏底部电源按钮 + 上拉重启/关机菜单 +…
基本兼容但装前注意:未发布到 npm registry,仅可从源码安装 · 最近上游提交 2026/9/11 · 已提供中文文档
DeepSeek Harness 的自包含电源控制:侧边栏电源按钮,带有向上弹出的重启/关机菜单,Windows 关机风格覆盖层,自带重启与关机引擎(不依赖其他插件)。
综合分
35.8
GitHub 分
35.8
用户评分
—
★ Stars
5
周下载量
—
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add keyiadiannao/dsh-power-button未发布到 npm registry,仅可从源码安装,改用 GitHub 源安装
数据截至 2026/9/18(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
安装兼容性检查⚠ 装前注意
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✗npm 包dsh-power-button(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=22.19 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
未发布到 npm registry,仅可从源码安装
验证方式:npm registry 存在性 + package.json 静态校验 · 最后验证 2026/9/18 12:12:20
依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-client-ui-slots@deepseek-ai/cordis用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动
README
dsh-power-button
license
DSH
由 DeepSeek AI 辅助开发,发布前经人工 review。
功能
- 侧边栏电源按钮:注册到页脚操作位(sidebar.footer.action),主题自适应,外观与旁边的"设置"按钮一致
- 重启/关机菜单 + Windows 关机风格全屏过渡动画;重启确认后页面自动刷新
- 自包含重启引擎:写一个 detached 的 .cjs helper,等旧进程退出、端口释放后,用相同的 execPath/execArgv/argv/cwd 重新拉起 DSH。不使用 PowerShell、不使用 taskkill
- /restart 与 /shutdown 命令,以及 restart_harness 模型工具(与 anweat/dsh-restart 同名;若名字已被其它插件占用则跳过注册)
- 界面与宿主文案本地化(中文 / English),跟随 profile 的 locale.preference
- 启动清理:自动清理运行目录下超过 7 天的 restart-helper-*.log
截图
① 侧边栏电源按钮 —— 主题适配的底部常驻入口,风格与相邻的设置按钮一致。
侧边栏底部的电源按钮
② 重启 / 关机菜单 —— 点击电源按钮展开,两个动作一次到位。
重启 / 关机菜单
③ 关机确认对话框 —— 防误触设计:默认焦点在「取消」,只有显式确认才会真正停止进程。
关机确认对话框
④ 关机进度遮罩 —— Windows 风格全屏过渡,进程收尾时显示当前阶段。
关机进度遮罩
⑤ 重启完成提示 —— 页面自动重载后,成功提示确认 DSH 已恢复。
重启完成提示
安装
dsh plugin --profile web add "github:keyiadiannao/dsh-power-button#master"
重启 DSH 后生效:侧边栏底部出现电源按钮。需要 Node ≥ 22.19。
配置
通过 profile 的 cordis 层配置(cordis.patch.yml 或设置界面):
| 键 | 默认 | 含义 |
|---|---|---|
| enableModelTool | true | 注册 restart_harness 模型工具。设 false 则重启仅保留在 GUI 按钮与 /restart。 |
| maxDelayMs | 5000 | 模型工具 delayMs 参数的上限(ms)。有效下限为 1000 ms。 |
示例:
- id: dsh-power-button
config:
enableModelTool: true
工作原理
点击电源 → 菜单 → 重启
[宿主] POST /api/dsh-power-button/restart
→ 写 ~/.dsh/restart-helper--.cjs
→ spawn node (detached, windowsHide)
[助手] 等旧 PID 退出 → 等端口释放 → 用相同 execPath/argv/cwd 重新拉起 DSH → 自删
[宿主] 响应刷出后终止
[客户端] 轮询 health → 确认新 instanceId → 自动刷新
关机则 POST /api/dsh-power-button/shutdown,终止且不拉起。由于关机不可逆(进程停止后需手动启动),GUI 在关机前会弹确认对话框,需要再次点击确认才执行。(/shutdown 命令与模型工具保持单次触发;模型不暴露关机。)
开发中踩过的坑:
- helper 必须脱离进程树(detached + unref),否则终止 DSH 时 helper 一起被杀
- helper 写成真实 .cjs 文件而非 node -e:多行 node -e 脚本会被 Windows CreateProcess 破坏成静默 SyntaxError
- 重启成功以每次进程独立的 instanceId 变化(旧→新)为准,短暂离线本身不算成功
- 持久写静止检查:旧进程退出、端口释放后,helper 轮询所有会话日志的 (size, mtimeMs) 直到连续两次采样一致(上限约 15 秒)才重启。旧进程主循环退出后其会话写缓冲可能仍在落盘;在仍在追加的文件上拉起新进程会插入旧 seq 造成会话损坏——此检查封堵了这个窗口
- 启动器的退出请求要当服务读,不能当属性读:它在 ctx.get('appExit')。appExit 是本插件未在 inject 中声明的可选宿主值,上下文代理会把 ctx.appExit 解析为 undefined——按属性读取会在每次重启和关机时静默跳过优雅销毁,直接走 process.exit 硬杀(丢失树销毁、存储 flush、端口释放)。官方读取方(dsh-cmdline、dsh-headless)同样走 ctx.get
- 优雅退出有界:请求 appExit 后,若进程仍存活,15 秒看门狗会硬退出。DSH 以自身 5 秒上限销毁树,但该上限只在销毁仍在进行时强杀——若销毁提前 resolve,进程就被交给事件循环自行结束,而此时只要有一个残留句柄(后台任务、MCP 子进程、插件自有监听),循环就会活过 helper 的 30 秒耐心,helper 随即放弃且不再拉起新进程,用户就落得没有服务。看门狗保证重启始终落在 helper 耐心之内
安全
- 破坏性 POST 带 同源/loopback 防护(CSRF):socket 必须是 loopback、Host 必须是 loopback 权威、浏览器 Origin 必须匹配
- at-most-once 锁:并发重复触发会被拒绝(第二次返回 409)
- 模型工具 delayMs 下限 1000 ms——模型无法在自身 turn 结束前杀掉进程
- 重启 marker 在启动时消费即删除,后续普通启动不会误报"重启过"
- 命令行日志脱敏(凭据不会进入 ~/.dsh/restart-helper-.log);helper 与 marker 文件以 0600 写入,运行目录 0700
重启确认——纯 UI 提示,绝不写入会话
重启成功后,插件会在界面角落弹出一条本地化的 已重启 / Restarted
toast。这是纯 UI 提示:不会向任何会话日志写入内容。(此前的设计会向
恢复的会话追加合成的 assistant/message(turn: 0, step: 0)——该方案会
触发 token-meter 的 step 配对不变量并可能损坏大会话,已移除。上游跟踪:
deepseek-ai/DeepSeek-Harness#802。)
机制:
- 启动时若消费到重启 marker,/health 会报告 restarted: true, fromInstanceId:
- /health 还会报告 appExit: "available" | "missing"——启动器提供的退出通道在当前宿主是否真的可解析。missing 意味着每次重启都退化为 process.exit(无优雅销毁);该字段把"重启卡 30 秒"变成一次请求即可确诊
- 客户端加载后查询一次 /health;若 restarted 为真则显示 toast,然后通过
POST /api/dsh-power-button/notice-shown 确认,避免刷新后重复弹出
- 由于确认消息完全不触碰会话文件,重启不再可能损坏会话日志或留下未配对事件
开发
npm run build # tsdown:host + client bundle
npm run typecheck # tsc --noEmit
npm test # vitest:marker 生命周期、delayMs 下限、argv 脱敏、日志清理、退出通道
测试通过 vitest setup 文件隔离 DSH_HOME,不会触碰真实的 ~/.dsh。
产物:host 在 lib/index.js,client bundle 在 lib/client.js(均已入库,git 安装免构建)。
License 与致谢
MIT。"detached helper 重新拉起"的思路参考了
anweat/dsh-restart(MIT);
实现为独立编写(真实 .cjs 文件、无 PowerShell、动态端口),未复制其代码。同作者(keyiadiannao)的其他插件
扫码进群