dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DeepSeek Harness plugin: VS Code-style sash dividers in the left sidebar, per-row compact mode with auto-shrinking content, and per-block collapse into icons above the avatar.
DSH 桌面/Web 端左侧栏的分区尺寸控制插件。名字沿用 v0.1 的「侧栏宽度」,功能已完全换成侧栏分区(VS Code SplitView 模型)。
侧栏被认成 5 块 + 其它插件加进来的块(React 重挂后自动重新识别):
| 区块 id | 认出方式 | 内容 |
|---|---|---|
brand | logoRow 子串 | 品牌行 + 品牌按钮 |
new | newSession 子串(或前两块里的 button) | 新会话 |
nav | panelList 子串(nav 语义) | 插件 / 自动化任务 / 任务看板 |
main | regionArea 子串(或 nav 与 foot 之间) | 工作区与会话列表 |
foot | footArea 子串 | 用量卡、远程控制、设置、账号头像 |
extra:N | 以上都不匹配的 root 直接子元素(v0.6.4) | 其它插件挂进侧栏的自定义块,如状态条、宠物、自定义面板 |
对其它插件自动适配(v0.6.4):只要组件被挂到侧栏根节点下(
root的直接子元素)并且不是本插件自己的节点,就会被当成一块extra:N,自动获得与内置区块完全相同的待遇:相邻之间的分割条、拖拽调高、内容缩放、行级拖动带、窄轨让位。不需要改那个插件,也不需要在本插件里登记。挂载/卸载时extra:N序号会随 DOM 顺序重排。
brand|new、new|nav、nav|main:往下拖 = 上面这块变高。main|foot:方向相反,往上拖 = 底部区变高。root 上的坐标命中(±6px),鼠标靠近时只在侧栏缝中央浮现一个 26×3 的小握把,不显示行名或高度文字,也不插入常驻拖动条。拖动超过 3px 才接管,拖完 250ms 内抑制一次 click,避免顺带切面板。面板列表、底部区块、用量卡、设置行和账号行均可独立调整;双击行缝复位。用量卡的文字行随整张卡一起缩放,不拆成独立分区;文件夹里的子对话列表不做调整。42%;超过原生高度时也放大内容,而非只拉长空白边框。放大上限 200%,还受实际侧栏宽度、换行与内容高度限制,不能靠裁掉文字填满拖动距离。账号与入口图标保持原生尺寸。96px,超出部分可以滚动访问。拖大卡片先用父容器留白,再从工作区借高度;这些空间用尽即停止,不再把无关的品牌、新会话或导航压成小字。拖动从当前渲染尺寸开始,往返和松手保持连续。旧保存底栏过大时也优先限制底栏,而非把顶部一起压小。缩小底部区时卡片、按钮和账号按同一个预算排版。18px 且不低于原尺寸 42%;单行底栏状态保留至少 11px 的有效字号(原生小于此值时不再缩小),嵌套容器预留全部子行及间距,账号不低于原生高度。极小窗口连这些下限也装不下时,已调整过尺寸的侧栏启用纵向滚动,不靠覆盖其它组件腾地方。8px 间隔;共享底行的账号、方框与手机入口按中心对齐,入口间留 8px,空白留在整条底行上方。root 带 *_collapsed)时,分界、折叠键、图标坞全部撤掉。dsh-sidebar-sections:v5。从旧版 v4 只继承折叠状态与重启模式,不继承旧尺寸;v0.6.19 沿用 v5,不清空现有设置。{ "mode": "keep", "heights": { "brand": 60, "nav": 120 }, "rows": { "nav:0": 30, "foot1:2": 26 }, "hidden": ["nav"] }heights 是块级覆盖(键为 brand / new / nav / foot),rows 是行级覆盖(键形如 nav:2、foot:0、foot1:1:scope 名 + 行序号)。foot0-0:0)也会正确重载。| 属性 | 位置 | 值 |
|---|---|---|
data-dsh-sw-state | document.documentElement | panes:nav=62 rows:1 fit:1 hidden:0 / rail / no-root / no-blocks |
data-dsh-sw-fault | document.documentElement | apply 抛错时的错误摘要 |
data-dsh-sw-sash / -pane / -hidden / -zoom / -block | 相关元素 | 便于在 DevTools 里查 |
data-dsh-sw-row / -rowhint / -seam | 被覆盖的行、悬浮提示线、当前对齐的缝 | 行级调高的诊断锚点(v0.6.2 起没有覆盖层元素) |
设置 → 侧边栏分区(settings.section,id sidebar-sections,order 37):显示已调高度的块、已调行高的行、已折叠的块,并提供「恢复块的原始高度 / 恢复每一行的原始高度 / 展开全部区块 / 全部复位」。
sidebar.footer.action 插槽统一为 display:contents,包括宿主原本有盒子的插槽;记录原样式并在退出接管时恢复。卡片独立占行,账号与手机/方框入口保留同一底行。用量卡增长先消耗底栏空白,不先挤会话区;只用内联 grid 映射可见行,不搬动 React 节点。有内边距或边框的内容卡不再向内拆文字/进度条,纵向 flex 卡也作为整体缩放。display:none;切换原生窄轨时撤销尺寸与缩放覆盖,展开后恢复请求尺寸。col-resize 接管已删除),不与 dsh-better-sidebar、ui-theme 的字体设置冲突。npm ci
npx playwright install chromium
npm test
也可以设置环境变量 DSH_TEST_BROWSER 为本机 Edge/Chrome 可执行文件路径,跳过浏览器下载。
仓库自带 tests/sidebar.html 和 41 项 Playwright 测试,直接用浏览器真实 flex/grid/zoom 排版、鼠标拖动与 DOM 几何断言,不打桩 getBoundingClientRect。覆盖卡片与父块拖动、先用空白、往返与松手不跳、字体与图标缩放、头像避让、历史尺寸和窗口恢复、重载、窄栏、React 重挂、中间分组、动态内容、窄轨及卸载。共享底栏夹具覆盖透明/有盒子插槽、纵向 flex 卡、远程插件宽屏 CSS、双入口共行、外边距与入口移除;录屏回归另验证极端拖动不挤顶部、卡片放大且文字完整、工作区滚至末项,以及 220/268/360px 宽度下连续往返、复位与卸载。截图回归验证会话/卡片间隔、嵌套状态文字可读、入口居中及宿主自带行间距的底行预算。夹具模拟宿主 DOM/CSS,不等于已在真实 DSH 宿主中完成验收。
本仓库同时提供一份符合 DSH 插件市场索引格式 1 的索引文件:market/index.json。
在 DSH 的 插件 → 发现 里点「添加索引源」,粘贴:
https://raw.githubusercontent.com/nullifyi/dsh-sidebar-width/main/market/index.json
添加后可在「发现」里搜索「侧栏分区拖拽」。最新条目为 0.6.24,安装源固定在对应代码提交;已有安装需刷新索引并更新插件,重新加载后生效。索引条目字段:
| 字段 | 值 |
|---|---|
name | dsh-sidebar-width |
metadata.category | sidebar(侧栏) |
metadata.labels | resizable 可拖拽调整、collapsible 可折叠、chinese 中文界面 |
metadata.keywords | 侧栏 / 侧边栏 / 拖拽调整 / 分割条 / 折叠 + sidebar / sash / splitview / resizable / collapse |
索引标题、描述、分类、标签都带 en 与 zh 两份文案,市场按当前界面语言显示;en 是格式 1 的必填项。
改 market/index.json 里该插件的 versions:追加一条 { version, publishTimestamp, source: { type: "git", url, commit } }(commit 用已推送的 40 位 SHA),再更新 metadata.sortKeys.updated。
dsh dsh-plugin deepseek-harness sidebar sash splitview resizable collapsible。package.json 的 keywords(npm 标签,含 侧栏/侧边栏/拖拽调整/分割条/折叠)和插件市场索引的 metadata.keywords / 分类 / 标签中文标题里。display:contents,不再把透明容器当成零高或不可压缩的整块。flex-direction: row 被误判,导致用量卡没有独立压缩缝;卡片整体缩放,不逐条拆开文字。footerActions 里只放一个包裹层、真正的几行(用量卡/远程控制/图标/状态)都在包裹层里。以前“容器子元素少于 2 个就不建作用域”,所以这些行一个拖动缝都没有。现在会穿透只有单个子元素的包裹层(最多 4 层),并继续往每行里递归找纵向堆叠(最多 3 层)。display:contents 或高度为 0 时,用行自己的左右边界做命中范围。acct 空作用域。dsh-sidebar-sections:footdump(区块矩形、每行高度/外边距、是否图标行、行缝键、账号行位置),排查现场用;同时打一行到控制台。margin-top:auto 固定在这块底部;上面几行怎么压都不会把它推走、也不会改变它的大小。dsh-sidebar-sections:footdump(底栏矩形、各行高度/外边距、行状态),排查布局问题用。rowBoxLimit(),行的最大高度按“所在块当前还能放多少”计算,头像行拖到底就停,不再拖到看不见的位置。foot)内容超出盒子时 overflow-y:auto,侧栏整体超出时也给 overflow-y:auto,符合“压到遮挡时用滚轮上下滑动看”的要求。margin-top:auto,头像确实沉底了,但整块底部内容被推离上一块、用量卡还被挤出盒子。现在底部内容按正常流走,头像紧跟在远程控制下面。v5,旧的绝对像素高度一律作废:v4 里存的是“当时的排版下量到的像素值”,换一版排版再读必然错位(实测宿主里留下 nav=89 却要装 3 行 36px 面板行、foot=207 却装不下头像行)。v4 → v5 只继承折叠状态与“重启后模式”,高度回到原生。fitPane 会把面板行里的 svg/文字逐个 zoom,于是同一列里有的字缩了、有的没缩。现在面板区被拖矮时改为自己滚动(overflow-y:auto),行保持原生大小。zoom + 宽度反补偿,压紧时图标和文字各缩各的、整体往左偏。现在行级压缩只缩字号(fitRow()),并强制 white-space:nowrap + 省略号,横向布局不动。margin-top:auto 等于没写)。改成让 foot 的第一个真实子元素吃 margin-top:auto;foot 一旦被拖高,整块内容(含头像)就贴在底部。sanitizeHeights() 与 enforceBudget() 在拖拽期间全部跳过。之前「拖动写 h0+dy」与「预算把高度压回去」每帧互相打架,表现为底栏/头像上下跳。account 与 accountPinHost(头像行矩形、贴底目标的计算样式),便于远程确认贴底是否生效。writeDump() 从 v0.6.9 起就定义了却没人调用,所以 localStorage['dsh-sidebar-sections:dump'] 一直不存在。现在首轮渲染后立刻写一次、2.5 秒后再写一次(布局稳定后的最终形态)。navHTML(面板列表的 innerHTML 前 2600 字符)和 rootChildren(根节点下每个非自有子元素的标签/类名/矩形/计算样式),用来判断「某一行不见了」是插件自己压的还是别的插件挪走的。data-dsh-sw-version,localStorage['dsh-sidebar-sections:boot'] 记录 {v,t};启动 2.5 秒后另写一份现场快照 localStorage['dsh-sidebar-sections:dump'](各块矩形、面板列表子节点、计算样式、状态串),排障时不用开 DevTools。enforceBudget(),用真实 getBoundingClientRect()(把块与块之间的外边距、main 自身高度一起算进去)判断是否溢出;溢出就按“当前最高的那个被拖过的块”逐轮压回,最多 6 轮。以前只按估算高度判断,存储里一个偏大的值就能把底栏顶到 root 外面,看起来就是“盖住上一层”。sanitizeHeights() 按真实内容高度把偏大的记录按比例摊回去,只调存储、不碰 DOM,所以重启后不会先撑开再挤回。zoom;块级缩放改成按 scrollHeight 是否真的溢出决定,摘掉 zoom 后不溢出就停止,不再“明明有空间却缩得很小”。mode 字段,keep(默认,继承上次布局)或 reset(每次启动回到原生高度)。设置页「侧边栏分区」里两个按钮直接切换。MIN_PANE 改为 brand 22 / new 22 / nav 36 / foot 48;实际可拖下限取 min(硬下限, 原生高度),窗口很矮时不会一按就跳变。scrollHeight(那会触发宿主的 MutationObserver → apply → 又测量,形成循环)。现在 naturalHeight = 渲染高度 ÷ 当前 zoom,一次读、零写入。takeRecords() 清掉自己写出的记录;渲染结果与上次一致时直接短路。宿主不会再被我们自己的样式变更唤醒。overflow: clip,所以底部永远不会盖住上一层。data-dsh-sw-state 形如 panes:nav=62 rows:1 fit:1 trim:0 hidden:0。zoom。以前先调行、再调块,或者重载后继续拖块,行会按「行高覆盖 × 块 zoom」缩两次——表现就是“明明还有空间却缩得很小、滑块一动忽大忽小”。root 下不属于内置五块的自定义元素识别为 extra:N,自动生成分割条、可拖高、可缩放;序号随 DOM 顺序重排,卸载后自动消失。同一容器内的兄弟块一起参与,面板行级的拖动带同样覆盖。foot 时只把用量卡/远程控制/图标行这些旁支藏起来,账号头像那一行留在原位(仍在侧栏底部),折叠键也随之搬到图标坞上方,随时可展开。dsh-sidebar-sections:v4:首次加载把旧的 v3 迁移过来,只继承「块高度 + 折叠状态」,历史行高一概丢弃——它修的是“一打开侧栏,面板行就矮成一条、字号缩到底”。