ue-mcp 1.2.3 → 1.3.0
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/README.md +4 -3
- package/dist/action-class.js +56 -3
- package/dist/action-class.js.map +1 -1
- package/dist/bridge-timeouts.d.ts +64 -0
- package/dist/bridge-timeouts.js +118 -0
- package/dist/bridge-timeouts.js.map +1 -0
- package/dist/bridge.js +10 -2
- package/dist/bridge.js.map +1 -1
- package/dist/editor-control.d.ts +72 -5
- package/dist/editor-control.js +164 -140
- package/dist/editor-control.js.map +1 -1
- package/dist/editor-target.d.ts +55 -1
- package/dist/editor-target.js +107 -10
- package/dist/editor-target.js.map +1 -1
- package/dist/engine-observer.d.ts +59 -5
- package/dist/engine-observer.js +249 -29
- package/dist/engine-observer.js.map +1 -1
- package/dist/engine-root.d.ts +91 -0
- package/dist/engine-root.js +448 -0
- package/dist/engine-root.js.map +1 -0
- package/dist/epic-enrich.js +16 -1
- package/dist/epic-enrich.js.map +1 -1
- package/dist/feedback-cli.js +4 -0
- package/dist/feedback-cli.js.map +1 -1
- package/dist/feedback-deferred.d.ts +9 -0
- package/dist/feedback-deferred.js +2 -0
- package/dist/feedback-deferred.js.map +1 -1
- package/dist/feedback-fallback.d.ts +99 -0
- package/dist/feedback-fallback.js +173 -0
- package/dist/feedback-fallback.js.map +1 -0
- package/dist/flow/write-methods.js +20 -0
- package/dist/flow/write-methods.js.map +1 -1
- package/dist/index.js +41 -2
- package/dist/index.js.map +1 -1
- package/dist/lean-context.js +8 -3
- package/dist/lean-context.js.map +1 -1
- package/dist/locking.js +11 -2
- package/dist/locking.js.map +1 -1
- package/dist/plugin/loader.d.ts +4 -0
- package/dist/plugin/loader.js +22 -8
- package/dist/plugin/loader.js.map +1 -1
- package/dist/plugin/manifest.d.ts +72 -52
- package/dist/plugin/manifest.js +118 -21
- package/dist/plugin/manifest.js.map +1 -1
- package/dist/plugin-cli.js +16 -3
- package/dist/plugin-cli.js.map +1 -1
- package/dist/project.d.ts +11 -0
- package/dist/project.js +23 -2
- package/dist/project.js.map +1 -1
- package/dist/python-gate.d.ts +95 -0
- package/dist/python-gate.js +175 -0
- package/dist/python-gate.js.map +1 -0
- package/dist/tool-counts.json +16 -16
- package/dist/tools/animation.js +288 -24
- package/dist/tools/animation.js.map +1 -1
- package/dist/tools/asset.js +79 -14
- package/dist/tools/asset.js.map +1 -1
- package/dist/tools/audio.js +59 -5
- package/dist/tools/audio.js.map +1 -1
- package/dist/tools/blueprint.js +29 -12
- package/dist/tools/blueprint.js.map +1 -1
- package/dist/tools/chooser.js +4 -1
- package/dist/tools/chooser.js.map +1 -1
- package/dist/tools/editor.js +81 -43
- package/dist/tools/editor.js.map +1 -1
- package/dist/tools/feedback.js +214 -48
- package/dist/tools/feedback.js.map +1 -1
- package/dist/tools/foliage.js +27 -1
- package/dist/tools/foliage.js.map +1 -1
- package/dist/tools/gameplay.js +38 -11
- package/dist/tools/gameplay.js.map +1 -1
- package/dist/tools/gas.js +17 -5
- package/dist/tools/gas.js.map +1 -1
- package/dist/tools/landscape.js +22 -7
- package/dist/tools/landscape.js.map +1 -1
- package/dist/tools/level.js +322 -51
- package/dist/tools/level.js.map +1 -1
- package/dist/tools/material.js +10 -4
- package/dist/tools/material.js.map +1 -1
- package/dist/tools/niagara.js +3 -2
- package/dist/tools/niagara.js.map +1 -1
- package/dist/tools/pcg.js +6 -5
- package/dist/tools/pcg.js.map +1 -1
- package/dist/tools/plugins.js +2 -0
- package/dist/tools/plugins.js.map +1 -1
- package/dist/tools/project.js +47 -20
- package/dist/tools/project.js.map +1 -1
- package/dist/types.d.ts +24 -0
- package/dist/types.js +46 -3
- package/dist/types.js.map +1 -1
- package/dist/ue-mcp.default.yml +493 -125
- package/package.json +2 -2
- package/plugin/ue_mcp_bridge/NATIVE_RUNTIME_VISIBILITY.md +53 -0
- package/plugin/ue_mcp_bridge/NATIVE_STATIC_MESH_USAGE_PROGRESS.md +115 -0
- package/plugin/ue_mcp_bridge/README_MassHandlers.md +97 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/BridgeServer.cpp +14 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/GameThreadExecutor.cpp +21 -4
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/GameThreadExecutor.h +9 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/HandlerJsonProperty.h +395 -69
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers.cpp +79 -3
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers.h +25 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_ControlRig.cpp +3 -3
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_ControlRigSequencer.cpp +3061 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_IKRetargeterAuthoring.cpp +961 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_IKRigAuthoring.cpp +900 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_Pose.cpp +769 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_Sequence.cpp +44 -3
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_SkeletalLive.cpp +217 -11
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_StateMachine.cpp +551 -24
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_Validation.cpp +735 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers.cpp +352 -73
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers.h +8 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_BulkProperties.cpp +1 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_BulkRead.cpp +503 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_BulkRead.h +21 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_BulkUpsert.cpp +2 -2
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Enum.cpp +2 -2
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Geometry.cpp +902 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Geometry.h +33 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Import.cpp +478 -134
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Mesh.cpp +5 -5
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_MeshBoolean.cpp +933 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_MeshBoolean.h +35 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Redirectors.cpp +478 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_RenderTarget.cpp +1 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Sockets.cpp +4 -4
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Struct.cpp +2 -2
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Subobject.cpp +319 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AudioHandlers_SoundCue.cpp +3 -3
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers.cpp +482 -35
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers.h +10 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Collision.cpp +502 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Collision.h +43 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Functions.cpp +89 -7
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Graph.cpp +17 -51
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Internal.h +107 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Properties.cpp +10 -10
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Search.cpp +648 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DemoHandlers.cpp +5 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DiffHandlers.cpp +252 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DiffHandlers.h +10 -2
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers.cpp +252 -41
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers.h +4 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_Build.cpp +250 -27
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_PIE.cpp +303 -125
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_PIERuntime.cpp +73 -50
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_RuntimeVisibility.cpp +757 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/FoliageHandlers.cpp +11 -2
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/FoliageHandlers.h +3 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/FoliageHandlers_Batch.cpp +419 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers.cpp +39 -161
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers.h +66 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers_BTAuthoring.cpp +1323 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers_BehaviorTree.cpp +1211 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers.cpp +2 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers.h +60 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers_Runtime.cpp +363 -12
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/HandlerEditorState.h +84 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers.cpp +1288 -36
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers.h +3 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers_Sculpt.cpp +41 -16
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers.cpp +959 -213
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers.h +66 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_BatchWrite.cpp +1571 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Convert.cpp +316 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Inspection.cpp +280 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_InstanceProjection.cpp +666 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_InstanceProjection_Internal.h +63 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Lights.cpp +43 -12
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_MultiLevel.cpp +13 -47
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_PostProcess.cpp +527 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Query.cpp +1169 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Refresh.cpp +723 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Save.cpp +325 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Spatial.cpp +360 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Trace.cpp +178 -58
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Transient.cpp +337 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Volumes.cpp +25 -12
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_WorldPartition.cpp +10 -9
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_WorldPartitionSettings.cpp +686 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MassHandlers.cpp +467 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MassHandlers.h +22 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers.cpp +452 -175
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers.h +5 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers_Build.cpp +597 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/NiagaraHandlers.cpp +17 -15
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PCGHandlers.cpp +38 -168
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PhysicsHandlers.cpp +39 -30
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers.cpp +392 -78
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers.h +2 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers_Internal.h +83 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SkeletalMeshHandlers.cpp +200 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SkeletalMeshHandlers.h +15 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SplineHandlers.cpp +19 -12
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/StateTreeHandlers.cpp +31 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers.cpp +307 -69
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers.h +84 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers_Extraction.cpp +8 -41
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers_Properties.cpp +33 -52
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/ActorSelectorTests.cpp +344 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AnimationControlRigTimelineTests.cpp +60 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AnimationPoseTests.cpp +115 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetBulkReadTests.cpp +177 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetDeleteGuardTests.cpp +276 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetPathResolutionTests.cpp +243 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetPropertyPersistTests.cpp +213 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetSubobjectTests.cpp +235 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AutomationRunnerTests.cpp +72 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/BehaviorTreeAuthoringTests.cpp +526 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/BehaviorTreeNodeTests.cpp +334 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/BlueprintHandlerSurfaceTests.cpp +362 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/BridgeProtocolTests.cpp +14 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/CollisionQueryTests.cpp +288 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/DataTableRowWriteTests.cpp +453 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/EditorFunctionCallTests.cpp +223 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/FoliageBatchTests.cpp +147 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/GameThreadGateTests.cpp +82 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/GasLiveAttributeTests.cpp +183 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LandscapeSampleTests.cpp +119 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelBatchWriteTests.cpp +176 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelComponentTreeInstanceCountTests.cpp +189 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelConvertBrushesTests.cpp +100 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelInstanceProjectionTests.cpp +265 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelPostProcessOverrideTests.cpp +258 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelQueryComponentsTests.cpp +195 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelRefreshTests.cpp +142 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelSaveReportTests.cpp +125 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelScriptHandlersTests.cpp +42 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelStaticMeshUsageTests.cpp +412 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelTraceWorldScopeTests.cpp +133 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelTransientActorTests.cpp +205 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelWorldPartitionSettingsTests.cpp +168 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MCPInstancedStructPathTestTypes.h +51 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MCPInstancedStructPathTests.cpp +379 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MaterialBuildTests.cpp +238 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MeshBooleanTests.cpp +170 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MeshGeometryTests.cpp +116 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/PackageSaveExtensionTests.cpp +161 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/PackageWriteGuardTests.cpp +253 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/RuntimeVisibilityTests.cpp +143 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/SequencerHandlerTests.cpp +660 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/SequencerScrubTests.cpp +50 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/SkeletonDiffTests.cpp +685 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/WidgetBlueprintResolveTests.cpp +145 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/UE_MCP_Bridge.cpp +80 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Public/HandlerFunctionCall.h +509 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Public/HandlerQuery.h +407 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Public/HandlerUtils.h +1008 -77
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/UE_MCP_Bridge.Build.cs +87 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/Private/MCPEngineStatus.cpp +152 -14
- package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/Private/Tests/MCPEngineStatusTests.cpp +65 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/Public/MCPEngineStatus.h +32 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/UE_MCP_BridgeStatus.Build.cs +2 -0
- package/skills/ue-mcp-animation/SKILL.md +154 -0
- package/skills/ue-mcp-blueprint/SKILL.md +71 -0
package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/WidgetBlueprintResolveTests.cpp
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
#if WITH_DEV_AUTOMATION_TESTS
|
|
2
|
+
|
|
3
|
+
#include "Handlers/WidgetHandlers.h"
|
|
4
|
+
#include "Misc/AutomationTest.h"
|
|
5
|
+
#include "Engine/Blueprint.h"
|
|
6
|
+
#include "WidgetBlueprint.h"
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* #972: every widget action resolves its WidgetBlueprint through one shared
|
|
10
|
+
* resolver that normalises the path, revalidates whatever it finds, and says
|
|
11
|
+
* which of the three failures happened. These cases pin the two halves that do
|
|
12
|
+
* not need an asset on disk: path normalisation, and the wording that lets a
|
|
13
|
+
* caller tell "there is no such asset" from "the handle went stale".
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
|
17
|
+
FWidgetBlueprintResolvePathTest,
|
|
18
|
+
"UE.MCP.Widget.Resolve.ObjectPathNormalisation",
|
|
19
|
+
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter)
|
|
20
|
+
|
|
21
|
+
bool FWidgetBlueprintResolvePathTest::RunTest(const FString& Parameters)
|
|
22
|
+
{
|
|
23
|
+
using namespace MCPWidget;
|
|
24
|
+
|
|
25
|
+
const FString Expected = TEXT("/Game/UI/MCPResolveProbe.MCPResolveProbe");
|
|
26
|
+
|
|
27
|
+
// A package path with no object part gets one inferred, which is what the
|
|
28
|
+
// object hash needs before it can answer at all.
|
|
29
|
+
const FString FromPackagePath = ResolveWidgetBlueprint(TEXT("/Game/UI/MCPResolveProbe")).ObjectPath;
|
|
30
|
+
TestEqual(TEXT("package path gains the object part"), *FromPackagePath, *Expected);
|
|
31
|
+
|
|
32
|
+
// Already an object path: unchanged.
|
|
33
|
+
const FString FromObjectPath =
|
|
34
|
+
ResolveWidgetBlueprint(TEXT("/Game/UI/MCPResolveProbe.MCPResolveProbe")).ObjectPath;
|
|
35
|
+
TestEqual(TEXT("object path passes through"), *FromObjectPath, *Expected);
|
|
36
|
+
|
|
37
|
+
// Export text form, which agents and the engine both emit.
|
|
38
|
+
const FString FromExportText =
|
|
39
|
+
ResolveWidgetBlueprint(TEXT("WidgetBlueprint'/Game/UI/MCPResolveProbe.MCPResolveProbe'")).ObjectPath;
|
|
40
|
+
TestEqual(TEXT("export text form is unwrapped"), *FromExportText, *Expected);
|
|
41
|
+
|
|
42
|
+
// The generated class path names the class, not the asset. The resolver
|
|
43
|
+
// answers with the blueprint behind it, so the _C comes off the path.
|
|
44
|
+
const FString FromGeneratedClass =
|
|
45
|
+
ResolveWidgetBlueprint(TEXT("/Game/UI/MCPResolveProbe.MCPResolveProbe_C")).ObjectPath;
|
|
46
|
+
TestEqual(TEXT("generated class suffix is dropped"), *FromGeneratedClass, *Expected);
|
|
47
|
+
|
|
48
|
+
// A subobject path resolves to its owning asset.
|
|
49
|
+
const FString FromSubobject =
|
|
50
|
+
ResolveWidgetBlueprint(TEXT("/Game/UI/MCPResolveProbe.MCPResolveProbe:Inner")).ObjectPath;
|
|
51
|
+
TestEqual(TEXT("subobject part is dropped"), *FromSubobject, *Expected);
|
|
52
|
+
|
|
53
|
+
// Nothing above exists, so every one of them is NotFound rather than
|
|
54
|
+
// Unresolvable. That is the distinction the error wording depends on.
|
|
55
|
+
const FWidgetBlueprintResolve Missing = ResolveWidgetBlueprint(TEXT("/Game/UI/MCPResolveProbe"));
|
|
56
|
+
TestFalse(TEXT("probe asset does not exist"), Missing.bAssetExists);
|
|
57
|
+
TestTrue(
|
|
58
|
+
TEXT("a missing asset reports NotFound"),
|
|
59
|
+
Missing.Failure == EWidgetBlueprintResolveFailure::NotFound);
|
|
60
|
+
TestNull(TEXT("no blueprint is handed back"), Missing.Blueprint);
|
|
61
|
+
|
|
62
|
+
// An empty path cannot be normalised and must not be treated as a stale
|
|
63
|
+
// handle on something real.
|
|
64
|
+
const FWidgetBlueprintResolve Empty = ResolveWidgetBlueprint(FString());
|
|
65
|
+
TestTrue(
|
|
66
|
+
TEXT("an empty path reports NotFound"),
|
|
67
|
+
Empty.Failure == EWidgetBlueprintResolveFailure::NotFound);
|
|
68
|
+
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
|
73
|
+
FWidgetBlueprintResolveErrorWordingTest,
|
|
74
|
+
"UE.MCP.Widget.Resolve.ErrorsDistinguishMissingFromStale",
|
|
75
|
+
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter)
|
|
76
|
+
|
|
77
|
+
static FString WidgetResolveTestErrorText(const TSharedPtr<FJsonValue>& Value)
|
|
78
|
+
{
|
|
79
|
+
if (!Value.IsValid() || Value->Type != EJson::Object) return FString();
|
|
80
|
+
return Value->AsObject()->GetStringField(TEXT("error"));
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
bool FWidgetBlueprintResolveErrorWordingTest::RunTest(const FString& Parameters)
|
|
84
|
+
{
|
|
85
|
+
using namespace MCPWidget;
|
|
86
|
+
|
|
87
|
+
const FString Path = TEXT("/Game/UI/MCPResolveProbe");
|
|
88
|
+
|
|
89
|
+
FWidgetBlueprintResolve NotFound;
|
|
90
|
+
NotFound.Failure = EWidgetBlueprintResolveFailure::NotFound;
|
|
91
|
+
const FString NotFoundText = WidgetResolveTestErrorText(WidgetBlueprintResolveError(Path, NotFound));
|
|
92
|
+
TestTrue(TEXT("missing asset says no asset exists"), NotFoundText.Contains(TEXT("No asset exists")));
|
|
93
|
+
TestTrue(TEXT("missing asset names the path"), NotFoundText.Contains(Path));
|
|
94
|
+
|
|
95
|
+
FWidgetBlueprintResolve Stale;
|
|
96
|
+
Stale.Failure = EWidgetBlueprintResolveFailure::Unresolvable;
|
|
97
|
+
Stale.bAssetExists = true;
|
|
98
|
+
const FString StaleText = WidgetResolveTestErrorText(WidgetBlueprintResolveError(Path, Stale));
|
|
99
|
+
TestTrue(TEXT("stale handle says the asset exists"), StaleText.Contains(TEXT("exists but could not be resolved")));
|
|
100
|
+
TestTrue(TEXT("stale handle names the recovery"), StaleText.Contains(TEXT("reload_bridge")));
|
|
101
|
+
// The two must not read the same, because the caller's next move differs.
|
|
102
|
+
TestNotEqual(TEXT("the two failures word differently"), *NotFoundText, *StaleText);
|
|
103
|
+
|
|
104
|
+
FWidgetBlueprintResolve WrongType;
|
|
105
|
+
WrongType.Failure = EWidgetBlueprintResolveFailure::WrongType;
|
|
106
|
+
WrongType.FoundClass = TEXT("Material");
|
|
107
|
+
const FString WrongTypeText = WidgetResolveTestErrorText(WidgetBlueprintResolveError(Path, WrongType));
|
|
108
|
+
TestTrue(TEXT("wrong type names what was found"), WrongTypeText.Contains(TEXT("Material")));
|
|
109
|
+
TestTrue(TEXT("wrong type says it is not a WidgetBlueprint"),
|
|
110
|
+
WrongTypeText.Contains(TEXT("not a WidgetBlueprint")));
|
|
111
|
+
|
|
112
|
+
// A broken asset is neither missing nor stale, and used to share the
|
|
113
|
+
// "Failed to load WidgetBlueprint" wording with both.
|
|
114
|
+
const FString TreeText = WidgetResolveTestErrorText(MissingWidgetTreeError(Path));
|
|
115
|
+
TestTrue(TEXT("missing WidgetTree says the asset resolved"), TreeText.Contains(TEXT("no WidgetTree")));
|
|
116
|
+
TestFalse(TEXT("missing WidgetTree is not reported as missing"), TreeText.Contains(TEXT("No asset exists")));
|
|
117
|
+
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
|
122
|
+
FWidgetBlueprintResolveWrongTypeTest,
|
|
123
|
+
"UE.MCP.Widget.Resolve.RealAssetOfTheWrongType",
|
|
124
|
+
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter)
|
|
125
|
+
|
|
126
|
+
bool FWidgetBlueprintResolveWrongTypeTest::RunTest(const FString& Parameters)
|
|
127
|
+
{
|
|
128
|
+
using namespace MCPWidget;
|
|
129
|
+
|
|
130
|
+
// An asset that ships with the engine, is not a WidgetBlueprint, and is
|
|
131
|
+
// already in memory in any editor session: the resolver must classify it
|
|
132
|
+
// rather than claim the path does not exist.
|
|
133
|
+
const FWidgetBlueprintResolve Resolved =
|
|
134
|
+
ResolveWidgetBlueprint(TEXT("/Engine/EngineMaterials/DefaultMaterial"));
|
|
135
|
+
TestNull(TEXT("a material is not handed back as a WidgetBlueprint"), Resolved.Blueprint);
|
|
136
|
+
TestTrue(TEXT("the engine asset is found to exist"), Resolved.bAssetExists);
|
|
137
|
+
TestTrue(
|
|
138
|
+
TEXT("a real asset of the wrong type reports WrongType"),
|
|
139
|
+
Resolved.Failure == EWidgetBlueprintResolveFailure::WrongType);
|
|
140
|
+
TestFalse(TEXT("the class that was found is reported"), Resolved.FoundClass.IsEmpty());
|
|
141
|
+
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
#endif
|
|
@@ -6,8 +6,11 @@
|
|
|
6
6
|
#include "Handlers/DialogHandlers.h"
|
|
7
7
|
#include "Editor.h"
|
|
8
8
|
#include "Editor/EditorEngine.h"
|
|
9
|
+
#include "HAL/PlatformMisc.h"
|
|
10
|
+
#include "Misc/CommandLine.h"
|
|
9
11
|
#include "Misc/ConfigCacheIni.h"
|
|
10
12
|
#include "Misc/CoreDelegates.h"
|
|
13
|
+
#include "Misc/Parse.h"
|
|
11
14
|
#include "Containers/Ticker.h"
|
|
12
15
|
|
|
13
16
|
DEFINE_LOG_CATEGORY(LogMCPBridge);
|
|
@@ -15,6 +18,76 @@ IMPLEMENT_MODULE(FUE_MCP_BridgeModule, UE_MCP_Bridge)
|
|
|
15
18
|
|
|
16
19
|
static TSharedPtr<FMCPBridgeServer> G_BridgeServer;
|
|
17
20
|
|
|
21
|
+
namespace
|
|
22
|
+
{
|
|
23
|
+
/**
|
|
24
|
+
* #968: dialog policies supplied at launch, before anything can wedge.
|
|
25
|
+
*
|
|
26
|
+
* A modal raised during startup blocks the game thread, and while the
|
|
27
|
+
* dialog handlers can now clear one from outside, an agent that already
|
|
28
|
+
* knows the answer should not have to. `UE_MCP_DIALOG_POLICY` (or
|
|
29
|
+
* `-MCPDialogPolicy=`) is a semicolon separated list of `pattern=response`
|
|
30
|
+
* pairs, applied here at module startup so the very first prompt is already
|
|
31
|
+
* covered:
|
|
32
|
+
*
|
|
33
|
+
* UE_MCP_DIALOG_POLICY="Restore=no;Would you like to rebuild=yes"
|
|
34
|
+
*
|
|
35
|
+
* The response words are exactly the ones set_dialog_policy accepts,
|
|
36
|
+
* because each entry is applied by dispatching set_dialog_policy itself
|
|
37
|
+
* rather than by a second copy of its parsing. An entry that is not a
|
|
38
|
+
* pattern=response pair is skipped and said out loud: a policy that
|
|
39
|
+
* silently does nothing is worse than no policy at all.
|
|
40
|
+
*/
|
|
41
|
+
FString ReadConfiguredDialogPolicy()
|
|
42
|
+
{
|
|
43
|
+
FString FromCommandLine;
|
|
44
|
+
if (FParse::Value(FCommandLine::Get(), TEXT("MCPDialogPolicy="), FromCommandLine) && !FromCommandLine.IsEmpty())
|
|
45
|
+
{
|
|
46
|
+
return FromCommandLine;
|
|
47
|
+
}
|
|
48
|
+
return FPlatformMisc::GetEnvironmentVariable(TEXT("UE_MCP_DIALOG_POLICY"));
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
void ApplyConfiguredDialogPolicies(FMCPHandlerRegistry& Registry)
|
|
52
|
+
{
|
|
53
|
+
const FString Spec = ReadConfiguredDialogPolicy();
|
|
54
|
+
if (Spec.IsEmpty())
|
|
55
|
+
{
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
TArray<FString> Entries;
|
|
60
|
+
Spec.ParseIntoArray(Entries, TEXT(";"), /*InCullEmpty*/ true);
|
|
61
|
+
for (const FString& Entry : Entries)
|
|
62
|
+
{
|
|
63
|
+
// Split on the LAST '=' so a pattern may contain one.
|
|
64
|
+
int32 Separator = INDEX_NONE;
|
|
65
|
+
if (!Entry.FindLastChar(TEXT('='), Separator))
|
|
66
|
+
{
|
|
67
|
+
UE_LOG(LogMCPBridge, Warning,
|
|
68
|
+
TEXT("[UE-MCP] Dialog policy entry '%s' has no 'pattern=response' separator and was ignored."), *Entry);
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
const FString Pattern = Entry.Left(Separator).TrimStartAndEnd();
|
|
72
|
+
const FString Response = Entry.Mid(Separator + 1).TrimStartAndEnd();
|
|
73
|
+
if (Pattern.IsEmpty() || Response.IsEmpty())
|
|
74
|
+
{
|
|
75
|
+
UE_LOG(LogMCPBridge, Warning,
|
|
76
|
+
TEXT("[UE-MCP] Dialog policy entry '%s' names an empty pattern or response and was ignored."), *Entry);
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
TSharedPtr<FJsonObject> PolicyParams = MakeShared<FJsonObject>();
|
|
81
|
+
PolicyParams->SetStringField(TEXT("pattern"), Pattern);
|
|
82
|
+
PolicyParams->SetStringField(TEXT("response"), Response);
|
|
83
|
+
Registry.ExecuteHandler(TEXT("set_dialog_policy"), PolicyParams);
|
|
84
|
+
|
|
85
|
+
UE_LOG(LogMCPBridge, Log,
|
|
86
|
+
TEXT("[UE-MCP] Startup dialog policy applied: '%s' answers '%s'"), *Pattern, *Response);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
18
91
|
void FUE_MCP_BridgeModule::StartupModule()
|
|
19
92
|
{
|
|
20
93
|
// Create and start bridge server. The base port is derived per-worktree
|
|
@@ -50,6 +123,13 @@ void FUE_MCP_BridgeModule::StartupModule()
|
|
|
50
123
|
FDialogHandlers::AddDefaultPolicy(TEXT("save your changes"), EAppReturnType::No);
|
|
51
124
|
FDialogHandlers::AddDefaultPolicy(TEXT("save the level"), EAppReturnType::No);
|
|
52
125
|
|
|
126
|
+
// #968: policies the launcher asked for, applied before the socket is even
|
|
127
|
+
// listening, so a prompt raised during startup is answered rather than
|
|
128
|
+
// waited on. Matching is first-registered-wins, so these sit behind the
|
|
129
|
+
// safety nets above and add to them rather than reopening a save prompt
|
|
130
|
+
// that already has a settled answer.
|
|
131
|
+
ApplyConfiguredDialogPolicies(G_BridgeServer->GetHandlerRegistry());
|
|
132
|
+
|
|
53
133
|
if (G_BridgeServer->Start())
|
|
54
134
|
{
|
|
55
135
|
UE_LOG(LogMCPBridge, Log, TEXT("[UE-MCP] Bridge server starting on base port %d (%s)"), PortChoice.Port, *PortChoice.Source);
|