前言¶
在 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 插件市场安装¶
- 在 DSH Web 侧栏打开 Plugins,在 Experimental plugins 旁选 More,开启 Custom plugin markets。
- 在 Discover 添加索引源:
https://silentforfar.github.io/dsh-market-index/index.json
- 在列表中找到 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,以便安装可复现。
典型用法¶
- 安装并启用 bundle 后,在侧栏某条会话行点「…」或右键该行,使用导出记录、打开工作目录、未读标记或永久删除。
- 需要彻底从列表移除且保留可恢复副本时,确认无存活 Agent 后使用永久删除,或执行
/purge-session <session-id>。 - 分叉较多、标题重复时,拉宽侧栏查看
⤷ 分叉自 …与同名 ×N胶囊,靠悬停区分副本。 - 自定义会话持久化根目录时,在插件配置中填写
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。