Bundle
dsh-shutdown
DeepSeek Harness 关机插件:Settings 增加「关机」页,一键优雅退出 DSH 服务(先响应页面再退出进程)。
- Source
- knlght
- stars
- 3 stars
- License
- MIT
- Updated
- Updated 2 days ago
Readme
# dsh-shutdown <!-- Hero --> <div align="center"> <b style="font-size: 1.15em;">一键关闭 / 重启 DSH 服务</b><br /><br /> Settings「服务开关」页 · 二次确认 · 优雅退出 / 自动重启<br /><br /> <b>关掉浏览器不再留下后台进程,也能一键重启服务</b>。 </div> <div align="center"> 🌏 <a href="./README.md"><b>中文</b></a> · <a href="./README_EN.md">English</a> </div> ## ✨ 为什么需要 关闭浏览器**不会**结束 dsh 的后台服务进程——服务继续占用端口与内存。本插件在页面内提供一键关机/重启入口,无需命令行。 ## ✨ 功能一览 - **🖥️ Settings「服务开关」页**:侧栏最底部新增「服务开关」页签 - **🛡️ 二次确认**:点「关闭 DSH 服务」或「重启 DSH 服务」→ 出现「确认 / 取消」双按钮,防误触 - **✅ 成功反馈**:确认后页面立即显示绿色「关闭成功 / 重启中」面板(并尝试自动关闭标签页) - **🔁 自动重启**:重启请求会让宿主进程以特殊退出码退出,由 `launcher/dsh-web.ps1` 启动脚本捕获后自动重新拉起(根目录 `dsh-web.cmd`/`dsh-web.ps1` 为快捷入口) - **🎨 原生风格**:按钮与配色全部引用 DSH 主题 token(`--dsw-alias-*`),明暗自适应 ## 📦 安装 ```bash dsh plugin --profile web add <本仓库 / npm 包名> # 重启 dsh web 生效 ``` ## 🧠 设计要点 - 关机端点:`/_dsh/shutdown`(仅 POST)——服务先返回「正在关闭」响应,500ms 后 `process.exit(0)` 优雅退出 - 重启端点:`/_dsh/restart`(仅 POST)——服务先返回「正在重启」响应,500ms 后以退出码 42 退出;`dsh-web.ps1` 检测到该退出码会自动重新启动 `dsh web` - 会话日志为逐事件落盘,空闲时退出安全;正在进行的对话请等待其完成后再操作 - 浏览器安全策略下脚本只能关闭自己打开的窗口——手动打开的标签页会保留成功面板,两种情况下你都能确认结果 ## 🧩 生态 打上 <a href="https://github.com/topics/dsh-shutdown"><code>dsh-shutdown</code></a> topic 的插件可接入同一生态。欢迎通过 PR 改进本插件。 ## 📄 许可 [MIT](./LICENSE) ## 🔒 安全说明 关机端点会终止整个服务,是破坏性最强的操作,因此端点自身带有跨站请求(CSRF)防护: - **浏览器发起的请求**:校验 `Origin` 头。来自外部站点的一律返回 `403`,防止任意网页在后台关闭你本机的 DSH——浏览器不会为这类跨源简单 POST 做预检,所以端点必须自己把关 - **同源访问**:`127.0.0.1` / `localhost` / `::1` 直接放行;通过局域网 IP 或自定义主机名访问(`dsh web --host 0.0.0.0`)时,要求 `Origin` 与 `Host` 一致 - **无 `Origin` 的请求**:`curl`、启动脚本等非浏览器客户端放行,不影响脚本化使用 ## 📝 更新日志 ### v0.2.0 - **新增** CSRF 防护(详见上方安全说明) - **修复** 前端在端点返回 500 等错误时仍显示「关闭成功」——此前只要 `fetch` 未抛异常就当作成功,现在区分网络层失败、响应解析失败与 HTTP 错误三类情况 - **修复** 插件卸载 / 热重载时未撤销 `slots.inject` 注册,可能导致设置页残留重复条目 - **新增** 17 个行为测试(host 10 + client 7),覆盖 CSRF 守卫、退出码语义、卸载清理与响应判定
Install
dsh plugin --profile web add github:knlght/DSH-shutdown
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-shutdown from the hub
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.