dsh-notify-kde
Manifest validKDE desktop notification plus a KDE Connect phone ping when DSH finishes a turn, needs approval, or waits for an answer.
dsh-notify-kde
DSH 需要你的时候,弹一条 KDE 桌面通知,同时通过 KDE Connect 把同一条消息推到手机。
这是 pi-notify-kde 的 DSH 移植版:触发时机、文案、
节流和手机重试逻辑都沿用原版,只把 pi 的事件换成了 DSH 的会话事件。
什么时候提醒
| 时机 | 默认行为 |
|---|---|
| 一整轮真正跑完(含子代理树全部落定) | 弹「✅ 跑完了 · 4 分 12 秒」+ 最后回复摘要 |
| 出错 / 被阻塞 / 达到 token 上限 | 弹「⚠️ 出错了」或「⏸ 停下来了」,错误不受 30 秒阈值限制 |
模型提问(ask_user_question)或方案待确认(exit_plan_mode) | 等 8 秒还没答才提醒,避免你正在打字时被震 |
| 工具调用等你批准 | 立即提醒「⏳ 等你批准 · Bash — 原因」 |
| 你回来打字 | 把当前会话那条桌面通知撤回 |
子代理自己的会话不单独提醒:它的完成由父会话的「树落定」统一播报,避免一个任务响很多次。
桌面通知默认 8 秒后自动消失(notify-send -t),同一会话的新通知会替换旧的(-r)。
手机收到的是 kdeconnect-cli --ping-msg:一条通知 + 震动。KDE Connect 没有「推送任意通知」
的 DBus 接口,ping 就是它的等价物。
依赖
| 依赖 | 用途 |
|---|---|
| Linux + KDE Plasma(有会话 DBus) | 桌面通知 |
notify-send / gdbus(libnotify) | 弹通知 / 撤回通知 |
kdeconnect-cli + 手机端 KDE Connect | 推手机;手机需已配对且此刻可达 |
没有 kdeconnect-cli 或手机不可达时,桌面通知照发,正文里会注明「手机未送达」。
安装
从 GitHub(无需 npm 账号)
dsh plugin --profile web add https://github.com/Ahrunda/dsh-notify-kde
桌面端:侧栏 插件 → 安装,输入:
https://github.com/Ahrunda/dsh-notify-kde
安装后重启 DSH,在任意会话里发:
/notify-kde test
桌面应弹出一条 8 秒通知,手机会同时震一下。
从 npm(如果以后发布到 npm)
dsh plugin --profile web add dsh-notify-kde
桌面端在插件页输入包名 dsh-notify-kde。
从本地目录(开发/未发布)
- 打开 DSH 侧栏 插件 → 安装。
- 在安装输入框里填本目录的绝对路径(例如
/path/to/DSHPlugin); 如果输入框只收文件,就填打包生成的dsh-notify-kde-0.1.1.tgz。 - 安装后确认
notify-kde是启用状态,然后重启 DSH。 - 发
/notify-kde test验证。
桌面 profile 由 Electron 应用独占管理,
dsh plugin --profile desktop add ...会被拒绝; 本地路径安装要通过插件页完成。
配置
配置分两层,后者覆盖前者:
cordis.patch.yml里这一行的config(部署默认值);$DSH_HOME/notify-kde.json(用户覆盖;/notify-kde on|off只写enabled这一个键)。
常用键:
{
"enabled": true,
"locale": "zh",
"minDurationMs": 30000,
"uiPromptDelayMs": 8000,
"approvalDelayMs": 0,
"desktopTimeoutMs": 8000,
"kdeconnect": true,
"kdeconnectDevices": [],
"includeSnippet": true,
"snippetChars": 140,
"suppressWhenAborted": true,
"suppressSubagentSessions": true,
"ignoreAgentPresets": []
}
| 键 | 默认 | 说明 |
|---|---|---|
minDurationMs | 30000 | 跑完提醒的最短回合时长;0 = 每次完成都提醒 |
uiPromptDelayMs | 8000 | 提问/方案确认等多久还没答才提醒;0 = 立即 |
approvalDelayMs | 0 | 审批等多久才提醒 |
desktopTimeoutMs | 8000 | 桌面通知停留毫秒数;0 = 交给通知服务器决定 |
urgency | normal | low / normal / critical;critical 不会自动消失 |
coalesce | true | 同一会话用同一个通知 id 替换旧通知 |
dismissOnReturn | true | 你发消息时撤回当前会话的通知 |
includeSnippet | true | 通知正文带最后回复的首行摘要 |
kdeconnect | true | 是否推手机 |
kdeconnectDevices | [] | 设备 id 白名单;空 = 所有已配对且可达的设备 |
kdeconnectRefreshWhenOffline | true | 没设备可达时让 kdeconnectd 重扫并轮询 |
annotatePhoneFailure | true | 手机没送达时在桌面通知里注明 |
suppressWhenAborted | true | 你按 Esc 中断的那一轮不提醒 |
suppressSubagentSessions | true | 子代理会话不单独提醒 |
ignoreAgentPresets | [] | 完全忽略这些 agent preset 的会话,例如 Aurabot 的 aurabot-private |
/notify-kde 命令:
| 命令 | 作用 |
|---|---|
/notify-kde 或 /notify-kde status | 当前配置、DBus、上次手机投递结果 |
/notify-kde test | 立刻发一条桌面 + 手机测试 |
/notify-kde on / off | 总开关(写 notify-kde.json,先备份 .bak) |
让 Aurabot(QQ 大肥鱼)不提醒
Aurabot 每个 QQ 会话都跑在自己的 agent preset 上,一轮经常超过 30 秒,所以会被当成“跑完了”。 把这些 preset 加进忽略列表:
/notify-kde ignore aurabot-private aurabot-private-long aurabot-social
也可以直接跑一次性脚本(写 ~/.dsh/notify-kde.json,重启 DSH 生效):
node tools/ignore-aurabot.mjs
反过来取消:
/notify-kde unignore aurabot-private
排查
日志在 $DSH_HOME/notify-kde.log,每次投递都有一行 desktop: sent ... 或失败原因。
不经过 DSH 也能单独验证两条链路:
node tools/smoke.mjs --no-phone # 只测桌面
node tools/smoke.mjs --no-desktop # 只测手机
node tools/smoke.mjs # 两条都测
常见问题:
- 桌面没弹:确认
echo $DBUS_SESSION_BUS_ADDRESS非空;插件会尝试从/run/user/<uid>/bus补上。notify-send缺失时日志会写notify-send failed。 - 手机没震:先
kdeconnect-cli -a --id-only看有没有可达设备。小米/HyperOS 等 省电策略会在锁屏后杀 KDE Connect,手机根本不在网络上——这只能在手机端加白名单。 - 一直不提醒:短于 30 秒的完成本来就不提醒;把
minDurationMs设成0, 或看日志里有没有desktop: sent。
已知限制
- 只支持 Linux/KDE;
notify-send和kdeconnect-cli是硬依赖。 - 不能点击通知聚焦到对应会话:Wayland 下可靠地找到并激活正确的窗口超出本插件范围。
ping是「通知 + 震动」,不是可交互通知;手机上不能直接批准或回答。includeSnippet: true会把最后回复的首行送到手机锁屏;敏感场景请关掉。
从 pi-notify-kde 的映射
| pi 事件 | DSH 事件 |
|---|---|
agent_settled | turn/end + 子代理树计数 |
ui_prompt_start | tool/call 且工具名是 ask_user_question / exit_plan_mode |
| 审批 | approval/asked / approval/decided |
| 用户输入 | user/message(source.kind === 'user') |
License
MIT
Comments
Loading…
From the same category
DeepSeek Harness plugin for Reactive Resume: bridges your resumes and job applications into a Harness session over MCP.
★ 41.7k
↓ 215/wk
MIT
Aug 24, 2026
dsh plugin --profile web add dsh-plugin-reactive-resumeby dsh-market
The plugin market inside DeepSeek Harness — browse, search, one-click install · DSH 可视化插件市场
★ 10.1k
↓ 361.7k/wk
MIT
TypeScript
Nov 1, 2026
dsh plugin --profile web add dshmarketby Tencent
Let AI agents use your real, logged-in browser without interrupting your work. CLI + extension for browser automation across any shell-capable AI agent.
★ 9.9k
↓ 12.3k/wk
MIT
TypeScript
Nov 1, 2026
dsh plugin --profile terminal add @wxg-prc-cpg/browser-skill-dsh-pluginby yjh051108
dsh-routing-suite — injector + router-standard kit: install the runtime injector first, then the task-aware reasoning-mode router preset (measured P1-P23).
★ 7k
MIT
JavaScript
Sep 18, 2026
dsh plugin --profile web add @dsh-external/dsh-super-injectorby superdesigndev
OpenRouter for agent tools. Join community here: https://discord.gg/6mQYYfFMAn
★ 7k
NOASSERTION
Python
Nov 2, 2026
dsh plugin --profile web add treg-dshby Q00
Agent OS: the agent gets smarter on its own. We just hold the line: Interview-gated, staged evaluation, budgeted evolution loop. MCP server, 14 runtimes: Claude Code, Codex CLI, Gemini CLI, OpenCode,
★ 6.3k
MIT
Python
Nov 1, 2026