Skip to content

fix(workspace): 长草稿下模型与附件菜单保持完整可见 - #8043

Merged
huangruiteng merged 1 commit into
mainfrom
codex/composer-menu-viewport-20261104
Nov 5, 2026
Merged

huangruiteng merged 1 commit into
mainfrom
codex/composer-menu-viewport-20261104

Conversation

@loopx-agent

Copy link
Copy Markdown
Collaborator

Goal And Delivered Outcome

长草稿占据输入框高度后,右下角模型菜单仍按固定视口比例展开,在 390×568 下顶部落到 −38.6 px,裁掉“运行时回读”。本次让模型菜单与附件菜单根据整个输入框上方的实际空间限制高度;同场景顶部回到 17 px,长列表在菜单内部滚动,草稿与发送键保持可见。

  • 依据:现有单一 composer 的模型/思考深度交互;docs/development/design.md#forms 与 #populated-page-review(base 4335a26e20b8b85b9862838b9f86dbbdbc36c4ab)。
  • 当前用户步骤:在原输入框打开配置、选择、读取保存结果;无需导航或新增确认。
  • Intended base: main;从已核对的上述最新远端 main 创建分支,仅本次五个文件。

Author Declaration

  • Written by: model_agent · OpenAI Codex / GPT-6 family。
  • Implemented against: 上述 design contract。
Criterion Disposition Symbol / path Validation
菜单在输入框上方且完整位于视口内 implemented useComposerMenuSpace,现有两个菜单 packaged browser:390×568 → 390×480、六行草稿
单一输入框、嵌套菜单键盘与草稿连续性 implemented 原 WorkspaceSelect / composer End 到末项、两层 Escape、焦点及完整草稿
当前实际配置与后续保存选择区分 implemented / unchanged owner 原 ChatModelMenu、原生 HTTP/store 保存、503 重试/刷新、424 拒绝

Scope And Continuation

  • 两个菜单共用一个仅在展开时工作的布局 hook,处理输入框尺寸、窗口与 visual viewport 变化;关闭/卸载时清理。没有新增 Session、配置或发送权威。
  • 完整交付本次菜单裁切修复。父级会话产品验收继续保留:真实宿主的模型采用、原会话与 Lark 双端等不由本 PR 宣告完成。无新权限、merge、安装或发布动作。
  • 同域整理:复用同一尺寸测量与清理,避免两个菜单各复制一套 observer;不扩展到无关弹窗系统。

Validation

  • Tested revision: b8d3969cbfec34dfc03c31fca83daf518b2e62a3;最终 build:chat manifest 为相同 revision。
  • Run state: finished。Input classes: synthetic, public_fixture。
Check kind Result Evidence / limitation
static passed npm run build:chat(TypeScript + 正式 Chat bundle)、git diff --check
integration passed packaged agent-model-selection:原配置/Session/失败重试断言保留,新增长草稿、短视口、末项滚动、两层 Escape、附件菜单
unit passed npm run smoke:chat-model-menu,双语 SSR 权威与回读边界
real_backend passed LoopX Chat HTTP + 持久化 ChatSessionStore 的隔离实例:当前账户 codex debug models 只读取得的 8 个模型元数据被冻结重放;选择后仅 requested 字段变化,实际仍为旧模型;503 重试并刷新保留;未知模型 424 拒绝且整份 Session 未变
integration passed pytest tests/test_chat_agent_model_http.py tests/test_chat_reasoning_selection.py:59 项,含 active Turn、隔离、拒绝与重试;模型协议替身边界保留
regression_parity passed 实际打包 UI 旧版窄屏 −38.6 px → 新版 17 px;1512×982 桌面、390×568/480 菜单边界与内部键盘滚动
static passed 五文件 public scan;diff semantic advisory 的扫描所有者仅含 loopx/,本次无该范围改动;新 TS hook 已人工核对,无共享状态词表,CSS 变量仅为本地布局
static passed CQR cqr_d28e22c5973351c0e357 exact-scope valid;safe-fix allowed / applied=false;0 blocker/warning/advisory。Goal-aware quick premerge:4 direct + 4 selected,0 failure/hold
  • Coverage and gaps: 浏览器确定性 scenario 使用 synthetic HTTP;另外独立走了原生配置 HTTP/store。没有执行真实模型 Turn,因此不证明宿主实际采用新模型;未验证安装版 App、操作系统软键盘或其他浏览器。CI / 独立 exact-head review / merge readiness 仍由正常 PR 流程负责。
  • 早期直接 Vite build 缺少发布 manifest,补齐完整 build:chat 后 packaged scenario 通过;初次无效测试文件参数未运行测试,以上为修正命令的实际结果。

Frontend / Visual Evidence

  • UI impact: changed。本次只修复菜单可见空间;原有下方工具栏、长草稿和单一发送入口保留。
  • Before:实际旧包 a515aa52ed595b69826f3d0ef04d8d7ac8ff6403,模型菜单同 base 的既有规则,390×568、六行草稿、8 项原生目录;顶部被裁。

Before: narrow menu clipped

  • After:最终 revision,390×568。列表内部滚动,可通过 End 到末项;草稿和发送键完整保留。

After: narrow menu bounded

  • 保存失败可见并在原位重试;截图与最终 revision 源码字节相同,拍摄于签署 commit 前。

After: native save failure recovery

  • 桌面 1512×982 默认与展开视图,最终 revision。

Desktop default

Desktop model readback

  • Source data: public_fixture + 隔离合成会话。桌面正文重放仓库已有 edgebench-grid-context-on-20261103-history.json;它是 runner_invalid / diagnostic-only / score_countable=false 的公开 Grid R7 展示状态,不是实际 benchmark Chat,也不构成得分或模型提升证据。未引入新 benchmark 原始记录。
  • 截图背景的运行绑定/提案不可用是隔离服务未启用这些执行服务的真实读回;未隐藏该限制,未把其标成完整安装版产品验收。此 fixture 禁止模型派发,实际 Turn 数为 0。
  • Attention review:保留上方实际配置、后续选择及错误恢复;长列表收在原菜单内部,不挤走输入框或另设配置页面。桌面沿用现有构图;没有新增说明标签、卡片、颜色或动效。

Type / Area / Boundary

  • Bug fix;test update;dashboard presentation surface。
  • Shared-authority RFC fixture impact: N/A,未改权威 store、迁移或共享协议。
  • Public-safe only;无私有状态、密钥、原始日志、内部链接、本机路径或截图包入 Git。
  • 无成对 RFC 改动;DCO Signed-off-by 已核对。独立 review、CI 与 maintainer merge authority 仍待正常流程。

Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>

@loopx-agent loopx-agent left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

关键代码讲解

  1. useComposerMenuSpace 在 details 打开后测量 composer 上方空间,随输入框尺寸、窗口/visualViewport 变化重算;关闭和卸载时统一断开 observer 与事件。没有 composer 的折叠入口继续使用已有 CSS fallback。
  2. ChatModelMenu 及 ComposerActions 各接入同一 hook。前者仍由原选择/保存 owner 决定模型,后者仍渲染原附件动作,未新增执行入口。
  3. 两处 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.

@huangruiteng
huangruiteng merged commit ca76af8 into main Nov 5, 2026
31 of 45 checks passed
@huangruiteng
huangruiteng deleted the codex/composer-menu-viewport-20261104 branch November 5, 2026 03:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants