dsh-notice:DSH 每轮任务结束时的系统通知

前言

DeepSeek Harness(DSH)里,模型每跑完一轮会停手等你下一句。长任务切去写文档、或同时开几个会话时,很容易不知道哪一轮已经结束;出错或被中断时,也可能误以为还在跑。DSH 桌面版自带的通知主要是应用级提示(例如新版本、需要重启),并不覆盖「这一轮任务处理完成」这一格。下面介绍社区插件 dsh-notice(维护者 yimengsuper2432),在每轮结束时向本机发系统通知,并可在点击通知时把 DSH 窗口拉回前台。插件分类为客户端,当前在 GitHub 上星标为 0;许可证 MIT,版本见仓库 package.json(资料中为 0.4.0)。

这是什么

dsh-notice 监听 DSH 每轮任务结束(模型停手、等待下一轮输入),按结束原因决定是否弹系统通知:正常完成、出错、被中断可分别开关;默认只在窗口不在前台时提醒,并可设最短耗时门槛,避免几秒就结束的一轮反复打断。通知里会带上项目/会话信息、轮次、用时,以及助手最后一条回复的摘要。Windows、macOS、Linux 通用,依赖 DSH ≥ 0.2.0(README 徽章)、Node ≥ 18、@deepseek-ai/cordis ^4.0.1。

DeepSeek Harness 生态主张「一切皆插件」;SkillHub 目录页 是社区站点,与 DeepSeek / 幻方无官方从属关系。

通知内容与展示逻辑

通知大致为三行结构:标题行带会话标题与状态词(已完成 / 出错 / 中断);正文第一行为「模型 · 第 N 轮 · 用时」,第二行起为返回内容摘要。

  • 会话标题来自 DSH 的 session/title;尚无标题时用项目目录名。
  • 模型来自每轮 request/header 里的 config.model;拿不到则第二行只保留轮次与用时。
  • 返回内容为这一轮助手最后一条文本,压成一行后按 snippetChars 截断(插件 patch 默认 90 字);出错时改为错误原因。

README 中四组开关与常见痛点一一对应:按结束原因分别开关、仅窗口不在前台时提醒、最短耗时门槛、子任务默认静默(includeSubagents 默认 false)。

两条通道:页面通道与本机原生命令

桌面版宿主可能是独立 Node 进程(ELECTRON_RUN_AS_NODE),并非 Electron 主进程,直接拉子进程发通知可能被策略拦截。因此插件优先走页面通道:

  1. 页面加载时用 EventSource 连接 GET /api/dsh-notice-v1/events;
  2. 宿主判定「该提示了」后把标题/正文推给已连接的页面;
  3. 页面用 Web Notification 弹出,在桌面版中即本机系统通知。

preferClient 默认为 true:只要有页面连着就走这条路,设置页会显示「已连接的页面:N」。关闭该选项,或仅 dsh web / 终端跑、窗口未开时,回退到本机原生命令(Windows PowerShell、macOS osascript、Linux notify-send 等)。backend 默认 auto,按平台串联 electron 与对应原生后端。

点击通知回到 DSH:渲染进程里的 window.focus() 在窗口最小化或被遮挡时可能不够,页面点击时会再调 POST /api/dsh-notice-v1/focus,由宿主执行恢复与抢前台。原生回退路径(如部分 WinRT toast、notify-send)往往没有点击回调;若要「点一下回到 DSH」,需保持窗口开着、让页面通道生效。

配置

两层配置:cordis.patch.yml 里的 config 为默认值,<DSH_HOME>/dsh-notice.json(设置页保存)覆盖前者。改设置页任意一项会立刻落盘,无需重启。

键 默认 说明
enabled true 总开关
onCompleted true 正常完成时提示
onError true 出错时提示
onAborted false 被中断时提示
includeSubagents false 子任务也提示
minSeconds 0 短于该秒数的一轮不提示
onlyWhenUnfocused true 仅窗口不在前台时提示
silent false 静音
snippetChars 90 正文摘要字数,0 表示不带
backend auto auto / electron / powershell / osascript / notify-send / none
preferClient true 有页面连接时由页面弹通知

设置页还提供「发送诊断」:宿主身份、PowerShell 是否可用、最近一次子进程错误等,并支持「诊断一次」与 POST /api/dsh-notice-v1/test 发测试通知。

本机 HTTP 接口

接口仅接受本机回环地址请求:

  • GET /api/dsh-notice-v1/state — 配置、平台、后端就绪状态、最近发送与计数
  • GET /api/dsh-notice-v1/events — SSE,页面收通知
  • POST /api/dsh-notice-v1/config — 修改部分配置并落盘
  • POST /api/dsh-notice-v1/focus — 将 DSH 窗口拉回前台
  • POST /api/dsh-notice-v1/test — 立即发测试通知
  • POST /api/dsh-notice-v1/probe — 仅走本机原生命令诊断(约 2.6 秒返回子进程结果)

例如在本机验证抢前台(端口以实际 DSH 为准):

curl -X POST http://127.0.0.1:<端口>/api/dsh-notice-v1/focus

安装与启用

README 未提供 dsh plugin add 一类一键命令,安装方式为手动接入 profile:

  1. 将插件目录放到 <DSH_HOME>/plugins/dsh-notice;
  2. 在 profile 的 package.json 增加 "dsh-notice": "link:<绝对路径>" 与 dsh.profile.bundles 条目;
  3. 使用 DSH 运行时自带的 node + pnpm,在 profile 目录执行 install;
  4. 重启 DSH 生效。

Linux 若需原生回退,需安装 libnotify:Debian/Ubuntu 使用 apt install libnotify-bin,Fedora 使用 dnf install libnotify,Arch 使用 pacman -S libnotify。macOS 自带 osascript,无需额外安装。

插件以当前 DSH 进程权限运行,安装前请自行查看仓库源码与 MIT 许可证,确认符合你的环境与安全策略。

典型用法与自检

日常使用:安装并启用后,保持桌面版窗口打开(推荐,以便页面通道与点击回前台);切到其他应用让 DSH 在后台跑长任务,轮次结束后应收到系统通知。可在设置页调整「仅后台提醒」「最短秒数」「完成/出错/中断」等开关;短轮次可用 minSeconds 过滤。

仓库提供的自检命令:

node --check lib/index.js
node --check lib/client.js
node test.mjs

适用场景与已知边界

适合:长时间单轮或多会话并行、需要离开屏幕又想知道「停手了没」的 DSH 用户;三平台桌面或混合 dsh web 场景,可按 backend / preferClient 调试。

边界(来自 README):

  • 只覆盖「一轮结束」,权限确认、工具报错等中途事件不会单独通知。
  • 窗口全关时只能靠原生命令;Linux 未装 libnotify 时可能退到 none,设置页显示「未就绪」。
  • 长回答仅截 snippetChars 字,摘要不换行。
  • 发送失败不重试、不打断任务,仅记录原因供诊断查看。

结尾

dsh-notice 补的是 DSH 默认通知里缺失的「每轮任务结束」提醒,并通过页面通道与本机回退兼顾三平台;配合前台判断与按原因开关,减少无效打扰。更多信息见 SkillHub 目录页 与 GitHub 仓库。

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

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

小夜