修复 AGC 画布交互、JSON 识别与对话历史分页 #390

Merged
suzmii merged 10 commits from fix/agc-canvas-json into master 2026-09-17 14:02:12 +08:00
Member

改动

  • 修复工作台向窗口标题栏发布状态时的重复更新循环,避免触发 Maximum update depth exceeded
  • 增加画布右键平移,保留左键框选、资源卡拖动和触摸板平移;补齐失焦、取消和捕获丢失后的清理。
  • 运行不可用提示不再因资源选中而消失。
  • JSON 卡片按原生校验结果分流:合法 UI State 显示 UI 设计并进入现有编辑器,普通 JSON 显示 JSON 并提供代码预览。
  • 复用 UI State 的 schema、完整结构及项目/资产身份校验;有效已有设计不受 UI/ui/document 登记标签影响,普通或非法 JSON 不授予编辑能力。
  • 同步规范、回归测试和待验收记录;不修改用户 manifest 分类,不迁移或覆盖原始 JSON。
  • 修复 DirectProject 历史分页:聊天显式按消息分页,工具/推理不占页且不删除;原生返回游标,前端隔离迟到响应、重复点击与重叠消息。

问题

编号 问题 本 PR 状态
B01 首次进入画布元素抖动 已优化;用户本轮未再复现,不宣称全部独立根因均已排除
B02 初次双指平移无效,整理后恢复 已优化;用户本轮未再复现
B03 快速平移报更新深度错误 已修复已确认的工作台状态循环
B04 选中资源后运行不可用提示消失 已修复
B05 对话记录偶发丢失 已修复日志复现的分页卡点;已存 44 条消息可分 3 页取回,不宣称其它未落盘记录已恢复
B06 JSON 未正确识别展示 已修复普通 JSON / UI 设计 JSON 双路径
C01 右键平移,保留左键框选 已实现

验证

  • 119 个前端定向测试通过:画布/JSON/窗口与历史相关 111 项,加 Direct 恢复及画布导航 8 项。
  • 30 个原生测试通过:UI 持久化 14 项、历史 16 项;另行执行真实日志只读重放通过,44 条消息分 3 页取回,内容与顺序一致,原文件未变。
  • AGC TypeScript、修改文件 ESLint、格式、编码、文档索引及 git diff --check 通过。
  • 真实客户端 UI JSON 展示与编辑器体验待验收;本次含 Rust 变更,需重新构建并启动原生端,仅刷新前端不足以验证。
  • 测试存在既有 React key/act 与 Rust 未使用代码告警,未扩大本 PR 修复范围。
## 改动 - 修复工作台向窗口标题栏发布状态时的重复更新循环,避免触发 `Maximum update depth exceeded`。 - 增加画布右键平移,保留左键框选、资源卡拖动和触摸板平移;补齐失焦、取消和捕获丢失后的清理。 - 运行不可用提示不再因资源选中而消失。 - JSON 卡片按原生校验结果分流:合法 UI State 显示 UI 设计并进入现有编辑器,普通 JSON 显示 JSON 并提供代码预览。 - 复用 UI State 的 schema、完整结构及项目/资产身份校验;有效已有设计不受 `UI/ui/document` 登记标签影响,普通或非法 JSON 不授予编辑能力。 - 同步规范、回归测试和待验收记录;不修改用户 manifest 分类,不迁移或覆盖原始 JSON。 - 修复 DirectProject 历史分页:聊天显式按消息分页,工具/推理不占页且不删除;原生返回游标,前端隔离迟到响应、重复点击与重叠消息。 ## 问题 | 编号 | 问题 | 本 PR 状态 | | --- | --- | --- | | B01 | 首次进入画布元素抖动 | 已优化;用户本轮未再复现,不宣称全部独立根因均已排除 | | B02 | 初次双指平移无效,整理后恢复 | 已优化;用户本轮未再复现 | | B03 | 快速平移报更新深度错误 | 已修复已确认的工作台状态循环 | | B04 | 选中资源后运行不可用提示消失 | 已修复 | | B05 | 对话记录偶发丢失 | 已修复日志复现的分页卡点;已存 44 条消息可分 3 页取回,不宣称其它未落盘记录已恢复 | | B06 | JSON 未正确识别展示 | 已修复普通 JSON / UI 设计 JSON 双路径 | | C01 | 右键平移,保留左键框选 | 已实现 | ## 验证 - 119 个前端定向测试通过:画布/JSON/窗口与历史相关 111 项,加 Direct 恢复及画布导航 8 项。 - 30 个原生测试通过:UI 持久化 14 项、历史 16 项;另行执行真实日志只读重放通过,44 条消息分 3 页取回,内容与顺序一致,原文件未变。 - AGC TypeScript、修改文件 ESLint、格式、编码、文档索引及 `git diff --check` 通过。 - 真实客户端 UI JSON 展示与编辑器体验待验收;本次含 Rust 变更,需重新构建并启动原生端,仅刷新前端不足以验证。 - 测试存在既有 React key/act 与 Rust 未使用代码告警,未扩大本 PR 修复范围。
suzmii added 4 commits 2026-09-16 19:26:47 +08:00
稳定工作台与窗口标题栏状态同步,消除重复更新循环
支持画布右键平移并保留左键框选及资源拖动,完善中断清理
解耦运行不可用提示与资源选中状态
复用原生UI状态校验区分UI设计JSON和普通JSON,接入现有编辑器与代码预览
补充前端和原生回归测试、规范及待验收记录,明确对话历史分页尚未修复
合入当前主线的多窗口与配置更新
保留AGC画布交互和JSON识别修复
保留双方新增的项目排障记录并解决文档冲突
聊天历史按有效消息分页并返回原生游标,保留默认原始切片接口
工具和推理记录不占聊天页名额,逐行过滤避免传回大段工具输出
隔离重新加载和项目切换的迟到响应,补齐单飞、重试与消息去重
补充原生和真实App回归测试,增加人工只读日志重放入口
更新B05状态、规范与PR验收记录,不提交用户原始日志
同步master最新基线并准备画布修复PR
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust smoke (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
ac8a51ca79
合入平台会话与主线测试修复
保持画布交互、JSON识别和对话历史分页修复范围不变
suzmii added 1 commit 2026-09-16 19:29:09 +08:00
Merge branch 'master' into fix/agc-canvas-json
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Successful in 5m15s
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Successful in 4m31s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Successful in 4m21s
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Successful in 5m1s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 1m39s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m48s
Project CI / Frontend tests (pull_request) Failing after 3m36s
Project CI / Repository checks (pull_request) Failing after 3m56s
Project CI / Native shell tests (pull_request) Successful in 6m40s
Project CI / AI game creator shell web tests (pull_request) Failing after 3m18s
Project CI / Backend tests (pull_request) Successful in 8m18s
fca3df964c
suzmii added 1 commit 2026-09-16 22:58:28 +08:00
Merge branch 'master' into fix/agc-canvas-json
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Successful in 4m50s
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Successful in 6m22s
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Successful in 5m19s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 2m9s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m45s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Successful in 5m38s
Project CI / Frontend tests (pull_request) Failing after 3m50s
Project CI / Repository checks (pull_request) Failing after 4m18s
Project CI / Native shell tests (pull_request) Successful in 8m2s
Project CI / AI game creator shell web tests (pull_request) Failing after 3m31s
Project CI / Backend tests (pull_request) Successful in 8m50s
ecaf1e8cec
suzmii marked the pull request as ready for review 2026-09-16 23:14:21 +08:00
suzmii added 2 commits 2026-09-17 11:51:29 +08:00
恢复资源选中状态下运行提示的正确显示条件

使源码契约测试与实际行为保持一致
修正运行不可用提示的过期测试契约
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Successful in 5m28s
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Successful in 5m54s
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Successful in 5m32s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 2m0s
Project CI / Backend tests (pull_request) Failing after 11s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m17s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Successful in 5m52s
Project CI / Repository checks (pull_request) Failing after 11s
Project CI / Frontend tests (pull_request) Successful in 5m46s
Project CI / AI game creator shell web tests (pull_request) Successful in 4m15s
Project CI / Native shell tests (pull_request) Successful in 9m21s
9d374a57b1
恢复运行提示与资源选择解耦的业务逻辑
更新界面源码契约测试,保留资源选中交互回归
补充运行提示及无障碍关联的验收口径
suzmii added 1 commit 2026-09-17 13:05:35 +08:00
Merge branch 'master' into fix/agc-canvas-json
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Successful in 6m49s
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Successful in 7m3s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 2m21s
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Successful in 7m56s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Successful in 6m50s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 3m1s
Project CI / Frontend tests (pull_request) Successful in 4m38s
Project CI / Repository checks (pull_request) Successful in 3m43s
Project CI / Backend tests (pull_request) Successful in 8m30s
Project CI / AI game creator shell web tests (pull_request) Successful in 4m7s
Project CI / Native shell tests (pull_request) Successful in 25m34s
d1f53fda4d
lhk229 approved these changes 2026-09-17 13:45:28 +08:00
lhk229 left a comment
Owner

评审结论:通过(Approve)

已逐文件审完全部 34 个文件的 diff(+2071/-87),覆盖三条主线:画布交互与工作台状态循环、JSON 语义识别双路径、DirectProject 历史分页。整体质量高,同意合并。

逐块意见

1. 窗口 Context 更新循环(B03)WorkspaceLauncher 的修法正确——openProjectRefuseLayoutEffect 在提交阶段同步最新处理器,发布 effect 依赖收敛,卸载清理拆成独立 effect。workspaceWindowSync.test.tsx 用真实 WindowChrome Provider + 有界发布次数做回归,能真实复现反馈链,不是摆设测试。

2. 右键平移(C01):指针捕获目标存入 ref(captureTarget)、onLostPointerCapture、失焦清理、右键目标判定 isResourceCanvasPanTarget 对输入控件/浮层的排除都齐全;contextmenu 抑制限定在画布接管的区域内,键盘菜单键(button ≠ 2)不受影响。左键框选与卡片拖动的分流逻辑保持原样。

3. 运行提示解耦(B04)showRunUnavailableHint 去掉 selectedResourceIds.length === 0 依赖,源码契约测试同步更新,正确。

4. JSON 语义识别(B06):这是本 PR 最有价值的部分。识别完全由原生侧复用编辑器完整契约(schema、canonical 校验、revision、项目/资产身份)完成,前端只消费 uiDesignAssetId 且校验 preview.path === resource.path 防陈旧缓存;ui_design_asset() 保留新建初始化的严格 UI 门禁,registered_json_asset() 只放开已有设计的加载/保存——「不据标签授予能力、不覆盖普通 JSON」的边界清晰,原生测试对坏 JSON、未知字段、跨项目/跨资产、未登记文件的拒绝路径覆盖到位。

5. 历史分页(B05):原生消息模式逐行过滤、不整表积累 40 MiB 工具输出;无 ID 旧消息向前扩展到可寻址 ID 边界而不伪造身份的做法是对的;oldestItemId 游标取原始记录而非过滤后投影。前端侧代次隔离(loadVersion)、单飞、迟到响应丢弃、prependDirectHistoryMessages 按原始 ID 去重,以及「游标不前进即抛错」的防御,把之前「空页死循环表现为历史丢失」的根因堵死了。真实日志只读重放作为 #[ignore] 人工诊断用例、不提交正文夹具,符合仓库约束。

6. 文档:新增计划/里程碑文档命名符合 【标签】标题-日期 规范,pitfalls.md 三条新踩坑记录和总实施计划同步到位,B01/B02/B05 的状态表述诚实(不宣称未证实的恢复),符合「四不写」与范围克制要求。

两条非阻塞建议(可后续跟进,不影响本次合并)

  1. openResourceUiEditor 的提示文案「该资源尚未通过 UI 设计 JSON 校验」把「缺少正式资产身份」和「校验未通过」两种原因合并了,排障时不如原来分得清,建议后续拆开或带上原因。
  2. 消息模式下历史文件被删除或游标 ID 不存在时原生固定报错,前端 hasMore 保持 true,用户每次向上翻都会再撞一次同样的错误。属于极端边界(历史文件被外部截断/轮替),可考虑后续在该错误下把 hasMore 收尾,避免死胡同。

合并前确认项

  • CI 除 Native shell tests 仍在运行外其余全绿,请等该 job 通过后再合并。
  • 本次含 Rust IPC 变更(新增 messagesOnly 参数与 oldestItemId 字段),合并后真实客户端验收需重新构建并启动原生端,仅刷新前端不够——PR 描述已如实标注,验收时请按此执行。
## 评审结论:通过(Approve) 已逐文件审完全部 34 个文件的 diff(+2071/-87),覆盖三条主线:画布交互与工作台状态循环、JSON 语义识别双路径、DirectProject 历史分页。整体质量高,同意合并。 ### 逐块意见 **1. 窗口 Context 更新循环(B03)**:`WorkspaceLauncher` 的修法正确——`openProjectRef` 用 `useLayoutEffect` 在提交阶段同步最新处理器,发布 effect 依赖收敛,卸载清理拆成独立 effect。`workspaceWindowSync.test.tsx` 用真实 WindowChrome Provider + 有界发布次数做回归,能真实复现反馈链,不是摆设测试。 **2. 右键平移(C01)**:指针捕获目标存入 ref(`captureTarget`)、`onLostPointerCapture`、失焦清理、右键目标判定 `isResourceCanvasPanTarget` 对输入控件/浮层的排除都齐全;contextmenu 抑制限定在画布接管的区域内,键盘菜单键(button ≠ 2)不受影响。左键框选与卡片拖动的分流逻辑保持原样。 **3. 运行提示解耦(B04)**:`showRunUnavailableHint` 去掉 `selectedResourceIds.length === 0` 依赖,源码契约测试同步更新,正确。 **4. JSON 语义识别(B06)**:这是本 PR 最有价值的部分。识别完全由原生侧复用编辑器完整契约(schema、canonical 校验、revision、项目/资产身份)完成,前端只消费 `uiDesignAssetId` 且校验 `preview.path === resource.path` 防陈旧缓存;`ui_design_asset()` 保留新建初始化的严格 UI 门禁,`registered_json_asset()` 只放开已有设计的加载/保存——「不据标签授予能力、不覆盖普通 JSON」的边界清晰,原生测试对坏 JSON、未知字段、跨项目/跨资产、未登记文件的拒绝路径覆盖到位。 **5. 历史分页(B05)**:原生消息模式逐行过滤、不整表积累 40 MiB 工具输出;无 ID 旧消息向前扩展到可寻址 ID 边界而不伪造身份的做法是对的;`oldestItemId` 游标取原始记录而非过滤后投影。前端侧代次隔离(loadVersion)、单飞、迟到响应丢弃、`prependDirectHistoryMessages` 按原始 ID 去重,以及「游标不前进即抛错」的防御,把之前「空页死循环表现为历史丢失」的根因堵死了。真实日志只读重放作为 `#[ignore]` 人工诊断用例、不提交正文夹具,符合仓库约束。 **6. 文档**:新增计划/里程碑文档命名符合 `【标签】标题-日期` 规范,`pitfalls.md` 三条新踩坑记录和总实施计划同步到位,B01/B02/B05 的状态表述诚实(不宣称未证实的恢复),符合「四不写」与范围克制要求。 ### 两条非阻塞建议(可后续跟进,不影响本次合并) 1. `openResourceUiEditor` 的提示文案「该资源尚未通过 UI 设计 JSON 校验」把「缺少正式资产身份」和「校验未通过」两种原因合并了,排障时不如原来分得清,建议后续拆开或带上原因。 2. 消息模式下历史文件被删除或游标 ID 不存在时原生固定报错,前端 `hasMore` 保持 true,用户每次向上翻都会再撞一次同样的错误。属于极端边界(历史文件被外部截断/轮替),可考虑后续在该错误下把 `hasMore` 收尾,避免死胡同。 ### 合并前确认项 - CI 除 Native shell tests 仍在运行外其余全绿,请等该 job 通过后再合并。 - 本次含 Rust IPC 变更(新增 `messagesOnly` 参数与 `oldestItemId` 字段),合并后真实客户端验收需重新构建并启动原生端,仅刷新前端不够——PR 描述已如实标注,验收时请按此执行。
suzmii added 1 commit 2026-09-17 13:54:33 +08:00
修复历史重读后旧消息追加到末尾的乱序
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Successful in 7m9s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 2m24s
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Successful in 6m26s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Successful in 6m49s
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Successful in 7m23s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m49s
Project CI / Repository checks (pull_request) Failing after 4m16s
Project CI / Frontend tests (pull_request) Successful in 5m46s
Project CI / Native shell tests (pull_request) Successful in 9m22s
Project CI / Backend tests (pull_request) Successful in 10m6s
Project CI / AI game creator shell web tests (pull_request) Failing after 4m22s
036395c6c9
区分历史回读与实时消息来源,保留运行时所有权语义
防止旧页消息在历史刷新后追加到最新回复末尾
增加重新读取历史后再次翻页的顺序和去重回归
同步对话历史规范与实施计划
suzmii merged commit d85622069d into master 2026-09-17 14:02:12 +08:00
suzmii deleted branch fix/agc-canvas-json 2026-09-17 14:02:12 +08:00
Sign in to join this conversation.