前言¶
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
功能¶
侧栏分为「置顶」和「最近」两栏,各自独立滚动。置顶过的会话不再出现在最近列表中,新置顶的排在最前。
会话管理¶
在任意会话行上,悬停会出现图钉图标 📌,点击即可置顶或取消置顶。置顶栏中的图标为品牌蓝色实心。
右键、双击或点击行尾的 ⋯ 按钮,会弹出包含以下选项的菜单:
- 置顶 / 取消置顶:将当前会话移入置顶栏。
- 重命名:调用
ctx.sessions.binding(id).session.rename()。 - 标记为未读 / 已读:标记状态,行左侧出现橙色条。
- 归档:调用
ctx.workspaces.archiveSession()。 - 分叉:调用
ctx.sessions.fork()并打开子会话。 - 复制:支持复制会话链接、标题或 ID 到剪贴板。
- 在新窗口打开:通过
?session=<id>深链打开。 - 在文件管理器打开:调用官方
POST /open-in-app/open路由。
工作区管理¶
工作区行同样支持右键、双击或 ⋯ 菜单。功能包括:
- 置顶工作区:调用
ctx.workspaces.insertBefore()将工作区移至首位。 - 重命名:调用
ctx.workspaces.rename()。 - 新建会话:调用
ctx.workspaces.startSession()。 - 复制路径:复制路径到剪贴板。
- 在文件管理器打开:调用官方路由。
- 删除工作区(含磁盘):这是一个特殊功能。由于渲染进程没有文件系统权限,该操作通过 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)导入数据,导入成功后删除旧键。
注意事项¶
- 删除会话限制:插件未实现「删除会话(含磁盘记录)」功能,依赖第三方插件或需修改核心代码。
- 依赖项:侧栏布局依赖原生 DOM 的
role="tree"、class(如sessionRow、groupSection)以及 React Fiber 结构。如果 DSH 更新导致这些底层结构变化,插件可能失效。 - 权限:插件以当前 DSH 进程权限运行,安装前应检查源码与许可证。
总结¶
dsh-sidebar-pins 通过统一的渲染和菜单逻辑,解决了 DSH 侧栏管理碎片化的问题。它提供了 Codex 风格的置顶体验,以及覆盖所有行的完整右键菜单。对于需要频繁管理会话和工作区顺序的开发者,这是一个直接的效率提升工具。