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

Windows 通知角标 Sutera-Diffusus/dsh-windows-notify

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

任务完成或待决策时弹系统 Toast 并亮托盘角标

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · market
装得上吗
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 78 天前
档位由哪些信号合成

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

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 65 处,展示前 45 条)
  • 读取本地文件
    lib/index.js:55
    return readFileSync(resolved, "utf8").includes(marker);
  • 读取本地文件
    lib/index.js:170
    if (!existsSync(seedPath)) return;
  • 读取本地文件
    lib/index.js:171
    let raw = readFileSync(seedPath, "utf8");
  • 删除本地文件
    lib/index.js:175
    unlinkSync(seedPath);
  • 发起网络请求
    lib/client.js:62
    const res = await fetch("/api/dsh-notify/config");
  • 发起网络请求
    lib/client.js:69
    const res = await fetch("/api/dsh-notify/config", {
  • 发起网络请求
    lib/client.js:82
    await fetch("/api/dsh-notify/preview", {
  • 读取本地文件
    lib/notify-core.js:102
    return existsSync(file) ? file : path.join(ASSETS, "dsh-notify.wav");
  • 写入本地文件
    lib/notify-core.js:122
    appendFileSync(LOG_FILE, `${new Date().toISOString()} notify ${message}\n`);
  • 读取本地文件
    lib/notify-core.js:134
    let raw = readFileSync(TRAY_STATE_FILE, "utf8");
  • 写入本地文件
    lib/notify-core.js:147
    writeFileSync(TRAY_STATE_FILE, JSON.stringify(state), "utf8");
  • 执行外部命令来自配置/变量
    lib/notify-core.js:165
    const child = spawn(POWERSHELL, [
  • 执行外部命令来自配置/变量
    lib/notify-core.js:214
    const child = spawn(POWERSHELL, [
  • 读取本地文件
    install.mjs:51
    const text = readFileSync(cfg, "utf8");
  • 读取本地文件
    install.mjs:81
    try { return lstatSync(p).isSymbolicLink(); } catch { return false; }
  • 删除本地文件
    install.mjs:89
    unlinkSync(link);
  • 读取本地文件
    install.mjs:90
    } else if (existsSync(link)) {
  • 写入本地文件
    install.mjs:93
    mkdirSync(dirname(link), { recursive: true });
  • 读取本地文件
    install.mjs:94
    if (!existsSync(target)) mkdirSync(target, { recursive: true });
  • 写入本地文件
    install.mjs:94
    if (!existsSync(target)) mkdirSync(target, { recursive: true });
  • 删除本地文件
    install.mjs:104
    unlinkSync(link);
  • 读取本地文件
    install.mjs:113
    if (existsSync(manifestPath)) return "existing";
  • 写入本地文件
    install.mjs:114
    mkdirSync(PROFILE_DIR, { recursive: true });
  • 写入本地文件
    install.mjs:124
    writeFileSync(manifestPath, JSON.stringify(manifest, void 0, 2) + "\n");
  • 读取本地文件
    install.mjs:126
    if (!existsSync(patchPath)) {
  • 写入本地文件
    install.mjs:127
    writeFileSync(patchPath, [
  • 写入本地文件
    install.mjs:137
    writeFileSync(workspacePath, "packages:\n - .\n\nnodeLinker: hoisted\nautoInstallPeers: false\n");
  • 执行外部命令来自配置/变量
    install.mjs:188
    const packed = spawnSync(npm, ["pack", `${pkg}@${LEGACY_VERSION}`, "--silent"], {
  • 执行外部命令固定命令
    install.mjs:198
    const untar = spawnSync("tar", ["-xzf", join(tmp, tgzName), "-C", extractDir], {
  • 执行外部命令来自配置/变量
    install.mjs:212
    const check = spawnSync(process.execPath, ["--check", live], { encoding: "utf8" });
  • 删除本地文件递归
    install.mjs:221
    try { rmSync(tmp, { recursive: true, force: true }); } catch { }
  • 读取本地文件
    pack.mjs:16
    const manifest = JSON.parse(readFileSync(join(PKG_DIR, "package.json"), "utf8"));
  • 写入本地文件
    pack.mjs:19
    mkdirSync(DIST, { recursive: true });
  • 执行外部命令来自配置/变量
    pack.mjs:22
    const result = spawnSync(command, args, { cwd, shell: process.platform === "win32", encoding: "utf8" });
  • 读取本地文件
    pack.mjs:36
    if (!existsSync(packed)) {
  • 删除本地文件
    pack.mjs:40
    rmSync(tgzOut, { force: true });
  • 写入本地文件
    pack.mjs:41
    renameSync(packed, tgzOut);
  • 删除本地文件
    pack.mjs:46
    rmSync(zipOut, { force: true });
  • 读取本地文件
    test.mjs:30
    check(existsSync(file), `存在 ${rel}`);
  • 执行外部命令来自配置/变量
    test.mjs:31
    const result = spawnSync(process.execPath, ["--check", file], { encoding: "utf8" });
  • 读取本地文件
    test.mjs:36
    const patch = yaml.load(readFileSync(join(ROOT, "cordis.patch.yml"), "utf8"));
  • 读取本地文件
    test.mjs:46
    const pkg = JSON.parse(readFileSync(join(ROOT, "package.json"), "utf8"));
  • 读取本地文件
    test.mjs:50
    check(typeof pkg.exports?.["./client"] === "string" && existsSync(join(ROOT, pkg.exports["./client"])), "exports ./client 指向存在的文件");
  • 读取本地文件
    test.mjs:51
    check(typeof pkg.exports?.["./cordis.patch.yml"] === "string" && existsSync(join(ROOT, pkg.exports["./cordis.patch.yml"])), "exports ./cordis.patch.ym
  • 读取本地文件
    test.mjs:58
    const ok = existsSync(file) && readFileSync(file).subarray(0, 4).toString("ascii") === "RIFF";
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-home-paths@deepseek-ai/dsh-settings@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 系统弹窗通知
  • 自定义提示音
  • 任务栏托盘角标

为 DeepSeek Harness 带来 Windows 级通知:系统弹窗、自定义提示音、任务栏托盘角标——原生 DSH 配置档插件,零补丁。

README

由 DeepSeek 最新模型翻译生成
dsh-windows-notify Windows 级提醒,随 DeepSeek Harness 而来。 面向 DeepSeek Harness 的 Windows 级通知——系统 Toast、自定义提示音,以及清爽的任务栏气泡角标(无需额外托盘图标),用于待处理决策和未读完成通知,以原生 DSH profile 插件形式安装(零补丁修改内置包)。 promo 任务完成或需要你决策时:系统 Toast + 提示音 + 任务栏托盘角标(待查看数量)。免打扰时段、跟随系统勿扰、四套自制提示音、完成合并摘要,全部可在设置页调整,保存即生效。 功能特性 / Features - 完成提醒 — 根 Agent 回合结束(running→idle)时弹 Toast;支持「仅角标」模式与 5 秒合并摘要(DSH 任务完成 ✅(N))。 - 决策提醒 — ask_user_question 提问时弹「DSH 需要你的决定 ❓」,带问题与选项列表;回答/取消后托盘角标自动 -1。 - 托盘角标 — 任务栏托盘图标右上角红色气泡 = 待回复决策 + 已完成未查看;单击托盘打开 GUI 并清零已完成;DSH 退出后托盘经端口看门狗自行退出。 - 四套提示音 — 柔和/轻快/舒缓/清脆(自制合成,零版权风险),设置页可试听;提示音可整体关闭。
展开完整文档(README 剩余 1 节)
dsh-windows-notify

Windows 级提醒,随 DeepSeek Harness 而来。 面向 DeepSeek Harness 的 Windows 级通知——系统 Toast、自定义提示音,以及清爽的任务栏气泡角标(无需额外托盘图标),用于待处理决策和未读完成通知,以原生 DSH profile 插件形式安装(零补丁修改内置包)。

promo

任务完成或需要你决策时:系统 Toast + 提示音 + 任务栏托盘角标(待查看数量)。免打扰时段、跟随系统勿扰、四套自制提示音、完成合并摘要,全部可在设置页调整,保存即生效。

功能特性 / Features

- 完成提醒 — 根 Agent 回合结束(running→idle)时弹 Toast;支持「仅角标」模式与 5 秒合并摘要(DSH 任务完成 ✅(N))。
- 决策提醒 — ask_user_question 提问时弹「DSH 需要你的决定 ❓」,带问题与选项列表;回答/取消后托盘角标自动 -1。
- 托盘角标 — 任务栏托盘图标右上角红色气泡 = 待回复决策 + 已完成未查看;单击托盘打开 GUI 并清零已完成;DSH 退出后托盘经端口看门狗自行退出。
- 四套提示音 — 柔和/轻快/舒缓/清脆(自制合成,零版权风险),设置页可试听;提示音可整体关闭。
- 打扰控制 — 免打扰时段(支持跨午夜窗口,时段内仅累计角标);跟随 Windows 专注助手/勿扰自动静音。
- 原生插件机制 — profile bundle + settings 命名空间 + webServer 路由;不修改任何内置包文件,DSH 升级后重跑安装脚本即可。

安装 / Install

方式一:源码接线(推荐,无需 pnpm)

在仓库根目录 .\install.ps1 # 等价于 node install.mjs

脚本(幂等)会:初始化 profile(缺失时按 web/headless 模板生成)→ 在 $DSH_HOME\profiles\\node_modules\dsh-windows-notify 建 junction → 把 dsh-windows-notify 写入 profile 的 dsh.profile.bundles 与 dependencies → 可选迁移旧配置。重启 DSH 生效。

常用参数:--profile (默认 web)、--dsh-home 、 --keep-legacy(从旧版 apply-patch 扩展迁移时跳过还原)、 --legacy-root (从旧版扩展迁移时指定 DSH 安装的 @deepseek-ai 目录,从 npm registry 拉取同版本官方文件还原旧补丁)。

方式二:pnpm(pnpm 用户)

dsh plugin --profile web add dsh-windows-notify

卸载 / Uninstall

.\uninstall.ps1 # 等价于 node install.mjs --uninstall

删除 junction 与 manifest 条目后重启即可;settings 里的 dsh-notify 配置保留,重装后继续有效。

配置 / Configuration

设置页「通知」区段(settings 命名空间 dsh-notify),保存即生效:

| 键 | 默认 | 说明 |
| sound | soft | soft / brisk / calm / crisp |
| soundEnabled | true | 提示音总开关 |
| quietHours.enabled / start / end | false / 22:00 / 08:00 | 免打扰时段(支持跨午夜) |
| respectSystemDnd | true | 跟随 Windows 专注助手/勿扰 |
| completeMode | toast | toast 弹窗 / badge-only 仅角标 |
| completeMerge | true | 5 秒窗口内合并完成摘要 |

环境变量:DSH_NOTIFY=0 整体禁用;DSH_NOTIFY_SOUND= 覆盖音效;DSH_NOTIFY_MIN_INTERVAL_MS 节流间隔。

架构 / How it works

- cordis.patch.yml — bundle 补丁层,向 profile 组合插入一行 dsh-notify(单包双面 dsh.bundle + dsh.client)。
- 宿主半边 lib/index.js — agent/status 事件(回合结束)→ 完成通知(过滤子代理与 goal 自动续跑);包装 userQuestions.ask() → 决策提醒 + 角标 ±1;ctx.settings.register 注册命名空间 dsh-notify(持久化到 $DSH_HOME/settings.yaml,schema 校验);webServer.register 注册 GET/POST /api/dsh-notify/config(设置页读写)与 /api/dsh-notify/preview(试听);旧 apply-patch 钩子共存守卫。
- 浏览器半边 lib/client.js — 手写 __ModuleLoader__ 工厂(零构建步骤),设置页「通知」区段经插件自有 HTTP 路由读写配置(DSH rc.6 的 apiproxy 只暴露白名单 settings 命名空间,第三方命名空间须走自有路由,详见 CHANGELOG 1.1.0)。
- 通知内核 lib/notify-core.js — Toast/托盘脚本经 Base64 JSON 载荷传递(Windows spawn 不转义参数)、PowerShell 绝对路径、不用 detached/unref、全程 best-effort。
- 脚本 — toast.ps1(WinRT Toast + SoundPlayer.PlaySync + 免打扰/系统勿扰静音)、tray.ps1(任务栏气泡角标:ITaskbarList3 原生 overlay,4x 超采样抗高 DPI 模糊;端口看门狗 + 按端口独立锁 + 窗口前台自动清未读)。

数据与隐私 / Data & privacy

- 配置存于 DSH 托管设置文档($DSH_HOME/settings.yaml 的 dsh-notify 节);
- 运行状态(托盘角标计数、调试日志)仅写本机 $DSH_HOME/dsh-windows-notify/;
- 不联网、无遥测、不读取任何凭据;仅 install.mjs --legacy-root 在还原旧补丁时从 npm registry 拉取同版本官方包;
- 插件注册两条本机 HTTP 路由:/api/dsh-notify/config(设置页读/写配置,仅同源可访问)与 /api/dsh-notify/preview(试听);不向外部发送任何数据;
- 纯 Windows:非 win32 平台所有提醒自动跳过。

已知限制 / Known limitations

- 仅提醒、不携带按钮(Windows 对未打包应用不支持 Toast 按钮激活);
- bundle 补丁不热加载,安装/升级后需重启 DSH;
- 需要 Windows 10/11(Toast 与托盘依赖 WinRT/NotifyIcon)。

开发 / Development

npm ci
node test.mjs # 语法/YAML/JSON/资产/BOM/路径泄露校验
node pack.mjs # dist/ 下生成 tgz 与 zip

要求:Node ≥ 18;PowerShell 脚本须为 UTF-8 BOM(中文文本),.bat 须纯 ASCII。CI 见 .github/workflows/(push/PR 校验 + tag 自动 Release)。

License

MIT © 2026 Sutera-Diffusus
预览分享卡片长什么样 ↓Sutera-Diffusus/dsh-windows-notify
分享 · DeepSeek Harness Hub
Sutera-Diffusus/dsh-windows-notify

任务完成或待决策时弹系统 Toast 并亮托盘角标

回到顶部