DeepSeek Harness Hub
← 返回列表

dusbin/dsh-chat-fold

DeepSeek Harnessspec-screened在 GitHub 查看 ↗
未验证

折叠/展开AI回复的Think、Read、Edit 等操作内容,默认只展示重要信息

尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/9/5 · 已提供中文文档
综合分
29.5
GitHub 分
29.5
用户评分
★ Stars
1
周下载量
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add dusbin/dsh-chat-fold
该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
数据截至 2026/9/18(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

dsh-chat-fold — DeepSeek Harness 对话过程折叠插件

给 DeepSeek Harness Web 界面(dsh web)的对话窗口增加「展开 / 折叠」控制:
折叠 = 彻底隐藏全部 AI 思考过程(Think) 与工具执行过程(Bash / Read / Edit 等 tool-call),
AI 回复正文与用户输入始终全文显示、永不折叠;点「展开全部」可把过程行显示为 5 行预览。
纯浏览器端实现,零后端、零 API key。

当前版本:v0.1.8(变更记录见 CHANGELOG.md)

功能一览

1. 右上角单个自切换按钮 —— 会话标题栏右上角(conversation.session.header.actions
槽位,与 Agent 预设、任务状态等按钮同一行)放一个按钮,和每条回复上的单按钮
交互一致:
- 折叠态显示 「▾ 展开全部」:把 Think / Bash / Read / Edit 等过程行暴露出来,
每行默认半展开显示前 5 行内容/摘要(点击某行展开完整详情);
AI 回复与用户输入全文始终可见;新流式到达 / 滚动加载内容按当前模式自动处理;
- 再点变成 「▴ 折叠全部」:彻底隐藏全部过程行(纯思考步骤整条消失);
- 模式状态持久化到 localStorage(dsh-chat-fold:mode),刷新 / 重开会话后保持。
2. 两级展开:
- 展开(暴露行,5 行预览):全局「展开全部」或单条「展开回复」都让过程行可见,
默认显示前 5 行内容(Think / Read / Edit 摘要)+ 右下「展开详情 ▾」提示;
- 展开详情:点某一条 Think / Read / Edit 的预览区,才展开它的完整详细内容;
点「折叠全部 / 收起回复」或折叠一轮后再展开,会回到 5 行预览。
3. 每条 AI 回复一个同款单按钮 —— 在每条已完成回复的操作条上(与「🔊 朗读」等
按钮同一行)有 「展开回复 / 收起回复」:只展开/收起这条消息自己的过程行
(5 行预览,作用域覆盖全局折叠、只限本条);回复正文与用户输入不受影响、始终全文。
全局与单条互相独立,工具栏一键复位全部。
4. 输入内容重点突出 —— 用户输入气泡始终完整显示,并带有蓝色高亮描边;
折叠模式下描边更强,让「输入内容」成为折叠态下的视觉锚点,一眼定位每一轮提问。
插件不折叠、不隐藏任何用户输入。

文件结构

dsh-chat-fold/                # ← git 仓库根
├── package.json              # dsh.client 声明(platform: web → 浏览器端 bundle)
├── lib/
│   ├── index.js              # Node 半身:空插件(让 loader 能创建 fiber)
│   └── client.js             # 浏览器端 bundle(全部功能所在,手写、零构建)
├── test/
│   └── smoke.test.mjs        # 冒烟测试:模块表 + 假 DOM 适配器(44 项断言)
├── README.md
└── CHANGELOG.md

安装(一次性接线)

若本机尚未完成接线,按以下步骤操作;web profile 已接线时会直接加载本仓库。

1. 把插件软链进 web profile 的 node_modules(使 dsh-chat-fold 可被 Node 与
client-modules 从 profile 目录解析):

mkdir -p ~/.dsh/profiles/web/node_modules
ln -sfn /Users/robinddu/Desktop/workspace/robinddu/dsh-chat-fold \
~/.dsh/profiles/web/node_modules/dsh-chat-fold

2. 在 ~/.dsh/profiles/web/cordis.patch.yml 追加:

dsh-chat-fold: 对话过程折叠插件(浏览器端;右上角 折叠/展开)
- insert:
- id: chat-fold
name: 'dsh-chat-fold'
config:
defaultMode: 'folded'     # 初始模式:folded=折叠思考/工具/AI回复 | expanded=全部展开
userEmphasis: 'auto'      # 用户输入高亮:auto | strong | none
replyFoldMinChars: 120    # 短于此字符数的 AI 回复不折叠,直接展示全文
debug: false

3. 重启 dsh web(首次安装需重启以重新扫描 client 插件清单),浏览器硬刷新
(Cmd+Shift+R)。之后代码改动只需硬刷新页面即可生效。

为什么是 dsh-chat-fold(包名)而不是绝对路径:client-modules 会用条目名解析
/package.json 并据此扫描 dsh.client 声明、服务 /plugins//client.js;
loader 的 Node 侧 import 也从 profile 目录解析包名。软链一次接线、两处生效。
浏览器端 bundle 只依赖 react(平台种子模块),无需 node_modules 软链到 harness。

使用

1. 打开任意会话,在对话窗口右上角看到一个按钮:折叠态显示 「▾ 展开全部」。
2. 点 「展开全部」:所有 Think / Bash / Read / Edit 过程行暴露出来,
默认半展开显示前 5 行内容/摘要,AI 回复显示全文;按钮翻转为 「▴ 折叠全部」。
3. 想看完整细节:点那条 Think / Read / Edit 的预览区 → 展开该行完整详细内容;
想全部看细节也可以逐条点开。
4. 点 「折叠全部」:过程行完全隐藏(纯思考步骤整条消失),界面只剩提问与
回复;AI 回复与用户输入始终全文显示;用户输入气泡带更强高亮。
5. 单条回复:点该回复操作条上的 「展开回复 / 收起回复」:只展开/收起本条
消息自己的过程行(5 行预览,只限本条、全局不变);回复正文不受影响。
全局按钮可一键复位所有单条状态。

工作原理 / 技术要点

- 完全依赖会话 DOM 上的稳定语义属性,不碰 hashed CSS class:
- 消息流容器:[data-conversation-scroll]
- 每条消息:[data-chat-flow-kind](user / assistant-step / tool-call …)
- AI 思考块:[data-variant="think"] 内的 Disclosure 行
([data-disclosure-row][role="button"][aria-expanded],与内置「Think」行同源)
- 工具执行卡片:tool-call 消息内的
[data-expandable][role="button"][aria-expanded]
- 展开 = 暴露行并半展开为 5 行预览(移除隐藏 class / 打 dsh-fold-scope-open
+ dsh-fold-expose-half 裁剪);完整详情由用户点击预览区展开(capture 拦截防误收起)
- 折叠引擎(createCore)职责:
1. collectTargets 收集当前已渲染的全部可折叠目标(含展开态);
2. scan:按作用域归位(隐藏/暴露行、scope-open、5 行半展开预览),
预览只自动打开到 5 行,不自动展开全文、不干预用户已展开的完整详情;
3. applyAll(open):一键作用于当前所有目标(按钮语义),忽略用户临时开关;
4. AI 回复正文永不折叠:引擎不对回复正文做任何裁剪/隐藏,折叠与展开只作用于
思考(Think)与工具执行(tool-call)过程行;findReplyWrapper 仅用于定位
“某条最终回复”以便作用域归属与单按钮挂载;
5. 每条回复的单按钮:注册进 conversation.chat.assistant-actions 官方槽位
(与复制 / 🔊 朗读同一条操作条),从按钮 DOM 上溯到 turn-tail 再取其前一个
assistant-step 定位「本条回复」,toggleReplyForFlow 只改这条的 override 与 class,
与全局模式解耦;按钮经回复 revision store 订阅刷新「展开回复 / 收起回复」状态;
6. 彻底折叠隐藏:折叠态下由插件 CSS 直接隐藏过程行 ——
html[data-dsh-fold-mode="folded"] [data-variant="think"](思考行)与
[data-chat-flow-kind="tool-call"](Bash/Read/Edit 工具卡)display:none;
纯思考步骤(只有 Think、无正文)由 isThinkOnlyStep 识别后打 class
dsh-chat-fold-step-hidden 整条隐藏,避免留空行;
7. 用户输入气泡标记:结构性探测(圆角 ≥ 14px、非 display: contents、非透明的
div)找到气泡并加上自有 class dsh-chat-fold-user-bubble,由插件自己的 CSS 描边,
不依赖任何 hashed class。
- MutationObserver 监听 body 子树(childList + 关键属性),变更后 200ms 防抖扫描,
因此流式输出、翻页虚拟化加载的块都能被自动接管。
- 模式状态经 subscribeMode/publishMode 模块级 store 管理,React 槽位组件用
useSyncExternalStore 订阅,按钮按下态与引擎状态始终一致。
- 本目录是插件的唯一可信源(source of truth),已用 git 管理。

开发 / 测试

npm test                  # 冒烟测试(Node,44 项断言:识别/归位/彻底隐藏/过程行预览/单按钮/作用域展开/纯思考步骤/气泡标记)

若需手工验证 DOM 行为(点击 Disclosure 是否驱动 React 展开等),可参考仓库
docs/ 之外的开发会话记录;核心假设已内置在冒烟测试与注释中。

已知边界

- 折叠 = 彻底隐藏思考过程(Think)与工具执行过程(Bash / Read / Edit 等 tool-call,
含纯思考步骤);AI 回复正文与用户输入永不折叠、始终全文显示;
「展开」模式把过程行显示为 5 行预览,点某行看完整详情。
- 过程行 5 行预览采用 CSS 裁剪(max-height ≈164px + 渐隐),展示的是该行开头内容
而非语义摘要;如需真正的「要点摘要」,需接入 LLM 或文档解析,超出纯前端插件范围。
- 若上游 Harness 改变消息流 DOM 语义属性 / 消息容器结构,插件需要跟随升级;所有
依赖点集中在 collectTargets / findUserBubble / findReplyWrapper 与少量常量里,
改动面很小。

卸载

1. 从 ~/.dsh/profiles/web/cordis.patch.yml 删除对应 insert 段;
2. 删除软链 ~/.dsh/profiles/web/node_modules/dsh-chat-fold;
3. 重启 dsh web;残留的 localStorage 键 dsh-chat-fold:mode 无副作用,可不管。

License

MIT

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

同作者(dusbin)的其他插件

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群