dsh-notice-card
任务跑完、等你审批或等你回答时,在屏幕角落弹出一张不抢焦点的通知卡。
安装
dsh plugin --profile web add dsh-notice-card
沙箱测试结果
| 阶段 | 结果 |
|---|---|
| 1 安装 | ✓ |
| 2 列装 | ✓ |
| 3 挂载 | ✓ |
| 4 启动 | — |
四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。
README
<div align="center">
Notice Card
给 DeepSeek Harness 桌面端的通知卡:任务跑完、等你审批、等你回答时,在屏幕角落弹一张卡片。
只做桌面端。 卡片是 Windows 原生窗口,不依赖浏览器,也不提供网页端那一套(浏览器通知 / 页面浮层 / 标签页标题标记)。




简体中文 · English
[功能](#features) · [安装](#install) · [配置](#config) · [实现](#how) · [常见问题](#faq) · [卸载](#uninstall)
</div>
<a id="features"></a>
功能
三件事发生时弹一张卡:
- 一轮任务跑完
- 等你审批工具调用
- 等你回答一个问题
卡片盖在其他窗口上,但不抢焦点。你可以继续打字;屏幕被一个程序占满的时候不弹,退出全屏后补上。
外观
- 跟随系统主题 —— 深色模式深底浅字,浅色模式反过来。每次弹卡读一次主题,刚切过之后弹出的卡立刻是新配色。两套都是固定常量:深色
#2B2B2B表面 /#FFFFFF主文字 /#CFCFCF次要文字,浅色#FFFFFF/#1A1A1A/#5F5F5F——照 Windows「设置」应用实测取的。不再读 uxtheme,它只能给纯黑纯白,给不出设置应用那种浮起表面。 - 高对比度让位 —— 开了高对比度就用系统自己的窗口色和文字色,不猜变体。
- 文字用灰阶抗锯齿画到黑底,再压成纯灰阶上屏 —— 白字画到黑底(按 2 倍采样画,回落后再算覆盖度),读回每个像素的覆盖度,按覆盖度在底色和字色之间插值。不用 ClearType,是因为它把一根竖笔的覆盖度放在一条子像素列上:同一根笔落在红列、绿列、蓝列上亮度能差 5 倍,压成灰度后就是「相邻竖笔一深一浅」,这正是小字看起来不均匀、发糊的原因。灰阶是真正的逐像素面积,竖笔峰值标准差 0.05–0.08(旧方案 0.11–0.13)。2 倍采样让字形轮廓有真实的过渡带,硬跳变占比 0.25–0.28(旧方案 0.44–0.48),边缘不再是一级级台阶。字号只取整数像素,行高和换行宽度都用同一套引擎算,不会一边量得下一边画不下。
- 字体跟界面语言走 —— 中文 Noto Sans SC(回退微软雅黑 UI)、日文 Noto Sans JP / Yu Gothic UI、韩文 Noto Sans KR / Malgun Gothic、其它 Segoe UI。标题取同族更重一档的 master(SemiBold,没有就用 Medium),正文用 Regular master,都是字体本来画出来的重,不是把轮廓加厚。只加一档:Black 标题在这个字号下是糊不是粗,Medium 正文会把每根竖笔都加宽到看起来像加粗。从右往左的语言(阿拉伯语、希伯来语)右上角两个按钮镜像到左上角。
- 正文框按行数定,能放六行 —— 卡片高度不随正文长短伸缩:六行是常数,短正文下方留白。这样一叠卡高度一致、边缘齐平,每张卡算出来的「这里能放几张」也一致。行距是 1.4 倍字身(字体自带行盒是 1.45,按它排一段话显散),取整数像素,第十行仍落在第一行预测的位置。
- 描边是上淡下重的方向边 —— 卡片被圆角
Region裁掉,阴影画不进窗口里,所以浮起感靠一圈 1px 竖渐变:上沿接近表面色,下沿压到近黑,四边同一圈渐变。这比四面一样重的发丝边更像一张纸,也不会在深色卡上出现「白边」那种一眼假的玻璃感。渐变是对外圈圆角矩形填色、再把表面挖回去做出来的,不是用渐变笔描边——GDI+ 的渐变笔只肯在一段路径上给色,描一圈会有三条边是空的。 - 叠卡逐级沉下去 —— 一摞里第二张、第三张的表面比前排再暗一档(浅色约 4%、深色约 8.5% 一档),第四张起不再变暗,免得半排只剩一条发丝。一摞因此读得出前后,而不是一张卡画了三条边。
- 滚动条会淡出 —— 正文超出六行时右侧出现 2px 轨道加 4px 滑块,滚完 400ms 后开始淡出,260ms 内消失;再滚、再拖动又会淡回来。滚动条不再是一条长住不走的灰杠。
- 图标按钮带常态底 —— 右上角窗口图标与 ✕ 平时就有一层极淡的圆角底(浅色 0x06、深色 0x0A 的 alpha),鼠标移上去才加深到原来的 hover 色。淡到不抢标题,但看得出那里能点。
- 按钮跟时间戳同一行 —— 两个按钮坐在时间戳那一行、与行首顶格对齐,不再占用标题行右端,所以时钟一行的右端和标题一行的右端都是空的。底部角落时这一行在卡片最上面,顶部角落时在最下面,两种布局都跟着时间戳走。
位置与大小
- 落在鼠标那块屏幕 —— 副屏不跑丢。
corner: auto跟系统通知同一个角:任务栏在下面就在右下,在上面就在右上,在左边就跟到左下。 - 也可以钉死四角 ——
top-left/top-right/bottom-left/bottom-right。上边两个顶格贴屏幕顶,下边两个贴任务栏上沿,按工作区算,任务栏在左边或上边也一样对齐。 - 按屏幕宽度缩放 —— 小屏笔记本上不会盖掉三分之一桌面,4K 上也不会缩成邮票。字号有下限。
- 跟文本大小一起长 —— 「设置 → 辅助功能 → 文本大小」调过,整张卡放大,不把文字挤进原来的框。
- 叠成一摞 —— 最早那张在最前、完整显示,后面的只露标题。放得下几张叠几张,绝不会有一张落到屏幕外。
时间与会话
叠成一摞时每张卡只露出贴着屏幕边的那一条窄带,所以弹出时刻、会话名和卡片标题永远一起写在那条窄带上:卡片落在下边两个角,窄带是卡片最上面两行(第一行时钟在前,14:37 · 会话名,会话没标题时显示会话 id 前 6 位;第二行是标题);卡片落在上边两个角,窄带在卡片底部,这两行就写在最下面。窄带的高度按这两行实际占的空间算,所以字调大、卡变宽变窄,三样都还在。右到左的语言里整条跟着镜像。
- 时刻 —— 按系统的短时间格式(12 小时制
2:35 PM,24 小时制14:35)。 - 会话名 —— 和时刻同一行,从时刻后面一直排到那一行右端的两个按钮为止,太长就截断成
...。 - 权限范围 —— 跟应用里那个下拉条同名,只显示不可点,写在离窄带最远的那一行,完全展开时才看得到。
行为
- 不抢焦点 —— 焦点留在你原来那个窗口,打字、放视频都不受影响。
- 全屏时一张卡都不画,退出后补上 —— D3D 独占、演示模式,以及已经拿走呈现路径的无边框全屏游戏都算。在这种画面上让任何窗口出现或消失,合成器都得退出那条路径重新合成:屏幕白闪一下、画面掉一帧、鼠标指针弹出来。所以全屏期间不建窗,通知排进队列等着;退出全屏后按到达顺序一张张补弹,卡与卡之间留出间隔,不会一次糊满屏幕。中途又进全屏,已经弹出的卡自己收掉,队列继续等。全屏期间一直不弹的也没有丢:审批卡和提问卡的请求还在 DSH 自己窗口里,任务结束卡会一直等到你退出全屏。
- 免打扰时不打扰 —— 系统进「请勿打扰」(专注模式、演示模式)时任务结束卡不弹;审批卡和提问卡照弹,那是对话在等你。
- 关动画就真不动 —— 系统关掉「在 Windows 中显示动画」或进省电模式,卡片直接落到位置,不滑入淡出。每张卡判断一次,中途改设置下一张就换行为。
- 按钮尺寸跟那一行 —— 按钮高度取时间戳行的行高(最小 16 单位),所以两种布局里都和时钟一般高,不会比那一行更高、吊在行外面。触摸屏上不做悬停高亮,滚轮行数读系统鼠标设置,不是写死三行。
- 压在最上层 —— 跟别的置顶窗口抢顶层时可能被挤到后面,这是正常的。
什么时候消失
- 任务结束卡 —— 停留
seconds秒后淡出,不点也会消失。 - 审批卡和提问卡 —— 不自己消失。请求可能在你没看见时就被答掉了(回合中止、审批策略自动拒绝、远程客户端替你答),卡片跟着消失会让你以为对话卡住。所以必须同时满足「请求已答完」和「DSH 窗口在这前后出现在过最前面」才淡出,最少显示 1.2 秒,不会闪一下就没了。
- 点 ✕ —— 立即收起。点窗口图标则把 DSH 切到前台。
- 超出叠放上限 —— 最早那张被新卡关掉。
<a id="requirements"></a>
环境要求
只做桌面端,不做网页端。 卡片是画在运行 DSH 的那台 Windows 机器桌面上的原生窗口,不经过浏览器。包里没有网页那一半,所以浏览器通知、页面浮层、标签页标题标记这些一个都没有。想在浏览器里收提醒,用 dsh-notify-me 那种带 client 半的网页插件。
项目 · 要求
形态 · 桌面端(DeepSeek Harness.exe),或 DSH 宿主就跑在你要看的那台 Windows 上
系统 · Windows
DSH · 0.1.0-rc.1 或更高
Node · 20 或更高(只在 DSH 加载插件时用得到)
.NET Framework · 4.x,Windows 自带,不用另外装
浏览器只用来操作 DSH 的话,卡片会画在 DSH 宿主那台机器上。宿主在远程服务器上,卡片就落在服务器的桌面,你在这边看不见。
<a id="install"></a>
安装
四种方式,按你的 DSH 是哪种形态选一种。不要同时用两种,否则每件事弹两张卡。
方式一:从 npm 装
npm i dsh-notice-card@0.3.1
在 profile 目录的 cordis.patch.yml(默认 %USERPROFILE%\.dsh\profiles\<profile 名>\)末尾加上:
- insert:
- id: notice-card
name: C:/你执行 npm i 的目录/node_modules/dsh-notice-card/lib/index.mjs
config: {}
name: 要写完整绝对路径,斜杠用 /。
方式二:clone 源码
想改代码就用这种。
git clone --branch v0.3.1 https://github.com/Maple-Yoli/dsh-notice-card.git
- insert:
- id: notice-card
name: C:/你克隆的目录/dsh-notice-card/lib/index.mjs
config: {}
新加的 id 会被 DSH 立即加载,不用重启。没有反应就完全退出 DSH 再打开。
方式三:官方桌面端
桌面端的 desktop profile 由应用自己管理,命令行的 dsh plugin --profile desktop add 会被拒绝。
在应用里打开 设置 → 插件,填仓库地址:
Maple-Yoli/dsh-notice-card
装完自动挂上,不用改 patch 文件。
方式四:自己建的 profile
dsh plugin --profile <你的 profile> add dsh-notice-card@0.3.1
也可以直接走 GitHub 源,不经 npm:
dsh plugin --profile <你的 profile> add github:Maple-Yoli/dsh-notice-card#v0.3.1
包里的 dsh.bundle.patch 会被自动加进 profile 的 dsh.profile.bundles。
这种方式只适合宿主也跑在本机的场合。宿主跑在远程服务器上,装到哪个 profile 都一样:卡片画在服务器的桌面上。
<a id="config"></a>
配置
配置写在 patch 的 config: 里。比如只关掉「任务结束」提示、把停留时间改成 20 秒:
- insert:
- id: notice-card
…(truncated)以上内容来自 npm 上的 README,我们只做格式化,不改内容。
版本
npm 上共发布:14,最后更新 2026-11-04