npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

dsh-streamfold

v0.7.2

Published

流式折叠:一个更好的会话窗口——运行时自动展开最新思考小窗、旧窗自动折叠,跑完把思考与工具调用折起,全程水流般的动效。

Readme

dsh-streamfold · 流式折叠

license format npm

一个更好的会话窗口:运行中自动展开最新的思考小窗,其它过程行折成一条摘要;一轮跑完,思考与工具调用自动折起,穿插正文保留。全程按帧推进,像水流一样。

为什么需要它

长会话里,工具调用与思考过程会把正文淹掉;官方的「紧凑」档在会话还有未加载历史时会折叠失效,历史加载完之前帮不上忙。本插件在官方对话流上做展示增强,折叠按自己的规则走,不依赖历史是否加载完:

  • 过程不再淹没正文:非运行轮次收成一条「已折叠 N 行 · 点击展开」;
  • 想看的随时看得见:运行中只留最新那一个思考窗,限高、内部自滚;
  • 读完一轮不用往回翻:跑完自动回到你这轮的提问处。

装完是什么样

  • 运行中看得到思考。 自动展开本轮最新的思考窗(限高可调),旧的按宽限折回一行摘要;被取代的、上一轮的窗不再抢滚动。
  • 折叠有节奏,不闪。 收起从下往上、一组 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,然后刷新浏览器页面(客户端代码在页面加载时注入)。

要求 DSH >= 0.2.0-rc.2(官方「对话显示」档位由 configForms 服务托管;0.1.7 系列请用 0.5.0,0.1.5 及更早请用 0.4.x)。

卸载:在插件面板里移除,或

dsh plugin --profile web remove dsh-streamfold

重启 profile 即恢复官方行为。

用法

设置 → 通用设置 → 工作步骤展示:这一行由本插件提供(官方那一行在本插件的设置行可用时隐藏,只改可见性、可逆),里面是官方四档 + 本插件的「折叠」:

| 选项 | 行为 | | --- | --- | | 简洁 / 标准 / 详细 / 完全展开 | 官方原本的四档,文案与行为都跟官方一致 | | 折叠 | 本插件:运行中的一轮只留一个窗,其余过程收成一条摘要 |

选「折叠」时,官方那一档会被自动停在 完全展开——官方自己不折、不分组,折叠只由本插件做,避免两层折叠打架;档位名与官方设置页同源(取自官方词典),官方改了文案这边跟着变。

专属设置页:设置 → 流式折叠(本文所有开关都在这里,改动即时生效)。

运行中只会自动展开最新那一个思考窗;你自己点开的窗不会被自动收起,被取代的旧窗按「旧窗折叠宽限」(默认 2 秒)折回一行摘要;上滚即停跟,离底时出现回底按钮(小窗与主窗口是同一个按钮)。

安全边界

  • 纯客户端展示增强:只读对话 DOM,不发网络请求、不接触凭据、不改官方源码。
  • 宿主半区不落任何东西:不读写文件、不注册路由、不导出 Config;设置只存浏览器 localStorage(key dsh-streamfold,按页面源站隔离)。
  • 对官方档位只做可逆改动:档位读写走 DSH 自己的设置服务;本插件的设置行可用时只隐藏官方那一行(可见性、可逆)。
  • 卸载即净:设置行、小窗标记、回底按钮与注入样式全部撤掉,不留行内 max-height 与隐藏属性。

配置(22 项)

| 设置项 | 键 | 默认 | 取值/范围 | 说明 | | --- | --- | --- | --- | --- | | 工作步骤展示 | 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 | 开 | 开关 | 离开底部时出现回底按钮(跟随中的轻微落后不显示,避免闪烁) | | 跑完回到提问处 | settleToPrompt | 开 | 开关 | 一轮结束后平滑移到本轮你那句话的位置;开启「提问不入折叠」且本轮有 LLM 提问卡时改落到这一轮最后那张卡(并展开它);你已经自己上滚过就不动你(动效关掉时直接到位) | | 置顶显示提问 | 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.stats()          // 窗口 / 折叠 / 折叠条计数(含动效状态)
__dshStreamfold.probe()          // 行状态、还看得见的思考行、小窗动画、回底按钮、火花开销、跟随明细
__dshStreamfold.state()          // 当前设置 + 官方「工作步骤展示」取值快照
__dshStreamfold.set({ smoothGrow: 0.1, supersedeDelay: 3 })

报问题时附上 probe() 的输出与 DSH 版本,定位会快很多。

开发与验收

  • 手写、无构建: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.mjs 28 断言 + test/contract.mjs + test/client-apply.mjs),当前 EXIT=0。

License

MIT