🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

桌面提醒 Timur-Ziyangareev/desktop-notify

DeepSeek Harness
Timur-Ziyangareev4 天前有提交已提供中文文档扫描:含敏感能力

回合完成、需介入或失败时弹出通知并响提示音

29.7/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/11/2 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Timur-Ziyangareev/desktop-notify
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · desktop
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 4 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件发起外部网络请求
查看扫描证据(共 4 处,展示前 4 条)
  • 读取本地文件
    index.js:27
    if (!existsSync(configPath())) return null;
  • 读取本地文件
    index.js:29
    const text = readFileSync(configPath(), 'utf8').replace(/^ FEFF/, '');
  • 发起网络请求
    client.js:334
    var request = window.fetch(query, { method: 'POST', keepalive: true });
  • 发起网络请求
    client.js:421
    var request = window.fetch('/desktop-notify/config', { cache: 'no-store' });
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DeepSeek Harness 插件(桌面通知):一轮结束时、需要你处理或出错时,弹出 Windows 通知并带提示音。

README

由 DeepSeek 最新模型翻译生成
desktop-notify(DeepSeek Harness 插件) 无头 DeepSeek Harness 客户端插件:为完成、需要用户介入或失败的回合提供桌面通知,并带提示音。 功能 一个回合的三个时刻会在电脑上发出提示,每个时刻有自己的声音模式: | 时刻 | 通知 | 声音 | | 请求完成 | “DEEPSEEK FINISHED THE REQUEST” + 会话标题 | 上扬的双音提示 | | 智能体需要用户:权限请求、提问、计划审核 | “Permission needed” / “Answer needed” / “Plan review needed” + 工具或问题 | 三声清脆提示音 | | 请求失败 | “Error” + 失败文本 | 低沉的下行双音 | 通知是真正的 Windows 通知,会显示在其他窗口之上,并留在操作中心。点击它会把窗口带到前台。声音在页面内用 WebAudio 合成:不需要音频文件,即使关闭 Windows 通知声音也能听到提示。 输入框那一行有一个开关:喇叭图标位于附件按钮和权限标签之间(Full access 等标签在它右边)。点一下静音——喇叭旁的声波消失,喇叭上出现斜线——再点一下恢复。静音期间通知照常弹出。 智能体对此一无所知:没有注册任何面向模型的内容,插件也不会给请求增加 token。
展开完整文档(README 剩余 1 节)
desktop-notify(DeepSeek Harness 插件)

无头 DeepSeek Harness 客户端插件:为完成、需要用户介入或失败的回合提供桌面通知,并带提示音。

功能

一个回合的三个时刻会在电脑上发出提示,每个时刻有自己的声音模式:

| 时刻 | 通知 | 声音 |
| 请求完成 | “DEEPSEEK FINISHED THE REQUEST” + 会话标题 | 上扬的双音提示 |
| 智能体需要用户:权限请求、提问、计划审核 | “Permission needed” / “Answer needed” / “Plan review needed” + 工具或问题 | 三声清脆提示音 |
| 请求失败 | “Error” + 失败文本 | 低沉的下行双音 |

通知是真正的 Windows 通知,会显示在其他窗口之上,并留在操作中心。点击它会把窗口带到前台。声音在页面内用 WebAudio 合成:不需要音频文件,即使关闭 Windows 通知声音也能听到提示。

输入框那一行有一个开关:喇叭图标位于附件按钮和权限标签之间(Full access 等标签在它右边)。点一下静音——喇叭旁的声波消失,喇叭上出现斜线——再点一下恢复。静音期间通知照常弹出。

智能体对此一无所知:没有注册任何面向模型的内容,插件也不会给请求增加 token。

安装

包放在运行 Desktop 应用的配置档里。在仓库根目录执行:

$dst = "$env:USERPROFILE\.dsh\profiles\desktop\node_modules\@local\desktop-notify"
New-Item -ItemType Directory -Force $dst | Out-Null
Copy-Item .\package.json, .\index.js, .\client.js, .\cordis.patch.yml, .\README.md $dst -Force
New-Item -ItemType Directory -Force "$dst\lib" | Out-Null
Copy-Item .\lib\push.js "$dst\lib" -Force

然后把依赖和 bundle 加到 ~/.dsh/profiles/desktop/package.json:

"dependencies": { "@local/desktop-notify": "1.0.0" },
"dsh": { "profile": { "bundles": ["@deepseek-ai/dsh-base", "@deepseek-ai/dsh-web-app", "@local/desktop-notify"] } }

之后重启 DeepSeek Harness。客户端插件通过 Host 启动时构建的 index 注入表到达页面,所以只刷新页面不会加载它,除非 HMR 重新组合了配置档。

设置

没有对话框:选项是页面的 localStorage 键,每次要发通知时读取。

| 键 | 默认值 | 含义 |
| dsh-notify.enabled | 1 | 通知和声音的总开关 |
| dsh-notify.sound | 1 | WebAudio 提示音;输入框的喇叭图标写入这个键 |
| dsh-notify.volume | 2 | 请求的音量,0…2;高于 1 时提示音做软限幅,而不是数字削波 |
| dsh-notify.subagents | 0 | 也通知子代理会话 |
| dsh-notify.inApp | 1 | 系统通知不可用时显示页内卡片 |
| dsh-notify.phone | 1 | 把同一条通知也发到手机 |
| dsh-notify.lang | browser | 文案语言,ru 或 en |

在窗口的 DevTools 控制台里切换:

localStorage.setItem('dsh-notify.sound', '0'); // silence, keep the toasts

接入方式

通知是无头的:插件订阅三个公开的客户端数据源,UI 上只增加合成器扬声器这一项:

- api-session/status —— running 由 true 变 false,表示一轮结束;
- api-session/error —— 会话的实时失败出口;
- uiSession.sessionStatus —— pendingInteraction 携带审批请求、问题卡片或等待回答的计划评审。

api-session/status 对子代理会话也会触发;除非打开 dsh-notify.subagents,否则跳过这些会话。失败的轮次会压制结束提示 6 秒,这样失败只播报一次,不会播报两次。

手机通知

同一条通知通过 ntfy 发到手机:安装应用,订阅一个 topic,再把 topic 写进 Host 侧配置。请求由 Host 发出,所以页面里既没有 CORS 问题,也没有第三方脚本。

// ~/.dsh/desktop-notify.json
{
"ntfy": { "server": "https://ntfy.sh", "topic": "dsh-your-random-topic" },
"phone": true
}

- topic 名是唯一的秘密:挑一个又长又随机的名字,因为知道 topic 的人都能在公共服务器上读到它。
- 扬声器静音时,手机副本也保持安静:它以 ntfy 的最低优先级发布,消息到达时不发声。
- dsh-notify.phone = 0 会停掉手机副本,桌面端照常工作。
- 配置里的 phone: false 在 Host 侧做同样的事。
- ntfy 应用可以自己静音该 topic,和任何即时通讯软件的手机端一样;桌面开关是第二道开关,不是替代品。

Token 余额

余额组件本来就持有 API key 和 CBR 汇率,所以每次刷新成功后它会发布 llm-balance.snapshot({ currency, amount, rub, at })。本插件只读取这个快照 —— 从不调用服务商 —— 并在卢布余额跌破阈值时播报一条消息:

ТОКЕНЫ ЗАКАНЧИВАЮТСЯ!!!
Баланс 42,50 ₽ — ниже 50,00 ₽

- 阈值放在 Host 配置里,所以只在一个文件里调,不用进 DevTools 控制台:~/.dsh/desktop-notify.json 里的 "balance": { "thresholdRub": 50 }。页面通过 GET /desktop-notify/config 拿到它。
- 每次跌破只发一条,不是每分钟一条:告警会锁存,直到余额回到阈值以上;持续低于阈值时,最多每 24 小时重复一次。
- 超过 15 分钟的快照会被忽略:组件已停止刷新,数字是旧的。
- localStorage 里的 dsh-notify.balanceThreshold 会覆盖 Host 的值,方便快速试验。

测试

test/harness.html 在浏览器里用打桩的服务运行插件:测试覆盖 finished、approval、question、error、子代理过滤、去重、回退卡片,以及对每个音型做一次 OfflineAudioContext 渲染(静音音型判为失败)。运行方式:

npm install undici # CDP client; or point UNDICI_PATH at an existing copy
node test/run.mjs

EDGE_PATH 覆盖 Edge 可执行文件路径,CDP_PORT 和 PORT 覆盖端口。

已知限制

- 通知属于页面:窗口关闭后就没有东西可播报。
- 从未被点击过的浏览器标签页无法启动音频;Electron 没有这条限制。
- Windows 可能在专注助手(Focus Assist)里压制 toast;这个开关归操作系统管。

插件在三种情况下向电脑发送带声音的通知:

| 何时 | 通知 | 声音 |
| 请求完成 | 「DEEPSEEK ЗАВЕРШИЛ ЗАПРОС」+ 会话名称 | 上行双音信号 |
| 需要权限 / 回答 / 确认计划 | 「Нужны права」「Нужен ответ」「Нужно подтвердить план」+ 工具或问题 | 三声高音信号 |
| 请求出错 | 「Ошибка」+ 错误文本 | 低音下行信号 |

通知是真正的系统通知(浮在窗口之上,留在 Windows 通知中心),点击后窗口会切到前台。声音直接在页面里合成,因此不受 Windows 通知声音设置影响。

输入框那一行有个带喇叭的按钮:它位于附件按钮(「+」)和权限切换器之间(Full access 等选项整体右移)。第一次点击关闭声音——喇叭右侧的声波消失,喇叭本身被划掉;再点一次恢复原样。关闭声音后通知照常送达。

手机通知

同样这三类事件会通过 ntfy 发到手机:装好应用,订阅一个 topic,再把 topic 写进 Host 侧的配置(请求由 Host 发出,所以既不需要 CORS,也不需要页面上的第三方脚本):

// ~/.dsh/desktop-notify.json
{
"ntfy": { "server": "https://ntfy.sh", "topic": "dsh-ваш-случайный-топик" },
"phone": true
}

- topic 名是唯一的秘密:在公共服务器上,任何知道它的人都能读到,所以名字要够长、够随机。
- 喇叭关闭期间,手机收到的是静音通知(ntfy 拿到最低优先级):消息在,声音没有。
- dsh-notify.phone = 0 关闭手机推送,只保留电脑端。
- 配置里的 phone: false 在 Host 侧做同样的事。
- 在 ntfy 应用里也能把 topic 静音——这是独立的开关,电脑上的按钮替代不了它。

token 余额

余额小组件本来就持有 API 密钥和央行汇率,所以每次成功刷新后它会发布 llm-balance.snapshot({ currency, amount, rub, at })。这个插件只读取快照——不访问服务商——并在卢布余额跌破阈值时播报一次:

ТОКЕНЫ ЗАКАНЧИВАЮТСЯ!!!
余额 42,50 ₽ — 低于 50,00 ₽

- 阈值在 Host 配置里设置(一个文件,不用 DevTools): ~/.dsh/desktop-notify.json 里的 "balance": { "thresholdRub": 50 };页面通过 GET /desktop-notify/config 拿到它。
- 余额跌破只发一条消息,不是每分钟都发:标志位一直保持,直到余额回到阈值以上;如果余额一直低于阈值,重复提醒最多每天一次。
- 超过 15 分钟的旧快照直接忽略:说明小组件已经停止更新。
- localStorage 里的 dsh-notify.balanceThreshold 会覆盖配置里的值。

安装

把文件复制到配置档 ~/.dsh/profiles/desktop/node_modules/@local/desktop-notify,在 ~/.dsh/profiles/desktop/package.json 的 dependencies 和 dsh.profile.bundles 里加上 @local/desktop-notify,然后重启 DeepSeek Harness。

设置

没有设置窗口 —— 页面 localStorage 里的键在每次通知时读取:dsh-notify.enabled(开/关)、dsh-notify.sound(声音)、 dsh-notify.volume(音量 0…2,默认 2 —— 高于 1 时信号会经过软限幅器)、dsh-notify.subagents (是否通知子代理)、dsh-notify.inApp(窗口内弹出卡片)、dsh-notify.lang(ru/en)。

只关掉声音:

localStorage.setItem('dsh-notify.sound', '0');
预览分享卡片长什么样 ↓Timur-Ziyangareev/desktop-notify
分享 · DeepSeek Harness Hub
Timur-Ziyangareev/desktop-notify

回合完成、需介入或失败时弹出通知并响提示音

这是你的仓库?认领条目

回到顶部