dsh-session-notify:多项目工作流下,后台会话完成不再静默

前言

DeepSeek Harness(DSH)左侧栏可以挂多个 workspace,每个项目下有多条会话。常见用法是:在项目 A 里丢一个要跑一会儿的任务,马上切到项目 B 继续写代码或改别的仓库。项目 A 被收起后,其下会话跑完时,界面不会主动告诉你——只能展开项目、逐条点进会话,才能看到「已完成」。
dsh-session-notify 是社区维护的客户端插件(维护者 zach-bworld),在侧边栏底部补角标、在系统层补通知,并支持从列表一键跳进对应会话。下面介绍它做什么、怎么装、怎么用,以及和 DSH 能力边界相关的限制。

这是什么

一句话:DSH client plugin——当别的项目里有后台会话跑完时,在侧边栏底部显示未读角标,并可选发系统 Notification;点列表条目可直达会话,进入主视图后自动清除该条未读。

社区插件目录为独立站点,与 DeepSeek / 幻方无官方从属关系;安装前建议自行浏览源码与许可证。插件在当前 DSH 客户端进程内运行,权限与你在用的 DSH 实例一致。

核心功能

侧边栏底部角标

按 workspace(项目) 分组统计「跑完且你还没进主视图看过」的会话数。项目收起或展开时,角标仍在侧边栏底部可见(README 说明:DSH 暂无 workspace 分组头 slot,因此提示落点在 sidebar.footer.action,而不是每个项目行上的红点)。

系统通知

每次符合条件的后台会话从 running 变为完成,触发一条浏览器/Electron 通知;切到其他应用时也能收到。若用户拒绝通知权限,会静默降级为仅角标。

点击直达与自动清除

  1. 点角标 → 弹出按项目分组的完成列表
  2. 点某条 → 打开该会话;同时左侧目录会滚到 data-row-key="session:<id>" 对应行并短暂高亮(找不到会话行时退到所属 workspace:<id> 行)
  3. 进入会话主视图(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。

  1. 打开左侧栏最下方 插件
  2. 点 安装,粘贴安装地址(不是 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 给出的可复现步骤:

  1. 在项目 A 里发起一个需要跑一会儿的任务
  2. 立刻切换到项目 B
  3. 等 A 中会话跑完 → 侧边栏底部出现角标数字,并可能收到一条系统通知
  4. 点角标 → 选会话 → 跳转;点进会话后该条未读自动清除

若要长期跟进某次完成结果:打开角标列表,点行右侧 ☆ 标记待办,稍后再从同一入口处理。

工作原理(与 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,安装前心里有数):

  1. 无法在单个「项目行」上打红点,提示集中在侧边栏底部。
  2. 仅展开项目不会清除未读;须点进会话或该会话再次开始运行。
  3. 系统通知依赖通知权限。
  4. 若目标会话所属项目被你手动收起,点列表条目时不会替你展开项目,只会滚到并高亮该项目行。

结尾

dsh-session-notify 把「后台会话完成」从被动排查变成角标 + 通知 + 列表跳转,并用手动待办兜住「稍后再看」的场景。多项目并行用 DSH 时,可先按上文在 App 或对应 profile 安装启用,再用「A 跑任务、B 继续干活」走一遍验证。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye