- Accueil
- Plugins
- Améliorations UI
- dsh-streamfold
dsh-streamfold
rezon-aki/dsh-streamfold
Repli progressif de la transcription web DSH : ouvre automatiquement la fenêtre de réflexion la plus récente, regroupe les anciennes lignes de processus en un résumé et ramène doucement le tour terminé au prompt, qui reste épinglé pendant la lecture.
Installer
dsh plugin --profile web add github:rezon-aki/dsh-streamfoldREADME
dsh-streamfold · 流式折叠
运行中只保留最新那一个思考窗,其余过程行折成一条摘要;一轮跑完,滑回你的提问。折叠逐帧推进,折起的内容仍可 Ctrl+F 搜到。

为什么需要它
长会话里,工具调用与思考过程会把正文淹掉;官方的「紧凑」档在会话还有未加载历史时会折叠失效,历史加载完之前帮不上忙。本插件在官方对话流上做展示增强,折叠按自己的规则走,不依赖历史是否加载完:
- 过程不再淹没正文:非运行轮次收成一条「已折叠 N 行 · 点击展开」;
- 想看的随时看得见:运行中只留最新那一个思考窗,限高、内部自滚;
- 读完一轮不用往回翻:跑完自动回到你这轮的提问处。
和官方「工作步骤展示」的差别
| 官方「工作步骤展示」 | 本插件「折叠」 | |
|---|---|---|
| 什么时候折 | 历史加载完才开始折;还有未加载历史时折不动 | 自己管折叠,不依赖历史是否加载完 |
| 运行中的思考 | 过程行一并折起,只看得到摘要 | 只展开本轮最新那一个思考窗(限高、内部自滚) |
| 跑完一轮 | 停在底部,要自己往回找 | 平滑滑回你这轮的提问处 |
| 找折叠内容 | 折起后要再展开 | hidden=until-found,Ctrl+F 仍能命中 |
| 读到哪一轮 | 往上翻着找 | 在顶端固定一个快速导航 |
装完是什么样
- 运行中看得到思考。 自动展开本轮最新的思考窗(限高可调),旧的按宽限折回一行摘要;被取代的、上一轮的窗不再抢滚动。
- 折叠有节奏,不闪。 收起从下往上、一组 3 行、组间 70ms;展开从最上面往下、同样一组 3 行。加载页面、切会话这类跨轮批量场景直接瞬时完成;单轮再长也逐组推进(只有单轮超过 84 行才走瞬时护栏)。
- 正文超过一屏时。 设置页最上面的「正文到顶时」点「停下读正文」那条:正文输出时到页面顶部自动停止滑动,停在正文开头方便直接阅读;默认仍是「跑完回到提问处」。
- 跑完回到提问处。 一轮结束,视图平滑滑回你这轮那句话的位置;开启「提问不入折叠」且这一轮里 LLM 问过你(
ask_user_question)时,落点改在这一轮最后那张提问卡上并自动把它展开(要你答的是它)。你自己上滚过就不动你。到位后 2 秒内还会纠正图片/代码块迟到落版造成的偏移。 - 顶端固定快速导航。 读到哪一轮,会话顶端就固定一条快速导航(显示那一轮的提问,一行、超出省略);它自己在屏幕上时自动让位,点它滑回那句发言。
- 跟随够稳。 底部跟随按帧推进;上滚即停跟,离底出现「回到底部」;在思考小窗或工具正文里滚动不会误触发「停止跟随」。
- 搜索也照顾。 折叠的内容仍可被 Ctrl+F 搜到;搜索期间不抢滚动,滚回窗尾或点回底恢复。
- 小窗火花 / 正文锻打。 思考窗底部的火星随滚动速度变亮变密;正文流式写头每写一段砸出一扇火星。颜色、密度、速度、寿命都可调,关掉即完全不运行。


安装
方式一:DSH 插件面板(推荐) —— 侧栏 →「插件」→「添加插件」,粘贴下面这一行,装完点「立即启用」:
dsh-streamfold
面板装的就是本版(npm 上
latest即本版,含 provenance)。方式二适合想跟仓库最新代码的人。
方式二:命令行(三种写法):
dsh plugin --profile web add dsh-streamfold # npm 包(推荐)
dsh plugin --profile web add github:rezon-aki/dsh-streamfold # 跟仓库最新
dsh plugin --profile web add https://github.com/rezon-aki/dsh-streamfold
装完重启 profile,然后刷新浏览器页面(客户端代码在页面加载时注入)。
兼容性(package.json 的 engines.dsh 是唯一真源,插件面板与市场也按它判断兼容):
| 插件版本 | 支持的 DSH |
|---|---|
| 0.7.x(本版) | >=0.2.1-rc.1 <0.3.0;契约面实测到 0.2.1-rc.4(rc.2→rc.4 客户端 bundle 逐字节一致 + 本机 rc.4 加载),0.2.0-rc.2 / 0.2.1-rc.2 登记为兼容 |
| 0.5.0 | 0.1.7 系列 |
| 0.4.x | 0.1.5 及更早 |
官方「对话显示」档位由 configForms 服务托管;Node >= 20。
卸载:在插件面板里移除,或
dsh plugin --profile web remove dsh-streamfold
重启 profile 即恢复官方行为。
用法
设置 → 通用设置 → 工作步骤展示:这一行由本插件提供(官方那一行在本插件的设置行可用时隐藏,只改可见性、可逆;0.2.1 起官方新增的「工作步骤收起时机」行在折叠档下一并隐藏、切到官方档恢复),里面是官方四档 + 本插件的「折叠」:
| 选项 | 行为 |
|---|---|
| 简洁 / 标准 / 详细 / 完全展开 | 官方原本的四档,文案与行为都跟官方一致 |
| 折叠 | 本插件:运行中的一轮只留一个窗,其余过程收成一条摘要 |
选「折叠」时,官方那一档会被自动停在 完全展开——官方自己不折、不分组,折叠只由本插件做,避免两层折叠打架;档位名与官方设置页同源(取自官方词典),官方改了文案这边跟着变。
专属设置页:设置 → 流式折叠(本文所有开关都在这里,改动即时生效)。
运行中只会自动展开最新那一个思考窗;你自己点开的窗不会被自动收起,被取代的旧窗按「旧窗折叠宽限」(默认 2 秒)折回一行摘要;上滚即停跟,离底时出现回底按钮(小窗与主窗口是同一个按钮)。
安全边界
- 纯客户端展示增强:只读对话 DOM,不发网络请求、不接触凭据、不改官方源码。
- 宿主半区不落任何东西:不读写文件、不注册路由、不导出 Config;设置只存浏览器 localStorage(key
dsh-streamfold,按页面源站隔离)。 - 对官方档位只做可逆改动:选「折叠」档时把官方
ui-chat的transcriptView写成 verbose(避免两层折叠)并隐藏官方设置行(0.2.1 起含「工作步骤收起时机」行);从本插件切回官方档会写回所选档并恢复收起时机行,卸载后官方档停在「完全展开」(需要时到官方设置里改回)。 - 卸载即净:设置行、小窗标记、回底按钮与注入样式全部撤掉,不留行内
max-height与隐藏属性。
配置(22 项)
| 设置项 | 键 | 默认 | 取值/范围 | 说明 |
|---|---|---|---|---|
| 正文到顶时 | settleToPrompt | 跑完回到提问处 | 跑完回到提问处 / 停下读正文 | 「跑完回到提问处」= 跟随到底,跑完滑回提问(已自己滚过就不动);「停下读正文」= 正文输出时到页面顶部自动停止滑动,停在正文开头方便直接阅读 |
| 工作步骤展示 | mode | 折叠 | 折叠 / 官方四档 | 选「折叠」时官方档自动停到「完全展开」,避免两层折叠 |
| 折叠历史轮次 | foldHistory | 开 | 开关 | 关掉后:加载页面不再自动折叠历史轮次(只在跑动时折前面的) |
| 保留穿插正文 | keepInterleavedText | 开 | 开关 | 折叠时保留带正文的行,用一条横线与正式回答分开(正文不套限高小窗) |
| 提问不入折叠 | keepUserQuestions | 开 | 开关 | LLM 的提问工具(ask_user_question)与其回复节点始终保留、不折进摘要,且「跑完回到提问处」改落到最后那张提问卡上;关掉则随其余内容一起折 |
| 跟随速度上限 | followMaxSpeed | 240 | 60~2000 px/s | 主动追赶时的速度上限;越小越柔、高速输出时落后越多。内容自身增长的速度不受它限制 |
| 跟随加速度上限 | followMaxAccel | 10000 | 2000~120000 px/s² | 速度变化的上限;调小起步/刹车更柔,调大更跟手 |
| 窗口高度 | windowHeight | 360 | 80~1200 px | 单个思考/穿插正文小窗的最大高度 |
| 运行中自动展开思考 | autoExpandReasoning | 开 | 开关 | 只自动展开本轮最新的那一个;被取代的旧窗按「旧窗折叠宽限」折回一行摘要 |
| 旧窗折叠宽限 | supersedeDelay | 2 | 0~60 秒 | 新的思考窗出现后,旧窗再等多久才自动折回(支持小数) |
| 运行中自动展开工具 | autoExpandTools | 关 | 开关 | 开:运行中最新的工具卡自动展开(用官方卡片自己的折叠/内滚,不套限高小窗) |
| 发消息回到尾部 | returnToTail | 开 | 开关 | 你停在中途(看过置顶、跳转过轮次)时,自己再发一条消息 ⇒ 视图滑回尾部;关掉后一律停在原地,只有滚到底或点「回到底部」才恢复跟随 |
| 平滑系数 | smoothGrow | 0.15 | 0.05~0.9 | 跟随时每帧吃掉多少差距,越小越柔 |
| 离底显示「回到底部」 | showJumpButton | 开 | 开关 | 离开底部时出现回底按钮(跟随中的轻微落后不显示,避免闪烁) |
| 置顶显示提问 | pinPrompt | 开 | 开关 | 把「你正在看的那一轮」的提问固定在会话顶端做成快速导航:往上滚会跟着换成那一轮,超过一行只显示一行;它自己在视口里时自动让位,点它滑回那句话 |
| 动效过渡 | animations | 开 | 开关 | 关掉则折叠/展开/回底全部瞬时 |
| 小窗火花 | sparks | 开 | 开关 | 运行中思考小窗底部的火星(关掉后不建画布、不排帧) |
| 火花颜色 | sparkColor | #4fa8ff | 颜色 | 火星颜色;核心自动提亮成白热 |
| 正文锻打火花 | forgeSparks | 开 | 开关 | 正文流式写头砸出的火星;写头不动就不砸,跑完自动收手 |
| 锻打火花速度 | forgeSpeed | 1 | 0.2~4 × | 火星飘出去的速度倍率 |
| 锻打火花寿命 | forgeLife | 1.3 | 0.2~5 秒 | 单颗火星活多久(实际在 ±30% 内随机) |
| 火花密度 | sparkDensity | 1 | 0.2~3 × | 火星数量倍率,两种火花共用;越高越密、绘制开销越大 |
设置存在浏览器 localStorage(按 DSH 页面源站隔离)。
诊断
浏览器控制台(__dshStreamfold 是本插件公开的控制面/调试入口,其中 fx 为火花测试契约;本体不含日志、探针或逐帧采样):
__dshStreamfold.state() // 当前设置 + 官方「工作步骤展示」取值快照
__dshStreamfold.set({ smoothGrow: 0.1, supersedeDelay: 3 })
__dshStreamfold.scan() // 立即按当前 DOM 重扫一次(不改设置)
__dshStreamfold.dispose() // 撤掉全部注入(幂等;卸载后刷新页面即恢复原生)
报问题时附上 DSH 版本与 __dshStreamfold.state() 的输出。
开发与验收
- 手写、无构建:
lib/client.js(浏览器半区,包在window.__ModuleLoader__里)、lib/index.js(宿主半区,12 行占位)。 - 改完
lib/*.js后重载插件,并刷新浏览器页面。 - 行锚点全部用官方语义属性:
[data-chat-flow]、[data-chat-flow-kind]、[data-chat-turn]、[data-disclosure-row][aria-expanded]、[data-variant=think]、[data-tool]、[data-sample=bash]、[class*=_thinkBody]、[class*=_bodyWrap]、[data-context-injection-body]——不用 CSS module 哈希。 - 测试:
npm test(test/spark.mjs28 断言 +test/contract.mjs+test/client-apply.mjs),当前 EXIT=0。
License
MIT
Plugins associés
dsh-web (dsh-task-board)
zhu1090093659/dsh-web
dsh-web (dsh-web-all)
zhu1090093659/dsh-web
dsh-TUI
ccch1mneyyy/dsh-tui
dsh-web-ui (dsh-task-board)
zhu1090093659/dsh-web-ui