前言¶
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。
核心功能¶
插件通过以下步骤实现布局宽度持久化:
- 订阅
rootslot 的注册表,等待 layout 插件挂上它的根 store(StoredEntry.store是公开的 store seat,layout 把该 handle 的create()钉死为活着的单例,所以拿到的就是页面正在用的实例)。 - 启动时把 localStorage 里的
{ sidebar, rightbar }写回 store。 - 之后每次宽度变化(拖拽 / 展开右栏)在 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 后生效。
从本地目录 link¶
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 仓库。