ue-mcp 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -25,6 +25,6 @@
25
25
  "feedback": 1,
26
26
  "statetree": 35
27
27
  },
28
- "generatedAt": "2026-05-14T17:51:34.382Z",
29
- "version": "1.0.2"
28
+ "generatedAt": "2026-05-14T18:53:24.811Z",
29
+ "version": "1.0.3"
30
30
  }
@@ -74,7 +74,7 @@ export const assetTool = categoryTool("asset", "Asset management: list, search,
74
74
  read: bp("Read asset via reflection. Params: assetPath", "read_asset", (p) => ({ path: p.assetPath })),
75
75
  read_properties: bp("Read asset properties with values. Params: assetPath, propertyName?, includeValues?", "read_asset_properties"),
76
76
  duplicate: bp("Duplicate asset. Params: sourcePath, destinationPath", "duplicate_asset"),
77
- rename: bp("Rename asset. Params: assetPath, newName. World Partition levels are detected and their __ExternalActors__/__ExternalObjects__ packages are migrated atomically alongside the .umap (#409). For batches of 3+ scene-referenced non-world assets use bulk_rename instead - each single rename forces a full redirector-fixup pass and can crash the editor.", "rename_asset"),
77
+ rename: bp("Rename asset. Params: assetPath, newName (or sourcePath, destinationPath), force?. World Partition levels are detected and their __ExternalActors__/__ExternalObjects__ packages migrate atomically alongside the .umap, source-side redirectors get fixed up, and the active editor world is swapped to blank if it matches the source (#409). Refuses if any package is dirty - save first. If a prior rename left externals orphaned at the old path, re-running reconciles them. Rollback descriptor is emitted even on partial failure so the inverse rename can recover. `force=true` lets the call merge into a destination with pre-existing externals (used by rollback). For batches of 3+ scene-referenced non-world assets use bulk_rename instead.", "rename_asset"),
78
78
  bulk_rename: bp("Batched rename using IAssetTools::RenameAssets - single transaction with one redirector-fixup pass (matches Content Browser drag). Use this over looped rename for scene-referenced assets. World assets are rejected (status=rejected_world); use rename_asset which handles WP externals atomically (#409). Params: renames[] where each entry is {sourcePath, destinationPath} OR {assetPath, newName}.", "bulk_rename_assets", (p) => ({ renames: p.renames })),
79
79
  move: bp("Move asset. Params: sourcePath, destinationPath", "move_asset"),
80
80
  delete: bp("Delete asset. On failure returns reason (open_in_editor / has_referencers / unknown) plus referencer list. Pass force=true to auto-close any open asset editors before deleting (#278). Params: assetPath, force?", "delete_asset"),
@@ -1 +1 @@
1
- {"version":3,"file":"asset.js","sourceRoot":"","sources":["../../src/tools/asset.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"asset.js","sourceRoot":"","sources":["../../src/tools/asset.ts"],"names":[],"mappings":"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"}
@@ -148,7 +148,7 @@ tasks:
148
148
  asset.rename:
149
149
  class_path: ue-mcp.bridge
150
150
  group: asset
151
- description: "Rename asset. Params: assetPath, newName. World Partition levels are detected and their __ExternalActors__/__ExternalObjects__ packages are migrated atomically alongside the .umap (#409). For batches of 3+ scene-referenced non-world assets use bulk_rename instead - each single rename forces a full redirector-fixup pass and can crash the editor."
151
+ description: "Rename asset. Params: assetPath, newName (or sourcePath, destinationPath), force?. World Partition levels are detected and their __ExternalActors__/__ExternalObjects__ packages migrate atomically alongside the .umap, source-side redirectors get fixed up, and the active editor world is swapped to blank if it matches the source (#409). Refuses if any package is dirty - save first. If a prior rename left externals orphaned at the old path, re-running reconciles them. Rollback descriptor is emitted even on partial failure so the inverse rename can recover. `force=true` lets the call merge into a destination with pre-existing externals (used by rollback). For batches of 3+ scene-referenced non-world assets use bulk_rename instead."
152
152
  options:
153
153
  method: rename_asset
154
154
  asset.bulk_rename:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ue-mcp",
3
- "version": "1.0.2",
3
+ "version": "1.0.3",
4
4
  "description": "Unreal Engine MCP server - 20 tools, 502+ actions for AI-driven editor control",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -54,6 +54,9 @@
54
54
  // Reimport
55
55
  #include "EditorReimportHandler.h"
56
56
 
57
+ // World rename redirector cleanup (UEditorLoadingAndSavingUtils ships in FileHelpers.h, already included)
58
+ #include "UObject/ObjectRedirector.h"
59
+
57
60
  // Collision / BodySetup
58
61
  #include "PhysicsEngine/BodySetup.h"
59
62
  #include "AI/Navigation/NavCollisionBase.h"
@@ -716,10 +719,26 @@ TSharedPtr<FJsonValue> FAssetHandlers::DuplicateAsset(const TSharedPtr<FJsonObje
716
719
  // UEditorAssetLibrary::RenameAsset on a World Partition .umap renames only
717
720
  // the umap and silently orphans every actor in /Game/__ExternalActors__/<Level>/.
718
721
  // Detect Worlds and route through IAssetTools::RenameAssets with the world +
719
- // all external packages in a single atomic batch. Refuse with a clear error
720
- // when the destination already has external content or any external fails
721
- // to load (better to error out before any change than to half-orphan).
722
- static TSharedPtr<FJsonValue> RenameWorldWithExternals(const FString& SourceAssetPath, const FString& DestAssetPath)
722
+ // all external packages in a single atomic batch.
723
+ //
724
+ // Guards (in order):
725
+ // 1. Cross-mount renames refused (external-package GUIDs are mount-relative).
726
+ // 2. Active editor world: if it matches the source and isn't dirty, auto-swap
727
+ // to a blank map (RenameAssets on the loaded world otherwise leaves the
728
+ // editor pointing at a stale UWorld*); if dirty, refuse with a clear ask.
729
+ // 3. Dirty world or external packages: refuse - caller must save first.
730
+ // 4. Destination external folders already populated: refuse unless bForceMerge
731
+ // (rollback path uses force to step over orphans left by the forward call).
732
+ // 5. Pre-load every external package and abort before any change if any fail
733
+ // to load (no partial state at the engine level).
734
+ //
735
+ // On success the source-side redirectors are fixed up + deleted so the project
736
+ // doesn't accumulate 200+ stub redirectors per rename.
737
+ //
738
+ // Rollback is emitted unconditionally on a path that reached the mutation - if
739
+ // AssetTools.RenameAssets returns false mid-batch, the rollback descriptor
740
+ // still ships so the caller (or flow runner) can attempt recovery.
741
+ static TSharedPtr<FJsonValue> RenameWorldWithExternals(const FString& SourceAssetPath, const FString& DestAssetPath, bool bForceMerge)
723
742
  {
724
743
  FString SrcMount, SrcRel, SrcPkg, SrcName;
725
744
  FString DstMount, DstRel, DstPkg, DstName;
@@ -735,6 +754,25 @@ static TSharedPtr<FJsonValue> RenameWorldWithExternals(const FString& SourceAsse
735
754
  *SrcMount, *DstMount));
736
755
  }
737
756
 
757
+ // Guard 2: active editor world. RenameAssets against the live UWorld leaves
758
+ // the editor pointing at a stale pointer; the safe pattern is to swap to a
759
+ // blank map first. We only do that automatically when the world isn't dirty
760
+ // so we never silently lose unsaved actor edits.
761
+ if (UWorld* EditorWorld = GetEditorWorld())
762
+ {
763
+ UPackage* EditorWorldPkg = EditorWorld->GetOutermost();
764
+ if (EditorWorldPkg && EditorWorldPkg->GetName() == SrcPkg)
765
+ {
766
+ if (EditorWorldPkg->IsDirty())
767
+ {
768
+ return MCPError(FString::Printf(
769
+ TEXT("Refusing to rename World currently open in editor with unsaved changes: %s. Save the level (asset.save) or discard, then re-run."),
770
+ *SourceAssetPath));
771
+ }
772
+ UEditorLoadingAndSavingUtils::NewBlankMap(/*bSaveExistingMap*/ false);
773
+ }
774
+ }
775
+
738
776
  FAssetRegistryModule& ARM = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(TEXT("AssetRegistry"));
739
777
  IAssetRegistry& Registry = ARM.Get();
740
778
  FAssetToolsModule& ATM = FModuleManager::LoadModuleChecked<FAssetToolsModule>(TEXT("AssetTools"));
@@ -745,21 +783,26 @@ static TSharedPtr<FJsonValue> RenameWorldWithExternals(const FString& SourceAsse
745
783
  const FString ExtActorsDst = DstMount + TEXT("__ExternalActors__/") + DstRel;
746
784
  const FString ExtObjectsDst = DstMount + TEXT("__ExternalObjects__/") + DstRel;
747
785
 
786
+ // Skip redirector stubs left by prior renames - we don't want to drag them along.
748
787
  auto Gather = [&](const FString& Folder, TArray<FAssetData>& Out)
749
788
  {
750
789
  FARFilter F;
751
790
  F.PackagePaths.Add(FName(*Folder));
752
791
  F.bRecursivePaths = true;
753
792
  Registry.GetAssets(F, Out);
793
+ Out.RemoveAll([](const FAssetData& D)
794
+ {
795
+ return D.AssetClassPath.GetAssetName() == FName(TEXT("ObjectRedirector"));
796
+ });
754
797
  };
755
798
 
756
799
  TArray<FAssetData> DstActorsExisting, DstObjectsExisting;
757
800
  Gather(ExtActorsDst, DstActorsExisting);
758
801
  Gather(ExtObjectsDst, DstObjectsExisting);
759
- if (DstActorsExisting.Num() + DstObjectsExisting.Num() > 0)
802
+ if (!bForceMerge && DstActorsExisting.Num() + DstObjectsExisting.Num() > 0)
760
803
  {
761
804
  return MCPError(FString::Printf(
762
- TEXT("Refusing to rename World: destination external folders already contain %d asset(s) at %s or %s. Pick a clean destination."),
805
+ TEXT("Refusing to rename World: destination external folders already contain %d asset(s) at %s or %s. Pick a clean destination, or pass force=true to merge (used by rollback)."),
763
806
  DstActorsExisting.Num() + DstObjectsExisting.Num(), *ExtActorsDst, *ExtObjectsDst));
764
807
  }
765
808
 
@@ -773,6 +816,32 @@ static TSharedPtr<FJsonValue> RenameWorldWithExternals(const FString& SourceAsse
773
816
  return MCPError(FString::Printf(TEXT("Failed to load World asset: %s. No changes made."), *SourceAssetPath));
774
817
  }
775
818
 
819
+ // Guard 3: dirty world or externals. Silent loss vector if we let it through.
820
+ TArray<FString> DirtyPackages;
821
+ auto CheckDirty = [&](const FString& PkgName)
822
+ {
823
+ if (UPackage* P = FindPackage(nullptr, *PkgName))
824
+ {
825
+ if (P->IsDirty()) DirtyPackages.Add(PkgName);
826
+ }
827
+ };
828
+ CheckDirty(SrcPkg);
829
+ for (const FAssetData& D : SrcActors) CheckDirty(D.PackageName.ToString());
830
+ for (const FAssetData& D : SrcObjects) CheckDirty(D.PackageName.ToString());
831
+ if (DirtyPackages.Num() > 0)
832
+ {
833
+ FString Examples;
834
+ const int32 Show = FMath::Min(DirtyPackages.Num(), 5);
835
+ for (int32 i = 0; i < Show; ++i)
836
+ {
837
+ if (i) Examples += TEXT(", ");
838
+ Examples += DirtyPackages[i];
839
+ }
840
+ return MCPError(FString::Printf(
841
+ TEXT("Refusing to rename World: %d package(s) have unsaved changes. Save with asset.save (or editor.save_dirty) first. Examples: %s"),
842
+ DirtyPackages.Num(), *Examples));
843
+ }
844
+
776
845
  TArray<FAssetRenameData> Batch;
777
846
  Batch.Reserve(1 + SrcActors.Num() + SrcObjects.Num());
778
847
 
@@ -825,30 +894,200 @@ static TSharedPtr<FJsonValue> RenameWorldWithExternals(const FString& SourceAsse
825
894
  FailedLoad.Num(), *Examples));
826
895
  }
827
896
 
828
- const bool bOk = AssetTools.RenameAssets(Batch);
829
-
897
+ // Build response + rollback handle BEFORE the mutation. We've cached every
898
+ // source path that's about to move, so the inverse is deterministic even if
899
+ // the batch half-completes. Rollback passes force=true to step over orphans
900
+ // left at the original destination by a partial forward run.
830
901
  auto R = MCPSuccess();
831
902
  R->SetStringField(TEXT("sourcePath"), SourceAssetPath);
832
903
  R->SetStringField(TEXT("destinationPath"), DestAssetPath);
833
904
  R->SetStringField(TEXT("kind"), TEXT("world"));
834
- R->SetBoolField(TEXT("success"), bOk);
835
905
  R->SetNumberField(TEXT("externalActors"), ActorAdded);
836
906
  R->SetNumberField(TEXT("externalObjects"), ObjectAdded);
837
907
  R->SetNumberField(TEXT("totalRenamed"), Batch.Num());
838
908
 
909
+ TSharedPtr<FJsonObject> RollbackPayload = MakeShared<FJsonObject>();
910
+ RollbackPayload->SetStringField(TEXT("sourcePath"), DestAssetPath);
911
+ RollbackPayload->SetStringField(TEXT("destinationPath"), SourceAssetPath);
912
+ RollbackPayload->SetBoolField(TEXT("force"), true);
913
+ MCPSetRollback(R, TEXT("rename_asset"), RollbackPayload);
914
+
915
+ const bool bOk = AssetTools.RenameAssets(Batch);
916
+ R->SetBoolField(TEXT("success"), bOk);
917
+
839
918
  if (!bOk)
840
919
  {
841
- return MCPError(FString::Printf(
842
- TEXT("IAssetTools::RenameAssets failed on World+externals batch (%d items: 1 world, %d actors, %d objects). Editor log has per-item detail. State may be partial - recover by renaming the .umap back and re-running."),
920
+ // Build the error object by hand so the rollback descriptor survives -
921
+ // MCPError() would drop it. The caller (flow runner) can invoke the
922
+ // inverse rename to attempt recovery from a partial batch.
923
+ TSharedPtr<FJsonObject> Err = MakeShared<FJsonObject>();
924
+ Err->SetBoolField(TEXT("success"), false);
925
+ Err->SetBoolField(TEXT("partial"), true);
926
+ Err->SetStringField(TEXT("error"), FString::Printf(
927
+ TEXT("IAssetTools::RenameAssets failed on World+externals batch (%d items: 1 world, %d actors, %d objects). Rollback descriptor is attached - invoke the inverse rename to recover."),
843
928
  Batch.Num(), ActorAdded, ObjectAdded));
929
+ MCPSetRollback(Err, TEXT("rename_asset"), RollbackPayload);
930
+ return MakeShared<FJsonValueObject>(Err);
931
+ }
932
+
933
+ // Source-side redirector cleanup: AssetTools.RenameAssets leaves a redirector
934
+ // stub at every old path. With WP that's potentially hundreds of stubs - fix
935
+ // up referencers and delete them so the project doesn't accumulate cruft.
936
+ TArray<FAssetData> SourceRedirectors;
937
+ auto GatherRedirectorsAt = [&](const FString& Folder)
938
+ {
939
+ FARFilter F;
940
+ F.PackagePaths.Add(FName(*Folder));
941
+ F.bRecursivePaths = true;
942
+ F.ClassPaths.Add(FTopLevelAssetPath(TEXT("/Script/CoreUObject"), TEXT("ObjectRedirector")));
943
+ Registry.GetAssets(F, SourceRedirectors);
944
+ };
945
+ GatherRedirectorsAt(FPaths::GetPath(SrcPkg));
946
+ GatherRedirectorsAt(ExtActorsSrc);
947
+ GatherRedirectorsAt(ExtObjectsSrc);
948
+
949
+ TArray<UObjectRedirector*> RedirectorObjects;
950
+ RedirectorObjects.Reserve(SourceRedirectors.Num());
951
+ for (const FAssetData& D : SourceRedirectors)
952
+ {
953
+ if (UObjectRedirector* Red = Cast<UObjectRedirector>(D.GetAsset()))
954
+ {
955
+ RedirectorObjects.Add(Red);
956
+ }
957
+ }
958
+ int32 RedirectorsCleaned = RedirectorObjects.Num();
959
+ if (RedirectorsCleaned > 0)
960
+ {
961
+ AssetTools.FixupReferencers(RedirectorObjects, /*bCheckoutDialogPrompt*/ false);
844
962
  }
963
+ R->SetNumberField(TEXT("redirectorsCleaned"), RedirectorsCleaned);
845
964
 
846
965
  MCPSetUpdated(R);
847
- TSharedPtr<FJsonObject> Payload = MakeShared<FJsonObject>();
848
- Payload->SetStringField(TEXT("sourcePath"), DestAssetPath);
849
- Payload->SetStringField(TEXT("destinationPath"), SourceAssetPath);
850
- MCPSetRollback(R, TEXT("rename_asset"), Payload);
966
+ return MCPResult(R);
967
+ }
968
+
969
+ // ─── #409: orphan recovery ───────────────────────────────────────────
970
+ // Fast-path called when the source .umap is gone but the destination .umap
971
+ // exists. If externals are still at the source path (a previous rename
972
+ // orphaned them), migrate them into place. If they're already at the
973
+ // destination, return Existed.
974
+ static TSharedPtr<FJsonValue> ReconcileOrphanExternals(const FString& SourceAssetPath, const FString& DestAssetPath)
975
+ {
976
+ FString SrcMount, SrcRel, SrcPkg, SrcName;
977
+ FString DstMount, DstRel, DstPkg, DstName;
978
+ if (!SplitMountAndRel(SourceAssetPath, SrcMount, SrcRel, SrcPkg, SrcName) ||
979
+ !SplitMountAndRel(DestAssetPath, DstMount, DstRel, DstPkg, DstName) ||
980
+ SrcMount != DstMount)
981
+ {
982
+ auto Noop = MCPSuccess();
983
+ MCPSetExisted(Noop);
984
+ Noop->SetStringField(TEXT("sourcePath"), SourceAssetPath);
985
+ Noop->SetStringField(TEXT("destinationPath"), DestAssetPath);
986
+ return MCPResult(Noop);
987
+ }
988
+
989
+ FAssetRegistryModule& ARM = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(TEXT("AssetRegistry"));
990
+ IAssetRegistry& Registry = ARM.Get();
851
991
 
992
+ const FString ExtActorsSrc = SrcMount + TEXT("__ExternalActors__/") + SrcRel;
993
+ const FString ExtObjectsSrc = SrcMount + TEXT("__ExternalObjects__/") + SrcRel;
994
+ const FString ExtActorsDst = DstMount + TEXT("__ExternalActors__/") + DstRel;
995
+ const FString ExtObjectsDst = DstMount + TEXT("__ExternalObjects__/") + DstRel;
996
+
997
+ auto Gather = [&](const FString& Folder, TArray<FAssetData>& Out)
998
+ {
999
+ FARFilter F;
1000
+ F.PackagePaths.Add(FName(*Folder));
1001
+ F.bRecursivePaths = true;
1002
+ Registry.GetAssets(F, Out);
1003
+ Out.RemoveAll([](const FAssetData& D)
1004
+ {
1005
+ return D.AssetClassPath.GetAssetName() == FName(TEXT("ObjectRedirector"));
1006
+ });
1007
+ };
1008
+
1009
+ TArray<FAssetData> Orphans;
1010
+ Gather(ExtActorsSrc, Orphans);
1011
+ const int32 OrphanActors = Orphans.Num();
1012
+ TArray<FAssetData> OrphanObjects;
1013
+ Gather(ExtObjectsSrc, OrphanObjects);
1014
+ Orphans.Append(OrphanObjects);
1015
+
1016
+ if (Orphans.Num() == 0)
1017
+ {
1018
+ // True idempotent replay - everything already at destination.
1019
+ auto Noop = MCPSuccess();
1020
+ MCPSetExisted(Noop);
1021
+ Noop->SetStringField(TEXT("sourcePath"), SourceAssetPath);
1022
+ Noop->SetStringField(TEXT("destinationPath"), DestAssetPath);
1023
+ return MCPResult(Noop);
1024
+ }
1025
+
1026
+ FAssetToolsModule& ATM = FModuleManager::LoadModuleChecked<FAssetToolsModule>(TEXT("AssetTools"));
1027
+ IAssetTools& AssetTools = ATM.Get();
1028
+
1029
+ TArray<FAssetRenameData> Batch;
1030
+ Batch.Reserve(Orphans.Num());
1031
+ TArray<FString> FailedLoad;
1032
+
1033
+ auto Remap = [&](const FString& PkgName, FString& OutPath, FString& OutName) -> bool
1034
+ {
1035
+ auto Try = [&](const FString& Src, const FString& Dst) -> bool
1036
+ {
1037
+ if (!PkgName.StartsWith(Src + TEXT("/"))) return false;
1038
+ const FString Suffix = PkgName.RightChop(Src.Len() + 1);
1039
+ const FString Sub = FPaths::GetPath(Suffix);
1040
+ OutPath = Sub.IsEmpty() ? Dst : (Dst + TEXT("/") + Sub);
1041
+ OutName = FPaths::GetBaseFilename(Suffix);
1042
+ return true;
1043
+ };
1044
+ return Try(ExtActorsSrc, ExtActorsDst) || Try(ExtObjectsSrc, ExtObjectsDst);
1045
+ };
1046
+
1047
+ for (const FAssetData& Data : Orphans)
1048
+ {
1049
+ const FString PkgName = Data.PackageName.ToString();
1050
+ FString NewPkgPath, NewName;
1051
+ if (!Remap(PkgName, NewPkgPath, NewName))
1052
+ {
1053
+ FailedLoad.Add(PkgName + TEXT(" (path mismatch)"));
1054
+ continue;
1055
+ }
1056
+ UObject* Obj = Data.GetAsset();
1057
+ if (!Obj)
1058
+ {
1059
+ FailedLoad.Add(PkgName);
1060
+ continue;
1061
+ }
1062
+ Batch.Emplace(TWeakObjectPtr<UObject>(Obj), NewPkgPath, NewName);
1063
+ }
1064
+
1065
+ if (FailedLoad.Num() > 0)
1066
+ {
1067
+ return MCPError(FString::Printf(
1068
+ TEXT("Found %d orphan external(s) at %s* but failed to load %d. Aborting reconcile."),
1069
+ Orphans.Num(), *(SrcMount + TEXT("__ExternalActors__/") + SrcRel), FailedLoad.Num()));
1070
+ }
1071
+
1072
+ const bool bOk = AssetTools.RenameAssets(Batch);
1073
+
1074
+ auto R = MCPSuccess();
1075
+ R->SetStringField(TEXT("sourcePath"), SourceAssetPath);
1076
+ R->SetStringField(TEXT("destinationPath"), DestAssetPath);
1077
+ R->SetStringField(TEXT("kind"), TEXT("orphan_reconcile"));
1078
+ R->SetBoolField(TEXT("success"), bOk);
1079
+ R->SetNumberField(TEXT("externalActors"), OrphanActors);
1080
+ R->SetNumberField(TEXT("externalObjects"), Orphans.Num() - OrphanActors);
1081
+ R->SetNumberField(TEXT("totalRenamed"), Batch.Num());
1082
+
1083
+ if (!bOk)
1084
+ {
1085
+ return MCPError(FString::Printf(
1086
+ TEXT("Orphan reconcile failed: RenameAssets returned false on %d external(s). State may be partial."),
1087
+ Batch.Num()));
1088
+ }
1089
+
1090
+ MCPSetUpdated(R);
852
1091
  return MCPResult(R);
853
1092
  }
854
1093
 
@@ -892,10 +1131,17 @@ TSharedPtr<FJsonValue> FAssetHandlers::RenameAsset(const TSharedPtr<FJsonObject>
892
1131
  }
893
1132
 
894
1133
  // Idempotency: if source is absent but destination exists, prior run succeeded.
1134
+ // For Worlds, also reconcile any externals stranded at the source path - the
1135
+ // .umap moving without its externals is exactly the #409 failure mode, and
1136
+ // re-running rename_asset should fix it instead of silently no-opping.
895
1137
  if (!UEditorAssetLibrary::DoesAssetExist(SourcePath))
896
1138
  {
897
1139
  if (UEditorAssetLibrary::DoesAssetExist(DestPath))
898
1140
  {
1141
+ if (IsWorldAsset(DestPath))
1142
+ {
1143
+ return ReconcileOrphanExternals(SourcePath, DestPath);
1144
+ }
899
1145
  auto Noop = MCPSuccess();
900
1146
  MCPSetExisted(Noop);
901
1147
  Noop->SetStringField(TEXT("sourcePath"), SourcePath);
@@ -907,10 +1153,12 @@ TSharedPtr<FJsonValue> FAssetHandlers::RenameAsset(const TSharedPtr<FJsonObject>
907
1153
 
908
1154
  // #409: Worlds carry external actor/object packages in /Game/__ExternalActors__/<LevelPath>/.
909
1155
  // The plain UEditorAssetLibrary::RenameAsset path silently orphans those - route through
910
- // a world-aware batch rename instead.
1156
+ // a world-aware batch rename instead. `force` lets a rollback call step over
1157
+ // orphans at the destination left by a partial forward rename.
911
1158
  if (IsWorldAsset(SourcePath))
912
1159
  {
913
- return RenameWorldWithExternals(SourcePath, DestPath);
1160
+ const bool bForce = OptionalBool(Params, TEXT("force"), false);
1161
+ return RenameWorldWithExternals(SourcePath, DestPath, bForce);
914
1162
  }
915
1163
 
916
1164
  bool bOk = UEditorAssetLibrary::RenameAsset(SourcePath, DestPath);