Windows 通知角标 Sutera-Diffusus/dsh-windows-notify
DeepSeek Harness任务完成或待决策时弹系统 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
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 78 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
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
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Sutera-Diffusus/dsh-windows-notify
任务完成或待决策时弹系统 Toast 并亮托盘角标
相关插件 · 市场 / 管理
插件精选列表awesome-dsh-plugin/awesome-dsh-plugin
DeepSeek Harness(dsh)插件精选列表
★ 22,025未汉化DSH
73.6
新词雷达zhuyansen/new-term-radar
new-term-radar新词雷达
★ 2,049已汉化MCP
72.8
插件生态导航0xsline/awesome-deepseek-harness
安装 贡献指南 DeepSeek Docs 公开插件目录 Issues
★ 1,188已汉化DSH
72.6
技能注册中心iflytek/skillhub
企业级开源智能体技能注册中心——发布、发现并管理组织内可复用的技能包。
★ 5,358已汉化DSH
71.9
插件市场目录imsai-sh/awesome-deepseek-harness-plugins
面向 DeepSeek Harnessdsh生态的社区插件目录,共收录 13938 个插件含 PR 收录与…
★ 350已汉化DSH
71.8
插件精选清单Anil-matcha/awesome-dsh-plugin
DeepSeek Harnessdsh精选指南——DeepSeek…
★ 1,013已汉化DSH
71.7