前言¶
在 DSH(DeepSeek Harness)桌面配置里跑智能体时,工具调用要权限、Agent 要追问、一轮对话结束或出错,往往得切回主窗口才能处理。系统 Toast 多数只能把焦点带回应用,很难在通知上直接点「允许」;全屏游戏或勿扰模式下弹窗还容易打断当前任务。
下面介绍社区插件 dsh-desk-card(维护者 nanshang328):在 Windows 屏幕右下角用 PowerShell/WPF 画小型置顶卡片(不是系统 Toast),可在卡片上直接批准权限、知晓有待回答问题,并在一轮正常结束时看到简短摘要。全屏或勿扰时会主动跳过绘制,决策交回 DSH 常规 UI,避免卡死。
这是什么¶
dsh-desk-card 是 DSH 的客户端类插件,分类为桌面侧能力扩展。它由 DSH host 进程注入,不依赖浏览器端;渲染侧每个卡片对应一个本地 PowerShell 进程,host 侧监听审批、用户问题、Agent 状态与错误事件并拉起卡片。
- 仅支持 Windows 10/11(随系统自带的
powershell.exe+ WPF)。 - 需要 DSH desktop profile;Node.js 20+(与 DSH 自带版本一致即可)。
- 无额外依赖、无网络、无构建步骤;许可证 MIT(见 GitHub 仓库)。
社区目录页:skillhub.cn/plugins/nanshang328/dsh-desk-card。目录为独立站点,与 DeepSeek / 幻方无官方从属关系;DSH 生态遵循「一切皆插件」的思路,安装前请自行查看源码与许可证——插件以当前 dsh 进程权限运行。
和系统 Toast 的差别¶
README 用表格概括了设计取舍:本插件卡片自带按钮并能把审批结果回传;可在卡片上 确认允许 / Allow;在全屏、演示模式或勿扰前有显式 gate 检测;界面语言可跟随 DSH locale,或用配置强制 zh / en。
会出现哪些卡片¶
| 卡片 | 触发时机 | 自动关闭 | 按钮 |
|---|---|---|---|
| Approval | 工具调用需要权限 | 默认不自动关(等你操作) | 确认允许 / Allow 单次批准;点卡片本体打开 DSH 完整对话框 |
| Question | Agent 向你提问 | 回答后关闭 | 知道了 / Got it |
| Completion | 一轮正常结束 | 默认 doneTimeoutSeconds(5 秒) |
知晓 / OK |
| Error | 一轮失败 | 不自动关 | 知道了 / Got it |
完成卡片会附带上一轮消息的短摘要、耗时、剩余 todo 数量、本轮/会话 token 用量。新卡片叠在已有卡片上方,互不遮挡;DSH 主窗口关闭时,已打开的卡片会自行关闭。
notifyQuestions、notifyErrors、notifyDone 只控制对应卡片是否显示;审批与提问的链路仍会工作,只是不弹出卡片。
安装与启用¶
从 GitHub 安装(README 原文命令,需 desktop profile):
dsh plugin --profile desktop add github:nanshang328/dsh-desk-card
若使用本地下载或解压后的目录:
dsh plugin --profile desktop add ./dsh-desk-card
安装后重启 DSH。包声明了 dsh.bundle,CLI 会写入 dsh.profile.bundles 并以普通 profile 层挂载,无需手写路径。
Windows 开发者可将工作树复制到 profile 插件目录并同样注册:
powershell.exe -File tools/deploy-local.ps1
目标路径为 %USERPROFILE%\.dsh\profiles\desktop\plugins\dsh-desk-card。
配置(可选)¶
默认值已够用。要改行为时,在桌面 profile 的 cordis.patch.yml(~/.dsh/profiles/desktop/cordis.patch.yml)里按相同 id 插入配置,例如把完成卡片停留时间改为 10 秒、缩放 1.0、界面英文:
- insert:
- id: dsh-desk-card
name: dsh-desk-card
config:
doneTimeoutSeconds: 10
scale: 1.0
language: en
config 会整体替换该插件配置对象;未写的键仍用默认。
| 键 | 默认 | 含义 |
|---|---|---|
timeoutSeconds |
0 |
等你操作的卡片(审批/提问)自动关闭秒数;0 表示直到你处理 |
doneTimeoutSeconds |
5 |
完成卡片自动关闭秒数;0 表示直到点击 |
scale |
1.2 |
卡片缩放 |
skipWhenFullscreen |
true |
全屏前台或 Windows 勿扰时跳过绘制 |
notifyQuestions |
true |
是否显示提问卡片 |
notifyErrors |
true |
是否显示错误卡片 |
notifyDone |
true |
是否显示完成卡片 |
language |
auto |
auto / zh / en |
hostProcess |
DeepSeek Harness |
点卡片时置前台的进程名 |
全屏 gate 与跳过行为¶
下列任一成立时不绘制卡片:
SHQueryUserNotificationState报告全屏应用、演示模式或勿扰;或- 前台窗口铺满整屏监视器且不是桌面(减轻部分游戏隐瞒真实状态时的误打扰)。
跳过时审批交给 DSH 常规 UI(插件 prepend: true 时优先响应,跳过则委托下一个 answerer)。可用仓库内脚本自测:
powershell.exe -File test/gate-probe.ps1 -MaxSeconds 20
powershell.exe -File test/fake-fullscreen.ps1 -HoldSeconds 8
工作原理(简图)¶
host 半在 lib/index.js:监听 approval/request、user-questions/request、agent/error、agent/status,为每个事件 spawn 一张卡片,并把子进程退出码映射为审批结果。渲染半在 scripts/card.ps1:单进程单卡片,跑 gate、画 WPF、叠放、计时后退出。
| 退出码 | 含义 |
|---|---|
10 |
主按钮按下 |
12 |
点击卡片主体——置前 DSH 窗口 |
0 |
gate 跳过(全屏/勿扰) |
3 |
渲染失败 |
一卡一进程,渲染侧无状态,避免拖死 host;进程被系统杀掉时同样会委托决策。
日志与排错¶
日志路径:%TEMP%\dsh-desk-card.log,记录布局、退出码、配置与 gate 决策。卡片无控制台窗口;若从不出现,可按 README 顺序检查:全屏占住 gate(可临时 skipWhenFullscreen: false 试)、DSH 进程的 PowerShell 执行策略、以及日志。
绕过 host 手动渲染一张测试卡片:
$payload = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes('{"badge":"test","head":"hello","body":"line","okLabel":"OK","okCode":10}'))
powershell.exe -File scripts/card.ps1 -Payload $payload -TimeoutSeconds 5 -Scale 1.2 -SkipWhenFullscreen false -DebugLog "$env:TEMP\card-test.log"
适用场景与限制¶
适合:主要在 Windows 桌面 profile 使用 DSH、希望离开主窗口时仍能批准工具权限、感知提问与轮次结束/失败,且不想在全屏游戏或勿扰时被硬弹窗的用户。
注意:
- 仅 Windows;无 macOS/Linux 路径。
- 卡片是普通顶层窗口,不能盖过独占全屏游戏——因此才有 gate。
- 每卡约 100 ms 的 PowerShell 冷启动;不是通知中心条目,关掉即消失。
- 本插件不负责重启或关闭 DSH;电源类能力见社区其他插件(README 提及 dsh-power-button、dsh-restart)。
- 隐私:host 不开 socket、不读文件;每卡 spawn 本地 PowerShell,并向
%TEMP%\dsh-desk-card.log追加一行。载荷含会话短摘录(任务标题、工具名、审批原因、错误信息等),经命令行传给子进程。
结尾¶
经过上面的步骤,你可以在 DSH 桌面端用右下角原生卡片处理权限、提问与轮次反馈,并在全屏/勿扰时自动退让到主界面流程。详情与截图见 GitHub README,目录索引见 SkillHub 插件页。