前言¶
用 DSH 跑智能体时,会话在后台完成、有待回答问题或权限申请,往往要等到你切回客户端或翻侧边栏才注意到。Windows 任务栏上的 DSH 按钮本身不会告诉你「还有几段未读完成」或「哪类事项在等你」。下面介绍的 dsh-badge-notify(维护者 dthcle)在桌面版 DSH 的任务栏图标轮廓上叠一层鼠标穿透的浮层:黑底白字数字表示未读完成数,左侧竖列提示点区分提问与权限,左上角红点单独表示上次运行失败——语义与 DSH 侧边栏绿点、事件类型对齐,而不是在任务栏外围再挂一个独立窗口。
这是什么¶
dsh-badge-notify 是 DSH 社区目录中的客户端类插件(目录页,GitHub)。它在 Windows 任务栏的 DSH 图标周围(贴着图标轮廓,不是任务栏外围)绘制 ChatGPT 风格的角标与提示点;宿主半端跑在 DSH 进程内订阅完成与待办事件,浮层半端用 UI Automation 定位 Appid: com.deepseek.dsh 的任务栏按钮并分层绘制。仅支持 Windows 10 / 11 与 DSH 桌面版(desktop profile),不联网、不注入进程、无需管理员权限。
核心功能¶
数字徽标(未读完成)¶
黑底圆角方块 + 白色数字,表示未读的已完成会话数。徽标中心抬升在图标右上角上方(默认 badge.lift 为 0.5,即徽标底边贴着图标顶边),尽量不遮住图标本体。
「未读」与 DSH 侧边栏的小绿点同义:会话跑完时你正在主视图看它就不计数;跑完后你打开它即视为已读,计数自动减掉。若希望「所有完成都计数」,可在配置里设 badge.unreadOnly: false。
提示点(待人工处理)¶
提示点中心落在图标左边缘,自上而下排列。默认 dots.group 为 "kind":每种提示只有一个点。
| 颜色 | 含义 | 事件 |
|---|---|---|
| 黑点 | 有提问待回答 | user-questions/request |
| 黄点 | 有权限申请待批准 | approval/request |
第一个点与右上角数字徽标同一水平线;第二个点落在左边中点。同类的多个待处理仍只显示一个点。若需要「每个待处理项一个点」,把 dots.group 改成 "item"。
失败红点(不进数字)¶
红点表示上次运行失败(agent/error / api-session/error),位置在图标左上角,与右上角数字角标对称,不占用左边缘提示点列。失败回合不计入角标数字。打开该会话,或该会话后续成功完成,红点即清除;正在查看的会话出错不标记。红点不会自动过期,直到你处理。颜色与大小可通过 dots.error、error.size、error.insetX/Y 等项调整(资料中默认错误色为 #ef4444)。
显示策略¶
默认 display.taskbarOnly 为 true:只在任务栏可见时显示浮层;全屏游戏、视频或最大化遮挡任务栏时自动隐藏,任务栏恢复后再显示。设为 false 可恢复始终置顶的旧行为。
浮层默认鼠标穿透(WS_EX_TRANSPARENT),不挡任务栏图标点击;窗口不进 Alt+Tab、不抢焦点。
安装与启用¶
在 PowerShell 中执行(官方 README 原文):
dsh plugin --profile desktop add dsh-badge-notify
也可从 GitHub 源码安装:
dsh plugin --profile desktop add github:dthcle/dsh-badge-notify
装完不用重启 DSH:宿主半端会把浮层载荷部署到 %LOCALAPPDATA%\DshBadgeNotify\ 并拉起浮层,几秒内即可在任务栏 DSH 图标上看到效果。在 设置 → 任务徽标(与「内置插件」平级的独立设置页)可查看状态、启停、清零。
卸载:
dsh plugin --profile desktop remove dsh-badge-notify
若启动 DSH 时使用的不是 desktop profile,将命令中的 --profile desktop 换成你的 profile 名。插件以当前 DSH 进程权限运行;安装前建议在 GitHub 查看源码与许可证(MIT)。
运行要求摘要¶
- 平台:Windows 10 / 11
- DSH:桌面版(
desktopprofile) - Node:插件包要求
>=20.0.0(宿主环境) - 资源占用(README 自述):约 0.7% 单核 CPU、~145 MB 内存
典型用法与配置¶
图形界面¶
日常通过 设置 → 任务徽标 启停浮层、清零已完成计数、查看待处理列表(约 5 秒轮询)。
配置文件¶
用户配置路径:%LOCALAPPDATA%\DshBadgeNotify\config.json。缺失时由插件写入默认值;configVersion 变化时会刷新并备份旧文件为 config.json.bak。修改后约 2 秒内自动生效。
常用项示例:
badge.unreadOnly:是否只统计未读完成(默认true)badge.lift、badge.sizeRatio:徽标位置与相对图标的大小dots.group:kind(按类型一个点)或item(每项一个点)pollMs、buttonRefreshMs:状态轮询与任务栏按钮矩形重读间隔(UIA 调用过密会增加 CPU)
完整键表见 GitHub README 配置一节。
手动调参预览¶
不想改真实事件时,可在数据目录写入 preview.json,浮层固定绘制指定标记,便于对着任务栏调 config.json:
{ "enabled": true, "count": 8, "dots": ["question", "approval"] }
删除该文件或设 "enabled": false 即回到实时状态。模板见仓库 assets/preview.example.json。
Loopback 管理 API¶
仅本机 POST,例如:
| 路由 | 作用 |
|---|---|
/api/dsh-badge-notify/status |
运行状态、pid、已完成数、待处理列表 |
/api/dsh-badge-notify/start |
部署并拉起浮层 |
/api/dsh-badge-notify/stop |
停止浮层 |
/api/dsh-badge-notify/clear |
已完成计数清零 |
/api/dsh-badge-notify/read |
上报当前主视图打开的会话,视为已读 |
未读语义与客户端 completionUnread(dsh-client-ui-session)一致:插件客户端半端把 retainedBy.mainView > 0 的会话镜像给宿主,不靠猜测点击或计时器。
架构与定位方式(便于排错)¶
插件分两半:
- Host 半端(
lib/index.js,DSH 进程内):订阅agent/status、user-questions/request、approval/request,写state.json,注册上述 loopback 路由。 - 浮层半端(
assets/BadgeNotify.ps1,独立进程):UIA 定位任务栏按钮,从按钮像素量出图标本体外接框,再用UpdateLayeredWindow绘制。量像素时会先隐藏浮层,避免自绘标记被当成「图标墨迹」导致框逐轮膨胀。
诊断日志:
%LOCALAPPDATA%\DshBadgeNotify\logs\host.log:宿主 apply、事件命中%LOCALAPPDATA%\DshBadgeNotify\logs\badge-notify.log:每次重绘的draw box/anchor ink/canvas行
手动校准(打印图标框后退出):
powershell -NoProfile -ExecutionPolicy Bypass -File "$env:LOCALAPPDATA\DshBadgeNotify\BadgeNotify.ps1" -Calibrate
适用场景与注意¶
适合:长期在 Windows 桌面用 DSH 跑多个会话,希望任务栏一眼看到未读完成数,以及提问、权限、失败三类状态,且不想被全屏应用上的置顶浮层打扰(默认任务栏可见才显示)。
注意:
- 仅 Windows;依赖 UI Automation,explorer 或 UIA 树异常时可能出现定位抖动或
slow tick日志,插件会保留上一轮矩形并重试。 - 浮层由 DSH 宿主 spawn,需在能显示任务栏的桌面会话中使用;受限 token 下 UIA 可能找不到任务栏按钮。
- 社区插件与 DeepSeek / 幻方无官方从属关系;SkillHub 为独立生态目录,安装前请自行审阅 dthcle/dsh-badge-notify 源码与 MIT 许可证。
结尾¶
dsh-badge-notify 把 DSH 里「完成未读、待回答、待批准、运行失败」四类状态搬到 Windows 任务栏图标上,规则与客户端绿点一致,浮层穿透点击、任务栏不可见时自动隐藏。需要安装命令、配置项与排错细节时,以仓库 README 为准。