Bundle
dsh-task-notify
DSH web plugin: agent/subagent/workflow completion, approval-required, plan-review, goal-blocked, and user-question toasts with optional PushPlus push notifications
- Source
- V-Reason
- stars
- 1 stars
- License
- MIT
- Updated
- Updated 2 days ago
Readme
# dsh-task-notify DSH(DeepSeek Harness)Web 插件:Agent / 子代理 / 工作流任务完成时,以及 **agent 停下来等你操作时**(需要审批、向你提问、计划待确认、目标受阻),弹出真正的 **Windows 系统通知**(带提示音与 DeepSeek 图标),可选 PushPlus 微信推送。浏览器关闭也能收到。 ## 特性 - **系统级通知**:经 BurntToast(PowerShell 模块)调用 Windows 通知中心,播放系统提示音,无需网页授权; - **图标热更新**:通知图标直接读取包内 `deepseek.png`(按内容指纹缓存到临时目录),替换该文件后**下一条通知立即使用新图标**,无需重建或重启; - **手机推送**:通过 PushPlus 同步推送到微信,电脑不在身边也能收到; - **通知内容**:会话名(沿父链回溯到根会话)、时间、状态(完成 / 失败 / 中止…); - **需要审批**:agent 权限不足发起提权 / 越权执行审批时,通知「需要你的审批」(含工具名与原因)——审批策略为 `ask` 时提醒你去批准; - **询问用户**:agent 调用 `ask_user_question` 主动停下咨询时,通知「Agent 正在问你」(含问题文本); - **计划待确认**:`/plan` 完成后 agent 调用 `exit_plan_mode` 提交计划、等待你确认执行时,通知「计划待你确认」(含计划标题与摘要,每条评审只提醒一次); - **目标受阻**:goal 自动回合因持续阻塞而停止(模型上报或到达轮次上限)时,通知「目标受阻」(含阻塞原因),提醒你处理或清除; - **分类开关**:主回合 / 子代理 / 工作流 / 需要审批 / 询问用户 / 计划确认 / 目标受阻 独立开关,另有总开关一键关闭全部通知; - **持久配置**:配置存于 DSH settings(`task-notify` 命名空间),重启不丢; - **布局自适应**:配置面板逐帧(rAF)跟随 dsh-better-sidebar 面板让位,不遮挡。 ## 界面 - 会话标题栏右侧铃铛按钮:同步中(设置尚未加载,避免误报状态)→ 空心;总开关开 → 实心;总开关开且推送开 → 右上角白色手机剪影; - 毛玻璃配置面板(分层折叠):总开关常驻;「通知类型」层(含 7 个分类开关与「测试 Windows 通知」);「手机推送」层(含开关、Token、保存 Token、测试手机推送);面板底部为结果/错误提示。**开关即改即存**(无需手动保存),仅 Token 文本输入需点击「保存 Token」(或按回车);分组默认收起,展开/收起状态会记忆(localStorage),下次打开保持上次布局; - 面板打开后,鼠标左键点击面板外任意位置即关闭(面板内点击与右上角 × 不受影响;点击铃铛保持开/关切换)。 ## 环境要求 - DSH Web(profile 插件机制),Windows 10/11; - PowerShell 7(pwsh)与 BurntToast 模块: ```powershell Install-Module BurntToast -Scope CurrentUser ``` ## 安装 方式 A(推荐,DSH ≥ 0.1.3-alpha.1 的 git 源直装,自动 reconcile `dsh.profile.bundles`): ```powershell dsh plugin --profile web add git+https://github.com/V-Reason/dsh-task-notify.git # 更新时:dsh plugin --profile web update dsh-task-notify ``` 方式 B(本地 `file:` 依赖,手改 profile): 1. 在 profile 的 `package.json` 中 `dependencies` 增加: ```json "dsh-task-notify": "file:<本仓库路径>" ``` 2. 在 `dsh.profile.bundles` 数组末尾追加 `"dsh-task-notify"`; 3. 在 profile 目录执行 `pnpm install`,重启 DSH。 > 宿主行由本包自带的 bundle 补丁(`cordis.patch.yml`)注入,**不要**再写入 profile 的 > `cordis.patch.yml`,否则启动报 `duplicate loader entry id: dsh-task-notify`。 > profile 的 `pnpm-workspace.yaml` 中 `allowBuilds: node-pty: true` 必须为真,否则安装会以 > `ERR_PNPM_IGNORED_BUILDS` 失败(CLI 判定失败且不 reconcile bundles)。 ## 使用 1. 在 https://www.pushplus.plus 扫码登录,复制「一对一推送」token; 2. 点击标题栏铃铛 → 展开「手机推送」层,打开「PushPlus 推送」开关,粘贴 token → 点「保存 Token」(或按回车); 3. 用「通知类型」层的「测试 Windows 通知」与「手机推送」层的「测试手机推送」验证两条通道; 4. 「通知类型」中按需开关:**需要审批**(agent 提权/越权审批,仅审批策略 `ask` 时提醒)、**询问用户**(agent 提问)、**计划确认**(`/plan` 完成后 agent 提交计划等你确认)、**目标受阻**(goal 因持续阻塞停止)。 > 提示:除 Token 外所有开关均为即改即存,无需「保存」按钮;测试手机推送前若刚粘贴过 Token 未点击保存,会先自动落盘再发送。 > 注意:审批策略为 `never`(如 `danger-full-access` 权限预设)时审批会被自动拒绝、无需人工操作,因此不会发送审批提醒。 ## 测试与验收 五类通知的触发方式与预期内容(实测环境:Windows 11 + DSH Web,桌面 toast 通道): | 通知 | 触发方式 | 预期内容 | |---|---|---| | 任务完成 | agent 正常跑完一个回合(含子代理 / 工作流) | 会话名、时间、状态(完成 / 失败 / 中止…) | | 需要审批 | 权限设为 read-only,agent 写文件被沙箱拒绝后申请提权(审批策略 `ask`) | 工具名、提权原因 | | 询问用户 | agent 调用 `ask_user_question` 抛出问题后主动停下 | 问题文本 | | 计划待确认 | `/plan` 进入计划模式,agent 调用 `exit_plan_mode` 提交带 `#` 标题的计划 | 计划标题与摘要(每条评审只提醒一次) | | 目标受阻 | 创建注定无法完成的目标,跑满自动轮次上限或模型上报 blocked | 阻塞原因 | v1.2.0 已实测通过:**任务完成 / 需要审批 / 询问用户 / 目标受阻**。 **计划待确认**需先在会话中进入计划模式(`/plan`)后由 agent 调用 `exit_plan_mode` 触发,按上表操作即可验收。 v1.3.0 新增:**通知图标热更新**——替换 `node_modules\dsh-task-notify\deepseek.png`(或仓库根目录的 `deepseek.png`,取决于 `file:` 依赖是否软链)后,点「测试通知」即可验证 toast 角标已换成新图标, 无需重建插件或重启 DSH。 v1.4.0 修复/优化(仅客户端): - 铃铛不再在设置同步前显示默认实心图标——Remote 就绪后立即拉取设置,未就绪前保持空心("同步中"), 只反映宿主确认过的真实启用状态; - 设置面板分层折叠(总开关 / 通知类型 / 手机推送),分组默认收起,展开/收起状态记忆到 localStorage,下次打开恢复上次布局; - 开关全部**即改即存**(串行化写入,快速连按互不覆盖),取消手动「保存」按钮;仅 Token 文本输入 保留「保存 Token」(回车等效),测试手机推送前会自动落盘未保存的 Token; - 鼠标左键点击面板外任意位置关闭面板(面板内与右上角 × 不受影响,点击铃铛仍是开/关切换)。 v1.5.0(适配 DSH 0.1.3-alpha.1 —— 2026-08-30 平台重构): - 移除对 `@deepseek-ai/dsh-settings` 的 `settingsNamespace(...)` 静态导入(该导出已被平台删除, 旧版在 DSH 0.1.3-alpha.1 下启动即报 `does not provide an export named 'settingsNamespace'`);命名空间改为字面量 `'task-notify'`,`ctx.settings.register` 签名不变,**设置数据(settings.yaml)无需迁移**; - 宿主侧外部平台导入仅保留 `@deepseek-ai/dsh-typert-protocol`(schemastery/cosmokit 继续 vendor)。 v1.6.0(修复设置面板出现在左侧 —— 适配 dsh-better-sidebar 0.18 的 `data-dsh-panel-host` 布局): - 原因:better-sidebar 0.17 起真实面板被包进全视口的 `[data-dsh-panel-host]` 固定层,而旧逻辑测量 `[data-dsh-better-sidebar]` 的**直接子元素**——现在只剩这一个全视口包装层,其矩形恰好满足 "右对齐 / 底对齐"两条启发式,使 `sidebarRight` 被算成 `视口宽 − 200`,设置面板被推到 **屏幕左侧**(约 112px 被裁出视口); - 修复:改为按 `[data-dsh-panel]` 标记测量**真实面板**(右侧面板与底部面板各命中一次),并新增 `rect.width < 视口宽` / `rect.height < 视口高` 守卫排除 100vw 全宽抽屉等全视口元素; - 行为恢复:右侧面板收起时设置面板贴右上(距右缘 16px),右侧面板展开时位于其左侧且不重叠, 拖拽调整宽度时仍逐帧实时跟随;窄屏全宽抽屉不再误推位置(抽屉遮挡属于既有已知限制)。 ## 构建 ```powershell node build.mjs # pnpm 对 file: 依赖按内容拷贝,改完后同步到 profile 再刷新页面 / 重启: Copy-Item lib\*.js <profile>\node_modules\dsh-task-notify\lib\ -Force Copy-Item deepseek.png <profile>\node_modules\dsh-task-notify\ -Force ``` > 只换图标时无需重建:把新的 `deepseek.png` 覆盖到 > `<profile>\node_modules\dsh-task-notify\deepseek.png` 即可,下一条通知自动生效。 说明:构建使用 DeepSeek Harness 自带的 esbuild 与 vendored schemastery/cosmokit(`@deepseek-ai/dsh-*` 保持外部引用);harness 不在默认路径时用环境变量指定: ```powershell $env:DSH_HARNESS = 'D:\path\to\deepseek-harness' ``` wire 编解码为手写严格 schema,无额外运行时依赖。 ## 许可 MIT 图标 `deepseek.png` 由 DeepSeek 品牌标识(`deepseek.svg`)转出,仅用作应用图标。
Install
dsh plugin --profile web add github:V-Reason/dsh-task-notify
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-task-notify from the hub
- This package builds from source on install. pnpm will ask you to allow its build script — that is permission to run the package’s code on your machine, outside the agent sandbox. Only allow sources you trust.
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.