ue-mcp 1.0.1 → 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.
package/dist/tool-counts.json
CHANGED
package/dist/tools/asset.js
CHANGED
|
@@ -74,8 +74,8 @@ 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
|
|
78
|
-
bulk_rename: bp("Batched rename using IAssetTools::RenameAssets
|
|
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
|
+
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"),
|
|
81
81
|
delete_batch: bp("Batch-delete assets. Per-path status (deleted/absent/failed) plus reason+referencers on failed entries (#278). Params: assetPaths[], force?", "delete_asset_batch"),
|
package/dist/tools/asset.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset.js","sourceRoot":"","sources":["../../src/tools/asset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,EAAE,EAAgB,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,CAAC,MAAM,SAAS,GAAY,YAAY,CAC5C,OAAO,EACP,iFAAiF,EACjF;IACE,IAAI,EAAE;QACJ,WAAW,EAAE,uEAAuE;QACpF,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;YACxB,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAmB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,UAAW,CAAC;YACzG,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC;YACxC,MAAM,UAAU,GAAI,CAAC,CAAC,UAAiC,EAAE,WAAW,EAAE,CAAC;YACvE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAC;YACxE,MAAM,MAAM,GAA6E,EAAE,CAAC;YAC5F,SAAS,IAAI,CAAC,CAAS;gBACrB,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;oBAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;oBACtC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;wBAAC,IAAI,SAAS;4BAAE,IAAI,CAAC,IAAI,CAAC,CAAC;oBAAC,CAAC;yBAClD,CAAC;wBACJ,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;wBAC5D,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,MAAM;4BAAE,SAAS;wBACjD,IAAI,UAAU,IAAI,GAAG,KAAK,UAAU;4BAAE,SAAS;wBAC/C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;oBAChM,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,MAAM,MAAM,GAA4B,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;YACpJ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;gBAC9C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,MAAM,CAAC,UAAU,GAAG,sBAAsB,CAAC,CAAC,SAAS,IAAI,QAAQ,iEAAiE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBAClL,MAAM,CAAC,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;gBAChG,CAAC;YACH,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;KACF;IACD,MAAM,EAAE;QACN,WAAW,EAAE,+EAA+E;QAC5F,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;YACxB,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC;YAC9C,oFAAoF;YACpF,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9C,MAAM,UAAU,GAAI,CAAC,CAAC,UAAqB,IAAI,EAAE,CAAC;gBAClD,MAAM,UAAU,GAAmC,EAAE,CAAC;gBACtD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAA4B,CAAC;oBAC5G,IAAI,GAAG,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC9C,UAAU,CAAC,IAAI,CAAC,GAAI,GAAG,CAAC,OAA0C,CAAC,CAAC;oBACtE,CAAC;oBACD,IAAI,UAAU,CAAC,MAAM,IAAI,UAAU;wBAAE,MAAM;gBAC7C,CAAC;gBACD,OAAO;oBACL,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;oBACpB,WAAW,EAAE,KAAK;oBAClB,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC;oBACpD,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;oBACxC,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YACD,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;QAChD,CAAC;KACF;IACD,IAAI,EAAY,EAAE,CAAC,8CAA8C,EAAE,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAChH,eAAe,EAAE,EAAE,CAAC,qFAAqF,EAAE,uBAAuB,CAAC;IACnI,SAAS,EAAO,EAAE,CAAC,sDAAsD,EAAE,iBAAiB,CAAC;IAC7F,MAAM,EAAU,EAAE,CAAC,gMAAgM,EAAE,cAAc,CAAC;IACpO,WAAW,EAAK,EAAE,CAAC,0RAA0R,EAAE,oBAAoB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACrW,IAAI,EAAY,EAAE,CAAC,iDAAiD,EAAE,YAAY,CAAC;IACnF,MAAM,EAAU,EAAE,CAAC,mNAAmN,EAAE,cAAc,CAAC;IACvP,YAAY,EAAI,EAAE,CAAC,6IAA6I,EAAE,oBAAoB,CAAC;IACvL,iBAAiB,EAAE,EAAE,CAAC,0JAA0J,EAAE,mBAAmB,CAAC;IACtM,IAAI,EAAY,EAAE,CAAC,mCAAmC,EAAE,YAAY,CAAC;IACrE,iBAAiB,EAAK,EAAE,CAAC,kFAAkF,EAAE,mBAAmB,CAAC;IACjI,cAAc,EAAQ,EAAE,WAAW,EAAE,4EAA4E,EAAE,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;YAC5J,MAAM,KAAK,GAAG,CAAC,CAAC,UAAkC,CAAC;YACnD,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;YAC5D,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;QACpC,CAAC,EAAC;IACF,kBAAkB,EAAI,EAAE,CAAC,qIAAqI,EAAE,oBAAoB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,aAAa,EAAE,eAAe,EAAE,CAAC,CAAC,eAAe,EAAE,cAAc,EAAE,CAAC,CAAC,cAAc,EAAE,mBAAmB,EAAE,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC7Z,oBAAoB,EAAE,EAAE,CAAC,wHAAwH,EAAE,sBAAsB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,eAAe,EAAE,CAAC,CAAC,eAAe,EAAE,cAAc,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;IACpW,gBAAgB,EAAM,EAAE,CAAC,2EAA2E,EAAE,kBAAkB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;IAC7O,cAAc,EAAQ,EAAE,CAAC,qDAAqD,EAAE,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACvL,QAAQ,EAAc,EAAE,CAAC,+DAA+D,EAAE,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtK,cAAc,EAAQ,EAAE,CAAC,oDAAoD,EAAE,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IACxJ,gBAAgB,EAAM,EAAE,CAAC,yDAAyD,EAAE,kBAAkB,CAAC;IACvG,kBAAkB,EAAI,EAAE,CAAC,yEAAyE,EAAE,oBAAoB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;IACzM,aAAa,EAAS,EAAE,CAAC,+CAA+C,EAAE,eAAe,CAAC;IAC1F,gBAAgB,EAAM,EAAE,CAAC,wCAAwC,EAAE,kBAAkB,CAAC;IACtF,oBAAoB,EAAE,EAAE,CAAC,iKAAiK,EAAE,sBAAsB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1N,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,GAAG,CAAC,CAAC,CAAC,mBAAmB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9F,GAAG,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvE,CAAC,CAAC;IACH,UAAU,EAAY,EAAE,CAAC,0IAA0I,EAAE,YAAY,CAAC;IAClL,aAAa,EAAS,EAAE,CAAC,sDAAsD,EAAE,eAAe,CAAC;IACjG,YAAY,EAAU,EAAE,CAAC,2CAA2C,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAC1H,cAAc,EAAQ,EAAE,CAAC,4DAA4D,EAAE,gBAAgB,CAAC;IACxG,YAAY,EAAU,EAAE,CAAC,gNAAgN,EAAE,oBAAoB,CAAC;IAChQ,YAAY,EAAU,EAAE,CAAC,4LAA4L,EAAE,oBAAoB,CAAC;IAC5O,MAAM,EAAgB,EAAE,CAAC,oGAAoG,EAAE,cAAc,CAAC;IAC9I,UAAU,EAAY,EAAE,CAAC,mGAAmG,EAAE,mBAAmB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IACrO,WAAW,EAAW,EAAE,CAAC,yDAAyD,EAAE,oBAAoB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAC9I,eAAe,EAAO,EAAE,CAAC,wHAAwH,EAAE,uBAAuB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1O,kCAAkC;IAClC,qBAAqB,EAAE,EAAE,CAAC,4MAA4M,EAAE,uBAAuB,CAAC;IAChQ,iBAAiB,EAAK,EAAE,CAAC,4OAA4O,EAAE,mBAAmB,CAAC;IAC3R,eAAe,EAAO,EAAE,CAAC,8HAA8H,EAAE,iBAAiB,CAAC;IAC3K,mBAAmB,EAAG,EAAE,CAAC,yOAAyO,EAAE,qBAAqB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACzU,kBAAkB,EAAI,EAAE,CAAC,sIAAsI,EAAE,oBAAoB,CAAC;IACtL,WAAW,EAAW,EAAE,CAAC,wHAAwH,EAAE,aAAa,CAAC;IACjK,aAAa,EAAS,EAAE,CAAC,iJAAiJ,EAAE,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACvO,YAAY,EAAU,EAAE,CAAC,oGAAoG,EAAE,cAAc,CAAC;CAC/I,EACD,SAAS,EACT;IACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;IACvD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpE,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oEAAoE,CAAC;IAChH,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACjC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACzE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;IACzF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IAC5E,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IAC1E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IACzE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;IAC3F,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iFAAiF,CAAC;IACjI,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC/E,mBAAmB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC3C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtE,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;IAC5F,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC1C,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4JAA4J,CAAC;IACjN,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kFAAkF,CAAC;IAC5H,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC5B,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACnC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mFAAmF,CAAC;IACxI,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0GAA0G,CAAC;IACvK,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;IACzD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;IACjF,gBAAgB,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IACtE,gBAAgB,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IACzE,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAChE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4DAA4D,CAAC;IACxG,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wEAAwE,CAAC;IACrH,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mFAAmF,CAAC;IAC9H,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;IAC3G,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IACtF,OAAO;IACP,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACtB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC/B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAChC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;KACzB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;IAClF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0EAA0E,CAAC;IAChH,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;IAC1F,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0EAA0E,CAAC;IACtH,kBAAkB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;IAClG,iBAAiB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;IACpG,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iFAAiF,CAAC;CAC1H,CACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"asset.js","sourceRoot":"","sources":["../../src/tools/asset.ts"],"names":[],"mappings":"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"}
|
package/dist/ue-mcp.default.yml
CHANGED
|
@@ -148,13 +148,13 @@ tasks:
|
|
|
148
148
|
asset.rename:
|
|
149
149
|
class_path: ue-mcp.bridge
|
|
150
150
|
group: asset
|
|
151
|
-
description: "Rename asset. Params: assetPath, newName
|
|
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:
|
|
155
155
|
class_path: ue-mcp.bridge
|
|
156
156
|
group: asset
|
|
157
|
-
description: "Batched rename using IAssetTools::RenameAssets
|
|
157
|
+
description: "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}."
|
|
158
158
|
options:
|
|
159
159
|
method: bulk_rename_assets
|
|
160
160
|
asset.move:
|
package/package.json
CHANGED
|
@@ -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"
|
|
@@ -91,6 +94,58 @@ namespace
|
|
|
91
94
|
TEXT("Refusing to mutate protected mount: %s. Engine, /Script/, /Memory/, /Temp/ are read-only via the bridge."),
|
|
92
95
|
*Path));
|
|
93
96
|
}
|
|
97
|
+
|
|
98
|
+
// Split "/Game/Foo/Bar.Bar" (or "/Game/Foo/Bar") into mount "/Game/" + rel "Foo/Bar".
|
|
99
|
+
// Returns false if the path is malformed or has no mount segment.
|
|
100
|
+
bool SplitMountAndRel(const FString& AssetOrPackagePath, FString& OutMountRoot, FString& OutRelPath, FString& OutPackageName, FString& OutAssetName)
|
|
101
|
+
{
|
|
102
|
+
FString Pkg = AssetOrPackagePath;
|
|
103
|
+
Pkg.TrimStartAndEndInline();
|
|
104
|
+
if (Pkg.IsEmpty() || !Pkg.StartsWith(TEXT("/"))) return false;
|
|
105
|
+
if (Pkg.Contains(TEXT(".")))
|
|
106
|
+
{
|
|
107
|
+
FString Name;
|
|
108
|
+
FString PkgOnly;
|
|
109
|
+
Pkg.Split(TEXT("."), &PkgOnly, &Name, ESearchCase::CaseSensitive, ESearchDir::FromEnd);
|
|
110
|
+
OutAssetName = Name;
|
|
111
|
+
Pkg = PkgOnly;
|
|
112
|
+
}
|
|
113
|
+
else
|
|
114
|
+
{
|
|
115
|
+
OutAssetName = FPaths::GetBaseFilename(Pkg);
|
|
116
|
+
}
|
|
117
|
+
OutPackageName = Pkg;
|
|
118
|
+
int32 SecondSlash = INDEX_NONE;
|
|
119
|
+
if (!Pkg.RightChop(1).FindChar(TEXT('/'), SecondSlash)) return false;
|
|
120
|
+
OutMountRoot = Pkg.Left(SecondSlash + 2); // "/Game/"
|
|
121
|
+
OutRelPath = Pkg.RightChop(SecondSlash + 2); // "Foo/Bar"
|
|
122
|
+
return !OutRelPath.IsEmpty();
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Look up an asset's class via the AssetRegistry without forcing a load.
|
|
126
|
+
// Returns the short class name (e.g., "World") or NAME_None when not found.
|
|
127
|
+
FName GetAssetClassName(const FString& AssetOrPackagePath)
|
|
128
|
+
{
|
|
129
|
+
FAssetRegistryModule& ARM = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(TEXT("AssetRegistry"));
|
|
130
|
+
IAssetRegistry& Reg = ARM.Get();
|
|
131
|
+
FString Mount, Rel, Pkg, Name;
|
|
132
|
+
if (!SplitMountAndRel(AssetOrPackagePath, Mount, Rel, Pkg, Name)) return NAME_None;
|
|
133
|
+
const FString ObjectPath = FString::Printf(TEXT("%s.%s"), *Pkg, *Name);
|
|
134
|
+
FAssetData Data = Reg.GetAssetByObjectPath(FSoftObjectPath(ObjectPath));
|
|
135
|
+
if (!Data.IsValid())
|
|
136
|
+
{
|
|
137
|
+
TArray<FAssetData> Assets;
|
|
138
|
+
Reg.GetAssetsByPackageName(FName(*Pkg), Assets);
|
|
139
|
+
if (Assets.Num() > 0) Data = Assets[0];
|
|
140
|
+
}
|
|
141
|
+
if (!Data.IsValid()) return NAME_None;
|
|
142
|
+
return Data.AssetClassPath.GetAssetName();
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
bool IsWorldAsset(const FString& AssetOrPackagePath)
|
|
146
|
+
{
|
|
147
|
+
return GetAssetClassName(AssetOrPackagePath) == FName(TEXT("World"));
|
|
148
|
+
}
|
|
94
149
|
}
|
|
95
150
|
|
|
96
151
|
void FAssetHandlers::RegisterHandlers(FMCPHandlerRegistry& Registry)
|
|
@@ -660,6 +715,382 @@ TSharedPtr<FJsonValue> FAssetHandlers::DuplicateAsset(const TSharedPtr<FJsonObje
|
|
|
660
715
|
return MCPResult(Result);
|
|
661
716
|
}
|
|
662
717
|
|
|
718
|
+
// ─── #409: WP-aware world rename ────────────────────────────────────
|
|
719
|
+
// UEditorAssetLibrary::RenameAsset on a World Partition .umap renames only
|
|
720
|
+
// the umap and silently orphans every actor in /Game/__ExternalActors__/<Level>/.
|
|
721
|
+
// Detect Worlds and route through IAssetTools::RenameAssets with the world +
|
|
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)
|
|
742
|
+
{
|
|
743
|
+
FString SrcMount, SrcRel, SrcPkg, SrcName;
|
|
744
|
+
FString DstMount, DstRel, DstPkg, DstName;
|
|
745
|
+
if (!SplitMountAndRel(SourceAssetPath, SrcMount, SrcRel, SrcPkg, SrcName))
|
|
746
|
+
return MCPError(FString::Printf(TEXT("Invalid source package path: %s"), *SourceAssetPath));
|
|
747
|
+
if (!SplitMountAndRel(DestAssetPath, DstMount, DstRel, DstPkg, DstName))
|
|
748
|
+
return MCPError(FString::Printf(TEXT("Invalid destination package path: %s"), *DestAssetPath));
|
|
749
|
+
|
|
750
|
+
if (SrcMount != DstMount)
|
|
751
|
+
{
|
|
752
|
+
return MCPError(FString::Printf(
|
|
753
|
+
TEXT("Refusing to rename World across content mounts (%s -> %s). Cross-mount external-actor migration is unsafe via the bridge - move externals manually."),
|
|
754
|
+
*SrcMount, *DstMount));
|
|
755
|
+
}
|
|
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
|
+
|
|
776
|
+
FAssetRegistryModule& ARM = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(TEXT("AssetRegistry"));
|
|
777
|
+
IAssetRegistry& Registry = ARM.Get();
|
|
778
|
+
FAssetToolsModule& ATM = FModuleManager::LoadModuleChecked<FAssetToolsModule>(TEXT("AssetTools"));
|
|
779
|
+
IAssetTools& AssetTools = ATM.Get();
|
|
780
|
+
|
|
781
|
+
const FString ExtActorsSrc = SrcMount + TEXT("__ExternalActors__/") + SrcRel;
|
|
782
|
+
const FString ExtObjectsSrc = SrcMount + TEXT("__ExternalObjects__/") + SrcRel;
|
|
783
|
+
const FString ExtActorsDst = DstMount + TEXT("__ExternalActors__/") + DstRel;
|
|
784
|
+
const FString ExtObjectsDst = DstMount + TEXT("__ExternalObjects__/") + DstRel;
|
|
785
|
+
|
|
786
|
+
// Skip redirector stubs left by prior renames - we don't want to drag them along.
|
|
787
|
+
auto Gather = [&](const FString& Folder, TArray<FAssetData>& Out)
|
|
788
|
+
{
|
|
789
|
+
FARFilter F;
|
|
790
|
+
F.PackagePaths.Add(FName(*Folder));
|
|
791
|
+
F.bRecursivePaths = true;
|
|
792
|
+
Registry.GetAssets(F, Out);
|
|
793
|
+
Out.RemoveAll([](const FAssetData& D)
|
|
794
|
+
{
|
|
795
|
+
return D.AssetClassPath.GetAssetName() == FName(TEXT("ObjectRedirector"));
|
|
796
|
+
});
|
|
797
|
+
};
|
|
798
|
+
|
|
799
|
+
TArray<FAssetData> DstActorsExisting, DstObjectsExisting;
|
|
800
|
+
Gather(ExtActorsDst, DstActorsExisting);
|
|
801
|
+
Gather(ExtObjectsDst, DstObjectsExisting);
|
|
802
|
+
if (!bForceMerge && DstActorsExisting.Num() + DstObjectsExisting.Num() > 0)
|
|
803
|
+
{
|
|
804
|
+
return MCPError(FString::Printf(
|
|
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)."),
|
|
806
|
+
DstActorsExisting.Num() + DstObjectsExisting.Num(), *ExtActorsDst, *ExtObjectsDst));
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
TArray<FAssetData> SrcActors, SrcObjects;
|
|
810
|
+
Gather(ExtActorsSrc, SrcActors);
|
|
811
|
+
Gather(ExtObjectsSrc, SrcObjects);
|
|
812
|
+
|
|
813
|
+
UObject* World = UEditorAssetLibrary::LoadAsset(SourceAssetPath);
|
|
814
|
+
if (!World)
|
|
815
|
+
{
|
|
816
|
+
return MCPError(FString::Printf(TEXT("Failed to load World asset: %s. No changes made."), *SourceAssetPath));
|
|
817
|
+
}
|
|
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
|
+
|
|
845
|
+
TArray<FAssetRenameData> Batch;
|
|
846
|
+
Batch.Reserve(1 + SrcActors.Num() + SrcObjects.Num());
|
|
847
|
+
|
|
848
|
+
const FString NewWorldPkgPath = FPaths::GetPath(DstPkg);
|
|
849
|
+
Batch.Emplace(TWeakObjectPtr<UObject>(World), NewWorldPkgPath, DstName);
|
|
850
|
+
|
|
851
|
+
int32 ActorAdded = 0;
|
|
852
|
+
int32 ObjectAdded = 0;
|
|
853
|
+
TArray<FString> FailedLoad;
|
|
854
|
+
|
|
855
|
+
auto AddExternals = [&](const TArray<FAssetData>& Assets, const FString& SrcFolder, const FString& DstFolder, int32& AddedCounter)
|
|
856
|
+
{
|
|
857
|
+
for (const FAssetData& Data : Assets)
|
|
858
|
+
{
|
|
859
|
+
const FString PkgName = Data.PackageName.ToString();
|
|
860
|
+
if (!PkgName.StartsWith(SrcFolder + TEXT("/")))
|
|
861
|
+
{
|
|
862
|
+
FailedLoad.Add(PkgName + TEXT(" (path mismatch)"));
|
|
863
|
+
continue;
|
|
864
|
+
}
|
|
865
|
+
const FString Suffix = PkgName.RightChop(SrcFolder.Len() + 1);
|
|
866
|
+
const FString SubPath = FPaths::GetPath(Suffix);
|
|
867
|
+
const FString NewPkgPath = SubPath.IsEmpty() ? DstFolder : (DstFolder + TEXT("/") + SubPath);
|
|
868
|
+
const FString NewName = FPaths::GetBaseFilename(Suffix);
|
|
869
|
+
|
|
870
|
+
UObject* Obj = Data.GetAsset();
|
|
871
|
+
if (!Obj)
|
|
872
|
+
{
|
|
873
|
+
FailedLoad.Add(PkgName);
|
|
874
|
+
continue;
|
|
875
|
+
}
|
|
876
|
+
Batch.Emplace(TWeakObjectPtr<UObject>(Obj), NewPkgPath, NewName);
|
|
877
|
+
++AddedCounter;
|
|
878
|
+
}
|
|
879
|
+
};
|
|
880
|
+
AddExternals(SrcActors, ExtActorsSrc, ExtActorsDst, ActorAdded);
|
|
881
|
+
AddExternals(SrcObjects, ExtObjectsSrc, ExtObjectsDst, ObjectAdded);
|
|
882
|
+
|
|
883
|
+
if (FailedLoad.Num() > 0)
|
|
884
|
+
{
|
|
885
|
+
FString Examples;
|
|
886
|
+
const int32 Show = FMath::Min(FailedLoad.Num(), 5);
|
|
887
|
+
for (int32 i = 0; i < Show; ++i)
|
|
888
|
+
{
|
|
889
|
+
if (i) Examples += TEXT(", ");
|
|
890
|
+
Examples += FailedLoad[i];
|
|
891
|
+
}
|
|
892
|
+
return MCPError(FString::Printf(
|
|
893
|
+
TEXT("Failed to load %d external package(s) for World rename. Aborting before any change. Examples: %s"),
|
|
894
|
+
FailedLoad.Num(), *Examples));
|
|
895
|
+
}
|
|
896
|
+
|
|
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.
|
|
901
|
+
auto R = MCPSuccess();
|
|
902
|
+
R->SetStringField(TEXT("sourcePath"), SourceAssetPath);
|
|
903
|
+
R->SetStringField(TEXT("destinationPath"), DestAssetPath);
|
|
904
|
+
R->SetStringField(TEXT("kind"), TEXT("world"));
|
|
905
|
+
R->SetNumberField(TEXT("externalActors"), ActorAdded);
|
|
906
|
+
R->SetNumberField(TEXT("externalObjects"), ObjectAdded);
|
|
907
|
+
R->SetNumberField(TEXT("totalRenamed"), Batch.Num());
|
|
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
|
+
|
|
918
|
+
if (!bOk)
|
|
919
|
+
{
|
|
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."),
|
|
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);
|
|
962
|
+
}
|
|
963
|
+
R->SetNumberField(TEXT("redirectorsCleaned"), RedirectorsCleaned);
|
|
964
|
+
|
|
965
|
+
MCPSetUpdated(R);
|
|
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();
|
|
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);
|
|
1091
|
+
return MCPResult(R);
|
|
1092
|
+
}
|
|
1093
|
+
|
|
663
1094
|
TSharedPtr<FJsonValue> FAssetHandlers::RenameAsset(const TSharedPtr<FJsonObject>& Params)
|
|
664
1095
|
{
|
|
665
1096
|
FString SourcePath, DestPath;
|
|
@@ -700,10 +1131,17 @@ TSharedPtr<FJsonValue> FAssetHandlers::RenameAsset(const TSharedPtr<FJsonObject>
|
|
|
700
1131
|
}
|
|
701
1132
|
|
|
702
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.
|
|
703
1137
|
if (!UEditorAssetLibrary::DoesAssetExist(SourcePath))
|
|
704
1138
|
{
|
|
705
1139
|
if (UEditorAssetLibrary::DoesAssetExist(DestPath))
|
|
706
1140
|
{
|
|
1141
|
+
if (IsWorldAsset(DestPath))
|
|
1142
|
+
{
|
|
1143
|
+
return ReconcileOrphanExternals(SourcePath, DestPath);
|
|
1144
|
+
}
|
|
707
1145
|
auto Noop = MCPSuccess();
|
|
708
1146
|
MCPSetExisted(Noop);
|
|
709
1147
|
Noop->SetStringField(TEXT("sourcePath"), SourcePath);
|
|
@@ -713,6 +1151,16 @@ TSharedPtr<FJsonValue> FAssetHandlers::RenameAsset(const TSharedPtr<FJsonObject>
|
|
|
713
1151
|
return MCPError(FString::Printf(TEXT("Asset not found: %s"), *SourcePath));
|
|
714
1152
|
}
|
|
715
1153
|
|
|
1154
|
+
// #409: Worlds carry external actor/object packages in /Game/__ExternalActors__/<LevelPath>/.
|
|
1155
|
+
// The plain UEditorAssetLibrary::RenameAsset path silently orphans those - route through
|
|
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.
|
|
1158
|
+
if (IsWorldAsset(SourcePath))
|
|
1159
|
+
{
|
|
1160
|
+
const bool bForce = OptionalBool(Params, TEXT("force"), false);
|
|
1161
|
+
return RenameWorldWithExternals(SourcePath, DestPath, bForce);
|
|
1162
|
+
}
|
|
1163
|
+
|
|
716
1164
|
bool bOk = UEditorAssetLibrary::RenameAsset(SourcePath, DestPath);
|
|
717
1165
|
|
|
718
1166
|
auto Result = MCPSuccess();
|
|
@@ -1028,6 +1476,18 @@ TSharedPtr<FJsonValue> FAssetHandlers::BulkRename(const TSharedPtr<FJsonObject>&
|
|
|
1028
1476
|
continue;
|
|
1029
1477
|
}
|
|
1030
1478
|
|
|
1479
|
+
// #409: bulk_rename doesn't migrate World external actor/object packages.
|
|
1480
|
+
// Refuse Worlds here so callers route them through rename_asset, which
|
|
1481
|
+
// handles WP externals atomically.
|
|
1482
|
+
if (IsWorldAsset(SourcePath))
|
|
1483
|
+
{
|
|
1484
|
+
Record->SetStringField(TEXT("status"), TEXT("rejected_world"));
|
|
1485
|
+
Record->SetStringField(TEXT("reason"), TEXT("World assets must use rename_asset, which migrates __ExternalActors__/__ExternalObjects__ atomically. bulk_rename would orphan WP actors."));
|
|
1486
|
+
PerItem.Add(MakeShared<FJsonValueObject>(Record));
|
|
1487
|
+
Skipped++;
|
|
1488
|
+
continue;
|
|
1489
|
+
}
|
|
1490
|
+
|
|
1031
1491
|
UObject* Asset = UEditorAssetLibrary::LoadAsset(SourcePath);
|
|
1032
1492
|
if (!Asset)
|
|
1033
1493
|
{
|