dsh-focus-notify:焦点感知的 DSH 客户端通知

前言

在 DeepSeek Harness(DSH)里同时跑多个会话时,审批、方案确认、提问和回复完成往往发生在「当前不在看的那条对话」里。若通知策略只认「页面是否可见」,在 macOS 上窗口被其它应用盖住时 document.hidden 仍可能为 false,容易把「人其实在 Edge 或 IM 里」误判成「正盯着 DSH」,从而漏掉需要你点一下的操作。

下面介绍社区客户端插件 dsh-focus-notify(维护者 sqzw-x;SkillHub 目录条目为 sqzw-x/dsh-alerts)。它把审批、提问、方案确认、回复完成统一当成一种桌面提醒,用 窗口键盘焦点(document.hasFocus())区分「当前会话」和后台会话,而不是单靠页面可见性。

这是什么

dsh-focus-notify 是跑在 DSH Web / DSH Desktop 页面内的 Cordis 客户端 bundle 插件:订阅宿主已有的 uiSession.sessionStatus 与 sessions.list,在规则允许时发系统通知,并在你回到对应会话或窗口重新获得焦点时收掉该会话的通知。

DSH 生态强调「一切皆插件」;SkillHub 等目录站是社区聚合,与 DeepSeek / 幻方无官方从属关系。安装前建议自行查看源码与许可证——插件与当前 DSH 进程同权限运行。

三条提醒规则

README 把行为收成三条,判定逻辑集中在 src/engine.ts 的 allows()(纯逻辑,可单测):

  1. 看会话:屏幕上由 retainedBy.mainView 推导的「当前会话」,仅在 窗口失去键盘焦点 时弹通知;其它会话在 DSH 窗口仍在前台时也会弹。子代理会话默认不参与(ignoreSubagent 默认为 true,可关)。
  2. 看事件:轮次结束(回复完成)与「等你操作」(pendingInteraction:审批 / 方案确认 / 提问)都会弹;同一 pending 请求按 key 去重,只提醒一次。
  3. 回到会话就收掉:聚焦到该会话时通知消失——点通知进入、窗口重新获得焦点、手动切到该会话都算;失焦时仅切会话不会顺带清通知。

完成判定用 running 从 true 落到 false 的边沿,且停止时没有紧接着的 pending;刻意不用 SDK 的 completionUnread 作完成信号,以避免后台会话完成提醒被侧栏未读逻辑误清。代价是「客户端尚未观察到 running === true 就结束」的回复可能不提醒(例如横跨一次页面重载)。

安装与启用

插件管理器:在 DSH 设置 → 插件 中安装本包对应目录条目,启用后 重启 DSH Desktop(客户端 bundle 在页面加载时读取)。

命令行(资料原文,Desktop profile):

# 从 GitHub 安装
dsh plugin --profile desktop add github:sqzw-x/dsh-focus-notify

npm 包发布后,可改为:

dsh plugin --profile desktop add dsh-focus-notify

装完后同样需要重启 DSH Desktop。若只想停用而不卸载,可在 profile 的 cordis.patch.yml 中:

- id: dsh-focus-notify
  disabled: true

package.json 中 engines.dsh 声明了兼容的 DSH 版本区间;实际闸门主要来自 peerDependencies 里的 @deepseek-ai/dsh* 前缀包。

配置与调试

默认值即可使用。在页面控制台可临时改行为(配置持久化在 localStorage 的 dshFocusNotify.config):

__dshFocusNotify.configure({ sound: true })   // 打开提示音(WebAudio,需页面有过交互)
__dshFocusNotify.configure({ enabled: false }) // 暂时全关(仍跟踪状态)
__dshFocusNotify.debug()                       // 当前会话、未送达等待、计数、权限、焦点、导航路径
__dshFocusNotify.test()                        // 绕过规则发一条,验证通知通道
__dshFocusNotify.open('session-id')            // 按 id 切会话,验证点击路径
字段 默认 说明
enabled true 总开关
ignoreSubagent true 子代理会话不提醒
language 'auto' 跟随 DSH 界面,或 'zh' / 'en'
sound false 通知外额外提示音

排查「点了通知没切会话」时,debug() 里的 navigation 表示将使用的切会话 API(uiWorkspace.openSession / sessions.open / none);counters.failed 为导航失败次数。每条通知还会在 window 上派发 dsh-focus-notify:alert(event.detail 含 kind / sessionId / title / body / tag),便于自接任务栏闪烁、自定义声音或日志。

点击通知时,桌面端通过 dsh://open 深链抬窗,浏览器分支使用 window.focus();再调用宿主切会话。权限被拒绝时不发通知,debug().permission 为 denied。

适用场景与限制

适合:主要在 DSH Desktop 上多会话并行、希望「当前对话失焦才吵我、后台随时吵我、子代理默认静音」的用法。README 写明 只在 DSH Desktop 上实测过;Web 版能否正常抬窗与走权限流程 未验证。

需注意:

  • 宿主若无 uiWorkspace.openSession 与 sessions.open,点击通知可能只能抬窗不能切会话。
  • 宿主缺少 retainedBy.mainView 时,所有会话按「非当前」处理,即都会提醒。
  • 通知样式与时长由系统决定(macOS:系统设置 → 通知 → DeepSeek Harness)。
  • 仅在 DSH Web / Desktop 页面内工作;dsh-app:// 页面无法注册 Service Worker,本插件也不依赖通知按钮。

结尾

dsh-focus-notify 用焦点而非「页面可见」划分当前与后台会话,并把审批、提问、方案确认与回复完成统一成一种提醒,减少多会话时漏操作的情况。安装命令以 README 为准;目录与讨论可分别从 SkillHub 与 GitHub 进入。

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

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

Xiaoye