dsh-session-notifier:会话需要你动手时用系统通知提醒你

前言

在 DeepSeek Harness(DSH)里跑智能体会话时,常见情况是:交代完任务就切到别的窗口,回来才发现会话早就 idle,或一直停在「等你点允许」「弹窗等你回答」。没有外部提醒时,只能靠偶尔切回标签页碰运气。社区插件 dsh-session-notifier(维护者 w2018,分类为客户端)专门监听会话里「需要你动作」的节点,用浏览器系统通知和页内提示条提醒;点通知或提示条会通过宿主接口打开对应会话,而不是 merely 把窗口提到前面。

这是什么

dsh-session-notifier 是 DSH 的 Cordis 插件:Host 侧旁听会话事件并维护有界提醒队列,Client 侧每 2 秒拉取 /api/session-notifier/state?since=N,在合适时机弹出系统 Notification 或页内 overlay 提示条。运行态配置保存在 $DSH_HOME/storages/session-notifier/settings.json;cordis.patch.yml 仅提供首次安装默认值,改设置页选项保存即生效。

与「全靠人盯页面」相比,它把任务完成、授权等待、提问、登录失败、报错等节点结构化筛出,并区分前台策略,避免同一条提醒在系统通知和页内条上重复打扰。

会提醒哪些节点

下面表格与 README 一致;子任务结束默认关闭,避免长任务里几十次子 agent 刷屏。

节点 触发来源 默认
一轮任务跑完 agent/status:先见过 running 再见到 idle 开
等你点允许(授权) approval/request(waterfall,只旁听不改判) 开
弹窗提问等你回答 user-questions/request 开
需要登录 / 重新授权 deepseek-account/model-sign-in-required、authorization/settled = failed 开
任务出错 agent/error、api-session/error 开
子任务结束 subagent/end 关

设计上有几条硬性约束:Host 只筛事件、不直接调系统通知(权限必须在页面申请);授权链上的 waterfall 监听器一律 try/catch 后原样 return next(),避免插件 bug 卡死审批;idle 在初始化或子 agent 结束时也会出现,必须见过 running 才算一轮结束,且 header.origin === 'subagent' 的子会话不报「完成」。

设置与前台策略

在 DSH 设置里打开 会话提醒 即可配置:

  1. 总开关与上述六个节点开关;
  2. 前台策略(三者互斥,不叠加):smart(推荐,仅后台弹系统通知)、always(始终只弹系统通知)、never(只弹页内条)。若走了系统通知路径,就不再弹页内条;只有通知发不出去(未授权或不支持 Notification)时才用页内条兜底;
  3. 提示音(内置 assets/mambo.wav,Host 经 GET /api/session-notifier/sound 提供;系统通知设 silent: true,音量由 soundVolume 0–1 控制,默认 0.8)、标签页标题未读计数、提示条停留秒数;
  4. 免打扰时段(支持跨零点,例如 23:00 → 08:00);
  5. 「申请系统通知权限」、实时权限状态、发一条测试提醒。

提示音仅在系统通知路径播放,页内条不响。Client 会在用户首次 pointerdown / keydown 时静音解锁 <audio>,以绕过浏览器自动播放限制。

点系统通知或页内条时,会调用 uiWorkspace.openSession(sessionId) 选中该提醒所属会话;子会话会先经 sessions.subagentAddress() 解析再打开。window.focus() 仅为附带动作。

安装与启用

资料中的安装方式不是 dsh plugin add,而是把插件目录放到本机任意位置后,用 plugin_manager 的 install_bundle,target 填该目录的绝对路径,然后重启一次 dsh web(新接管的客户端 bundle 需重新加载)。

package.json 要求 dsh >=0.1.7-rc.2、Node >=22。当前包版本为 0.1.1,许可证 MIT。Host 的 BACKEND_VERSION 与 Client 的 EXPECTED_BACKEND_VERSION 不一致时,设置页会提示重启 DSH,避免对着无效的开关操作。

典型用法

  1. 按上文完成 install_bundle 并重启 dsh web;
  2. 打开 设置 → 会话提醒,开启总开关,按需打开各节点开关;
  3. 点击「申请系统通知权限」;在 localhost 等安全上下文下一般可申请;被拒绝时仍可用页内条,并在浏览器站点设置里改权限;
  4. 使用「发一条测试提醒」确认通知与(若启用)提示音;
  5. 保持 DSH Web 客户端打开(Client 负责拉取 state 与弹通知);会话在后台跑到 idle、出现 approval、提问或报错时,应收到对应提醒;点击通知应跳回该会话。

开发或自测逻辑时可于插件目录执行:

node --test "test/*.test.js"

适用场景与注意

适合长时间挂会话、经常 multitasking 的 DSH 用户,以及需要明确感知「授权 / 提问 / 登录」阻塞点的场景。不适合把「每个子 agent 结束」都当完成提醒的场景——该节点默认关闭正是为此。

插件以当前 DSH 进程权限运行,安装前应阅读仓库源码与 MIT 许可证,确认事件旁听与 API 行为符合你的环境。系统通知依赖浏览器权限与站点策略;前台策略为 never 时不会走系统通知路径。社区目录 SkillHub 与 DeepSeek / 幻方无官方从属关系,本文事实以仓库 README 与 package.json 为准。

结尾

dsh-session-notifier 把「会话在跑、有人在等你」收敛成可配置的提醒节点,用拉取式 state API 和页内兜底降低漏看成本。目录页:https://www.skillhub.cn/plugins/w2018/dsh-session-notifier;源码与完整说明:https://github.com/w2018/dsh-session-notifier。

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

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

Xiaoye