Repository navigation
fix(workspace): 长草稿下模型与附件菜单保持完整可见 - #8043
Conversation
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: model_agent; gpt-6.1-sol; OpenAI; runtime_reported; reasoning_effort=max.
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
动机 / Motivation
在聊天中写长草稿、再选择模型或附件的用户。390×568 窄屏输入六行草稿后,旧模型菜单顶部越出视口约39px;新菜单从17px起在输入框上方滚动,最末 ultra 选项仍能用键盘到达,草稿不丢失。模型与附件菜单按输入框上方的实际可用空间收缩,保留既有选择、关闭与保存重试流程。不改变模型执行、权限或保存 owner,不将合成页面验证称为已安装 App、系统软键盘或真实模型验证。
评审 head b8d3969cbfec34dfc03c31fca83daf518b2e62a3,基线 4335a26e20b8b85b9862838b9f86dbbdbc36c4ab。未发现阻塞性问题。当前登录账号也是 PR 作者,因此采用 COMMENTED 评审承载结论。
改动思路 / Approach
单一 DOM 派生值复用于两个现有菜单,保持选择、保存和权限 owner,避免引入并行状态或菜单框架。本 PR 只调整已有聊天输入框菜单的几何与对应浏览器回归;不扩展模型执行、设置协议或安装范围。保留既有 WorkspaceSelect 的键盘与焦点控制、实际/下次模型设置和保存重试,只在打开菜单时观察输入框与可视区域。max(0, composer.top − visualViewport.offsetTop − 24) 是当前 DOM 的派生值,无需新增持久配置。已有 drawer overlay 与 textarea autogrow 分别测量其他资源,不能直接承担此菜单规则;这里让两个同资源消费者复用一个 hook,范围合适。
| 相同任务:390×568、六行草稿 | 实际菜单范围 | 可观察结果 |
|---|---|---|
| 基线 | 顶部 −38.59px,底部359px | 上方内容被视口裁切 |
| 此 head | 顶部17px,底部359px | 原滚动区内可到达最末 ultra 选项 |
这是本轮实际页面测量,HTTP 数据为合成 fixture;不以它推断真实模型采用或生产数据 freshness。
具体改动 / Changes
关键代码讲解
useComposerMenuSpace在 details 打开后测量 composer 上方空间,随输入框尺寸、窗口/visualViewport 变化重算;关闭和卸载时统一断开 observer 与事件。没有 composer 的折叠入口继续使用已有 CSS fallback。ChatModelMenu及ComposerActions各接入同一 hook。前者仍由原选择/保存 owner 决定模型,后者仍渲染原附件动作,未新增执行入口。两处 max-height取既有像素上限、dvh 与实际空间的最小值。现有 browser example 增加长草稿、小屏和 End/Escape 回归,没有另建测试框架。
规范依据为 docs/development/design.md,不可变修订 4335a26e20b8b85b9862838b9f86dbbdbc36c4ab。Forms:复用现有输入、菜单、焦点和保存恢复;Populated Page Review:检查桌面与窄屏完整填充页、展开内容和错误状态,两项在此 head 均 implemented。
独立验证:基线/head 均通过实际构建、model-menu SSR 与 CSS 变量检查;SSR 本身不能发现裁切,实际 Ego 页面才复现上述基线反例。head 在390×480下模型菜单25..271px、附件207..269px,均在输入框278px以上。End 到 ultra、两层 Escape、焦点返回和六行草稿保持均已核对。503保存不改实际/已保存下次值;重试成功并 reload 后只更新下次模型,实际模型仍保留,未发送模型 Turn。四次 composer observer 注册全部退休,折叠菜单 fallback 仍在视口内。
独立原生 HTTP/store 验收 59 passed;quick premerge 4 direct+4 selected PASS,精确范围 CQR PASS。未查询或等待远端 CI。
对主干的风险 / Risks
主要风险是 long draft/缩放时仍裁切、observer 生命周期泄漏,或错误状态混淆实际与下次选择。实际基线反例、resize、重复开关清理与503重试/readback分别覆盖这些方向。五文件共77增4删,主要是38行共享 hook 与既有回归例扩展;无持久 schema、权限、默认模型、scheduler 或并行决策 owner 改动。这里有意改变菜单默认几何,PR 已明确说明。
保留验证工具的限制:首个几何脚本在断言与证据保存后因不支持的 snapshot 参数退出;observer 脚本误以为保留草稿时会折叠,清理草稿后的 fill 校验又遇到输入框卸载。没有重放已完成动作;后续完整503重试脚本和独立 DOM/observer 读回确认结果,因此不声称每个驱动脚本都 exit0。浏览器使用实际 bundle 加合成 HTTP 数据;真实 owning backend 由另行59项验收覆盖,二者边界保持明确。
我的整体评价 / Verdict
同意这一完整菜单修复。单一 DOM 派生值复用于两个现有菜单,保持选择、保存和权限 owner,避免引入并行状态或菜单框架。本 PR 只调整已有聊天输入框菜单的几何与对应浏览器回归;不扩展模型执行、设置协议或安装范围。
实际编译的完整聊天页以12条长中英文消息、8个模型及6档 effort 填充;桌面默认与展开视图保持一个输入框,14px 正文可读。窄屏展开菜单的标题、完整选项和保存错误留在同一视口,长列表通过原滚动区可达,没有新增说明卡片或横向溢出。
未验证范围:已安装 App、OS 软键盘偏移、其他浏览器及真实 Host/model 未验证;页面 HTTP 使用合成 fixture,生产 freshness/排序/持久采用不由截图证明。原任务额外必需交互轮数为零,保留原选择与错误重试。没有从界面几何或测试通过推断长程收益。此结论不授予合并权,合并资格另行读回。
English verdict: APPROVE — the reproduced long-draft popup crop is fixed at b8d3969cbfec34dfc03c31fca83daf518b2e62a3; actual browser geometry, keyboard/draft/retry paths, native backend tests and local premerge passed. Installed OS keyboard and live-model behavior remain unverified; this is a COMMENTED author-account conclusion.
Goal And Delivered Outcome
长草稿占据输入框高度后,右下角模型菜单仍按固定视口比例展开,在 390×568 下顶部落到 −38.6 px,裁掉“运行时回读”。本次让模型菜单与附件菜单根据整个输入框上方的实际空间限制高度;同场景顶部回到 17 px,长列表在菜单内部滚动,草稿与发送键保持可见。
docs/development/design.md#forms与#populated-page-review(base4335a26e20b8b85b9862838b9f86dbbdbc36c4ab)。main;从已核对的上述最新远端 main 创建分支,仅本次五个文件。Author Declaration
useComposerMenuSpace,现有两个菜单WorkspaceSelect/ composerChatModelMenu、原生 HTTP/storeScope And Continuation
Validation
b8d3969cbfec34dfc03c31fca83daf518b2e62a3;最终build:chatmanifest 为相同 revision。finished。Input classes:synthetic,public_fixture。npm run build:chat(TypeScript + 正式 Chat bundle)、git diff --checkagent-model-selection:原配置/Session/失败重试断言保留,新增长草稿、短视口、末项滚动、两层 Escape、附件菜单npm run smoke:chat-model-menu,双语 SSR 权威与回读边界codex debug models只读取得的 8 个模型元数据被冻结重放;选择后仅 requested 字段变化,实际仍为旧模型;503 重试并刷新保留;未知模型 424 拒绝且整份 Session 未变pytest tests/test_chat_agent_model_http.py tests/test_chat_reasoning_selection.py:59 项,含 active Turn、隔离、拒绝与重试;模型协议替身边界保留loopx/,本次无该范围改动;新 TS hook 已人工核对,无共享状态词表,CSS 变量仅为本地布局cqr_d28e22c5973351c0e357exact-scope valid;safe-fix allowed / applied=false;0 blocker/warning/advisory。Goal-aware quick premerge:4 direct + 4 selected,0 failure/holdbuild:chat后 packaged scenario 通过;初次无效测试文件参数未运行测试,以上为修正命令的实际结果。Frontend / Visual Evidence
changed。本次只修复菜单可见空间;原有下方工具栏、长草稿和单一发送入口保留。a515aa52ed595b69826f3d0ef04d8d7ac8ff6403,模型菜单同 base 的既有规则,390×568、六行草稿、8 项原生目录;顶部被裁。public_fixture+ 隔离合成会话。桌面正文重放仓库已有edgebench-grid-context-on-20261103-history.json;它是 runner_invalid / diagnostic-only / score_countable=false 的公开 Grid R7 展示状态,不是实际 benchmark Chat,也不构成得分或模型提升证据。未引入新 benchmark 原始记录。Type / Area / Boundary