dsh-turn-notifier:每轮对话完成时弹出通知

前言

在 DeepSeek Harness(DSH)里跑长对话或等待模型写完一整轮时,开发者常会切到别的窗口处理事务。轮次何时正常结束、结果大概是什么,如果没有显式反馈,只能反复切回应用查看。系统通知是常见做法,但要把「会话名、耗时、回答摘要」和 DSH 的轮次生命周期对齐,需要自己接宿主事件并处理各平台差异。

下面介绍社区插件 dsh-turn-notifier(维护者 king-shao,分类:客户端)。它在每轮对话正常完成时发送一条通知:标题为会话名称,正文为本轮回答的摘要;页面在线与页面未运行时走不同投递通道,由插件按环境自动选择。

这是什么

dsh-turn-notifier 是 DSH 宿主插件,纯 JavaScript 实现,不含原生依赖。版本 1.2.1,MIT 许可,要求 Node.js >= 20。

插件监听轮次完成事件,将 {会话名称, 耗时, 摘要} 投递为系统或页面内通知。点击通知可激活应用窗口(原生通道下可通过配置项指定要激活的应用)。

目录页:skillhub.cn/plugins/king-shao/dsh-turn-notifier
源码与文档:github.com/king-shao/dsh-turn-notifier

通知内容与投递通道

通知字段

字段 取值
标题 会话名称;会话尚无标题时使用配置项 title
副标题 完成 · <耗时>
正文 本轮回答的摘要
图标 包内 assets/whale.png

两条通道(不会同时投递)

通道 触发条件 说明
client 页面处于运行状态 由页面内的 Notification 接口投递,以 DeepSeek Harness 自身身份显示,不需要额外的系统授权
native 页面未运行 macOS 优先 terminal-notifier,不可用时回退 osascript;Linux 使用 notify-send;Windows 使用 PowerShell 的 WinRT toast

页面以 2 秒间隔轮询宿主,轮询同时作为页面在线心跳。宿主在每轮完成时将事件记在内存,页面通过 GET /dsh-turn-notifier/last.json?after=<seq> 拉取新事件,图标通过 GET /dsh-turn-notifier/icon.png 获取;两路由仅接受回环地址请求。

行为规则

  • 仅在 reason.kind === 'completed' 时通知。用户中断、执行出错、策略拦截以及达到 max-tokens 的轮次均不通知。
  • 默认跳过子代理会话(header.origin === 'subagent'),避免单次提问产生多条通知。
  • 摘要取自本轮最后一段包含文本的 assistant 消息:移除 Markdown 标记、折叠空白,按 summaryChars 截断,并尽量在句末标点处结束。
  • 通知投递失败只写宿主日志,不影响会话本身。

安装与启用

<profile> 为 profile 名称:桌面应用通常为 desktop,命令行的 Web 组合通常为 web。

从 GitHub Release 安装(示例):

dsh plugin --profile <profile> add "https://github.com/king-shao/dsh-turn-notifier/releases/latest/download/dsh-turn-notifier.tgz"

其他安装方式(摘自 README):

# 本地开发:链接源码目录
dsh plugin --profile <profile> add "link:/path/to/dsh-turn-notifier"

# 本地构建产物
dsh plugin --profile <profile> add "/path/to/dsh-turn-notifier-<version>.tgz"

# 已发布到 npm 时按包名安装
dsh plugin --profile <profile> add dsh-turn-notifier

dsh plugin 会把依赖写入 profile 的 package.json,并把 dsh-turn-notifier 加入 dsh.profile.bundles;插件自身的 cordis.patch.yml 负责插入 Loader 条目。注入行与路由在宿主启动时注册,安装或升级后需要重启宿主。

卸载:

dsh plugin --profile <profile> remove dsh-turn-notifier

随后从 profile 的 package.json 中移除 dsh.profile.bundles 内的 dsh-turn-notifier,并重启宿主。

配置

配置项在 cordis.patch.yml 的 config 字段:

键 默认值 说明
title DeepSeek Harness 会话尚无标题时使用的通知标题
summaryChars 180 摘要长度上限,取值不小于 40 时生效
skipSubagents true 是否跳过子代理会话
minSeconds 0 仅提醒耗时不低于该值的轮次
preferClient true 页面在线时使用页面内通知,避免与原生通知重复
sound Glass 原生通道提示音名称;false 为静音
icon auto auto 使用包内图标,也可指定绝对路径,false 为不显示;旧名称 contentImage 仍可识别
activate com.deepseek.dsh 点击原生通知时激活的应用
backend auto terminal-notifier、osascript 或 auto;Windows 与 Linux 按平台固定
logFile ~/.dsh/turn-notifier.log 每次投递记录一行 JSON;空字符串表示关闭

按需改 summaryChars、minSeconds 或 skipSubagents 即可调节摘要长度、过滤短轮次与子代理通知。

平台支持与诊断

桌面应用与 dsh web(浏览器)均支持页面内通知;浏览器首次使用需授权通知权限。macOS 上的 terminal-notifier 为可选增强;未安装时回退 osascript 纯文本横幅(不显示图标)。

排查投递是否成功:

tail -n 5 ~/.dsh/turn-notifier.log
curl -s http://<host>:<port>/dsh-turn-notifier/last.json

日志里 channel 字段标明实际通道;last.json 可查看最近一次完成事件。

适用场景与注意

适合:长时间等待单轮生成、需要离开 DSH 界面又想知道「这一轮是否正常结束」的场景。不适合指望在中断、出错或被策略拦截时收到提醒——这些轮次 deliberately 不通知。

安装前建议自行查看仓库源码与 MIT 许可证;插件以当前 dsh 宿主进程的权限运行,并可能调用本机通知命令(如 notify-send、osascript、PowerShell)。原生通道依赖系统通知权限;未授权时通知可能不展示,仅记日志,页面在线时一般不受此限。

已知限制(摘自 README):页面轮询间隔 2 秒,通知最多延迟约 2 秒;宿主未运行不会产生通知。Windows 原生 toast 在通知中心可能显示为「Windows PowerShell」;Windows 不支持自定义提示音名称。通知图标取自 DeepSeek Harness 应用图标,再分发或公开发布前请自行确认品牌素材授权范围。

DSH 生态强调「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-turn-notifier 把「轮次正常完成」这件事收敛成一条可点击的通知:会话名、耗时与回答摘要,并按页面是否在线在 client 与 native 之间自动切换。若你已在用 DSH 处理多轮对话,可按上文命令安装、改配置并重启宿主试用。

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

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

Xiaoye