dsh-session-menu:侧栏会话菜单与列表增强

前言

在 DeepSeek Harness(DSH)里,侧栏会话行自带的「…」菜单只覆盖置顶、重命名、分叉、归档等宿主能力;导出整段会话记录、在资源管理器里打开工作目录、本机未读标记,以及把会话日志移入回收站而不是依赖「没有删除 API」的持久化层,都需要额外扩展。分叉出来的新会话在列表里和普通会话外观相同,工作区下超过 5 条会话还会被折叠成「展开其余 N 个」。Session menu extras(@silentforfar/dsh-session-menu,维护者 Silentforfar,MIT)是一个面向 DSH 桌面端的客户端 bundle,在会话上下文菜单上补这几项动作,并附带右键打开同一菜单、列表常开、分叉与同名副本标记等侧栏行为调整。

这是什么

插件在 SkillHub 目录 归类为客户端;GitHub 仓库为 Silentforfar/dsh-session-menu。README 中的定位是:给侧栏会话行的「…」菜单增加导出记录、打开工作目录、标记未读/已读、永久删除,并在未读会话标题前显示小圆点。

运行环境要求:Desktop(Windows / macOS / Linux)版 DSH 0.2.1-rc.2 或更新(package.json 中 engines.dsh 为 >=0.2.1-rc.2)。当前资料中的版本号为 0.1.1。

核心功能

上下文菜单四项

下面四项按宿主已有菜单顺序插在复制 Session ID(450)之后,本插件使用 460 / 470 / 500 / 600 等序号(README 未逐项写死文案与序号对应关系,以安装后菜单为准)。

菜单项 行为
导出记录 下载 dsh-session-<id>.zip(会话、子会话、附件),经 Host 的 /api/session.export
打开工作目录 在资源管理器中定位该会话的 cwd;仅桌面端,且会话有关联目录时出现
标记为未读 / 标记为已读 本机未读标记;未读时标题前有小圆点;切换到该会话后自动清除
永久删除 二次确认后将会话日志目录移入 DSH 回收站,列表行立即消失

永久删除不是 unlink:日志目录被移动到 <DSH_HOME>/trash/sessions/(Windows 上资料示例为 %USERPROFILE%\.dsh\trash\sessions/<时间戳>-<id>/)。子会话不级联删除;内容寻址的附件可能被多会话共享,不会被回收。若修改过持久化根目录,需在插件配置中设置 sessionRoot,否则会提示未找到日志目录。

也可在输入框直接执行:

/purge-session session-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

会话 ID 由命令参数给出,不是「当前会话」。若该会话仍有存活的 Agent,命令会拒绝执行。

右键打开与「…」相同菜单

在侧栏会话行上右键,会打开与点击右侧省略号相同的气泡菜单(含本插件新增项)。DSH 未提供行级右键扩展点,插件在 document 捕获阶段监听 contextmenu,命中 [data-row-key^="session:"] 时阻止默认菜单并触发该行菜单按钮,菜单位置在省略号处而非鼠标处。空白新建行、工作区行及其它区域不拦截。

会话列表始终展开

工作区下默认只显示 5 条会话,其余通过「展开其余 N 个会话 / 收起」折叠。本插件用 MutationObserver 监视 button[data-row-key^="overflow:"][aria-expanded="false"] 并自动点击展开;再用样式隐藏展开后的「收起」按钮:

button[data-row-key^="overflow:"][aria-expanded="true"]{display:none!important}

切换面板或折叠侧栏导致会话树重挂载时,可能再次出现约 300ms 的展开动画。

分叉来源与同名副本标记

分叉会话带有父会话到分叉时刻的整段事件历史,列表外观却与普通会话相同。插件在标题后插入胶囊标记:

胶囊 条件 含义
⤷ 分叉自 <父标题>(窄栏仅 ⤷) 存在 parentId(Host parentSessionId)且非子代理 标明分叉来源;悬停说明复制历史
同名 ×N(窄栏仅 ×N) 超过 1 个非空会话共用同一标题 悬停说明各自独立日志

数据来自 ctx.sessions.list.getSnapshot().byId[id].parentId,不额外请求。origin === 'subagent' 的子代理不显示分叉胶囊。行宽小于 360px 时用紧凑形态,完整文案在 title 悬停中;侧栏拉宽(≥ 360px)后展开全文。

未实现项及原因(README 说明)

在新窗口中打开、移动到分组、开始侧边任务等未做:Web 端无会话深链;分组即工作区且无单会话迁移接口;右侧栏无「侧边会话」对象。

安装与启用

从 DSH 插件市场安装

  1. 在 DSH Web 侧栏打开 Plugins,在 Experimental plugins 旁选 More,开启 Custom plugin markets。
  2. 在 Discover 添加索引源:
https://silentforfar.github.io/dsh-market-index/index.json
  1. 在列表中找到 Session menu extras(@silentforfar/dsh-session-menu)并安装。

从仓库直接安装

将下列 spec 传给 plugin_manager 的 install_bundle(或你 profile 里等价的 bundle 安装入口):

git+https://github.com/Silentforfar/dsh-session-menu.git#<commit-sha>

<commit-sha> 须为本仓库历史的完整 40 位 commit SHA,以便安装可复现。

典型用法

  1. 安装并启用 bundle 后,在侧栏某条会话行点「…」或右键该行,使用导出记录、打开工作目录、未读标记或永久删除。
  2. 需要彻底从列表移除且保留可恢复副本时,确认无存活 Agent 后使用永久删除,或执行 /purge-session <session-id>。
  3. 分叉较多、标题重复时,拉宽侧栏查看 ⤷ 分叉自 … 与 同名 ×N 胶囊,靠悬停区分副本。
  4. 自定义会话持久化根目录时,在插件配置中填写 sessionRoot 后再使用永久删除。

适用场景与注意

适合长期在桌面端 DSH 中管理大量会话、需要导出 zip、快速打开 cwd、本机未读提醒,或在不依赖 Host 删除 API 的前提下把日志移入回收站的开发者。

插件以当前 DSH 进程权限运行;安装前应阅读 仓库源码 与 MIT 许可证。社区插件市场索引由维护者托管,与 DeepSeek / 幻方无官方从属关系。

Host 端实现分布在 index.js(/purge-session)、purge.js(目录定位与移入回收站)、client.js(菜单与未读圆点);客户端通过 cordis.patch.yml 注入,并依赖 @deepseek-ai/dsh-client-ui-workspace。

结尾

@silentforfar/dsh-session-menu 把导出、Reveal 工作目录、未读态和可恢复的永久删除接到会话菜单上,并改善列表展开与分叉/同名辨识,补足宿主菜单与持久化层刻意留空的缺口。目录页:SkillHub - dsh-session-menu;源码与完整说明:GitHub - Silentforfar/dsh-session-menu。

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

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

Xiaoye