把 DSH Web 聊天界面里的工具卡片和 Think 推理块折叠成一行摘要,并把"Deep diving"改成"Deep sleeping"。
- 语言
- JavaScript
- License
- MIT
- 分支
- main
安装
$ dsh plugin --profile web add github:a179-sanae/dsh-auto-collapse在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程
对话式安装
帮我安装 DeepSeek Harness 插件 a179-sanae/dsh-auto-collapse:先查看仓库 https://github.com/a179-sanae/dsh-auto-collapse.git 确认安全性,然后执行安装命令并验证插件加载成功。
把这段指令粘贴给 DSH Web GUI 里的助手,由它代你完成安装与验证。
一句话定位
一个挂在 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 客户端使用,操作系统无关 |
| 原生模块 | 无 | 零原生依赖,纯前端实现 |
安装方式
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 结构发生变化,折叠功能可能需要适配
DeepSeek Harness Web 客户端插件:把会话里的工具卡片与 Think 推理块自动折叠成一行摘要,让界面只保留模型说的话。
English: README.en.md
这是什么
dsh-auto-collapse 是一个纯前端 DOM 插件,挂在 DeepSeek Harness Web 聊天界面上,把工作流程折叠成一行行摘要——工具调用、推理过程不再占据整屏,呈现接近 VSCode Codex 桌面端的折叠体验,同时将“Deep diving” 修改为 “Deep sleeping”。它不改动消息内容,只控制工作流程的显示状态。
效果预览

特性
- 回合完成自动收起(一级):每个回合完成后,工作过程收成一行
已处理 X秒,只留模型最终正文;点击展开完整工作流程(上下文注入 → 思考 → 工具调用 → 过程正文 → 最终正文)。 - 二级折叠行:展开一级后,工具调用组与思考块各自折叠成一行 chip(
正在运行 {命令}/运行了命令/已思考),点击展开/收起;相邻工具组合并,正文输出是硬边界(不会跨正文合并)。 - 三级思考合并:展开
已思考后,连续思考合并为一个三级思考行(标题Think · 第一句),点击展开合并内容块;原始四级行不出现。 - 原生视觉对齐:图标盒 16px / glyph 14px / 行高 24px / 行距 16px,颜色使用 DSH 原生 token(
--dsw-alias-label-*),思考与命令图标取自 DSH 原生图标(IconThinkOutline14/IconApiOutline14)。 - 流式友好:同一个
assistant-step原地补正文、React 换节点和历史乱序挂载都会重新协调;running 状态带文字平滑呼吸动画,prefers-reduced-motion下停止动画。 - 完整工作类型:除 tool-call 外,顶层
command/manual-compaction、context 和纯图片 final 都按同一回合语义处理。 - 可逆:卸载(HMR stop)时完整还原所有折叠/隐藏/改写。
安装
已发布 npm 包(推荐,使用构建好的版本):
dsh plugin --profile web add "dsh-auto-collapse"
从 GitHub 安装(开发版或需要跟随 main 分支时):
dsh plugin --profile web add "github:a179-sanae/dsh-auto-collapse#main"
安装后重启 DSH web 服务(或触发插件 HMR),页面 Ctrl+Shift+R 硬刷新即可生效。无需任何配置。
开发
项目结构
src/fold.ts 核心:FoldController(状态机)+ findBlocks(块识别)+ 折叠/展开逻辑
src/client.ts 浏览器端入口(注册插件)
src/index.ts host half
build.mjs esbuild 构建(lib/client.js 的注册 id 在 banner 里)
deploy.mjs 安全部署:校验 → 备份 → 替换 → 身份核验重启 → 哈希验证/回滚
cordis.patch.yml profile 树挂载
test/ fake DOM 契约、竞态、会话切换与 40 组乱序排列回归
检查
npm run check
依次执行 TypeScript 检查、构建和全部回归测试。
快速部署(本机开发)
npm run deploy
脚本先核验插件/DSH 包名和 3080 监听进程身份,再做时间戳备份、替换、重启与服务端哈希验证;失败自动恢复旧 bundle。可用 DSH_AUTO_COLLAPSE_LIB、DSH_DIR、DSH_WEB_PORT、DSH_LOG_DIR 覆盖默认路径。
发布新版本
更新 package.json 中的 version 后,发布到 npm(prepack 钩子会自动构建):
npm publish --access public
本机开发也可以只打包为 tgz:
npm pack --pack-destination <本地插件目录>
将 profile 的 package.json 中插件依赖更新为新 tgz 路径后重新安装插件。
关键机制
- 块识别(
findBlocks):顶层节点按 tool-call、command/manual-compaction、context、thinking 和正文分类;user/steering/turn-tail 是不可跨越的硬边界。 - segment 协调:每轮根据当前 DOM 顺序重建 segment;最后一个含文本或媒体的
assistant-step是 final,其余正文是中间过程。稳定 flow/key 复用展开状态,不依赖一次性 mutation 事件。 - 时长:流式回合按 segment 分别记录 running 起点;历史回合从官方时长或
timeStart/turn-tail 解析。格式X秒/X分Y秒,整分省略秒位。 - React 共存与可逆性:节点替换后按稳定 key 重新绑定;一级行被移除会按原展开状态重建;所有 inline
display在首次改写前保存并精确恢复。
许可
MIT
收录徽章
[](https://deepseek-plugin.org/plugins/a179-sanae/dsh-auto-collapse)把这段 markdown 粘贴到你的 GitHub README,链接回本插件详情页。徽章只声明已被本站收录,不代表安全认证。