dsh-sidebar-overlay:在官方浮层座位上独立渲染的折叠态侧边栏

前言

在 DeepSeek Harness(DSH)里把官方侧边栏收起来,往往意味着工作区与会话列表也跟着藏进窄条或图标里。社区里较早的浮动侧边栏方案(例如 dsh-floating-sidebar)通过复用官方侧边栏 DOM 并覆盖 grid,让鼠标贴边时能「浮出」列表,但中栏会在开合时整体重排,动画也只能动 left,每帧触发布局。

dsh-sidebar-overlay 换了一条路:不碰官方侧边栏列,也不改官方 grid,而是在官方 shell.overlay 浮层座位上自建一套工作区与会话浏览 UI。下面介绍它是什么、能做什么,以及如何安装与日常使用。

这是什么

dsh-sidebar-overlay 由维护者 blockman0321 发布,分类为客户端插件(npm 包名 dsh-sidebar-overlay,当前版本 0.1.0,MIT 许可证)。一句话定位:在侧边栏折叠时,鼠标移到窗口左侧对话区下方的一段热区,会浮出一张宽 280px 的卡片(工作区 + 会话列表),覆盖在内容之上,不挤压中栏;指针离开热区或窗口即收回。

数据与写操作走 DSH 官方公开的 root hooks 与服务(useSessions、useWorkspaces、ctx.uiWorkspace 等),不抓官方侧边栏 DOM,也不依赖官方哈希类名选择器。

架构上解决了什么

与 dsh-floating-sidebar 相比,本插件的差异可以概括为:

维度 旧方案(CSS 覆盖) dsh-sidebar-overlay
承载方式 改官方列 + 覆盖 grid 注册 shell.overlay
官方 grid 开合时被覆盖 不触碰
中栏重排 有 无(README 称开合全程 grid 取值不变)
动画 多为 left(layout) transform(合成)

官方 sidebar / sidebar.workspaces 是 single 座位,第三方不能重复声明;因此浮层里的列表是自建 UI,而不是把官方侧边栏 DOM 搬过来。其他插件挂在官方侧边栏上的扩展位(例如 sidebar.workspaces.session.menu.item)不会出现在本浮层里——这是 slot「声明即认领」规则带来的已知限制。

核心功能

以下能力均来自插件 README 中的功能清单与说明。

浮层交互与热区

  • 默认仅在侧边栏折叠时浮出(onlyWhenCollapsed: true 可改)。
  • 热区上边界为对话内容容器顶边(对话区 header 下方);标题栏、对话/轨迹 tab 等不在热区内。
  • 热区右边界为「窗口左缘 → 对话内容列左缘」留白的 40%(triggerRatio,可配置);例如 1020px 宽窗口下内容列左边缘 170px 时,热区约为 0..68,而不是贴边 24px 窄带。
  • 几何在冷路径重测(初始、resize、开合瞬间、指针在热区外时最多每 500ms),热路径读缓存,减轻 pointermove 上的布局压力。

顶栏

  • 左侧个人信息(头像):点击直接打开官方设置弹窗,不弹账户菜单,因此没有「联系我们 / 退出登录」。账户数据来自 settings.launcher 的 account observable;打开设置走 sidebar.settings 条目的 store.create().actions.open()。README 明确警告:不要用 ctx.shortcuts.invoke('settings.open'),会静默失败。
  • 右侧「新会话」按钮,带快捷键提示;可用 showProfile / showNewSession 单独关闭。

工作区与会话

  • 工作区分组:按工作区 / 按工作区树 / 单列表,可切换并持久化到 localStorage(键 dsh.floatingSidebarOverlay.view.v1)。
  • 新建、重命名、删除工作区,拖拽排序,添加目录;「未分组」桶行为与官方一致(无「…」菜单与新建会话按钮,且仅在可见成员非空时显示)。
  • 会话行:状态点、标题、相对时间、置顶、hover 操作(菜单 → 归档 → 置顶);打开、重命名、分叉、置顶/归档及「停止并归档」确认等,语义对齐官方。
  • 搜索:本地标题与工作区名匹配,远端内容搜索 250ms 防抖;视图选项菜单支持排序、筛选已归档等。

视觉

  • 优先 require 官方 @deepseek-ai/dsh-client-ui-primitives 的 Menu、Modal、Tooltip 等;缺失时逐项降级为内置最简实现。

安装与启用

插件已发布到 npm。在 DSH「插件」页点「添加插件」,输入包名 dsh-sidebar-overlay;或使用 CLI(Web profile):

# Web profile
dsh plugin --profile web add dsh-sidebar-overlay

# 其他 profile 把 web 换成对应名字;Desktop 内置 profile 请走图形界面,
# CLI 不允许管理 desktop profile。

装完后重启 DSH(启用 HMR 的 profile 会自动重组,不必重启)。package.json 声明引擎为 dsh ^0.2.0-rc.2,客户端为 web 平台且 immediately: true。

卸载可在插件页操作,或:

dsh plugin --profile web remove dsh-sidebar-overlay

然后重启 DSH;README 称会移除注入样式与相关 DOM 标记。

互斥:不要与 dsh-floating-sidebar 同时启用,否则会出现两个浮动侧边栏。

典型用法

  1. 用 Ctrl+B 或标题栏按钮折叠官方侧边栏。
  2. 将鼠标移到窗口左侧、对话区 header 下方的留白区域(热区左 40% 留白,见上表)。
  3. 浮层卡片出现后,照常浏览工作区、打开或管理会话;移出热区或窗口后卡片收回。

总开关默认快捷键为 Ctrl+Alt+L(可在配置里改 hotkeyBinding)。也可在浏览器控制台调用:

window.__dshFloatingSidebarOverlay.toggle()     // 切换
window.__dshFloatingSidebarOverlay.disable()    // 停用(回到官方行为)
window.__dshFloatingSidebarOverlay.enable()
window.__dshFloatingSidebarOverlay.isEnabled()
window.__dshFloatingSidebarOverlay.isOpen()

在 profile 的 cordis.patch.yml 中可覆盖插件条目 sidebar-overlay 的 config,例如热区比例、卡片宽度、是否仅在折叠时显示等:

- id: sidebar-overlay
  name: 'dsh-sidebar-overlay'
  config:
    enabled: true
    width: 280
    gap: 8
    radius: 16
    trigger: 'content'
    triggerRatio: 0.4
    closeSlack: 8
    animationMs: 180
    onlyWhenCollapsed: true
    groupBy: 'workspace'
    orderBy: 'updated'
    showNewSession: true
    showProfile: true
    hotkey: true
    hotkeyBinding: { code: 'KeyL', modifiers: ['primary', 'alt'] }

Desktop 的 patch 路径示例为 ~/.dsh/profiles/desktop/cordis.patch.yml;Web profile 将 desktop 换成 web。完整字段见 GitHub README。

适用场景与注意

适合谁:习惯折叠官方侧边栏、又需要频繁切换工作区与会话的 DSH Web 用户;希望浮层开合时不牵动中栏布局、并愿意使用一套与官方侧边栏并行、而非扩展官方 DOM 的列表 UI。

使用前请知悉:

  • DSH 插件在当前 DSH 进程权限下运行,安装前建议阅读 源码 与 MIT 许可证,自行判断是否信任维护者与依赖链。
  • 社区目录 SkillHub 插件页 是独立站点,与 DeepSeek / 幻方无官方从属关系,并非官方应用商店。
  • 不含官方 sidebar.panellist 的全局面板图标;依赖官方 hook 名与 primitives 模块,变更时可能降级为空列表并打控制台告警。
  • README 注明未在带 launch token 的真机 DSH Web 上完整端到端验证;真机可用 document.querySelector('[data-dsh-fso-card]') 自检浮层是否挂载。

结尾

dsh-sidebar-overlay 把「折叠后仍能快速浏览工作区与会话」做成独立浮层:注册官方 shell.overlay,自建 UI,读写官方公开数据契约,从设计上避开对官方 grid 与侧边栏 DOM 的改造。若你在用旧的 CSS 浮动侧边栏且介意中栏重排,可以评估迁移;安装时注意与 dsh-floating-sidebar 互斥,并按 profile 正确添加 npm 包。

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

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

小夜