dsh-two-pane-sidebar:为 DSH 侧边栏划出独立的插件导航栏

前言

在 DeepSeek Harness(DSH)里,侧边栏往往同时承担「新建会话、工作区、会话列表」和「插件入口(市场、任务、技能等)」两类导航。条目挤在同一列时,找会话和切插件都要在同一套列表里滚动或辨认。社区插件 dsh-two-pane-sidebar(维护者 A-Meng-E)的做法是:把插件导航挪到主侧边栏左侧一条固定窄栏(plugin rail),主侧边栏只保留会话与工作区相关能力,布局更接近「导航分区」而不是「单栏堆叠」。

这是什么

dsh-two-pane-sidebar 是面向 DSH Desktop / Web 的纯客户端布局插件:在界面最左侧增加一条持久化的插件轨,中间仍是宿主自带的 SidebarRoot(新建会话、工作区、会话),右侧为对话区。插件不安装 Host 行为、不发网络请求、不上报遥测,也不读写会话或工作区数据;除一条 localStorage 键外几乎无持久状态。

分类上属于 DSH 生态目录中的「客户端」类插件。目录页:skillhub.cn/plugins/A-Meng-E/dsh-two-pane-sidebar;源码与说明:GitHub - A-Meng-E/dsh-two-pane-sidebar。

核心功能

三列布局

安装后大致呈现为:左侧 plugin rail(约 52 px 或 208 px 宽)→ 中间 sidebar → 右侧 conversation。rail 由本插件绘制;中间 sidebar 保持宿主原有实现,不被本插件改宽度逻辑。

数据驱动的插件列表

rail 渲染宿主 sidebar.panellist 插槽里注册的条目(形状为 { id, order, label, component })。其他插件若向该插槽注册导航项,会自动出现在 rail 上,无需改本插件代码或额外配置;注销后对应行消失。

交互与宽度

  • 点击某一行打开对应插件面板;当前行左侧有高亮条。
  • 窄栏模式下悬停行会显示与主题一致的 tooltip。
  • 底部箭头在 52 px(仅图标) 与 208 px(图标 + 标签) 之间切换,按钮位置固定,避免切换时跳动。
  • 宽度选择写入 localStorage["dsh.two-pane-sidebar.v2"],重启后保留。
  • 系统开启 prefers-reduced-motion 时,宽度过渡动画会关闭。

与主侧边栏的关系

rail 通过给布局 frame 设置 padding-left 预留列宽,对话区会少占 52 px;主侧边栏宽度仍由用户拖拽决定,不会被 rail 挤窄。宿主 sidebar 内重复的插件导航列表由 CSS 隐藏,避免两套入口并存。

实现要点(便于评估兼容性)

client.js 约 670 行、无依赖:注册到 shell.overlay、订阅 sidebar.panellist、调用 ctx.layout.selectPanel(id) 打开面板,并从原生 sidebar 列复制背景/文字色以跟随第三方皮肤。依赖若干宿主内部插槽与 DOM 约定;Harness 大版本升级后若接口变化,rail 可能降级或不可见,但不会破坏会话数据。详见 README 中的 Compatibility 表与仓库内 docs/troubleshooting.md。

环境与要求

项目 要求
Harness DSH Desktop / Web 0.2.1-rc.2(Windows、macOS、Linux)
运行时 无额外运行时;纯 ESM,无构建步骤、无 npm 依赖
引擎声明 engines.dsh: >=0.2.1-rc.2 <0.3.0

当前包版本(资料中的 package.json):0.2.0,许可证 MIT。

安装与启用

通过宿主 plugin_manager 安装 bundle(会写入 profile manifest、执行 pnpm add 并应用 patch)。任选其一:

# 1. registry — 尚未上架 npm,名称已预留,未来可用:
#    plugin_manager install_bundle target=@a-meng-e/dsh-two-pane-sidebar@0.2.0

# 2. release 固定制品(无需 npm 账号)
plugin_manager install_bundle target=https://github.com/A-Meng-E/dsh-two-pane-sidebar/releases/download/v0.2.0/dsh-two-pane-sidebar-0.2.0.tgz

# 3. 直接从 git
plugin_manager install_bundle target=git+https://github.com/A-Meng-E/dsh-two-pane-sidebar.git

安装后重启应用(profile 变更不会热加载),并刷新页面。说明中提到 spec 会传给 pnpm add,因此 file: / link: 本地路径也可用于开发安装。

卸载:

plugin_manager remove_bundle target=dsh-two-pane-sidebar

也可先退出应用,再从 ~/.dsh/profiles/<profile>/package.json 删除 dsh-two-pane-sidebar 行,并从 dsh.profile.bundles 去掉对应条目(运行中编辑 profile 可能触发与其他内置插件的热加载竞态,需自行确认后再改)。除 localStorage 键外一般不残留配置。

典型用法

本插件没有开关或配置文件:安装并重启后 rail 始终启用。

  1. 在 rail 中点击「市场」「任务」「技能」等已注册入口,在主内容区打开对应面板。
  2. 需要看清文字标签时,点底部箭头展开到 208 px;日常可收起到 52 px 省横向空间。
  3. 开发本插件或其它 rail 条目时,可用 link 安装后改 client.js,刷新页面即可验证(locale 元数据改后需重启):
plugin_manager install_bundle target=link:/absolute/path/to/two-pane-sidebar

浏览器控制台可过滤 [two-pane-sidebar] 查看降级路径的警告。

适用场景与注意

适合谁:长期在 DSH 里切换多个插件面板、又希望会话与工作区列表保持独立一列的用户;也适合需要验证 sidebar.panellist 生态、或做客户端布局类插件的开发者参考实现。

已知限制(来自 README):

  • rail 在 overlay 层,用 padding 占位,没有可拖拽分隔条,宽度仅两档。
  • 视口宽度小于 1024 px 的「窄窗口」逻辑会因对话区少 52 px 而更早触发。
  • 皮肤若不在 sidebar 列元素上绘制,rail 可能回退到主题 token。
  • 图标组件应只依赖 { size, active },否则可能显示占位方块。

安全与信任:插件以当前 DSH 进程权限在客户端运行。安装前建议在 GitHub 阅读 client.js 与 cordis.patch.yml,确认 MIT 许可证与行为是否符合预期。社区目录站点与 DeepSeek / 幻方无官方从属关系,并非官方应用商店。

结尾

dsh-two-pane-sidebar 把插件导航从主侧边栏拆到左侧固定 rail,主栏专注会话与工作区;列表由宿主插槽驱动,安装后无需配置。若你使用 DSH 0.2.1-rc.2 且接受对话区固定让出 52 px,可按上文命令安装并重启验证。

  • 目录页:https://www.skillhub.cn/plugins/A-Meng-E/dsh-two-pane-sidebar
  • 仓库:https://github.com/A-Meng-E/dsh-two-pane-sidebar
羽毛球分组比赛记分
小程序二维码

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

小夜