任务完成或待审批时右下角滑出不抢焦点的卡片
30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/16 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/Maple-Yoli/dsh-notice-card.git状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:待复验
是什么
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 16 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 20 处,展示前 20 条)
- 读取本地文件lib/index.mjs:230
const source = readFileSync(CARD_SOURCE); - 读取本地文件lib/index.mjs:232
if (built !== null && built.stamp === stamp && existsSync(built.exe)) return built.exe; - 读取本地文件lib/index.mjs:234
if (existsSync(exe)) { built = { stamp, exe }; return exe; } - 写入本地文件lib/index.mjs:236
mkdirSync(BUILD_DIR, { recursive: true }); - 读取本地文件lib/index.mjs:237
const compiler = existsSync(FRAMEWORK) ? FRAMEWORK : FRAMEWORK32; - 读取本地文件lib/index.mjs:238
if (!existsSync(compiler)) { failedStamp = stamp; return null; } - 执行外部命令来自配置/变量lib/index.mjs:243
const build = spawnSync(compiler, [ - 读取本地文件lib/index.mjs:249
if (build.status !== 0 || !existsSync(temporary)) { - 删除本地文件lib/index.mjs:250
try { rmSync(temporary, { force: true }); } catch {} - 写入本地文件lib/index.mjs:254
renameSync(temporary, exe); - 删除本地文件lib/index.mjs:295
if (spec.dismiss) rmSync(spec.dismiss, { force: true }); - 执行外部命令来自配置/变量lib/index.mjs:320
const child = spawn(exe, args, { stdio: "ignore", windowsHide: true, detached: true }); - 写入本地文件lib/index.mjs:349
const write = () => { try { writeFileSync(dismiss, ""); } catch {} }; - 删除本地文件lib/index.mjs:351
setTimeout(() => { try { rmSync(dismiss, { force: true }); } catch {} }, DISMISS_TTL_MS).unref(); - 写入本地文件lib/index.mjs:426
mkdirSync(dirname(PREVIEW_SPEC), { recursive: true }); - 写入本地文件lib/index.mjs:430
writeFileSync(temporary, `${lines.join("\n")}\n`, "utf8"); - 写入本地文件lib/index.mjs:431
renameSync(temporary, PREVIEW_SPEC); - 删除本地文件lib/index.mjs:461
try { rmSync(PREVIEW_SPEC, { force: true }); } catch {} - 发起网络请求lib/client.js:272
const result = fetch(PREVIEW_PATH, { - 发起网络请求lib/client.js:313
const result = fetch(PREVIEW_PATH, {
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
DeepSeek Harness 在 Windows 上的免聚焦通知卡片:任务完成、待审批、待回答。
README
由 DeepSeek 最新模型翻译生成通知卡
给 DeepSeek Harness 的一张桌面通知卡:一轮任务跑完、等你审批工具调用、等你回答问题时,屏幕右下角滑出一张卡片,不抢焦点、不打断你正在做的事。
多张卡自动叠成一摞,最先出现的那张完整显示在最前面,后来的卡依次往上垫、只露出标题条。
卡片叠放示例
出现与消失动画
- 纯 Windows 桌面绘制(WinForms + GDI+),不依赖 Windows 通知中心,也不用打开系统通知权限
- WS_EX_NOACTIVATE + TopMost:盖在所有窗口之上,但永不夺走焦点,你想打字就打
- 独占全屏的游戏或视频在跑时自动让路,绝不打断画面
- 卡片是独立进程,DSH 忙的时候也照弹;进程崩了也不影响 DSH 本身
- 零网络、零遥测:插件不发任何请求,只在本地起一个 PowerShell 进程画窗口
环境要求
| 项目 | 要求 |
| 平台 | Windows(os: win32) |
| DSH | >= 0.1.0-rc.1 |
| Node | >= 20(只给宿主加载插件用) |
| 运行时 | Windows PowerShell 5.1(系统自带,无需额外安装;不需要 PowerShell 7) |
卡片的脚本用到了 WinForms 与 DPI 感知 API,走的是 5.1 自带的 .NET Framework。
展开完整文档(README 剩余 1 节)
通知卡
给 DeepSeek Harness 的一张桌面通知卡:一轮任务跑完、等你审批工具调用、等你回答问题时,屏幕右下角滑出一张卡片,不抢焦点、不打断你正在做的事。
多张卡自动叠成一摞,最先出现的那张完整显示在最前面,后来的卡依次往上垫、只露出标题条。
卡片叠放示例
出现与消失动画
- 纯 Windows 桌面绘制(WinForms + GDI+),不依赖 Windows 通知中心,也不用打开系统通知权限
- WS_EX_NOACTIVATE + TopMost:盖在所有窗口之上,但永不夺走焦点,你想打字就打
- 独占全屏的游戏或视频在跑时自动让路,绝不打断画面
- 卡片是独立进程,DSH 忙的时候也照弹;进程崩了也不影响 DSH 本身
- 零网络、零遥测:插件不发任何请求,只在本地起一个 PowerShell 进程画窗口
环境要求
| 项目 | 要求 |
| 平台 | Windows(os: win32) |
| DSH | >= 0.1.0-rc.1 |
| Node | >= 20(只给宿主加载插件用) |
| 运行时 | Windows PowerShell 5.1(系统自带,无需额外安装;不需要 PowerShell 7) |
卡片的脚本用到了 WinForms 与 DPI 感知 API,走的是 5.1 自带的 .NET Framework。仓库不含任何预编译产物,第一次弹卡时插件会自动把一小段 C# 互操作代码编译成 DLL 缓存到 %LOCALAPPDATA%\dsh-notice-card\NotifyWin.dll。
安装
插件是纯 Host 插件(dsh.bundle.patch),有四种装法,按你的 DSH 形态选一种。
方式一:从 npm 装(不用 clone,推荐)
npm i dsh-notice-card@0.1.4
在装它的目录里能拿到 node_modules/dsh-notice-card/,然后在你的 profile 的 cordis.patch.yml 末尾追加:
- insert:
- id: notice-card
name: C:/path/to/node_modules/dsh-notice-card/lib/index.mjs
config: {}
把 C:/path/to 换成你执行 npm i 的目录,路径用正斜杠。
包一旦发布到 registry 就是长期可装的,装的人不需要账号也不需要令牌。作者的发布令牌只在推新版本时用得上,跟别人安装无关。
方式二:手动挂载(clone 源码,适合要改代码)
git clone --branch v0.1.4 https://github.com/Maple-Yoli/dsh-notice-card.git
打开你的 profile 目录下的 cordis.patch.yml(默认在 %USERPROFILE%\.dsh\profiles\<profile>\cordis.patch.yml),在末尾追加:
- insert:
- id: notice-card
name: C:/path/to/dsh-notice-card/lib/index.mjs
config: {}
把 C:/path/to/dsh-notice-card 换成你实际的克隆路径,路径用正斜杠。
DSH 支持补丁热重载:新增的 id 会被立即加载,不用重启。如果没反应,完全退出 DSH 再开一次。
方式三:官方桌面端(Electron 应用)
官方桌面端的 desktop profile 由应用自己独占,命令行 dsh plugin --profile desktop add 会被拒绝。请走应用内的 设置 → 插件,用仓库地址安装:
Maple-Yoli/dsh-notice-card
安装完成后插件作为 bundle 自动挂载,无需手工改 patch。
方式四:dsh web / 自建 profile
这些 profile 允许命令行装插件:
dsh plugin --profile web add dsh-notice-card@0.1.4
也可以用 GitHub 源(不走 npm):
dsh plugin --profile web add github:Maple-Yoli/dsh-notice-card#v0.1.4
reconcilePlugins 会读到你包里的 dsh.bundle.patch,自动把它加进 profile 的 dsh.profile.bundles,补丁随之生效。
不要同时用两种方式挂载,否则同一个插件会被加载两次、每件事弹两张卡。
配置
在 patch 的 config: 里传,例如只关掉「任务结束」的提示:
- insert:
- id: notice-card
name: C:/path/to/dsh-notice-card/lib/index.mjs
config:
onTurnEnd: false
seconds: 20
| 键 | 默认值 | 说明 |
| onTurnEnd | true | 一轮任务结束时弹卡 |
| onApproval | true | DSH 等你审批工具调用时弹卡 |
| onQuestion | true | DSH 等你回答问题(ask_user_question)时弹卡 |
| seconds | 10 | 无人操作时卡片存活秒数;有请求在等的卡会提前收起 |
| turnEndTitle | 任务已结束 | 任务结束卡的标题 |
| turnEndBody | DSH 已完成本轮任务,等你下一步。 | 任务结束卡的正文 |
| approvalTitle | 等你审批 | 审批卡的标题 |
| approvalBody | 工具:{tool}{reason} | 审批卡的正文模板,{tool} 为工具名,{reason} 为审批理由 |
| questionTitle | 等你回答 | 提问卡的标题 |
| questionBody | 问题:{question} | 提问卡的正文模板,{question} 为问题文本 |
| processName | 自动推断 | 点卡片右上角窗口图标时聚焦的进程名 |
| appPath | 自动推断 | 该进程不在时启动的可执行文件路径 |
| scriptPath | 包内 notify.ps1 | 想改绘制逻辑时指向你自己的副本 |
processName 与 appPath 默认从宿主进程推出来:桌面端下是 DeepSeek Harness 和它的 exe 路径。如果你用别的壳跑 DSH,改成对应值即可;两个都留空则窗口图标只关卡片、不聚焦。
行为说明
- 不抢焦点:卡片创建时带 WS_EX_NOACTIVATE,并会把焦点还给原来那个窗口。你可以一直打字、一直全屏放视频。
- 独占全屏时绕开:游戏(或任何盖满屏幕的前台窗口)独占显示时,画一张普通顶层窗口会逼 Windows 切换显示模式,屏幕黑一下再回来(约 0.7 秒)。所以「任务已结束」卡会先等最多 10 秒——够你 alt-tab 出来看它——全屏还在就丢弃;审批/提问卡则会一直等到全屏结束,因为它是 agent 卡住时唯一的提示。
- 点了才关:点卡片右上角的 ✕ 立即收起;点窗口图标则把 DSH 窗口调到前台。不点的话,seconds 秒后淡出。
- 审批卡不会自己消失:审批/提问的卡会一直挂着,直到应用内面板真的把请求答完,然后才淡出。最少显示 1.2 秒,避免秒闪。
- 压在最上层:卡片进程自己声明 HWND_TOPMOST,跟其他置顶窗口抢顶时可能被挤到后面,属正常现象。
卸载
1. 把 cordis.patch.yml 里那段 - insert: 删掉(方式一/二/四),或在 设置 → 插件 里卸载(方式三)
2. 删掉缓存:%LOCALAPPDATA%\dsh-notice-card\
3. 方式一可以连带删掉 node_modules/dsh-notice-card,方式二可以连带删掉克隆目录
工作原理
一轮结束 → agent/turn-stopping → 写一个请求文件 ┐ 等你审批 → approval/request (prepend) ├→ WinForms 无边框窗口,GDI+ 手绘等你回答 → user-questions/request (prepend) ┘
审批与提问这两个监听器只是旁听:它们用 { prepend: true } 挂在瀑布流最前面,弹完卡立刻 return next() 把请求交回给原本的应答方(应用内的审批面板)。插件永远不代替你回答,也永远不阻塞请求——notify() 全程包在 try/catch 里,弹卡失败只会静默吞掉。
常驻助手
第一张「任务已结束」卡走冷路径(起一个 powershell -File notify.ps1 -Popup),同时顺手在后台拉一个常驻助手进程:它已经把 WinForms 与该脚本用的 interop 程序集加载好了,之后每张卡只需付建窗的钱。稳态从 ~500ms 降到 ~50ms。
助手在第一张卡时才启动——你没让 DSH 弹过卡,就不会有这个进程。它跟着 DSH 走:宿主进程一消失,它就自己退出,不留后台残留。内存代价约 10MB 私有 / 20MB 工作集。
审批卡和提问卡不走这条路:它们可能挂在屏幕上好几分钟,而助手一次只跑一张卡,会让排在后面的卡全堵住。所以只有生命周期固定的「任务已结束」卡进热路径,其余仍是各起一个进程。
notify.ps1 是个独立脚本,也能单独用:
powershell -NoProfile -ExecutionPolicy Bypass -File lib\notify.ps1 -Popup -Title "标题" -Body "正文" -Seconds 8
不带 -Popup 时它会再 spawn 一个分离子进程就退出,适合放在 hook 里当命令用(不阻塞调用方)。
常见问题
卡片不弹?
1. 先确认脚本本身没问题:上面的命令行直接跑一次,能弹就是插件没挂上
2. 插件没挂上:确认 cordis.patch.yml 里 name: 指向的路径确实存在,且是 lib/index.mjs
3. 改了 patch 但没反应:DSH 的补丁热重载只对新增的 id 生效;改一个已存在的 id 的内容不会重载,完全退出 DSH 再开
4. 每次只弹一张、后来的不弹:检查是不是同时用两种方式挂载了两次
中文变成乱码?
notify.ps1 必须保持 UTF-8 BOM。用编辑器改过之后如果中文显示成乱码,就是把 BOM 弄丢了;重新存成「UTF-8 with BOM」。
想改卡片的样式?
lib/notify.ps1 里是全部绘制逻辑(圆角、描边、配色、字号、动画时长、叠放间距都在文件顶部和 New-IconButton 附近)。改完不用重新装插件,DSH 下次起进程就是新脚本。
隐私
- 不发任何网络请求,不写任何统计
- 不收集你的路径、用户名、会话内容
- 与 DSH 的唯一交互就是上面那三个事件,卡片上显示的只有事件自带的工具名/问题文本
- 卡片的 C# 编译产物缓存在 %LOCALAPPDATA%\dsh-notice-card\,卸载时删掉即可
License
MIT
A focus-free notice card for DeepSeek Harness on Windows. It slides into the bottom-right corner when a turn finishes, when DSH is waiting for a tool approval, or when it is waiting for an answer to a question. Cards stack, oldest one front and fully visible.
纯宿主插件:agent/turn-stopping、approval/request 和 user-questions/request → 一个独立的 PowerShell 进程,用 GDI+ 画出一个无边框 WinForms 窗口。不需要通知中心权限,不联网,不上报遥测。审批和提问监听器只观察,然后用 next() 委托出去——内置 UI 仍然照常应答。
独占全屏游戏占用显示时,卡片会主动让路,因为在这种画面上绘制卡片会强制切换显示模式,屏幕会黑一下。回合结束卡片最多等你十秒,等你 alt-tab 切出来,超时就丢弃;审批或提问卡片则一直等下去,因为这是被阻塞的智能体唯一能拿到的提示。
需要 Windows、Node >= 20 和 Windows PowerShell 5.1(Windows 自带;不需要 PowerShell 7)。安装命令是 npm i dsh-notice-card@0.1.4,然后在你的配置档 cordis.patch.yml 里加一条 insert,把 name: 指向 node_modules/dsh-notice-card/lib/index.mjs 的绝对路径(或者克隆仓库到 tag v0.1.4,指向 lib/index.mjs);在官方 Electron 桌面应用上,改为从 Settings → Plugins 安装。完整配置表见上面的中文部分。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Maple-Yoli/dsh-notice-card
任务完成或待审批时右下角滑出不抢焦点的卡片
相关插件 · 安全 / 权限
智能体逆向工程morluto/rea
用智能体逆向工程任何东西,从应用行为到原生二进制。
★ 415,267已汉化DSH
73.3
智能体集群框架ruvnet/ruflo
面向 Claude Code 与 Codex 的智能体元基座meta-harness。
★ 80,414已汉化MCP
71.9
WorkBuddy 模型接入corrinehu/dsh-workbuddy-connect
2026 年 10 月 20 日起,WorkBuddy…
★ 1,604已汉化DSH
71.7
破甲一键通z91772524-ai/pojia-next
十五个 AI…
★ 967已汉化DSH
71.6
AI 代理虚拟终端strukto-ai/mirage
Mirage 是给 AI 智能体用的虚拟终端:一层 shell,统管数据、命令行和运行时。Unix…
★ 3,756已汉化DSH
70.8
Agent 操作层agentic-os-org/ANOLISA
ANOLISA(Agentic Nexus Operating Layer & Interface System Architecture)|智能体操作系统,带运行时、安全、可观测性,以及 Tokenless 响应压缩,降低 token 用量与成本。
★ 649已汉化DSH
70.7