dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DSH 审批/提问提醒:DSH 有焦点时只响提示音,焦点不在 DSH 时额外在屏幕右下角弹出系统通知
DSH 需要你审批/回答时,如果你的人不在这个窗口前,它会一直干等。 这个插件把"它在等你"变成听得见、看得见的提醒:
| 什么时候 | 会发生什么 |
|---|---|
| 审批 / 提问出现(窗口在前台) | 提示音 + 应用内右下角浮层(带「去处理」);任务栏图标带数字角标。 |
| 审批 / 提问出现(窗口在后台) | 再加一条 Windows 系统通知(点它直接切到对应会话)。 |
| 同一请求一直没人处理 | 按设定的次数与间隔重复提醒。 |
DSH 自身没有审批类的系统通知:窗口在后台时,提醒靠的就是插件补的这条 toast。 浮层里的「去处理」和系统通知的点击都会直接切到发起审批 / 提问的那个会话,不只是把窗口提到前台。 不想要系统通知可以在设置里关掉,声音与浮层不受影响。
声音可以按事件分别选择(8 种内置音效 + 自己导入的音频)、调音量、设定重复提醒的次数与间隔; 审批、提问/计划评审、任务完成三类事件各有开关。
powershell -ExecutionPolicy Bypass -File scripts\install.ps1
安装脚本会做三件事(幂等,可重复运行):
%USERPROFILE%\.dsh\profiles\desktop\package.json 的 dependencies 里加
"dsh-approval-alert": "link:<本目录>";dsh-approval-alert 追加进同文件的 dsh.profile.bundles;node_modules 下建一个指向本目录的目录联接。然后 完全退出并重新启动 DeepSeek Harness(只刷新网页不够:插件的浏览器 bundle 在启动时进入加载图)。
想装进
webprofile 用-Profile web;想走官方 pnpm 流程(顺便维护pnpm-lock.yaml)在 DSH 完全退出后加-UsePnpm。
卸载:
powershell -ExecutionPolicy Bypass -File scripts\uninstall.ps1
启动后:
界面上没有常驻的悬浮按钮:提醒只在真正需要你的时候出现,配色沿用页面的淡蓝色主题色。
设置项一览:
设置页里的 「立即测试」 立刻演示一次审批提醒(声音 + 浮层),不用真的触发审批。
开发者工具控制台里也可以:
__dshApprovalAlert.testAlert() // 演示审批提醒
__dshApprovalAlert.testAlert('question')
__dshApprovalAlert.describe() // 焦点 / 通知权限 / 音频解锁 / 挂起的提醒 / 等待中的会话
__dshApprovalAlert.getSnapshot() // 完整状态
听不到声音:浏览器要求先有用户手势才允许出声。在 DSH 里随便点一下/敲一下键就会解锁(设置页的「运行状态」会显示音频是否已就绪)。
看不到系统通知:先在设置页「运行状态」看「系统通知权限」。Windows 侧还要允许 DeepSeek Harness 发通知
(设置 → 系统 → 通知);被拒绝时插件安静降级为「提示音 + 应用内浮层 + 任务栏角标」。
另外系统通知只在窗口不在前台时发,前台时只有声音与浮层。
「去处理」没跳过去:确认宿主版本提供 uiWorkspace.openSession()(新版还会兜底 sessions.open());
两者都没有时,按钮退化为只把窗口提到前台。
完全没反应:确认重启过 DSH,并确认 profile 里确实接好了线:
$env:ELECTRON_RUN_AS_NODE='1'
& 'D:\Software\dsh\DeepSeek Harness.exe' test\verify-host.mjs
Remove-Item Env:\ELECTRON_RUN_AS_NODE
它会打印 profile 的 bundle 层、合成后的配置条目,以及客户端 bundle 的形态。
lib/index.js)是一个空插件。它存在的唯一理由是:只有 Loader 挂载的插件才会被
dsh.client 扫描,从而让浏览器 bundle 进入加载图。lib/client.js)订阅 uiSession.sessionStatus
(Map<sessionId, { running, pendingInteraction, completionUnread }>)。
审批卡片出现的前提就是某个会话的 pendingInteraction.kind === 'approval',
所以订阅它 = "审批出现的瞬间",并且 完全不参与 approval/request 责任链 ——
提醒插件再怎么写坏,也不会让审批无法被回答。localStorage。sessionId;点「去处理」时依次尝试 uiWorkspace.openSession(id)、
sessions.open(id)(只探测、不硬依赖),把 DSH 主视图切到那个会话。document.hasFocus() 为假或页面不可见)时,new Notification(...)
补一条 Windows toast:tag 固定为 dsh-approval-alert,silent: true(声音由插件自己放,避免双响);
点通知等于「去处理」。前台时不弹,避免和审批卡片重复。权限在首次手势里申请。localStorage['dsh-approval-alert:settings:v1'],按 schema 归一化
(越界值、失效的音效引用都会被修正,旧版的 notify.whenUnfocused 等字段会被丢弃),
读失败/写失败都不会让插件中断。inject = ['slots', 'uiSession'],只从平台模块表取 react,其余是原生 DOM / Web Audio。scripts/uninstall.ps1 会把三条接线全部撤回(并把原 package.json 的备份留在
package.json.bak)。插件自己不写任何 Host 侧状态,删掉即干净。
@deepseek-ai/dsh-client-ui-approval 渲染(出现在审批所属会话的输入框区域,Enter = 允许一次,
Esc = 拒绝)。本插件只负责提示音、系统通知、右下角浮层、任务栏角标与「去处理」跳转。uiWorkspace.openSession()(新版还会兜底 sessions.open());
两者都没有时,按钮退化为只把窗口提到前台。pnpm-lock.yaml;若之后在插件管理器里增删插件导致 pnpm 重装 profile,
重跑一次 scripts/install.ps1 即可(或用 -UsePnpm)。