TelosmaYLX/dsh-session-notify ↗★ 2

@telosmaylx/dsh-session-notify

提供会话完成提醒与自定义设置面板 在会话结束时推送系统通知和提示音,适合需要实时掌握长文本生成或复杂任务完成状态的用户。

套件
@telosmaylx/dsh-session-notify
相容性
待驗證
版本
0.1.22
授權
MIT
最近更新
2026年9月20日

安裝

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:TelosmaYLX/dsh-session-notify

配置

绝大多数配置在 DSH Web UI → 设置 → 插件 → 会话完成提醒 面板完成(保存后点「点击刷新」生效)。仅「触发原因白名单」在宿主 cordis.patch.yml 的 config 中配置(跳过子代理在面板中以复选框控制)。

设置面板

面板在官方「设置 → 插件」面板中注册(settings.plugin.item keyed slot,key = session-complete-notify),样式逐值复刻原生插件卡片(12px 圆角、展开收起、旋转 chevron、footer 状态位 + 弃置 ghost + 主色保存按钮):

区域内容
预设下拉选择内置或自定义预设;「新增」把当前配置另存为自定义预设;当前预设可「删除」
语言5 种语言单选,切换即时重渲染整个面板
失焦时四选一:不通知(该时机完全静默)/ 双通道(系统通知 + 页内提示,默认)/ 仅系统通知 / 仅页内提示 —— 窗口失焦(切走标签页、最小化、点到别处)时生效
聚焦时四选一:同上(默认双通道)—— 窗口聚焦时生效。两路互相独立,可自由组合成「失焦系统通知 + 聚焦不通知」等搭配
音频折叠区(默认展开,点折叠头的 ▾ 可收起):提示音的音量与时长。展开后是**「音量」+ 滑块同一行**(「音量」二字在滑块前面,滑块右侧显示百分比与「试听 / 停止」按钮:0~100%,内存 0~1,默认 60%;试听按当前音量播放——拖完滑块点一下就能听出效果,播放中按钮变「停止」,再点一次即停,未设置任何提示音时按钮禁用)与**「时长」行**(同一行顺序:标签 → 滑块 → 数值框 → 秒;滑块量程 0~15 秒、步长 0.1 秒,拖动即改,也可直接在数值框里输入任意秒数;默认 0 = 不限制,设为 N 秒后音频到点仍未播完 → 0.5 秒音量淡出后停止,音频本身比上限短时自然播完;只影响播放,上传的音频原样保存、不截断)。两项写入设置文档的 volume / maxDuration
通知图片大图两种来源:按原因上传——在模板中通过「+ 插入信息 → 图片」插入 {image} 标签并选择本地图片(编辑器内显示为带缩略图的标签,自动压缩至 512px 宽、按通知显示比例 16:9 居中裁切,随各原因独立保存);全局大图/图标——两张上传卡片并排一行(图标在前,空态 = 圆角矩形 + 号,点击上传;大图 512×288(16:9 居中裁切)、图标 128×128(1:1 方形居中裁切);已上传则卡片显示缩略图,点击缩略图可全屏查看完整原图(等比未裁切),右上角 × 删除)。图标留空用站点默认图标,也可在模板中插入 {icon} 标签按原因指定图标(优先于全局)。仅系统通知通道生效(页内 toast 为文字卡片),「发送」测试按钮同样生效
标题折叠区(默认收起,点击展开):全局推送标题(所有原因共用,Chip 编辑器——点「+ 插入信息」插入的信息以胶囊标签形式显示,点击胶囊移除;占位提示「通用推送标题,留空时则使用默认标题,优先级低于下方自定义标题」(不可选中/删除);通知发送时标题里的信息位(用时/消耗/错误/缓存命中/速度)会替换为实际值,不再显示代码;留空时各原因用默认标题——完成=任务已完成、出错=任务出错、中止=任务已中止、阻塞=任务被阻塞、上限=任务达到上限、提问=AI 正在向你提问)+ 按原因定制标题(6 条原因各自输入,每行带「+」插入按钮——可插入信息标签(含「提问」,不含图片/图标),插入到光标处;优先于全局标题,留空 = 用全局或语言默认标题)
内容折叠区(默认收起,点击展开);展开后每条结束原因(完成、出错、中止、阻塞、上限、提问)一行式布局(原因标签 + Chip 编辑器 + 「+」插入按钮——菜单展开时变「−」+ 发送箭头按钮,按钮为矩形、垂直居中):空模板(默认预设)时编辑器显示默认文案「会话「{title}」已xx,请点击查看。」,文字 + 内联信息胶囊,光标处插入;{image}/{icon} 标签点击缩略图可预览大图、点 × 才删除(防误删),{audio} 标签点播放图标试听、播放中变成暂停图标、再点即停,点 × 才删除(同样防误删;删除标签只清掉该原因的音频数据,正文原样保留),其他标签点击移除;编辑后删空则显示「留空则使用默认文案」占位(不可选中/删除);提问行的默认文案为「AI 向你提问:{question}」,{question} 会在发送时替换为 AI 的实际提问(插入菜单同样提供「提问」标签,与其他标签同款交互)
跳过子代理会话复选框(保存时一并写入设置文档)
通知权限状态实时显示:已授权(绿)/ 尚未授权(附「请求授权」按钮)/ 已被浏览器屏蔽(附地址栏操作指引)/ 环境不支持
按原因定制标题折叠区(默认收起):每个结束原因一个独立标题输入框,留空 = 用全局模板或语言默认标题
保存写入宿主设置文档(language / templates / titleTemplate / titleTemplates / pushModeBlur / pushModeFocus / skipSubagents / audios / volume / maxDuration);只写真正变化的字段(其余一律不动),保存期间按钮禁用;保存后显示「点击刷新」链接
重置一键还原默认值(语言保留当前选择,标题/模板/失焦聚焦通道/提示音/时长恢复默认)并立即保存

[!NOTE] 「失焦时」「聚焦时」的通道取舍:dual(默认)同时弹 Windows 系统通知与页内 toast,toast 是保底通道,防止系统通知被平台静默(专注助手、通知横幅关闭)。两路互相独立,可组合成「失焦时系统通知、聚焦时不打扰」。老配置不受影响——设置文档里没有 pushModeBlur / pushModeFocus 时,两路都沿用旧版单一 pushMode 的值。但 QQ 浏览器等国产 Chromium 壳浏览器会把 Notification 渲染成「浏览器内置的页内推送弹窗」(页面顶部/角落的横幅,不经 Windows 通知中心)——此时 dual 会造成页内两个提示(浏览器内置弹窗 + 插件 toast)。这类浏览器请选「仅页内提示」(不再调用 Notification,浏览器内置弹窗不会出现,页内只有插件自己的小 toast);「仅系统通知」模式在 QQ 浏览器无效(它永远渲染为页内弹窗)。设置面板每个原因的「发送」测试按钮同样受此影响——测试通知优先走「聚焦时」那一路,该路为「不通知」时改用「失焦时」那一路,两路都关则回落 dual,保证预览总有反馈。

[!NOTE] 系统通知(Notification API)能否弹出由浏览器与站点访问方式共同决定:Edge/Chrome 对"不熟悉"的站点会自动屏蔽通知(地址栏出现「通知已屏蔽」)——点击地址栏左侧权限图标 → 网站设置 → 通知 → 允许即可恢复;http://IP 这类非安全上下文访问时 Notification 根本不存在,请改用「仅页内提示」。设置面板「通知权限」区域会实时显示当前状态并给出对应操作指引(可一键请求授权)。Firefox 窗口聚焦时通知显示为页内横幅、失焦才进系统通知中心。

[!NOTE] 面板中「跳过子代理会话」保存的是设置文档里的布尔值;宿主 cordis.patch.yml 的 config.skipSubagents 是其启动默认值,两者任一为真即跳过。

文案模板与占位符

每条结束原因独立一个模板输入框,标签即开关 —— 在模板里插入对应信息标签,该项数据才会显示:

占位符含义示例值
{title}会话标题(推送标题模板也可用)重构登录模块
{duration}本轮用时(turn/start 起表 → turn/end 结束)3 分 25 秒 / 3m25s
{usage}token 消耗(输入 = 未缓存 + 缓存读 + 缓存写)1,240 输入 / 3,560 输出
{error}错误信息(无错误时显示 none;单行化,80 字符截断)connection timeout
{cache}缓存命中率(官方投影口径,无数据为空)96.5%
{tps}生成速度(官方投影口径,无数据为空)92 tok/s
{image}自定义通知大图开关:从「+ 插入信息」插入并选择本地图片(自动压缩至 512px),按原因独立;正文渲染时剥除,不进会话日志;删除标签时该原因图片数据一并清除—
{icon}自定义通知图标开关:从「+ 插入信息」插入并选择本地图片(自动压缩至 128×128 方形),按原因独立;正文渲染时剥除,不进会话日志;优先于全局「通知图标」;删除标签时该原因图标数据一并清除—
{audio}自定义提示音开关:从「+ 插入信息 → 音频」插入并选择本地音频文件(mp3/wav/ogg… 原样读取,不做压缩、不做截断;>512 KB 会先确认),按原因独立;默认为空(不设置就没有提示音),音量与「时长」由面板「音频」折叠区里的「音量」滑块 / 「时长」行(滑块 0~15 秒、步长 0.1 + 数值框,默认 0 = 不限制,超时 0.5 秒淡出)统一控制,试听即按当前音量;点标签上的播放图标试听、播放中变成暂停图标再点即停,点标签上的 × 才删除(删除只清掉该原因的音频数据与标签,正文不受影响);正文渲染时剥除,不进会话日志;同个状态只允许一个(已插入时菜单按钮置灰,重复标签在保存时自动剥除)。是否播放由「已保存」的模板决定(点保存后刷新生效,与面板其他项一致)——插了标签才有提示音,插入标签后又取消选择音频则不会播放—
{question}提问行的专属占位符:发送时替换为 AI 的实际提问文本;与「+ 插入信息」菜单联动(可直接选「提问」标签,手输 {question} 同样识别为胶囊),仅提问通道可用,其他原因行插了也会被替换为空(防字面量泄漏)要继续生成报告吗?
{label}已废弃 —— 渲染时自动剥除,旧模板仍兼容(插入菜单已移除该选项)—

模板留空即使用内置默认文案(「会话「{title}」已xx,请点击查看。」句式,不含用时与消耗)。折叠行 summary 与正文同源(渲染结果截断至 120 字符)—— 只看折叠行的用户也能看到真实标题与用时、消耗。

预设系统

  • 内置预设:仅「默认」,作为基线。
  • 自定义预设:保存在 localStorage(key = dsh-scn-custom-presets):
    • 「新增」命名后保存为自定义预设;保存后可「修改」自动同步、「删除」移除;
    • 自动编号的未命名预设:从「默认 / 空白」直接保存时,自动生成 未命名、未命名 2、未命名 3…(编号取当前最大值 + 1);
    • 表单显示「来自:xxx · 已修改」来源指示(来自预设但内容已改动时)。
  • 保存即同步:保存时若表单来源是自定义预设则更新该预设,否则新建或继续编号未命名预设。

宿主配置项

- insert:
    - id: dsh-session-notify
      name: '@telosmaylx/dsh-session-notify'
      config:
        reasons: [completed, aborted, blocked, error, max-tokens]
        skipSubagents: true
字段类型默认值说明
reasonsstring[][completed, aborted, blocked, error, max-tokens]触发提醒的 turn/end 原因白名单
skipSubagentsbooleantrue跳过子代理会话(origin=subagent 或 delegationDepth>0)

宿主配置项

- insert:
    - id: dsh-session-notify
      name: '@telosmaylx/dsh-session-notify'
      config:
        reasons: [completed, aborted, blocked, error, max-tokens]
        skipSubagents: true
字段类型默认值说明
reasonsstring[][completed, aborted, blocked, error, max-tokens]触发提醒的 turn/end 原因白名单
skipSubagentsbooleantrue跳过子代理会话(origin=subagent 或 delegationDepth>0)