From f344bd20eb865be61b365cb825ab115b73884f71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E6=B3=BD=E6=A5=B7?= Date: Mon, 26 Oct 2026 10:00:47 +0800 Subject: [PATCH 01/32] feat(chat): pin newly sent questions to top with dynamic bottom runway - Pin newly entered user questions directly to the top of the transcript viewport (`PINNED_QUESTION_GAP = 12`) - Maintain a dynamic bottom runway (`data-pin-runway`) so first-screen replies grow downward without moving `scrollTop`, auto-following once the turn exceeds one screen and keeping the runway without bounce when short replies finish - Add AGENTS.md rule to follow production code when documentation conflicts and list discovered conflicts in final responses Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com> --- AGENTS.md | 1 + docs/DESIGN.md | 10 +- docs/STATUS.md | 3 +- packages/chat-ui/README.md | 7 +- packages/chat-ui/src/chat/TranscriptView.tsx | 94 ++++++++++++++++--- .../chat-ui/src/chat/useTranscriptScroll.ts | 24 ++--- 6 files changed, 106 insertions(+), 33 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 54114c33..c22a17b1 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -4,6 +4,7 @@ - 只完成用户请求及其必要结果,不扩展相邻功能或无关重构。 - 以用户当前要求和生产代码为行为事实,不虚构 Droid 能力、API、命令或项目结构。 +- 当文档与现有代码存在冲突时,应遵循代码的写法,并在最后回复中列出发现的所有冲突点。 - 保留用户已有、未跟踪和无关改动;谨慎处理生成文件、Lockfile、Migration 和公共契约。 - 解释、审查和状态查询默认只读;只有用户明确要求修改时才写入文件。 - 文档入口是 `docs/README.md`。计划、状态、能力、架构和设计分别更新 diff --git a/docs/DESIGN.md b/docs/DESIGN.md index cf36c6ef..2030ab60 100644 --- a/docs/DESIGN.md +++ b/docs/DESIGN.md @@ -179,11 +179,11 @@ Context Usage 使用单条分段进度条与“色块 + 名称 + 数值”图例;`/limits`(Usage Limits)在标题行提供 `Standard`/`Droid Core` 分段切换,下方分列 `5-hour usage`、`Weekly usage`、`Monthly usage` 三条独立进度条, 左侧紧接已用百分比,右侧显示重置图标与剩余时间(未开始窗口显示 `Use Droid to start`)。 -- 近底发送保持底部;用户上滑、选择文字或操作嵌套滚动区时取消自动跟随。 - 显式跳底可平滑滚动,减少动画时直接到达。不能靠空白补位掩盖错位或丢内容。 - 工作/回复/压缩/子代理等待提示在实际回到底部后才固定;从历史位置发送或跳转期间仍留在回复末尾, - 不能把“准备跟随”当成“已到达底部”。底部流式跟随时保持提示稳定,短对话紧接正文。 - 运行提示自行承接列表底部留白,实色背景延伸至滚动区底边,正文不能从提示下方空隙露出。 +- 新提问进入聊天列表时直接切换置顶,底部按当前视口剩余高度预留动态留白跑道,AI 在置顶问题下方静止生长回复; + 整轮内容超出一屏后自动向下跟随(问题保留在顶部吸顶条),短于一屏结束时保持底部留白不回弹。 + 用户上滑、选择文字或操作嵌套滚动区时取消自动跟随;显式跳底可平滑滚动,减少动画时直接到达。 + 底部状态区域(`TranscriptView.statusContent`)在实际回到底部后才固定;从历史位置跳转期间仍留在列表末尾, + 底部流式跟随时保持提示稳定,短对话紧接正文,实色背景延伸至状态区底边。 - 历史问题按所属轮次吸顶、由下一问题推离。Plan 归属创建它的问题,完成仍保留摘要, 新计划不删旧计划;回复操作归属整次回答的末尾,运行中不提前显示完成操作。 问题卡片中的计划摘要行保持 28px 高,不叠加容器上下留白;字号、计数与展开步骤保持原有层级。 diff --git a/docs/STATUS.md b/docs/STATUS.md index b5c31eb4..9ad32039 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -17,7 +17,7 @@ | 范围 | 当前实现与边界 | | --- | --- | -| 聊天 | 最新活动独立成行,更早活动归入“执行过程”;正文按时间顺序穿插,历史数量紧随标题。单条工具与 thinking 独立折叠,Edit 默认显示精简 Diff,可在原卡片展开全部,没有 thinking 中间分组;长 thinking 原文分块合并更新并限高滚动。正文与折叠箭头左边缘对齐,失败操作收起时仍可查看。队列预览最多三行;常规设置提供等待/引导,默认等待;daemon 引导不停止当前任务,消费确认后移入聊天,投递不明时暂停保留内容。其余流式、附件、权限/问答、引用和 BTW 保留 | +| 聊天 | 新提问直接切换置顶,底部动态留白跑道承载首屏静止生长的回复,超出一屏后自动向下跟随,短回复结束时保持留白不回弹;最新活动独立成行,更早活动归入“执行过程”;正文按时间顺序穿插,历史数量紧随标题。单条工具与 thinking 独立折叠,Edit 默认显示精简 Diff,可在原卡片展开全部,没有 thinking 中间分组;长 thinking 原文分块合并更新并限高滚动。正文与折叠箭头左边缘对齐,失败操作收起时仍可查看。队列预览最多三行;常规设置提供等待/引导,默认等待;daemon 引导不停止当前任务,消费确认后移入聊天,投递不明时暂停保留内容。其余流式、附件、权限/问答、引用和 BTW 保留 | | 管理页 | 常规、模型、补全、会话、任务;共享设置行、搜索筛选、分页和滚动条,Select 弹层不少于触发器宽度并随单行选项内容扩展,列表刷新保留已有内容 | | Factory 账户与额度 | 设置页侧栏底部显示 CLI 登录的邮箱与姓名,折叠后只留首字母头像,读取走独立非阻塞通道不锁页面忙碌态;`/limits`(Usage Limits)提供 `Standard`/`Droid Core` 分段切换与 `5-hour`、`Weekly`、`Monthly` 三条独立进度条及重置时间。身份取自本地 access token 载荷,额度读取 `GET /api/billing/limits`(EU 账户与 `FACTORY_API_BASE_URL` 走各自主机),结果按窗口缓存 20 秒;token 只留在 Extension Host,未登录或读取失败给出对应提示 | | Mission 创建 | 说明型开关行保持背景稳定,操作按钮随内容收紧;调度/执行/验证代理模型支持搜索,保留来源筛选与现有推理等级 | @@ -40,6 +40,7 @@ ## 最近验证 +- `codex/ui-style-fixes`(新提问直接置顶与动态留白跑道):`TranscriptView.tsx` 与 `useTranscriptScroll.ts` 在新用户提问进入消息列表时直接将其切换置顶(`PINNED_QUESTION_GAP = 12`),底部同步维护动态留白跑道 `data-pin-runway` 使首屏回复静止向下生长、超出一屏后自动向下跟随、短回复结束保持留白不回弹;`AGENTS.md` 补充文档与代码冲突处理规则。`typecheck`、`lint:budgets` 与 5 个转录滚动/锚定/导航测试文件(12 项)全部通过。 - `codex/telemetry-and-daemon-fixes`:GA4 媒体资源 `properties/560369275` 已注册全部 21 个 EVENT 级自定义维度与 17 个自定义指标;`daemonLifecycle.ts` 的 Windows `Win32_Process` 查询限定 `-Property ProcessId,CommandLine`;`windowDaemonPool.ts` 复用在途 `verifyRecords` 批次避免并发重复拉起 `powershell.exe`,并在发现阶段与 `retireEmpty` 中自动回收旧窗口退出后遗留的无会话孤儿 `window-daemon`;`webviewStateDelivery.ts` 在侧栏隐藏期间仅标记待重放快照,不再每 30 秒刷写 `host.view.state-delivery` 警告;`webviewHtml.ts` 忽略内联无 `src`/`href` 的 `