FrankZhangIronly/dsh-system-control ↗★ 0
dsh-system-control
DSH web 系统控制插件:侧边栏底部「系统」菜单(重启=退出码42 / 关闭=退出码0),经 /system RPC 通道(loopback 权限)调用宿主 appExit。双面:bundle patch 挂宿主半,dsh.client 装配浏览器半。
安装
$
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:FrankZhangIronly/dsh-system-control说明文档
阅读完整 README ↗dsh-system-control
DeepSeek Harness (DSH) Web 插件:在侧边栏底部新增一个 「系统」 菜单,提供 重启 与 关闭 控件。重启会循环启动器(
dsh web以退出码42退出,然后由DSH Web.ps1重新拉起);关闭会干净退出(0)。两者都通过 loopback RPC 通道完成,非本机访问会被自动拒绝。
插件为双面 DSH 插件:宿主(Node)侧持有 /system RPC 通道,复用宿主已有的 appExit 钩子;浏览器侧渲染侧边栏按钮与中央模态框。
功能特性
- 侧边栏触发器,形态对齐官方设置按钮(宽栏全宽条 / 窄栏圆形两种形态)。
- 中央模态框:左「重启服务」、右「关闭服务」并排两按钮。关闭操作需二次确认(4 秒未操作自动撤销)。
- Loopback 权限,从其他网络打到宿主端口的请求会被 DSH 自带的权限校验直接
403。 - 先 ack 后退出:handler 先返回响应,再用
80 ms定时器触发appExit(),保证浏览器收到干净的 ack。 - 零修改 DSH 主干,作为普通插件安装,
@deepseek-ai/dsh升级不影响。
安装
dsh plugin --profile web add dsh-system-control
重启 dsh web,侧边栏底部会出现 系统 按钮。
从本地 checkout 安装:
dsh plugin --profile web add /path/to/dsh-system-control
退出码协议
| 操作 | 退出码 | 启动器行为 |
|---|---|---|
| Shutdown | 0 | 启动器循环退出,关闭窗口。 |
| Restart | 42 | 启动器循环重新拉起 dsh web。 |
| Status | n/a | 探针端点,返回 { exitAvailable, exitType }。 |
配套启动器 DSH Web.ps1 已实现这套协议:
0→ 关窗;42→ 重启;- 其他 → 写日志后退出。
如果用其他方式启动 DSH(systemd unit、裸跑 dsh web 等),请确保启动器认这两个码——否则会被当成硬崩溃。
工作原理
┌────────────────────┐ connection.rpc.call('/system', 'restart', {}) ┌──────────────────────────┐
│ 侧边栏按钮 │ ───────────────────────────────────────────────▶ │ HostConnectionService │
│ + 模态框(浏览器) │ │ → loopback 权限校验 │
└────────────────────┘ │ → /system handler │
│ → ctx.get('appExit')(42)│
└──────────────────────────┘