在 DSH 网页上加一键关闭按钮,二次确认后退出进程
28/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Aclguh/dsh-web-close该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:待复验
装得上吗[实装验证]—
曾在 dsh 0.2.0-rc.2 下真实安装成功,但当前 dsh 已更新至 0.2.1-rc.5,本站尚未在新版下复验
L4 · 真实安装等级说明 →数据截至 2026/10/05·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 添加一键关闭按钮
- 二次确认后退出进程
DeepSeek-Harness插件,用于关闭dsh的web进程
README
由 DeepSeek 最新模型翻译生成dsh-web-close —— DSH Web 关闭按钮
DSH(DeepSeek Harness)Web 界面上的常驻关闭按钮:半透明红色、SVG 手绘电源图标、可拖动并记忆位置,点击后弹出视口居中的二次确认(左「取消」灰 / 右「确认关闭」红),确认后优雅关闭当前正在运行的 DSH 进程,并尝试关掉当前这个 DSH 页面(只关本页,不会关掉浏览器或其他窗口)。
标准 DSH 插件包,通过 dsh plugin 安装与卸载,随 dsh web 每次启动自动加载。
特性
- 常驻自启:标准 DSH bundle 插件,装一次,之后每次启动都在
- 半透明红外观:rgba(220,38,38,.42) + 毛玻璃 + 红色描边光晕,悬停加深
- SVG 手绘图标:电源符号、警告三角、叉号全部为内联 SVG,不含任何图片资源
- 可拖动 + 位置记忆:默认落在视口 top: 1234px / left: 306px (等价于 inset: 1234px auto auto 306px);拖到哪就在哪,写入 localStorage,刷新或重开浏览器后原样恢复;按当前视口夹取,窗口变小也不会跑到屏幕外
- 二次确认弹窗:视口居中,左「取消」灰、右「确认关闭」红,并显示将要关闭的 PID 与地址
- 优雅关闭:不是 kill -9,而是先卸载整棵插件树再退出(见下)
展开完整文档(README 剩余 1 节)
dsh-web-close —— DSH Web 关闭按钮
DSH(DeepSeek Harness)Web 界面上的常驻关闭按钮:半透明红色、SVG 手绘电源图标、可拖动并记忆位置,点击后弹出视口居中的二次确认(左「取消」灰 / 右「确认关闭」红),确认后优雅关闭当前正在运行的 DSH 进程,并尝试关掉当前这个 DSH 页面(只关本页,不会关掉浏览器或其他窗口)。
标准 DSH 插件包,通过 dsh plugin 安装与卸载,随 dsh web 每次启动自动加载。
特性
- 常驻自启:标准 DSH bundle 插件,装一次,之后每次启动都在
- 半透明红外观:rgba(220,38,38,.42) + 毛玻璃 + 红色描边光晕,悬停加深
- SVG 手绘图标:电源符号、警告三角、叉号全部为内联 SVG,不含任何图片资源
- 可拖动 + 位置记忆:默认落在视口 top: 1234px / left: 306px (等价于 inset: 1234px auto auto 306px);拖到哪就在哪,写入 localStorage,刷新或重开浏览器后原样恢复;按当前视口夹取,窗口变小也不会跑到屏幕外
- 二次确认弹窗:视口居中,左「取消」灰、右「确认关闭」红,并显示将要关闭的 PID 与地址
- 优雅关闭:不是 kill -9,而是先卸载整棵插件树再退出(见下)
- 顺便关掉本页面:关闭请求被接受后自动 window.close() 当前标签页;浏览器出于安全策略拒绝时,弹窗里会出现「关闭本页」按钮,退而把本页置为 about:blank。
全程只作用于当前这一个标签页,其他窗口与标签页不受影响
- 跨平台、零依赖:宿主侧只用 Node 内置模块,浏览器侧是纯原生 DOM; Windows / macOS / Linux 行为一致,没有 PowerShell、没有构建步骤、没有运行时依赖
安装:从 GitHub 克隆安装
git clone https://github.com/Aclguh/dsh-web-close.git
cd dsh-web-close
dsh plugin --profile web add link:.
要点:
- link:. 表示链接当前目录——仓库根目录本身就是插件包。
- ⚠️ 不要写成 link:.\dsh-web-close 这类带子目录的路径,那样会装成普通依赖而不是插件,重启后按钮不会出现。
- 成功后 dsh plugin 会自动把 dsh-web-close 写进 profile 的 dsh.profile.bundles,不需要手工改配置。
- 装完必须重启 dsh web,然后刷新浏览器。
- 如果之后移动了源码目录,要重新执行一次 add link:<新路径>;若提示冲突,先 dsh plugin --profile web remove dsh-web-close 再重新 add。
卸载
dsh plugin --profile web remove dsh-web-close
然后确认 profile 的 dsh.profile.bundles 里不再有 "dsh-web-close"(没有就无需处理),最后重启 dsh web。
环境要求
- 已安装 DSH,且能正常执行 dsh web
- pnpm(dsh plugin 会把参数转发给 pnpm;缺失时先 npm install -g pnpm)
- 本插件只对 web profile 有意义(它依赖 DSH 的 Web 服务器服务)
- 没有其他依赖:不需要额外 npm 包、不需要构建工具、不需要任何 API Key
给 AI 助手的安装说明
如果想让另一个 DSH / AI 助手代装,把下面这段直接发给它:
请帮我安装 DSH 插件 dsh-web-close,来源是 GitHub 仓库 Aclguh/dsh-web-close。
步骤:
1. 确保 pnpm 可用(没有就先执行 npm install -g pnpm)
2. git clone https://github.com/Aclguh/dsh-web-close.git
3. 进入克隆出来的 dsh-web-close 目录,执行:
dsh plugin --profile web add link:.
(仓库根目录就是插件包,不要写成 link:.\dsh-web-close 这种带子目录的路径)
4. 重启 dsh web,然后刷新浏览器
安装后请验证:
- dsh --profile web --dump-config 的输出里能看到 - id: dsh-web-close
- 浏览器里出现半透明红色圆形按钮(默认在视口 top 1234px / left 306px)
- curl http://127.0.0.1:3080/dsh-web-close/info.json 返回含 "ok":true 的 JSON
它是怎么关闭 DSH 的
插件运行在 DSH 宿主进程内部,也就是承载 Web 服务与 Agent 的那个 node 进程本身。
因此它不需要去别的进程里"找到它再杀掉",而是调用 DSH 自己的有界优雅关闭:
| 顺序 | 路径 | 行为 |
| 1 | ctx.get('appExit')(0) | DSH 启动器通过 provideCmdline() 提供的退出请求 → shutdown.shutdown(0):先 dispose 整棵插件树(所有插件的 disposer 都会执行),再设 exitCode = 0 让 Node 自然退出 |
| 2 | process.emit('SIGINT') | 命中 DSH 自己注册的 process.on('SIGINT') → shutdown.interrupt(130),同样先 dispose 再退出 |
| 3 | process.exit(0) | 兜底强制退出 |
appExit 是 ctx.provide() 提供的裸值,不在 Service 目录里;因此本插件刻意不把它写进 inject(那样会有让整行永远停在 waiting for appExit 的风险),而是运行时用 ctx.get() 取值,并带上表里的降级链。
⚠️ Web 服务与 Agent 宿主是同一个 node 进程,所以关闭的是整个 DSH,当前所有会话都会中断——这正是二次确认存在的原因。
关闭请求被接受后,浏览器侧还会做最后一件事:关掉当前这一个标签页。
它只调 window.close(),不碰 window.opener、不碰其他窗口;浏览器按安全策略拒绝时,退化为把本页替换成 about:blank。
目录结构
dsh-web-close/
├── package.json # 包声明;dsh.bundle.patch 指向 cordis.patch.yml ├── cordis.patch.yml # bundle patch:把 id/name 为 dsh-web-close 的一行插入配置树 ├── lib/ │ ├── index.js # 宿主半边:HTTP 路由 + tapIndex 注入 │ └── widget.js # 浏览器半边:原生 DOM 的按钮与确认弹窗 ├── README.md └── LICENSE
验证
配置层——确认插件行被组合进 profile:
dsh --profile web --dump-config
输出中应能看到:
== dsh-web-close
- id: dsh-web-close
name: dsh-web-close
服务层——需要 DSH 正在运行。端口按你自己的替换(DSH 默认 3080):
curl http://127.0.0.1:3080/dsh-web-close/info.json
{"ok":true,"pid":12345,"url":"http://127.0.0.1:3080","profile":null,"uptimeSec":438,"inProcess":true}
curl -I http://127.0.0.1:3080/dsh-web-close/widget.js
HTTP/1.1 200 OK
Content-Type: application/javascript; charset=utf-8
界面层——重启并刷新后,页面里出现半透明红色圆形按钮(默认在视口 top 1234px / left 306px)。
DSH 的 HTML 路由自身带访问鉴权(直接 curl 根路径会得到 401),但插件注册的同源路由不受影响,所以上面两条 curl 可以直接用。
使用
- 拖动:按住按钮拖到任意位置。位移超过 4px 才判定为拖动,因此不会误触发点击。
- 位置记忆:松手即写入 localStorage,键名 dsh-web-close-pos(结构 { v: 2, left, top })。
想恢复默认位置(top 1234 / left 306),在浏览器控制台执行:
localStorage.removeItem('dsh-web-close-pos')
然后刷新页面。位置按当前视口夹取,所以窗口比 1234px 矮时按钮会被收到可视区域内。
- 关闭:点击按钮 → 弹窗显示目标进程 node.exe · PID … · http://127.0.0.1:… → 点「确认关闭」。约 0.9 秒后 DSH 开始退出,随后自动尝试关闭本页面。
若浏览器拒绝脚本关闭(只允许关闭脚本打开的窗口),弹窗会给出「关闭本页」按钮兜底。
- 点「取消」、点弹窗外的遮罩、或按 Esc 都会关闭弹窗,不会执行任何操作。
路由
宿主半边在 DSH 的 Web 服务器上注册三个同源路由:
| 路由 | 方法 | 说明 |
| /dsh-web-close/widget.js | GET | 浏览器半边脚本。每次请求都重新读盘,所以改完 lib/widget.js 只需刷新页面 |
| /dsh-web-close/info.json | GET | 返回将被动到的进程:process.pid 与浏览器自己的 Host 头 |
| /dsh-web-close/shutdown | POST | 接受关闭请求,延迟 0.9 秒后触发优雅关闭(其他方法返回 405) |
widget.js 由 ctx.webServer.tapIndex() 以 注入 index.html,并带重复注入保护。
/shutdown 是用 fetch(..., { keepalive: true }) 发出的,所以即使标签页随后立刻被关掉,请求也一定能送达。
常见问题
- 按钮不出现
1. 确认 dsh plugin --profile web add 成功,且 dsh --profile web --dump-config 里能看到 - id: dsh-web-close;
2. 确认重启过 dsh web——插件只在启动时加载,热改配置不会生效;
3. 重启后按 Ctrl/Cmd + Shift + R 强制刷新,避开浏览器缓存。
- 改了默认位置后按钮没动:localStorage 里存的是旧结构(v: 1)坐标,会被自动作废并回落新默认位置;
- 拖动后位置没保留:无痕/隐私模式下 localStorage 不可用,这时只在本次会话内记忆位置。
- 点了「确认关闭」但页面没自动关闭:浏览器的安全策略只允许脚本关闭「由脚本打开的」窗口,普通标签页会被忽略。这时弹窗会出现「关闭本页」按钮(置为空白页),或直接按 Ctrl / ⌘ + W。
DSH 进程本身不受影响,已经退出或正在退出。
- 点了「确认关闭」但没退出:查看 dsh web 所在终端的输出,关闭时会打印一行 [dsh-web-close] graceful shutdown requested via appExit(或 via SIGINT)。
- 端口不是 3080:把 curl 命令换成你自己的端口即可;界面里显示的地址来自浏览器实际请求,始终是正确的。
- 改了代码不生效:改 lib/widget.js 只需刷新页面(路由每次重新读盘);改 lib/index.js(宿主半边)需要重启 dsh web。
- 会和别的插件冲突吗:本插件只占用 /dsh-web-close/* 三个路由和一个 id: dsh-web-close 的配置行。与同生态插件的 tapIndex 注入是叠加关系,例如可与 dsh-whale-widget 同时使用,两个 会并存于页面底部。
许可证
本项目基于 MIT License 开源,详见 LICENSE。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Aclguh/dsh-web-close
在 DSH 网页上加一键关闭按钮,二次确认后退出进程
相关插件 · UI / 主题
破甲增强版JeffKeeping/dsh-purge-plus
dsh-purge 的非官方分支fork:适配 DeepSeek Harness 0.2.1-rc.2、破甲内核…
★ 387已汉化DeepSeek 客户端
71.9
无代码业务系统平台nocobase/nocobase
NocoBase 是什么
★ 24,804已汉化DSH
71.8
1Panel 服务器面板1Panel-dev/1Panel
全球 250 万+ 自托管用户共同喜爱。
★ 37,350已汉化DSH
71.5
工作状态行动态ccch1mneyyy/working-activity
作者:chimney@ccch1mneyyy。社区项目,非 DeepSeek 官方项目。
★ 664已汉化DSH
71.2
多模型配置管家farion1231/cc-switch
跨平台桌面一体化助手,支持 Claude Code、Codex、OpenCode、DeepSeek Harness 等工具,唯一官网 ccswitch.io
★ 151,506已汉化DSH
71.1
AI 矢量设计工具ZSeven-W/openpencil
全球首个 AI 原生开源矢量设计工具。
★ 7,027已汉化DSH
71.1
这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。