前言¶
在 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