dsh-quit:在 DSHM 侧栏账户菜单里一键退出应用

前言

在 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 注入:

  1. MutationObserver 监听 document.body;
  2. 出现 [role="menu"] 且文本命中两个以上特征词(设置、联系我们、登录、退出登录及英文对应项)→ 认定为账户菜单;
  3. 克隆最后一项作为外壳,换电源图标与危险色文案,上方补分隔线,插入原项之后;
  4. 点击打开确认面板。

找不到菜单或官方 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:

  1. process.kill(pid, 'SIGKILL')
  2. process.abort()
  3. process.exit(0)
  4. 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

手工落盘时:

  1. 将 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/。插件只新增文件,不改官方装载行。

典型用法

  1. 安装并重启 DSHM 后,打开侧栏底部账户菜单,应看到「退出 dsh」(若官方 DOM 未变且注入成功)。
  2. 点击 → 在 overlay 确认 → 应用关闭回桌面。
  3. 脚本或自动化可调用 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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜