Skip to content

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 安装

  1. 在 ~/.dsh/profiles/<profile>/package.json 里加上:

    {
      "dependencies": {
        "@adamcjm/dsh-genui-bugfix": "^0.1.0"
      },
      "dsh": {
        "profile": {
          "bundles": ["…", "@adamcjm/dsh-genui-bugfix"]
        }
      }
    }
    
  2. 安装:

    cd ~/.dsh/profiles/<profile> && pnpm install
    
  3. 重启 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

卸载

  1. 从 profile 的 dependencies 与 bundles 里删掉 @adamcjm/dsh-genui-bugfix;
  2. pnpm install;
  3. 重启 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