前言¶
在 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,在规则允许时发系统通知,并在你回到对应会话或窗口重新获得焦点时收掉该会话的通知。
- 维护者:sqzw-x
- 许可证:MIT(见仓库 README)
- 当前 package 版本(资料快照):0.3.1
- 源码与说明:github.com/sqzw-x/dsh-focus-notify
DSH 生态强调「一切皆插件」;SkillHub 等目录站是社区聚合,与 DeepSeek / 幻方无官方从属关系。安装前建议自行查看源码与许可证——插件与当前 DSH 进程同权限运行。
三条提醒规则¶
README 把行为收成三条,判定逻辑集中在 src/engine.ts 的 allows()(纯逻辑,可单测):
- 看会话:屏幕上由
retainedBy.mainView推导的「当前会话」,仅在 窗口失去键盘焦点 时弹通知;其它会话在 DSH 窗口仍在前台时也会弹。子代理会话默认不参与(ignoreSubagent默认为true,可关)。 - 看事件:轮次结束(回复完成)与「等你操作」(
pendingInteraction:审批 / 方案确认 / 提问)都会弹;同一 pending 请求按key去重,只提醒一次。 - 回到会话就收掉:聚焦到该会话时通知消失——点通知进入、窗口重新获得焦点、手动切到该会话都算;失焦时仅切会话不会顺带清通知。
完成判定用 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 进入。