🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

焦点通知 sqzw-x/dsh-focus-notify

DeepSeek Harness
sqzw-x14 天前有提交已提供中文文档扫描:无法判定

焦点感知的 DeepSeek Harness 通知插件:审批/提问/方案确认/回复完成统一推送;当前对话失焦才弹、后台对话随时弹、子代理不弹

30.7/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/18 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add sqzw-x/dsh-focus-notify
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · other
装得上吗
实装验证未通过(unknown),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 14 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
⚠︎ 实装验证未通过(unknown · 2026/10/8) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意

未发布到 npm registry,仅可从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包dsh-alerts(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=18 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/8 17:41:27

安全扫描自动 · 静态分析源码
v2.7.0
⚪ 扫描:无法判定尚无人工评估
展开查看扫描说明与证据 ↓

已尝试扫描但取不到可分析的源码:仓库或包不存在、已删除,或为非 JS/TS 实现、未随包发布源码。无法判定,不代表安全。

  • · 取源不可用(Error: github tarball HTTP 404 @ https:
  • · api.github.com
  • · repos
  • · sqzw-x
  • · dsh-focus-notify
  • · tarball)
扫描于 2026/10/31(1 天前)

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-api-session-controller@deepseek-ai/dsh-client-ui-session@deepseek-ai/dsh-client-ui-workspace@deepseek-ai/dsh-session
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 审批提问方案确认推送
  • 回复完成通知
  • 失焦才弹窗

README

由 DeepSeek 最新模型翻译生成
dsh-focus-notify 给 DeepSeek Harness 的通知插件:审批、提问、方案确认、回复完成,统一当成一种提醒推送。规则只有三条。 规则 1. 看会话分:当前会话只在窗口失去焦点时弹;其它会话一律弹,DSH 就在前台也弹。 2. 看事件分:轮次结束(回复完成)和等你操作(审批 / 方案确认 / 提问)都会弹。 3. 回到会话就收掉:你聚焦到某个会话时,它的通知自动消失 —— 点通知进去、切回窗口、手动切到该会话都算。 子代理会话是个例外:它既不是"当前会话"也不提醒,整个不参与(ignoreSubagent,可以关)。 为什么不用「页面可见」判断 macOS 上窗口被别的应用盖住时,document.hidden 仍然是 false —— 只有最小化 / ⌘H 才会变成 true。按「页面可见就不提醒」实现的插件,会把"DSH 被 Edge/QQ 盖住"误判成"用户正看着它",于是你人在别的应用里时,提问和审批的通知被直接丢掉。 这个插件用的是 document.hasFocus():窗口没有键盘焦点就算你不在。当前会话因此只在你真正盯着它时保持安静;反过来,收通知也要手里有焦点才算数 —— 失焦时切会话不会顺手消掉通知,人可能还在别的应用里。 测试状态 只在 DSH Desktop 上实测过。
展开完整文档(README 剩余 1 节)
dsh-focus-notify

给 DeepSeek Harness 的通知插件:审批、提问、方案确认、回复完成,统一当成一种提醒推送。规则只有三条。

规则

1. 看会话分:当前会话只在窗口失去焦点时弹;其它会话一律弹,DSH 就在前台也弹。
2. 看事件分:轮次结束(回复完成)和等你操作(审批 / 方案确认 / 提问)都会弹。
3. 回到会话就收掉:你聚焦到某个会话时,它的通知自动消失 —— 点通知进去、切回窗口、手动切到该会话都算。

子代理会话是个例外:它既不是"当前会话"也不提醒,整个不参与(ignoreSubagent,可以关)。

为什么不用「页面可见」判断

macOS 上窗口被别的应用盖住时,document.hidden 仍然是 false —— 只有最小化 / ⌘H 才会变成 true。按「页面可见就不提醒」实现的插件,会把"DSH 被 Edge/QQ 盖住"误判成"用户正看着它",于是你人在别的应用里时,提问和审批的通知被直接丢掉。

这个插件用的是 document.hasFocus():窗口没有键盘焦点就算你不在。当前会话因此只在你真正盯着它时保持安静;反过来,收通知也要手里有焦点才算数 —— 失焦时切会话不会顺手消掉通知,人可能还在别的应用里。

测试状态

只在 DSH Desktop 上实测过。Web 版能不能正常工作未知(代码里按浏览器语义写了 window.focus() 之类的分支,但没人验证过)。

安装

插件管理器

在「设置 → 插件」里安装本包的目录,启用后重启 DSH Desktop。

命令行

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

从本地目录安装(开发时):

dsh plugin --profile desktop add file:/absolute/path/to/dsh-focus-notify

npm 包发布后,可以改用 dsh plugin --profile desktop add dsh-focus-notify。

装完重启 DSH Desktop:客户端 bundle 在页面加载时读取。停用而不卸载:在 profile 的 cordis.patch.yml 里写

- id: dsh-focus-notify
disabled: true

配置

默认值就能用。想改的话,在页面的控制台里:

__dshFocusNotify.configure({ sound: true }) // 打开提示音
__dshFocusNotify.configure({ enabled: false }) // 暂时全关
__dshFocusNotify.debug() // 当前会话、未送达的等待、计数器、权限、焦点、走哪条导航
__dshFocusNotify.test() // 绕过规则立刻发一条,验证通道
__dshFocusNotify.open('session-id') // 按 id 切会话(缺省切当前会话),验证点击路径

debug() 里两个字段专门用来查"点了没反应":

- navigation — 点击时会用哪个服务切会话:uiWorkspace.openSession / sessions.open / none。
- counters.failed — 导航调用抛错的次数;失败同时会往控制台打一条 [dsh-focus-notify] … 警告。

每发出一条通知,插件还会在 window 上派发一个 dsh-focus-notify:alert 事件(event.detail 就是那条 alert:kind / sessionId / title / body / tag),想接自己的提醒方式(闪任务栏、换个声音、记日志)从这里挂即可。

| 字段 | 默认 | 说明 |
| enabled | true | 总开关;关掉后仍然跟踪状态,只是不发通知 |
| ignoreSubagent | true | 子代理会话不提醒 |
| language | 'auto' | 文案语言:跟随 DSH 界面语言,也可固定 'zh' / 'en' |
| sound | false | 通知之外再响一声(WebAudio,需要页面有过交互) |

配置存在 localStorage 的 dshFocusNotify.config。

它怎么工作

两个只读数据源,都是宿主已经发布好的 store:

- uiSession.sessionStatus — Map<sessionId, { running, pendingInteraction, completionUnread }>
- sessions.list — 会话行(标题、origin: 'subagent'、retainedBy.mainView)

由它们派生出两类事件,对应上面第 2 条规则:

- 等你操作:某个会话出现了 pendingInteraction(审批 / 方案确认 / 提问)。按请求 key 去重,同一个请求只提醒一次。
- 回复完成:某个会话的 running 从 true 落到 false,且没有紧接着的等待(停下来等你输入算"等你操作",不算"完成")。
规则判定集中在 src/engine.ts 的 allows() 里,全部是纯逻辑、不碰 DOM,因此可以脱离浏览器单测。点击通知会唤起窗口(桌面端走 dsh://open 深链,浏览器端 window.focus())并切到对应的会话 —— 切会话调的是宿主的 uiWorkspace.openSession(老宿主上是 sessions.open),调用前绑好实例,失败会记进 counters.failed 并告警,不再像 0.2.0 那样被静默吞掉。手动回去的路子(窗口重新获得焦点、手动切会话)和它走同一个收尾:关掉该会话的通知。没回去过的通知不会自己消失,展示时长仍由系统样式决定。

已知限制

- Web 版未验证:只在 DSH Desktop 上实测过,浏览器里的行为(抬窗、通知权限流程)没人验证。
- 切会话依赖宿主的导航服务:debug().navigation 显示 none 就说明这个宿主既没有 uiWorkspace.openSession 也没有 sessions.open,点击只能抬窗。
- 只在 DSH Web / DSH Desktop 的页面里工作;dsh-app:// 页面注册不了 Service Worker,所以没有通知上的按钮(本插件也不需要)。
- "屏幕上的那个对话"由 retainedBy.mainView 推导;宿主没有这一信息时,所有会话都按"非当前"处理(也就是都会提醒)。
- 通知的展示样式由系统决定(macOS:系统设置 → 通知 → DeepSeek Harness)。
- 权限被拒绝时不发通知,__dshFocusNotify.debug().permission 会显示 denied。
- 完成判定用 running 边沿,不用 SDK 的 completionUnread:后者是侧栏的未读圆点,上游在主视图持有该会话时、以及 running 一旦为真时就清掉它 —— 拿它当"回复完成"的信号会让后台会话的完成提醒静默消失。代价是"客户端还没看到 running === true 就完成的回复"不提醒(例如回复恰好横跨一次页面重载)。
- package.json 的 dsh.compatibility.dshReleases 只是信息性声明:DSH 0.2.0-rc.2 里没有代码读它,真正的兼容闸门是 peerDependencies 里的 @deepseek-ai/dsh(本包声明的 @deepseek-ai/cordis 不在被检查的前缀里,因此是惰性的,与上游 dsh-client-ui-session 等包一致)。

开发

需要 Node 22.18+(构建工具链的要求:tsdown ^22.18.0 || ^24.11.0 || >=26.0.0,CI 跑 22/24;产物本身只跑在浏览器里,与 Node 版本无关)。

npm install
npm run build # tsdown → lib/{index,client,engine}.js
npm run typecheck # tsc --noEmit
npm test # 构建 + node --test

lib/client.js 是浏览器产物,包在 window.__ModuleLoader__.load({ id, factory }) 里(与官方 ui- bundle 同形),包装由 tsdown.config.ts 的 banner/footer 生成。测试分四层:test/engine.test.mjs 打规则表,test/client.test.mjs 把构建产物放进 vm、按真实宿主的样子造服务实例来加载,test/host.test.mjs 把同一个产物当真正的 cordis 插件挂在真 Context 上跑,test/manifest.test.mjs 盯清单与产物契约。上面说的"只在 Desktop 实测过"指的是真实使用,不是这些测试覆盖了什么。

发布

发布走 npm Trusted Publishing(OIDC),CI 不需要长期 NPM_TOKEN。

1. 首次发布:npm 上还没有 dsh-focus-notify,先本地 npm login 后执行 npm publish --access public(或临时用一次性 token 在 CI 发),创建包并确定归属。
2. 在 npmjs.com 打开该包 → Settings → Trusted publishing,添加 GitHub Actions:
- Organization or user: sqzw-x
- Repository: dsh-focus-notify
- Workflow filename: publish.yml
- Allowed actions: 勾选 npm publish(npm stage publish 默认允许)
3. 之后打 v* 标签即可由 .github/workflows/publish.yml 经 OIDC 发布;标签版本须与 package.json 一致。新配置要在 2 天内完成一次成功发布,否则过期;若 0.3.0 已手动发过,先 npm version patch 到 0.3.1 再打标签(npm version 会通过 version 脚本同步 src/version.ts)。
4. 验证通过后删掉 NPM_TOKEN,并在包的 Publishing access 里选 “Require two-factor authentication and disallow tokens”。

首版已手动发布过时:升到下一个版本并用 CI 验证 trusted publisher
npm version patch && git push --follow-tags

之后的版本
git tag "v$(node -pe 'require("./package.json").version')" && git push origin --tags

License

MIT
预览分享卡片长什么样 ↓sqzw-x/dsh-focus-notify
分享 · DeepSeek Harness Hub
sqzw-x/dsh-focus-notify

焦点感知的 DeepSeek Harness 通知插件:审批/提问/方案确认/回复完成统一推送;当前对话失焦才弹、后台对话随时弹、子代理不弹

回到顶部