dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
通知提醒 / 消息提醒 / 消息通知 / 桌面通知弹窗 / 桌面提醒 / 弹窗通知、弹窗提醒 / 任务提醒、任务完成提醒 / 后台提醒、回复完成提醒 / 审批提醒:模型需要你操作(审批、方案确认、提问)或任务、回复跑完时,弹出系统通知(可操作提醒、审批通知、完成通知)与提示音,并标记标签页标题;这是一款 DSH 通知提醒插件、DSH 提醒插件、消息通知插件,设置页可开关提醒、调音量、切换中英文通知语言。
离开 DSH 页面,也能及时知道何时需要回来。
简体中文 | English
安装 · 效果预览 · 配置 · 兼容性 · 更新日志
DSH Web / Desktop 的通知插件,让你敢不开完整访问,也不必一直守着页面。
页面或桌面应用需保持运行,后台 / 最小化可以。系统通知需要通知权限。审批按钮靠 Service Worker 才能进通知:Web 端(http://127.0.0.1或https)有,桌面端dsh-app://页面注册不了,通知上没有按钮,点通知回到对话里裁决。
🔎 想找这个插件?可以搜:dsh-notify-me、消息提醒、可操作提醒、桌面通知、需要你操作、回复完成提醒、后台完成提醒、外部通知、安卓推送、Discord / Bark / Gotify / 飞书 / Server酱 / WxPusher 推送(npm 关键词已含以上中英文词)。*普通通知示例 · Windows / Edge · 不含审批按钮。* 查看原图
展开设置界面预览
只截插件自己的面板(真实组件,与宿主同款深色主题),不带 DSH 左侧导航栏;每行说明在鼠标停在标题文字上时才出现,所以这里只看到标题。
已安装 DSH CLI 的用户,在终端执行:
# 安装并自动挂载进 web profile
dsh plugin --profile web add dsh-notify-me重启 dsh web,然后硬刷新页面(Ctrl+Shift+R)。如果你使用其他 Web profile,请把命令中的 web 换成实际名称。
dsh-notify-me,按应用提示完成安装,并确认插件已启用。桌面端的 desktop profile 由 Electron 应用管理;不要把上面的 Web 命令改成 --profile desktop,CLI 会拒绝此操作。安装到 Web profile 也不会自动安装到桌面端。
Web 用户可再测审批按钮,通知上会带「同意 / 拒绝」。桌面端拿不到 Service Worker,这条测试只发一条普通通知;真实审批的提醒同理——只弹通知,点它回到对话里裁决。
控制台验证(可选) — 支持 DevTools 的环境也可执行:
window.__dshNotifyMe.test("done") // 「完成」示例
window.__dshNotifyMe.test("attention") // 「需要你」示例
window.__dshNotifyMe.test("approval") // 桥可用时带「同意 / 拒绝」按钮;否则只发普通通知(桌面端即如此)
window.__dshNotifyMe.debug() // 桥接状态看 bridge 字段,active = 按钮可用没有测试通知时,先检查:通知权限是否被拒绝(在页面上点一下 → 选「允许」;或地址栏锁 → 站点设置 → 通知 → 允许 → 刷新)、装完没重启 DSH、系统设置里浏览器通知被关。
dsh-notify-me 把「监督」和「守在屏幕前」解耦:只在真的出现决策点(审批 / 方案确认 / 提问)或回复跑完时,才用系统通知把你叫回来——让你敢不开完整访问,不必靠放弃拦截能力来换效率。它不降低 full access 本身的权限风险(它不是沙箱),只是减少 ask 模式下因错过审批而产生的等待。
事件 · 默认行为 🔔 需要你操作 · 页面可见也提醒;当前对话只留标题标记 ✅ 回复完成 · 页面隐藏 / 后台时提醒(可选「仅当前对话静默」或「总是提醒」)
需要你操作包括审批请求、方案待确认(plan review)和提问(ask_user_question)。审批带「同意 / 拒绝」的按钮只在 Web 端有(需要 Service Worker);桌面端注册不了,通知上没有按钮,点通知回到对话里裁决。
回复完成也覆盖后台会话;完成但还没看时,标题带 ✅ 回复完成 · 标记,打开对应会话即撤。标题标记不受提醒策略限制。
后台子代理(subagent)子会话的等待与完成默认不提醒:DSH 把每个子代理子会话列成独立会话,但它们是所属主对话那一轮里的步骤,提醒只会是噪音。你当前打开的那个子代理会话不算在内,照常提醒。设置页「子代理会话不提醒」可关掉这个静音。
打开 设置 → 通知提醒。页面按「提醒方式 → 什么时候提醒 → 试一试」三段排开,不常改的收进底部「高级设置」,点一下展开。每行只写标题,具体说明在鼠标停在标题文字上时弹出的小方框里(只有标题本身触发布局,整行空白处不会弹;触屏或键盘操作时留一份隐藏文本给读屏)。带 ▸ 的行点一下展开子项。
dsh-app:// 注册不了 Service Worker,通知上没有按钮,点通知回到对话里裁决。设置页「试一试」下面那行会如实说明当前环境能不能给按钮。idleMinutes: 0 退回只看窗口;debug().raiseLast 里;多个标签页同时开着时只调起一个(优先当前可见的那个);关掉后点通知不做任何事。三个按钮分别发一条「需要你」「回复完成」「审批按钮」测试提醒,用当前设置立即发,不受「什么时候提醒」里的开关限制;下方一行如实说明当前哪种渠道能给审批按钮。
设置页底部常显插件版本号(dsh-notify-me v…)——报障、核对是否装上新版本时直接照抄这一行。
默认收起,点一下展开。里面收着三块不常改的东西:音效来源、外部推送、运行环境与诊断——分别见下面三节。
「需要你」与「回复完成」可独立选择内置合成音、自定义音频或系统通知音。
自定义音频、试听与回落规则
默认关闭。支持 Discord Webhook / Bark / Gotify / 飞书群机器人 / Server酱(Turbo 与 Server酱³)/ WxPusher / 自定义 Webhook;提醒正文会发往你填写的地址,只使用可信端点。
目标地址、转发开关、发送测试与失败记录
https://api.day.app/;Gotify 填 https:///message?token=;飞书填群机器人 Webhook,可选填签名校验密钥;Server酱 填 …/send/.send 完整地址;WxPusher 填 appToken 与接收者 UID;自定义端点收一条 POST JSON:{source, event, title, body, text, sessionId, time});「转发「需要你」」「转发「回复完成」」各自独立开关;发送测试通知往所有目标发一条测试消息(不受这两类开关限制,也不会冒充真提醒)。转发跟本地提醒走同一套触发规则(「当前对话不弹通知」等开关同样管它);提醒正文会原样发往你填的地址,只填你自己信任的端点;X-DSH-Notify-Signature(对请求体做 HMAC-SHA256,sha256=);飞书填了签名密钥时按官方算法在请求体里带 timestamp / sign;{{title}} {{body}} {{event}} {{time}} {{session}},留空默认是「标题 + 换行 + 正文」;application/json——浏览器页面既读不到响应,也无法发出符合要求的请求(no-cors 下 Content-Type 会被限制成 safelisted 类型)。要用钉钉,请在自己能控制的机器上搭一个中转,再把「自定义 Webhook」指向它。在「高级设置」最后一块。默认自动识别当前是 Web 端还是桌面端(DSH Desktop,dsh-app://);识别不准时可手动指定——桌面端点通知走宿主路由做原生抬窗(见桌面端怎么抬窗的)、通知上不带快捷裁决按钮;Web 端走 window.focus() 与 Service Worker 桥。手动覆盖与自动识别不一致时,设置页会明示检测结果。
通知语言、桌面端抬窗与恢复默认
🔔 … 标题标记使用的语言;window.focus() 在 Electron 里抬不动原生窗口,1.14.0 起由页面 POST 到宿主路由 /__dsh-notify-me/focus-window、宿主跑一次 PowerShell 做原生激活——窗口最小化、被别的窗口盖住都实测能抬回来(详见下一节);左侧导航行的图标由 DSH 设置外壳统一渲染:外壳按分区 id 硬编码(只认 account / models / agent-presets / plugins / archived-sessions),其他分区一律给默认齿轮,settings.section 也没有图标字段。插件的做法是在设置面板渲染后替换那一行:按本地化标签文本找到自己的入口,把宿主的 `` 换成品牌铃铛(保留宿主给的 icon class),并用 MutationObserver 跟随重渲染;宿主改结构时会自动放弃、回落到齿轮。需要浏览器通知权限:页面上点一下 → 允许;或地址栏锁 → 站点设置 → 通知 → 允许 → 刷新。macOS 还要在 系统设置 → 通知 里允许该浏览器。
🔔 需要你 · … / 🔔 Action needed · …;后台会话完成但还没看时出现 ✅ 回复完成 · … / ✅ Reply finished · …,打开对应会话(或它再次开跑)即消失。两种标记可同时出现,「需要你」在前;宿主改写标题后标记基于新标题重建本插件是浏览器层实现:DSH 页面需保持打开(最小化/后台即可——那正是它监听的「离开」状态)。
逐版本适配记录见 package.json 的 dsh.compatibility.dshReleases。当前宿主(0.2.1-rc.2)的安装门控只读 peerDependencies 与 engines,不再读取这个字段,所以它现在只是一份给人看的记录,不构成门禁。
实测真正激活(各自独立 profile 启动:插件条目进启动页 __DSH_BOOT__ 且注入依赖解析通过、/plugins/??dsh-notify-me/client.js&rev=… 返回含新代码的构建,设置里出现「通知提醒」分区,即插件的 apply 确实执行)于 0.1.2-rc.1、0.1.5-rc.1、0.1.5-rc.2 与 0.2.0-rc.2;更早的 0.1.1-rc.2 亦验证过。
0.2.1-rc.2(当前 latest)另跑了一轮隔离验证:隔离 DSH_HOME 起 dsh web(70 个启动条目),插件条目排在第 59、application 批,三个注入目标都在且都排在它前面;/plugins/??dsh-notify-me/client.js&rev=… 返回当时装的 1.7.0 源码构建(140,153 B);无头 Chromium 载入页面后 apply 正常执行,window.__dshNotifyMe.debug() 报 uiSession: bound、uiSessionSource: sessionStatus、bridge: active。宿主侧的形状与 0.2.0-rc.2 一致,没有需要改代码的地方。
宿主代际与适配排查细节
插件按宿主代际自动选源;下表是各形状的边界,不是门禁:
宿主代际 · 「需要你」交互来源 · 判断当前会话 · 点通知切会话 ≤ 0.1.2-alpha.1 · 控制器快照的 pending[] · 快照 current · sessions.open() 0.1.2-alpha.2 .. 0.1.6-alpha.1 · uiSession.pendingInteractions · 快照 current · sessions.open() ≥ 0.1.6-alpha.2(含 0.2.0-rc.2、0.2.1-rc.2) · uiSession.sessionStatus · retainedBy.mainView · uiWorkspace.openSession()
区间仅作示意:插件按 store 形状自动选源(sessionStatus 存在即走新路),版本号只是各形状的出现边界。package.json 的 peerDependencies 范围决定 npm 的 peer 提示——0.2.1-rc.2 已落在 >=0.2.0-rc.1 <0.3.0-0 里,不需要豁免;dshReleases 只是存档,真实兼容性以逐版实测为准,未实测的新版本由形状驱动兜底。
两个坑值得记住:一是 dsh.client.inject 里列了新版运行时已不再提供的包,客户端条目会停在 pending (waiting for services: …) 而永不执行——1.1.3 在 0.1.2-rc.1 及以后正是这样失效的;二是宿主换存储/字段名时不会报错,提醒只会静默失效——0.2.0-rc.2 上 pendingInteractions→sessionStatus、list.current→retainedBy.mainView、sessions.open()→uiWorkspace.openSession() 都是这一类,所以每次适配都要用 window.__dshNotifyMe.debug() 确认真的是 bound、以及用的是哪个来源。0.2.1-rc.2 这两处都没有再变:sessionStatus 仍是 {running, pendingInteraction, completionUnread} 的 Map,uiWorkspace.openSession(id) 照旧,会话列表里仍然没有 current。
1.9.0 的界面重排没有放宽也没有收紧这个范围:设置页是纯 React 渲染 + 既有 CSS 变量(每个色值都带 fallback),没有引入任何新的宿主 API;提醒、标题标记、抬窗仍走 1.7 / 1.8 那几条路径。0.1.1-rc.2 到 0.2.1-rc.2 的插件条目照旧兼容,换回旧宿主也不需要改配置。新增的只有界面元素——设置页页眉的铃铛是插件自己画的 SVG(docs/brand/),与宿主无关。
设置页是第一入口;想脚本化/批量改或恢复默认时,偏好存 localStorage(dshNotifyMe.config),可用控制台实时调整:
展开控制台 API 与存储说明
window.__dshNotifyMe.config // 查看
window.__dshNotifyMe.setConfig({
enabled: true, // false = 关闭所有提醒(主开关)
language: "auto", // 'auto' 跟随界面 | 'zh' 简体中文 | 'en' English
attentionHiddenOnly: false, // true = 页面可见时「需要你」不提醒
currentHiddenOnly: true, // true = 当前对话的等待只留标题标记(人离开后补发)
donePolicy: "background", // 「回复完成」策略:'background' 仅后台 | 'smart' 仅当前对话静默 | 'always' 总是提醒
idleMinutes: 3, // 超过多少分钟没有键鼠输入算「离开」(0 = 关掉闲置判定)
autoDismiss: "present", // 通知自动消失:'present' 离开时保留 | 'always' 总是关闭 | 'never' 从不关闭
ignoreSubagent: true, // true = 后台子代理(subagent)会话不提醒(当前打开的照常)
sound: true, // 提示音开关(含「系统通知音」模式)
soundDone: "synth", // 「完成」音效来源:'synth' 内置 | 'custom' 自定义文件 | 'system' 系统通知音
soundAttention: "synth", // 「需要你」音效来源,取值同上
volume: 0.5, // 音量 0~1
autoFocus: true, // 点通知回到提醒所属的对话
quickActions: true, // 审批通知上的「同意 / 拒绝」按钮
externalEnabled: false, // 外部通知转发主开关(默认关:不填端点就什么都不发)
externalAttention: true, // 转发「需要你」(触发规则跟本地提醒完全一致)
externalDone: true, // 转发「回复完成」
externalRetryDelays: [2000, 6000], // 可重试失败的退避间隔(毫秒,带抖动;[] = 只发一次)
externalTargets: [] // 推送目标,见下方字段说明
})
// 目标的形状:{id, type, url, secret?, token?, uid?, template?, enabled?}
// type: 'discord' | 'bark' | 'gotify' | 'feishu' | 'serverchan' | 'wxpusher' | 'custom'
// token/uid 只用于 wxpusher(url 固定为官方端点);secret 用于飞书签名与自定义 HMAC 签名;
// template 可选,占位符 {{title}} {{body}} {{event}} {{time}} {{session}};enabled:false 单独停用该目标
window.__dshNotifyMe.resetConfig() // 恢复默认(同时清掉已选的自定义音效文件)
window.__dshNotifyMe.decide("approval:3", "allowed-once") // 程序化裁决:"allowed-once" | "rejected"
window.__dshNotifyMe.testExternal() // 显式外发测试:向有效目标发送,返回 {sent, unverified, failed, statuses}外部通知测试的开关边界:设置页「发送测试通知」要求「启用提醒」与「外部通知」主开关开启,但忽略两类提醒的转发开关。控制台testExternal()是显式测试调用:只要配置了有效目标,即使上述主开关关闭,也会向这些目标发送测试消息;没有有效目标则不发送。普通的test("done")/test("attention")/test("approval")只测试本地提醒,不外发。
自定义音效文件不在dshNotifyMe.config里,而是按类别各存一个键(dshNotifyMe.sound.done/dshNotifyMe.sound.attention,内容是{name, size, data}的 data URL)——一个文件转成 data URL 会膨胀约 1.37 倍,塞进配置会拖慢每次读取。resetConfig()会连这两个键一起清掉。
想确认当前生效的来源,看window.__dshNotifyMe.debug()的soundDone/soundAttention与customSoundDone/customSoundAttention。