# dsh-auto-collapse

> 把 DSH Web 聊天界面里的工具卡片和 Think 推理块折叠成一行摘要，并把"Deep diving"改成"Deep sleeping"。

## Metadata

- Author: [@a179-sanae](https://github.com/a179-sanae)
- Repo: <https://github.com/a179-sanae/dsh-auto-collapse.git>
- GitHub: [a179-sanae/dsh-auto-collapse](https://github.com/a179-sanae/dsh-auto-collapse)
- Stars: 36
- Language: JavaScript
- License: [MIT](https://spdx.org/licenses/MIT.html)
- Topics: `cordis`, `deepseek`, `deepseek-harness`, `dsh`, `dsh-plugin`
- Forks: 2
- Open Issues: 2
- Last push: 2026-08-20T17:05:00.000Z
- Added: 2026-08-20T00:00:00.000Z

## Install

```bash
dsh plugin --profile web add github:a179-sanae/dsh-auto-collapse
```

## Wiki

## 一句话定位
一个挂在 DSH Web 聊天界面上的纯前端 DOM 插件，把每一回合里的工具调用卡片和 Think 推理块自动折叠成一行摘要，同时把官方 "Deep diving..." 状态文字替换为 "Deep sleeping..."，让聊天视图只保留模型说的话。

## 核心能力
- 回合完成自动折叠（一级）：回合结束后整段工作过程收成一行 `已处理 X秒`，点击展开可看到完整的上下文注入 → 思考 → 工具调用 → 过程正文 → 最终正文
- 工具块与思考块折叠成 chip（二级）：展开一级后，工具组和思考块各自折叠成一行 chip（运行中显示 `正在运行 {命令}`，完成后显示 `运行了命令` 或 `已思考`）
- 连续思考合并为三级行：多个相邻思考块合成一个标题为 `Think · 第一句` 的合并行，点击展开显示合并后的内容，原始四级行不出现
- 折叠态实时显示当前工作：运行中的 chip 实时展示工具名 + 正在执行的命令/路径/查询，或思考的最新一行
- 替换 "Deep diving" 状态文字：把官方 ChatView 尾部的运行状态行 `Deep diving...` 改为 `Deep sleeping...`，流光特效不变
- 完全可逆：插件卸载（HMR stop）时会还原所有折叠行、被隐藏的 display 和被改写的状态文字，宿主页 DOM 与卸载前一致

## 技术实现
- **语言**: TypeScript（target es2020）
- **关键依赖**: 仅 devDependency 的 `esbuild`（构建用），运行时零依赖
- **架构模式**: 纯 DOM 层 MutationObserver + requestAnimationFrame 协调器；host 半体为空 `apply()` 用于在 cordis 插件树占位；client 半体通过 `ctx.effect` 注册折叠控制器，卸载时由 cordis 自动调用清理
- **入口文件**: `src/client.ts`（浏览器端 bundle 入口，构建产物为 `lib/client.js`），`src/index.ts`（host half，无行为）

## 适用场景
当你在 DSH Web 上和模型做多步任务（搜索、写文件、跑命令、复杂推理）时，每一轮的工具调用和思考过程会把屏幕挤满，只看最终结论的人会觉得很乱。这个插件把中间过程折成一行，需要时再点开看详情，适合希望界面"只剩模型说的话"的普通用户，也适合长时间跟模型来回讨论、想快速扫一眼做了哪些工作的用户。

## 前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| DSH Web client | 未声明 | 仅作为 dsh.client.platform="web" 的客户端插件运行，需挂在 DeepSeek Harness Web 上 |
| Node.js | 未声明 | 仓库本身无 engines 字段；构建/部署脚本运行于 Node 环境 |
| 浏览器 | 现代浏览器（支持 ES2020、MutationObserver、requestAnimationFrame） | 插件运行在浏览器 DOM 中，不依赖 Node-only API |
| 平台 | 跨平台 | 通过 DSH Web 客户端使用，操作系统无关 |
| 原生模块 | 无 | 零原生依赖，纯前端实现 |

## 安装方式
```bash
dsh plugin --profile web add github:a179-sanae/dsh-auto-collapse
```

安装后重启 DSH Web 服务（或触发插件 HMR），在页面上按 `Ctrl+Shift+R` 硬刷新即可生效，无需任何配置。

## 配置项
本插件无需额外配置。

| 配置 | 类型 | 说明 | 默认值 |
|---|---|---|---|

所有行为（折叠节奏、动画时长、文本替换规则）已硬编码在源码中，不向用户暴露任何配置项、不读取环境变量、不注入 slot key。

## 常见问题

**Q: 安装后需要任何配置吗？**

A: 不需要。插件是纯 DOM 层的 UI 增强，不读取任何环境变量、不暴露配置项、不注册 slot key。安装后重启 DSH Web 服务并硬刷新页面（Ctrl+Shift+R）即可生效。

**Q: 它会修改我的消息内容吗？**

A: 不会。插件只控制工作过程（工具卡片、思考块、运行状态文字）的显示与隐藏，不会改动模型生成的消息正文，也不会修改官方任何 slot 注册或数据结构。

**Q: 卸载插件后页面会恢复正常吗？**

A: 会完全恢复。`stop()` 会把所有被改写的 `display` 还原、删除插入的折叠行、把 "Deep sleeping..." 改回 "Deep diving..."，并清理所有 MutationObserver 与 rAF 定时器，宿主页 DOM 与卸载前一致。

**Q: 它和官方 React 渲染冲突吗？**

A: 不冲突。插件不修改任何 React slot，只用 MutationObserver 观察 DOM 变化并在 `requestAnimationFrame` 内合并重放；React 重渲染、节点替换、历史消息乱序挂载都会自动跟上。

**Q: 会影响动画和无障碍体验吗？**

A: 运行中的呼吸动画在用户系统设置 `prefers-reduced-motion` 时会自动停止；折叠行的颜色使用 DSH 原生 label token，浅色/深色主题自动适配。

**Q: 支持哪些工作节点类型？**

A: 顶层 `tool-call`、`command`、`manual-compaction`、`context`（上下文注入）、`thinking`（推理块）、纯图片 final 都按同一回合语义处理；相邻工具组合并，正文是硬边界（不会跨正文合并）。

## 上手难度
入门 — 安装一行命令、重启服务、刷新页面即可使用，没有任何需要理解的概念或配置项。

## 已知问题与限制
- 状态文案替换是强制的：`Deep diving...` 会被无条件改写为 `Deep sleeping...`，且无法关闭（即便用户希望保留原文）；插件卸载时会按节点恢复原文
- 仅支持 DSH Web 客户端：不支持 DSH CLI、桌面端、移动端等其他宿主（`dsh.client.platform` 声明为 `web`）
- 依赖宿主 DOM 契约：识别依据是 ChatView 渲染时写死的稳定 `data-*` 属性（`data-chat-flow` / `data-tool` / `data-state` 等），若官方 Web 客户端 DOM 结构发生变化，折叠功能可能需要适配

---

This document is auto-generated by [deepseek-plugin.org](https://deepseek-plugin.org). HTML page: [dsh-auto-collapse](https://deepseek-plugin.org/plugins/a179-sanae/dsh-auto-collapse)
Wiki generated by AI (model: `MiniMax-M3`)
