dsh-fluid-chat-width:让 DSH Web 对话栏随窗口自适应宽度

前言

DeepSeek Harness(DSH)的 Web 客户端默认用固定阅读宽度排版对话区,宽屏上两侧留白较多;用户若曾拖过内置宽度手柄,宽度还会被写入 localStorage,下次打开仍按旧值固定。对经常在浏览器里跑 Harness、希望对话区随窗口伸缩的开发者来说,需要一种不改客户端源码、只靠插件就能让主对话列「跟窗走」的做法。下面介绍社区插件 dsh-fluid-chat-width:它在浏览器侧用 ResizeObserver 持续发布 --dsh-chat-user-width,使主聊天区宽度为「列宽减 64px、上限 1560px、下限 640px」,并保留拖动手柄的优先级。

这是什么

dsh-fluid-chat-width 是 DSH 的客户端(Web)插件,维护者为 GitHub 用户 helloworld010234,在插件目录站点上的分类为「客户端」。插件没有设置页、没有服务端逻辑:index.js 仅占位以满足插件形态,实际行为全部在 client.js 里完成。它解决的是主对话区域宽度被固定度量或历史拖拽偏好「钉死」的问题,让默认布局随窗口变化,同时不破坏 Harness 自带的宽度拖柄。

核心功能

流体宽度公式

主对话列不再 pinned 在固定阅读宽度上,而是跟随窗口:在每次尺寸变化时,内容为 min(列宽 − 64px, 1560px),且不会窄于客户端自身的 640px 下限(与 README 中说明的 CONTENT_MIN 一致)。调整浏览器窗口大小时,列宽会跟着变,无需点任何按钮。

与内置拖柄的关系

DSH Web 客户端本来就会通过内联 --dsh-chat-user-width 让拖柄覆盖默认宽度。本插件用 ResizeObserver 观察对话列并发布同一自定义属性。拖柄写入的是更深层的内联声明,仍然优先于插件发布的值;拖拽行为与未装插件时一致,拖到哪里就是哪里。

启动时清理旧偏好

客户端会把固定宽度 persisted 在 localStorage["dsh.conversation.contentWidth"]。插件在每次启动时删除该键,并去掉已发布的内联 echo,避免以前拖出来的固定宽度在装插件后仍 silently 生效。

作用范围

嵌入式对话有自己的内容宽度,不受 --dsh-chat-user-width 影响。插件只作用于主聊天区域,选择器为 [data-conversation-region="chat"] > [data-conversation-scroll]。

可调常量(需改源码)

插件没有 Host 半区、没有 settings 命名空间、不持久化配置。三个常量在 client.js 的 apply() 顶部,改完需重新加载客户端:

const MARGIN = 64;  // total side breathing room (px)
const CAP    = 1560; // max content width (px)
const MIN    = 640;  // floor, matches the app's own CONTENT_MIN

安装与启用

官方 README 给出的安装方式如下。安装后需重启 DSH 客户端。

从插件名安装:

dsh plugin add dsh-fluid-chat-width

或指定 GitHub 仓库(与 README 原文一致):

dsh plugin add github:helloworld010234/dsh-fluid-chat-width

卸载:

dsh plugin remove dsh-fluid-chat-width

README 说明:若安装前曾拖过手柄,该偏好键会在启动时被清掉;插件不写文件、不注册路由,除删除上述 localStorage 键外不碰其它存储。

典型用法

  1. 按上一节命令安装并重启 Web 客户端。
  2. 打开主聊天页,拖动浏览器窗口边缘改变宽度,观察对话内容区随 列宽 − 64px 变化,且不超过 1560px。
  3. 若需要固定某一宽度,仍可使用 Harness 内置宽度拖柄;拖柄值会覆盖插件的流体计算。
  4. 若 64 / 1560 / 640 不符合习惯,编辑仓库内 client.js 顶部三个常量后,让客户端重新加载该插件源码(本插件无构建步骤,client.js 即运行时代码)。

实现要点(便于审源码)

文件 面 作用
index.js host (Node) 故意为空,满足插件形态以便 bundle patch 挂载到 Web roster
client.js browser 一个 ResizeObserver、一个自定义属性;手写 window.__ModuleLoader__.load 闭包工厂
cordis.patch.yml bundle patch 将 dsh.client 行插入 profile 的 layer stack

无 bundler、无 transpiler、无运行时依赖。package.json 声明 engines.node 为 >=20,许可证 MIT,当前发布版本为 1.0.0。

适用场景与注意

适合:主要在浏览器里使用 DSH Web GUI、希望宽屏下对话区变宽、又不想每次手动拖宽度的用户;仍需要偶尔用手柄钉住宽度的人也可安装,拖柄逻辑未改。

注意:

  • 插件以当前 DSH 进程及其 Web 客户端的权限运行,会在浏览器里读写 DOM、删除一项 localStorage 键。安装前应阅读 GitHub 仓库 源码与 MIT 许可证,确认可接受。
  • 社区插件目录(如 skillhub.cn)与 DeepSeek / 幻方无官方从属关系,并非官方应用商店;选型以仓库 README 与源码为准。
  • 嵌入式对话区域行为不变;仅主聊天 scroll 区域受影响。

结尾

dsh-fluid-chat-width 用很小的客户端补丁把主对话宽度改成「随窗流体、有上下限」,并在启动时清掉旧的固定宽度偏好,同时保留内置拖柄覆盖能力。需要目录信息与 issue 入口时可访问插件页与仓库:

  • 目录页:https://www.skillhub.cn/plugins/helloworld010234/dsh-fluid-chat-width
  • GitHub:https://github.com/helloworld010234/dsh-fluid-chat-width
羽毛球分组比赛记分
小程序二维码

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

Xiaoye