# dsh-tidychat
> 🌐 [English](./README.en.md)
> **▼ DSH v0.1.2-alpha.1 适配说明**
> - **支持范围不变**:插件适配 DSH ≥ 0.1.0-rc.7 ~ 0.1.1-rc.x。
> - **alpha.1 暂不可直接升级**:目前只有源码 tag,npm 未发布。
> - **功能重叠**:alpha.1 原生新增「折叠已完成回答前的过程 + System prompt」且默认开,与插件的 fold 功能重叠,同时开会双折叠。
> - **建议**:在 alpha.1 上二选一(用原生折叠,或关掉插件 fold);0.1.1-rc.x 无需改动。
> - **适配中**:插件的折叠版尚未适配 alpha.1,待实机验证后发布。
让 DSH 的长会话变成**可扫读、可跳转**的结论流。
多任务、多轮次的会话里,思考、工具调用、中间文字和最终总结混在一起,回头找「上次那个任务的结论」很费劲。dsh-tidychat 把已完成的任务轮次自动折叠成一条结论,把思考与正文用分隔线切开,并在聊天区左缘提供一条 Codex 式全局导航定位条(Canvas minimap),任意长度的会话都能全局浏览、快速跳转。
> 🔌 生态:挂 `#dsh` · `#dsh-plugin` topic,欢迎收录。
## ✨ 功能
| 功能 | 说明 |
| --- | --- |
| 🗂 自动折叠 | 已完成轮次自动收起思考(Think)、工具调用与中间文字,只保留最终总结;控制条含「过程 N 步」和处理时长(用时 / 首 token / 速率) |
| ➖ 分隔线 | 思考行与正文之间的实线,一眼区分「过程」与「结论」 |
| 📍 左缘定位条(Adaptive Navigation Rail) | 固定高度 Canvas minimap:任意轮次(几十到几千)全局映射到同一可视区;鱼眼悬停放大、拖动预览、点击跳转到阅读区顶部;当前轮次高亮跟随滚动;默认色可背景自适应或手动选「色系 × 明度」,强调色(当前/悬停回合)独立配色 |
| ⬆ 智能加载更早历史 | 页面空闲时逐步加载更早记录;检测到页面响应开始下降时自动暂停,保持长会话流畅,需要时仍可手动继续加载 |
| 📤 一键报告问题 | 自动生成诊断报告(版本/浏览器/性能数据/异常检测/现象标签),一键打开 GitHub issue 预填页,标题正文全带,零手写提交 |
四个功能各自独立,可在「设置 → 插件配置」里可视化开关,改动即时生效;另有「📤 生成诊断报告并提交」一键入口。
## 📸 效果
**自动折叠**:已完成轮次收成一条控制条,只留最终结论(上);点击「展开」恢复思考、工具调用与中间文字(下)。
**左缘定位条(Canvas minimap)**:固定高度全局映射,任意长度会话可全局浏览;悬停鱼眼展开 + 摘要卡(含日期时间),拖动预览,点击跳转到阅读区顶部。
**设置面板**:四个功能独立开关 + 现象标签 + 一键「生成诊断报告并提交」,改动即时生效。
## 🚀 安装
前置:已安装 DSH(Web 版),`pnpm` 在 PATH 上。
```sh
# 方式 1(推荐):npm 包,预构建产物免 allowBuilds 授权
dsh plugin --profile web add @bananasoldier01/dsh-tidychat
# 方式 2:从 GitHub 安装(推荐钉版本,可复现)
dsh plugin --profile web add git+https://github.com/BananaSoldier01/dsh-tidychat.git#v0.2.5
```
安装后重启 dsh web + 硬刷新(Cmd+Shift+R)。
### 更新
插件以 profile 依赖的形式安装,更新就是让 pnpm 重新拉取该依赖的新版本(只拉这个插件,不会重下整个 DSH):
```sh
# 方式 A:npm 方式安装,直接更新
dsh plugin --profile web update @bananasoldier01/dsh-tidychat
# 方式 B:装的是某个 tag,改钉到新 tag 重新 add
dsh plugin --profile web add git+https://github.com/BananaSoldier01/dsh-tidychat.git#v0.2.5
```
更新后同样重启 dsh web + 硬刷新。
> ⚠️ **让设置开关可写(仅 DSH ≤ 0.1.0-rc.6 需要)**:rc.6 及更早版本的「设置 > 插件配置」白名单硬编码在宿主编译产物里,默认不含第三方插件的命名空间,导致开关变灰不可点。运行下面命令把 `tidychat` 加进白名单(幂等;DSH 升级后重跑即可):
>
> ```sh
> curl -sL https://raw.githubusercontent.com/BananaSoldier01/dsh-tidychat/main/scripts/whitelist-patch.sh | bash
> ```
>
> **DSH ≥ 0.1.0-rc.7 不需要这条**:rc.7 起白名单机制移除,命名空间由插件动态注册,开关自动可点。
> 💡 **版本兼容性**:`0.2.0` 起适配 **DSH ≥ 0.1.0-rc.7**(含 0.1.1-rc.x,已实测 rc.1/rc.2 契约点无变化)。rc.7 把 `settings.plugin.item` 槽从 list 改为 keyed,注册字段由 `id` 改为 `key`,旧版写法会报 "Failed to load plugins";**DSH ≤ 0.1.0-rc.6 请使用 `0.1.0`**。
## 🗺️ 路线图
### 0.2.0(已发布)—— Adaptive Conversation Navigation Rail
左缘定位条从「固定列表」升级为 **Canvas Minimap 全局导航**:
1. **固定高度**:`min(70vh, 660px)`,任意 turn 数量(20/70/200+)都映射在同一可视区内
2. **Turn 全局均匀映射**:`y = index/(total-1) × railHeight`,不随 turn 数增长 DOM(仅 1 个 canvas + 1 个提示卡)
3. **鱼眼 hover**:hover 附近 ±4 turn 间距放大、远处自动压缩,命中测试与绘制共用同一布局函数
4. **Drag scrubbing**:拖动时仅预览目标 turn,松手才跳转
5. **当前 turn 高亮**:以「阅读区顶部」为准(含 header 偏移),随滚动实时更新
6. **精确跳转**:用户消息滚到阅读区顶部(而非 viewport 中心或埋进 header)
7. **兼容性**:fold / divider / autoload / diagnostics 均不受影响(rail 数据来自会话快照,与折叠的 CSS 隐藏无关)
### 0.2.1(已发布)—— 定位条配色完善(PR #5 合入)
1. **背景真实冒泡**:默认色 auto 的背景判定从会话滚动容器沿父级向上冒泡找第一个非透明背景(alpha=0 跳过),不再只查固定候选
2. **auto 尊重主题**:默认色 auto 优先用宿主淡色文字色,与实际背景 WCAG 对比 ≥3:1 才使用,不足自动切纠偏灰;强调色 auto(默认)= 跟随主题品牌色(`--dsw-alias-state-business-primary`)
3. **配色折叠为高级项**:设置卡片内「配色(高级)」可折叠收起,明度档在 auto 时禁用
4. **配置枚举化**:host schema 四个配色字段改为 `z.union` 枚举收敛取值;插件卸载时清除写入 `:root` 的临时 CSS 变量
### 0.2.2(已发布)—— 提示卡可读性(issue #6)
1. **头部提级**:提示卡 `#序号 · 时间` 由最弱一级(`label-tertiary`)提升到 `label-secondary`,亮色主题下不再发虚;正文跟随 `label-primary`(与对话正文同色),明暗随主题自动切换
2. **保守对比度兜底**:仅当提示卡浮层背景「不透明」(`bg-layer-3` alpha ≥ 0.85)且 label token 与背景对比 <3:1 时才写纠偏色(亮底深字 / 暗底亮字);玻璃/半透明浮层(官方深色等)一律跳过、跟随主题 token——避免误判深色玻璃
3. **长摘要折行**:`overflow-wrap: anywhere`,含长代码/URL 的摘要在卡片内折行不溢出
4. **解析增强**:颜色解析支持 `rgba` 逗号/空格+斜杠语法、`#rgb/#rgba/#rrggbb/#rrggbbaa`、`transparent`
### 0.2.3(已发布,本次)—— npm 发布准备(awesome-dsh-plugin 投稿推荐项)
1. **peerDependencies 化**:`@deepseek-ai/dsh-settings` 由 `dependencies` 移入 `peerDependencies`(官方运行时包由宿主 profile 提供,避免重复运行时)
2. **npm 发布**:`prepublishOnly` 自动构建,`@bananasoldier01/dsh-tidychat@0.2.3` 已公开发布(预构建产物,安装免 `allowBuilds` 授权);推荐安装方式改为 `dsh plugin add @bananasoldier01/dsh-tidychat`
3. **投稿**:awesome-dsh-plugin 收录 PR 已提交(#3067,session 分类 + 截图条目),待维护者合并
### 0.2.4(已发布)—— npm 包元数据刷新
功能零改动,仅 npm 包内容更新:`README.en.md` 纳入包内、`repository.url` 规范化(`npm pkg fix`)、双语 README 随包发布。awesome-dsh-plugin 收录 PR #3067 已合并(session 分类 + 截图条目)。
### 0.2.5(已发布,本次)—— Hardening(工程收口)
1. **折叠状态会话隔离(P0)**:`foldState` 改为 `Map>`,修复跨会话同轮次串扰(会话 A 展开第 5 轮 → 会话 B 第 5 轮不再错误继承展开态)
2. **定位条 pointermove 节流**:高频移动只记录最新坐标,rAF 帧内统一处理一次(不再每事件一次 React 渲染);离开/卸载时清理挂起帧
3. **测量前不渲染**:宿主布局未就绪(`pos === null`)时不再渲染到写死的 280px 猜测位,测量成功后再出现
4. **快照/DOM 轮次一致性诊断**:报告新增「会话快照轮次 vs DOM 轮次」对照,不一致时报 ⚠️(加载中或 DOM 更新滞后)
5. 文档钉版示例随版本更新;package description 补齐「智能加载更早历史」
### 下一版本(候选)
1. **Turn Index 层** —— conversation DOM → Turn Index(id/element/position/summary),fold/navigator/autoload 共享索引,替代每次全量扫描;基于索引的增量维护(等真实 500+/1000+ 行数据再定方案)。
2. **运行中回合的已完成步骤折叠**(issue #2)—— 单轮内 LLM 执行大量动作时,运行中实时折叠已完成步骤。需求强度待验证。
### 本地开发(link 模式)
```sh
git clone https://github.com/BananaSoldier01/dsh-tidychat.git
cd dsh-tidychat
pnpm install
dsh plugin --profile web add link:$PWD
```
改源码后 `pnpm run build`,重启 dsh web / 硬刷新即生效。
## ⚙️ 设置
在「设置 → 插件配置」展开 **dsh-tidychat** 卡片:
- **自动折叠已完成轮次**:隐藏思考、工具调用与中间文字,只保留最终结论,控制条含处理时长。
- **思考↔文字分隔线**:在思考行与正文文字之间插入实线,区分过程与结论。
- **左缘定位条**:聊天区左缘的细窄条状导航,悬停显示摘要、点击跳转到对应消息。
- **智能加载更早历史**:页面空闲时逐步加载更早记录;检测到页面响应下降时自动暂停,保持长会话流畅,需要时仍可手动继续。
- **配色(高级,卡片内可折叠)**:两组均按「色系 × 多级明度」正交配置。**默认色**默认「自动」——优先用宿主淡色文字色,与聊天区背景对比不足时自动切纠偏灰(深背景淡灰、浅背景深灰),也可手动选色系(灰/黑/白/蓝/紫/青/绿/橙/红)与明度(l1 极浅 → l5 极深);**强调色**控制「当前轮次 + 悬停/导航目标回合」的高亮色,默认「自动」= 跟随主题品牌色(`--dsw-alias-state-business-primary`)。
## 🔧 原理
纯浏览器半(`exports "./client"`)实现,host 半只注册 settings 命名空间,不修改任何 DSH 源码:
- 折叠 / 分隔 / 导航全部通过 DOM 结构锚点(`data-chat-anchor-key`、`data-variant="think"` 等契约级属性)定位,不依赖编译期 hash 类名;
- 通过 `MutationObserver` 观察会话 DOM,配合定时兜底扫描,处理流式渲染与历史加载带来的 DOM 变化;
- 展开 / 收起状态为会话内内存态,刷新后恢复默认(全部折叠)。
## 🧑💻 开发
```sh
pnpm install
pnpm run build # tsdown 构建 lib/
pnpm run typecheck
```
## 📄 License
MIT