前言¶
DeepSeek Harness(DSH)的主界面一次只展开一条对话。当你同时开多个 session 并行改代码、跑测试、等审批时,侧栏只能告诉你「某条会话在跑或在等」——具体问到哪一步、排队里还有什么 prompt,必须点进那条会话才能看见。多标签来回切,既慢也容易漏掉「等你点选分支」这类 pending 问题。
下面介绍社区客户端插件 dsh-session-monitor(维护者 icrefin)。它在左侧边栏 Plugins 下方增加 Session Monitor 入口,用网格卡片把活跃与近期用过的 root session 摊在同一块面板里:实时 transcript、待答问题、下一 turn 队列和 composer,不必离开当前视图也能介入任意一条会话。
这是什么¶
dsh-session-monitor 是 DSH 的 客户端(browser-only) 插件:只注册一条侧栏项和一个 main 面板,不挂 host 路由、工具或事件监听;所需数据都来自客户端已有的 session / workspace / UI 投影。
- 仓库:github.com/icrefin/dsh-session-monitor
- 社区目录页:skillhub.cn/plugins/icrefin/dsh-session-monitor(独立社区站点,与 DeepSeek / 幻方无官方从属关系)
- 当前 package 版本:0.9.1(以仓库发布为准)
- 许可证:MIT
- 运行要求:Node.js ≥ 22.17,dsh ≥ 0.2.1-rc.5 且 < 0.2.2-0(见
package.json的engines)
一句话定位:为每个被监控的 session 提供一张「迷你控制台」——你在不看该会话主视图时,仍能读流式 transcript、答 pending、发 prompt、停 turn、改权限与模型,并管理 next-turn 队列。
核心功能¶
侧栏入口与网格卡片¶
安装并重启后,在左侧 Plugins 下点击 Session Monitor,中央区域变为固定高度的网格(非整页滚动文档),每张卡片对应 catalog 里的一条 非空 root session(子 agent 行和侧栏里的 provisional New Session 行默认不进网格;工具栏刚创建的空白 session 除外,直到首轮对话赋予标题)。
每张卡片在「你当前未打开该会话」时仍提供:
- 实时 transcript:你的 prompt、助手流式文本、工具调用及结果、审批/重试提示;随 session 写入更新。展示为紧凑摘要(工具行一行摘要;用户/助手消息全文;窗口约 60 行,更久历史仍在主对话视图)。
- Pending 问题或审批:可在卡片内直接作答(
InteractionCard)。 - Composer:向该 session 发送内容;若 session 正在运行,消息进入 next-turn inbox(无 Queue/Steer 切换)。
- Stop:运行中显示,通过该 session 的
cancel()停止当前 turn。 - 可点击标题:跳转到该 session 的主对话(
ctx.uiWorkspace.openSession(id);无导航服务时标题仅为普通标题)。 - 完成提醒:一轮运行结束且未读时显示绿色
done点;点击卡片任意处恢复为灰色 idle,下次运行再亮。 - 权限 preset:卡片上切换 Read Only、Workspace Write、Full access 等(
binding.session.command('/permission ')),无需打开主会话。 - Next-turn 队列:与 dock 一致的 Steer(运行中)、Edit、Discard。
- 模型:与 composer、
/model共用 model 目录,可在卡片同一行切换。 - 用量读数:token、prompt-cache 命中比例、上下文占用(与原生 composer footer 同源投影)。
- Remove:仅从监控网格移除;session 仍在侧栏运行,历史不受影响。
工具栏:密度、恢复与新建¶
- Card budget:同时展示 3–16 张卡片(默认 9),针对 idle/running;正在等用户的 session 不会被 budget 裁掉。
- Per row:每行 2–6 张,或 Auto(按约 260px 卡片宽度填满列);偏好写入浏览器
localStorage(键dsh-session-monitor:prefs)。 - Restore removed:把此前 Remove 的 session 全部加回网格。
- New Session:选择 Workspace 后创建 session(
ctx.sessions.create({ workspaceId })),监控页保持打开且不会重排已有卡片;有空间则新卡片在末尾,满格则占用最旧卡片格位。下拉默认最近使用 session 的 Workspace;末行 Choose a folder… 可调宿主文件夹选择器,将目录接纳为新 Workspace(ctx.workspaces.create({ path }))再建 session。取消选择器无变化;启动失败在工具栏显示宿主返回信息。
网格顺序(重要行为)¶
首次绘制时按 waiting → running → 最近活跃等规则 种子排序一次,之后顺序 冻结 并持久化到 localStorage:状态变化只更新卡片内容,不会因「刚变活跃」跳到前排;关闭面板或重启应用仍保持同一格位。新 session 占满时顶替最旧格,被挤出的卡片排到顺序尾部。没有任何控件会手动重排网格;缩小 budget 只是隐藏顺序尾部,放大后原格位恢复。
安装与启用¶
插件以 tarball 形式安装(README 未提供 dsh plugin add github:… 一类一键命令)。若你从发布包或本地源码目录获得 dsh-session-monitor,在目录内执行:
cd dsh-session-monitor
pnpm install
pnpm check
scripts/install.sh # 构建、打包,并打印 tarball 路径
install.sh 会输出 tarball 路径。接着:
- 桌面 Electron profile:在应用内 Settings → Plugins 安装该 tarball(README 写明这是桌面 profile 受支持的路径)。
- CLI 管理的 profile:使用
dsh plugin --profile add <tarball路径>(将<tarball路径>换为install.sh打印的实际路径)。 - 重启应用。README 说明:向运行中的 profile 添加 bundle 时,会在下次启动导入。
安装前请自行查看仓库源码与 MIT 许可证;插件逻辑在浏览器端执行,但仍依赖你当前 DSH 进程与 profile 的权限边界——与任何 DSH 插件一样,只安装你信任的来源。
典型用法¶
- 并行开多条 session(例如一条跑测试、一条写 release notes、一条等分支选择)。
- 打开 Session Monitor,在网格里扫一眼:哪条是
waiting、哪条在working、transcript 停在哪句。 - 对 waiting 卡片直接在面板里答 pending(例如选题
( ) main / ( ) next),无需切标签。 - 对仍在跑的 session,在卡片 composer 里追加指令(进入 next-turn inbox);需要时用 Steer 调整队列里尚未发送的消息。
- 点击卡片标题进入该 session 主视图做长文阅读;或留在网格里用 Stop 中止 runaway turn。
- 卡片过多时用 Remove 隐藏不关心的 session,需要时用 Restore removed;调 Card budget / Per row 适配屏幕。
开发调试时,仓库提供 scripts/dev-profile.sh:隔离 profile 启动侧栏项并伺服 /plugins/dsh-session-monitor/client.js(见 README「验证结果」一节)。
适用场景与注意¶
适合谁
- 经常在 DSH 里 多 session 并行、且会被 pending 审批打断的开发者。
- 希望 少切对话页、但仍要看到各 session 最新几轮 transcript 和队列的人。
需要注意
- 插件 仅客户端行为;不替代侧栏 session 列表,Remove 只影响监控网格。
- 网格顺序冻结是产品设计:不要期待「最活跃 session 自动置顶」。
- README 写明 未在自动化里验证实际像素(浅色/深色、窄宽度布局等),视觉细节需你在本机确认。
- 修改行为前,维护者在仓库 HANDOFF.md 中记录了架构、数据源与坑点,二次开发应先读该文件。
结尾¶
dsh-session-monitor 把 DSH「一次只看一条对话」的限制补成「一屏多张 live 卡片」:transcript、pending、队列与 composer 集中在一个 Session Monitor 面板里,适合多路并行又不想到处点侧栏的场景。