返回目录
消息通讯 渠道适配

dsh-desktop-notify

VoodooB0Ys/dsh-desktop-notify

DeepSeek Harness 的 Windows 桌面提醒:需要授权 / 提问 / 完成 / 出错 / 被中止时在屏幕角落弹出提醒,点一下回到对应对话 | Windows desktop reminders for DSH, with click-to-open.

Stars
0
Forks
0
Issues
0
更新
4 天前

PROJECT TOPICS

项目标签

INSTALL REFERENCE

安装参考

未验证
dsh plugin --profile web add github:VoodooB0Ys/dsh-desktop-notify

该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。

PROJECT README

README

dsh-desktop-notify

中文 | English

给 Windows 上的 DeepSeek Harness 用的桌面提醒:需要你授权、向你提问、任务跑完、 出错、被中止时,屏幕角落弹出一张提醒卡片。点它,DSH 会自己浮到最前,并切到发出这条 提醒的那个对话。

它是为"你没在看 DSH"这个场景做的——你在别的窗口、看别的对话,或者全屏看视频。

仅 Windows。 不支持 macOS / Linux:整条链是 WinRT 通知 / PowerShell / Win32 窗口 激活。在其它系统上插件会加载但什么都不做。

覆盖哪些事件

事件 提醒 打扰程度
有工具需要你授权 「需要你授权」 响,且一直等你
模型向你提问 / 计划审阅 「需要你回答」 响,且一直等你
一个回合正常结束 「任务完成」 轻
一个回合以报错结束 「任务出错」 轻
回合被中止 / 中断 / 达到输出上限 「任务被中止」 轻

该安静的时候它会安静:

情形 行为
你正看着发出这条提醒的那个对话 不出声也不弹
你在看别的对话,或窗口最小化 / 被别的窗口盖住 提醒
子代理 / 子会话里的动作 默认不提醒
短于 5 秒的回合结束 不算"完成"
同一件事 8 秒内又发生一次 只提醒一次
主回合在等后台子代理还没跑完 不算"完成",等它们都结束
焦点信息取不到(页面从未上报) 按"没在看"处理——宁可多响一次也不漏

环境要求

  • Windows 10 / 11(x64)
  • DeepSeek Harness 桌面版(profile 的宿主进程),0.1.7-rc.2 或兼容版本
  • PowerShell 5.1 与 .NET Framework 4(Windows 自带)

没有 npm 依赖。除了想自己重建激活器(见下文)之外,没有构建步骤。

安装

这是一个 DSH bundle:一个声明了 cordis.patch.yml 条目的包。

方式一:插件管理器

在 DSH 里打开 设置 → 插件,用 spec 安装(git 简写或本地路径都行):

github:VoodooB0Ys/dsh-desktop-notify

方式二:把本地检出 link 进 profile(本仓库开发时用的就是这个)

  1. 把这个目录放到任意位置,例如 D:\tools\dsh-desktop-notify。

  2. 编辑 %USERPROFILE%\.dsh\profiles\<profile>\package.json(<profile> 通常是 desktop,浏览器版是 web),加入:

    {
      "dependencies": {
        "dsh-desktop-notify": "link:D:/tools/dsh-desktop-notify"
      },
      "dsh": {
        "profile": {
          "bundles": [
            "dsh-desktop-notify"
          ]
        }
      }
    }

    原有条目保留不动——你只是往 dependencies 加一行、往 bundles 加一行。路径用正斜杠。

  3. 装进 profile:

    cd %USERPROFILE%\.dsh\profiles\<profile>
    <自带 node> <自带 pnpm>/bin/pnpm.mjs install

    (桌面版自带 node/pnpm,在 %USERPROFILE%\.dsh\dsh-runtimes\ 下。)

  4. 重启 Harness。 插件是在宿主启动过程中注册自己的路由的,热重载不够。

除此之外没有任何跟机器绑定的东西:插件里不存任何绝对路径,通知身份是运行时在 HKCU 里按当前用户创建的。

点击行为

点卡片会把目标对话 id 写进交接文件(%USERPROFILE%\.dsh\dsh-desktop-notify.activate), 宿主轮询取走后让页面打开那个对话——等同于点侧边栏里那一行。同时把 DSH 窗口恢复并 短暂置顶 1.2 秒,这样即使被全屏视频盖住也能浮上来。

配置

默认值在本包的 cordis.patch.yml 里。要改就在你自己 profile 的 cordis.patch.yml 里加一段覆盖:

- id: desktop-notify
  name: dsh-desktop-notify
  config:
    channels:
      toast: false     # 是否另外发 Windows 系统通知(默认关,避免两条横幅叠一起)
      alert: true      # 提醒卡片(默认通道)
    classes:
      completion: false
    minTurnMs: 10000
键 默认 含义
enabled true 总开关
classes 全 true 按事件开关(approval / question / completion / failure / aborted)
channels.toast false Windows 系统通知(进通知中心)。默认关,免得你同时收到两条横幅
channels.alert true 提醒卡片
alertSeconds 见文件 卡片停留秒数(授权/提问 60 秒,完成 10 秒,出错/中止 25 秒;0 = 一直留到你点)
gateOnFocus true "你正在看那个对话就不打扰"这道门
backgroundGraceMs 45000 焦点上报多久没更新就当作你已离开
minTurnMs 5000 短于这个时长的回合不算"完成"
dedupeMs 8000 同一对话同一类事件的去重窗口
minGapMs 1500 两条提醒之间的最小间隔
settleMs 800 回合结束后等多久再判定"完成"
notifySubagents false 子代理会话是否也提醒
sound true 按类别播放的短提示音
debug true 写 %USERPROFILE%\.dsh\dsh-desktop-notify.log

如果你把 channels.toast 打开,插件会顺带注册它需要的 COM 激活器(见 《为什么点击需要 COM 激活器》);关着的时候不注册任何东西。

排查

tail -f %USERPROFILE%\.dsh\dsh-desktop-notify.log            # 门与投递的判定
tail -f %USERPROFILE%\.dsh\dsh-desktop-notify.activate.log   # 点击与窗口唤前

每一步判定都会留痕:skip completion: user is looking at this conversation、 skip ...: deduped、skip ...: subagent session、card shown、card clicked。

快速确认宿主路由是否活着:

curl -X POST -H "content-type: application/json" -d "{\"focused\":true}" \
  http://127.0.0.1:<你的 dsh 端口>/dsh-desktop-notify/focus

返回 204 说明插件注册上了;405/404 说明没有——你正在跑的是旧宿主进程,重启它。

卸载

  1. 从 profile 的 dependencies 和 bundles 里删掉 dsh-desktop-notify,在 profile 目录里跑一次 pnpm install,然后重启。
  2. 可选:清掉它运行时创建的东西:
HKCU\Software\Classes\AppUserModelId\DeepSeekHarness.DesktopNotify
HKCU\Software\Classes\CLSID\{D7A1F0B2-3C4D-4E5F-9A0B-1C2D3E4F5A6B}   (只有用过 channels.toast 才会有)

为什么点击需要一个 COM 激活器

对未打包的 Windows 应用,两条看起来最直接的路实测都走不通——都是靠留痕判定,不是猜的:

做法 结果
activationType="protocol" + 注册 URI 协议 手动执行这条 URI 每次都成功,但真实点击横幅从来没有到过处理器——Windows 对未打包应用不做这个转交
常驻进程订阅通知的 Activated 事件 PowerShell 宿主收不到:用一个不需要点击的等价实验(程序化关闭通知)验证,连 Dismissed 都收不到,事件泵根本投递不进这个进程
注册成 AUMID 的 CustomActivator 的 COM 本地服务器 可用——Windows 会启动 lib/dsh-notify-activator.exe,由它把对话 id 交给宿主并把窗口唤前

激活器刻意编译成 winexe:控制台子系统每次点击都会闪一个黑框。用 .NET Framework 自带的编译器重建:

& "$env:WINDIR\Microsoft.NET\Framework64\v4.0.30319\csc.exe" -nologo -optimize+ `
  -target:winexe -platform:x64 -out:lib\dsh-notify-activator.exe lib\activator\NotifyActivator.cs

lib/register-activator.ps1 可以手动注册(并校验)COM 那半边。

已知限制

  • 仅 Windows,x64。激活器是 .NET Framework 4 的 x64 二进制。
  • 绑定 DSH ^0.1.7-rc.2 的事件与服务契约。DSH 内部版本之间会变;如果某个版本改名了 本插件订阅的事件,提醒就会失效。
  • 首次安装必须重启宿主——路由是在启动过程中注册的。
  • 卡片是我们自己的窗口,不是系统通知:不会进通知中心。想要通知中心里也留一份, 把 channels.toast 打开。
  • 卡片不抢焦点、不进任务栏,但它是置顶窗口:如果还有别的东西也置顶,最终谁在上面由 系统按"最后显示"决定。

许可

MIT,见 LICENSE。

CLASSIFICATION EVIDENCE

分类依据

项目类型渠道适配
功能分类消息通讯
规则置信度高

系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: notification。