AGC 会话区:移除「显示更早的对话」按钮,需要时自动加载更早历史 #510
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
现象
AGC 会话区顶部常驻一颗「显示更早的对话」按钮(见附图)。用户要看到更早的回合只能手动点,而滚动到顶部其实已经会触发同一件事——同一入口两种语义。
hasMore为真时按钮一律显示,用户无法从按钮本身判断"是只差一两条"还是"这一屏根本没装满"。诉求:去掉这个按钮,改成"需要加载时自动加载"。
问题原因(代码事实)
DirectProject 项目对话面板(截图里那个「已打开:…」页面)
chat/components/DirectProjectConversation/DirectProjectConversation.tsx:43-51historyHasMore为真就渲染button.message-history-more,文案固定「显示更早的对话」chat/DirectProjectChatView.tsx:228-232onScroll上:if (historyHasMore && list.scrollTop <= 24) void loadEarlierHistory()src/styles.css:2701-2704、:9251-9254min-height: 340px;工作台内height: 100%; min-height: 96px。首屏切片渲染不满容器时scrollTop恒为 0,永远不会产生 scroll 事件 → 自动入口整条失效,按钮成了唯一入口chat/controller/useDirectProjectChatController.ts:745-789loadEarlierHistory自带historyHasMore/historyLoadingRef双闸;readDirectHistoryPages单次最多 5 页(DIRECT_HISTORY_MAX_PAGES_PER_ACTION),停止判据是"合并后回合数增加"chat/history/directHistoryPaging.ts:8、docs/project-memory/shared-memory/decision-log.md:596-601scrollTop数值不变,视野被推向更早内容——贴顶用户会被持续"拽走"立项策划面板(
PlanningChatView,同类按钮)planning/PlanningChatView.tsx:269-279hiddenConversationCount > 0 || hasEarlierConversationMessages时渲染同一个button.message-history-more,文案「显示更早 · 还有 N 条对话」/「显示更早的对话」src/App.tsx:2077-2095conversationVisibleCount+latestVisibleItems(messages, n);showEarlierConversationMessages只是+CONVERSATION_VISIBLE_STEP(纯同步,无在途态)src/App.tsx:2092-2094scrollTop <= 24才加一屏 → 上表 #3 的零 scroll 事件场景同样存在两处都只是"把更早的内容从上面补进来",机制不同(后端切片 vs 前端窗口),但入口语义与缺口一致。
打算怎么改(方案)
DirectProjectConversation移除button.message-history-more分支与onLoadEarlierHistoryprop,DirectProjectChatView停止传参;PlanningChatView移除按钮分支与onShowEarlierMessagesprop,App.tsx:2220停止传参;src/styles.css:5015删掉.message-history-more规则;:9408的.message-action, .message-history-more组合选择器只摘掉后半段(.message-action仍在用)。scrollTop <= 阈值,把硬编码的24收敛到常量(现有AGENT_CHAT_SCROLL_BOTTOM_THRESHOLD = 48用于"贴底"判定,取页阈值要独立命名,避免两个语义共用一个数字);scrollHeight <= clientHeight + 阈值视为"必须加载"。在挂载后、每次合并历史后、容器尺寸变化(ResizeObserver)后各判一次;hasMore为真就继续取,直到列表可滚动或hasMore=false;historyLoadingRef并发闸与单次 5 页上限;策划侧是同步加一屏,天然无并发,但要保留"一次操作最多 5 步"与"到顶即停"的边界。scrollHeight,合并后scrollTop += 新 scrollHeight − 旧 scrollHeight,保持用户当前可视内容不动。这同时掐掉"贴顶 → 自动取页 → 视野被推向更早内容 → scroll 事件递归触发 → 一路拉到整份历史"的连锁。补偿只在"取页前就贴顶或未填满"时做;用户主动滚回底部后不再自动取页(Direct 侧沿用shouldFollowLatestRef语义)。docs/technical/【技术方案】DirectProject Codex原始历史与异常恢复-2026-09-04.md:95("必须显示『显示更早的对话』入口,并允许按钮或滚动触发");docs/project-memory/plans/【里程碑】DirectProject Thread Manager事件订阅-2026-09-15.md:47;docs/project-memory/shared-memory/decision-log.md:596-601(新增一条决策:入口由按钮改为自动加载 + 允许锚定补偿);chat/history/directHistoryPaging.ts:8注释里的「显示更早」措辞。apps/ai-game-creator-shell/tests/directProjectProcessStatus.test.tsx:28-32,62-66去掉onLoadEarlierHistory;planning侧渲染用例去onShowEarlierMessages;hasMore=true→ 无任何点击自动出现更早回合;② 贴顶取页后可视首条不变(锚定补偿)。变异验证:把"未填满"判据与补偿分别去掉,两条用例各自变红。范围
DirectProjectConversation/DirectProjectChatView/App.tsx的策划链路 /styles.css/directHistoryPaging注释与既有约定文档。read_direct_project_history_slice的limit/beforeItemId/hasMore语义)、historyLoadingRef并发闸、5 页上限、失败保留已成功页的既有行为。验收判据
rg message-history-more只剩.message-action那条样式。hasMore=false早停、单页失败保留已成功页、用户滚回底部后停止自动取页,行为全部不变。npm run ai-game-creator-shell:typecheck、AGC 前端定向用例、npm run check:encoding、git diff --check通过。附
触发场景截图(505×331,AGC 工作台 · DirectProject 项目对话):
会话区顶部整条「显示更早的对话」按钮占掉了列表第一行;这张图里它下方只有一条回合,列表根本没装满一屏 —— 此时
scrollTop恒为 0、不会产生 scroll 事件,挂在onScroll上的自动取页整条失效,按钮成了唯一入口。按钮还是全宽次级按钮,视觉权重和真实回合内容抢第一眼。
