前言¶
DSH 跑一段时间后,左侧对话列表里往往堆着一堆会话:跑完没关的、跑挂了半途的、几周没碰但上下文还热着的。原生列表只回答”有哪些会话”,不回答”哪个最烧 token”“哪个快到上下文上限”“我想把一句话派给那个跑了一半的会话,怎么派”。日常做法是逐个点开看状态,或者靠标题和目录名脑子里记,规模一大就不现实。
onlyinliu/dsh-session-console 是社区维护的客户端插件,维护者 onlyinliu,分类”客户端”。它把这张列表扩展成一张覆盖全部会话的仪表盘:读全局状态、用一句自然语言定位某个会话,并把一句任务投递到那个会话里并读回结果。下面介绍它实际暴露的能力、安装方式和用法。
这是什么¶
插件在 DSH 侧栏放一个图标,点开是主面板。README 的定位是”左侧对话管理员”。它解决三个本来要手工完成的动作:翻会话看状态、凭目录名找会话、切到别的对话里发话。
插件市场条目(awesome-dsh-plugin)把它的简介写成:覆盖每个会话的仪表盘、自然语言会话定位、跨会话任务投递。仓库当前 10 个文件在 main,topics 含 dsh-plugin;npm 包名 dsh-session-console,当前 latest 为 0.1.1(2026-11-04 发布,内容是兼容性修复)。插件市场目录页给的星标数是 0。这个插件是社区自发维护的,与 DeepSeek / 幻方没有官方从属关系。
仪表盘:读全局¶
主面板列出全部会话,每行显示一批指标:
| 指标 | 含义 |
|---|---|
| 会话总数 / 运行中 / 冷会话 / 空白 | 全局状态分布 |
| 累计 token(输入 / 输出 / 缓存读 / 缓存写) | 来自 tokenUsage projection,不扫描归档 |
| 缓存命中率 | cacheRead ÷ (input + cacheRead + cacheWrite) |
| 今日活跃 / 本周活跃 | 按会话最后活跃时间分桶 |
| 上下文压力 | 来自 contextPressure projection,显示 pressureTokens ÷ contextWindow 的百分比 |
| 模型 | 来自 modelSelection projection 的 next(已合并 pending),显示 provider/model |
| 热度 | 100/(1+静默小时/6) + log10(1+token)*8 + log10(1+事件)*5 + 运行中40 |
| 最热 / 按工作区聚合 | 谁在烧 token、哪个目录最忙 |
列表支持 全部 / 运行中 / 今日 / 冷会话 / 空会话 过滤,可按热度、消耗、最近排序,并提供标题与路径的即时过滤。数据来自 DSH 已有的 projection 与 session header,不做归档扫描,开销集中在本进程。
指代:用一句人话定位会话¶
“指代与派任务”输入框里输入一句自然语言,例如 示例项目的相关内容怎么样了,插件的处理分四步:
- 剥掉「怎么样了 / 情况 / 进度 / 相关 / 内容 / 帮我 / 看看」这类口头语,留下主语
示例项目; - 拿主语比对每个会话的标题、
cwd、目录末段、agent preset、会话 id,权重分别为 6 / 4 / 3 / 1 / 1; - 子串命中给满权重加成,其余用 CJK bigram 加拉丁词的 Dice 相似度;
score ≥ 40且不存在跨工作区的同分对手才算”锁定”,否则列出候选让你点。
比对用的是会话 header 里的真实 cwd,不是归档目录那串 ~6570~636E~… 编码名,所以目录叫 示例项目-v2 时,一句「示例项目」也能对上。同工作区里分数相同的兄弟会话不算歧义,直接取热度最高的一个;只有跨工作区出现同分对手才判为歧义并列出候选。
派任务:把一句话写进别的对话¶
选定目标后写一句话,两种投递方式:
queue(排队):作为下一轮输入排进去,目标对话空闲时立刻跑;steer(打断插入):如果它正在跑,就把这句插进当前这一轮。
走的是 UI 输入框同一条通道(sessionController.prompt),所以冷会话会自动恢复,消息也会持久化。派完后可以在详情卡里读最近的用户 / 助手消息、轮次 / 工具调用 / 工具失败 / 异常轮次统计、最后一次失败原因,也可以一键跳到那个对话看完整上下文。
安装与启用¶
已发布到 npm:
plugin_manager install_bundle target=dsh-session-console
也可以直接从 GitHub 装:
plugin_manager install_bundle target=github:onlyinliu/dsh-session-console
开发时从本地目录装(改动即时生效):
plugin_manager install_bundle target=D:\create\dsh-session-console
装完重开一次 DSH,侧栏才会出现图标。包名和 github: 两条来自 README 原文,不要凭插件名自己拼接命令。
两个已知安装问题,README 对原因有说明:
- 按包名装报
declares no dsh.bundle:镜像还没同步到最新版,解析到了 npm 侧发布时留下的0.0.0-stage占位版本。解法是把安装源切到 npm 官方源,或改用github:onlyinliu/dsh-session-console。镜像的latest同步到0.1.1后重试即可。 - 装的时候报
incompatible-version:装到的是0.1.0。它的engines.dsh上界写成<0.2.2-0,按 semver 预发布规则0.2.2-rc.1大于0.2.2-0,于是被判不兼容;0.1.1已把上界放宽到<0.3.0-0。
0.1.1 的声明是:
"engines": { "node": ">=18", "dsh": ">=0.2.0-rc.2 <0.3.0-0" }
需要留意 DSH 装载插件时的判定行为:只要清单声明了 engines.dsh 就只认它,peerDependencies 里那些 @deepseek-ai/dsh-* 会被忽略,比较时带 includePrerelease: true。所以上界写成 <0.2.2-0 这种带 -0 的形式,等于每次 DSH 发新 rc 都会被判成不兼容,这正是 0.1.0 在 0.2.2-rc.1 上装不上的原因。已有旧版想升级:当初用包名装的可以在设置 → 插件 → 条目详情页用「更新」;从本地目录 / link: / github: / tarball 装的没有「更新」入口,先移除再重新添加。README 也说明,已装同名包时 install_bundle 直接报 already-installed,写精确版本绕不过去,必须先移除再装。仓库里的 tools/compat-check.mjs 可以脱离 DSH 复刻这个判定:
node tools/compat-check.mjs package.json
# dsh-session-console@0.1.1 engines.dsh = ">=0.2.0-rc.2 <0.3.0-0"
# dsh 0.2.2-rc.1 compatible
# ...
# ALL_COMPATIBLE
典型用法¶
下面这段是 README 给的流程,可以理解成一次完整操作。
- 打开侧栏图标进入面板,用过滤和排序找到目标会话;不确定是哪个时,在「指代与派任务」输入一句自然语言,例如
示例项目的相关内容怎么样了,看候选是否锁定。 - 锁定后写一句要说的话,选择
queue或steer。目标会话如果处于冷状态会自动恢复。 - 在详情卡里读最近的用户 / 助手消息和轮次 / 工具调用 / 工具失败 / 异常轮次统计,失败时看最后一次失败原因。需要完整上下文就点跳转到那个对话。
Host 侧暴露了同源 HTTP 路由(仅回环地址可访问)和聚合入口,客户端面板通过这些路由取数。除了侧栏面板,插件还注册了 5 个给 agent 用的 tool,具体名称和参数以仓库 lib/index.js 为准。
适用场景与注意¶
适合手里同时开着多个 DSH 会话、需要按工作区或主题快速定位、并且希望临时往别的会话里派活的开发者。它的读操作覆盖全局 token 用量和上下文压力,可以减少逐个点开看状态的负担;派任务走的是 UI 输入通道,冷会话会恢复,消息持久化。
用之前要清楚两点:
- 插件以当前 DSH 进程的权限运行,能看到全部会话的统计信息,也能向别的会话投递输入。安装前应先读一遍源码,确认路由和 tool 的暴露范围符合预期。
- 许可证是 MIT(来自
package.json),发布凭据和内部 token 都不在仓库里,不属于本插件引入的内容。
另外注意发布节奏:插件市场的国内区域优先读 npm 包 dsh-plugin-catalog,它只在 build-site 的 schedule / workflow_dispatch 分支发布,所以国内目录最迟可能滞后到次日夜间。急着看可以在「市场设置 → 下载区域」切「全球」,或直接把安装源写成 npm 官方源。
结尾¶
这个插件的价值在于把”翻列表找会话”这件高频小事做成一张静态总览,再配一句自然语言定位和一条跨会话投递通道。好处是显见的:少点几次、少切几次窗口。不适合的场景也清楚:只需要一两个会话、或者工作流本来就靠命令行管理的,收益有限。