前言¶
DeepSeek Harness(DSH)左侧栏可以挂多个 workspace,每个项目下有多条会话。常见用法是:在项目 A 里丢一个要跑一会儿的任务,马上切到项目 B 继续写代码或改别的仓库。项目 A 被收起后,其下会话跑完时,界面不会主动告诉你——只能展开项目、逐条点进会话,才能看到「已完成」。
dsh-session-notify 是社区维护的客户端插件(维护者 zach-bworld),在侧边栏底部补角标、在系统层补通知,并支持从列表一键跳进对应会话。下面介绍它做什么、怎么装、怎么用,以及和 DSH 能力边界相关的限制。
这是什么¶
一句话:DSH client plugin——当别的项目里有后台会话跑完时,在侧边栏底部显示未读角标,并可选发系统 Notification;点列表条目可直达会话,进入主视图后自动清除该条未读。
- 仓库:github.com/zach-bworld/dsh-session-notify
- 目录页:skillhub.cn/plugins/zach-bworld/dsh-session-notify
- 分类:客户端(纯前端 bundle,
index.js侧 Host 仅apply() {}用于激活 bundle) - 许可证:MIT(
package.json当前版本 1.1.1)
社区插件目录为独立站点,与 DeepSeek / 幻方无官方从属关系;安装前建议自行浏览源码与许可证。插件在当前 DSH 客户端进程内运行,权限与你在用的 DSH 实例一致。
核心功能¶
侧边栏底部角标¶
按 workspace(项目) 分组统计「跑完且你还没进主视图看过」的会话数。项目收起或展开时,角标仍在侧边栏底部可见(README 说明:DSH 暂无 workspace 分组头 slot,因此提示落点在 sidebar.footer.action,而不是每个项目行上的红点)。
系统通知¶
每次符合条件的后台会话从 running 变为完成,触发一条浏览器/Electron 通知;切到其他应用时也能收到。若用户拒绝通知权限,会静默降级为仅角标。
点击直达与自动清除¶
- 点角标 → 弹出按项目分组的完成列表
- 点某条 → 打开该会话;同时左侧目录会滚到
data-row-key="session:<id>"对应行并短暂高亮(找不到会话行时退到所属workspace:<id>行) - 进入会话主视图(
retainedBy.mainView > 0)即视为已读,该条从未读里去掉
只统计你自己发起的会话;子 agent(subagent)内部会话不计入,避免内部任务把角标刷满。
待办(☆ / ★)¶
「已完成」列表点进去就清未读;若跑完了但暂时没空处理,可在列表行右侧点 ☆ 钉成待办(变为 ★),再点一次取消。待办存在浏览器本地(key dsh-session-notify.todos.v1),刷新或重开窗口仍保留;会话从列表里被删掉后,对应待办会自动剔除。角标会同时体现未读(铃铛)与待办(图钉);未读清完但仍有待办时,角标呈描边样式。
安装与启用¶
桌面端 App(推荐)¶
桌面端的 profile 由 Electron App 独占管理,不要在 PowerShell 里对 desktop profile 执行 dsh plugin add,否则会报 profile "desktop" is managed exclusively by the Electron application。
- 打开左侧栏最下方 插件
- 点 安装,粘贴安装地址(不是 shell 命令):
https://github.com/zach-bworld/dsh-session-notify
等价写法还包括 github:zach-bworld/dsh-session-notify、git@github.com:zach-bworld/dsh-session-notify.git,或本地 clone 后的绝对路径。
3. 在列表里启用插件
4. 刷新页面(Ctrl+R)或重开窗口——客户端 bundle 需刷新才会加载
命令行 / Web 端¶
将 web 换成你实际使用的 profile 名(常见 web、tui、headless):
dsh plugin --profile web add github:zach-bworld/dsh-session-notify
装指定版本示例:
dsh plugin --profile web add github:zach-bworld/dsh-session-notify#v1.0.0
装完同样刷新页面。
卸载¶
在 App 插件页移除;或命令行:
dsh plugin --profile web remove @…/dsh-session-notify
| 现象 | 处理 |
|---|---|
命令行报 managed exclusively |
改用 App 内插件页安装 |
| 装完没反应 | 刷新页面加载 bundle |
| 找不到包 | 核对 github:zach-bworld/dsh-session-notify 拼写 |
典型用法:先跑任务,再切项目¶
README 给出的可复现步骤:
- 在项目 A 里发起一个需要跑一会儿的任务
- 立刻切换到项目 B
- 等 A 中会话跑完 → 侧边栏底部出现角标数字,并可能收到一条系统通知
- 点角标 → 选会话 → 跳转;点进会话后该条未读自动清除
若要长期跟进某次完成结果:打开角标列表,点行右侧 ☆ 标记待办,稍后再从同一入口处理。
工作原理(与 DSH API 的衔接)¶
| 环节 | API / 机制 |
|---|---|
| 运行状态基线 | ctx.sessions.list(byId[id].running、retainedBy.mainView) |
| 状态翻转 | remote.$on('api-session/status', (sessionId, running) => …) |
| 项目归属 | ctx.workspaces.list.items[].sessionIds |
| UI 注入 | slot sidebar.footer.action;inject 提供 hooks.sessionNotify / openSession |
| 文案 | client locale(zh / en) |
适用场景与已知限制¶
适合:同时在多个 DSH workspace 间切换、依赖后台 agent 跑长任务、又不想反复展开收起项目查「有没有跑完」的开发者。
限制(来自 README,安装前心里有数):
- 无法在单个「项目行」上打红点,提示集中在侧边栏底部。
- 仅展开项目不会清除未读;须点进会话或该会话再次开始运行。
- 系统通知依赖通知权限。
- 若目标会话所属项目被你手动收起,点列表条目时不会替你展开项目,只会滚到并高亮该项目行。
结尾¶
dsh-session-notify 把「后台会话完成」从被动排查变成角标 + 通知 + 列表跳转,并用手动待办兜住「稍后再看」的场景。多项目并行用 DSH 时,可先按上文在 App 或对应 profile 安装启用,再用「A 跑任务、B 继续干活」走一遍验证。