From ac870fd41acf5ea6ed1df562535a34af2a28d936 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Thu, 24 Sep 2026 15:58:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E6=A1=A3=E7=99=BB=E8=AE=B0=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E6=97=B6=E5=9B=9E=E6=BB=9A=E6=9C=AC=E6=AC=A1=E9=A1=BA?= =?UTF-8?q?=E5=B8=A6=E7=99=BB=E8=AE=B0=E7=9A=84=E8=AE=BE=E8=AE=A1=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ui_editor/agent_tools/creation.rs 登记文档资源失败时先摘掉 prepare_design_images 登记进来的图片条目,避免 manifest 留下没有文档引用的孤儿设计图 把「按 id 摘条目」抽成 drop_manifest_assets,rollback_created_document 复用同一实现 --- .../src/ui_editor/agent_tools/creation.rs | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/apps/ai-game-creator-shell/src-tauri/src/ui_editor/agent_tools/creation.rs b/apps/ai-game-creator-shell/src-tauri/src/ui_editor/agent_tools/creation.rs index 6b2dacc91..b4095a084 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/ui_editor/agent_tools/creation.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/ui_editor/agent_tools/creation.rs @@ -91,7 +91,13 @@ pub(crate) fn create_ui_design_doc_from_images( Ok(asset) => asset, Err(error) => { let _ = fs::remove_file(&absolute_path); - return Err(error); + // 文档没登记成功时,本次顺带登记的设计图也不该留在 manifest 里。 + return match drop_manifest_assets(root, &[], ®istered_image_ids) { + Ok(()) => Err(error), + Err(rollback_error) => Err(format!( + "UI 设计文档登记失败:{error};reconciliation-required: 回滚未完成:{rollback_error}" + )), + }; } }; if let Err(error) = @@ -279,14 +285,23 @@ fn rollback_created_document( registered_image_ids: &[String], absolute_path: &Path, ) -> Result<(), String> { - let mut manifest = read_existing_manifest_for_project(root)?; - manifest - .assets - .retain(|entry| entry.id != asset_id && !registered_image_ids.contains(&entry.id)); - write_manifest(&root.join(".agent/manifest.json"), &manifest)?; + drop_manifest_assets(root, &[asset_id], registered_image_ids)?; fs::remove_file(absolute_path).map_err(|error| format!("删除未完成 UI 设计资源失败:{error}")) } +/// 把本次新建或新登记、但已判定失败的资源条目从 manifest 里摘掉。 +fn drop_manifest_assets( + root: &Path, + asset_ids: &[&str], + registered_image_ids: &[String], +) -> Result<(), String> { + let mut manifest = read_existing_manifest_for_project(root)?; + manifest.assets.retain(|entry| { + !asset_ids.contains(&entry.id.as_str()) && !registered_image_ids.contains(&entry.id) + }); + write_manifest(&root.join(".agent/manifest.json"), &manifest) +} + /// UI 设计文档的确定性命名:从已登记文档数 + 1 起找第一个既未被占用、 /// 也未登记进 manifest 的 `ui/UI 设计 N.json`,不覆盖任何既有文件。 pub(crate) fn next_ui_design_path(