dsh-needs-you-mac:把「Agent 在等你」变成 macOS 系统通知

前言

DeepSeek Harness(DSH,dsh)在执行审批、提问、登录这类需要人介入的节点时,只在聊天输入区渲染提示。一旦你切到别的窗口写代码、开会,Agent 就安静地停在那里:没有系统通知、没有 Dock 提醒、没有声音。等你回来,可能已经过去二十分钟。

dsh-needs-you-mac 就是补「叫你回来」这一环的插件:监听 DSH 的事件,在原生 macOS 通知里弹一条横幅,点一下就把 DeepSeek Harness 切回前台。它只负责通知,不替你做决定。插件由 xuwhao 维护,分类是客户端,npm 包名 dsh-needs-you-mac,当前版本 0.2.1,MIT 许可。

它解决什么问题

0.1.x 的做法是用 osascript 发通知,macOS 会把通知算在脚本编辑器头上,点横幅打开的是脚本编辑器。0.2.0 改成在宿主进程内调用原生 UserNotifications API,通知归属 DeepSeek Harness 本身,点击横幅直接把 DSH 窗口带到前台,即使窗口最小化也会恢复。

插件只在「真的卡在等你」这一步才通知:

  • 通知来自 DeepSeek Harness 本身,不是脚本编辑器;
  • 点横幅切回 DSH;
  • 只观察、不返回审批结果,批准仍必须由你点。

覆盖场景

插件监听三类事件,对应三组通知副标题:

  1. approval/request:工具审批、沙箱升级、插件安装/列表、工作区外写入,副标题「需要你审批一次操作」;
  2. user-questions/request:ask_user_question、计划审核,副标题「需要你回答问题 / 需要你审核计划」;
  3. deepseek-account/model-sign-in-required、deepseek-account/session-expired:模型请求需要登录、登录过期,副标题「需要你登录 DeepSeek 账号」。

通知正文只包含工具名、原因、会话短 ID 或问题文本,全部留在本机。插件不联网、不读凭据、不读写文件。

防打扰机制

审批请求到达后先等 delayMs(默认 1200 ms)。如果这段时间里请求已被自动审核等非人类 answerer 答复,就不通知。只有真正停在「等你」这一步的请求才会弹。

安装与启用

在桌面版里用侧栏安装:插件 → 添加插件 → 输入 dsh-needs-you-mac,然后重启 DeepSeek Harness。

或者用 CLI:

# Desktop profile(使用桌面应用自带的 dsh 命令)
dsh plugin --profile desktop add dsh-needs-you-mac

# Web profile
dsh plugin --profile web add dsh-needs-you-mac

dsh plugin add 会把包追加进对应 profile 的 dsh.profile.bundles,然后重启 dsh 生效。

注意 Desktop 和 Web 的 profile 是独立的:装到 web 不会自动出现在桌面版。原生通知后端需要桌面版宿主(进程在 DeepSeek Harness.app 内)。

首次授权

原生后端发出第一条通知时,macOS 会弹一次:

“DeepSeek Harness”想要发送通知

点「允许」即可。如果没弹出、没点或点了拒绝:

  1. 打开「系统设置 → 通知 → 应用程序通知 → DeepSeek Harness」,打开「允许通知」;
  2. 确认没有开启专注模式 / 勿扰;
  3. 重启 DSH(或等下一次通知)后生效。

不需要重装。插件会自己检测授权状态,未授权时在日志里说明原因,并按 terminal-notifier → osascript 的顺序回退。

配置

在 profile 的 cordis.patch.yml 里覆盖 config。注意 config 是整段替换,不是深合并,覆盖时要把需要的键都写出来:

- id: dsh-needs-you-mac
  name: dsh-needs-you-mac
  config:
    enabled: true
    notifyApproval: true
    notifyQuestion: true
    notifySignIn: true
    delayMs: 1200
    title: DeepSeek Harness
    sound: Glass
    maxBodyChars: 220
    backend: auto

各字段含义:

字段 默认 含义
enabled true 总开关
notifyApproval true 工具审批 / 沙箱升级 / 插件安装等 approval/request
notifyQuestion true ask_user_question、计划审核等 user-questions/request
notifySignIn true 模型请求需要登录 / 登录过期
delayMs 1200 请求到达后等待多久再通知,给自动审核留时间;范围 100–10000
title DeepSeek Harness 通知标题
sound Glass macOS 提示音;none 静音(原生后端使用系统默认通知声)
maxBodyChars 220 通知正文最大长度;范围 40–500
backend auto auto = 原生 → terminal-notifier → osascript;native = 只用原生;osascript = 强制旧后端

适用场景与注意

适合在 macOS 上用 DSH 桌面版、经常让 Agent 停下来等人审批的开发者。使用前注意:

  • 插件以当前 dsh 进程权限运行。它的原生后端是 native/dsh_notify.mm 编译出的 N-API 动态库(native/dsh_notify.node,arm64 + x86_64 通用二进制),源码随包发布,只调用系统 UserNotifications;兜底通知由固定的 /usr/bin/osascript 或 terminal-notifier 通过 argv 启动,不经过 shell 拼接。安装前仍应检查源码与许可证(MIT)。
  • 仅支持 macOS。非 darwin 平台会直接禁用并打日志。
  • 原生后端需要 DSH 桌面版;dsh web 的 CLI 宿主没有 app 身份,原生后端不可用,会退回 osascript,点击横幅仍是脚本编辑器。这是宿主限制,不是配置问题。
  • 原生后端使用系统默认通知声,sound 里的音名只在 osascript / terminal-notifier 后端生效。
  • 插件市场不支持原地升级,更新方式是卸载后重装,或重新执行 dsh plugin add dsh-needs-you-mac@latest。
  • 已在 DSH 0.2.1-rc.5、macOS 27 上实测;engines.dsh 声明为 >=0.2.1-rc.5 <0.3.0-0。

结尾

dsh-needs-you-mac 的价值很小也很清楚:把 DSH 每一次「停下来等你」变成一条点一下就回到窗口的系统通知,同时不碰审批决策。它只做一件事,并且没有越界。

目录页:https://www.skillhub.cn/plugins/xuwhao/dsh-needs-you-mac

GitHub:https://github.com/xuwhao/dsh-needs-you-mac

羽毛球分组比赛记分
小程序二维码

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

小夜