WIP: AGC 资源画布与替换改造 V3.0 #316
Reference in New Issue
Block a user
Delete Branch "feat/agc-canvas-resource-workbench-v3"
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?
AGC 资源工作台 V3.0
一、交付范围与完成情况
本次改动要点
versions[].resourceBindings即"该版本用了哪些资源"的权威记录,slotId恒为asset:{assetId};运行期资源观察方案(代码注入 / Phaser wrapper / Vite 虚拟模块 / 脚手架哈希校验 /.agent使用侧车)整体撤回,project/asset_usage.rs与其 16 条测试按四不写删除。delete_local_project_asset新增deleteReferencedVersions,三分支语义(无引用直接删 / 有引用且不勾选只删素材并保留悬空绑定 / 勾选则连带删除引用它的版本)在同一次 manifest 写入内原子完成;新增只读命令read_local_project_asset_read_references(列出被哪些版本使用)驱动二次确认弹窗。版本数组"只允许追加"的唯一例外由mutate_manifest_at_allowing_version_removals承担,放行集合按写入前 manifest 求值、被放行版本不得出现在追加段。ImageCanvasSelectedLayerToolbarView,支持 Shift/Ctrl/Meta 多选);快速编辑走浮层面板,先normalize_local_project_raster_resource正规化再derive_local_project_resource(editKind='image-reference')产出新素材;删除"资源详情"面板与"编辑资源"全屏路由;分类与标签、重命名入口搬到工具条;新增撤销重做(只作用于卡片布局,不回滚素材)、框选、独立资源面板(预览 / 上传 / 下载 / 多选)。@面板两个页签(当前版本素材 / 全部画布素材)各自独立筛选与搜索;改名后引用芯片与候选列表刷新;跨会话草稿恢复后光标落到文本末尾。WorkspaceLauncherShell,运行模块右上角GameRunVersionPicker(无版本不渲染);切换版本时资源卡"当前使用"高亮与@面板同步,并重载当前预览。polish_local_project_prompt(入参有界 4000/1000 字符、输出 2048 token),润色回填 / 恢复原文 / 失败保留原文 / 可重复润色;发送前提醒为独立 portal 弹窗(AI 润色 / 使用原文提交 / 关闭 / 不再提醒),偏好存本机。计费不自建:泥点扣费仍走 server-rs 的/api/llm/*路由,本次 server-rs 零改动。packages/shared共享层并与画布共用同一组件、各自独立状态;提交时把参考图素材 ID 作为快照落进既有generationInputs.references,零后端改动。agc_list_registered_assets投影暴露category/tags(不在投影层重新派生,避免覆盖用户显式分类);删除normalize_local_project_raster_resource的过渡 allowlist 条目(解除条件已由 C3 快速编辑满足)。二、门禁实测
npm run ai-game-creator-shell:typecheck(含check-config、skill-pack)npm run test -- apps/ai-game-creator-shell/testsnpm run test -- src/components/image-editorcargo check --all-targetscargo test --test-threads=1asset_export5、asset_rename9、asset_delete7、bridge_registered_resource2 —— 全 0 failednpm run check:encodinggit diff --check既有环境失败(非本次引入,已用纯净基线证明):
cargo test并行跑project::约 10 条环境依赖用例失败;单线程纯净基线同样有 4 条(npm 构建 2 + 本地 preview 2)。仓库正式门禁口径是--test-threads=1。三、明确未做(如实列出,未留任何半成品入口)
四、已知边界与后续项
ImageCanvasSelectedLayerToolbarView→ImageCanvasGenerationModel→(值导入ApiClientError)→src/services/apiClient→hostBridge的跨端耦合会把主仓 service 层编进 AGC bundle。已核实该链在 Tauri 中无导入即执行副作用,并在 AGCvite-env.d.ts补了跨端全局声明;彻底解耦的正解是把canOpenRedrawPanel/isQuickEditSupportedLayer两个谓词下沉到packages/image-canvas-core。assets/<name>的引用(未做引用扫描与自动替换),后果由用户自负。cargo fmt --check对未改动文件也存在既有格式漂移,未在本次顺手全仓格式化。suzmii referenced this pull request2026-09-09 22:12:29 +08:00
- 新增 game_iteration_resource_bindings:优先使用使用清单里的 slotId 到 resourceId 绑定,再为未被槽位覆盖的资源补 asset:{id} 恒等绑定 - 恒等绑定保留是有意的:历史版本与既有校验语义不受影响,同一资源被多个槽位使用时只取首个槽位,不产生冲突语义 - ensure_initial_game_iteration_version_at 与 append_agent_game_iteration_version_at 共用该构造函数 - 补测试:无使用清单时保持恒等绑定;登记运行槽位后槽位绑定优先且未覆盖资源仍有兜底- appSurface/harness 补齐三处 jsdom 缺口:ClipboardEvent、DragEvent、Range.prototype.getBoundingClientRect;否则 Lexical 的粘贴通路直接抛 ReferenceError / TypeError - appSurface/harness 的 submitChat 改为 async:全选并让编辑器吸收选区、清空、走产品真实 paste 通路写入,再让出一帧让 React 追平 draft,最后点发送 - 新增 composerText / composerValue / composerDisabled / setComposerText 助手,按原生控件与 Lexical contenteditable 两种 DOM 口径读写输入区 - 15 个测试文件中 116 处 toHaveProperty('value', …) 断言等义改写为 await composerText() / await composerValue();1 处 placeholder 断言改查输入区占位文案;2 处 disabled 断言改用 composerDisabled(同时覆盖 data-disabled 与 contenteditable=false);9 处 fireEvent.change 写入改用 setComposerText - 328 处 submitChat 调用补 await,9 个非 async 用例补 async - Godot 输入区键盘语义用例按 Lexical 实际行为改写:Shift+Enter 与组合态 Enter 由编辑器消化并插入换行、不发送、草稿保留 - 未改动 src 下任何产品代码,未放宽或删除断言- 整体删除运行期资源使用侧车模块 project/asset_usage.rs 与 tests/asset_usage.rs(含 16 条测试),并清理 project.rs、tests/mod.rs 里的 mod / use - game_iteration_resource_bindings 收敛为纯恒等映射 slotId=asset:{assetId}、resourceId=assetId,不再读取侧车、不再做槽位优先 - assets.rs 删除 GAME_ITERATION_IDENTITY_BINDING_PREFIX、asset_is_bound_to_runtime_slot 与 remove_asset_usage_references,删除不再判定运行槽位、不再清理侧车引用 - manifest 写入层把“版本数组只允许追加”校验改为显式接收放行删除的版本 ID:新增 mutate_manifest_at_allowing_version_removals,其余写入路径继续传空放行集合 - delete_manifest_asset_at 改为三分支语义:无任何版本引用直接删登记、被引用且未确认时只删登记并原样保留悬空绑定、被引用且确认时素材与相关版本在同一次 manifest 写入里一起删除 - DeleteLocalProjectAssetInput 增加 deleteReferencedVersions 入参,commands.rs 与 main.rs 同步 - 新增只读命令 read_local_project_asset_references,列出引用了该素材的版本标识、revision 与创建时间 - 新增 tests/asset_delete.rs,覆盖恒等绑定、无引用删除、未确认保留悬空绑定、确认连带删除、引用投影、只允许追加校验仍拒绝其它路径与 CASView command line instructions
Checkout
From your project repository, check out a new branch and test the changes.