前言¶
在 DSHM(DeepSeek Harness 移动端)里,Host 跑在 App 进程内的主 node 线程上。想彻底离开应用、回到桌面,往往只能到系统多任务里把进程划掉,侧栏里并没有一条明确的「关掉整个 App」入口。官方账户菜单只有设置、联系我们、登录或退出登录等项,平台也没有提供往该菜单追加条目的 slot。
下面介绍社区插件 dsh-quit(维护者 yinghan-123):在侧栏底部账户菜单里注入「退出 dsh」,确认后直接结束 App 进程,表现与在多任务里划掉应用等效。插件分类为客户端,当前版本 0.8.2,许可证 MIT,兼容 DSH >=0.2.0-rc.1 <0.3.0-0。
这是什么¶
dsh-quit 是 DSHM 端侧的退出插件:在侧栏底部的账户菜单(头像或 ⋯ 弹出的「设置 / 联系我们 / 登录或退出登录」菜单)里 DOM 注入一行「退出 dsh」,样式与官方菜单项一致(危险色文字、电源图标、分隔线),点击后经 shell.overlay 确认,再触发 Host 侧四级退出逻辑,约 150 ms 后开始结束进程。
重启 App(关闭后自动重开)功能已按 README 说明去除:需要改 App 侧 ArkTS 且无 App 源码,插件只保留「退出」。
核心功能¶
界面入口¶
账户菜单由官方账户插件 AccountMenu 渲染,菜单项写死在 items 里,没有「加一条」的 slot;占用 settings.launcher 会替换整个账户入口,代价过大。插件因此采用只追加、不改写的 DOM 注入:
MutationObserver监听document.body;- 出现
[role="menu"]且文本命中两个以上特征词(设置、联系我们、登录、退出登录及英文对应项)→ 认定为账户菜单; - 克隆最后一项作为外壳,换电源图标与危险色文案,上方补分隔线,插入原项之后;
- 点击打开确认面板。
找不到菜单或官方 DOM 变更时不注入,官方菜单原样可用;React 重渲染冲掉节点时观察器会幂等补回。注入项 [data-dsh-quit-item] 可用作是否命中诊断;键盘方向键不会聚焦到该项(不在 React 菜单列表里)。
客户端依赖平台 react 与 ctx.slots;缺 React 时降级为惰性元素描述。无额外 npm 依赖。
退出行为¶
点「退出 dsh」→ 确认 → Host 先把 HTTP 响应送回浏览器 → 150 ms 后开始结束进程。结束主 node 线程等于整个 App 结束,下次打开应用时 Host 会重新启动。
真机实测(README 记载,2026-10-26,v0.4.0 语境):嵌入环境里 process.exit(0) 可能不生效,故按「越硬越靠前」依次尝试,成败写入 $DSH_HOME/dsh-quit.log:
process.kill(pid, 'SIGKILL')process.abort()process.exit(0)- koffi 调用 libc 的
_exit(0)
四级均失败会记录「四级退出手段全部无效」,需 App 侧配合。
会中断什么¶
确认面板会先说明:进行中的模型对话会中断;已落盘的会话日志不丢,未完成的 turn 断在那里;后台 job 随之停止。
HTTP 接口¶
| 方法 | 路径 | 说明 |
|---|---|---|
POST |
/dsh-quit/quit |
回响应后 150 ms 开始四级退出 |
GET |
/dsh-quit/state |
只读:pid、home、pending、上次动作 |
POST 须带请求头 x-dsh-quit: 1(任意非空值)。带 Origin 的请求须来自本机(127.0.0.1 / localhost / ::1 或与 Host 一致);无 Origin 的 curl/脚本放行。
典型本机调用(端口以你环境为准,README 示例为 3120):
curl -s http://127.0.0.1:3120/dsh-quit/state
curl -s -X POST -H 'x-dsh-quit: 1' http://127.0.0.1:3120/dsh-quit/quit
诊断还可查看 $DSH_HOME/dsh-quit.log 与 state 中的 pid、$DSH_HOME 等字段。
安装与启用¶
DSHM 端侧「一行安装」(Host 布置的 pnpm 壳,add 走安装队列):
pnpm add github.com/yinghan-123/dsh-quit
手工落盘时:
- 将
dsh-quit/放到 profile 的node_modules,例如:
$DSH_HOME/profiles/ondevice/node_modules/dsh-quit/
(示例路径:/data/storage/el2/base/haps/phone/files/dsh/home)
2. 在 $DSH_HOME/profiles/ondevice/package.json 的 dependencies 增加 "dsh-quit": "github:yinghan-123/dsh-quit"(或 file: 本地路径),并在 dsh.profile.bundles 追加 "dsh-quit"。
3. 重启一次 DSHM 应用,以便客户端重新扫描 dsh.client 声明。
仓库内更新可用:
python deploy.py
回滚:从 dsh.profile.bundles 与 dependencies 去掉 dsh-quit 并重启,或删除 node_modules/dsh-quit/。插件只新增文件,不改官方装载行。
典型用法¶
- 安装并重启 DSHM 后,打开侧栏底部账户菜单,应看到「退出 dsh」(若官方 DOM 未变且注入成功)。
- 点击 → 在 overlay 确认 → 应用关闭回桌面。
- 脚本或自动化可调用
GET /dsh-quit/state查状态,或在确认风险后带x-dsh-quit头POST /dsh-quit/quit。
仓库提供结构自检(端侧可用 Agent 的 Python):
python check.py .
适用场景与注意¶
适合需要在 DSHM Web 界面内明确退出整个 App、又不想依赖多任务划掉的开发者与用户。插件以当前 DSH/Host 进程权限运行,安装前请自行审阅 GitHub 源码 与 MIT 许可证。
务必知晓的边界(来自 README):
- 这是结束进程式退出,不是走 App
onDestroy的窗口关闭流程;在 DSHM 里这是让 App 真正消失的可行路径之一。 - App 与 Host 同进程,不存在「App 退了、核心还在」。
- 无 CLI 或其它前端入口;仅 Web 侧账户菜单与上述 HTTP 接口。
- 官方升级改账户菜单结构时,注入可能静默失效(仅少一行菜单,不破坏界面)。
DeepSeek Harness 生态强调「一切皆插件」;社区目录 SkillHub 插件页 为独立站点,与 DeepSeek / 幻方无官方从属关系。
结尾¶
dsh-quit 在官方未开放账户菜单扩展点的前提下,用安全的 DOM 注入加上 Host 侧多级退出,把「退出 dsh」放到侧栏账户菜单里,并配合确认与 CSRF 约束的 HTTP 接口。需要细节与变更记录时,以仓库 README 为准。
- 目录页:https://www.skillhub.cn/plugins/yinghan-123/dsh-quit
- GitHub:https://github.com/yinghan-123/dsh-quit