dsh-sidebar-row-menu
Right-click menus for DSH sidebar rows: on DSH 0.2.2+ both rows use the host menus — workspace rows follow the session grouping (new session, copy path and reveal, pinned open-with apps, an open-with submenu, bulk delete) and session rows extend the menu that opens at the pointer with pinned open-wi
Install
dsh plugin --profile web add dsh-sidebar-row-menu
Sandbox test results
| Stage | Result |
|---|---|
| 1 install | ✓ |
| 2 list | ✓ |
| 3 mount | ✓ |
| 4 boot | — |
Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).
README
dsh-sidebar-row-menu
<img src="https://raw.githubusercontent.com/TLEWA/dsh-sidebar-row-menu/main/assets/icon-180.png" width="96" align="right" alt="插件图标" />


[简体中文](README.md) · [English](README.en.md)
给 DeepSeek Harness(DSH)左侧边栏加右键菜单:
- 工作区行:右键弹出菜单(DSH 0.2.2 起并入宿主原生菜单,条目按 order 与内置项交错);
- 工作区下层的会话行:右键在指针处展开该行自己的菜单,并追加本插件的条目。
DSH 0.2.2 把侧栏右键改成数据驱动:工作区菜单由宿主统一渲染,本插件按 order 把条目混排
进去;会话菜单仍由宿主渲染 slot 内容,右键也由宿主开在指针处。所以 0.2.2 上菜单的视觉、
行高、图标、危险色、键盘导航,以及“点外部关闭 / Esc 关闭”全部与内置菜单一致,本插件只
提供条目。0.2.1 及更早的宿主没有这套服务:工作区菜单仍由本插件用官方 MenuSurface +
MenuItemButton 自绘,会话右键仍由插件把行尾「…」菜单搬到指针处。
会话菜单的内容来自
sidebar.workspaces.session.menu.item slot —— 内置动作和其他插件的动作都在里面,
本插件只追加自己的条目,不复制、不硬编码任何内置动作。
本插件的条目默认只在右键展开时出现;设置 →「行菜单」→「菜单显示位置」可以逐项改成
只进「…」菜单、或两边都进(至少保留一边)。
0.2.2 上右键与「…」共用同一份宿主菜单,插件按“右键手势”区分:右键时打标,等菜单面板
真正挂载后才收尾;点「…」的按下事件会立刻清标,所以那个菜单只带设为「…」或「两边」的条目。
右键展开的菜单不会因为鼠标移出而关闭,只有点击外部、选中条目或按 Esc 才关闭。
功能
工作区行右键
0.2.2 上这份菜单由宿主渲染,本插件条目与内置「重命名」(100)、「在文件夹显示」(200)、
「删除工作区」(300)按 order 交错,分组规则与会话菜单一致:新会话 90、在新标签打开 110、
归档会话开关 130、复制工作区路径 150、置顶应用 210、打开方式 220、新会话默认权限 225、
删除工作区及所有会话 310。这些条目默认只出现在右键菜单;行尾「…」里的菜单保持原生,
想让它也带上插件条目,可在设置 →「行菜单」→「菜单显示位置」里逐项选择「…」或「两边」。
0.2.1 上整份菜单由本插件自绘,「重命名」「删除工作区」由插件调用官方对话框。
菜单项 · 行为
新会话 · 展开该工作区并新建会话(等价于行尾 +)
重命名(内置) · 打开官方“重命名工作区”对话框;0.2.1 上由本插件代为渲染
在新标签中打开 · 仅在装有 dsh-project-tabs(暴露 openWorkspaceInTab)时出现
显示 / 隐藏已归档会话 · 只在该工作区有已归档会话时出现,文案随当前状态切换。点击「显示已归档会话」会把侧边栏的全局归档筛选切到「全部对话」,再藏起其他工作区(含「未分组」)的归档行,于是只有这个工作区的已归档会话露出来;点击「隐藏已归档会话」把它重新收回。逐工作区的选择存在本地、刷新后保持;在「视图选项」里改全局筛选则以全局选择为准
复制工作区路径 · 复制目录路径到剪贴板
在文件夹显示(内置) · 在资源管理器里打开工作区目录;0.2.2 由宿主提供,0.2.1 上不出现
置顶的打开方式 · 被置顶的应用直接显示在一级菜单(例如「用 Visual Studio Code 打开」),点击后用该应用打开工作区目录
打开方式 · 二级菜单列出宿主提供的外部应用(编辑器、终端、文件管理器);与会话菜单共用同一套应用列表、置顶与开关设置,鼠标悬浮自动展开。宿主的菜单项不画二级箭头,本插件把标签渲染成「文字 + 右对齐箭头」,与会话菜单同一位置;0.2.1 自绘菜单画的是箭头图标
新会话默认权限 · 二级菜单列出宿主原生权限预设(仅可查看 / 工作区内修改 / 完全权限)。选中的预设成为该工作区下以后新建会话的默认权限,当前生效项右侧打勾;「跟随全局默认」清除本工作区的设置。只改新会话,不动已有会话
删除工作区(内置) · 打开官方删除确认对话框;只删除工作区登记,会话保留并归入「未分组」。0.2.1 上由本插件代为渲染
删除工作区及所有会话 · 先永久删除该工作区下的每个会话及其日志,全部成功后再删除工作区登记;任一会话删除失败则保留工作区,便于重试。工作区目录本身不删除
会话行右键
右键会话行不会另起一套菜单:0.2.2 由宿主把该行的原生菜单开在指针处;0.2.1 由本插件触发行尾
「…」菜单,并临时把它的锚点移到指针。两种情况下菜单内容都来自同一份 slot:
来源 · 条目
DSH 内置 · 重命名、分叉会话、置顶 / 取消置顶、归档 / 取消归档、复制 Session ID
其他插件 · 它们注册进 sidebar.workspaces.session.menu.item 的条目
本插件 · 置顶的打开方式(一级)、打开方式(二级菜单)、永久删除会话 / 删除所有已归档会话(默认仅已归档会话显示;可在设置里允许删除未归档会话)
本插件追加的条目:
菜单项 · 行为
打开方式 · 二级菜单列出宿主提供的外部应用(编辑器、终端、文件管理器),用会话自己的 cwd 打开;取不到时退回所属工作区目录
置顶的打开方式 · 被置顶的应用直接显示在一级菜单(例如「用 Visual Studio Code 打开」);未配置时自动置顶检测到的第一个编辑器,没有编辑器则置顶第一个应用。鼠标悬浮到「打开方式」会自动展开二级菜单
永久删除会话 · 默认只在已归档会话的右键菜单里出现;确认后永久删除这一个会话及其日志,不可恢复。在设置里开启「允许删除未归档会话」后,未归档会话也会出现这一项
删除所有已归档会话 · 只在已归档会话的右键菜单里出现;确认后永久删除全部已归档会话及其日志,不可恢复
「打开方式」的应用列表来自 DSH 内置的 open-in-app 路由,与 DSH 自己的「打开方式」
能力同源;应用名和图标都由本插件展示,可在设置里逐个隐藏,也可以把常用应用置顶到
一级菜单。两个删除入口由本插件自己的宿主路由完成,默认不会删除未归档会话;
开启「允许删除未归档会话」后才会对普通会话开放。删除不会级联删除 fork 子会话。
这些条目默认出现在右键菜单。想直接使用行尾「…」菜单,可以在设置 →「行菜单」→
「菜单显示位置」里逐项选择:
- 「…」菜单:条目只出现在行尾「…」打开的菜单里,右键菜单不再显示;
- 「两边」:右键和「…」都显示;
- 「右键菜单」:默认值,只在右键菜单里出现。
每个条目至少要保留一边,最后一边的开关会被锁住。会话条目与工作区条目(0.2.2)都走同一套
contextMenus provider,按手势标记决定当前是哪份菜单;工作区条目在 0.2.1 上由本插件接管
行尾「…」按钮自绘,规则一致。
草稿会话(还没有任何消息的空白会话)没有右键菜单,本插件同样不接管。
非工作区 / 非会话的侧边栏行(如“显示更多”)也不会被拦截。
会话正文右键
在会话正文里右键——空白处、思考过程、回复和工具摘要都可以(输入框、工具条和工具卡片
本身以外)——会弹出一份纵向菜单,把这排按钮按屏幕视觉顺序从左到右列出来,每项带
原按钮的图标:
- 装了
dsh-sidebar-organizer且调整过「会话头部工具条」时,菜单顺序跟随它的排序;
没装或没调整时就是 DSH 的默认顺序。organizer 用 CSS order 排序,DOM 顺序不等于
屏幕顺序,所以菜单是按 getBoundingClientRect() 的横坐标现算的;
- 「打开方式」按工作区 / 会话右键菜单的同一套规则收纳:置顶的应用直接显示成一级行
(如「用 Visual Studio Code 打开」),其余应用收进「打开方式 ›」二级菜单,悬浮或
点击展开;设置里的「打开方式」总开关、逐应用开关和置顶都对它生效,总开关关闭时这
一组整体不出现;
- 「更多操作」也不再点开右上角的「…」:和其它二级菜单一样在本菜单里展开,直接复刻
宿主那份菜单的条目(复制会话为 Markdown、下载 Session 日志、反馈……),选中即执行;
子菜单的行序同样跟随 dsh-sidebar-organizer——在「…」弹层里拖动过的顺序会写进
dsh.sidebar-organizer.host-menu-order.v1,这里按同一份顺序重排;
- 不同分组之间自动加淡色分隔线,菜单项的高度、内边距、圆角、13px 字号和 14px 图标
都与 DSH 原生右键菜单对齐;
- 「更多操作」一类的溢出入口固定放在最后一项(可在设置里关掉);被 organizer 收进
「更多操作」的按钮不会单独出现;
- 会话栏左上角的状态组件(
conversation.session.header.actions槽位:费用明细、
后台任务计数等)整体不列进菜单,设置里打开「显示左上角状态组件」后才出现。这条规则
按槽位判断、不认识具体标签,所以宿主或插件以后往这个槽位加的状态组件也默认隐藏;
- 点普通条目就是点原按钮:先关菜单,再把
click派发给宿主工具条里的那个按钮,所以
「查找」「展开底部面板」等弹出的仍是原生面板;
- 有选中文字时让位给浏览器的选区菜单;消息里的输入控件和链接也保留原生菜单;工具卡片、
输入框、工具条本身以及侧栏行同样保留各自的原生菜单;
- 找不到任何可用的工具条按钮(比如草稿会话或按钮全被隐藏)时,不接管原生菜单。
设置
设置 →「行菜单」里可以开关本插件的每个新增项:
开关 · 作用
打开方式 · 关闭后工作区 / 会话菜单以及正文右键菜单里不再出现「打开方式」和置顶应用
打开方式 → 应用 · 逐个隐藏应用;旁边的「置顶」按钮把应用移到一级菜单
永久删除会话 · 关闭后会话菜单里不再出现单条删除入口
允许删除未归档会话 · 默认关闭;开启后未归档会话的右键菜单也会出现「永久删除会话」,需先开启上一项
删除所有已归档会话 · 关闭后不再出现批量删除入口
显示已归档会话 · 关闭后工作区菜单里不再出现「显示 / 隐藏已归档会话」(默认开启;该项只在当前工作区存在已归档会话时出现)
菜单显示位置 → 工作区 · 逐项选择工作区行条目出现在右键菜单、「…」菜单,或两边:新会话、新会话默认权限、打开方式、复制工作区路径、在新标签中打开、归档会话开关、删除工作区及所有会话
菜单显示位置 → 会话 · 逐项选择会话行条目的显示位置:打开方式、永久删除会话、删除所有已归档会话
启用空白处右键菜单 · 会话正文(空白处、思考过程、回复)的右键菜单总开关(默认开启);关闭后该区域恢复浏览器 / 宿主的原生菜单
「更多」固定在最右 · 默认开启;把「更多操作」一类的溢出入口固定在菜单最后一项,不受工具条当前顺序影响
显示左上角状态组件 · 默认关闭;打开后会话栏左上角 conversation.session.header.actions 槽位里的组件(费用明细、后台任务计数等)也会列进正文右键菜单
「菜单显示位置」默认全部是「右键菜单」,所以未改动时 … 菜单与 DSH 完全一致。
DSH 0.2.2 起行尾「…」与右键共用同一份宿主菜单,插件条目按手势标记区分当前是哪份菜单;
设为「…」或「两边」的条目才会进入「…」菜单。0.2.1 上工作区行没有宿主菜单可贡献,
改由插件接管「…」按钮自绘,显示规则相同。
开关存在浏览器 localStorage(dsh.sidebar-row-menu.items.v1、
dsh.sidebar-row-menu.open-with.v1、dsh.sidebar-row-menu.open-with.pinned.v1、
dsh.sidebar-row-menu.placement.v1 与 dsh.sidebar-row-menu.blank-menu.v1),
改完立即生效,不需要重启。旧版的 dsh.sidebar-row-menu.ellipsis.v1(布尔值)会在首次加载时
自动迁移成「两边 / 右键菜单」。置顶项在第一次配置前是自动推导的:优先置顶检测到的第一个
编辑器(通常是 VS
…(truncated)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::20,最后更新 2026-11-06