每轮跑完弹系统通知,点一下把窗口拉回前台
29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/11/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/yimengsuper2432/dsh-notice.git状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 1 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 11 处,展示前 11 条)
- 执行外部命令来自配置/变量lib/index.js:416
const child = spawn( - 执行外部命令固定命令lib/index.js:454
const child = spawn( - 执行外部命令固定命令lib/index.js:475
const child = spawn("notify-send", args, { stdio: "ignore", detached: true }); - 发起网络请求lib/client.js:47
fetch(API + "/focus", { method: "POST" }).catch(() => {}); - 发起网络请求lib/client.js:103
fetch(API + "/state", { cache: "no-store" }) - 发起网络请求lib/client.js:245
fetch(API + "/state", { cache: "no-store" }) - 发起网络请求lib/client.js:265
fetch(API + "/config", { - 发起网络请求lib/client.js:287
fetch(API + "/test", { method: "POST", headers: { "content-type": "application/json" }, body: "{}" }) - 发起网络请求lib/client.js:300
fetch(API + "/probe", { method: "POST", headers: { "content-type": "application/json" }, body: "{}" }) - 读取本地文件test.mjs:325
const bytes = readFileSync(new URL("./lib/notify.ps1", import.meta.url)); - 读取本地文件test.mjs:332
const bytes = readFileSync(new URL("./lib/focus.ps1", import.meta.url));
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
DSH 每轮任务跑完弹一条系统通知:正常完成 / 出错 / 中断可分别开关,窗口在后台才提醒,点一下把 DSH 拉回前台。Windows / macOS / Linux 通用。
README
由 DeepSeek 最新模型翻译生成dsh-notice
每一轮跑完,让电脑替你说一声
DeepSeek Harness 每跑完一轮(模型停手、等你说下一句话)就弹一条系统通知:哪个项目、第几轮、用了多久、最后一句说了什么。点一下通知能把 DSH 窗口拉回前台。
切去干别的事、或者让它跑十几分钟的时候,不用一直盯着屏幕。
为什么需要它
DSH 桌面版自带的通知只做应用级提示:有新版本可升级、更新需要重启。它没有「这一轮任务跑完了」的提醒——而那恰好是最需要被提醒的一格。
自己盯着的代价很直接:
| 场景 | 没有它 |
| 让模型跑一个长任务,切去写文档 | 每一两分钟切回来瞄一眼,全在看进度条 |
| 同时开几个会话 | 忘了哪个跑完了,回来发现早就停在那儿 |
| 出错 / 被中断 | 以为还在跑,其实十分钟前就停了 |
| 一轮只花三秒 | 弹一条通知反而打断你 |
这四条对应插件里的四组开关:按结束原因分别开关、只在窗口不在前台时提醒、最短耗时门槛、子任务默认静默。
通知长什么样
三行模板:标题行带会话标题,正文第一行是「模型 · 轮数 · 用时」,第二行起是返回内容。
[任务处理完成通知] 已完成 deepseek-v4.1-flash-1017 · 第 2 轮 · 用时 5.3 秒
通知模板已经照你给的三行改好了:第一行 [会话标题] 已完成,……
展开完整文档(README 剩余 1 节)
dsh-notice
每一轮跑完,让电脑替你说一声
DeepSeek Harness 每跑完一轮(模型停手、等你说下一句话)就弹一条系统通知:哪个项目、第几轮、用了多久、最后一句说了什么。点一下通知能把 DSH 窗口拉回前台。
切去干别的事、或者让它跑十几分钟的时候,不用一直盯着屏幕。
为什么需要它
DSH 桌面版自带的通知只做应用级提示:有新版本可升级、更新需要重启。它没有「这一轮任务跑完了」的提醒——而那恰好是最需要被提醒的一格。
自己盯着的代价很直接:
| 场景 | 没有它 |
| 让模型跑一个长任务,切去写文档 | 每一两分钟切回来瞄一眼,全在看进度条 |
| 同时开几个会话 | 忘了哪个跑完了,回来发现早就停在那儿 |
| 出错 / 被中断 | 以为还在跑,其实十分钟前就停了 |
| 一轮只花三秒 | 弹一条通知反而打断你 |
这四条对应插件里的四组开关:按结束原因分别开关、只在窗口不在前台时提醒、最短耗时门槛、子任务默认静默。
通知长什么样
三行模板:标题行带会话标题,正文第一行是「模型 · 轮数 · 用时」,第二行起是返回内容。
[任务处理完成通知] 已完成 deepseek-v4.1-flash-1017 · 第 2 轮 · 用时 5.3 秒
通知模板已经照你给的三行改好了:第一行 [会话标题] 已完成,……
- 会话标题取自 DSH 的 session/title 事件(侧栏里显示的那个名字);还没有标题时退回项目目录名。
- 模型取自每轮请求的 request/header 里的 config.model;拿不到就不占位,第二行只留「第 N 轮 · 用时」。
- 返回内容是这一轮助手最后一条文本,压成一行后按 snippetChars(本插件默认 90 字)截断;出错时换成错误原因。
- 状态词跟着结束原因走:已完成 / 出错 / 中断。
一条通知是怎么走出来的
flowchart LR
A["一轮结束:模型停手"] --> B{"结束原因开着吗"}
B -- 关闭 --> Z["不打扰"]
B -- 开着 --> C{"短于 minSeconds"}
C -- 是 --> Z
C -- 否 --> D{"窗口在前台"}
D -- 是 --> Z
D -- 否 --> E{"preferClient 且有页面连着"}
E -- 是 --> F["页面通道:渲染进程弹系统通知"]
E -- 否 --> G["本机原生命令:powershell / osascript / notify-send"]
F --> H["点一下 → DSH 回到前台"]
G --> H
两条通道:页面通道 + 本机原生命令
桌面版的宿主是一个 ELECTRON_RUN_AS_NODE 起的独立 Node 进程,不是 Electron 主进程:require("electron") 拿不到 Notification,拉 powershell 这类子进程还可能被进程策略拦掉(典型症状:接口返回「已发送」,屏幕上什么都没有,也没有任何报错)。
所以真正稳的一条路是页面通道:
1. 页面(渲染进程)加载时用 EventSource 挂到 GET /api/dsh-notice-v1/events;
2. 宿主判完「该提示了」就把标题/正文推给连着的页面;
3. 页面用 Web Notification 弹——在桌面版里落到的就是这台机器的系统通知。
preferClient(默认 true)开着时,只要有一个页面连着就走这条路,设置页会显示「已连接的页面:N」;关掉它、或者窗口根本没开(纯 dsh web / 终端里跑),才回退到本机原生命令。
点通知能不能回到 DSH,取决于前台到底由谁去抢:渲染进程里的 window.focus() 只是一句请求,窗口最小化或被别的程序盖住时它拉不回前台。所以页面被点中时会再调一次 POST /api/dsh-notice-v1/focus,由宿主真正去抢——Electron 宿主走 BrowserWindow(restore() + show() + focus()),纯 Node 宿主在 Windows 上交 lib/focus.ps1(ShowWindow(SW_RESTORE) + SetForegroundWindow,前面先用 Alt 键和 AttachThreadInput 解开前台锁),macOS 上用 osascript 激活。这条路径也能单独测:curl -X POST http://127.0.0.1:<端口>/api/dsh-notice-v1/focus。
「发送诊断」卡片会把宿主的真实身份(Node 还是 Electron、PowerShell 找没找到)、最近一次子进程的错误和脚本自己写的日志都显示出来,还带一个「诊断一次」按钮,点一下就知道问题卡在「没拉起子进程」还是「拉起来了但系统没弹」。
发送后端
三个平台共用一套 Electron 主通道,各自再带一个原生回退;auto 按平台自动拼链路。
| 后端 | 平台 | 场景 / 表现 |
| client(首选) | 任意 | 页面开着时由渲染进程弹系统通知,最稳;不依赖子进程 |
| electron | Windows / macOS / Linux | 宿主是 Electron 主进程时直接用 Notification:系统通知署名 DeepSeek Harness,点一下回到窗口 |
| powershell | Windows | 纯 Node 宿主(dsh web)时先发 WinRT toast(DSH 自己的 AppUserModelID),失败再退托盘气泡;标题/正文走 base64 传 lib/notify.ps1,避开命令行中文编码问题 |
| osascript | macOS | display notification,标题和正文走 argv 传参,不拼进脚本文本,中文和引号都安全 |
| notify-send | Linux | libnotify 的系统通知,--app-name=DeepSeek Harness;没装就一路退到 none |
| none | 任意 | 调试用:不发,只记失败 |
backend 默认 auto,链路按平台取:
- Windows:electron → powershell
- macOS:electron → osascript
- Linux:electron → notify-send
- 其它平台:只有 electron
onlyWhenUnfocused 依赖 Electron 的窗口 isFocused():桌面版判断准确;走页面通道时由页面用 document.hasFocus() 判断;两者都判断不出时按「不在前台」处理(照常提示)。
配置
两层:cordis.patch.yml 里的 config 是默认值,<DSH_HOME>/dsh-notice.json(设置页保存的)覆盖它。
| 键 | 默认 | 说明 |
| enabled | true | 总开关 |
| onCompleted | true | 正常完成时提示 |
| onError | true | 出错时提示 |
| onAborted | false | 被中断时提示 |
| includeSubagents | false | 子任务也提示 |
| minSeconds | 0 | 短于这么多秒的一轮不提示 |
| onlyWhenUnfocused | true | 只在窗口不在前台时提示 |
| silent | false | 静音 |
| snippetChars | 90 | 正文里带多少字的回复摘要,0 = 不带(lib/index.js 里的兜底默认是 200,patch 层设成 90) |
| backend | auto | auto / electron / powershell / osascript / notify-send / none |
| preferClient | true | 页面开着时交给页面弹系统通知(桌面版最稳的一条路) |
改设置页任意一项都会立刻落盘到 dsh-notice.json,不用重启。
本机接口
- GET /api/dsh-notice-v1/state —— 配置、平台、各后端就绪状态、宿主身份、最近一次发送、计数
- GET /api/dsh-notice-v1/events —— SSE 通道:页面挂着收通知(data: {"title","body",…})
- POST /api/dsh-notice-v1/config —— 改配置(部分字段),落盘并返回新状态
- POST /api/dsh-notice-v1/focus —— 把 DSH 窗口拉回前台(页面点通知时调它)
- POST /api/dsh-notice-v1/test —— 立刻发一条测试通知(有页面走页面通道)
- POST /api/dsh-notice-v1/probe —— 只走本机原生命令,等 2.6 秒把子进程结果一并返回(诊断用)
接口只接受本机回环地址请求。
安装
插件目录放进 <DSH_HOME>/plugins/dsh-notice,profile 的 package.json 加 "dsh-notice": "link:<绝对路径>" 与 dsh.profile.bundles 条目,再用运行时自带的 node + pnpm 在 profile 目录 install,重启 DSH 生效。
Linux 上想用原生回退,装一下 libnotify:Debian/Ubuntu apt install libnotify-bin,Fedora dnf install libnotify,Arch pacman -S libnotify。macOS 自带 osascript,无需安装。
已知边界
- 只覆盖「一轮结束」:权限确认、工具报错这类中途事件不会单独通知。
- 页面通道要窗口开着:窗口全关时只能靠原生命令,Linux 上没装 libnotify 就退到 none(设置页会显示「未就绪」)。
- 通知内容取最后一轮文本:长回答只截 snippetChars 个字,摘要不换行。
- 原生回退的通知点不动窗口:powershell 的 WinRT toast 和 Linux 的 notify-send 只负责弹,系统不提供点击回调;要「点一下回到 DSH」,得让页面通道生效(保持窗口开着)。
- 接口只服务本机:只接受回环地址请求,不对外暴露。
- 发送失败不重试、不打断任务:只记一笔失败原因,供「发送诊断」查看。
自检
node --check lib/index.js
node --check lib/client.js
node test.mjs
License
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
yimengsuper2432/dsh-notice
每轮跑完弹系统通知,点一下把窗口拉回前台
相关插件 · 其他
模型破甲清洗HunYiSage/dsh-purge
⚔️ DeepSeek Harness 网络安全红队工具dsh-purge
★ 16,993已汉化DeepSeek 客户端
73
女娲蒸馏alchaincyf/nuwa-skill
输入名人名字,提炼其思维模型与决策方式供你调用
★ 37,308已汉化DSH
72
逆向分析桥接Fanqi89/dsh-rea
REA(Reverse Engineer Anything)MCP 桥接,用来把 REA 逆向工具接入 DSH 插件
★ 51已汉化DSH
72
语音女友beiyege-01/dsh-voice-ai-girlfriend
语音 AI 女友Voice AI girlfriend for DeepSeek Harness:Whisper…
★ 888已汉化DSH
71.6
红队越狱测试套件Minglink/dsh-infinite-gen-5
DeepSeek v4.1 flash 逆向工具无限五代 求 Star 收藏 ⭐欢迎大家提交项目的改进
★ 3,759已汉化DSH
71.4
协同办公空间dream-num/univer-workspace
一个让人类与 AI Agent 共同创作、协作和审阅的开源 Office 工作空间。
★ 2,266已汉化DSH
70.7
这是你的仓库?认领条目