Overview
dsh-notify-me
README / EN
Package documentation
Registry summary
dsh.pub verifies the pinned bundle contract, runtime facts, and distribution semantics. The complete README remains in the source repository.
Read the full README on GitHubLIMITATIONS
Known limitations
**运行前提** - 默认只在页面开着时提醒(后台标签 / 最小化可以,关标签页即失效——浏览器层方案固有限制)。开启宿主侧兜底后,页面关闭仍能收到**外部推送**:它要 profile 里 `hostFallback.enabled: true`、`gateway.target`(或 `hostFallback.target`)与一个 0600 凭据文件,而且宿主进程自己在跑。 - 通知经由浏览器弹出,需允许浏览器通知权限;每次页面加载后第一次出声 / 弹通知前要先在页面上点过一下;未授权时只剩提示音与标题标记。 - 系统通知横幅只画在主屏:Windows 没有设置项、Chromium 没有 API 能把它指到别的显示器(多屏时副屏收不到)。要跨屏只能靠外部推送转到手机(1.12.0 起页面里不再画审批卡片)。 - 配置存在浏览器 `localStorage`:换浏览器 / 设备或清除站点数据后回到默认值(设置页可一键恢复默认)。 **平台差异** - 快捷裁决按钮要 Service Worker:`http://127.0.0.1`、`https` 可用,`http://192.168.x.x` 这类局域网地址不行;**桌面端(`dsh-app://`)已实测无法注册 Service Worker**(宿主未开放 `allowServiceWorkers` 特权),审批通知退回无按钮样式。宿主不渲染通知按钮时,`debug()` 的 `bridge` 字段会说明原因,其余功能不受影响。 - Windows 的系统通知标签上限 64 字符,而 Chromium 交给平台的是 `n#<origin>#<tag>` 整串——桌面页面 `dsh-app://app` 一项就占去 16 个。插件按当前 `location.origin` 算剩余预算,超长时保留可读前缀、尾部换成短哈希,所以 `debug()` 里看到的标签可能被截短;平台仍然拒发时,原文记在 `debug().lastToastReject`,设置页的测试按钮也会如实报出来,不再「提示已发送但什么都没弹」。 - 桌面端(Windows)点通知后窗口仍可能抬不起来:目标窗口属于更高完整性级别(提权 / UAC)、在另一个虚拟桌面、前台被别的进程反复抢回去,或窗口被 `SW_HIDE` 隐藏到托盘时,宿主脚本回 `FOCUSED=0`、路由回 `202`,对话照常切(详见[桌面端怎么抬窗的](#桌面端怎么抬窗的))。 - 桌面端(macOS / Linux)点通知依赖 `dsh://open` 深链:系统未注册 `x-scheme-handler/dsh`、或壳没有 `second-instance` / `open-url` 处理时抬不起来;Linux 上已实测正常,macOS 未实测。 - macOS:提醒、提示音、标题标记、点通知跳转都没有平台假设,照常工作;但 DSH Desktop(Electron)的系统通知要求应用已签名,未签名的通知直接发不出去,官方 macOS 版是否满足这一前提未实测;审批按钮在 macOS 桌面宿主上的渲染同样未实测(Windows 桌面端已实测不渲染)。 **提醒内容与时机** - `≥ 0.1.6`(含 `0.2.0-rc.2`、`0.2.1-rc.2`)的「回复完成」提醒正文只有会话名,不再附带回复摘要——宿主快照已不再提供 `nodes`;提醒本身照常触发。 - 标题标记由宿主与插件共同写 `document.title`:宿主重算标题时标记可能被覆盖,直到下一次提醒事件重新写成。 - 「当前对话不弹通知」按「窗口是否在前台」判定:被别的应用盖住、切到别的应用、最小化都算后台;回到前台或重新有键鼠输入后恢复静默。 - 按对话静音的标记注在宿主的 `sidebar.session.row.leading` 槽位,而宿主在「这条会话有运行状态」时用状态点占着这个位置,标记就不渲染——正在跑的后台任务看不到划掉的铃铛,停下后自动回来;静音本身不受影响。 **外部推送** - 受浏览器跨域(CORS)限制:端点不放行时自动降级为「送出但不可确认」(no-cors),如实标为「已送出不可确认」;Discord、飞书、Server酱、WxPusher 放行跨域,可直接确认送达。钉钉不放行任何 CORS 头、又只收 `application/json`,页面发不出去,所以没有做成目标类型(自建中转 + 自定义目标才行)。临时失败(网络中断、5xx、429)按退避重试,重试仍失败进失败记录,其余错误立即停、不重试;转发在本地提醒决定要发之后才触发,所以被静音的提醒也不会外发。 - 同源中继补上的只是「页面够不到要认证的网关」这一类:页面 POST 到同源路由,宿主补凭据并回传网关的真实状态码。仍然成立的边界有几条——中继与宿主侧兜底都要求宿主进程在运行(`dsh web` 或桌面端主进程),它们不是独立守护进程,宿主退出就都停;宿主跑在代理环境里时网关域名要进 `no_proxy`,否则投递会绕到代理出去;兜底只补外部推送,本地系统通知、提示音、标题标记与审批按钮仍要页面在;`pageLeaseMs: 0` 是调试开关,页面开着也会收到两份;中继路由路径等同于口令,别让它出现在公开记录里。 **设置页图标补丁** - 左侧导航行图标靠 DOM 补丁:外壳按分区 id 硬编码图标且 `settings.section` 没有图标字段,插件只能在面板渲染后把那一行的 `<svg>` 换成铃铛。命中依赖宿主当前的面板结构(`data-shortcut-modal="settings"` + 导航按钮里的标签 `<span>`),DSH 改了这套结构就会静默回落到默认齿轮,其余功能不受影响。标志与命名的取舍见 [docs/brand/README.md](docs/brand/README.md)。
