AGC 用户输入区按三层重排布局,修掉控件叠压(#600) #607

Merged
suzmii merged 41 commits from fix/agc-composer-layout into master 2026-10-06 15:23:27 +08:00
Member

Closes #600

背景与根因

AGC 工作台右侧对话面板的输入区有两处结构性缺陷:

  1. 元素叠压:#600 截图里「AI 润色 / 恢复原文」按钮与模型控件的错误提示都用绝对定位浮在正文上(实测按钮与编辑器相交 28×24px,提示盖住第 3~4 行文字);窄面板下工具栏右侧那一组(推理档 / 模型 / 语音 / 发送)写死 flex: 0 0 auto,整组向右溢出输入盒(360px 面板溢出 34px、280px 溢出 114px)。
  2. 强度选择另占一个控件位:思维强度原本是底行第二颗控件,与模型钮抢宽度;并入模型菜单后,装饰用档位圆点又被 6px 轨道盖住、与圆钮两端错位 ±12.2px,填充段终点还停在圆钮右缘(圆钮右侧露出一小截橙色)。

改了什么

范围 内容
布局分层 .project-chat-composer.is-direct-codex 单列网格 gap: 8px:控件全部集中在唯一一行工具条(左组 @ / +;右组 模型 / 语音 / AI 润色(紧贴发送左侧,同为圆角矩形按钮)/ 发送,flex-wrap: nowrap),状态/提示层只在有内容时占行;窄宽度用 min-width(控件排 252 / 外壳 278,算式见下)+ 横向溢出可见,不换行、不堆叠;输入盒最高高度 12 盒内上内边距 + 160 编辑器 + 0 输入区行距 + 0 润色状态行 + 0 输入区下内边距 + 8 输入盒与工具栏行距 + 30 工具栏 + 12 盒内下内边距 = 222(工具栏行高由 30px 模型钮决定;那三个 0 里中间一个是输入盒内部的润色状态行——它条件渲染、空态为 0 高、有内容时自带 6px 上间距;输入盒下方那条 project-chat-composer-notice(语音/附件回执)是 form 的独立行,不进 222,仍是内联行)
强度并入模型菜单 底行控件 2 → 1,强度区(标题 + 当前:X + 原生 <input type="range">)嵌在菜单顶部,与模型列表同一张卡;档位枚举 / 默认值 / 持久化通道与旧下拉完全一致
滑块交互 拖动中只更新预览(视觉即时跟手),落盘推迟到松手 / 抬键 / pointercancel / 卸载 flush,一个手势只写一次;同档位重复提交去重;外部改配置后重读并重新种「最近落盘值」
滑块视觉 轨道 6px 圆头、已选段 --platform-accent 且终点 = 圆钮中心(calc(10px + var(--strength-ratio) * (100% - 20px)))、圆钮 20px 实心暖白 + 1px 描边 + 柔影 + 2px 间隙焦点环;档位圆点已删除;强度区左右不留内边距(滑块铺满卡片内容宽度:档位 0 / 4 时圆钮与轨道两端贴齐,已选段终点落在圆钮中心、被圆钮盖住)
悬浮通知 全站统一:模型不可用与模型列表状态一律走组件自带的底部 toast(模块级单例 + 单宿主,portal、6s 自动收起、同一条去重);失败 tone=error、状态 tone=neutral;任何宿主的输入区都不留常驻 [role='alert'] / [role='status'] 文本行
共享样式面 卡片 / 列表 / 行 / hover / 选中 pill / 细滚动条 / 强度区 / 弹层锚点全部抬到组件自带类名(.conversation-model-select …、.project-chat-composer-strength-*),不带宿主祖先链;首页与工作台共用同一份,宿主作用域只剩工具栏几何

关键验收证据

项目 改前 → 改后
控件相交(5 宽度 × 4 状态矩阵) 单面板最多 4 处相交 → 0 处、0 处溢出(完整矩阵图见下)
拖动跟手(真实指针序列 8 步) 拖动中断、比率冻结 0.25 → 比率 0.25→0.5→0.75→1 逐步跟手,整段 1 次落盘
键盘长按去重 ~30 次/秒全量写盘 → 34 个重复事件共 4 次(每个新档位一次),到顶后再按 28 事件 0 次
首页 / 工作台一致性 外壳 260×262.5、强度区 234×60.5、列表 234×170、滑块 222×26、行 34px —— 两处逐项相同
填充终点(0/25/50/75/100%) 圆钮右缘以外橙色像素:>0(可见溢出)→ 0(4× 设备像素对照图见下)

测试与 CI

  • npx vitest run tests/appSurface.test.ts tests/chatDialogFrameLayout.test.ts → 224 passed / 9 skipped(Test Files 2 passed;tests/appSurface.test.ts 219 tests / 9 skipped,其余在 chatDialogFrameLayout.test.ts)
  • npm run agc:typecheck(pass 3 / fail 0)、npx eslint(含 simple-import-sort)、npx prettier --check、npm run check:encoding(5268 files)、npm run check:spacetime-schema(91 tables)、git diff --check 全绿
  • CI 8/8:Rust crates、Rust lane 1/2、Rust lane 2/2、web tests、Backend tests、Frontend tests、Native shell tests、Repository checks
  • 分支已含 master 96859666f(#606 / #621 / #624 …),合并提交 342cc75d2;冲突只出现在 docs/project-memory/shared-memory/pitfalls.md,两侧段落都保留

已知边界 / 未验证项

  • 策划面:行为与几何零语义变化(差分审计 0 处差异),但浮层观感同样换成新卡片,旧截图不能直接与新观感比对。
  • 策划面的强度控件仍留在工具栏(独立控件),未并入模型菜单:design 会话把档位快照进会话,改档只对新会话生效,与「只影响后续回合」不是同一语义。
  • 暗色主题当前不可达(工作台根节点固定 platform-theme--light);forced-colors 已有系统色描边回退。
  • 真机 WebView2 未复验:本轮全部证据来自无头 Chromium + 一次性 Vite 夹具(夹具与截图不入库)。
  • 窄面板(280px 面板块)下 260px 卡片会向左溢出面板约 52~81px(面板 overflow: visible,不裁切、不遮输入框),未加夹取策略。
  • 滑块「填充 = 圆钮高度」的变体 B 只在夹具里出图、未提交(当前是填充 = 轨道高度 6px 的变体 A)。

对照图

  • 输入区叠压 · 改前(master:错误提示浮在工具栏上,当时文案为「本地模型服务不可用」) → 改后(当前构建:控件集中在唯一一行,输入区无任何常驻文本)(438px 面板 · 空输入):改前 master → 改后 438
  • 工具条单行 · 改前(润色钮自成一行、工具条只有 5 颗控件) → 改后(6 颗同一水平线,AI 润色紧贴发送左侧、同为一组圆角矩形):240px → 240 改前 | 240 改后 ;438px 改后(润色钮→发送之间只隔 8px 间距)→ 438 改后
  • 240px(低于 min-width 的极端窄宽)改后即为空输入态实拍:工具条仍是单行、不换行不重叠,外壳按 278px 最小宽度横向溢出、发送钮仍在可视区内(elementFromPoint 命中它):240 空输入态改后
  • 改后 · 触发不可用时的提示形态(当前构建,438px 面板):底部 toast「模型服务不可用」,输入区不留常驻行:改后 toast 438
  • 首页复用同一套(900px · 中间档,含悬浮行一张):首页 900 中间 | 首页 900 悬浮行
  • 滑块(删点后 + 终点修复)· 447px 中间档:滑块 447 中间
  • 填充终点 4× 设备像素对照(圆钮右缘):改前露出橙色 → 改前 | 改后无溢出 → 改后
  • 模型菜单刷新行 · 左对齐(438px):图标左缘 469.5 = 列表行左缘 459.5 + 行内边距 10,文本左缘 490.5 = 图标右缘 482.5 + 8px,justify-content: flex-start(改前是 space-between,文案被顶到行右端):刷新行 438
  • 同一行 · 280px(同样的对齐关系):刷新行 280
  • 全站统一 toast(首页 · 1200px,模型不可用):首页 toast
  • 变体 B(填充与圆钮同高 20px,仅参照、未采用):变体 B
  • 完整 20 组矩阵图与本轮其余实拍在本机 .tmp/agc-composer-600/、.tmp/600-restyle/(目录被 gitignore,按约定不入库)。
Closes #600 ## 背景与根因 AGC 工作台右侧对话面板的**输入区**有两处结构性缺陷: 1. **元素叠压**:#600 截图里「AI 润色 / 恢复原文」按钮与模型控件的错误提示都用绝对定位浮在正文上(实测按钮与编辑器相交 28×24px,提示盖住第 3~4 行文字);窄面板下工具栏右侧那一组(推理档 / 模型 / 语音 / 发送)写死 `flex: 0 0 auto`,整组向右溢出输入盒(360px 面板溢出 34px、280px 溢出 114px)。 2. **强度选择另占一个控件位**:思维强度原本是底行第二颗控件,与模型钮抢宽度;并入模型菜单后,装饰用档位圆点又被 6px 轨道盖住、与圆钮两端错位 ±12.2px,填充段终点还停在圆钮**右缘**(圆钮右侧露出一小截橙色)。 ## 改了什么 | 范围 | 内容 | | --- | --- | | 布局分层 | `.project-chat-composer.is-direct-codex` 单列网格 `gap: 8px`:**控件全部集中在唯一一行工具条**(左组 `@` / `+`;右组 模型 / 语音 / **AI 润色**(紧贴发送左侧,同为圆角矩形按钮)/ 发送,`flex-wrap: nowrap`),状态/提示层只在有内容时占行;窄宽度用 `min-width`(控件排 252 / 外壳 278,算式见下)+ 横向溢出可见,**不换行、不堆叠**;输入盒最高高度 `12 盒内上内边距 + 160 编辑器 + 0 输入区行距 + 0 润色状态行 + 0 输入区下内边距 + 8 输入盒与工具栏行距 + 30 工具栏 + 12 盒内下内边距 = 222`(工具栏行高由 30px 模型钮决定;那三个 `0` 里中间一个是**输入盒内部的润色状态行**——它条件渲染、空态为 0 高、有内容时自带 6px 上间距;输入盒下方那条 `project-chat-composer-notice`(语音/附件回执)是 form 的独立行,**不进 222**,仍是内联行) | | 强度并入模型菜单 | 底行控件 2 → 1,强度区(标题 + `当前:X` + 原生 `<input type="range">`)嵌在菜单顶部,与模型列表同一张卡;档位枚举 / 默认值 / 持久化通道与旧下拉完全一致 | | 滑块交互 | 拖动中只更新预览(视觉即时跟手),落盘推迟到松手 / 抬键 / `pointercancel` / 卸载 flush,一个手势只写一次;同档位重复提交去重;外部改配置后重读并重新种「最近落盘值」 | | 滑块视觉 | 轨道 6px 圆头、已选段 `--platform-accent` 且**终点 = 圆钮中心**(`calc(10px + var(--strength-ratio) * (100% - 20px))`)、圆钮 20px 实心暖白 + 1px 描边 + 柔影 + 2px 间隙焦点环;**档位圆点已删除**;强度区左右不留内边距(滑块铺满卡片内容宽度:档位 0 / 4 时圆钮与轨道两端贴齐,已选段终点落在圆钮中心、被圆钮盖住) | | 悬浮通知 | **全站统一**:模型不可用与模型列表状态一律走组件自带的底部 toast(模块级单例 + 单宿主,portal、6s 自动收起、同一条去重);失败 `tone=error`、状态 `tone=neutral`;**任何宿主**的输入区都不留常驻 `[role='alert']` / `[role='status']` 文本行 | | 共享样式面 | 卡片 / 列表 / 行 / hover / 选中 pill / 细滚动条 / 强度区 / 弹层锚点全部抬到组件自带类名(`.conversation-model-select …`、`.project-chat-composer-strength-*`),**不带宿主祖先链**;首页与工作台共用同一份,宿主作用域只剩工具栏几何 |;模型菜单刷新行**图标 + 文本贴最左**(选项行才用 `space-between`,宿主那条「抵消通用按钮样式」的块不再统一写对齐) ## 关键验收证据 | 项目 | 改前 → 改后 | | --- | --- | | 控件相交(5 宽度 × 4 状态矩阵) | 单面板最多 4 处相交 → **0 处**、0 处溢出(完整矩阵图见下) | | 拖动跟手(真实指针序列 8 步) | 拖动中断、比率冻结 0.25 → 比率 `0.25→0.5→0.75→1` 逐步跟手,整段 **1 次**落盘 | | 键盘长按去重 | ~30 次/秒全量写盘 → 34 个重复事件共 **4 次**(每个新档位一次),到顶后再按 28 事件 **0 次** | | 首页 / 工作台一致性 | 外壳 260×262.5、强度区 234×60.5、列表 234×170、滑块 222×26、行 34px —— 两处**逐项相同** | | 填充终点(0/25/50/75/100%) | 圆钮右缘以外橙色像素:>0(可见溢出)→ **0**(4× 设备像素对照图见下) | ## 测试与 CI - `npx vitest run tests/appSurface.test.ts tests/chatDialogFrameLayout.test.ts` → **224 passed / 9 skipped**(Test Files 2 passed;`tests/appSurface.test.ts` 219 tests / 9 skipped,其余在 `chatDialogFrameLayout.test.ts`) - `npm run agc:typecheck`(pass 3 / fail 0)、`npx eslint`(含 `simple-import-sort`)、`npx prettier --check`、`npm run check:encoding`(5268 files)、`npm run check:spacetime-schema`(91 tables)、`git diff --check` 全绿 - CI **8/8**:Rust crates、Rust lane 1/2、Rust lane 2/2、web tests、Backend tests、Frontend tests、Native shell tests、Repository checks - 分支已含 master `96859666f`(#606 / #621 / #624 …),合并提交 `342cc75d2`;冲突只出现在 `docs/project-memory/shared-memory/pitfalls.md`,两侧段落都保留 ## 已知边界 / 未验证项 - **策划面**:行为与几何零语义变化(差分审计 0 处差异),但浮层观感同样换成新卡片,旧截图不能直接与新观感比对。 - **策划面的强度控件**仍留在工具栏(独立控件),未并入模型菜单:design 会话把档位快照进会话,改档只对**新会话**生效,与「只影响后续回合」不是同一语义。 - **暗色主题**当前不可达(工作台根节点固定 `platform-theme--light`);`forced-colors` 已有系统色描边回退。 - **真机 WebView2** 未复验:本轮全部证据来自无头 Chromium + 一次性 Vite 夹具(夹具与截图不入库)。 - **窄面板**(280px 面板块)下 260px 卡片会向左溢出面板约 52~81px(面板 `overflow: visible`,不裁切、不遮输入框),未加夹取策略。 - 滑块「填充 = 圆钮高度」的**变体 B 只在夹具里出图、未提交**(当前是填充 = 轨道高度 6px 的变体 A)。 ## 对照图 - 输入区叠压 · **改前(master:错误提示浮在工具栏上,当时文案为「本地模型服务不可用」)** → **改后(当前构建:控件集中在唯一一行,输入区无任何常驻文本)**(438px 面板 · 空输入):![改前 master](https://git.genarrative.world/git/attachments/2ddb45a0-d946-4f08-959e-6e79171e7279) → ![改后 438](https://git.genarrative.world/git/attachments/c3a64b74-3926-4566-9a68-5f0ffa65611f) - 工具条单行 · **改前(润色钮自成一行、工具条只有 5 颗控件)** → **改后(6 颗同一水平线,AI 润色紧贴发送左侧、同为一组圆角矩形)**:240px → ![240 改前](https://git.genarrative.world/git/attachments/d5f6b9f8-7696-4c7a-a5bf-b1e4367ba5b3) | ![240 改后](https://git.genarrative.world/git/attachments/0e43ac72-b9fd-49dd-855a-23e3c869aa88) ;438px 改后(润色钮→发送之间只隔 8px 间距)→ ![438 改后](https://git.genarrative.world/git/attachments/c3a64b74-3926-4566-9a68-5f0ffa65611f) - 240px(低于 `min-width` 的极端窄宽)**改后**即为**空输入态**实拍:工具条仍是单行、不换行不重叠,外壳按 278px 最小宽度横向溢出、发送钮仍在可视区内(`elementFromPoint` 命中它):![240 空输入态改后](https://git.genarrative.world/git/attachments/0e43ac72-b9fd-49dd-855a-23e3c869aa88) - 改后 · 触发不可用时的提示形态(当前构建,438px 面板):**底部 toast「模型服务不可用」**,输入区不留常驻行:![改后 toast 438](https://git.genarrative.world/git/attachments/19c6df66-be9a-49cd-ad9f-f8f0cefa8489) - 首页复用同一套(900px · 中间档,含悬浮行一张):![首页 900 中间](https://git.genarrative.world/git/attachments/20e93ed6-85d6-414e-bd32-9c678714334f) | ![首页 900 悬浮行](https://git.genarrative.world/git/attachments/ac9b8775-d057-480b-aeb7-d5111e2010b2) - 滑块(删点后 + 终点修复)· 447px 中间档:![滑块 447 中间](https://git.genarrative.world/git/attachments/595609a9-4201-420b-863f-84b03362e611) - 填充终点 4× 设备像素对照(圆钮右缘):改前露出橙色 → ![改前](https://git.genarrative.world/git/attachments/29139714-1ae0-46a6-8b55-b1e2e3eb8516) | 改后无溢出 → ![改后](https://git.genarrative.world/git/attachments/6a4f9e46-06cb-46d0-821d-6ca09243d885) - 模型菜单刷新行 · 左对齐(438px):图标左缘 469.5 = 列表行左缘 459.5 + 行内边距 10,文本左缘 490.5 = 图标右缘 482.5 + 8px,`justify-content: flex-start`(改前是 `space-between`,文案被顶到行右端):![刷新行 438](https://git.genarrative.world/git/attachments/323186ac-9b34-4e74-bea2-fdbebf6b52ae) - 同一行 · 280px(同样的对齐关系):![刷新行 280](https://git.genarrative.world/git/attachments/0d70abe8-3eb3-46b4-bca7-45f9c42dd9de) - 全站统一 toast(首页 · 1200px,模型不可用):![首页 toast](https://git.genarrative.world/git/attachments/5e5a6999-c3e9-4881-96de-9c201b8ea220) - 变体 B(填充与圆钮同高 20px,**仅参照、未采用**):![变体 B](https://git.genarrative.world/git/attachments/b0cfeb37-0cdd-4196-988a-acefb3b55984) - 完整 20 组矩阵图与本轮其余实拍在本机 `.tmp/agc-composer-600/`、`.tmp/600-restyle/`(目录被 gitignore,按约定不入库)。
suzmii added 1 commit 2026-10-03 19:53:43 +08:00
AGC 用户输入区按三层重排布局,修掉控件叠压(#600)
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 5m49s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 3m26s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Failing after 5m12s
Project CI / Frontend tests (pull_request) Successful in 4m2s
Project CI / Backend tests (pull_request) Failing after 5m43s
Project CI / Repository checks (pull_request) Failing after 4m13s
Project CI / AI game creator shell web tests (pull_request) Successful in 2m17s
Project CI / Native shell tests (pull_request) Successful in 7m20s
f5886560bd
- 输入盒 `.project-chat-composer.is-direct-codex` 改单列网格 + `gap: 8px`,把输入内容区 / 工具栏 / 状态提示区三层用行间距分开,不再靠绝对定位互相压
- 「AI 润色 / 恢复原文」操作排从 `position: absolute; right: 0; bottom: 0` 回到输入区第二行网格(编辑器横跨全宽),不再压在编辑器文字上
- 模型控件的错误 / 状态提示改成控件排内独占一行(`position: static`),不再浮在输入内容区上方盖住文字
- 工具栏右侧组由 `flex: 0 0 auto` 改为可收缩 + 外层可换行;模型钮封顶 160px、名字走省略号,推理档不参与收缩
- 状态提示区(待发队列 chip、提示段落)与输入盒、工具栏共用同一档行间距(去掉重复的 margin / padding-top)
- 同步两处 CSS 契约断言:composer 几何(`tests/appSurface/project-development.suite.ts`)与输入盒最高高度算式 + 操作排网格行(`tests/chatDialogFrameLayout.test.ts`)
- pitfalls 记录本次叠压的实测尺寸、成因与现行口径
suzmii force-pushed fix/agc-composer-layout from 3a70028461 to f5886560bd 2026-10-03 19:53:43 +08:00 Compare
suzmii added 1 commit 2026-10-04 00:13:04 +08:00
自审收口 #600:宽度上限与间距写回各自规则,去掉重复声明
Project CI / Backend tests (pull_request) Failing after 28s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
ac2df9f123
- 模型选择器 160px 上限、触发钮 160px 上限 / 64px 下限写回 `.conversation-model-select` 与 `.conversation-model-trigger` 的原有规则(单点声明,不再依赖文件末尾的源码顺序覆盖)
- 队列 chip 的 `margin: 0` 写回 `.project-chat-composer-queue` 原有规则;提示段落 `margin: 0` 与 96px 高度上限并入 `.project-chat-composer-notice` 原有规则(覆盖两个宿主,删掉新造的 72px)
- 推理档 `flex: 0 0 auto` 拆成 Direct 侧单条(策划面已有同值声明),末尾区块只留前文没有的新属性
- 更新末尾区块头注释:说明唯一的覆盖靠更长的选择器链而非源码顺序
suzmii added 1 commit 2026-10-04 00:27:28 +08:00
策划面零语义变化:#600 的改动收口到 Direct 输入区
Project CI / Backend tests (pull_request) Failing after 40s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 3m36s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 4m26s
Project CI / Repository checks (pull_request) Failing after 18s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 5m33s
Project CI / Frontend tests (pull_request) Successful in 2m25s
Project CI / AI game creator shell web tests (pull_request) Successful in 2m5s
Project CI / Native shell tests (pull_request) Successful in 6m18s
ef10d9527b
- 控件排几何按宿主拆成两条规则:策划面恢复改动前的 `gap: 8px` / 不换行 / `padding-top: 2px`,Direct 侧保留 `flex-wrap: wrap` + `gap: 6px 8px`
- 控件排两侧分组同样拆开:策划面恢复 `gap: 8px`,Direct 侧保留 `gap: 6px 8px`;左侧动作组换行只作用于 Direct
- 模型选择器上限:共享规则恢复 180px,Direct 侧新增一层真实祖先(`.project-chat-composer-controls-right`)把上限收到 160px,不依赖源码顺序
- 提示段落:策划面恢复 `margin: 4px 0 0`(改动前的值),Direct 侧新增 `margin: 0`(多带 `.project-chat-conversation` 祖先提高特异性);96px 上限与 `overflow-wrap: anywhere` 只新增选择器,不改策划面的值
- 文件末尾区块的选择器全部收窄为 Direct 链,并注明策划输入区不在本 issue 范围
- 校验:临时审计脚本用层叠求值逐元素比对策划输入区子树(1440/1024/390px),origin/master 零差异、对改判前提交 ac2df9f12 报 62 处差异
suzmii added 2 commits 2026-10-04 00:47:47 +08:00
- 目的:满足 CI 的 base 门禁(本分支不含 master 当前 tip),按用户要求用 merge 而非 rebase
- 合并未产生冲突;两侧内容逐条保留:`tests/appSurface/project-development.suite.ts` 同时含本分支的 composer 几何断言(`toContain('gap: 8px;')`)与 master 的 appSurface / Tauri 替身收口(`tauriRuntimeFake.ts` 等);`pitfalls.md` 同时含本分支 #600 条目与 master 的测试类型门禁条目
- 提交前核对:合并结果相对 origin/master 的两份非 CSS 文件差异只有本分支那 2 处(suite.ts 6 行、pitfalls 8 行)
- master 既有红(check:nginx-spa-routes 缺 /pay、/profile/payment;external_mcp::semantic 32 vs 30;http_tracing 偶发;AGC Rust shard 4/4)由 fix/ci-master-red 处理,不在本分支修
修 #600 评审 P2:行高算式取真实决定值、推理档 flex 写回所有者、删死重
Project CI / AI game creator shell Rust crates (pull_request) Successful in 3m20s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 5m2s
Project CI / Backend tests (pull_request) Failing after 3m52s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 6m40s
Project CI / Frontend tests (pull_request) Successful in 3m27s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m16s
Project CI / Repository checks (pull_request) Failing after 3m56s
Project CI / Native shell tests (pull_request) Successful in 6m56s
25346d5037
- 测试:`composerMaxHeight()` 的工具栏行高改取该排最高控件的 `Math.max`(模型触发钮 30px > 发送钮 28px),输入盒最高高度 254 → 256,并新增「触发钮高度 = 30」断言,不再写死发送钮
- `appSurface` 的编辑器高度断言改钉生效规则(六类选择器那条 72 / 160),原五类规则的 96 / 140 已随死重删除
- Direct 推理档的 `flex: 0 0 auto` 写回其所有者规则(原 `flex: 0 1 auto` 那条),末尾区块不再重复声明同属性;区块头注明本区块不依赖源码顺序
- 删死重(均恒被更高特异性规则覆盖):≤1000px 媒体块里五类的 `.resource-reference-input { padding: 10px 12px 6px }`;五类输入规则的 `display` / `width` / `padding` / `border-color` / `border-radius` / `background`(保留仍生效的 `color` 与 `pointer-events`);五类 `:focus-within` 整条(被六类 `border: 0; outline: none; box-shadow: none` 恒覆盖);五类编辑器规则的 `min-height` / `max-height`
- 校验:`chatDialogFrameLayout.test.ts` 12/12、`appSurface.test.ts` 196 passed / 9 skipped、`npm run agc:typecheck` 通过、prettier 通过
suzmii added 1 commit 2026-10-04 03:43:23 +08:00
Merge origin/fix/ci-master-red(8b11dc4e)进 fix/agc-composer-layout
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m54s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 5m46s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 4m41s
Project CI / Frontend tests (pull_request) Successful in 3m28s
Project CI / Backend tests (pull_request) Successful in 7m31s
Project CI / AI game creator shell web tests (pull_request) Successful in 2m41s
Project CI / Native shell tests (pull_request) Successful in 7m18s
Project CI / Repository checks (pull_request) Successful in 5m53s
43afcfa163
- 目的:并入 #609 的共享红修复(A Nginx SPA allowlist 缺 /pay、/profile/payment;B external_mcp::semantic 写死工具数断言;C tracing callsite interest 竞态;D AGC 壳 Rust shard-4 两条偶发断言),让本分支新 head 的 CI 能全绿
- 合并未产生冲突;#609 的 18 个文件原样在位(抽样 md5 与 8b11dc4e 一致:deploy 三份 nginx 模板、scripts/check-nginx-spa-routes.mjs、server-rs api-server/app.rs、src/routing/activeAppPageRoutes.ts)
- pitfalls.md 两侧条目都保留:本分支的 #600「输入区控件叠在一起」条目 + #609 的三条 2026-10-04 条目(tracing span 调用点缓存 / 通知计数与 graceful terminate 串台 / SPA 深链前缀路由)
- #609 没有改 apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts,故与本 PR 的 composer 几何断言无重叠;本 PR 也未改 #609 引入的任何文件
suzmii added 1 commit 2026-10-04 15:11:07 +08:00
复核反馈修复:思维强度改 popover 滑块,模型不可用改 toast(#600)
Project CI / Backend tests (pull_request) Failing after 18s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m25s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 5m25s
Project CI / Repository checks (pull_request) Failing after 35s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 4m43s
Project CI / Frontend tests (pull_request) Successful in 2m49s
Project CI / AI game creator shell web tests (pull_request) Successful in 2m51s
Project CI / Native shell tests (pull_request) Successful in 6m31s
0cbf9521ee
- 思维强度:`ComposerReasoningEffortSelect` 新增 `presentation: 'dropdown' | 'slider'`(默认 dropdown,策划输入盒原样不动),Direct 输入盒走 slider —— 触发钮固定文案「选择强度」(当前档位在 `aria-label`/`title` 与浮层里的「当前:最高」),档位选择收进 popover 里的原生 `<input type="range" min=0 max=4 step=1>`:自带 `role="slider"`、`aria-valuemin/max/now` 与 ←/→/Home/End,`aria-valuetext` 报中文档位名,点轨道/拖拽按 step 吸附;Esc 与点击外部关闭,改档后浮层保持打开
- 档位枚举、默认值、持久化通道(`read_game_creator_app_config` / `select_game_creator_reasoning_effort`)与旧下拉完全一致,只换表现形式
- 模型不可用:`ConversationModelSelect` 新增 `errorPresentation: 'inline' | 'toast'`(默认 inline,首页/策划/画布不变)与 `onUnavailable`,toast 模式下不再渲染常驻 `[role='alert']`;Direct 输入盒由 `ComposerModelNoticeToast` 复用外壳同一枚 `PlatformRuntimeStatusToast`(bottom-center portal、6s)提示,失败消息新出现时一次、同条去重、清空后可再报
- 文案:`llmModelCatalog.ts` / `clientApi.ts` 的「本地模型服务不可用」改为「模型服务不可用」;不可用态照旧禁用发送,但不再留文字行
- 错位根因与改法:上一轮把模型提示收回控件排内使整颗控件变两行高、在 `align-items: center` 的工具条里把触发钮顶到行线上方;现在该元素不再渲染,`styles.css` 里对应的 composer 作用域 `[role='alert']` 规则按「删死重」删除
- `styles.css`:新增强度 popover / 滑块 / 档位点样式(几何沿用 `.project-chat-attachment-menu` 约定,颜色只取 `--platform-*`)
- 测试:`tests/appSurface/chat-composer.suite.ts` 的档位用例改为滑块(打开、aria 值域、持久化、Esc/点外部关闭),新增 toast 用例与「只报一次」用例;`tests/chatDialogFrameLayout.test.ts` 新增 popover 几何断言;策划面差分审计复跑 0 处声明变化(对收口前提交仍报 62 处,证明检查不空转)
- pitfalls 补两条:输入区不留常驻状态行(用 toast)、档位选择用 popover + 滑块
suzmii added 1 commit 2026-10-04 16:52:53 +08:00
Merge origin/master(33552d2e)进 fix/agc-composer-layout
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m38s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 5m13s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 4m20s
Project CI / Frontend tests (pull_request) Successful in 3m27s
Project CI / Backend tests (pull_request) Successful in 7m2s
Project CI / Repository checks (pull_request) Failing after 5m14s
Project CI / AI game creator shell web tests (pull_request) Successful in 4m46s
Project CI / Native shell tests (pull_request) Successful in 9m10s
7d28ef17a0
- 目的:master 在上一轮 CI 期间又前进了(#602 素材引用注册表修复等 9 个提交),PR 的 base 门禁要求 head 含最新 base。上一轮 CI 的 2 条红(Backend tests 18s、Repository checks 35s)日志都是同一条门禁:`pull request head does not contain the latest base commit; update the branch and rerun CI.`,与本轮代码无关
- 冲突 2 处,均按「两侧内容都保留」解决:
  - `apps/ai-game-creator-shell/src/view/project-development/chat/components/DirectProjectComposer/DirectProjectComposer.tsx`:#602 的 `ref` / `useImperativeHandle`(`insertReferences` + `focus` 转发)与本轮新增的 `pushModelNotice` 并存
  - `docs/project-memory/shared-memory/pitfalls.md`:本分支的三条(输入区不留常驻状态行、档位改 popover 滑块、#600 输入区叠压)与 master 的两条(画布「引用」死按钮、渠道更新互相查杀)并存
- 其余文件自动合并;本分支的 `styles.css`、两个契约测试、`ConversationModelSelect` 改动未被 master 触碰
suzmii added 1 commit 2026-10-04 17:57:03 +08:00
修 CI 的 import 顺序门禁:三个改动文件的 import 排序
Project CI / Backend tests (pull_request) Failing after 29s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 5m55s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 3m9s
Project CI / Repository checks (pull_request) Failing after 21s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 4m6s
Project CI / Frontend tests (pull_request) Successful in 3m9s
Project CI / AI game creator shell web tests (pull_request) Successful in 2m56s
Project CI / Native shell tests (pull_request) Has been cancelled
530d166a65
- Repository checks 的 eslint 报 simple-import-sort/imports 三处(ComposerControls.tsx、DirectProjectComposer.tsx、chat-composer.suite.ts),全部是 import 排序,没有逻辑改动
- 用 npx eslint --fix 自动修(+4/−5),随后 prettier --check、npm run agc:typecheck、appSurface 用例复跑全部通过
suzmii added 1 commit 2026-10-04 18:17:11 +08:00
Merge origin/master(a2f25036)进 fix/agc-composer-layout
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 7m39s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 4m28s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 6m21s
Project CI / Frontend tests (pull_request) Successful in 4m10s
Project CI / AI game creator shell web tests (pull_request) Successful in 2m34s
Project CI / Backend tests (pull_request) Successful in 8m16s
Project CI / Repository checks (pull_request) Successful in 6m51s
Project CI / Native shell tests (pull_request) Successful in 10m6s
dce816d244
- 目的:master 又前进了(a2f25036,含 #614 静默测试成功用例等),PR 的 base 门禁要求 head 含最新 base
- 自动合并无冲突;并入的都是 master 侧文件(.gitea/workflows/project-ci.yml、两个 package.json、scripts/build-gitea-rust-cache.sh),本分支改动未被触碰
- 合并后复跑:npm run agc:typecheck 通过、chatDialogFrameLayout + appSurface 212 passed / 9 skipped、prettier --check 通过、check:encoding 通过、check:spacetime-schema 通过、git diff --check 干净
suzmii added 1 commit 2026-10-04 23:43:42 +08:00
合并 master 6c956605:保留 #605 与 #600 两侧改动
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 7m16s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 6m1s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 4m18s
Project CI / Frontend tests (pull_request) Successful in 3m42s
Project CI / Backend tests (pull_request) Successful in 8m8s
Project CI / AI game creator shell web tests (pull_request) Successful in 2m44s
Project CI / Repository checks (pull_request) Successful in 7m16s
Project CI / Native shell tests (pull_request) Successful in 9m14s
0aeea3dbb5
- 目的:用户准备合并 PR #607,先把 head 更新到包含最新 origin/master(6c956605,含 #615 顶栏布局、#619 折叠箭头、作品管理与 Phaser4 发布等)
- 冲突仅 docs/project-memory/shared-memory/pitfalls.md(两边都在文件顶部加条目):保留本分支三条(输入区不留常驻状态行 / 档位改 popover 滑块 / #600 输入区叠压)与 master 四条(随包 plugins feature 门禁、worktrees 下 Vite 被忽略规则排除、同工作树并发 dev 栈、Windows 阻塞模态用例挂死 runner)
- 其余文件自动合并:#605 的 useImperativeHandle/insertReferences/注册活跃输入区与本分支的 presentation="slider"/modelLabel/errorPresentation="toast"/onUnavailable/ComposerModelNoticeToast 并存;project-development.suite.ts 的 [data-resource-reference-id] 引用插入断言与 composer 几何 gap: 8px 断言并存
- 合并后复跑:npm run agc:typecheck 通过;chatDialogFrameLayout + appSurface + activeChatComposer + resourceCanvasChatReferenceDrop 共 224 passed / 9 skipped;eslint(改动文件)通过;prettier --check 通过;check:encoding 通过;check:spacetime-schema 通过;git diff --check 干净
suzmii added 1 commit 2026-10-05 00:13:57 +08:00
强度滑块并入模型菜单:底行只剩一颗控件(复核反馈 2)
Project CI / AI game creator shell Rust crates (pull_request) Successful in 4m16s
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
c197edb203
- `ConversationModelSelect` 新增 `strengthSection`:传了它就把弹层包一层 `.conversation-model-menu-shell`(强度区在上、`role="listbox"` 模型列表在下,共用同一张卡);不传时渲染与改动前逐字一致(首页 / 策划 / 画布不变)
- 强度区不再自带触发钮与浮层:`ComposerReasoningEffortSelect` 的 `presentation` 由 `'slider'` 改为 `'section'`(只渲染「思维强度」标题 + 原生 range + 5 档位点 + 「当前:最高」),开合 / Esc / 点外部交给模型菜单既有行为;Direct 输入盒把它作为 `strengthSection` 注入,底行元素 2 → 1
- 删掉上一轮的独立触发钮与其专用 CSS(`project-chat-composer-strength-trigger` / `-strength-popover` / `-strength-model` 与 `-strength` 锚点);同时删掉不再使用的 `onModelLabelChange` 回调——强度区不再复述模型名(触发钮与列表已处处显示模型,重复信息优先去掉以省空间)
- 新增外壳 CSS:定位 / 朝向沿用原模型菜单(贴触发钮右缘、向上展开、不盖输入框),里层菜单回到文档流只负责滚动,超长模型名改走省略号
- 测试:`chat-composer.suite.ts` 改为「打开模型菜单 → 滑块在顶部 → 改档落同一条持久化通道 → Esc/点外部关闭」,并断言底行不再有第二颗控件、滑块不在 listbox 子树里;`chatDialogFrameLayout.test.ts` 断言外壳向上展开 / 强度区网格 / 底行高度不增;`design-agent.suite.ts` 断言策划菜单里没有滑块;`project-development.suite.ts` 断言旧触发钮/浮层 CSS 已删
- pitfalls 同步改写该条(含「滑块不能进 listbox」与「强度区随菜单挂载,打开时先显示默认再回读」的取舍)
- 校验:4 个 vitest 文件 224 passed / 9 skipped、typecheck、eslint、prettier、encoding、spacetime-schema、diff-check 全通过
suzmii added 1 commit 2026-10-05 00:35:22 +08:00
模型菜单视觉重做:照 Codex 观感 + 我们的暖色 token(复核反馈 2 之二)
Project CI / AI game creator shell Rust crates (pull_request) Successful in 5m57s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 7m6s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 7m51s
Project CI / Backend tests (pull_request) Successful in 8m11s
Project CI / Frontend tests (pull_request) Successful in 3m35s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m32s
Project CI / Native shell tests (pull_request) Successful in 8m45s
Project CI / Repository checks (pull_request) Successful in 7m3s
3383c13bba
- 卡片:圆角 12 → 16px、内边距 12px、描边换成极淡 `--platform-line-soft`、投影改暖色 `rgb(112 57 30 / …)`(不用纯黑);去掉横贯分隔线,强度区与列表之间只用留白分开
- 强度区:标题 `--platform-text-strong` 12/600、右侧「当前:X」`--platform-text-soft` 11px;单列铺满(`minmax(0,1fr)`,否则 `auto` 轨道只按 max-content 定尺、滑块被压回 129px);滑块与档位点包一层相对定位容器,点改绝对定位叠在轨道中线
- 滑块:轨道 6px 圆头,已选段 `--platform-accent`、未选段 `--platform-subpanel-border`(进度由组件写进来的 `--strength-progress` 驱动双色渐变,不写死颜色);圆钮 18 → 20px(`--platform-input-highlight` 底 + `--platform-accent` 2px 描边 + 柔影),hover/active/focus-visible 与 Firefox 伪元素同步
- 档位点:5px 淡点 → 7px 且落在轨道中线上(带输入区底色的 1.5px 描边提对比),`pointer-events: none` 不挡命中
- 模型列表:行高 34px、行圆角 9px、hover `--platform-nav-item-icon-fill`、选中 `--platform-warm-bg` 轻量 pill(覆盖前文那几条 `!important` 同属性规则);`max-height: 170px`(=5×34,不出现半行);滚动条 6px、平时透明,悬停卡片才显形
- 校验:typecheck、4 个 vitest 文件 212 passed / 9 skipped、eslint、prettier、encoding、spacetime-schema、diff-check 全通过;无头 Chromium 夹具(447px / 900px)截图为证(见 PR 正文)
suzmii added 1 commit 2026-10-05 01:32:51 +08:00
滑块圆钮改实心:暖白实心钮 + filled 段铺到钮下沿(复核反馈 2 之三)
Project CI / AI game creator shell Rust crates (pull_request) Successful in 6m32s
Project CI / Backend tests (pull_request) Successful in 8m39s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 9m8s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 10m43s
Project CI / Frontend tests (pull_request) Successful in 3m4s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m4s
Project CI / Native shell tests (pull_request) Successful in 9m3s
Project CI / Repository checks (pull_request) Successful in 7m11s
8a9fa5af43
- 圆钮去掉「主色描边 + 半透明底」造成的空心环观感:改 `background: var(--platform-panel-fill)`(两个主题都是不透明面板色),保留 1px `--platform-subpanel-border` 极淡描边与柔和暖影,尺寸仍 20px
- 「靶心」根因:`--platform-input-highlight` 在浅色主题只有 90% 不透明,filled 段透出来正好在钮心形成一个点;换不透明 token 后消失。同时给 input `position: relative; z-index: 1`,让实心钮压在档位点之上(不再被下面的点透出)
- filled 段:`--strength-progress`(百分比)换成 `--strength-ratio`(0~1 无单位),CSS 用 `calc(20px + ratio * (100% - 20px))` 把填充一直铺到圆钮右缘,两端在任意轨道宽度下都对得齐;默认档填充恰等于圆钮直径(不伪造填充)
- hover 把暖影压深一档;focus-visible 焦点环与投影一起给(`box-shadow` 是单值属性,只写环会把实心钮的影子抹掉);Firefox 的 track/progress/thumb 同步同一套
- 校验:typecheck、2 个 vitest 文件 212 passed / 9 skipped、eslint、prettier、encoding、spacetime-schema、diff-check 全通过;无头 Chromium 重采 5 张**真 PNG** 并已换进 PR 正文(像素级验证:圆钮中心 (252,248,244) 暖白、mid 态 filled 右界与钮右缘重合)
suzmii added 1 commit 2026-10-05 02:06:51 +08:00
焦点环加 2px 间隙:读成「实心钮 + 独立环」而不是空心钮(复核反馈 2 之四)
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 6m20s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 4m18s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 6m59s
Project CI / Frontend tests (pull_request) Successful in 2m40s
Project CI / Backend tests (pull_request) Successful in 7m24s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m2s
Project CI / Repository checks (pull_request) Successful in 5m44s
Project CI / Native shell tests (pull_request) Successful in 7m10s
9b148144fa
- `:focus-visible` 的圆钮阴影改成三明治:`0 0 0 2px var(--platform-input-fill)`(间隙,卡片/输入区填色的既有**颜色** token)+ `0 0 0 4px var(--platform-input-focus-ring)`(环色与厚度不变,WCAG 对比度不回退)+ 原暖影
- 踩坑记录在注释里:间隙色**不能**用 `--platform-panel-fill`——它是 `linear-gradient`,写进 `box-shadow` 会让整条声明失效(环和影子一起消失,实测键盘态环与投影全丢)
- Firefox 同步:`::-moz-focus-outer { border: 0 }` 关掉轨道自带描边,`::-moz-range-thumb` 用同一套三明治
- 取证(无头 Chromium + 像素扫描):键盘态中档 y=289 行色序 199,101,61(填充) → 182,98,62(影) → 250,242,236(**间隙**) → 229,210,195(钮描边) → 252,248,244(**钮内暖白**) → … → 300:182,98,63(**环**) → 231,213,198(未选段);鼠标拖拽态同位置只有 252,248,244 钮白 + 柔影、无任何主色
- 校验:typecheck;`workbenchThemeContrast` + `chatDialogFrameLayout` + `appSurface` 共 215 passed / 9 skipped;prettier / encoding / spacetime-schema / diff-check 全通过
suzmii added 1 commit 2026-10-05 10:51:31 +08:00
修拖动不跟手:拖动中不再 disable 滑块,松手才落盘
Project CI / AI game creator shell Rust crates (pull_request) Successful in 4m16s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 6m10s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 6m50s
Project CI / Frontend tests (pull_request) Successful in 3m51s
Project CI / AI game creator shell web tests (pull_request) Successful in 2m42s
Project CI / Repository checks (pull_request) Successful in 6m29s
Project CI / Backend tests (pull_request) Successful in 8m20s
Project CI / Native shell tests (pull_request) Successful in 9m5s
4227724b33
- 根因(实测定位):拖动中每来一个 input 就 `selectEffort`,写盘期间 `saving` 让 range 变成 `disabled`;浏览器会当场中断正在进行的原生拖拽 —— 无头 Chromium 用真实指针序列(按下 + 8 步横移)复现:`disabled` 在首个 input 后 11ms 置真、14ms 复位,整段拖动只收到 **1 个 input 事件**,`--strength-ratio` 8 步全程冻结在 0.25
- 改法:拖动中的连续事件(`onChange`/`onInput`)只更新**预览档位**(视觉与 `--strength-ratio` 立刻跟手),落盘推迟到松手时刻:原生 `change`(range 的提交事件)+ `onKeyUp` / `onBlur` / `onPointerUp` 汇合到一个 `commitPreview()`,一个手势只写一次;range 的 `disabled` 回到只看宿主 `disabled`,不再受写盘影响
- 预览与落盘共用同一套档位枚举、`select_game_creator_reasoning_effort` 通道与「以回读值为准」逻辑,语义未变;键盘 ←/→、点轨道、拖动后离开再回来都走同一条路
- 回归测试:`chat-composer.suite.ts` 新增「拖动中保持可用 / 节点不被重挂载 / 拖动中不落盘 / 松手提交一次且值一致」用例(改前红:`拖动中不应禁用滑块:禁用会中断正在进行的原生拖拽: expected true to be false`),并把既有滑块用例的提交步骤补上"松手"
- 修后同一条指针序列实测:ratio 轨迹 `[0.25,0.25,0.5,0.5,0.75,0.75,1,1]`(连续跟手)、`disabled` 全程 false、拖动中 changes=0 且松手后 changes=1、标签「当前:最高」
- 校验:typecheck、`workbenchThemeContrast` + `chatDialogFrameLayout` + `appSurface` 共 216 passed / 9 skipped、eslint、prettier、encoding、spacetime-schema、diff-check 全通过
suzmii added 3 commits 2026-10-05 16:01:35 +08:00
- D1 档位点被轨道压住且与圆钮错位:容器改 `display: flex; justify-content: space-between; padding: 0 6.5px`(= 圆钮半径 10 − 半点宽 3.5),首末点中心因此落在圆钮两端极限位置;`z-index: 2` 抬到 range 之上;当前档位那一点 `opacity: 0`(圆钮已压在那儿);点改深暖底 `--platform-text-strong` + `--platform-input-highlight` 描边。无头 Chromium 实测(222px 轨道):5 个点中心与圆钮算式偏移全部 0.00px(旧实现 +12.19/+6.09/−0.02/−6.11/−12.20)、点与相邻轨道对比度 10.51~10.59:1(旧 1.21~1.23:1)、当前档位点被圆钮覆盖(中心差 ≤0.5px)
- D2 状态文案(`role="status"`)也会把那排控件顶成两行高:`ConversationModelSelect` 的 notice 与失败分开两条浮层通道(`onNotice` / `onUnavailable`,各自去重),`ComposerReasoningEffortSelect` 加 `noticePresentation: 'inline' | 'toast'` + `onNotice`;`toast` 形态下两种常驻行都不渲染,状态浮层用 `tone="neutral"`、失败仍 `tone="error"`。Direct 用 `toast`,首页/策划/画布默认 `inline` 行为不变
- D4 `forced-colors` 下焦点完全不可见(thumb 的 box-shadow 会被系统丢弃):加 `@media (forced-colors: active)` 回退 `outline: 2px solid Highlight; outline-offset: 2px`(系统色,亮色观感不变)
- D5 键盘长按每个事件都落盘:`selectEffort` 比对「最近一次落盘成功的档位」(`persistedEffortRef`,挂载回读时种上),相同不写。真实按键序列实测:单击 1 次;长按 1.5s(34 个重复事件)4 次(每个新档位一次);已在最高档继续长按 1.2s(28 个事件)0 次(旧行为 ~30 次/秒)
- D6 拖动中途卸载会丢档位:卸载 cleanup 里 flush 一次预览值(读 ref,不碰已卸载组件的 state)。实测:拖到「中」未松手落盘 0 次,`unmount()` 后恰好 1 次;单次拖动(按下 + 6 步横移 + 松手)全程 1 次且终值 = 松手位置
- D7 文档与实现对齐:pitfalls 里 `--strength-progress` → `--strength-ratio`、圆钮改实心 `--platform-panel-fill` + `--platform-subpanel-border` 1px 描边、输入盒最高高度 254 → 256(工具栏行高由 30px 模型钮决定)、「提示改成控件排内独占一行」按现行浮层口径改写
- D8 去掉 10 处新硬编码色值 `rgb(112 57 30 / x%)`:卡片投影改用既有 token `--platform-desktop-hover-shadow`,圆钮/焦点影由 `color-mix(in srgb, var(--platform-accent) …)` 派生,不新增 token
- D9 注释与实现不一致:`.resource-reference-input` 的 `min-height: 0 / padding: 0` 写回前面那条六类规则(不再依赖源码顺序),末尾那条只留网格与行距,注释同步改成「不依赖源码先后」
- D3 深色主题焦点环间隙不可靠:只在 pitfalls 记录(深色 `--platform-input-fill` 仅 5% 不透明;工作台根节点固定 `platform-theme--light`,暂不可达)
- 测试:`chat-composer.suite.ts` 新增「notice 走浮层且输入区无 `[role=status]`/`[role=alert]`」「键盘长按同一档位只写一次、换档仍写」「拖动中途卸载恰好提交一次」;`chatDialogFrameLayout.test.ts` 新增档位点对齐/层级/激活点隐藏的声明级断言
- 校验:相关 vitest(chat-composer / chatDialogFrameLayout / design-agent / project-development)、typecheck、eslint、prettier、encoding、spacetime-schema、diff-check

Refs #600, PR #607
prettier:pitfalls 新增段落按仓库格式折行(lint-staged 不覆盖 markdown)
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
ac060a80fb
suzmii added 2 commits 2026-10-05 16:32:52 +08:00
# Conflicts:
#	docs/project-memory/shared-memory/pitfalls.md
模型菜单观感抬成组件自带的共享样式面:首页那颗复用同一套卡片与列表
Project CI / AI game creator shell Rust crates (pull_request) Successful in 6m13s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 7m10s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 7m54s
Project CI / Backend tests (pull_request) Successful in 8m50s
Project CI / Frontend tests (pull_request) Successful in 3m39s
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
020eb92402
- 成因:#600 那轮把卡片/列表的新观感挂在 `.game-workbench-chat .project-chat-surface.is-direct-codex .project-chat-composer.is-direct-codex …` 这条宿主祖先链上,同一个 `ConversationModelSelect` 换到首页(`className=home-input-model-select`)就退回基础规则:161px 窄卡、10px 圆角、5px 内边距、32px 行高、旧灰投影
- 改法:卡片/列表/行/hover/选中 pill/细滚动条抬到**组件自带类名**的共享样式面(`.conversation-model-select .conversation-model-menu-shell`、`.conversation-model-select .conversation-model-menu`、`… .conversation-model-menu button…`),不带任何宿主祖先链;合并形态(有外壳)与独立形态(首页/策划/画布)同一套值:16px 圆角 / 12px 内边距 / `--platform-line-soft` 描边 / `--platform-desktop-hover-shadow`,行 34px、圆角 9px、hover `--platform-nav-item-icon-fill`、选中 `--platform-warm-bg` + 600
- 宿主专属的东西留在工作台作用域:输入区锚点(`position: absolute; right: 0; bottom: calc(100% + 8px); z-index: 20`)、与工具栏的几何关系、强度区布局;独立形态的卡片自己就是滚动区(`max-height: 194 = 170 + 上下各 12`),外壳形态列表 `max-height: 170`(5×34,不出现半行),外壳 `max-height: none`(高度由内容决定,避免把列表挤矮)
- 首页**不加**强度区:首页那颗没有 effort 的 state/props(`view/home/index.tsx` 只传 `className` 与 `disabled`),就保持这一点
- 基础规则里那几条同属性 `!important` 由共享面按同一档 `!important` 覆盖;工作台那条「抵消宿主通用按钮样式」的规则只留几何(position/display/width/margin/border/shadow/字号),不再抄一份观感
- 测试:`home.suite.ts` 新增「首页模型菜单复用同一套共享样式面」——首页实例的菜单祖先链里没有 `.game-workbench-chat`,只靠 `.conversation-model-select …` 就能解析出 16px 圆角/12px 内边距/34px 行;`chatDialogFrameLayout.test.ts` 的外壳用例按新选择器集合更新(锚点仍来自工作台链、卡片观感来自共享面),并补上 `max-height`/`border-radius`/`background` 断言
- 真机实测(无头 Chromium 同一夹具同一裁剪框):首页那颗 161×309 / 10px / 5px / 32px → 260×194 / 16px / 12px / 34px;工作台那颗外壳 260×262.5、内层列表 234×170、行 34/9px 前后逐值不变(无视觉回退)
- 校验:相关 vitest 221 passed / 9 skipped、typecheck、eslint、prettier、encoding 5268 files、spacetime-schema 91 tables、diff-check;对照图见 PR #607

Refs #600, PR #607
suzmii added 1 commit 2026-10-05 17:06:16 +08:00
强度区也抬成共享样式面:首页带同一份思维强度,滑块点色变浅、点与轨道同高
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 7m7s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 4m46s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 4m27s
Project CI / Frontend tests (pull_request) Successful in 3m27s
Project CI / Backend tests (pull_request) Successful in 8m4s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m5s
Project CI / Repository checks (pull_request) Successful in 6m48s
Project CI / Native shell tests (pull_request) Successful in 9m12s
278ebc570e
- 用户口径:①「把思维强度也加进去,保持所有地方的样式一致,不需要做区分」;②「点的颜色做浅一点,进度条的高度和滑块高度一致」
- ① 首页:`view/home/index.tsx` 给那颗 `ConversationModelSelect` 传**同一个** `ComposerReasoningEffortSelect`(`presentation=section`),读写仍是组件自己的 `read_game_creator_app_config` / `select_game_creator_reasoning_effort`,首页不新写 state;强度区(`.project-chat-reasoning-effort.is-section` / `.project-chat-composer-strength-*`)与外壳锚点(`position: absolute; right: 0; bottom: calc(100% + 8px)`)一并抬到共享样式面,宿主作用域只剩工具栏几何
- ① 实测(无头 Chromium,同一夹具同一裁剪框):首页 1200/447 两档都是外壳 260×262.5、强度区 234×60.5、列表 234×170、滑块 222×26,与工作台逐项一致;工作台回归后外壳/强度区/列表/滑块逐值不变(抬升过程中必须删掉两条给旧独立「推理档」控件排版的死重规则,否则它们以更高特异性盖掉共享面的 `display: grid`,把强度区算宽 24px)
- ② 点色:`--platform-text-strong` → `color-mix(in srgb, var(--platform-text-strong) 60%, var(--platform-subpanel-border))`;实测点 rgb(126,100,85) / 相邻轨道 rgb(230,213,198) ⇒ 对比度 3.83:1(上一版 10.5:1,仍守住 ≥3:1)。边界:点落在橙色已选段上时只有 1.54:1——「变浅」与「已选段也 ≥3:1」不可兼得,按「不抢戏」优先,取值可由这条 color-mix 的百分比统一调
- ② 变体 A(落地,默认):填充段=轨道高度 6px(本来就是轨道渐变的一段),档位点也收到 6px(不再上下各露 0.5px);实测轨道 6.0 / 填充 6.0 / 点 6.0 / 圆钮 20(range 盒 26)。变体 B(只出图、未提交):填充段与点都做成 20px=圆钮高度;实测 20/20/20/20(range 盒 34)。447 下圆钮中心到最近可见点中心 37.5px(A) / 30.5px(B),不重叠、不溢出
- 测试:`home.suite.ts` 的首页用例补断言(首页菜单里确实有 `input[type=range]`,`aria-label=思维强度`、`aria-valuetext=默认`);`chatDialogFrameLayout.test.ts` 的强度区选择器改到共享面、并断言点 6px == 轨道高度、点色来自 color-mix、无描边
- 校验:相关 vitest 221 passed / 9 skipped、typecheck、eslint、prettier、encoding 5268 files、spacetime-schema 91 tables、diff-check;对照图与变体图见 PR #607

Refs #600, PR #607
suzmii added 2 commits 2026-10-05 18:15:21 +08:00
- 用户口径:「你干脆把圆点删了吧,很丑…要做就做成几乎透明的」→ 按第一选择**删除**(不做半透明备选)
- 标记:`.project-chat-composer-strength-slider` 里那组 `<span class="project-chat-composer-strength-stops">` + 5 个点整体删除
- CSS:`space-between` 排布、`z-index: 2` 抬层、`.is-active{opacity:0}`、点的 `color-mix` 底色、以及只服务点对齐的 `padding: 0 7px` 一并删除;强度区横向内边距 `4px 6px 2px` → `4px 0 2px`(滑块直接铺满卡片内容宽度,填充段与圆钮两端与轨道贴齐,不再留多余空白);滑块容器去掉已无用的 `position: relative`
- 保留:圆钮(实心暖白 + 柔影 + 2px 间隙焦点环)、filled 段铺满轨道高度 6px、`--strength-ratio`、`当前:X`、`aria-valuetext`、←/→/Home/End、点轨道跳档、拖动连续跟手(预览 / 松手提交)
- pointercancel:触屏取消时与「松手」同口径提交当前预览(否则预览值会滞留到下一次提交或卸载 flush)
- 测试:`chatDialogFrameLayout.test.ts` 原来那组「点」断言整段换成**反向守卫**(样式表里不再有 `.project-chat-composer-strength-stops` 规则、组件源码也不再渲染该类名;滑块契约:宽 100% / 高 26 / 圆钮 20×20、强度区左右内边距 0);`home.suite.ts` 首页用例补一条「菜单里不再有那组点」
- 文档:pitfalls 的 D1 条改为现行口径(圆点已删、原因与判据;历史成因「被 6px 轨道盖住 / 与圆钮错位 ±12.2px」只留一句、由 Git 追溯)

Refs #600, PR #607
推理档:外部改配置后重读并重新种「最近落盘值」,重选同一档仍然落盘
Project CI / AI game creator shell Rust crates (pull_request) Successful in 4m35s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 6m59s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 6m14s
Project CI / Frontend tests (pull_request) Successful in 2m45s
Project CI / Backend tests (pull_request) Successful in 7m45s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m30s
Project CI / Repository checks (pull_request) Successful in 7m16s
Project CI / Native shell tests (pull_request) Successful in 9m2s
fe3c1389ae
- 问题(评审 D5 边界):`persistedEffortRef` 只在挂载回读与自身落盘时更新,而配置还有别的写入者——`RuntimeConfigDialog` 保存后会 `notifyLlmConfigChanged()`。外部把 `llm.reasoningEffort` 改成「最高」后,常驻挂载的滑块手上仍是旧口径:用户改选「高」时 `next !== persisted` 本来成立,但若外部改成了用户要选的**同一档**(或先外部改档再重选原档),去重会把这次点击吞掉,界面显示 A、磁盘是 B
- 改法:把「读一次配置」抽成 `readEffortRef`,挂载时读一次,另外在 `LLM_CONFIG_CHANGED_EVENT` 与窗口 `focus` 时**重读并重新种 `persistedEffortRef`**(只读不写盘;`silent` 时不重复报「推理档读取失败」);写盘在途或预览未提交时不回显,避免回读旧值把界面顶回去
- 用例:`chat-composer.suite.ts`「an external config change is re-read so re-selecting that grade still commits」——挂载读到「默认」→ 外部改档 + 派发 `LLM_CONFIG_CHANGED_EVENT` → 断言回显成「最高」→ 用户改选「高」→ **必须写一次**(改前该用例红:writes 里没有 'high',界面对着旧口径把这次点击去重掉)
- 滑块 pointercancel 的用例也在这一条里(handler 随上一条提交落地):预览后 `pointercancel` → 恰好写一次

Refs #600, PR #607
suzmii added 2 commits 2026-10-05 18:56:53 +08:00
- 现象:4× 放大图里橙色 filled 段的右端越到圆钮右侧之外(圆钮边缘能看到一小截橙色)
- 根因:渐变终点写成 `calc(20px + var(--strength-ratio) * (100% - 20px))`,而圆钮中心在 `10px + ratio * (100% - 20px)` —— 终点比圆钮中心多 10px(正好落在圆钮**右缘**),亚像素 / 圆角 / 描边误差都会让它露出来
- 改法:两个渐变停靠点都改成 `calc(10px + var(--strength-ratio, 0) * (100% - 20px))`,filled 段右端与圆钮中心重合;100% 时圆钮压在轨道右端、填充与圆钮右缘齐平
- 实测(无头 Chromium,4× 设备像素):0/25/50/75/100% 五档沿轨道中线扫描,圆钮右缘以外主色像素命中数 **0**(改前对照图能看到橙色溢出);hover / active / focus-visible / disabled 四态同样 0
- 守卫:`chatDialogFrameLayout.test.ts` 断言轨道渐变停靠点含 `calc(10px + var(--strength-ratio, 0) * (100% - 20px))` 且不含 `calc(20px + …)`

Refs #600, PR #607
文档:pitfalls 新增段落的措辞改成中性口径陈述(去掉引述)
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 6m42s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 5m49s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 4m22s
Project CI / Frontend tests (pull_request) Successful in 3m20s
Project CI / Backend tests (pull_request) Successful in 8m37s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m12s
Project CI / Native shell tests (pull_request) Successful in 9m38s
Project CI / Repository checks (pull_request) Successful in 7m0s
7d73a0a3ce
- 2026-10-05 两条与 2026-10-04 两条里「用户口径是…」这类引述改成直接陈述(删点、视觉口径、首页强度区分两步收敛)
- 只改措辞与一处顺序说明,技术结论与实测数字不变

Refs #600, PR #607
suzmii added 1 commit 2026-10-05 20:23:01 +08:00
模型不可用与模型状态一律走组件自带的底部 toast:删掉宿主分支
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 7m40s
Project CI / Backend tests (pull_request) Failing after 21s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 4m34s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 5m52s
Project CI / Repository checks (pull_request) Failing after 29s
Project CI / Frontend tests (pull_request) Successful in 2m54s
Project CI / AI game creator shell web tests (pull_request) Failing after 4m1s
Project CI / Native shell tests (pull_request) Successful in 9m1s
3204758f34
- 现象:`errorPresentation` 默认 `inline`,只有工作台那只传 `toast` + 宿主回调;首页/策划/画布的输入区里「模型服务不可用」还是**常驻占位文本**,不是浮层——同一个组件在不同宿主表现不一致
- 改法:浮层收进组件内部。新增 `components/common/composerNotice.ts`(模块级单例:`publishComposerNotice` + `useComposerNoticeHost`)与 `components/common/ComposerNoticeToast.tsx`(portal 到底部居中、6s 自动收起);`ConversationModelSelect` 与 `ComposerReasoningEffortSelect` 自己在失败/状态出现时报一条(各自去重:同一条只弹一次、清空后可再弹),失败 `tone="error"`、状态 `tone="neutral"`
- 单宿主:同一输入区里两个调用点只有一个真正渲染(编号最小的那个),保证同一时刻只有一条浮层、不会互相叠;输入区整体卸载时把待显示的提示一并丢掉,不留给下一个宿主
- 删宿主分支:`errorPresentation` / `onUnavailable` / `onNotice` / `noticePresentation` 四个 prop 与工作台宿主的 toast state / `pushModelNotice` / `pushModelStatus` 一并删除(grep 命中 0);任何宿主的输入区子树里都不再有常驻 `role="alert"` / `role="status"` 行
- 语义不变:不可用时发送仍禁用(`!modelReady`);文案仍是「模型服务不可用」;档位持久化通道不变
- 测试:新增「首页模型不可用与状态也走组件自己的底部 toast(子树不留常驻行)」;`design-agent.suite` 的推理档保存失败改成断言底部 toast + 控件子树无 `role="status"`;`chat-composer.suite` 的失败去重用例改成断言 toast 节点(同一条不重复弹、清空后再出现换新节点)

Refs #600, PR #607
suzmii added 1 commit 2026-10-05 21:03:17 +08:00
Merge remote-tracking branch 'origin/master' into fix/agc-composer-layout
Project CI / AI game creator shell Rust crates (pull_request) Successful in 4m59s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 7m17s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 6m38s
Project CI / Frontend tests (pull_request) Successful in 3m1s
Project CI / Backend tests (pull_request) Successful in 7m16s
Project CI / AI game creator shell web tests (pull_request) Successful in 2m15s
Project CI / Repository checks (pull_request) Successful in 5m19s
Project CI / Native shell tests (pull_request) Successful in 7m2s
342cc75d20
合并 master 96859666f(AGC 运行画面点选 #624 等):保留双方条目
- docs/project-memory/shared-memory/pitfalls.md 冲突:本分支 2 条(2026-10-05 PR #607 复核修复 / 模型菜单共享样式面)在前,master 新增 6 条(运行画面点选 ×5、Phaser 4 ×2)紧随其后,其余各节原样保留
- 其余文件自动合并(master 侧改动与本分支不重叠)
suzmii added 1 commit 2026-10-06 00:19:33 +08:00
输入区工具条改回唯一一行:润色钮并入工具条,nowrap + 实测 min-width
Project CI / Backend tests (pull_request) Failing after 26s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 5m45s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 6m30s
Project CI / Repository checks (pull_request) Failing after 14s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 7m4s
Project CI / Frontend tests (pull_request) Successful in 2m51s
Project CI / AI game creator shell web tests (pull_request) Failing after 4m12s
Project CI / Native shell tests (pull_request) Successful in 10m32s
870d6457bc
- 口径:工具条只允许一行——`@` / `+` / 「AI 润色 / 恢复原文」/ 模型 / 语音 / 发送 六颗控件平铺,任何面板宽下都不换行、不堆叠、不重叠;宽度不够时按 `min-width` 横向溢出可见,发送钮仍在可视区内
- 换行来源(首轮为「避免重叠」加的 wrap):styles.css:11893 `.project-chat-composer-controls`(6 类)`flex-wrap: wrap`、styles.css:11933 `.project-chat-composer-controls-left` `flex-wrap: wrap`、styles.css:13747 `.conversation-model-select` `flex-wrap: wrap` → 三处都改 `nowrap`;左组补 `flex: 0 0 auto`(固定 28px 动作钮不参与收缩,否则槽位被压窄会把润色钮挤到模型钮上)
- 润色钮进工具条:`ResourceReferenceInput` 新增 `actionsPortalTarget`(portal 目标,不传时行为不变,策划面照旧),`DirectProjectComposer` 在左组 `+` 之后放挂点 `.project-chat-composer-controls-actions` 并传入 → 空输入态不再为它留一行;输入盒第二行只剩「润色状态」(无内容时 0 高,`gap` 的 row 分量 6→0、状态自带 `margin-top: 6px`)
- min-width 算式(落到两个元素):控件排 `.project-chat-composer-controls` = `@`28 + `+`28 + 润色28 + 模型钮 64(`min-width: 64px`,名字省略号)+ 语音28 + 发送28 = 204,加 5×8px 列间距 = 244,再留 8 余量 → **252px**;外壳 `form.project-chat-composer.is-direct-codex` = 252 + 左右内边距 12×2 + 边框 1×2 → **278px**。夹具实测:自然宽度 290.4、七档(240…900)控件 `top` 差值 ≤1px、两两相交 0 处、`outsideControlsRow` 空
- 低于 min-width:外壳保持 278px、**内容按自身宽度溢出可见**(面板与 composer 都不裁切,选它而不是给工具条 `overflow-x: auto` 是因为工具条里挂着模型菜单浮层,加滚动容器会把它裁掉——#600 的老问题);240px 实测发送钮 rect 仍在窗口内且 `elementFromPoint` 命中它
- 测试:`chatDialogFrameLayout.test.ts` 新增「工具条只有一行…」——七个宽度下 `flex-wrap` 必须 `nowrap`(右组本来就不换行)、控件排 `min-width: 252` / 外壳 `min-width: 278`、组件源码里润色钮渲染在控件排之后的挂点;最高高度算式按新结构更新为 222。**改前红已记录**:把三个源文件 stash 回旧实现后单跑,`240px 下工具条必须保持单行: expected 'wrap' to be 'nowrap'` 与 `expected 228 to be 222` 两条同时红
- 校验:`npx vitest run tests/appSurface.test.ts tests/chatDialogFrameLayout.test.ts` → **225 passed / 9 skipped**;`agc:typecheck` pass 3 / fail 0;eslint、prettier、encoding 5280 files、spacetime-schema 91 tables、`git diff --check` 全绿;对照图与 PR 正文已更新

Refs #600, PR #607
suzmii added 2 commits 2026-10-06 00:35:43 +08:00
合并 master 51cb05f41(创作者主页 / 关注链路等):保留双方条目
- docs/project-memory/shared-memory/pitfalls.md 冲突:本分支 2 条(2026-10-05 PR #607 复核修复 / 模型菜单共享样式面)在前,master 新增 2 条(自定义作者插槽昵称降级 / 页面返回兜底不新增历史)紧随其后,其余各节原样保留
- 其余文件自动合并(master 侧的 CreatorControls / GameCard / creator 服务与本分支不重叠)
- 顺带修本分支行为:模型状态文案改走底部 toast 后,conversationModelSelect.test.tsx 两处同步 getByText 改成 await findByText(toast 是 portal 的异步更新,同步查询在慢机上会竞态)
测试:模型状态文案改走底部 toast 后改用异步查询
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 6m31s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 4m36s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 6m10s
Project CI / Frontend tests (pull_request) Successful in 3m19s
Project CI / Backend tests (pull_request) Successful in 7m32s
Project CI / AI game creator shell web tests (pull_request) Successful in 2m59s
Project CI / Repository checks (pull_request) Successful in 6m26s
Project CI / Native shell tests (pull_request) Successful in 8m52s
bbd5e51d3d
- `conversationModelSelect.test.tsx` 两处同步 `screen.getByText('…')` 改为 `await screen.findByText(…)`:状态文案现在渲染在 portal 的 toast 里(发布 → 宿主 re-render 一次),同步查询在慢机/并行下会竞态(CI 上就是这样红的)
- 本地:`npx vitest run tests/conversationModelSelect.test.tsx` 29 passed;`appSurface + chatDialogFrameLayout` 225 passed / 9 skipped

Refs #600, PR #607
suzmii added 2 commits 2026-10-06 01:25:53 +08:00
- 评审 D-A:上一轮给状态行加的 `margin-top: 6px` 被紧接着的旧 `margin-top: 0`(styles.css 两条 Direct 状态规则)覆盖 → 实际间距是 0、状态紧贴编辑器末行;注释与测试注释也跟着说错
- 改法:删掉那两行 `margin-top: 0`,保留 6px,并把 CSS 注释与测试注释改成事实(输入盒 `gap` 的 row 分量为 0,间距由状态元素自带)
- 实测(无头 Chromium 夹具,438px 面板):无状态行时输入盒 **72px** / 表单 **136px**;出现「AI 润色失败,可重试」时状态行 `margin-top` 计算值 = **6px**、状态行高 16.8px,输入盒 **95px** / 表单 **159px**(= 136 + 6 + 16.8);空态仍 0 高,222 算式与空态断言不变
- 测试:`statusRowHeight = 0` 不再写死——断言 `ResourceReferenceInput` 里状态行仍是条件渲染(`polishing || polishError || polishNotice`)+ 状态规则 `margin-top` 解出 6px(谁改回常驻渲染或把间距写回 0 都会红)

Refs #600, PR #607
语音提示不再常驻 + 模型触发钮补 title + 工具条 DOM 级断言
Project CI / AI game creator shell Rust crates (pull_request) Successful in 4m18s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 6m30s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 7m18s
Project CI / Backend tests (pull_request) Successful in 7m43s
Project CI / Frontend tests (pull_request) Successful in 4m39s
Project CI / Repository checks (pull_request) Successful in 7m7s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m53s
Project CI / Native shell tests (pull_request) Successful in 9m18s
b7440d8c39
- D-B:`voiceNotice` 只在 mic 的 `onNotice` 里 set、从不清理(会常驻到组件卸载)→ 改成「拿到转写就收掉」(`onTranscript` 里 `setVoiceNotice('')`);提示是上一次动作的回执,选这个时机而不是 6s 定时,避免与 toast 的 6s 语义混在一起
- D-B 用例(改前红):`chat-composer.suite.ts`「语音提示是上一次动作的回执:拿到转写后不再常驻」——录音 + `onerror({error:'network'})` → `project-chat-composer-notice` 出现「语音识别服务…」;再 `emitTranscript('做一个小游戏')` → 该行消失且节点脱离文档(旧实现里它一直在)
- D-C:模型触发钮最窄可缩到 64px、名字走省略号但没有 `title`,截断后无从查看 → 触发钮补 `title={triggerLabel}`(与显示名同源),并加属性断言:`title` == 触发钮文本
- 测试加强(评审说偏声明级):`chat-composer.suite.ts` 新增「AI 润色钮在工具条这一行里(DOM 位置级)」——润色钮必须位于 `.project-chat-composer-controls` 内、父链在 `-controls-actions` 挂点里、不在 `.resource-reference-input` 里、空态工具条外没有第二行按钮(用真实挂载的 Direct 输入区断言);同排几何(top 差 ≤1px、两两不相交、七宽度)由无头 Chromium 夹具实测(240/280/296/320/360/438/900 全通过)
- 校验:`appSurface + chatDialogFrameLayout` **227 passed / 9 skipped**;typecheck pass 3 / fail 0;eslint、prettier、encoding 5327 files、spacetime-schema 92 tables、diff-check 全绿

Refs #600, PR #607
suzmii added 1 commit 2026-10-06 10:57:30 +08:00
润色钮挪到发送钮左边(右组相邻成组)
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
7e036a7199
- 口径:AI 润色 / 恢复原文与发送钮同为圆角矩形按钮,放一起更协调 → 从「左组 `@` `+` 之后」挪到**右组最末、发送钮左侧**,最终顺序 `@` `+` | 模型 麦克风 润色 发送(`space-between` 左右分组不变)
- 实现:portal 挂点搬进右组(`DirectProjectComposer` 里把 `.project-chat-composer-controls-actions` 移到 `-controls-right` 内、发送钮之前),`actionsPortalTarget` 的「可选 prop、不传则行为不变」契约保持;用显式槽位而不是 CSS `order`,因为 DOM 顺序即 Tab 与读屏顺序(现在就是 模型 → 麦克风 → 润色 → 发送,与视觉一致)
- 注释/文档同步:composer 与 styles.css 里「与 `@` / `+` 同组、排在左组最后一个」那类旧口径全部改成新口径(「与发送同为圆角矩形按钮、相邻成组」),pitfalls 同段一并更新;全仓 grep `输入类动作` / `生成类动作` / `排在左组` / `左组最后一个` 命中 0
- 测试:`chat-composer.suite.ts` 的 DOM 断言改成新挂点——润色钮必须在 `.project-chat-composer-controls` 内、父链是 `-controls-right`、**`slot.nextElementSibling` 就是发送钮**、且 `compareDocumentPosition` 证明润色在发送之前;`chatDialogFrameLayout.test.ts` 的源码顺序断言改成「挂点在 `-controls-right` 之后、`{canStopTurn` 之前」;空态「工具条之外无第二个按钮」计数仍为 6;七宽度单行/不相交用例不变(含新位置)
- min-width 复核(无头 Chromium 夹具,240/280/296/320/360/438/900 七档):控件排仍 **252px** 所需、外壳仍 **278px**;自然宽度 290.4(438/900 档)→ 算式不变;七档 `topSpread ≤ 1px`、控件两两相交 **0** 处、`outsideControlsRow` 空、润色钮与发送钮间距固定 **8px**(同一行、同一组)
- 截图:240px 改前→改后 + 438px 改后 + 438px toast 已换新(正文引用与附件 1:1:12 = 12,未引用的旧图已删)

Refs #600, PR #607
suzmii added 1 commit 2026-10-06 11:01:01 +08:00
Merge remote-tracking branch 'origin/master' into fix/agc-composer-layout
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
811efc102c
合并 master 76166b08c(模型目录不可用项 / 管理端等):保留双方条目
- apps/ai-game-creator-shell/src/services/clientApi.ts:取 master 的 typed 目录读取(`ClientLlmModelCatalog` 已含 unavailableModels,不再手写 agentMode 映射),但保留本分支的文案「模型服务不可用」(本 PR 的口径,master 那侧还是旧的「本地…」)
- ConversationModelSelect.tsx:import 取并集(`Lock` + `ReactNode`),渲染结构保留本分支的「强度区外壳」(`strengthSection ? <shell>{strengthSection}{modelMenu}</shell> : modelMenu`)——master 把菜单内联展开、并加了不可用项列表,那段已自动合并进 `modelMenu` 变量里,两边语义都在
- tests/conversationModelSelect.test.tsx:取 master 的新文案「所选模型已下线,已切换为默认模型」,保留本分支的异步查询(`await screen.findByText`,文案走 portal toast)
- docs/project-memory/shared-memory/pitfalls.md:两侧条目都保留(本分支在前,master 新增在后)
- 校验:typecheck pass 3 / fail 0;`appSurface + chatDialogFrameLayout + conversationModelSelect` 257 passed / 9 skipped
suzmii added 1 commit 2026-10-06 11:03:56 +08:00
合并收口:恢复 master 的不可用模型列表渲染(冲突块取并集时漏了)
Project CI / Backend tests (pull_request) Failing after 14s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 5m14s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 7m5s
Project CI / Repository checks (pull_request) Failing after 25s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 7m40s
Project CI / Frontend tests (pull_request) Successful in 3m14s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m32s
Project CI / Native shell tests (pull_request) Successful in 8m44s
0619b5e833
- 合并 master 76166b08c 时,`ConversationModelSelect` 的菜单渲染冲突块取了本分支的「强度区外壳」一侧,但 master 那侧**同时**包含不可用模型列表(`unavailableModels.map` + `Lock` 图标 + `unavailableModelReasonLabel`)→ 结果那三处变成未使用(eslint 三条 error)
- 修法:把 master 的不可用模型块(含注释)原样补回 `modelMenu` 变量里(`models.map` 之后、分隔线之前),外壳一侧不动;`Lock` / `unavailableModelReasonLabel` / `unavailableModels` 全部重新被使用
- 校验:eslint 该文件 0 error;typecheck pass 3 / fail 0;`conversationModelSelect + appSurface + chatDialogFrameLayout` 257 passed / 9 skipped
suzmii added 1 commit 2026-10-06 11:35:53 +08:00
Merge remote-tracking branch 'origin/master' into fix/agc-composer-layout
Project CI / AI game creator shell Rust crates (pull_request) Successful in 5m1s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 7m2s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 8m19s
Project CI / Frontend tests (pull_request) Successful in 3m13s
Project CI / AI game creator shell web tests (pull_request) Successful in 2m54s
Project CI / Repository checks (pull_request) Successful in 6m11s
Project CI / Backend tests (pull_request) Successful in 8m0s
Project CI / Native shell tests (pull_request) Successful in 10m14s
40f0b2cd24
suzmii added 1 commit 2026-10-06 12:36:32 +08:00
Merge remote-tracking branch 'origin/master' into fix/agc-composer-layout
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 7m5s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 4m33s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 6m19s
Project CI / Frontend tests (pull_request) Successful in 2m22s
Project CI / Backend tests (pull_request) Successful in 8m0s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m53s
Project CI / Repository checks (pull_request) Successful in 7m6s
Project CI / Native shell tests (pull_request) Successful in 9m54s
76ad99d2f7
合并 master 52c83cc2a(模板 templateVersion 递增,#643):零冲突
- master 只动 template-library/v1/{blank-3d-scene,phaser-2d-starter,threejs-3d-starter}/meta.json 各 1 行,与本分支不重叠
- 验证:ancestor rc=0、工作树干净;门禁:`vitest` appSurface + chatDialogFrameLayout + conversationModelSelect = 257 passed / 9 skipped、`agc:typecheck` pass 3 / fail 0、`git diff --check` rc=0、模板发布守卫 `node --test scripts/agc-template-library-publish.test.mjs` 28 passed / 0 failed
suzmii force-pushed fix/agc-composer-layout from 7a32fec1cb to 76ad99d2f7 2026-10-06 12:36:32 +08:00 Compare
suzmii added 1 commit 2026-10-06 14:03:45 +08:00
模型菜单刷新行改成左对齐:图标 + 文本贴最左成一组
Project CI / AI game creator shell Rust crates (pull_request) Successful in 5m1s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 7m11s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 6m25s
Project CI / Frontend tests (pull_request) Successful in 3m23s
Project CI / Backend tests (pull_request) Successful in 8m1s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m2s
Project CI / Repository checks (pull_request) Successful in 7m6s
Project CI / Native shell tests (pull_request) Successful in 9m31s
b2ffdc4cae
- 现象(用户截图 446×330):刷新行的图标在左、「刷新模型列表」文案被顶到行右端
- 根因:`styles.css:11706`(本次修复前)宿主作用域那条「抵消通用按钮样式」的规则统一写了 `justify-content: space-between !important`(8 类 + `!important`)→ 特异性压过 `styles.css:11751` 的 `.conversation-model-menu-refresh { justify-content: flex-start !important }`(1 类)
- 改法:宿主那条块**不再写对齐**(只留 position/display/align-items/width/margin/border/shadow/字号),对齐按角色分到共享样式面——`.conversation-model-select .conversation-model-menu button[role='option'] { justify-content: space-between !important }`(选项行名字左 / 勾右),刷新行继续用 `.conversation-model-menu-refresh { justify-content: flex-start !important; gap: 8px !important }`(gap 从 7px 收到卡片内既有的 8px 节奏,与工具条列间距同值,不新造数)
- 实测(无头 Chromium,438px / 280px):卡片 `padding-left: 12px`;**列表行 left = 刷新行 left = 459.5**(438 档;280 档同为 380.5);图标 left = 行 left + 行内边距 10 = 469.5;文本 left = 图标右缘 482.5 + **8.00px** = 490.5;计算值 `justify-content: flex-start`、`gap: 8px`;文本右缘 562.5 ≪ 行右缘 693.5(改前会贴近右端)
- 测试:`chatDialogFrameLayout.test.ts` 新增「模型菜单刷新行:图标与文本贴最左,选项行才用 space-between」——刷新行必须解出 `flex-start` + `gap: 8px`,选项行必须仍是 `space-between`(宿主块那条 8 类规则会被一并算进层叠求值,写回对齐就会变 `space-between` 而红)。**改前红(实测)**:把 `justify-content: space-between !important` 写回宿主块 → `expected 'space-between' to be 'flex-start'`(1 failed / 15 skipped);移除即绿
- 校验:`vitest run appSurface + chatDialogFrameLayout + conversationModelSelect` **258 passed / 9 skipped**;typecheck pass 3 / fail 0;eslint(TS 部分)0 error;prettier 全绿;encoding 5402 files;spacetime-schema 93 tables;`git diff --check` rc=0

Refs #600, PR #607
suzmii added 1 commit 2026-10-06 15:19:41 +08:00
Merge remote-tracking branch 'origin/master' into fix/agc-composer-layout
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 7m3s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 5m24s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 4m14s
Project CI / Frontend tests (pull_request) Successful in 3m48s
Project CI / Backend tests (pull_request) Successful in 8m5s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m0s
Project CI / Repository checks (pull_request) Successful in 7m30s
Project CI / Native shell tests (pull_request) Successful in 9m44s
d2e05dbeb7
合并 master be9f74f42(付费游玩泥点付费规范 #635 等):保留双方条目/内容
- 唯一冲突:`docs/project-memory/shared-memory/pitfalls.md` —— 本分支 2 条(2026-10-05「PR #607 复核修复」+「模型菜单的观感是组件自带的共享样式面」)在前,master 新增 2 条(「给 shared-contracts 请求 DTO 加字段」+「付费游戏播放会话前缀落在 /api/*」)紧随其后,**两侧 4 条都保留**(grep 逐条命中 1)
- 其余 286 个文件自动合并(master 侧含 server-rs / admin-web / 主站 / vite.config.ts 等,与本分支不重叠;`styles.css` 也是自动合并、无冲突)
- 门禁(本轮只合并、未改内容):`vitest run appSurface + chatDialogFrameLayout + conversationModelSelect` **258 passed / 9 skipped**;`npm run agc:typecheck` pass 3 / fail 0;`npm run check:encoding` 5418 files;`git diff --check` rc=0;prettier 已对合并后的 pitfalls 重新折行
suzmii added 1 commit 2026-10-06 15:23:13 +08:00
Merge branch 'master' into fix/agc-composer-layout
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
a073a1524f
suzmii merged commit 9f4c7d7639 into master 2026-10-06 15:23:27 +08:00
suzmii deleted branch fix/agc-composer-layout 2026-10-06 15:23:27 +08:00
Sign in to join this conversation.