修复 AGC 画布交互、JSON 识别与对话历史分页 #390
Reference in New Issue
Block a user
Delete Branch "fix/agc-canvas-json"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
改动
Maximum update depth exceeded。UI/ui/document登记标签影响,普通或非法 JSON 不授予编辑能力。问题
验证
git diff --check通过。评审结论:通过(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 的状态表述诚实(不宣称未证实的恢复),符合「四不写」与范围克制要求。两条非阻塞建议(可后续跟进,不影响本次合并)
openResourceUiEditor的提示文案「该资源尚未通过 UI 设计 JSON 校验」把「缺少正式资产身份」和「校验未通过」两种原因合并了,排障时不如原来分得清,建议后续拆开或带上原因。hasMore保持 true,用户每次向上翻都会再撞一次同样的错误。属于极端边界(历史文件被外部截断/轮替),可考虑后续在该错误下把hasMore收尾,避免死胡同。合并前确认项
messagesOnly参数与oldestItemId字段),合并后真实客户端验收需重新构建并启动原生端,仅刷新前端不够——PR 描述已如实标注,验收时请按此执行。