READMESource: main@b810e130
任务通知台 · Task Notifier
DeepSeek Harness(DSH)Web 插件:任务完成时提醒你,并给你一个能筛选「已完成未读」的任务面板。 A DSH Web plugin that notifies you when a task finishes and gives you a Tasks panel to filter completed-but-unread sessions.

它解决什么
DSH 跑长任务时,你切走去干别的,回来才发现早就跑完了。这个插件把「完成」这件事推到你能看到的地方:
- 提示音:任意会话一轮结束,浏览器合成一段上行 chime(G5→C6),不需要音频素材。
- 通知双通道:
- 页面开着且已授权 → 浏览器
Notification,点一下跳回对应会话; - 页面关了或未授权 → 宿主在 macOS 上弹系统通知(
osascript),不会双弹(心跳判重)。
- 页面开着且已授权 → 浏览器
- 任务面板:侧边栏图标(带未读角标)→ 四个筛选:已完成未读 / 运行中 / 已完成 / 全部,支持按标题搜索、全部标为已读、试听提示音、试发系统通知。
- 未读不丢:状态写在
$DSH_HOME/storages/dsh-task-notifier/state.json,重启后还在。 - 中英双语:界面与系统通知文案跟随宿主语言(zh / en)。
安装
方式一:从开放插件市场安装(收录后)
在 DSH:插件 → 实验性插件 → 打开「自定义插件市场」→ 发现 → 添加索引源
https://dshopen.org/index.json
然后搜索「任务通知台 / Task Notifier」安装。
方式二:npm 安装
dsh plugin --profile desktop add @polunzh/dsh-task-notifier
方式三:从本地目录安装(开发调试)
在 DSH 里用 plugin_manager 的 install_bundle,target 填本仓库的绝对路径。
配置
全部可省略,写在你的 profile 的 cordis.patch.yml 里:
- insert:
- id: task-notifier
name: '@polunzh/dsh-task-notifier'
config:
osNotify: auto # auto | always | off
sound: true # 浏览器端提示音开关
osSound: Glass # macOS 系统提示音名
osTitle: DeepSeek Harness # 系统通知标题
| 字段 | 默认 | 说明 |
|---|---|---|
osNotify |
auto |
auto=页面在线交给浏览器通知、离线兜底系统通知;always=恒发系统通知;off=不发 |
sound |
true |
浏览器合成提示音 |
osSound |
Glass |
macOS 自带提示音名(Glass / Ping / Pop …) |
osTitle |
DeepSeek Harness |
系统通知标题 |
隐私与安全
- 不联网:没有任何出站请求、遥测或远程资源。
- 不上传:会话标题只写本机
state.json,目录 0700、文件 0600。 - 不读凭据:不碰
~/.dsh/.credentials.yaml、.env、keychain、SSH key。 - 路由 fail-closed:宿主连接守卫缺失时直接拒绝,不做"没守卫就放行"。
- 无安装期脚本:
package.json里没有preinstall/postinstall/prepare。
细节、威胁模型与限流参数见 SECURITY.md。
兼容性
| 项目 | 要求 |
|---|---|
| DSH | >=0.2.0-rc.2(写在 engines.dsh) |
| Node | >=20 |
| 平台 | Web UI 全平台;系统通知仅 macOS,其他平台只发浏览器通知 |
| 浏览器通知 | 需要用户点击授权(插件不在后台自动请求) |
截图
| 浅色 | 深色 |
|---|---|
![]() |
![]() |
| 已完成未读 | 空状态 |
|---|---|
![]() |
![]() |
英文界面(跟随宿主语言):

截图为真实界面 + 示例数据,由
npm run screenshot用 headless Chrome 渲染生成。
开发
npm test # node:test,46 个用例(含安全边界与中英字典一致性)
npm run preview # 本地预览页(真实 client.js + 模拟数据)
npm run screenshot # 重新生成 preview/screenshots/*.png
仓库结构:
lib/index.js 宿主侧:事件订阅、状态持久化、HTTP 路由、系统通知兜底
lib/core.js 纯逻辑:配置归一化、文本净化、AppleScript 转义、请求准入、状态解析(可单测)
lib/client.js 浏览器侧:面板 UI、轮询、提示音、浏览器通知
locale/ Plugin Manager 卡片的显示文案(zh / en)
test/ node:test 单测与集成测试
preview/ 预览页与截图(不进 npm 包)



No comments yet. Be the first to write one.