dsh-genui-bugfix
Verified@adamcjm/dsh-genui-bugfix · v0.1.0 · MIT · Web UI
DeepSeek Harness plugin that stops dsh-ui table cells from painting their text over the next column, and lets long cells wrap instead of forcing a horizontal scrollbar.
Install
dsh plugin add @adamcjm/dsh-genui-bugfix Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Readme
@adamcjm/dsh-genui-bugfix
一个 DeepSeek Harness 插件,修掉 dsh-ui 表格的两个渲染问题:
- 单元格文字不再压到相邻列——就是那串行内代码把文字顶过列边界的问题;
- 超长单元格换行,而不是把表格撑到必须横向滚动。
直接作用于线上发布的 @changfenhuang/dsh-genui 0.11.x,不必等上游发版。上游自己修好之后,本插件仍然无害,卸载即可。
它修的是什么
dsh-ui 表格的单元格默认 white-space: nowrap(插件「数据列不折行」的设计)。而宿主外壳把消息正文渲染在 .markdown 子树里,那张表的两条规则会落到 dsh-ui 的输出上,因为组件渲染在同一个子树内:
.markdown { overflow-wrap: anywhere; } /* 被每个单元格继承 */
.markdown :not(pre) > code { display: inline-flex; } /* 每个 chip 变成原子 inline 盒 */
再叠加插件自己的 .inlineCode { white-space: pre-wrap },chip 的自动最小尺寸就会塌缩:列宽可以被算到内容之下,而单元格的 nowrap 又让文字不断行——于是直接画到下一列上。
只有含行内代码的格子会中招。纯文本格在 nowrap 下 min-content 就等于内容宽度,列宽不可能被算小。
在运行中的 DSH 桌面端页面实测(7 张表格):0.11.4 下 4 张表格、12 个单元格溢出,单格最大 704px。
注入的两条规则
/* 1) 表格里的 chip 不再重新开启断行 —— 这是重叠的根因 */
[class*="tableWrap"] table [class*="inlineCode"] { white-space: pre !important; }
/* 2) 单行数据格改为可换行 —— 长内容不再撑出横向滚动条 */
[class*="tableWrap"] table td:not([class*="tdMultiline"]):not([class*="tdCode"]),
[class*="tableWrap"] table th:not([class*="tdMultiline"]):not([class*="tdCode"]) {
white-space: normal !important;
overflow-wrap: anywhere;
}
选择器只用 CSS Modules 的类名前缀(tableWrap / inlineCode / tdMultiline / tdCode),不依赖构建时的哈希,所以插件升级换代也不会失效。
第 2 条是偏好项:删掉 lib/client.js 里那一段,表格就回到上游「更宽 + 横向滚动」的行为。
几何验证
同一套浏览器夹具,801px 容器下:
| 样式 | 表格宽度 | 横向滚动 | 跨列重叠 |
|---|---|---|---|
| 上游 0.11.4(未修复) | 1471px | 有 | 4 处,最大 306px |
上游 main(#282 修复) |
1777px | 有 | 无 |
| 本插件 | 799px | 无 | 无 |
也就是说:上游的修法让表格更宽、要求你横向滚动;本插件让长内容换行,表格正好贴合对话列宽。
安装
这个插件就是普通的 DSH bundle:在 profile 里加一条依赖,再把它加进该 profile 的 bundle 列表。
从 npm 安装
在
~/.dsh/profiles/<profile>/package.json里加上:{ "dependencies": { "@adamcjm/dsh-genui-bugfix": "^0.1.0" }, "dsh": { "profile": { "bundles": ["…", "@adamcjm/dsh-genui-bugfix"] } } }安装:
cd ~/.dsh/profiles/<profile> && pnpm install重启 DSH 应用。host 侧的插件树是在进程启动时组装的,跑着的实例不会自动认识新的 bundle。
如果 pnpm 因为「最小发布时限」策略拒绝刚发布的版本,把包名加进该 profile 的 pnpm-workspace.yaml 里的 minimumReleaseAgeExclude。
从本地目录安装(开发用)
把版本号换成 link: 路径,例如 "@adamcjm/dsh-genui-bugfix": "link:/path/to/dsh-genui-bugfix",后面两步相同。
验证
重启后,渲染端会多一个样式元素:
document.getElementById('dsh-genui-bugfix/table-overflow') // 非 null 即已加载
肉眼验证:含长行内代码的表格不再有文字压到下一列,且表格宽度贴合对话列宽,而不是出现横向滚动。
不启动 DSH 也能核对两半是否符合 loader 约定:
cd <插件目录> && npm test
卸载
- 从 profile 的
dependencies与bundles里删掉@adamcjm/dsh-genui-bugfix; pnpm install;- 重启 DSH。
与上游修复的关系
- 上游
main已经修了重叠本身(PR #282,尚未发版)。本插件的第 1 条规则与它效果一致、可以共存——都让 chip 保持white-space: pre。 - 上游的浏览器夹具抓不到这个回归:它的跨列断言恒真,因为夹具把表格渲染在宿主
.markdown级联之外。相关缺口见 issue #285 与 PR #286。
结构
@adamcjm/dsh-genui-bugfix/
├── package.json # dsh.bundle.patch + dsh.client 声明
├── cordis.patch.yml # 往 profile 里 insert 一行插件
├── lib/
│ ├── index.js # host 半侧:node ESM,导出 name/apply/inject,无行为
│ └── client.js # 浏览器半侧:window.__ModuleLoader__.load({ id, factory })
├── test/verify.mjs # 零依赖自检(loader 约定)
└── README.md
两半的产物形态与已安装插件保持一致:
- host(
lib/index.js)是普通 node ESM,导出name/apply/inject——与dsh-window-drag-probe的 host 半侧同形(同样没有 host 行为); - client(
lib/client.js)必须是 DSH 直接服务的预打包形态window.__ModuleLoader__.load({ id, factory }),factory返回带apply的 exports——与@changfenhuang/dsh-genui、dsh-boot-animation的 client 产物同形。写成裸 ESM 的export function apply不会被装载,而且是静默失效,不会报错。本插件零运行时依赖,所以 factory 里不需要require任何东西。
许可
MIT