# 会话通知 DeepSeek Harness(DSH)插件:会话**需要你注意**时提醒你——窗口不在前台用**系统通知**,窗口在前台用**应用内轻弹窗**。 ## 提醒什么 | 什么时候提醒 | 通知标题 | 内容里带什么 | | --- | --- | --- | | 会话从「运行中」变为「空闲」(一轮回答结束) | 会话已完成 | 会话题目 | | 出现等待你处理的工具授权请求 | 需要授权 | 等待授权的工具名 | | 出现等待你回答的提问,或等待你确认的计划 | 需要回答 | 提问提醒带问题原文,计划确认带会话题目 | 三类提醒可以分别开关。 每条只提醒一次:同一会话的同一轮只报一次完成,同一个待处理请求只报一次;请求消失之后再次出现,会重新提醒。 ## 提醒送到哪里 按 DSH 窗口**当时**的状态选通道,你不需要预先设置: | 窗口状态 | 怎么提醒 | | --- | --- | | 窗口**不在前台** | **系统通知**(Windows 通知中心 / macOS 通知中心 / Linux 通知守护)。点一下通知:窗口回到前台,并跳到那个会话 | | 窗口在**前台**,但不是你正在看的那个会话 | **应用内轻弹窗**:右上角浮出一张卡片,标题是提醒类型,下面一行是会话题目与细节 | | 窗口在**前台**,且正是你**在看的**那个会话 | 不打扰(你就在看着,不需要弹) | 系统通知的气泡只存在几秒,**人不在电脑前时它等于没送到**,所以: - 凡是在窗口不在前台时投递的提醒,**窗口回到前台的那一刻会再用轻弹窗补发一次**(同一会话同一类只留最新一条,超过 30 分钟不再补发); - 唯一的例外:系统确认气泡已经弹出来、而且你 20 秒内就回到窗口——那条气泡还在屏幕上,就不再重复; - 补发不受「正在看的会话不打扰」限制——这条提醒发生的时候你并不在看; - 点掉系统通知本身就会取消对应的补发; - 插件页「最近一次投递」会写清系统到底有没有确认显示(`系统已确认弹出` / `系统没有回报` / `没弹出来`)。 轻弹窗的用法: - 点「查看」跳到该会话; - 6 秒后自动消失;鼠标停在上面期间不消失,移开后重新计时; - 按 `Esc` 关掉最新的一条,或点 ✕ 关掉这一条; - 同屏最多叠 3 条,更早的会被挤掉。 ## 设置 **插件 → 会话通知**: | 分组 | 内容 | | --- | --- | | 提醒内容 | **完成 / 授权 / 提问** 三个开关,分别控制三类提醒,默认全开;开关保存在浏览器本地,重开页面、重装插件都保留 | | 系统通知权限 | 当前权限状态;尚未授权时点「允许通知」请求授权(浏览器要求必须由你手动点击),授权成功后会自动发一条测试提醒。权限被系统层关闭时,会按当前平台告诉你去哪里打开 | | 运行状态 | 窗口现在是前台还是后台(即会走哪条通道)、插件是否真的在读会话状态、**最近一次提醒走的通道、系统是否确认弹出、时间**(本机时间),以及还有几条提醒在等你回到窗口时补发;旁边「测试提醒」按钮发一条测试提醒 | - 已经授权时,权限行的按钮变成「测试系统通知」:它直接走系统通知通道(窗口在前台也照发),专门用来验证系统通知本身是否可用。 - 开关只影响提醒,不改 DSH 本身的任何设置。 ## 安装 ### 从 Git 仓库安装(推荐) 在 DSH 的 **插件 → 添加插件** 的上方输入框里填: ```text https://gitea.iwake.top/dsh-plugin/session-notify.git#v1.0.7 ``` `#` 后面跟标签或提交,用来锁定版本;不写则取默认分支。跟随 1.x 最新版可以写 `#semver:^1.0.7`。仓库是公开的,不需要凭据,也不用改「安装源」。 ### 本地路径安装 把仓库克隆或下载到本机,在同一个输入框里填包目录的绝对路径,例如: ```text D:\DeepSeek Harness Plugins\dsh-session-notify ``` ### 安装之后 - 装好**刷新页面**即生效;仓库里已经带好构建产物,所以**既不需要 pnpm 下载,也不需要构建**,本插件运行时没有第三方依赖。 - 卸载:在插件页里移除 `@dsh-plugin/session-notify`。 - 上面这两条说的都是**使用者**。要改插件本身,只需要一个 `pnpm install`(唯一依赖是打包用的 esbuild),见下面的[仓库结构](#仓库结构)。 ## 提醒规则 - **只在「运行中 → 空闲」的转变上提醒**:打开应用时已经在跑的会话只建立基线,不补发;历史里早已结束的会话不会被翻出来提醒。 - **正在看的那个会话完成后不打扰**。 - **子智能体的会话不单独提醒**,等它归属的主会话结束时才提醒。 - **空白会话完成不提醒**。 - **授权 / 提问如果出现的当下会话仍在运行,会先记下、等这一轮真正停下来再提醒**,不在模型还在跑的时候打扰你。 - **节流**:1.5 秒内只投递一条,多个会话同时完成不会刷屏。 - **完成提醒有 400ms 的确认窗口**:如果那一轮马上又跑起来,就不报了。 - **同一会话的完成提醒会覆盖上一条**(通知带 `tag`),不叠加堆积。 - **窗口不在前台时投递过的提醒,回到前台会补发一次轻弹窗**(30 分钟内有效)。 - 提醒只在 DSH 运行、页面打开时产生:**DSH 完全退出期间结束的会话不会再补发通知**。 ## 平台 - Windows / macOS / Linux 都支持,三个平台走同一条通知通道,行为一致;应用内轻弹窗与平台无关。 - 当前环境不支持系统通知时(权限一行会显示「不可用」),提醒仍然以应用内轻弹窗的形式送达。 - 系统通知被拒绝或发送失败时,插件会改用轻弹窗,并把原因写在插件页的权限 / 状态那一段,不会静默失败。 ## 兼容性 需要 **DeepSeek Harness 0.2.0-rc.2 或更高**。 ## 仓库结构 给要改这个插件本身的人;只是使用它的话,这一节不需要看。 | 路径 | 是什么 | | --- | --- | | `src/client/` | 浏览器半的全部源码:`core/`(观察、投递、系统通知通道、补发、弹窗栈、开关与动作)、`ui/`(弹窗、开关行、插件页、观察器、图标、样式、hooks)、`i18n/`(中英文字典与翻译器)、`platform.js`(窗口可见性、通知权限、图标、平台提示)、`plugin.js`(组合根:建 store、装配模块、注册 slot) | | `client.js` | **构建产物**:`src/client/**` 打包成一个自包含单文件,由 DSH 的客户端模块系统加载。它提交进仓库——这正是安装免构建的原因 | | `index.js` / `main.js` | 宿主半(目前是空壳),以及给按 `main` 解析的加载器用的同义入口 | | `cordis.patch.yml`、`icon.svg`、`locale/` | 组合包 patch、图标、插件展示用的标题与简介 | | `scripts/build-client.mjs` | 构建脚本:打包,并校验产物仍然满足注册契约 | | `tests/` | `node --test`:纯函数单测、组件渲染测试(含轻弹窗与插件页)、产物冒烟、以及产物与源码是否一致 | **为什么必须是单个文件**:DSH 的客户端模块系统只把**一个自包含 bundle** 交给插件(`window.__ModuleLoader__.load({ id, factory })`),factory 里的 `require` 只能解析 `react` 这类平台模块,**不能** require 同一个包里的相对文件。所以源码拆成模块之后,必须再打包回单文件——官方客户端插件(例如 `dsh-experimental-client-ui-voice-input`)也是这个形态:`src/**` 源码 + 构建出的客户端 bundle。 维护者命令: ```bash pnpm install # 只装 esbuild 一个 devDependency pnpm run build # 从 src/client 重新生成 client.js —— 改完源码必须跑 pnpm test # node --test ``` - **不要直接改 `client.js`**:它每次构建都会被覆盖;改完 `src/` 忘记重新构建,`tests/bundle.test.js` 会直接报「产物已过期」。 - 改完产物后,正在运行的 DSH 里要在插件页把这一行**停用再启用**(或重启 DSH):宿主对客户端 bundle 有缓存,只刷新页面不一定重新读取它。 ## License [MIT](LICENSE)