@junjian.work/dsh-chat-width
v0.22.4
Published
DSH Web 对话消息百宝箱
Readme
dsh-chat-width
调整 DSH Web UI 聊天区的小插件:可分别设置聊天内容列、输入框、任务清单、排队消息/进行中的目标、我的消息五个宽度(默认聊天内容 99%,其余跟随上层/官方默认),并支持对话导航、滚动条自动隐藏、Markdown 表格宽度与边框控制、历史拉取条数配置与触顶自动加载更早消息。
- 安装后在 设置 → 插件配置 出现「聊天优化」卡片,随时可改,保存立即生效,无需重启;
- 宽度数值支持 CSS 长度:
px/em/rem/%/vw/vh;留空 = 跟随上一层; - 配置持久化到 profile 的设置文档(
~/.dsh/settings.yaml),可一键「重置全部」。
功能清单
| 功能项 | 控制对象与行为说明 | 默认值 |
| :--- | :--- | :--- |
| 聊天内容 | 消息流列宽(--dsh-chat-content-width) | 99% |
| 输入框 | 输入框卡片最大宽(--dsh-composer-card-max-width) | 留空 = 跟随聊天内容 |
| 任务清单 | 会话流中的待办任务面板([data-testid="todo-panel"]) | 留空 = 跟随输入框 |
| 排队消息/进行中的目标 | 输入区上方排队消息停靠栏([data-queue-dock])与目标栏([data-goal-bar]) | 留空 = 跟随输入框 |
| 我的消息 | 我发送的消息气泡宽度(官方默认 min(525px, 82%)) | 90% |
| 表格宽度 | 聊天内容中 Markdown 表格的宽度(如 100% 撑满消息区;留空跟随官方 max-content);同时自动支持表格单元格内 <br> 标签真实换行 | 100% |
| 表格边框 | 聊天内容中 Markdown 表格单元格显示横向边框(上/下) | 开启 |
| 表格竖线边框空白 | 开启 = 表格的竖线改为空白分隔(列间与边缘均无竖线);关闭 = 显示完整边框(列间 + 左右边缘竖线) | 开启 |
| 表格竖线空白宽度 | 竖线边框空白模式下,列与列之间的空白分隔宽度(CSS 长度,如 4px、6px) | 4px |
| 滚动条自动隐藏 | 全部滚动条在鼠标移动/滚动时显示,停止操作约 1.5 秒后自动隐藏 | 开启 |
| 任务清单/排队消息防覆盖修正 | 任务清单/排队消息保持绘制在输入框之上,并取消排队消息与输入框的 9px 重叠(两者干净分隔) | 开启 |
| 我的消息图片缩略图 | 我发送的图片在聊天中显示为缩略图(200×150,点击可查看大图),不再大图直出;粘贴图片的占位([Pasted image...])也会渲染成缩略图 | 开启 |
| 提问行显示问题内容 | 会话流里的「提问」行显示为「提问:{问题内容}」(提问弹出时即显示,不等回答完) | 开启 |
| Think 行折叠隐藏摘要 | 聊天消息窗体里的 Think 行不显示后面的摘要信息,点击行展开后才显示完整思考内容 | 开启 |
| 完成后折叠每轮过程 | 每轮执行完成自动收成一个可点击概要条(「本轮 思考N · 工具M · 用时X」);用时格式如 1 天 2 小时 3 分钟 15 秒(每个有值的单位才显示,不足 1 秒显示毫秒);折叠范围是该轮最终回答(最后一个 assistant 步骤)之前的全部中间过程(思考、工具执行、中间文本),最终回答与操作栏始终显示;执行中保持展开,历史消息同样折叠 | 开启 |
| 开启对话导航 | 在滚动条左侧显示极简垂直轮次指示器(横线),鼠标悬浮展开半透明列表卡片;按屏幕中心最近位置高亮当前轮次,点击可平滑跳转到对应消息 | 开启 |
| Think/工具调用行间隔 | 调整聊天消息窗体中 Think 行与工具调用行之间的空白间隔(.Md3f7G_column 的 gap,如 2px;留空跟随官方) | 16px |
| 输入框模型二级菜单选择 | 输入框右下角的模型选择下拉框改为 2 级菜单:一级为供应商名称(相同供应商合并归类),二级为该供应商下的具体模型列表,支持思考强度快速切换与「供应商/模型名称」直观显示 | 开启 |
| 历史拉取消息数 | 每次打开会话或向上拉取时的历史消息条数(默认 50,范围 20~300 条) | 50 |
| 触顶自动加载更早消息 | 向上滚动到顶部时自动触发加载更早历史,免去手动点击 | 开启 |
宽度百分比说明
任务清单、排队消息与进行中的目标的百分比数值是相对输入框宽度计算的:
| 设置值 | 实际宽度计算 |
| :--- | :--- |
| 100% | 精确等于输入框(输入卡片)宽度,左右对齐 |
| 99% | 输入框宽度 × 0.99(缩窄 1%) |
| 98% | 输入框宽度 × 0.98(缩窄 2%) |
| 1000px 等绝对值 | 直接按输入的像素或其他 CSS 长度生效 |
即 100% 是“与输入框等宽”的快捷设定,其他百分比按输入框宽度等比缩放。
滚动条自动隐藏实现原理:官方 WebKit 与 Firefox 两条渲染路径均读取 --dsh-scrollbar-thumb 变量,开启后把该变量默认设为透明;浏览器端监听 mousemove 与 scroll 事件,活动期间给 body 元素添加 dcw-scroll-active 类恢复变量值,静止 1.5 秒后移除隐藏。
实现原理
官方 Web UI 的聊天列宽度由 CSS 变量 --dsh-chat-content-width(默认 748px)控制,输入框/任务清单/排队消息/进行中的目标共享 --dsh-composer-card-max-width(= 内容宽 + 32px),官方界面未内置自定义设置项。本插件通过以下方式实现:
- 服务端(Host 侧):注册
chat-widthsettings 命名空间,并挂载同源路由/dsh-chat-width/config(GET 读取 / POST 写入)。采用自有路由规避 API 网关对第三方 settings 命名空间的白名单限制; - 浏览器端(Client 侧):启动时拉取配置并注入覆盖规则(如
.wSkVaW_root.wSkVaW_root{--dsh-chat-content-width:90%}),配置修改保存后即时重写样式,无需刷新或重启; - RPC 拦截与滚动联动:在前端 Hook 会话历史拉取接口动态注入
maxMessages参数,并监听会话滚动容器实现触顶防连击自动加载。
安装指南
方式一:从 npm 安装(发布后)
dsh plugin --profile web add @junjian.work/dsh-chat-width方式二:本地链接(开发调试)
dsh plugin --profile web add link:D:\William\Documents\DeepSeek\dsh-chat-width两种安装方式均需在 ~/.dsh/profiles/web/cordis.patch.yml 中挂载:
- insert:
- id: chat-width
name: '@junjian.work/dsh-chat-width'首次安装或修改 bundle 需重启 dsh web 进程使浏览器端插件清单生效。
配置文件示例
可在「设置 → 插件配置 → 聊天优化」中通过可视化界面配置,亦可直接编辑 settings 文档:
# ~/.dsh/settings.yaml
chat-width:
width: "90%"
composerWidth: "1000px"
todoWidth: "720px"
queuedWidth: ""
userMessageWidth: "800px"
tableWidth: "100%"
historyPageSize: 50
autoLoadOlder: true
scrollbarAutoHide: true
dockLayerFix: true
tableBorder: true
tableVerticalBorder: true
tableVerticalGap: "4px"
thinkHideSummary: true
foldCompletedTurns: true
turnNav: true
modelDisplayEnhance: true
rowGap: "16px"更新历史
| 版本号 | 发布日期 | 更新内容说明 |
| :--- | :--- | :--- |
| 0.22.4 | 2026-08-27 | 修复路径芯片对中文文件名的匹配截断:完整保留含中文的相对路径、盘符路径和目录路径,避免只显示文件名前缀。 |
| 0.17.2 | 2026-08-24 | 修复表格代码块过滤:检查具体文本节点的父级链,防止行内代码块(<code>)内的 <br> 标签被误转为换行节点导致黑色块瑕疵。 |
| 0.17.1 | 2026-08-24 | 新增 Markdown 表格单元格换行增强:自动将表格单元格(th、td)中的 <br>、<br/>、<br /> HTML 换行标签替换解析为真实换行 DOM 元素,完美支持模型在表格列内换行。 |
| 0.17.0 | 2026-08-24 | 模型选择下拉全面升级为原生 UI 风格的 2 级级联菜单:一级展示合并归类后的供应商列表(带右向箭头 > 与当前选中模型高亮),鼠标悬浮即时向上弹出二级模型列表,支持长列表独立平滑滚动与思考强度(Effort)快捷设置,并在无操作时自动隐藏滚动条。 |
| 0.16.12 | 2026-08-24 | 重构对话导航 Tooltip 气泡提示:完全基于 DSH 原生主题样式自研弹出卡片,支持长消息自动换行、适中尺寸限制、精确定位与防遮挡计算,彻底取代浏览器简陋的原生 title 提示框。 |
| 0.16.10 | 2026-08-24 | 优化对话导航悬浮面板 UI 风格:适配 DSH 原生主题变量(浅色/深色自适应背景与边框),采用标准的轻量阴影、项圆角及 hover 高亮状态,彻底消除与原生界面不协调的黑底突兀感。 |
| 0.16.9 | 2026-08-24 | 新增「开启对话导航」功能:在会话右侧滚动条旁显示极简轮次横线指示器,鼠标悬浮展开半透明对话轮次导航面板;支持顶部/底部端点精确判定与滚动锚定实时高亮,点击平滑滚动跳转至对应提问。 |
| 0.15.6 | 2026-08-24 | 修复滚动/消息变动时第一条带图消息自动弹出放大图的问题:触顶自动加载更早历史严格按按钮文本(“加载更早”/“Load earlier”)匹配,杜绝误点击图片缩略图。 |
| 0.15.3 | 2026-08-23 | 修复相同百分比下“进行中的目标”与任务清单宽度不一致:queuedWidth 现在同时覆盖排队消息 [data-queue-dock] 和目标栏 [data-goal-bar],并补充回归测试与设置说明。 |
| 0.15.2 | 2026-08-23 | 修复「完成后折叠每轮过程」被轮内 context 或 steering 错误拆分后失效的问题;会话列与块间距改用稳定的 [data-chat-flow] 选择器,并增加 DOM fixture 回归测试。 |
| 0.15.1 | 2026-08-23 | 修复触顶自动加载更早消息在官方类名变动下失效的问题(增加多重弹性匹配与文本兜底,触顶阈值优化至 120px / 300ms);README 全量重写为简体中文。 |
| 0.15.0 | 2026-08-21 | 新增「历史拉取消息数(historyPageSize)」与「触顶自动加载更早消息(autoLoadOlder)」:支持自定义单页历史拉取条数(20~300 条,默认 50),向上滚动触顶自动加载更早历史;修复每轮折叠条在顶部堆叠和空过程误折叠的问题。 |
| 0.14.2 | 2026-08-21 | 修复输入框模型选择器污染左下角权限菜单选项文本的问题:限定仅对模型选择器按钮生效。 |
| 0.14.0 | 2026-08-19 | 新增「完成后折叠每轮过程」:每轮执行完成自动收成一个可点击概要条(本轮 思考N·工具M·用时X),折叠该轮最终回答之前的全部中间过程(思考、工具执行、中间文本),最终回答与操作栏始终显示;执行中保持展开,历史消息同样折叠;同时移除 Think 行标题的思考时间显示,「本轮 用时」保留并以「1 天 2 小时 3 分钟 15 秒」格式展示(有值的单位才显示)。另将「表格竖向边框」改为「表格竖线边框空白」:开启 = 竖线变空白分隔(宽度可配),关闭 = 完整边框竖线。 |
| 0.13.2 | 2026-08-19 | 修复重启后 Think 思考时间闪烁:时长恢复改用稳定哈希(标题文本归一为 Think 再取哈希),读写键不再随标题改写而漂移。 |
| 0.13.1 | 2026-08-18 | Think 耗时映射加上限清理(保留最近 5000 条),避免文件与浏览器内存随时间膨胀。 |
| 0.13.0 | 2026-08-18 | 宿主进程监听会话事件记录 Think 耗时:窗口后台、消息非最新位置也能记录;刷新/切换会话均稳定恢复。 |
| 0.12.1 | 2026-08-18 | 修复切换会话再切回后 Think 耗时丢失:完成时同步更新内存映射,会话内切换无需刷新也能恢复。 |
| 0.12.0 | 2026-08-18 | Think 耗时改由宿主进程持久化到 ~/.dsh/dsh-chat-width/think-durations.json,刷新/重启后历史行稳定恢复(不再依赖 localStorage)。 |
| 0.11.9 | 2026-08-18 | 修复思考时间显示闪烁:思考中改为整秒锚定更新,毫秒阶段只显示一次,避免流式渲染时高频闪动。 |
| 0.11.8 | 2026-08-18 | 思考时间数字与单位之间增加空格;窗口恢复可见/聚焦时立即刷新计时,缓解窗口失焦导致无思考时间。 |
| 0.11.7 | 2026-08-18 | 移除无效的「Think 行行高」「Think 行上下间距」配置及处理,只保留 .Md3f7G_column 间隔控制。 |
| 0.11.6 | 2026-08-18 | 按用户定位改用 .Md3f7G_column 的 gap 控制 Think/工具调用行间隔,设置即时生效。 |
| 0.11.5 | 2026-08-18 | 行高设置扩大命中会话根下所有 DisclosureRow,Think/工具调用行行高调整更可靠。 |
| 0.11.4 | 2026-08-18 | Think 与工具调用交替行之间真正贴紧(抵消官方 16px 行间距);结论信息间距保持官方。 |
| 0.11.3 | 2026-08-18 | 收敛为只调整 Think 行与工具调用行的行高;结论信息、折叠内容、块间 gap 均保持官方。 |
| 0.11.2 | 2026-08-18 | 「Think 行行高」的作用范围扩大到 Think 行之后的所有行,蓝色日志块内每行行高可统一调整。 |
| 0.11.1 | 2026-08-18 | 修复屏幕外 Think 行无思考时间的问题:监听 data-state 属性变化,滚动离开时也记录并保存完成耗时。 |
| 0.11.0 | 2026-08-18 | 新增「明面行高(块间距)」配置:控制 Think/工具调用等每行之间的明面间距,默认 16px,可即时调整。 |
| 0.10.2 | 2026-08-18 | 设置面板改数值即实时预览(不用等保存),确认后再点保存持久化。 |
| 0.10.1 | 2026-08-18 | Think 计时显示改为人性化时长:<1秒显示毫秒,≥1分钟显示分秒,≥1小时显示小时分秒,≥1天显示天小时分秒。 |
| 0.10.0 | 2026-08-18 | Think 行及后续行的行高与上下 padding 改为设置面板可配置(默认 17px / 4px),可随时调整,无需改代码。 |
| 0.9.4 | 2026-08-18 | Think 行及后续行上下 padding 调整为 4px,行高保持 17px,进一步紧凑。 |
| 0.9.3 | 2026-08-18 | Think 行及后续行高度在 0.9.2 基础上再收缩 15%(行高 17px / 上下 padding 7px)。 |
| 0.9.2 | 2026-08-18 | Think 行及其后每一行高度收缩约 15%(行高与上下 padding 收紧),整体更紧凑。 |
| 0.9.1 | 2026-08-18 | 修复 Think 计时在思考结束后仍增长的问题;折叠隐藏摘要时压缩 Think 行高度,避免与工具调用之间空隙过大。 |
| 0.9.0 | 2026-08-18 | 新增「Think 行显示思考时间」:Think 标题后显示思考耗时秒数,思考中实时递增,完成后固定;耗时存入本地存储,刷新/重启后历史消息可恢复显示。 |
| 0.8.0 | 2026-08-18 | 新增「Think 行折叠隐藏摘要」:折叠时 Think 行不显示后面的摘要信息,点击行展开才显示完整思考内容。 |
| 0.7.1 | 2026-08-18 | 修复 Markdown 表格默认竖向边框为透明断点时不可见的问题:两列之间现在会出现 1px 分隔断点(无底色);开启竖向边框时显示可见竖线。 |
| 0.7.0 | 2026-08-18 | 新增「Markdown 表格宽度/边框控制」:默认表格宽度 100%、横向边框开、竖向边框为透明断点,不替换官方渲染器。 |
| 0.6.1 | 2026-08-18 | 修复 DSH rc.07 后「设置 → 插件配置」不显示配置卡片的问题;注册 settings.plugin.item 时改用 key 匹配。 |
| 0.6.0 | 2026-08-16 | 新增「提问行显示问题内容」:提问弹出即显示问题文本,不等回答完;README 补充说明。 |
| 0.5.1 | 2026-08-14 | 修正 0.5.0 发布包版本号(代码内容不变)。 |
| 0.5.0 | 2026-08-14 | 新增「我的消息图片缩略图」:粘贴占位替换为缩略图(跨节点/多图)、本窗体灯箱、自动滚动、修复多图替换 bug。 |
| 0.4.17 | 2026-08-14 | 宽度百分比按输入框精确缩放(100%=同宽)、取消队列面板内缩、README 补充宽度语义说明。 |
| 0.4.14 | 2026-08-14 | 修复排队消息条样式:四角圆角、宽度与输入框精确对齐(min 变量方案)、容错加固。 |
| 0.4.12 | 2026-08-14 | 初始化插件:聊天区宽度/滚动条优化。 |
版本规则
- 新增功能:次版本号 +0.1(如
0.1.0→0.2.0) - 代码修正:补丁版本号 +0.01(如
0.1.0→0.1.1)
维护说明
宽度与布局规则挂载于以下选择器(位于 lib/client.js 顶部常量):
| 常量名 | 选择器 | 说明 |
| :--- | :--- | :--- |
| ROOT_SELECTOR | .wSkVaW_root.wSkVaW_root | 会话页根容器(CSS Modules 哈希,版本升级可能变动) |
| TODO_SELECTOR | [data-testid="todo-panel"] | 稳定属性,跨版本保持一致 |
| QUEUE_SELECTOR | [data-queue-dock] | 排队消息稳定属性 |
| GOAL_SELECTOR | [data-goal-bar] | 进行中的目标稳定属性;与排队消息共同受 queuedWidth 控制 |
| TABLE_PARENT_SELECTORS | [class*="tableScroll"] + [class*="markdown"] | 官方 MarkdownText 表格容器类名包含 tableScroll;另以 markdown 根类兜底 |
DSH 升级后若 ROOT_SELECTOR 发生变动,插件会自动退回默认宽度(其余功能不受影响),更新该常量即可恢复自定义宽度。
