🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

任务提醒 Cartoncase/dsh-task-alert

DeepSeek Harness
Cartoncase8 天前有提交已提供中文文档扫描:含敏感能力

任务跑完或等你审批时弹窗并推送系统通知

29.4/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/11/2 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Cartoncase/dsh-task-alert
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · other
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
暂无时间戳·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 8 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件发起外部网络请求
查看扫描证据(共 11 处,展示前 11 条)
  • 读取本地文件
    index.js:45
    const pkg = JSON.parse(readFileSync(new URL('./package.json', import.meta.url), 'utf8'));
  • 读取本地文件
    index.js:125
    const text = readFileSync(configPath(), 'utf8');
  • 写入本地文件
    index.js:135
    mkdirSync(join(dshHome(), 'dsh-task-alert'), { recursive: true });
  • 写入本地文件
    index.js:136
    writeFileSync(file, `${JSON.stringify(config, null, 2)}\n`, 'utf8');
  • 读取本地文件
    index.js:286
    if (!existsSync(configPath())) saveConfig(config);
  • 发起网络请求
    client.js:91
    return fetch('/task-alert/config', { cache: 'no-store' })
  • 发起网络请求
    client.js:105
    return fetch('/task-alert/config', {
  • 发起网络请求
    client.js:447
    fetch('/task-alert/test', { cache: 'no-store' }).catch(function (error) {
  • 发起网络请求
    client.js:522
    fetch('/task-alert/test', { cache: 'no-store' }).catch(function (error) {
  • 发起网络请求
    client.js:836
    fetch('/task-alert/pending?since=' + lastSeq, { cache: 'no-store' })
  • 发起网络请求
    client.js:1036
    return fetch('/task-alert/test', { cache: 'no-store' });
扫描于 2026/11/4(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DSH 任务完成 / 等待审批时弹窗 + 系统通知,后台也不漏

README

由 DeepSeek 最新模型翻译生成
dsh-task-alert 给 DeepSeek Harness(DSH)做的任务提醒插件:一轮任务跑完、生成失败、输出被截断、或者有操作等你批准的时候,在页面右上角弹一张卡片;当 DSH 窗口在后台(被别的窗口盖住 / 最小化)时,同时发一条 Windows 系统通知。 解决的问题很具体:DSH 被丢在后台的时候,你不知道它已经跑完了,也不知道它正卡在审批上等你点。 装 包发布到 npm 之后(一行): dsh plugin --profile web add dsh-task-alert 本地开发/自用(本仓库自带脚本,装进桌面版的 profile,幂等、会先备份清单): powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\install.ps1 装完重启 DSH。
展开完整文档(README 剩余 1 节)
dsh-task-alert

给 DeepSeek Harness(DSH)做的任务提醒插件:一轮任务跑完、生成失败、输出被截断、或者有操作等你批准的时候,在页面右上角弹一张卡片;当 DSH 窗口在后台(被别的窗口盖住 / 最小化)时,同时发一条 Windows 系统通知。

解决的问题很具体:DSH 被丢在后台的时候,你不知道它已经跑完了,也不知道它正卡在审批上等你点。

装

包发布到 npm 之后(一行):

dsh plugin --profile web add dsh-task-alert

本地开发/自用(本仓库自带脚本,装进桌面版的 profile,幂等、会先备份清单):

powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\install.ps1

装完重启 DSH。验证宿主半边起来了:

Invoke-WebRequest http://127.0.0.1:61948/task-alert/health -UseBasicParsing | % Content
{"ok":true,"seq":0,"streams":1,"version":"0.2.0",...}

在哪里设置

有四个入口,改的是同一份配置:

| 入口 | 适合 |
| DSH 设置 → 任务提醒 | 全部选项(推荐)。注册在 settings.section 插槽里 |
| 弹窗卡片上的「设置」 | 弹窗正好在眼前时的快捷开关 + 保留秒数 |
| 配置文件 $DSH_HOME/dsh-task-alert/config.json | 手改,下次读取/重启生效 |
| 控制台 __dshTaskAlert.config() / .settings() | 调试 |

修改后立即生效:页内卡片按新值渲染,宿主的类别过滤也在保存那一刻开始生效(不必重连、不必刷新)。

配置项

$DSH_HOME/dsh-task-alert/config.json(默认 ~/.dsh/dsh-task-alert/config.json):

| 字段 | 默认 | 含义 |
| enabled | true | 总开关 |
| notifyApproval | true | 有操作等我批准时提醒 |
| notifyDone | true | 一轮对话跑完时提醒 |
| notifyError | true | 生成失败时提醒 |
| notifyTruncated | true | 输出触到上限被截断时提醒 |
| inPage | true | 页面右上角弹卡片 |
| osNotification | true | 窗口在后台时发系统通知(Windows 原生 toast) |
| sound | true | 播放提示音(审批两声、其余一声) |
| raiseWindow | true | 点系统通知后把 DSH 窗口叫到前台 |
| dismissSeconds | 12 | 卡片保留几秒后自动关闭;0 = 不自动关闭(审批卡永远常驻) |
| maxCards | 5 | 最多同时显示几张卡片(1–10,超出丢最旧的) |
| dismissOnFocus | true | 一回到 DSH(窗口重新获得焦点)就把还挂着的卡片全部收掉 |

卡片上还会写清项目(会话工作目录名)和会话标题,例如项目:自制插件 · 会话:DSH 任务完成与审批弹窗插件 · 工具:pwsh——只写"有操作要审批"是没用的,得让人知道是哪件事。

数值字段越界会被钳位而不是报错(dismissSeconds 0–600、maxCards 1–10),配置文件写坏(坏 JSON)会回落到默认值——配置问题不该让插件罢工。

提醒什么

| 场景 | 页内卡片 | 系统通知 | 说明 |
| 一轮对话正常结束 | ✅ | ✅ 仅后台时 | turn/end + completed |
| 生成失败 | ✅ | ✅ 仅后台时 | turn/end + error、agent/error |
| 输出被截断 | ✅ | ✅ 仅后台时 | turn/end + max-tokens |
| 等待审批 | ✅ 常驻 | ✅ 仅后台时 | approval/asked;approval/decided 后自动收卡 |
| 用户主动取消 / 崩溃恢复 | ❌ | ❌ | aborted / interrupted 是你的操作,不打扰 |

子代理、委派会话(origin=subagent 或 delegationDepth>0)不提醒——你等的是主对话。
判据取不到时放行:宁可多弹一条,也不因为宿主换字段让提醒整体失效。

为什么在后台也能收到

页面用 SSE(/task-alert/events,服务端推流)接收提醒,不是定时器轮询:浏览器会把后台标签页的 setInterval 节流到大约一分钟一次,而那正是"窗口在后台"这个场景本身。
SSE 是长连接,不受定时器节流影响。断线(页面被冻结、DSH 重启)后切回来会走 /task-alert/pending?since=<seq> 补最近 3 条,不刷屏。

交互

- 卡片:右上角堆叠,maxCards 上限,超出丢最旧的;鼠标悬停时暂停倒计时。
- 查看会话:切到发出这条提醒的会话(走 DSH 的 uiWorkspace.openSession)。
- ×:立刻关掉。
- 点一下系统通知:切到对应会话,并把窗口叫到前台(在 Electron 里发一次 dsh://open)。

HTTP 路由(宿主半边)

| 路径 | 用途 |
| GET /task-alert/events | text/event-stream 实时推帧,15 秒心跳,首帧带当前配置 |
| GET /task-alert/pending?since=<seq> | 断线重连补帧 |
| GET /task-alert/config | 当前配置 + 配置文件路径(会重读磁盘) |
| POST /task-alert/config | 保存配置(只给部分字段也行,自动校验钳位) |
| GET /task-alert/health | 存活探测(重启后用它确认插件起来了) |
| GET /task-alert/test | 造一条演示提醒(设置里的「试一下」);默认是一条带项目/会话名的完成提醒,可用 ?kind=approval\|error&project=…&title=… 换场景 |

结构

package.json # 包清单:main=index.js(宿主半边)、exports["./client"](浏览器半边)、dsh.client.platform=web cordis.patch.yml # bundle patch:把 id=name=dsh-task-alert 这一行插进配置树 index.js # 宿主半边:宿主事件 → 提醒帧 → SSE / JSON 路由;配置落盘与过滤 client.js # 浏览器半边:__ModuleLoader__.load 注册 cordis 插件 → 卡片 / 系统通知 / 设置页那一节 icon.svg # 插件图标(插件管理页显示) scripts/install.ps1 # 装进本机 DSH profile(复制 + 登记 bundle) test/.test.mjs # 离线自测

宿主半边只依赖 webServer 服务,不 import 任何 @deepseek-ai/dsh- 模块,因此不声明 peerDependencies、也不写 engines.dsh——不会被 DSH 版本兼容性检查挡住。

自测

node .\test\host.test.mjs # 假 cordis ctx:事件 → 配置过滤 → 帧 → HTTP/SSE
node .\test\client.test.mjs # 最小 DOM 桩:配置 → 帧 → 卡片 / 通知 / 设置页注册 / 清理

两个都是纯离线测试,不需要 DSH、不联网;host 那份用临时目录当 DSH_HOME,不碰真实配置。

npm test 跑的就是这两个,npm publish 前会经 prepublishOnly 自动跑一遍——测试不过发不出去。

发布前还建议验一次「打包产物能不能加载」(不是仓库目录,而是 npm 真正发出去的那份):

npm pack --pack-destination $env:TEMP
tar -xzf $env:TEMP\dsh-task-alert-0.2.2.tgz -C $env:TEMP
node .\test\pack-smoke.mjs $env:TEMP\package # 清单字段 / entry id / 客户端可编译 / 宿主能起 / 配置落盘 / 版本自报

已知限制

- 同一台机器开多个 DSH 页面时,每个页面各弹一次(每页一条 SSE)。桌面版只有一个页面,不受影响。
- 系统通知依赖 Windows 通知权限;权限没给时只有页内卡片(卡片上的「开启」按钮可以补授权)。
- 卡片显示的是 DSH 给会话起的名字(session/title 事件 / sessionTitle 服务)。极少见地取不到时显示「本轮对话」,不会把会话 id 甩给用户。

发布 / 发新版本

第一次发布(建仓库、发 npm、进社区市场)见 PUBLISHING.md。

以后发新版本三步:

1. 改代码,并在 CHANGELOG.md 顶部记一条,然后 git commit (脚本要求工作区干净 —— 它只负责"升版本 + 发出去",不替你决定提交哪些改动)
2. 跑一条命令:

powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\release.ps1 # patch:0.2.5 → 0.2.6 powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\release.ps1 -Bump minor

3. 重启一次 DSH(宿主半边只在启动时加载),再查 /task-alert/health 的版本号

脚本依次做:检查工作区干净 → 升版本号 → npm test → 打包装进临时目录跑冒烟测试 → 提交版本号 → 打 tag → 推 main 与 tag → npm publish → 同步到本机 DSH profile。
任何一步失败就停在那一步,不会留下"tag 推了但包没发"的半成品(提交/推送都在测试通过之后)。

-DryRun 只升版本并跑测试,跑完自动还原 package.json,不提交不发包。

许可证

MIT
预览分享卡片长什么样 ↓Cartoncase/dsh-task-alert
分享 · DeepSeek Harness Hub
Cartoncase/dsh-task-alert

任务跑完或等你审批时弹窗并推送系统通知

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部