任务完成通知 yuan-source-666/dsh-task-notifier
DeepSeek 客户端v1.1.0任务跑完自动弹出系统通知,附带任务名称
29.3/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/9/16 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/yuan-source-666/dsh-task-notifier.git状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:需留意
是什么
生态插件
可安装,未声明 dsh 能力
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 62 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
⚠︎ 实装验证未通过(unknown · 2026/10/6) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意npm 同名包「dsh-task-notifier」归属 moranyue/dsh-task-notifier,装到的可能不是本插件
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包dsh-task-notifier @ 1.1.0
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/9/22 19:21:05
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件
查看扫描证据(共 8 处,展示前 8 条)
- 读取本地文件scripts/build.mjs:22
if (existsSync(local)) return local - 读取本地文件scripts/build.mjs:32
if (existsSync(join(root, 'lib', 'index.js'))) { - 执行外部命令来自配置/变量scripts/build.mjs:49
const result = spawnSync(process.execPath, [tsc, ...args], { cwd: root, stdio: 'inherit' }) - 执行外部命令来自配置/变量lib/notifier.js:55
child = spawn(program, [...args], { stdio: 'ignore', windowsHide: true, shell: false }); - 写入本地文件scripts/notify-sink.mjs:25
appendFileSync(file, JSON.stringify(fields) + '\n') - 读取本地文件scripts/write-dev-patch.mjs:21
const text = readFileSync(layer, 'utf8') - 写入本地文件scripts/write-dev-patch.mjs:36
writeFileSync(layer, text.replace(/^( *)name: '.*'$/mu, (_all, indent) => indent + "name: '" + url + "'"), 'utf8') - 执行外部命令来自配置/变量src/notifier.ts:105
child = spawn(program, [...args], { stdio: 'ignore', windowsHide: true, shell: false })
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 任务结束发系统通知
- 通知附带任务名称
- 按来源分别开关
DeepSeek Harness 社区插件:一轮对话、子代理、后台任务、目标或工作流结束时发系统通知。文案本地化,按来源分别开关,可自定义投递命令。npm:dsh-task-notifier
README
由 DeepSeek 最新模型翻译生成dsh-task-notifier
DeepSeek Harness 社区插件(组合包):任务完成时弹出系统通知,告诉你「某某任务已经完成」。
agent 经常在后台跑很久,等你回到窗口,它其实早就答完了。这个插件把 DSH 内部「一件任务结束了」的信号接出来,交给操作系统的通知中心——Windows 吐司、Linux 桌面通知、macOS 通知中心——并带上任务的名字:
| 场景 | 通知标题 | 通知正文 |
| 一轮对话答完 | DSH 任务完成 | 对话任务:修复登录接口 500 报错 |
| 委派的子任务结束 | DSH 任务完成 | 子任务:梳理 packages 依赖关系 |
| 后台任务跑完 | DSH 任务完成 | 后台任务:pnpm test |
| 目标标记完成 | DSH 任务完成 | 目标:把插件文档补全并跑通测试 |
| 工作流跑完 | DSH 任务完成 | 工作流:全仓依赖审计 |
| 出错 / 取消 / 截断 | DSH 任务未正常结束 | 后台任务:pnpm test |
任务名优先取会话标题(DSH 会自动生成),没有标题时退回该会话最近一条人类指令。
展开完整文档(README 剩余 1 节)
dsh-task-notifier
DeepSeek Harness 社区插件(组合包):任务完成时弹出系统通知,告诉你「某某任务已经完成」。
agent 经常在后台跑很久,等你回到窗口,它其实早就答完了。这个插件把 DSH 内部「一件任务结束了」的信号接出来,交给操作系统的通知中心——Windows 吐司、Linux 桌面通知、macOS 通知中心——并带上任务的名字:
| 场景 | 通知标题 | 通知正文 |
| 一轮对话答完 | DSH 任务完成 | 对话任务:修复登录接口 500 报错 |
| 委派的子任务结束 | DSH 任务完成 | 子任务:梳理 packages 依赖关系 |
| 后台任务跑完 | DSH 任务完成 | 后台任务:pnpm test |
| 目标标记完成 | DSH 任务完成 | 目标:把插件文档补全并跑通测试 |
| 工作流跑完 | DSH 任务完成 | 工作流:全仓依赖审计 |
| 出错 / 取消 / 截断 | DSH 任务未正常结束 | 后台任务:pnpm test |
任务名优先取会话标题(DSH 会自动生成),没有标题时退回该会话最近一条人类指令。
它监听什么
DSH 里「任务完成」有好几种形态,插件给每一类都留了独立开关,全部来自真实事件,不做轮询:
| 开关(默认开) | 事件接缝 | 判定 |
| onTurnEnd | session/event 里的 turn/end | reason.kind === 'completed' 记为成功;error / aborted / blocked / max-tokens 记为未成功 |
| onSubagentEnd | subagent/end | stopReason === 'completed' |
| onJobDone | ctx.jobs.onJobDone(@deepseek-ai/dsh-jobs) | status === 'completed' |
| onGoalComplete | goal/changed | operation 为 complete 或 block(create / edit / pause / resume 是中间态,不打扰) |
| onWorkflowEnd | workflow/end | stopReason === 'completed' |
另外三条降噪规则:
- 子会话默认静音。subagent 会话里的每一轮也带 turn/end,默认只在 includeChildSessions: true 时才通知;子任务本身的结束由 onSubagentEnd 负责,不会漏。
- 崩溃修补的 interrupted 轮次永远不通知——那是持久化后端重放时补写的记录,不是刚跑完的活。
- dedupeMs 去重窗口(默认 2 秒):同一个完成信号被多条接缝同时报出、或插件被热替换时,只弹一条。
投递是「尽力而为且必定吞掉错误」的:所有渠道都失败时只记一条 warn 日志,绝不会因为弹不出通知而让 agent 的一轮任务失败。
安装并启用
以下命令都在 DSH 仓库根目录 执行。
方式一:直接跑源码(推荐先这样验证)
先把开发层里的占位路径换成你自己的 checkout(一条命令,无需手改):
node scripts/write-dev-patch.mjs # 重写 load.dev.patch.yml,并打印可直接用的命令
cd /path/to/deepseek-harness
pnpm dsh web --patch "它打印出来的那个 load.dev.patch.yml 绝对路径"
打开 http://127.0.0.1:3080,随便提一个任务;agent 答完的那一瞬间,桌面会弹出「DSH 任务完成 / 对话任务:…」。
终端里同时能看到 dsh-task-notifier 打印的 watching task completions 与 system notification shown。
Windows 必看:patch 里的插件路径必须绝对,而且要写成 file:///E:/... 形式。直接写 E:/... 会被 Node 的 ESM 加载器当成未知协议拒绝(ERR_UNSUPPORTED_ESM_URL_SCHEME);file:/// 形式在 Linux 与 macOS 上同样正确,所以模板统一用它。
方式二:装成组合包
dsh plugin --profile demo add E:/ai_agent_workspace/deepseek_harness/dsh-task-notifier
dsh --profile demo
包声明了 dsh.bundle.patch = ./cordis.patch.yml,安装后 id: task-notifier 那一行自动进入组合。
只想看层是否生效、先不启动:dsh --profile demo --dump-config。
方式三:tarball(目标机器无需构建)
pnpm run pack # 产出含预构建 lib/ 的 tarball
dsh plugin --profile demo add ./dsh-task-notifier-1.0.0.tgz
也可以直接 dsh plugin --profile demo add github:yuan-source-666/dsh-task-notifier。仓库里带着预构建的 lib/ (.gitignore 刻意没有忽略它),因为 DSH 的 git 安装只取源码、不会跑构建:这样装完即可加载,目标机器既不需要 TypeScript,也不需要授权 prepare 构建脚本。改了源码要自己构建时,scripts/build.mjs 在拿不到 TypeScript 的情况下会明确报错并给出修法,而不是抛栈。
配置项
全部写在这一行的 config: 里;每个字段都有可用默认值,下面列出的就是默认值。
- insert:
- id: task-notifier
name: dsh-task-notifier
config:yaml
enabled: true # 总开关,false 时连监听都不注册 locale: 'zh' # 'zh' 或 'en';一个字段决定整套文案语言 title: '' # 成功标题;留空跟随 locale failureTitle: '' # 未成功标题;留空跟随 locale bodyTemplate: '' # 正文模板;留空跟随 locale taskNameChars: 120 # 任务名最长保留多少字符,超出用省略号收尾 onTurnEnd: true onSubagentEnd: true onJobDone: true onGoalComplete: true onWorkflowEnd: true onlySuccess: false # true = 出错/取消不再打扰 includeChildSessions: false # true = 子会话里的每一轮也通知 sound: true # 支持的渠道带上提示音 dedupeMs: 2000 # 同一完成信号的去重窗口 appName: 'DeepSeek Harness' # 通知里显示的应用名 powershellProgram: '' # Windows 指定 PowerShell;留空依次试 powershell.exe、pwsh.exe
command: [] # 自定义投递命令 argv,非空时覆盖内置渠道
timeoutMs: 15000 # 单个投递进程最长运行时间,超时即换下一个渠道
正文模板可用占位符:{kind} 任务类型、{task} 任务名、{outcome} 结束原因、{ref} 会话或任务 id。
写错的占位符(例如 {nope})会原样显示在通知里,而不是悄悄消失。
locale 一次切换同时改掉三处:类型与原因标签(对话任务 / Chat task、已完成 / completed)、默认标题、以及默认模板里的分隔符(中文 : / 英文 : )——不会出现「Background job:xxx」这种半英不中的通知。
用别的程序投递
command 的 argv 里含 {title} / {body} 时就地替换;不含就把两个字符串追加到末尾。两种情况都不经过 shell:任务名里有 $&、引号、反引号、$(...) 也只会被当作普通文字(冒烟测试里专门有一条覆盖这点)。
yaml
command:
- /usr/local/bin/my-notify
- --title={title}
- --text={body}
各平台渠道与回落顺序
| 平台 | 依次尝试 |
| Windows | powershell.exe + WinRT 吐司 → powershell.exe + 托盘气泡 → pwsh.exe + 吐司 → pwsh.exe + 气泡 |
| Linux | notify-send → zenity --notification → kdialog --passivepopup(成功且 sound: true 时再尽力 paplay 一声) |
| macOS | osascript 的 display notification(sound: true 时用 Glass 音) |
| 任意平台 | command 非空时只用它 |
吐司脚本通过 -EncodedCommand(Base64 + UTF-16LE)递交,正文里的引号与换行破坏不了命令;子进程一律 stdio: 'ignore',所以宿主进程即便跑在沙箱里也能正常派生通知程序。
自己验证 sh
pnpm install
pnpm test # 编译 + 26 项冒烟检查(假 ctx、假服务、真 spawn 到采集脚本)
pnpm run test:notify # 用插件自己的投递代码,真弹一条系统通知
pnpm run test:notify -- --failure --locale=en
tests/smoke-test.mjs 不需要 harness、API key 或网络:它把 command 指向 scripts/notify-sink.mjs,用结构化的假 ctx 驱动 session/event、subagent/end、ctx.jobs、goal/changed、workflow/end,再断言桌面被要求显示的确切标题与正文。
给其他插件复用
每次判定完成后,插件会发出自己的事件,别的插件可以直接订阅同一信号,不必重新解析 harness 接缝: ts
ctx.on('task-notifier/completed', ({ completion, title, body }) => {
// completion: { kind, task, outcome, success, key, ref }
})
已知边界
- 通知发生在运行 dsh 的那台机器上。浏览器远程打开 Web UI 时,弹的是服务器那边的通知。需要浏览器内提示的话,请另写一个客户端插件订阅 task-notifier/completed。
- 会话标题由 DSH 标题服务异步生成(它自带字节上限,所以通知里看到的是被截短的标题),标题还没生成时正文会退回「最近一条人类指令」。
- 目标(goal)自动续跑时每一轮都是一个新 turn/end,所以每轮答完都会通知一次。只想在目标真正完成时被叫醒,就把 onTurnEnd: false、保留 onGoalComplete: true。
- 通知里带任务名(默认最多 120 字符)。不想让提示词进桌面通知,就把 bodyTemplate 改成 '{kind} {ref}',或调小 taskNameChars、保持 includeChildSessions: false。
- onJobDone 依赖组合里存在 ctx.jobs(如 dsh-jobs-local)。缺失时记一行日志并跳过该来源。
目录结构
src/index.ts 插件入口:Config schema、去重窗口、装配、task-notifier/completed 事件 src/task-source.ts 五类完成信号的归一化适配器(结构化视图,不 import harness 内部包) src/format.ts 任务名折叠截断、中英文标签、标题与模板解析 src/notifier.ts 跨平台投递:吐司 / 气泡 / notify-send / zenity / kdialog / osascript / 自定义命令 cordis.patch.yml 组合包层(按包名引用) load.dev.patch.yml 源码开发层(file:/// 绝对路径) scripts/build.mjs 自包含构建(git 安装时的 prepare 用得上) scripts/write-dev-patch.mjs 把开发层里的占位路径换成本机绝对路径,并打印启动命令 scripts/notify-test.mjs 真弹一条通知的手动检查 tests/smoke-test.mjs 假 ctx 冒烟测试
许可
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
yuan-source-666/dsh-task-notifier
任务跑完自动弹出系统通知,附带任务名称
相关插件 · UI / 主题
破甲增强版JeffKeeping/dsh-purge-plus
dsh-purge 的非官方分支fork:适配 DeepSeek Harness 0.2.1-rc.2、破甲内核…
★ 387已汉化DeepSeek 客户端
71.9
无代码业务系统平台nocobase/nocobase
NocoBase 是什么
★ 24,804已汉化DSH
71.8
1Panel 服务器面板1Panel-dev/1Panel
全球 250 万+ 自托管用户共同喜爱。
★ 37,350已汉化DSH
71.5
工作状态行动态ccch1mneyyy/working-activity
作者:chimney@ccch1mneyyy。社区项目,非 DeepSeek 官方项目。
★ 664已汉化DSH
71.2
多模型配置管家farion1231/cc-switch
跨平台桌面一体化助手,支持 Claude Code、Codex、OpenCode、DeepSeek Harness 等工具,唯一官网 ccswitch.io
★ 151,506已汉化DSH
71.1
AI 矢量设计工具ZSeven-W/openpencil
全球首个 AI 原生开源矢量设计工具。
★ 7,027已汉化DSH
71.1
这是你的仓库?认领条目