v1.0.7
会话通知
DeepSeek Harness(DSH)插件:会话需要你注意时提醒你——窗口不在前台用系统通知,窗口在前台用应用内轻弹窗。
提醒什么
| 什么时候提醒 | 通知标题 | 内容里带什么 |
|---|---|---|
| 会话从「运行中」变为「空闲」(一轮回答结束) | 会话已完成 | 会话题目 |
| 出现等待你处理的工具授权请求 | 需要授权 | 等待授权的工具名 |
| 出现等待你回答的提问,或等待你确认的计划 | 需要回答 | 提问提醒带问题原文,计划确认带会话题目 |
三类提醒可以分别开关。
每条只提醒一次:同一会话的同一轮只报一次完成,同一个待处理请求只报一次;请求消失之后再次出现,会重新提醒。
提醒送到哪里
按 DSH 窗口当时的状态选通道,你不需要预先设置:
| 窗口状态 | 怎么提醒 |
|---|---|
| 窗口不在前台 | 系统通知(Windows 通知中心 / macOS 通知中心 / Linux 通知守护)。点一下通知:窗口回到前台,并跳到那个会话 |
| 窗口在前台,但不是你正在看的那个会话 | 应用内轻弹窗:右上角浮出一张卡片,标题是提醒类型,下面一行是会话题目与细节 |
| 窗口在前台,且正是你在看的那个会话 | 不打扰(你就在看着,不需要弹) |
系统通知的气泡只存在几秒,人不在电脑前时它等于没送到,所以:
- 凡是在窗口不在前台时投递的提醒,窗口回到前台的那一刻会再用轻弹窗补发一次(同一会话同一类只留最新一条,超过 30 分钟不再补发);
- 唯一的例外:系统确认气泡已经弹出来、而且你 20 秒内就回到窗口——那条气泡还在屏幕上,就不再重复;
- 补发不受「正在看的会话不打扰」限制——这条提醒发生的时候你并不在看;
- 点掉系统通知本身就会取消对应的补发;
- 插件页「最近一次投递」会写清系统到底有没有确认显示(
系统已确认弹出/系统没有回报/没弹出来)。
轻弹窗的用法:
- 点「查看」跳到该会话;
- 6 秒后自动消失;鼠标停在上面期间不消失,移开后重新计时;
- 按
Esc关掉最新的一条,或点 ✕ 关掉这一条; - 同屏最多叠 3 条,更早的会被挤掉。
设置
插件 → 会话通知:
| 分组 | 内容 |
|---|---|
| 提醒内容 | 完成 / 授权 / 提问 三个开关,分别控制三类提醒,默认全开;开关保存在浏览器本地,重开页面、重装插件都保留 |
| 系统通知权限 | 当前权限状态;尚未授权时点「允许通知」请求授权(浏览器要求必须由你手动点击),授权成功后会自动发一条测试提醒。权限被系统层关闭时,会按当前平台告诉你去哪里打开 |
| 运行状态 | 窗口现在是前台还是后台(即会走哪条通道)、插件是否真的在读会话状态、最近一次提醒走的通道、系统是否确认弹出、时间(本机时间),以及还有几条提醒在等你回到窗口时补发;旁边「测试提醒」按钮发一条测试提醒 |
- 已经授权时,权限行的按钮变成「测试系统通知」:它直接走系统通知通道(窗口在前台也照发),专门用来验证系统通知本身是否可用。
- 开关只影响提醒,不改 DSH 本身的任何设置。
安装
从 Git 仓库安装(推荐)
在 DSH 的 插件 → 添加插件 的上方输入框里填:
https://gitea.iwake.top/dsh-plugin/session-notify.git#v1.0.7
# 后面跟标签或提交,用来锁定版本;不写则取默认分支。跟随 1.x 最新版可以写 #semver:^1.0.7。仓库是公开的,不需要凭据,也不用改「安装源」。
本地路径安装
把仓库克隆或下载到本机,在同一个输入框里填包目录的绝对路径,例如:
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。
维护者命令:
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
Languages
JavaScript
100%