dsh-layout-persist:保留 DSH Web 布局宽度的插件

前言

DeepSeek Harness(DSH)Web 界面的左右侧栏宽度默认值是固定的:左侧栏为 280px,右侧面板首次打开时为 45% 视口宽。每次重启 dsh,这些宽度都会重置。同一份核心代码里,主题、字号、会话正文栏宽都做了 localStorage 持久化,唯独布局宽度漏了。这不是配置问题,也没有对应的开关,重启必然回到默认值。

插件定位

limsanity/dsh-layout-persist 是一个极小的 Web client 插件,用于把 DSH Web 的左、右两侧栏宽度在重启 dsh 后仍然保留。该插件不 fork 核心,也不改 node_modules,通过订阅 DSH 的 root slot 注册表,在 layout 插件挂上根 store 后,将 localStorage 里的宽度写入 store,并在宽度变化时回写。维护者为 Limsanity。

核心功能

插件通过以下步骤实现布局宽度持久化:

  1. 订阅 root slot 的注册表,等待 layout 插件挂上它的根 store(StoredEntry.store 是公开的 store seat,layout 把该 handle 的 create() 钉死为活着的单例,所以拿到的就是页面正在用的实例)。
  2. 启动时把 localStorage 里的 { sidebar, rightbar } 写回 store。
  3. 之后每次宽度变化(拖拽 / 展开右栏)在 250ms 防抖后回写 localStorage。

存储键为 dsh.layout.widths.v1,形如 {"sidebar":372,"rightbar":500},字段可缺省。删掉这个键即回到默认宽度。

行为细节

  • 关闭左侧栏不会抹掉宽度:sidebar = 0 不是宽度,不写入;下次启动按记忆的宽度展开。
  • 右栏只在「还没有宽度偏好」时回填:面板 occupant 报上来的宽度优先;存储值会经过 store 自身的 300..70% 视口 夹取,换显示器不会炸。
  • 失败就退化成原始行为:localStorage 不可用(无痕 / 配额)只丢记忆,不影响渲染;layout store 若将来换了形状,插件找不到 seat 就不 attach,不会报错、不会白屏。

安装与启用

从 GitHub 装(推荐)

dsh plugin --profile web add "github:Limsanity/dsh-layout-persist"

本包带 cordis.patch.yml(dsh.bundle.patch),plugin manager 会把它登记成 profile bundle 并自动挂载;重启 dsh 后生效。

cd ~/.dsh/profiles/web
pnpm add "link:/path/to/dsh-layout-persist"

link 安装不会自动挂载,需要在 ~/.dsh/profiles/web/cordis.patch.yml 追加:

- insert:
    - id: layout-persist
      name: '@lim324/dsh-layout-persist'

装完重启 dsh,拖一次左右栏把宽度写进 localStorage,以后每次重启都沿用。

升级 DSH 后

插件只依赖两件事:root slot 上 layout 的 store seat,以及 layoutInfo 里的 sidebar / rightbar 字段与 setSidebar / setRightbar 两个 action。核心若改了 store 形状(例如自己补上 persist,或改成 factory 形式的 store seat),插件会安静地不 attach —— 此时要么删掉本插件,要么按新形状改 src/client/index.ts。

适用场景与注意

该插件适合需要在多台显示器、不同分辨率下保持一致布局宽度的 DSH 用户。安装前应检查源码与许可证,确保符合使用规范。插件以当前 dsh 进程权限运行,需要浏览器对 localStorage 有读写权限。

结尾

dsh-layout-persist 通过订阅 root slot 和防抖回写,让 DSH Web 的左右侧栏宽度在重启后保持一致,减少重复拖拽。更多细节见目录页与 GitHub 仓库。

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

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

小夜