Skip to content

refactor(workspace): unify sending controls in the message composer - #7344

Merged
loopx-agent merged 4 commits into
mainfrom
codex/unified-conversation-composer
Oct 25, 2026
Merged

loopx-agent merged 4 commits into
mainfrom
codex/unified-conversation-composer

Conversation

@loopx-agent

@loopx-agent loopx-agent commented Oct 25, 2026 •

Copy link
Copy Markdown
Collaborator

消息输入区原先把执行器和模型放在页面顶部,把附件、快捷操作、队列方式和发送分散在底部;窄屏下难以看清本次发送会使用什么配置。本改动将它们收进一个输入框:上方写消息,下方左侧为附件与快捷操作,右侧为执行器、模型、推理深度和发送。说明移入按需帮助,错误与投递回执仍直接显示。

同时修复一个可复现的数据保留问题:执行器拒绝创建 Session 或应用模型配置时,请求尚未进入 Turn,输入框也会丢失草稿。现在只在已确认未提交的准备阶段恢复草稿与图片;发送后结果不明的请求仍保留原有恢复边界。

复用 ChatModelMenu、WorkspaceSelect、原有配置、Session、队列和消息入口。权限和全局默认项仍在 Settings。当前配置所有者切换模型时仍新建 Session,菜单明确标示“新对话配置”;本 PR 不实现原 Session 内切换模型。只读原始会话、阅读页折叠输入区和托管管家的配置入口保持原边界。

验证与范围

  • 编译后的 Chat 页面:桌面和 390px 窄屏布局;菜单在整个输入框上方;Escape、焦点、草稿与图片保留;选择模型和推理深度后实际发送到原生测试协议。
  • 真实 HTTP/store 与隔离的原生 provider 替身:配置拒绝 424 后草稿保留,旧消息可回读,Turn 数量不增加;撤权与恢复仍按原有权限执行。没有调用付费模型或发送真实用户消息。
  • 最终集成 head 上:113 个模型/推理深度/队列/steering 测试、12 个键盘/主题测试、原始会话 HTTP/Core/SQLite 检查、模型选择/消息输入/LoopX 模式的打包浏览器检查通过。前置检查的 4 项直接检查与 16 条选中命令通过,10 项 PNG 人工审查已完成;自动状态仍为 manual_review_required。按当前配置未查询或等待 CI。
  • 扩展探测发现四个旧问题:返回页面后的 steering 回执、旧托盘耗时定位、刷新失败恢复、部分工作列表计数。同一夹具、独立主干与本分支的完整失败对象已经比对一致,保留失败原文,不作为通过结果;精确范围 CQR 保留 failed/risk 归因。
  • 本次证据来自打包页面与公开合成数据,没有证明已安装 App、真实原生输入法、Lark 全流程或整个研究工作台的验收完成。

视觉证据

捕获版本:菜单修复 2c79ded40;最终集成与回归版本 35a54e9ed(同步主干原始会话读取修复)。示例包含长模型名、中英混合正文、失败结论、待检查结论、草稿和图片。

桌面:调整前 桌面:调整后
Desktop before Desktop after
窄屏:调整前 窄屏:调整后
Narrow before Narrow after
模型设置:桌面 模型设置:窄屏 附件入口:窄屏
Desktop model Narrow model Narrow attachments

阅读检查:首屏保留需要决定的事项和完整正文;执行器与发送集中在同一输入区,展开菜单不盖住草稿。完整模型值在菜单内可读。设计规范同时记录这一布局与草稿、焦点和投递边界。窄屏截图是浏览器视口,不能代替原生 App 的最小窗口尺寸或真实输入法检查。

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

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)

动机

在 Goal 或工作区对话中发送消息、调整执行器与模型的用户。 发送前,执行器与模型在页顶,附件与发送在页底;调整后可在同一输入框旁确认配置,菜单关闭后草稿和焦点仍保留。 打包页面已验证控件集中、窄屏菜单不遮挡输入,以及配置拒绝后保留草稿且不启动 Turn。 不改变权限、托管管家配置或模型提供方,也不声称已完成原 Session 内切换模型、原生输入法或 Lark 全流程。 原 Session 内切换模型、已安装 App 验收与整个研究工作台的后续改进仍留在现有工作中。

原先用户在发送消息前需要在页首与页尾之间确认本次配置,配置被执行器拒绝时还会丢掉刚写的内容。这使后续工作多一次定位和重写;本次改善是可直接使用的发送交互与明确未提交时的草稿恢复,没有以控件出现、测试数量或合并数量替代完整研究目标的验收。

改动思路

这版只重排既有控件,并复用现有准备阶段与投递边界;不增设配置、Session 或权限的第二个所有者。 当前 PR 的可交付边界是统一输入区、菜单与草稿保留,原会话模型重配和完整研究工作流继续由既有任务处理。

不改动比本次重排更小,但会保留已经复现的输入丢失;另建配置框架则扩大权限和维护成本。这里把既有 ChatModelMenu、WorkspaceSelect、附件、快捷操作及 LoopX 消息方式放回 PersonalWorkspacePage 的同一输入框。当前配置与后续选择仍有区别,托管管家设置和原始会话身份保留各自所有者。新组件只负责投影与回调,没有新存储或第二个决策入口。

触发 旧行为 本次行为
发送前调整配置 页首选择,页底发送 输入框下沿确认与发送
打开并关闭菜单 分散入口 一个附件入口;关闭保留草稿和焦点
Session 准备返回 424 错误显示但草稿丢失 保留草稿,Turn 数不增加
已发出而回执不明 原有恢复边界 继续交由原 Turn 恢复,不自动重发

表格是依据 35a54e9ed5117c5696da879fe769a09244239639 源码的行为说明;执行证据分别来自原生测试协议、真实 HTTP/store 及打包浏览器回归。没有验证的原生模型和安装端路径不由表格补成通过。

具体改动

规范依据为 docs/development/design.md,固定在 ce58c9141b4b805d4189f89959ade1be1d41ef40,使用改动前已经接受的规则。逐项映射:Explanations On Demand——快捷键说明收进 ContextHelp,投递错误与实际正文保留;Accessibility——语义名称、Escape、焦点返回与不开启发送的操作通过;Responsive Behavior——390px 下完整模型菜单与发送仍可操作;Populated Page Review——使用长模型、中英正文及失败/未知混合状态检查整页默认和展开画面。新增 Forms 段落记录获准的布局,不拿修改后的规范反向证明自身。

关键代码讲解

  • ComposerRuntimeControls(composer-controls.tsx:10)复用原选择器和菜单:普通对话调用原配置回调;original/managed 只呈现不可改写的执行器身份,status-only 不触发模型发现。模型仍按现有“新对话配置”生效,当前实际值以 Session 回读为准。
  • ComposerActions(同文件:34)把图片与现有可选操作放在一个原生 details 中。监听实际 open 状态处理快速 Escape,外点关闭不会发送,选中动作后关闭入口。浏览器断言覆盖草稿、焦点、无 Session 写入和面板在整个输入框上方。
  • PersonalWorkspacePage.sendMessage(personal-workspace-page.tsx:2330)继续拥有输入、图片、Enter/Shift+Enter、已有排队/纠偏路径。布局改动没有把错误收进帮助;独立投递回执保持可见。阅读页仍使用折叠入口。
  • sendManagerQuestion(dashboard-page.tsx:2596)比较当前 preparation controller 的精确身份。该控制器在 Turn dispatch 前被移除,因此准备失败可把错误抛回已有 restoreFailedSubmission;移除后的不明投递不会被这条分支误报为未发送。原生 424 对照在主干丢失草稿,在此 head 保留草稿和旧模型,并明确断言没有新增 turn/start。

其余差异为删除 ChannelHeader 旧编辑属性、统一发送按钮样式与两种主题、调整既有例子的入口断言,以及双语设计说明和十张公开合成截图。六个变动脚本的语法与断言差异已检查;activity 旧失败后的下段断言只完成源码复核,不声称整段执行通过。没有删除工作列表、可选事项、未知状态或权限测试来制造通过;动作菜单关闭后的窄屏测试明确重新打开入口。

对主干的风险

最大风险是把已发送但未确认的消息误认成未提交,从而诱导重复执行。这里沿用原有阶段边界,精确身份判断只覆盖 Session 准备期间;已有 delivery_state/turn_replay_safe 分支保持原意。真实 HTTP/SQLite/store 与隔离原生 provider 证明拒绝前后没有多发 Turn,撤权后阻止新消息且历史仍可读,恢复授权后原路径可以继续。

整合主干原始会话读取修复后,113 个模型/推理深度/队列/steering 测试、12 个键盘/主题测试、bound-conversation 真实 HTTP/Core/SQLite 检查,以及打包的模型选择、消息输入和 LoopX 模式均通过。风险前置检查在此精确 head 上的四项直接检查和十六条选中命令通过;PNG 的十项人工检查保留为 manual review,不能表述为全部自动绿。按当前 Goal 配置未查询或等待 CI。

四个扩展失败仍然存在:离开再返回后的 steering 回执、旧托盘耗时定位、刷新失败恢复、部分列表计数。独立的 ce58c9141b4b805d4189f89959ade1be1d41ef40 与 35a54e9ed5117c5696da879fe769a09244239639 使用同一命令、夹具和环境,完整失败对象一致,包括实际值、预期正则及失败重数;只去掉 ANSI 样式,原始诊断保留。这些是未变更路径的失败,独立的本次正反例通过;它们没有被改成通过、删断言或放宽必需检查。CQR cqr_d50645d708efd0b33c30 保留 failed/risk 与精确范围归因。

没有新 public schema、CLI、权限、调度或能力激活。状态分类使用既有类型与 controller 身份,不读取文案猜测状态。默认布局变化已在设计规范、PR 描述和现有 smokes 中披露;关闭 LoopX、只读与原始来源路径保持原有授权。回滚可整体撤销此布局与本地准备阶段修复,不涉及数据迁移。

我的整体评价

这是 justified_increment:长程工作上的可证明收益是失败后保留待发送内容和恢复入口;没有声称提升 benchmark 分数或净效率。用户体验在本次发送任务上 improved,原始消息、失败和未知仍可读,没有增加确认轮次。视觉复核覆盖长模型名、中英混合长正文、失败与待检查结论、草稿和图片;发送配置集中在输入框内,展开菜单保留可见草稿与发送键,详细配置及快捷键按需打开。 已安装 App、原生输入法、Lark 跨端与原 Session 内模型切换尚未验收。

这版只重排既有控件,并复用现有准备阶段与投递边界;不增设配置、Session 或权限的第二个所有者。 当前 PR 的可交付边界是统一输入区、菜单与草稿保留,原会话模型重配和完整研究工作流继续由既有任务处理。 新增组件有直接生产调用,删除了头部重复属性,现有模型、Session 与投递所有者得到复用;不引入共享语义词表或兼容版本分支。对照、负例、整页图和人工图片检查支持这一个可逆边界的 APPROVE;整体研究任务及上述旧问题仍未结束。精确评审 head 为 35a54e9ed5117c5696da879fe769a09244239639,合并资格另行读取,不由本评论授予。

English verdict: APPROVE — 35a54e9. Existing send controls are unified without new authority; a confirmed pre-dispatch configuration failure now retains the draft and starts no Turn. Local packaged/native-protocol checks pass; four identical pre-existing expanded failures remain disclosed. Installed App/IME, Lark and same-Session reconfiguration remain unqualified; merge readiness is separate.

@loopx-agent
loopx-agent merged commit 201a14d into main Oct 25, 2026
25 of 31 checks passed
@loopx-agent
loopx-agent deleted the codex/unified-conversation-composer branch October 25, 2026 21:56
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.

1 participant