dsh-macos-restart:为 macOS 桌面版 DSH 补原生重启入口

前言

在 macOS 上跑 DeepSeek Harness(DSH)桌面版时,一旦装了新插件或改了配置,往往要靠退出再手动打开才能重新加载。官方发布版没有独立的「重启」命令;开发构建里 App 菜单的「重启应用与 Host」仅在 !app.isPackaged 时注入,日常用户看不到。远程连上 Mac、或习惯用智能体替你操作时,「Cmd+Q 再点开」既慢,也容易在「有进行中任务」时被原生确认框卡住——没人点框,进程就退不下去。下面介绍社区插件 dsh-macos-restart(维护者 craig90x,分类:客户端),它给桌面 DSH 增加设置页按钮和 restart_dsh 工具,并在确认框无法远程处理时用 detached helper 做 quit → 重拉的完整流程。

这是什么

dsh-macos-restart 是面向 macOS 桌面版 DSH 的一键重启插件:在 UI 和 agent 工具各提供一个入口,由独立 helper 在宿主退出后负责重新拉起应用。纯 Node 的 dsh web 宿主会明确拒绝,不适用本插件。

当前插件包版本为 0.1.3(见仓库 package.json),要求 Node >=20、DSH >=0.2.0-rc.1。

核心功能

装好后有两处入口,行为一致:

入口 说明
设置 → 通用 → 「重启 DSH」 一行按钮,点一下即触发重启流程
工具 restart_dsh 对 agent 明确说「重启 DSH」时调用;仅响应用户明确要求

重启时宿主会 spawn 一个 detached helper,存活于宿主结束之后,大致顺序为:等待 delayMs(默认 1.5s,让 HTTP 响应先送达浏览器)→ osascript quit → 若在 dialogWaitMs(默认 6s)内未退出(常见原因:有任务时弹出原生「确认退出」框)→ 可选 SIGTERM,再 5s 仍不退则可选 SIGKILL 主进程 → 等待主进程与整棵 bundle 进程树消失 → 用 spawn 与 open -n 交替重试拉起,跨过约 15s 的系统回收窗口 → 写日志、系统通知、删除锁文件。

运维相关路径:

  • 日志:~/.dsh/logs/macos-restart.log(每行带阶段)
  • 锁:~/.dsh/macos-restart.lock(3 分钟自动过期)

安装与启用

通过 DSH 插件管理器安装本地目录(也可在 设置 → 插件 → 添加插件 → 本地目录):

plugin_manager install_bundle target=/path/to/dsh-macos-restart

若需从 GitHub 取得源码,可先 clone 到本地,再执行同一条 install_bundle(路径换成你的目录):

git clone https://github.com/craig90x/dsh-macos-restart.git
plugin_manager install_bundle target=/path/to/dsh-macos-restart

注意: 首次安装后插件尚未加载,需要 手动重启一次 DSH;之后上述重启入口才会生效。

卸载与回滚:

plugin_manager remove_bundle target=dsh-macos-restart

若改过 ~/.dsh/profiles/desktop/cordis.patch.yml,请还原备份后再重启一次 DSH。

配置项

可在 profile 的 cordis.patch.yml 或插件默认里调整(片段来自 README):

- id: macos-restart
  name: dsh-macos-restart
  config:
    appPath: /Applications/DeepSeek Harness.app   # 应用路径(默认值同此)
    delayMs: 1500                                  # 交接前等待,让 HTTP 响应送达
    dialogWaitMs: 6000                             # 发出 quit 后等这么久,仍未退出即视为确认框
    quitTimeoutMs: 25000                           # osascript quit 的超时上限
    relaunchTimeoutMs: 30000                       # 重拉总时限(需跨过约 15s 的系统回收窗口)
    allowSigtermFallback: true                     # 是否允许 SIGTERM(通常无效,仅先试一下)
    allowSigkillFallback: true                     # 是否允许 SIGKILL 兜底(false 则只优雅退出,远程可能永久卡框)

典型用法

  1. 本地:打开 DSH → 设置 → 通用 → 点击「重启 DSH」。
  2. 对话:在会话里明确要求 agent「重启 DSH」,由其调用 restart_dsh。
  3. 排障:重启失败或卡住时查看 ~/.dsh/logs/macos-restart.log,对照各阶段日志(quit、SIGTERM/SIGKILL、relaunch 等)。

适用场景与注意

适合: 经常在 macOS 桌面 DSH 上装插件、改 cordis 配置,需要少一步「完全退出再打开」;远程维护同一台 Mac 上的 DSH,希望在确认框无人点击时仍能完成重启(默认允许 SIGKILL 兜底)。

务必了解:

  • 重启会 中断进行中的任务;有任务时几乎必弹原生确认框。allowSigkillFallback: false 时遇到框可能只能本地人工确认,远程会失败。
  • 每次重启后 host 端口会变(README 举例 51489 → 59523);本地窗口由新实例自带,远端访问靠代理自动跟随。
  • 若 macOS TCC 拒绝 Apple Events(日志出现 osascript quit failed),helper 会走 SIGTERM/SIGKILL 兜底。
  • 插件在 当前 DSH 进程权限 下运行;安装前请自行查看 GitHub 仓库 源码与许可证,确认符合你的环境策略。DSH 生态采用「一切皆插件」思路,SkillHub 目录页 为社区站点,与 DeepSeek / 幻方无官方从属关系。

结尾

经过上面的步骤,桌面版 DSH 在 macOS 上多了与发布版对等的「重启」能力,并把远程场景下确认框、进程树回收、重拉误判等边角一并处理进 helper 流程。需要试用或跟进修复记录(如 v0.1.3 对 SIGTERM 在确认框下无效的修正)时,以仓库 README 为准。

  • 目录页:https://www.skillhub.cn/plugins/craig90x/dsh-macos-restart
  • GitHub:https://github.com/craig90x/dsh-macos-restart
羽毛球分组比赛记分
小程序二维码

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

小夜