dsh-sidebar-pins:Codex 风格的侧栏置顶与全行右键菜单

前言

DeepSeek Harness(DSH)的侧栏管理通常需要组合两个插件才能实现基础功能:一个负责「置顶/最近」两栏,另一个负责右键菜单。这种拼凑方案存在两个问题:第一,两栏插件会隐藏官方的会话行并自行渲染;第二,菜单插件基于官方行查找 ID,导致在置顶行上菜单静默失效。dsh-sidebar-pins 将这两项功能合二为一。它自行渲染置顶栏,同时解析官方行并写入 data-dsh-pins-id 属性,两者共享同一个菜单实现,确保所有行都能使用完整功能。

安装

使用 DSH CLI 安装该插件。

dsh plugin --profile desktop add github:boyl/dsh-sidebar-pins

Web 版 profile 请将 desktop 替换为 web。安装后需重启 DSH Desktop(bundle 层仅在启动时组合)。卸载时执行:

dsh plugin --profile desktop remove dsh-sidebar-pins

功能

侧栏分为「置顶」和「最近」两栏,各自独立滚动。置顶过的会话不再出现在最近列表中,新置顶的排在最前。

会话管理

在任意会话行上,悬停会出现图钉图标 📌,点击即可置顶或取消置顶。置顶栏中的图标为品牌蓝色实心。

右键、双击或点击行尾的 ⋯ 按钮,会弹出包含以下选项的菜单:

  1. 置顶 / 取消置顶:将当前会话移入置顶栏。
  2. 重命名:调用 ctx.sessions.binding(id).session.rename()。
  3. 标记为未读 / 已读:标记状态,行左侧出现橙色条。
  4. 归档:调用 ctx.workspaces.archiveSession()。
  5. 分叉:调用 ctx.sessions.fork() 并打开子会话。
  6. 复制:支持复制会话链接、标题或 ID 到剪贴板。
  7. 在新窗口打开:通过 ?session=<id> 深链打开。
  8. 在文件管理器打开:调用官方 POST /open-in-app/open 路由。

工作区管理

工作区行同样支持右键、双击或 ⋯ 菜单。功能包括:

  1. 置顶工作区:调用 ctx.workspaces.insertBefore() 将工作区移至首位。
  2. 重命名:调用 ctx.workspaces.rename()。
  3. 新建会话:调用 ctx.workspaces.startSession()。
  4. 复制路径:复制路径到剪贴板。
  5. 在文件管理器打开:调用官方路由。
  6. 删除工作区(含磁盘):这是一个特殊功能。由于渲染进程没有文件系统权限,该操作通过 Host 路由 POST /dsh-sidebar-pins/delete-workspace 实现。该路由包含严格的校验:只接受 workspaceId 和确认名称,拒绝危险路径(如 /、$HOME 等),并要求二次确认。

原生按钮接管

插件接管了官方行尾的 ⋯ 按钮。在捕获阶段拦截点击,弹出完整菜单。工作区行上的 + 新建会话按钮保持原生行为,不受影响。

数据存储

所有状态存储在浏览器的 localStorage 中,键名为 dsh-sidebar-pins.v1,结构为 { v, pinned[], unread[], pinnedWorkspaces[] }。

首次启动时,插件会从旧版插件(如 dsh-codex-pins.v1、dsh-workspace-menu:v1)导入数据,导入成功后删除旧键。

注意事项

  1. 删除会话限制:插件未实现「删除会话(含磁盘记录)」功能,依赖第三方插件或需修改核心代码。
  2. 依赖项:侧栏布局依赖原生 DOM 的 role="tree"、class(如 sessionRow、groupSection)以及 React Fiber 结构。如果 DSH 更新导致这些底层结构变化,插件可能失效。
  3. 权限:插件以当前 DSH 进程权限运行,安装前应检查源码与许可证。

总结

dsh-sidebar-pins 通过统一的渲染和菜单逻辑,解决了 DSH 侧栏管理碎片化的问题。它提供了 Codex 风格的置顶体验,以及覆盖所有行的完整右键菜单。对于需要频繁管理会话和工作区顺序的开发者,这是一个直接的效率提升工具。

项目地址:https://github.com/boyl/dsh-sidebar-pins

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

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

小夜