前言¶
在 DeepSeek Harness(DSH)里,工作区侧栏会列出大量会话。鼠标悬停在某一行时,行尾会出现一排快捷操作;其中不少能力藏在「…」菜单里,需要多点一次。官方把各按钮的 order 写死在行组件里,没法按个人习惯把「归档」「分叉」等菜单项提到悬浮条上,也没法调整它们的出现顺序。
下面介绍社区客户端插件 dsh-session-row-actions(维护者 railgun20001):用可勾选、可拖拽的配置,重绘悬停时的那一排按钮;行上右键仍可打开官方完整菜单。配置入口在「插件管理 → 本插件详情页」,不在「设置 → 通用」。
这是什么¶
dsh-session-row-actions 是 DSH 的 web 客户端半插件(@deepseek-ai/dsh-client-ui-workspace 注入,immediately: true)。当前 npm 包版本为 0.5.1,许可证 MIT,GitHub 星标为 0(以仓库页面为准)。
它解决的是侧栏 会话行尾悬浮操作区 的展示与顺序问题:官方「…」菜单里的动作可以勾选成悬浮按钮并排好序;默认勾选「归档」「分叉」。简介里提到的「置顶会话换成分叉会话」指的是:在可配置的悬浮条里,你可以用「分叉」等菜单动作替代原先行尾那套固定布局,而不是删除官方菜单里的「置顶」——置顶、重命名仍通过官方菜单条目触发。
核心功能¶
悬停条与右键菜单的分工¶
悬停一行会话时,行尾显示的是你配置的那排按钮。默认示例(README)如下:
悬停一行会话 → (…) 归档会话 分叉会话 ← 默认:只勾了「归档」「分叉」
在行上右键 → 官方「…」菜单(置顶 / 重命名 / 分叉 / 归档 / 复制 Session ID)
「更多(…)」在悬浮列表里 位置固定:永远在第一行、也永远在悬浮条最前,不能拖动也不能从列表移除,只有勾选框控制显隐(单独存为 moreVisible)。列表下方说明:在会话行上点右键也能打开同一套菜单。
插件管理页的两个列表¶
路径:插件管理 → 会话行悬浮按钮(本插件详情页)。界面是两个 各自独立排序 的列表:
| 列表 | 内容 | 操作 |
|---|---|---|
| 悬浮按钮 | 第一行固定是「更多(…)」,其余是已勾选的动作 | 「更多」只可切显隐;其余可拖动排序、取消勾选即移出 |
| 更多菜单 | 置顶 / 重命名 / 分叉 / 归档 / 复制 Session ID(不含「更多」) | 勾选即加入悬浮按钮;拖动只影响这个列表 |
要点:
- 两个列表的数据分别是
hoverOrder与menuOrder,拖动一个不会改动另一个。 - 勾选时按
menuOrder的相对位置插入hoverOrder;之后可在悬浮列表里再拖。 - 菜单列表的排序 不会 改变系统自带菜单的排列。
实现上做了什么(便于排查问题)¶
插件通过样式隐藏官方插槽里的默认按钮,再按配置渲染整排;官方「更多」触发器收成 0 宽但留在 DOM 里,作为菜单锚点。右键用 window 捕获 mouseup(button 2)去点官方触发器,避免本应用里 contextmenu 不可靠以及菜单被遮罩立刻关掉的竞态。
- 置顶 / 重命名:打开官方菜单再点对应条目(
uiWorkspace未直接暴露这两项 API)。 - 分叉 / 归档 / 复制 Session ID:调用
uiWorkspace.forkSession、archiveSession/unarchiveSession、navigator.clipboard等已有契约。
偏好保存在浏览器 localStorage 键 dsh-session-row-actions/prefs-v4({ menuOrder, hoverOrder, moreVisible }),改完即时生效,无需重启;v1–v3 旧数据会自动迁移。
插件作者记录的两条插槽契约值得留意:侧栏行动作插槽须用 ctx.slots.inject 而非过早 register;所有注册包在 try/catch 里,避免 apply 失败导致整窗无法启动。
安装与启用¶
DSH 生态按「一切皆插件」组织;SkillHub 是社区目录站点,与 DeepSeek / 幻方无官方从属关系。该插件在目录页的「发送给 DeepSeek Harness 安装」会给出一段自然语言指令,大意是:
请安装 DSH 插件 railgun20001/dsh-session-row-actions。
把目录页上的 完整 安装说明复制给当前 Harness 会话,或按你本地 DSH 已支持的插件安装方式添加 railgun20001/dsh-session-row-actions(README 与 package.json 未给出单独的 shell 一行命令,请勿自行拼接未在文档出现的 dsh plugin add 参数)。
启用后,在 插件管理 打开本插件详情页即可看到「会话行悬浮按钮」配置区块(keyed 插槽 plugins.bundle.config,包名 dsh-session-row-actions)。
典型用法¶
- 打开 插件管理 → dsh-session-row-actions → 会话行悬浮按钮。
- 在 更多菜单 列表勾选希望出现在悬停条上的动作(例如「复制 Session ID」)。
- 在 悬浮按钮 列表拖动已勾选项,调整悬停时的从左到右顺序;不需要「…」时取消「更多」的勾选(仍可右键出菜单)。
- 回到侧栏,悬停任意会话行,确认行尾按钮与配置一致;在行上 右键,确认官方五项菜单齐全。
维护者在 2026-10-23 的验证记录:本地 node test/client-half-test.mjs 通过工厂、插槽、两个列表、勾选、排序、分叉权限与 v1 迁移;隔离 profile 下浏览器中配置即时生效,默认悬浮条为「归档」「分叉」。
仓库自测命令(开发或审源码时):
node test/client-half-test.mjs
要求 Node >= 20(见 package.json 的 engines)。
适用场景与注意¶
适合谁:长期在 DSH web 客户端管理大量会话、希望把常用动作固定在悬停条、并保留官方菜单与确认弹窗(置顶、重命名)的开发者。
注意:
- 本插件是 客户端模块,在浏览器侧运行,读写本地
localStorage;不 import Harness 客户端包,只依赖主题令牌与 DOM 稳定标记,DSH 大版本升级后若侧栏 DOM 或插槽变更,可能需要等插件更新。 - 插件与当前 DSH 进程/浏览器上下文 同等权限;安装前应阅读 GitHub 源码 与 MIT 许可证,确认可接受后再启用。
- 问题反馈可走仓库 Issues。
结尾¶
dsh-session-row-actions 把侧栏会话行悬停操作从固定布局改成可配置的一排按钮,并用右键保留官方「…」菜单完整能力;配置集中在插件详情页,改完即生效。