# dsh-thought-fold 3.1.3:统一间距与失败工具归组 ## 截图反馈与本轮证据 用户对照 Codex 指出两项未解决的问题:正文/摘要不等距,超时及不支持内容类型的工具错误仍逐行外露。 - **分组规则错误**:旧 runtime 将所有 `root.error` 和错误根节点作为 protected 边界。已结束的工具失败既无法进入局部分组,也迫使完成态改用保护性总包络。此次只取消历史工具失败的豁免,审批、提问、表单、未知告警与轮次终止提示继续外露。 - **两套布局叠加**:局部按钮统一 `margin-block:2px 4px!important`,但插入位置有外层 flow(原生margin)和内层 AssistantMarkdown(原生16px gap)两种。实际旧版混合场景复现上方2px/18px、下方20px,失败工具还把连续组拆成三个入口。此前仅比较不同隐藏数量的增长,没有断言相邻可见块等距,测试覆盖不足。 - **修正**:局部按钮边距归零,外层只对实际参与排版的可见兄弟施加16px节奏,排除隐藏/挂起/空控制器/滚动切片;内层沿用原生16px gap。摘要左对齐并使用轻量图标;以实际思考/工具/命令/其他节点计数替代“过程 · N 项”,失败次数保留提示,详细错误点击查看。 ## 已执行验证 - 修改生产代码前新增3个场景,全部在旧构建上失败:运行态漏折叠、完成态被错误保护强制切换控制器、失败工具与待回答问题未区分。 - `npm test`:51项node:test与既有VM自检通过,设置生命周期131个断言。 - `node --test test/host-contract.browser.test.js`:16项通过。运行态与完成态展开的相邻正文/摘要/底部控制行间距均16px;1/6/20/21条隐藏内容不累积空白。 - 390/834/1556px三种视口,21次失败与成功调用合并:两条摘要、24px行高、16px相邻间距、横向溢出0。 - 独立审查发现实际宿主工具结果是`kind:tool-result + isError`,`error`字段可选。测试改为直接执行原版`rootResult`后,运行/完成/连续21次失败三个场景均复现漏计;production已纳入`root.isError === true`,仍保留旧格式兼容判断。 - 使用原版宿主AssistantMarkdown/ReasoningRow/DisclosureRow/useSearchableHidden/rootResult及CSS;工具示例行、Markdown解析与装饰图标是显式最小替身。不是当前用户真实会话DOM验收,也不代表所有富文本内部排版已自动验证。 - 截图:`output/playwright/transcript-rhythm-running.png`、`output/playwright/transcript-rhythm-completed-open.png`,均为宿主组件合成数据截图。 - 最终3.1.3生成客户端复跑:`npm test`(51项及VM自检)、`npm run test:browser`(68项交互 + 16项宿主契约)全部通过,退出码0。原有67项浏览器测试保留,审批/失败工具语义分拆使总数增至68。 - 三档宽度均补测展开/再收起:260px局部视口、前后16px、无横向溢出、React原节点与父节点不变;收起后恢复原始间距。 - 独立只读审查指出的`isError`遗漏已修复并有红绿测试证据。最终本机旧版对照确认生产变更限于摘要、保护分类和样式;未改动process-viewport及总折叠算法。 - 语法、生成一致性和`git diff --check`通过;仅既有LF/CRLF提示。 ## 打包及本机安装 - `npm pack --ignore-scripts --json`:`dsh-thought-fold-3.1.3.tgz`,910,035字节,18个包文件均与工作区SHA-256一致;解包后的生成检查通过。发布前仅将README下载说明改为正式发布措辞后重打包,生产代码未再变更。 - SHA-256:`e529a8b2f90692d3aede33fdb30a911f8bc9429da5e1c5dec5052fdd0f48f5b3`,另附同名`.sha256`文件。 - 官方`dsh plugin --profile desktop add <本地3.1.3.tgz> --prefer-offline --ignore-scripts`退出码0。插件列表显示3.1.3,8个关键安装文件与工作区一致,其余16个直接插件版本未变。 - 安装器报告peer警告,并调整profile依赖树(+1/-47);未手动修改无关依赖,未声称整个传递依赖树不变。 - 包校验首个PowerShell命令因本机.NET无`Path.GetRelativePath`失败;改为兼容的Substring路径计算后,18个文件及生成检查全部通过。 - 保留旧包供回退,未修改宿主源码,未自动重启、提交Git或远程发布。 **仍需真实会话验收**:完整退出并重新打开DSH后查看原会话。此前GUI只读诊断返回403,本轮未重复访问或绕过,也未启动替代服务器;当前截图是原版宿主组件的合成场景,不冒称Codex像素级复刻或原会话端到端通过。 --- # dsh-thought-fold 3.1.2:思考漏折叠与收起空白修复(历史记录) ## 本次根因与失败证据 这次不是只调整摘要样式。新增 `test/host-contract.browser.test.js`,读取本机已安装宿主的 `toAssistantBlock`、`AssistantMarkdown`、`ReasoningRow`、`DisclosureRow`、`useSearchableHidden` 与原版 CSS 区域,使用合成消息复现: 1. **分类漏判**:宿主元数据保留 `reasoning + tool-call + 空白text`,但不在 AssistantMarkdown 中渲染 tool-call。旧 onlyReasoning 判断拒绝 tool-call,使思考整行漏出。旧构建的 running 与 completed-open 两种场景均实测原行可见、高46px、局部入口0个。 2. **隐藏不等于不占排版间距**:旧隐藏规则只压成零高,仍作为原生 flex 容器的子项参与16px gap。真实 CSS 测得内层 N=1/6/20/21 时下一正文间距为36/116/340/356px;外层原生margin场景始终20px,未冒称外层也复现。 3. **宿主重绘覆盖 hidden**:宿主移除 HTML hidden 而插件marker仍在时,旧样式同帧恢复30px高度并把正文下推30px。 4. **空 Markdown 容器补充缺陷**:即使思考本身退出排版,空白text仍有空div容器;在包含真实工具块和空文本的组合中独立复现16px逐项累加。 ## 修复 - 新纯函数 `isReasoningOnly` 忽略宿主另行渲染的 tool-call,仍拒绝正文、图片和未知可见块。 - 插件marker独立控制隐藏,使用绝对定位退出排版并保留 `hidden=until-found`;不对有内容的过程节点使用display:none,以保留beforematch展开路径。 - 逐块核对本机原生 text/reasoning 渲染结构,仅标记元数据空且DOM确实为空的文本容器;`:empty`限定使新流式内容在同帧恢复显示。媒体/扩展结构不匹配时不猜测隐藏。 - 保留原节点身份、原生展开、流式正文、设置、总折叠、计时、底部/浮动收起和停用恢复。 ## 实际验证 - 原始宿主契约基线9项:4通过/5失败;新增空文本组合在中间修复上2项失败。失败不是通过修改断言消除。 - 修复后 `npm test`:50个node:test及既有VM自检通过。 - 修复后 `npm run test:browser`:原有67项交互回归通过;新增12项宿主契约测试全部通过。 - N=1/6/20/21,无论纯思考、思考+工具+空文本、运行期或历史展开,所测下一正文间距均20px、增长0px;宿主移除hidden同帧高度仍0、正文不位移。 - 空文本开始流式写入同帧可见;原生展开、beforematch事件、卸载节点身份/状态恢复均通过。 - 测试可用 `DSH_TEST_HOST_APP` 指定DSH安装app路径;默认指向本机安装,读取指定组件区域而非整段会话或配置。Markdown富文本解析、装饰图标和图片seat使用明确记录的最小替身。 **边界**:当前GUI根页面只读浏览器诊断仍返回HTTP403,没有现成CDP连接,未绕过授权或自动重启用户实例;本次是已安装宿主组件/CSS的合成数据验收,不是当前真实会话DOM验收。beforematch为事件级测试,不冒称浏览器Ctrl+F原生界面已自动验证。 ## 打包及本机更新 - 安装包:`dsh-thought-fold-3.1.2.tgz`,905,358 字节,18个包文件逐一与工作区SHA-256一致,解包后的生成检查通过。 - SHA-256:`6afbbcd4e758cdb836e62afd5fa0b86e8c707ac38969b3c600c4c2df3047b07c`;校验文件:`dsh-thought-fold-3.1.2.tgz.sha256`。 - 官方更新命令退出码0,Desktop插件列表已显示3.1.2;安装后7个关键文件校验一致,其余16个直接插件版本未变。 - 安装器仍报告peer依赖警告,未擅自调整其他插件。旧包保留供回退;没有自动重启DSH。 - 真实宿主组件的修复后截图:`output/playwright/host-contract-running-21.png` 与 `output/playwright/host-contract-completed-open-21.png`,均为合成消息,不是用户原会话截图。 未提交Git、未远程发布。需完整重启DSH后确认用户原会话效果。 --- # dsh-thought-fold 3.1.1:正文优先、非正文统一折叠(历史记录) ## 本轮修正 用户反馈 3.1.0 仍逐行显示思考摘要、单条工具与上下文,不够简洁。本轮按正文而非过程类型划分局部组: - 默认将连续的思考(含原生摘要)、工具、context、system-prompt、command 及其他非正文扩展合并为单一“过程 · N 项”入口。 - 正文、图片、用户插话是硬边界;审批、提问和错误等需要注意或操作的节点仍外露。 - 混合 Assistant 消息按 blocks 顺序划分思考与正文,隐藏思考及空包装,不隐藏文本行,不搬移原始 React 节点;成员按各自 offsetParent 换算局部滚动坐标。 - 没有 Turn 归属的上下文独立分组,不推断归属到邻轮。 - 保留两个设置开关;默认状态相同则合并,不同时按展开状态分段。显式切换设置可重置该类默认开合;普通重绘和总/局部收放不重置用户选择。 - 正常模式中位于回答之后、Turn 结束之前的非正文也进入完成态总成员,避免落在底部收起按钮之外。 - 保留现有总折叠、真实用时、局部限高滚动、底部/浮动收起、插话与中断保护及停用清理。 ## 验证和安装状态 - `npm run build`、`npm test`:通过,46 项 node:test 及既有 VM 自检通过。 - `npm run test:browser`:最终 67 项通过,0 页面错误;保留原有60项覆盖并新增7项统一折叠验收。 - `node --check` 核心源码/浏览器脚本、`git diff --check`:通过。 - 视觉复核发现运行期挂起的原生总按钮被高优先级样式强制显示,已修复并增加必须不可见的断言,最终复跑通过。 - `npm pack --ignore-scripts --json`:生成 `dsh-thought-fold-3.1.1.tgz`,18 个文件,903,886 字节。 - 解包后的生成检查通过,18 个包文件逐一与工作区 SHA-256 一致。 - 官方命令 `dsh plugin --profile desktop add <3.1.1.tgz> --prefer-offline --ignore-scripts` 退出码 0;安装列表显示 3.1.1,安装后7个关键文件与工作区一致。其余16个直接插件版本未变,安装器仍报告 peer 警告,未擅自调整其他插件。 - 安装包 SHA-256:`038780e42a67ed7b0ae381b43f4e44b66921399311e01804e3049a52f8f8316e`,校验文件为 `dsh-thought-fold-3.1.1.tgz.sha256`。 - 已保留3.1.0旧包供回退;未自动重启DSH,需完整重启后验收真实会话。未提交Git或远程发布。 截图:`output/playwright/concise-process-collapsed.png`。这是 React/Edge 测试夹具的截图,已确认正文之间的8个混合过程成员全部不可见且占用高度为0,只剩单一入口;不是重启后真实 DSH 会话的端到端验收。 --- # dsh-thought-fold 3.1.0:Codex 两级过程折叠(历史记录) ## 本次交付 - 运行中正文与插话始终外露;连续同类思考/工具形成独立局部组,默认关闭,正文、媒体、插话与交互提示切断分组。 - 确认 Turn 关闭、存在有效结束序号且无 running/流式节点后,才启用总折叠;保留最终回答、插话及错误/审批提示。总展开不强制展开局部组。 - 设置页新增“折叠思考”和“折叠工具”,分别持久化 `foldReasoning` / `foldTools`,默认 true;关闭后默认展开,不关闭整轮总折叠。用户手动状态优先。 - 局部明细默认最大 260px,滚轮/键盘/触摸可用;嵌套原生输出面板优先消费滚动。以原行的可见高度和行内滚动定位,不搬移或复制 React 消息节点。 - 原生与兼容总入口均读取真实 Turn 起止时间;时间缺失/倒序显示“已完成”,不是伪造 0s。停用恢复原标签和显示状态。 - 保留底部/唯一浮动收起、历史补载、插话保护、中断末条正文保留、原生/兼容切换、主题外观开关及停用清理。 ## 本次实际验证 | 命令或检查 | 结果 | | --- | --- | | `npm run build` | 通过,已更新生成的 `client.js` | | `npm test` | 41 个 node:test 通过,设置生命周期 131 次断言及既有 VM 自检通过 | | `npm run test:browser` | 本机 Edge headless + React,60 项交互回归全部通过,0 页面错误 | | `node --check` 核心源码/生成客户端/新增浏览器脚本 | 通过 | | `git diff --check` | 通过,仅工作区已有 LF/CRLF 转换提示 | | `npm pack --ignore-scripts --json` | 通过,生成 `dsh-thought-fold-3.1.0.tgz`,18 个包文件,902,535 字节 | | 解包构建检查与逐文件 SHA-256 比较 | 通过,18 个文件全部与工作区一致 | | `dsh plugin --profile desktop add <本地3.1.0安装包> --prefer-offline --ignore-scripts` | 退出码 0;已更新本机 Desktop 配置 | | 安装后 `dsh plugin --profile desktop list` 及文件校验 | 显示 3.1.0;7 个关键文件与工作区一致;其余16个直接插件版本未变 | | `dsh plugin --profile desktop peers check` | 退出码 1:报告其他插件的宿主模块/React peer 缺失及 dsh-skill 版本冲突;未擅自修复无关依赖 | | 当前 GUI 的 `/api/dsh-thought-fold` 只读检查 | HTTP 403;未绕过授权,未做当前已安装插件的会话验收 | 浏览器测试是独立 React/Edge 夹具,不是当前 `127.0.0.1:43120` 已安装插件的端到端验收。夹具参照本机宿主的 `data-tool`、`data-disclosure-row`、role=button、懒挂载详情与 timeline 字段;触摸采用 CDP 事件,beforematch 采用事件派发,不等同于物理手机或浏览器 Ctrl+F 界面测试。未新增插件源码依赖、改动宿主源码、提交 Git、推送或发布 Release。本次已通过官方插件命令更新 Desktop 配置,未重启运行中实例。 ## 本次回归与修复证据 - 保留并复跑原有 42 项浏览器行为;新增 18 项覆盖两级归属、混合正文、独立开关、原生真实结构、动态插入排序、限高滚动、停用与用户状态接管。 - 审查发现长行焦点偏移、历史成员顺序、原生详情限高、用户手动状态恢复和嵌套触摸优先级问题,均补实现及对应交互检查。 - 实测复现仅视觉裁剪会导致外层滚动高度从 784px 膨胀到 5246px。改为实际可见高度切片后,双组 5000px 内容不再撑大外层滚动范围,组间不重叠。 - 切片后浏览器会自动滚动原行以显示焦点;已同步到局部框逻辑滚动位置,长行末尾链接焦点与点击回归通过。 - 证据截图:`output/playwright/codex-local-expanded.png`(测试夹具截图,不是实际 GUI 效果图;已排除出版本管理与安装包)。 ## 后续安装验收 已将版本从 3.0.3 升为 3.1.0,并更新至 `C:/Users/32057/.dsh/profiles/desktop/node_modules/dsh-thought-fold`。旧版 3.0.3 安装包保留供回退。未自动退出或重启 DSH;完整重启后,还需验证真实会话流式输出、含插话历史轮次及“折叠思考/折叠工具”设置保存。不能把本地安装成功等同于重启后的真实界面已验收。 安装包:`dsh-thought-fold-3.1.0.tgz`(902,535 字节)。 SHA-256:`9b5d5d26a800419511f15681e808162845f6271e6570d6f718971d3fa1478714`。 校验文件:`dsh-thought-fold-3.1.0.tgz.sha256`。安装时 pnpm 报告 `+1 -47` 的依赖节点变化并提示 peer 警告;复核后17个直接插件仍在,仅本插件版本发生变化。peer 检查列出的其他插件依赖问题未在本任务内更改,需与安装后的真实运行验收分开看待。 --- # dsh-thought-fold 2.2.0 验证记录(以下为历史记录) ## 交付范围 在 2.1.0 基础上增加: - 已进入聊天流的 user/steering 插话处分段,保留用户消息。 - 运行中的轮次,仅在前段步骤/工具明确结束、结束序号不晚于插话边界时折叠前段;尾段保持可见。 - 已结束的中断轮次,即使没有最终回答锚点也能折叠过程;保留最后一段已输出正文以及停止、错误、长度限制提示。 - 每段复用底部与唯一浮动入口,标明轮次/段号。 - 单独纯思考消息不再额外包组;最终回答内部的原生 inline 思考入口仍可见、可操作。 没有替换已安装插件、修改宿主源码/组成/通用设置,也没有部署到当前 GUI。v2.2.0 源码与标签已推送至 GitHub;保留 2.0.0 与 2.1.0 安装包用于回退。 ## 实际执行结果 | 验证 | 结果 | | --- | --- | | `npm run build` | 通过 | | `npm test` | 77 个 node:test 用例/子用例全部通过,原有客户端 VM 检查通过 | | 其中分段边界测试 | 63 项通过,包含未知/非法边界、步骤未结束、正文保留与独立思考规则 | | 其中设置生命周期测试 | 原有 10 个用例、69 次断言通过 | | `npm run test:browser` | 本机 Edge headless + React 18,37 项全部通过,0 页面错误 | | `git diff --check` | 通过;只有 Git 的 LF/CRLF 提示 | | `npm run pack:plugin` | 通过;打包前自动构建 | | 解包后 `scripts/build-client.js --check` | 通过 | | 包内客户端及三个源文件与工作区字节比较 | 全部一致 | ## 浏览器覆盖 保留 2.1.0 的全部 18 项回归:历史默认折叠、最终回答保留、长/短过程入口、输入框增高、窄窗口、多组冲突、会话切换、延迟加载、原生/兼容切换、beforematch、焦点保持、开关与卸载清理、空闲不扫描等。 新增 19 项: 1. 单次 steering 插话前后独立分段。 2. 多次插话形成多段,展开状态相互独立。 3. flow 中 user 类型插话也作为边界。 4. 原生整轮入口让位后,展开段无双重隐藏。 5. 运行轮次的已结束前段可收起,尾段可见。 6. 前段步骤/工具未结束时不提前收起。 7. 排队、尚未进入 flow 的插话不切段。 8. 已结束且没有回答的中断轮仍能折叠过程。 9. 没有 finalAnswer 锚点仍保留最后有正文的部分回答;尾部独立思考不额外包组。 10. 错误与 max-tokens 提示保持可见。 11. 插话后中断仍保留插话和部分回答。 12. 历史延迟补载插话/中断轮次不遗漏或重复控件。 13. 分段手动展开在重绘及尺寸变化后保持。 14. 分段浮动入口只收当前段。 15. 总开关停用后原生状态保持原样。 16. compact→normal→compact 往返,原生开合状态不被插件修改;任一模式停用均清理。 17. 模拟宿主 useSearchableHidden 的合法 focus reveal;分段与停用不点击原生整轮按钮。 18. 最终回答内 inline 思考控件可以聚焦、展开与收起;停用恢复原生隐藏。 19. dispose 后解除分段接管,重绘不再介入。 这些测试在独立页面运行真实 React 和 Edge,以本机打包宿主的字段及渲染结构构造数据,并在专项场景中模拟宿主的隐藏布局 effect。**不是当前 GUI 中某个真实会话的安装后验收**。beforematch 用例直接派发该事件,不等同于自动操作浏览器 Ctrl+F 界面。 ## 审查与修复记录 - 明确插话边界缺少有效序号时,不借用轮次结束序号折叠;已结束轮次同样执行严格边界校验。 - 独立思考消息不额外包组,避免重复收起控件。 - 审查发现“强制点击打开原生按钮,再恢复”的策略存在按钮重建/延迟提交状态泄漏,已改为纯显示接管:用自有标记覆盖显示,不修改原生展开状态。 - 记录隐藏属性是否由原生控件拥有,避免切到标准模式后恢复过时的原生隐藏。 - 对最终回答的 data-turn-process-inline 包装也提供可撤销显示接管,保留其原生思考开关。 - 专项测试发现 React 18 布尔 hidden 夹具与真实宿主 hidden="until-found" 行为不同,已改用宿主式布局 effect 验证,没有放宽恢复断言。 ## 安装包 - 文件:`dsh-thought-fold-2.2.0.tgz` - 大小:32,694 字节 - SHA-256:`2534b88f22a4ea951e08ec5112f4413d2fdcb50dc690ded120193a59a8c7d231` - 包内 12 个文件,不含测试依赖、宿主参考提取物或临时缓存。 ## 安装后验收建议 安装新包并重启 DSH 后: 1. 打开包含中途插话的旧会话,检查插话可见、前后段独立收起。 2. 同时展开两段,滚动到第二段并使用浮动入口,检查第一段不受影响。 3. 打开手动停止或报错的会话,检查过程收起,但末尾已有正文及提示可见。 4. 对包含最终回答内联思考的会话,检查原生思考开关仍能操作。 5. 切换紧凑/标准视图,再停用插件,检查内容与原生控件恢复。 未知旧格式或缺少可靠步骤/轮次结束边界的段故意保持可见,不以猜测方式隐藏内容。尚未收到结束确认的重试、审批或网络等待不视为中断。