Repository navigation
[建议] 长会话上翻时历史记录在眼前消失:渲染窗口 RENDERED_ROW_CAP 可配置(默认 120) #1909
steel-code-agent
started this conversation in
Ideas
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
[建议] 长会话上翻时历史记录在眼前消失:渲染窗口 RENDERED_ROW_CAP 可配置(默认 120)
感谢维护 dsh-TUI。先说结论:这不是要求把常量直接改成 600,而是希望把“渲染窗口”做成可配置项,默认值保持 120 不变;需要回看长会话的用户可以自行调到 600。这样既保留现有的性能保护,也不牺牲长会话的可读性。
现象
在 fullscreen 长会话(记录数超过 120 条)里:
show previous messages (N) · Ctrl+E的位置);Ctrl+E(showAll)后它们又出现。期望:向上阅读时,已经显示出来的历史不要被新输出顶掉;或者至少可以配置窗口大小。
Ctrl+E能恢复,说明渲染层本身支持显示全部记录,只是默认窗口只有 120 条。根因(已验证)
src/components/MessageList.tsx:58:const RENDERED_ROW_CAP = 120src/components/MessageList.tsx:537:const hiddenCount = rows.length - RENDERED_ROW_CAPsrc/components/MessageList.tsx:603-605:hiddenCount增大,slice窗口整体前移,于是最旧的可见行被裁掉。src/components/MessageList.tsx:1534:showAll为 false 时显示show previous messages (N) · Ctrl+E分隔条;Ctrl+E走showAll,绕过 120 窗口。src/channel/transcript.ts:19的MAX_ROWS = 600;超过 600 时src/dsh-adapter/channel/transcript.ts的foldRows会折叠最旧的行(只留 preview,session log 仍是完整真源)。所以 120 是“渲染窗口”,600 是“内存/折叠窗口”,两者都不删除历史。建议
方案 A(推荐,最小改动):新增
renderedRowCap配置/设置,默认 120,范围 1..600(或MAX_ROWS)。MessageList增加可选 proprenderedRowCap,缺省回退RENDERED_ROW_CAP;Chat.tsx从 channel/settings 传入;src/settings/definitions.ts增加kind: 'number'的设置项,默认 120;visibleCache的 key 加上cap,避免设置变更后窗口缓存不失效;方案 B:自适应——贴底时 120,向上滚动/离开底部时提升到 600。无需用户配置,交互更好,但逻辑更复杂,需要处理 sticky 状态与窗口切换。
方案 C:直接把常量改成 600。不推荐:所有用户默认承担变化,也违背现有 120 作为性能保护的设计。
性能
MessageList已有虚拟滚动,实际挂载的仍是视口内的行;cap只影响visibleRows的 slice、预扫描和 offsets/margins。Ctrl+E的showAll已经会渲染全部 600 行;cap = 600的负载与现有showAll相同,而不是把实际渲染量放大 5 倍。代码草案
// src/components/MessageList.tsx const RENDERED_ROW_CAP = 120 export function MessageList({ ... + renderedRowCap = RENDERED_ROW_CAP, ... }) { - const hiddenCount = rows.length - RENDERED_ROW_CAP + const cap = Math.max(1, renderedRowCap) + const hiddenCount = rows.length - cap ... - visibleCache.showAll !== (showAll || hiddenCount <= 0) || + visibleCache.cap !== cap || + visibleCache.showAll !== (showAll || hiddenCount <= 0) || ...// src/screens/Chat.tsx <MessageList ... + renderedRowCap={channel.renderedRowCap} foldTerminalCommand={channel.foldTerminalCommand} ... />接线可以完全照
foldTerminalCommand的现有模式:settings/definitions.ts增加 number 项 →dsh-adapter/plugin.ts的 Schema/applyDisplay →channel/state.ts与preferences.ts增加字段与 setter →Chat.tsx传给MessageList。这样设置页、配置层和持久化都会自动覆盖。兼容性与测试
Ctrl+EshowAll、hiddenCount分隔条、设置变更后缓存失效、窄屏/inline/fullscreen。关于贡献流程
我看了
.github/ISSUE_TEMPLATE/config.yml:功能建议走 Discussions Ideas,所以我把提案发在这里;如果方向认可,请维护者开 issue 跟踪,或指定已批准的贡献者。我不在
.github/APPROVED_CONTRIBUTORS名单里,按pr-gate不能直接提交实现 PR。如果这个方向值得做,我可以提供完整 patch、聚焦回归脚本,以及在 inline/fullscreen 和窄终端下的手动验证结果;也可以由维护者转交给合适的贡献者。再次感谢维护者的工作。120 这个上限本身是合理的性能保护,这里只是希望让长会话用户能自行选择窗口大小。
All reactions