unreal-engine-mcp-server 0.5.4 → 0.5.5

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.
Files changed (468) hide show
  1. package/dist/automation/bridge.d.ts.map +1 -0
  2. package/dist/automation/bridge.js.map +1 -0
  3. package/dist/automation/connection-manager.d.ts.map +1 -0
  4. package/dist/automation/connection-manager.js.map +1 -0
  5. package/dist/automation/handshake.d.ts.map +1 -0
  6. package/dist/automation/handshake.js.map +1 -0
  7. package/dist/automation/index.d.ts.map +1 -0
  8. package/dist/automation/index.js.map +1 -0
  9. package/dist/automation/message-handler.d.ts.map +1 -0
  10. package/dist/automation/message-handler.js.map +1 -0
  11. package/dist/automation/request-tracker.d.ts.map +1 -0
  12. package/dist/automation/request-tracker.js.map +1 -0
  13. package/dist/automation/types.d.ts.map +1 -0
  14. package/dist/automation/types.js.map +1 -0
  15. package/dist/cli.d.ts.map +1 -0
  16. package/dist/cli.js +4 -3
  17. package/dist/cli.js.map +1 -0
  18. package/dist/config/class-aliases.d.ts.map +1 -0
  19. package/dist/config/class-aliases.js.map +1 -0
  20. package/dist/config.d.ts.map +1 -0
  21. package/dist/config.js.map +1 -0
  22. package/dist/constants.d.ts.map +1 -0
  23. package/dist/constants.js.map +1 -0
  24. package/dist/graphql/loaders.d.ts.map +1 -0
  25. package/dist/graphql/loaders.js.map +1 -0
  26. package/dist/graphql/resolvers.d.ts.map +1 -0
  27. package/dist/graphql/resolvers.js +29 -29
  28. package/dist/graphql/resolvers.js.map +1 -0
  29. package/dist/graphql/schema.d.ts.map +1 -0
  30. package/dist/graphql/schema.js.map +1 -0
  31. package/dist/graphql/server.d.ts.map +1 -0
  32. package/dist/graphql/server.js.map +1 -0
  33. package/dist/graphql/types.d.ts.map +1 -0
  34. package/dist/graphql/types.js.map +1 -0
  35. package/dist/handlers/resource-handlers.d.ts.map +1 -0
  36. package/dist/handlers/resource-handlers.js.map +1 -0
  37. package/dist/index.d.ts +1 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +64 -7
  40. package/dist/index.js.map +1 -0
  41. package/dist/resources/actors.d.ts.map +1 -0
  42. package/dist/resources/actors.js.map +1 -0
  43. package/dist/resources/assets.d.ts.map +1 -0
  44. package/dist/resources/assets.js +6 -4
  45. package/dist/resources/assets.js.map +1 -0
  46. package/dist/resources/levels.d.ts.map +1 -0
  47. package/dist/resources/levels.js.map +1 -0
  48. package/dist/server/resource-registry.d.ts.map +1 -0
  49. package/dist/server/resource-registry.js.map +1 -0
  50. package/dist/server/tool-registry.d.ts.map +1 -0
  51. package/dist/server/tool-registry.js.map +1 -0
  52. package/dist/server-setup.d.ts.map +1 -0
  53. package/dist/server-setup.js.map +1 -0
  54. package/dist/services/health-monitor.d.ts.map +1 -0
  55. package/dist/services/health-monitor.js.map +1 -0
  56. package/dist/services/metrics-server.d.ts.map +1 -0
  57. package/dist/services/metrics-server.js.map +1 -0
  58. package/dist/tools/actors.d.ts.map +1 -0
  59. package/dist/tools/actors.js +3 -1
  60. package/dist/tools/actors.js.map +1 -0
  61. package/dist/tools/animation.d.ts.map +1 -0
  62. package/dist/tools/animation.js +2 -2
  63. package/dist/tools/animation.js.map +1 -0
  64. package/dist/tools/assets.d.ts.map +1 -0
  65. package/dist/tools/assets.js.map +1 -0
  66. package/dist/tools/audio.d.ts.map +1 -0
  67. package/dist/tools/audio.js.map +1 -0
  68. package/dist/tools/base-tool.d.ts.map +1 -0
  69. package/dist/tools/base-tool.js.map +1 -0
  70. package/dist/tools/behavior-tree.d.ts.map +1 -0
  71. package/dist/tools/behavior-tree.js.map +1 -0
  72. package/dist/tools/blueprint.d.ts.map +1 -0
  73. package/dist/tools/blueprint.js +4 -2
  74. package/dist/tools/blueprint.js.map +1 -0
  75. package/dist/tools/consolidated-tool-definitions.d.ts.map +1 -0
  76. package/dist/tools/consolidated-tool-definitions.js.map +1 -0
  77. package/dist/tools/consolidated-tool-handlers.d.ts.map +1 -0
  78. package/dist/tools/consolidated-tool-handlers.js.map +1 -0
  79. package/dist/tools/debug.d.ts.map +1 -0
  80. package/dist/tools/debug.js +3 -1
  81. package/dist/tools/debug.js.map +1 -0
  82. package/dist/tools/dynamic-handler-registry.d.ts.map +1 -0
  83. package/dist/tools/dynamic-handler-registry.js +3 -1
  84. package/dist/tools/dynamic-handler-registry.js.map +1 -0
  85. package/dist/tools/editor.d.ts.map +1 -0
  86. package/dist/tools/editor.js +1 -1
  87. package/dist/tools/editor.js.map +1 -0
  88. package/dist/tools/engine.d.ts.map +1 -0
  89. package/dist/tools/engine.js.map +1 -0
  90. package/dist/tools/environment.d.ts.map +1 -0
  91. package/dist/tools/environment.js +2 -2
  92. package/dist/tools/environment.js.map +1 -0
  93. package/dist/tools/foliage.d.ts.map +1 -0
  94. package/dist/tools/foliage.js.map +1 -0
  95. package/dist/tools/handlers/actor-handlers.d.ts +1 -1
  96. package/dist/tools/handlers/actor-handlers.d.ts.map +1 -0
  97. package/dist/tools/handlers/actor-handlers.js +6 -5
  98. package/dist/tools/handlers/actor-handlers.js.map +1 -0
  99. package/dist/tools/handlers/animation-handlers.d.ts.map +1 -0
  100. package/dist/tools/handlers/animation-handlers.js.map +1 -0
  101. package/dist/tools/handlers/argument-helper.d.ts.map +1 -0
  102. package/dist/tools/handlers/argument-helper.js.map +1 -0
  103. package/dist/tools/handlers/asset-handlers.d.ts.map +1 -0
  104. package/dist/tools/handlers/asset-handlers.js +5 -1
  105. package/dist/tools/handlers/asset-handlers.js.map +1 -0
  106. package/dist/tools/handlers/audio-handlers.d.ts.map +1 -0
  107. package/dist/tools/handlers/audio-handlers.js.map +1 -0
  108. package/dist/tools/handlers/blueprint-handlers.d.ts.map +1 -0
  109. package/dist/tools/handlers/blueprint-handlers.js +2 -1
  110. package/dist/tools/handlers/blueprint-handlers.js.map +1 -0
  111. package/dist/tools/handlers/common-handlers.d.ts.map +1 -0
  112. package/dist/tools/handlers/common-handlers.js.map +1 -0
  113. package/dist/tools/handlers/editor-handlers.d.ts.map +1 -0
  114. package/dist/tools/handlers/editor-handlers.js +12 -2
  115. package/dist/tools/handlers/editor-handlers.js.map +1 -0
  116. package/dist/tools/handlers/effect-handlers.d.ts.map +1 -0
  117. package/dist/tools/handlers/effect-handlers.js.map +1 -0
  118. package/dist/tools/handlers/environment-handlers.d.ts.map +1 -0
  119. package/dist/tools/handlers/environment-handlers.js.map +1 -0
  120. package/dist/tools/handlers/graph-handlers.d.ts.map +1 -0
  121. package/dist/tools/handlers/graph-handlers.js +61 -1
  122. package/dist/tools/handlers/graph-handlers.js.map +1 -0
  123. package/dist/tools/handlers/input-handlers.d.ts.map +1 -0
  124. package/dist/tools/handlers/input-handlers.js.map +1 -0
  125. package/dist/tools/handlers/inspect-handlers.d.ts.map +1 -0
  126. package/dist/tools/handlers/inspect-handlers.js.map +1 -0
  127. package/dist/tools/handlers/level-handlers.d.ts.map +1 -0
  128. package/dist/tools/handlers/level-handlers.js.map +1 -0
  129. package/dist/tools/handlers/lighting-handlers.d.ts.map +1 -0
  130. package/dist/tools/handlers/lighting-handlers.js +23 -1
  131. package/dist/tools/handlers/lighting-handlers.js.map +1 -0
  132. package/dist/tools/handlers/performance-handlers.d.ts.map +1 -0
  133. package/dist/tools/handlers/performance-handlers.js +15 -2
  134. package/dist/tools/handlers/performance-handlers.js.map +1 -0
  135. package/dist/tools/handlers/pipeline-handlers.d.ts.map +1 -0
  136. package/dist/tools/handlers/pipeline-handlers.js.map +1 -0
  137. package/dist/tools/handlers/sequence-handlers.d.ts.map +1 -0
  138. package/dist/tools/handlers/sequence-handlers.js.map +1 -0
  139. package/dist/tools/handlers/system-handlers.d.ts.map +1 -0
  140. package/dist/tools/handlers/system-handlers.js +16 -1
  141. package/dist/tools/handlers/system-handlers.js.map +1 -0
  142. package/dist/tools/input.d.ts.map +1 -0
  143. package/dist/tools/input.js +3 -1
  144. package/dist/tools/input.js.map +1 -0
  145. package/dist/tools/introspection.d.ts.map +1 -0
  146. package/dist/tools/introspection.js.map +1 -0
  147. package/dist/tools/landscape.d.ts.map +1 -0
  148. package/dist/tools/landscape.js +3 -1
  149. package/dist/tools/landscape.js.map +1 -0
  150. package/dist/tools/level.d.ts.map +1 -0
  151. package/dist/tools/level.js.map +1 -0
  152. package/dist/tools/lighting.d.ts.map +1 -0
  153. package/dist/tools/lighting.js +3 -1
  154. package/dist/tools/lighting.js.map +1 -0
  155. package/dist/tools/logs.d.ts.map +1 -0
  156. package/dist/tools/logs.js.map +1 -0
  157. package/dist/tools/materials.d.ts.map +1 -0
  158. package/dist/tools/materials.js +3 -1
  159. package/dist/tools/materials.js.map +1 -0
  160. package/dist/tools/niagara.d.ts.map +1 -0
  161. package/dist/tools/niagara.js +7 -5
  162. package/dist/tools/niagara.js.map +1 -0
  163. package/dist/tools/performance.d.ts.map +1 -0
  164. package/dist/tools/performance.js.map +1 -0
  165. package/dist/tools/physics.d.ts.map +1 -0
  166. package/dist/tools/physics.js +9 -7
  167. package/dist/tools/physics.js.map +1 -0
  168. package/dist/tools/property-dictionary.d.ts.map +1 -0
  169. package/dist/tools/property-dictionary.js.map +1 -0
  170. package/dist/tools/sequence.d.ts.map +1 -0
  171. package/dist/tools/sequence.js +3 -1
  172. package/dist/tools/sequence.js.map +1 -0
  173. package/dist/tools/tool-definition-utils.d.ts.map +1 -0
  174. package/dist/tools/tool-definition-utils.js.map +1 -0
  175. package/dist/tools/ui.d.ts.map +1 -0
  176. package/dist/tools/ui.js +3 -1
  177. package/dist/tools/ui.js.map +1 -0
  178. package/dist/types/automation-responses.d.ts.map +1 -0
  179. package/dist/types/automation-responses.js.map +1 -0
  180. package/dist/types/env.d.ts.map +1 -0
  181. package/dist/types/env.js.map +1 -0
  182. package/dist/types/handler-types.d.ts.map +1 -0
  183. package/dist/types/handler-types.js.map +1 -0
  184. package/dist/types/tool-interfaces.d.ts.map +1 -0
  185. package/dist/types/tool-interfaces.js.map +1 -0
  186. package/dist/types/tool-types.d.ts.map +1 -0
  187. package/dist/types/tool-types.js.map +1 -0
  188. package/dist/unreal-bridge.d.ts +1 -0
  189. package/dist/unreal-bridge.d.ts.map +1 -0
  190. package/dist/unreal-bridge.js +8 -0
  191. package/dist/unreal-bridge.js.map +1 -0
  192. package/dist/utils/command-validator.d.ts.map +1 -0
  193. package/dist/utils/command-validator.js.map +1 -0
  194. package/dist/utils/elicitation.d.ts.map +1 -0
  195. package/dist/utils/elicitation.js.map +1 -0
  196. package/dist/utils/error-handler.d.ts.map +1 -0
  197. package/dist/utils/error-handler.js.map +1 -0
  198. package/dist/utils/ini-reader.d.ts.map +1 -0
  199. package/dist/utils/ini-reader.js.map +1 -0
  200. package/dist/utils/logger.d.ts.map +1 -0
  201. package/dist/utils/logger.js.map +1 -0
  202. package/dist/utils/normalize.d.ts.map +1 -0
  203. package/dist/utils/normalize.js.map +1 -0
  204. package/dist/utils/path-security.d.ts.map +1 -0
  205. package/dist/utils/path-security.js.map +1 -0
  206. package/dist/utils/response-factory.d.ts.map +1 -0
  207. package/dist/utils/response-factory.js +3 -1
  208. package/dist/utils/response-factory.js.map +1 -0
  209. package/dist/utils/response-validator.d.ts.map +1 -0
  210. package/dist/utils/response-validator.js.map +1 -0
  211. package/dist/utils/result-helpers.d.ts.map +1 -0
  212. package/dist/utils/result-helpers.js.map +1 -0
  213. package/dist/utils/safe-json.d.ts.map +1 -0
  214. package/dist/utils/safe-json.js.map +1 -0
  215. package/dist/utils/unreal-command-queue.d.ts.map +1 -0
  216. package/dist/utils/unreal-command-queue.js.map +1 -0
  217. package/dist/utils/validation.d.ts.map +1 -0
  218. package/dist/utils/validation.js.map +1 -0
  219. package/dist/wasm/index.d.ts.map +1 -0
  220. package/dist/wasm/index.js.map +1 -0
  221. package/package.json +12 -34
  222. package/server.json +2 -2
  223. package/.dockerignore +0 -57
  224. package/.env.example +0 -26
  225. package/.env.production +0 -61
  226. package/.eslintrc.json +0 -0
  227. package/.eslintrc.override.json +0 -8
  228. package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -94
  229. package/.github/ISSUE_TEMPLATE/config.yml +0 -8
  230. package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -56
  231. package/.github/copilot-instructions.md +0 -478
  232. package/.github/dependabot.yml +0 -19
  233. package/.github/labeler.yml +0 -24
  234. package/.github/labels.yml +0 -70
  235. package/.github/pull_request_template.md +0 -42
  236. package/.github/release-drafter-config.yml +0 -51
  237. package/.github/workflows/auto-merge.yml +0 -38
  238. package/.github/workflows/ci.yml +0 -38
  239. package/.github/workflows/dependency-review.yml +0 -17
  240. package/.github/workflows/gemini-issue-triage.yml +0 -172
  241. package/.github/workflows/greetings.yml +0 -27
  242. package/.github/workflows/labeler.yml +0 -17
  243. package/.github/workflows/links.yml +0 -80
  244. package/.github/workflows/pr-size-labeler.yml +0 -137
  245. package/.github/workflows/publish-mcp.yml +0 -79
  246. package/.github/workflows/release-drafter.yml +0 -24
  247. package/.github/workflows/release.yml +0 -112
  248. package/.github/workflows/semantic-pull-request.yml +0 -35
  249. package/.github/workflows/smoke-test.yml +0 -36
  250. package/.github/workflows/stale.yml +0 -28
  251. package/CONTRIBUTING.md +0 -140
  252. package/Dockerfile +0 -37
  253. package/GEMINI.md +0 -115
  254. package/Public/Plugin_setup_guide.mp4 +0 -0
  255. package/Public/icon.png +0 -0
  256. package/claude_desktop_config_example.json +0 -15
  257. package/dist/types/responses.d.ts +0 -249
  258. package/dist/types/responses.js +0 -2
  259. package/docs/GraphQL-API.md +0 -888
  260. package/docs/Migration-Guide-v0.5.0.md +0 -684
  261. package/docs/Roadmap.md +0 -53
  262. package/docs/WebAssembly-Integration.md +0 -628
  263. package/docs/editor-plugin-extension.md +0 -370
  264. package/docs/handler-mapping.md +0 -249
  265. package/docs/native-automation-progress.md +0 -128
  266. package/docs/testing-guide.md +0 -423
  267. package/eslint.config.mjs +0 -68
  268. package/mcp-config-example.json +0 -14
  269. package/plugins/McpAutomationBridge/Config/FilterPlugin.ini +0 -8
  270. package/plugins/McpAutomationBridge/McpAutomationBridge.uplugin +0 -64
  271. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/McpAutomationBridge.Build.cs +0 -189
  272. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.cpp +0 -22
  273. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.h +0 -30
  274. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeHelpers.h +0 -1983
  275. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeModule.cpp +0 -72
  276. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSettings.cpp +0 -46
  277. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSubsystem.cpp +0 -846
  278. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AnimationHandlers.cpp +0 -2393
  279. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetQueryHandlers.cpp +0 -300
  280. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetWorkflowHandlers.cpp +0 -2807
  281. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AudioHandlers.cpp +0 -1087
  282. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BehaviorTreeHandlers.cpp +0 -488
  283. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.cpp +0 -643
  284. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.h +0 -31
  285. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintGraphHandlers.cpp +0 -1094
  286. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers.cpp +0 -5750
  287. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers_List.cpp +0 -152
  288. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ControlHandlers.cpp +0 -2614
  289. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_DebugHandlers.cpp +0 -42
  290. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EditorFunctionHandlers.cpp +0 -1237
  291. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EffectHandlers.cpp +0 -1725
  292. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EnvironmentHandlers.cpp +0 -2265
  293. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_FoliageHandlers.cpp +0 -954
  294. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InputHandlers.cpp +0 -209
  295. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InsightsHandlers.cpp +0 -41
  296. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LandscapeHandlers.cpp +0 -1164
  297. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LevelHandlers.cpp +0 -762
  298. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LightingHandlers.cpp +0 -663
  299. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LogHandlers.cpp +0 -136
  300. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_MaterialGraphHandlers.cpp +0 -494
  301. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraGraphHandlers.cpp +0 -278
  302. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraHandlers.cpp +0 -625
  303. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PerformanceHandlers.cpp +0 -401
  304. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PipelineHandlers.cpp +0 -67
  305. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ProcessRequest.cpp +0 -472
  306. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PropertyHandlers.cpp +0 -2634
  307. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_RenderHandlers.cpp +0 -189
  308. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.cpp +0 -917
  309. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.h +0 -39
  310. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequenceHandlers.cpp +0 -2706
  311. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequencerHandlers.cpp +0 -519
  312. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_TestHandlers.cpp +0 -38
  313. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_UiHandlers.cpp +0 -668
  314. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_WorldPartitionHandlers.cpp +0 -346
  315. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.cpp +0 -1345
  316. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.h +0 -149
  317. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpConnectionManager.cpp +0 -782
  318. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSettings.h +0 -115
  319. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSubsystem.h +0 -796
  320. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpConnectionManager.h +0 -117
  321. package/scripts/check-unreal-connection.mjs +0 -19
  322. package/scripts/clean-tmp.js +0 -23
  323. package/scripts/patch-wasm.js +0 -26
  324. package/scripts/run-all-tests.mjs +0 -136
  325. package/scripts/smoke-test.ts +0 -94
  326. package/scripts/sync-mcp-plugin.js +0 -143
  327. package/scripts/test-no-plugin-alternates.mjs +0 -113
  328. package/scripts/validate-server.js +0 -46
  329. package/scripts/verify-automation-bridge.js +0 -200
  330. package/src/automation/bridge.ts +0 -630
  331. package/src/automation/connection-manager.ts +0 -148
  332. package/src/automation/handshake.ts +0 -99
  333. package/src/automation/index.ts +0 -2
  334. package/src/automation/message-handler.ts +0 -192
  335. package/src/automation/request-tracker.ts +0 -155
  336. package/src/automation/types.ts +0 -108
  337. package/src/cli.ts +0 -34
  338. package/src/config/class-aliases.ts +0 -65
  339. package/src/config.ts +0 -73
  340. package/src/constants.ts +0 -29
  341. package/src/graphql/loaders.ts +0 -244
  342. package/src/graphql/resolvers.ts +0 -1008
  343. package/src/graphql/schema.ts +0 -452
  344. package/src/graphql/server.ts +0 -156
  345. package/src/graphql/types.ts +0 -10
  346. package/src/handlers/resource-handlers.ts +0 -186
  347. package/src/index.ts +0 -243
  348. package/src/resources/actors.ts +0 -127
  349. package/src/resources/assets.ts +0 -286
  350. package/src/resources/levels.ts +0 -68
  351. package/src/server/resource-registry.ts +0 -47
  352. package/src/server/tool-registry.ts +0 -354
  353. package/src/server-setup.ts +0 -114
  354. package/src/services/health-monitor.ts +0 -132
  355. package/src/services/metrics-server.ts +0 -176
  356. package/src/tools/actors.ts +0 -564
  357. package/src/tools/animation.ts +0 -941
  358. package/src/tools/assets.ts +0 -394
  359. package/src/tools/audio.ts +0 -499
  360. package/src/tools/base-tool.ts +0 -52
  361. package/src/tools/behavior-tree.ts +0 -45
  362. package/src/tools/blueprint.ts +0 -940
  363. package/src/tools/consolidated-tool-definitions.ts +0 -1256
  364. package/src/tools/consolidated-tool-handlers.ts +0 -302
  365. package/src/tools/debug.ts +0 -622
  366. package/src/tools/dynamic-handler-registry.ts +0 -33
  367. package/src/tools/editor.ts +0 -435
  368. package/src/tools/engine.ts +0 -43
  369. package/src/tools/environment.ts +0 -281
  370. package/src/tools/foliage.ts +0 -596
  371. package/src/tools/handlers/actor-handlers.ts +0 -244
  372. package/src/tools/handlers/animation-handlers.ts +0 -237
  373. package/src/tools/handlers/argument-helper.ts +0 -142
  374. package/src/tools/handlers/asset-handlers.ts +0 -550
  375. package/src/tools/handlers/audio-handlers.ts +0 -194
  376. package/src/tools/handlers/blueprint-handlers.ts +0 -380
  377. package/src/tools/handlers/common-handlers.ts +0 -108
  378. package/src/tools/handlers/editor-handlers.ts +0 -124
  379. package/src/tools/handlers/effect-handlers.ts +0 -224
  380. package/src/tools/handlers/environment-handlers.ts +0 -183
  381. package/src/tools/handlers/graph-handlers.ts +0 -117
  382. package/src/tools/handlers/input-handlers.ts +0 -28
  383. package/src/tools/handlers/inspect-handlers.ts +0 -450
  384. package/src/tools/handlers/level-handlers.ts +0 -253
  385. package/src/tools/handlers/lighting-handlers.ts +0 -151
  386. package/src/tools/handlers/performance-handlers.ts +0 -132
  387. package/src/tools/handlers/pipeline-handlers.ts +0 -194
  388. package/src/tools/handlers/sequence-handlers.ts +0 -438
  389. package/src/tools/handlers/system-handlers.ts +0 -564
  390. package/src/tools/input.ts +0 -160
  391. package/src/tools/introspection.ts +0 -689
  392. package/src/tools/landscape.ts +0 -649
  393. package/src/tools/level.ts +0 -989
  394. package/src/tools/lighting.ts +0 -1052
  395. package/src/tools/logs.ts +0 -219
  396. package/src/tools/materials.ts +0 -295
  397. package/src/tools/niagara.ts +0 -485
  398. package/src/tools/performance.ts +0 -661
  399. package/src/tools/physics.ts +0 -679
  400. package/src/tools/property-dictionary.ts +0 -98
  401. package/src/tools/sequence.ts +0 -385
  402. package/src/tools/tool-definition-utils.ts +0 -35
  403. package/src/tools/ui.ts +0 -452
  404. package/src/types/automation-responses.ts +0 -119
  405. package/src/types/env.ts +0 -17
  406. package/src/types/handler-types.ts +0 -442
  407. package/src/types/responses.ts +0 -355
  408. package/src/types/tool-interfaces.ts +0 -250
  409. package/src/types/tool-types.ts +0 -575
  410. package/src/unreal-bridge.ts +0 -693
  411. package/src/utils/command-validator.ts +0 -139
  412. package/src/utils/elicitation.ts +0 -132
  413. package/src/utils/error-handler.ts +0 -287
  414. package/src/utils/ini-reader.ts +0 -86
  415. package/src/utils/logger.ts +0 -35
  416. package/src/utils/normalize.test.ts +0 -162
  417. package/src/utils/normalize.ts +0 -146
  418. package/src/utils/path-security.ts +0 -43
  419. package/src/utils/response-factory.ts +0 -44
  420. package/src/utils/response-validator.ts +0 -395
  421. package/src/utils/result-helpers.ts +0 -195
  422. package/src/utils/safe-json.test.ts +0 -90
  423. package/src/utils/safe-json.ts +0 -70
  424. package/src/utils/unreal-command-queue.ts +0 -166
  425. package/src/utils/validation.test.ts +0 -184
  426. package/src/utils/validation.ts +0 -312
  427. package/src/wasm/index.ts +0 -838
  428. package/test-server.mjs +0 -100
  429. package/tests/test-animation.mjs +0 -369
  430. package/tests/test-asset-advanced.mjs +0 -82
  431. package/tests/test-asset-graph.mjs +0 -311
  432. package/tests/test-audio.mjs +0 -417
  433. package/tests/test-automation-timeouts.mjs +0 -98
  434. package/tests/test-behavior-tree.mjs +0 -444
  435. package/tests/test-blueprint-graph.mjs +0 -410
  436. package/tests/test-blueprint.mjs +0 -577
  437. package/tests/test-client-mode.mjs +0 -86
  438. package/tests/test-console-command.mjs +0 -56
  439. package/tests/test-control-actor.mjs +0 -425
  440. package/tests/test-control-editor.mjs +0 -112
  441. package/tests/test-graphql.mjs +0 -372
  442. package/tests/test-input.mjs +0 -349
  443. package/tests/test-inspect.mjs +0 -302
  444. package/tests/test-landscape.mjs +0 -316
  445. package/tests/test-lighting.mjs +0 -428
  446. package/tests/test-manage-asset.mjs +0 -438
  447. package/tests/test-manage-level.mjs +0 -89
  448. package/tests/test-materials.mjs +0 -356
  449. package/tests/test-niagara.mjs +0 -185
  450. package/tests/test-no-inline-python.mjs +0 -122
  451. package/tests/test-performance.mjs +0 -539
  452. package/tests/test-plugin-handshake.mjs +0 -82
  453. package/tests/test-runner.mjs +0 -993
  454. package/tests/test-sequence.mjs +0 -104
  455. package/tests/test-system.mjs +0 -96
  456. package/tests/test-wasm.mjs +0 -283
  457. package/tests/test-world-partition.mjs +0 -215
  458. package/tsconfig.json +0 -56
  459. package/vitest.config.ts +0 -35
  460. package/wasm/Cargo.lock +0 -363
  461. package/wasm/Cargo.toml +0 -42
  462. package/wasm/LICENSE +0 -21
  463. package/wasm/README.md +0 -253
  464. package/wasm/src/dependency_resolver.rs +0 -377
  465. package/wasm/src/lib.rs +0 -153
  466. package/wasm/src/property_parser.rs +0 -271
  467. package/wasm/src/transform_math.rs +0 -396
  468. package/wasm/tests/integration.rs +0 -109
@@ -1,643 +0,0 @@
1
- #include "McpAutomationBridge_BlueprintCreationHandlers.h"
2
- #include "HAL/PlatformTime.h"
3
- #include "McpAutomationBridgeGlobals.h"
4
- #include "McpAutomationBridgeHelpers.h"
5
- #include "McpAutomationBridgeSubsystem.h"
6
- #include "Misc/ScopeExit.h"
7
- #include "Misc/ScopeLock.h"
8
-
9
- #if WITH_EDITOR
10
- #include "AssetRegistry/AssetRegistryModule.h"
11
- #include "AssetToolsModule.h"
12
- #include "Components/ActorComponent.h"
13
- #include "Components/StaticMeshComponent.h"
14
- #include "EditorAssetLibrary.h"
15
- #include "Engine/SCS_Node.h"
16
- #include "Engine/SimpleConstructionScript.h"
17
- #include "Factories/BlueprintFactory.h"
18
- #include "GameFramework/Actor.h"
19
- #include "GameFramework/Character.h"
20
- #include "GameFramework/Pawn.h"
21
- #include "Kismet2/BlueprintEditorUtils.h"
22
- #include "Kismet2/KismetEditorUtilities.h"
23
- #include "UObject/UObjectIterator.h"
24
- #include "UObject/UnrealType.h"
25
-
26
- // Respect build-rule's PublicDefinitions: if the build rule set
27
- // MCP_HAS_SUBOBJECT_DATA_SUBSYSTEM=1 then include the subsystem headers.
28
- #if defined(MCP_HAS_SUBOBJECT_DATA_SUBSYSTEM) && \
29
- (MCP_HAS_SUBOBJECT_DATA_SUBSYSTEM == 1)
30
- #if defined(__has_include)
31
- #if __has_include("Subsystems/SubobjectDataSubsystem.h")
32
- #include "Subsystems/SubobjectDataSubsystem.h"
33
- #elif __has_include("SubobjectDataSubsystem.h")
34
- #include "SubobjectDataSubsystem.h"
35
- #elif __has_include("SubobjectData/SubobjectDataSubsystem.h")
36
- #include "SubobjectData/SubobjectDataSubsystem.h"
37
- #endif
38
- #else
39
- #include "SubobjectDataSubsystem.h"
40
- #endif
41
- #elif !defined(MCP_HAS_SUBOBJECT_DATA_SUBSYSTEM)
42
- // If the build-rule did not define the macro, perform header probing here
43
- // to discover whether the engine exposes SubobjectData headers.
44
- #if defined(__has_include)
45
- #if __has_include("Subsystems/SubobjectDataSubsystem.h")
46
- #include "Subsystems/SubobjectDataSubsystem.h"
47
- #define MCP_HAS_SUBOBJECT_DATA_SUBSYSTEM 1
48
- #elif __has_include("SubobjectDataSubsystem.h")
49
- #include "SubobjectDataSubsystem.h"
50
- #define MCP_HAS_SUBOBJECT_DATA_SUBSYSTEM 1
51
- #elif __has_include("SubobjectData/SubobjectDataSubsystem.h")
52
- #include "SubobjectData/SubobjectDataSubsystem.h"
53
- #define MCP_HAS_SUBOBJECT_DATA_SUBSYSTEM 1
54
- #else
55
- #define MCP_HAS_SUBOBJECT_DATA_SUBSYSTEM 0
56
- #endif
57
- #else
58
- #define MCP_HAS_SUBOBJECT_DATA_SUBSYSTEM 0
59
- #endif
60
- #else
61
- #define MCP_HAS_SUBOBJECT_DATA_SUBSYSTEM 0
62
- #endif
63
-
64
- #endif // WITH_EDITOR
65
-
66
- /**
67
- * @brief Probes subobject handles for a temporary blueprint and returns gathered handles to the requester.
68
- *
69
- * Creates a temporary probe Blueprint, attempts to gather subobject handles via the SubobjectDataSubsystem when available, and falls back to enumerating SimpleConstructionScript nodes when the subsystem is not available. In non-editor builds, sends a NOT_IMPLEMENTED response.
70
- *
71
- * @param Self Pointer to the MCP Automation Bridge subsystem handling the request.
72
- * @param RequestId Identifier for the incoming request; used when sending the response.
73
- * @param LocalPayload JSON payload for the probe request (may include "componentClass").
74
- * @param RequestingSocket WebSocket of the requesting client; may be null for non-socket invocations.
75
- * @return true if the request was handled (a response was sent).
76
- */
77
- bool FBlueprintCreationHandlers::HandleBlueprintProbeSubobjectHandle(
78
- UMcpAutomationBridgeSubsystem *Self, const FString &RequestId,
79
- const TSharedPtr<FJsonObject> &LocalPayload,
80
- TSharedPtr<FMcpBridgeWebSocket> RequestingSocket) {
81
- check(Self);
82
- // Local extraction
83
- FString ComponentClass;
84
- LocalPayload->TryGetStringField(TEXT("componentClass"), ComponentClass);
85
- if (ComponentClass.IsEmpty())
86
- ComponentClass = TEXT("StaticMeshComponent");
87
-
88
- #if WITH_EDITOR
89
- UE_LOG(LogMcpAutomationBridgeSubsystem, Log,
90
- TEXT("HandleBlueprintAction: blueprint_probe_subobject_handle start "
91
- "RequestId=%s componentClass=%s"),
92
- *RequestId, *ComponentClass);
93
-
94
- auto CleanupProbeAsset = [](UBlueprint *ProbeBP) {
95
- #if WITH_EDITOR
96
- if (ProbeBP) {
97
- const FString AssetPath = ProbeBP->GetPathName();
98
- if (!UEditorAssetLibrary::DeleteLoadedAsset(ProbeBP)) {
99
- UE_LOG(LogMcpAutomationBridgeSubsystem, Warning,
100
- TEXT("Failed to delete loaded probe asset: %s"), *AssetPath);
101
- }
102
-
103
- if (!AssetPath.IsEmpty() &&
104
- UEditorAssetLibrary::DoesAssetExist(AssetPath)) {
105
- if (!UEditorAssetLibrary::DeleteAsset(AssetPath)) {
106
- UE_LOG(LogMcpAutomationBridgeSubsystem, Error,
107
- TEXT("Failed to delete probe asset file: %s"), *AssetPath);
108
- }
109
- }
110
- }
111
- #endif
112
- };
113
-
114
- const FString ProbeFolder = TEXT("/Game/Temp/MCPProbe");
115
- const FString ProbeName = FString::Printf(
116
- TEXT("MCP_Probe_%s"), *FGuid::NewGuid().ToString(EGuidFormats::Digits));
117
- UBlueprint *CreatedBP = nullptr;
118
- {
119
- UBlueprintFactory *Factory = NewObject<UBlueprintFactory>();
120
- FAssetToolsModule &AssetToolsModule =
121
- FModuleManager::LoadModuleChecked<FAssetToolsModule>(
122
- TEXT("AssetTools"));
123
- UObject *NewObj = AssetToolsModule.Get().CreateAsset(
124
- ProbeName, ProbeFolder, UBlueprint::StaticClass(), Factory);
125
- if (!NewObj) {
126
- TSharedPtr<FJsonObject> Err = MakeShared<FJsonObject>();
127
- Err->SetStringField(TEXT("componentClass"), ComponentClass);
128
- Err->SetStringField(TEXT("error"),
129
- TEXT("Failed to create probe blueprint asset"));
130
- UE_LOG(LogMcpAutomationBridgeSubsystem, Warning,
131
- TEXT("blueprint_probe_subobject_handle: asset creation failed"));
132
- Self->SendAutomationResponse(RequestingSocket, RequestId, false,
133
- TEXT("Failed to create probe blueprint"),
134
- Err, TEXT("PROBE_CREATE_FAILED"));
135
- return true;
136
- }
137
- CreatedBP = Cast<UBlueprint>(NewObj);
138
- if (!CreatedBP) {
139
- TSharedPtr<FJsonObject> Err = MakeShared<FJsonObject>();
140
- Err->SetStringField(TEXT("componentClass"), ComponentClass);
141
- Err->SetStringField(TEXT("error"),
142
- TEXT("Probe asset was not a Blueprint"));
143
- UE_LOG(
144
- LogMcpAutomationBridgeSubsystem, Warning,
145
- TEXT(
146
- "blueprint_probe_subobject_handle: created asset not blueprint"));
147
- Self->SendAutomationResponse(
148
- RequestingSocket, RequestId, false,
149
- TEXT("Probe asset created was not a Blueprint"), Err,
150
- TEXT("PROBE_CREATE_FAILED"));
151
- CleanupProbeAsset(CreatedBP);
152
- return true;
153
- }
154
- FAssetRegistryModule &Arm =
155
- FModuleManager::LoadModuleChecked<FAssetRegistryModule>(
156
- TEXT("AssetRegistry"));
157
- Arm.Get().AssetCreated(CreatedBP);
158
- }
159
-
160
- TSharedPtr<FJsonObject> ResultObj = MakeShared<FJsonObject>();
161
- ResultObj->SetStringField(TEXT("componentClass"), ComponentClass);
162
- ResultObj->SetBoolField(TEXT("success"), false);
163
- ResultObj->SetBoolField(TEXT("subsystemAvailable"), false);
164
-
165
- #if MCP_HAS_SUBOBJECT_DATA_SUBSYSTEM
166
- if (USubobjectDataSubsystem *Subsystem =
167
- (GEngine ? GEngine->GetEngineSubsystem<USubobjectDataSubsystem>()
168
- : nullptr)) {
169
- ResultObj->SetBoolField(TEXT("subsystemAvailable"), true);
170
-
171
- TArray<FSubobjectDataHandle> GatheredHandles;
172
- Subsystem->K2_GatherSubobjectDataForBlueprint(CreatedBP, GatheredHandles);
173
-
174
- TArray<TSharedPtr<FJsonValue>> HandleJsonArr;
175
- const UScriptStruct *HandleStruct = FSubobjectDataHandle::StaticStruct();
176
- for (int32 Index = 0; Index < GatheredHandles.Num(); ++Index) {
177
- const FSubobjectDataHandle &Handle = GatheredHandles[Index];
178
- FString Repr;
179
- if (HandleStruct) {
180
- Repr = FString::Printf(TEXT("%s@%p"), *HandleStruct->GetName(),
181
- (void *)&Handle);
182
- } else {
183
- Repr = FString::Printf(TEXT("<subobject_handle_%d>"), Index);
184
- }
185
- HandleJsonArr.Add(MakeShared<FJsonValueString>(Repr));
186
- }
187
- ResultObj->SetArrayField(TEXT("gatheredHandles"), HandleJsonArr);
188
- ResultObj->SetBoolField(TEXT("success"), true);
189
-
190
- CleanupProbeAsset(CreatedBP);
191
- Self->SendAutomationResponse(RequestingSocket, RequestId, true,
192
- TEXT("Native probe completed"), ResultObj,
193
- FString());
194
- return true;
195
- }
196
- #endif
197
-
198
- // Subsystem unavailable – fallback to simple SCS enumeration
199
- ResultObj->SetBoolField(TEXT("subsystemAvailable"), false);
200
- TArray<TSharedPtr<FJsonValue>> HandleJsonArr;
201
- if (CreatedBP && CreatedBP->SimpleConstructionScript) {
202
- const TArray<USCS_Node *> &Nodes =
203
- CreatedBP->SimpleConstructionScript->GetAllNodes();
204
- for (USCS_Node *Node : Nodes) {
205
- if (!Node || !Node->GetVariableName().IsValid())
206
- continue;
207
- HandleJsonArr.Add(MakeShared<FJsonValueString>(FString::Printf(
208
- TEXT("scs://%s"), *Node->GetVariableName().ToString())));
209
- }
210
- }
211
- if (HandleJsonArr.Num() == 0) {
212
- HandleJsonArr.Add(
213
- MakeShared<FJsonValueString>(TEXT("<probe_handle_stub>")));
214
- }
215
- ResultObj->SetArrayField(TEXT("gatheredHandles"), HandleJsonArr);
216
- ResultObj->SetBoolField(TEXT("success"), true);
217
-
218
- CleanupProbeAsset(CreatedBP);
219
- Self->SendAutomationResponse(RequestingSocket, RequestId, true,
220
- TEXT("Fallback probe completed"), ResultObj,
221
- FString());
222
- return true;
223
- #else
224
- Self->SendAutomationResponse(RequestingSocket, RequestId, false,
225
- TEXT("Blueprint probe requires editor build."),
226
- nullptr, TEXT("NOT_IMPLEMENTED"));
227
- return true;
228
- #endif // WITH_EDITOR
229
- }
230
-
231
- /**
232
- * @brief Applies JSON-defined property values to a UObject, recursively handling nested object properties.
233
- *
234
- * For each entry in Properties, this function looks up a property on TargetObj by name and sets it:
235
- * - If the property is an object property and the JSON value is an object, the function recurses into that child object.
236
- * - Otherwise JSON primitives (string, number, boolean) are converted to text and applied using ImportText_Direct.
237
- * Unknown property names are silently ignored and no errors are thrown.
238
- *
239
- * @param TargetObj The UObject to modify. No action is performed if null.
240
- * @param Properties JSON object mapping property names to values; nested JSON objects map to subobjects/components.
241
- */
242
- static void ApplyPropertiesToObject(UObject *TargetObj,
243
- const TSharedPtr<FJsonObject> &Properties) {
244
- if (!TargetObj || !Properties.IsValid()) {
245
- return;
246
- }
247
-
248
- for (const auto &Pair : Properties->Values) {
249
- FProperty *Property = TargetObj->GetClass()->FindPropertyByName(*Pair.Key);
250
- if (!Property) {
251
- continue;
252
- }
253
-
254
- // 1. Handle Object Properties (Recursion for Components/Subobjects)
255
- if (FObjectProperty *ObjProp = CastField<FObjectProperty>(Property)) {
256
- if (Pair.Value->Type == EJson::Object) {
257
- // This is likely a component or subobject property we want to edit
258
- // inline
259
- UObject *ChildObj =
260
- ObjProp->GetObjectPropertyValue_InContainer(TargetObj);
261
- if (ChildObj) {
262
- ApplyPropertiesToObject(ChildObj, Pair.Value->AsObject());
263
- }
264
- continue;
265
- }
266
- }
267
-
268
- // 2. Handle generic property setting via text import
269
- FString TextValue;
270
-
271
- if (Pair.Value->Type == EJson::String) {
272
- TextValue = Pair.Value->AsString();
273
- } else if (Pair.Value->Type == EJson::Number) {
274
- double Val = Pair.Value->AsNumber();
275
- // Heuristic: check if target is integer to avoid floating point syntax
276
- // issues if any
277
- if (Property->IsA<FIntProperty>() || Property->IsA<FInt64Property>() ||
278
- Property->IsA<FByteProperty>()) {
279
- TextValue = FString::Printf(TEXT("%lld"), (long long)Val);
280
- } else {
281
- TextValue = FString::SanitizeFloat(Val);
282
- }
283
- } else if (Pair.Value->Type == EJson::Boolean) {
284
- TextValue = Pair.Value->AsBool() ? TEXT("True") : TEXT("False");
285
- }
286
-
287
- if (!TextValue.IsEmpty()) {
288
- Property->ImportText_Direct(
289
- *TextValue, Property->ContainerPtrToValuePtr<void>(TargetObj),
290
- TargetObj, 0);
291
- }
292
- }
293
- }
294
-
295
- /**
296
- * @brief Create a new Blueprint asset from the provided payload and send a completion response to the requester (coalesces concurrent requests for the same path).
297
- *
298
- * Expected payload fields:
299
- * - "name" (string, required): asset name.
300
- * - "savePath" (string, optional, default "/Game"): destination folder.
301
- * - "parentClass" (string, optional): class path or name used as the Blueprint parent.
302
- * - "blueprintType" (string, optional): hint like "actor", "pawn", or "character" used when parent class is not resolved.
303
- * - "properties" (object, optional): JSON object of CDO properties to apply to the generated class default object.
304
- * - "waitForCompletion" (bool, optional): whether the caller intends to wait for completion (affects coalescing behavior).
305
- *
306
- * Behavior notes:
307
- * - Multiple concurrent requests that target the same SavePath/Name are coalesced so all waiters receive the same completion result.
308
- * - In editor builds, attempts to create the Blueprint (or returns an existing asset if present), applies optional CDO properties, registers the asset with the Asset Registry, and attempts to ensure asset availability (save/scan).
309
- * - In non-editor builds, responds with NOT_IMPLEMENTED indicating blueprint creation requires an editor build.
310
- *
311
- * @param Self Subsystem instance used to send responses and perform subsystem operations.
312
- * @param RequestId Identifier for the request; included in the completion response.
313
- * @param LocalPayload JSON payload describing the blueprint to create (see Expected payload fields above).
314
- * @param RequestingSocket Optional socket to which the immediate response should be sent; coalesced waiters will also be notified.
315
- * @return true if the request was handled and a response was sent to the requester (or coalesced waiters).
316
- */
317
- bool FBlueprintCreationHandlers::HandleBlueprintCreate(
318
- UMcpAutomationBridgeSubsystem *Self, const FString &RequestId,
319
- const TSharedPtr<FJsonObject> &LocalPayload,
320
- TSharedPtr<FMcpBridgeWebSocket> RequestingSocket) {
321
- check(Self);
322
- UE_LOG(LogMcpAutomationBridgeSubsystem, Log,
323
- TEXT("HandleBlueprintCreate ENTRY: RequestId=%s"), *RequestId);
324
-
325
- FString Name;
326
- LocalPayload->TryGetStringField(TEXT("name"), Name);
327
- if (Name.TrimStartAndEnd().IsEmpty()) {
328
- Self->SendAutomationResponse(RequestingSocket, RequestId, false,
329
- TEXT("blueprint_create requires a name."),
330
- nullptr, TEXT("INVALID_ARGUMENT"));
331
- return true;
332
- }
333
- FString SavePath;
334
- LocalPayload->TryGetStringField(TEXT("savePath"), SavePath);
335
- if (SavePath.TrimStartAndEnd().IsEmpty())
336
- SavePath = TEXT("/Game");
337
- FString ParentClassSpec;
338
- LocalPayload->TryGetStringField(TEXT("parentClass"), ParentClassSpec);
339
- FString BlueprintTypeSpec;
340
- LocalPayload->TryGetStringField(TEXT("blueprintType"), BlueprintTypeSpec);
341
- const double Now = FPlatformTime::Seconds();
342
- const FString CreateKey = FString::Printf(TEXT("%s/%s"), *SavePath, *Name);
343
-
344
- // Check if client wants to wait for completion
345
- bool bWaitForCompletion = false;
346
- LocalPayload->TryGetBoolField(TEXT("waitForCompletion"), bWaitForCompletion);
347
- UE_LOG(
348
- LogMcpAutomationBridgeSubsystem, Log,
349
- TEXT("HandleBlueprintCreate: name=%s, savePath=%s, waitForCompletion=%s"),
350
- *Name, *SavePath, bWaitForCompletion ? TEXT("true") : TEXT("false"));
351
-
352
- // Track in-flight requests regardless so all waiters receive completion
353
- {
354
- FScopeLock Lock(&GBlueprintCreateMutex);
355
- if (GBlueprintCreateInflight.Contains(CreateKey)) {
356
- GBlueprintCreateInflight[CreateKey].Add(
357
- TPair<FString, TSharedPtr<FMcpBridgeWebSocket>>(RequestId,
358
- RequestingSocket));
359
- UE_LOG(LogMcpAutomationBridgeSubsystem, Log,
360
- TEXT("HandleBlueprintCreate: Coalescing request %s for %s"),
361
- *RequestId, *CreateKey);
362
- return true;
363
- }
364
-
365
- GBlueprintCreateInflight.Add(
366
- CreateKey, TArray<TPair<FString, TSharedPtr<FMcpBridgeWebSocket>>>());
367
- GBlueprintCreateInflightTs.Add(CreateKey, Now);
368
- GBlueprintCreateInflight[CreateKey].Add(
369
- TPair<FString, TSharedPtr<FMcpBridgeWebSocket>>(RequestId,
370
- RequestingSocket));
371
- }
372
-
373
- #if WITH_EDITOR
374
- // Perform real creation (editor only)
375
- UE_LOG(LogMcpAutomationBridgeSubsystem, Log,
376
- TEXT("HandleBlueprintCreate: Starting blueprint creation "
377
- "(WITH_EDITOR=1)"));
378
- UBlueprint *CreatedBlueprint = nullptr;
379
- FString CreatedNormalizedPath;
380
- FString CreationError;
381
-
382
- // Check if asset already exists to avoid "Overwrite" dialogs which can crash
383
- // the editor/driver
384
- FString PreExistingNormalized;
385
- FString PreExistingError;
386
- if (UBlueprint *PreExistingBP = LoadBlueprintAsset(
387
- CreateKey, PreExistingNormalized, PreExistingError)) {
388
- CreatedBlueprint = PreExistingBP;
389
- CreatedNormalizedPath = !PreExistingNormalized.TrimStartAndEnd().IsEmpty()
390
- ? PreExistingNormalized
391
- : PreExistingBP->GetPathName();
392
- if (CreatedNormalizedPath.Contains(TEXT("."))) {
393
- CreatedNormalizedPath =
394
- CreatedNormalizedPath.Left(CreatedNormalizedPath.Find(TEXT(".")));
395
- }
396
-
397
- TSharedPtr<FJsonObject> ResultPayload = MakeShared<FJsonObject>();
398
- ResultPayload->SetStringField(TEXT("path"), CreatedNormalizedPath);
399
- ResultPayload->SetStringField(TEXT("assetPath"),
400
- PreExistingBP->GetPathName());
401
- ResultPayload->SetBoolField(TEXT("saved"), true);
402
-
403
- FScopeLock Lock(&GBlueprintCreateMutex);
404
- if (TArray<TPair<FString, TSharedPtr<FMcpBridgeWebSocket>>> *Subs =
405
- GBlueprintCreateInflight.Find(CreateKey)) {
406
- for (const TPair<FString, TSharedPtr<FMcpBridgeWebSocket>> &Pair :
407
- *Subs) {
408
- Self->SendAutomationResponse(Pair.Value, Pair.Key, true,
409
- TEXT("Blueprint already exists"),
410
- ResultPayload, FString());
411
- }
412
- GBlueprintCreateInflight.Remove(CreateKey);
413
- GBlueprintCreateInflightTs.Remove(CreateKey);
414
- UE_LOG(LogMcpAutomationBridgeSubsystem, Log,
415
- TEXT("blueprint_create RequestId=%s completed (existing blueprint "
416
- "found early)."),
417
- *RequestId);
418
- } else {
419
- Self->SendAutomationResponse(RequestingSocket, RequestId, true,
420
- TEXT("Blueprint already exists"),
421
- ResultPayload, FString());
422
- }
423
-
424
- return true;
425
- }
426
-
427
- UBlueprintFactory *Factory = NewObject<UBlueprintFactory>();
428
- UClass *ResolvedParent = nullptr;
429
- if (!ParentClassSpec.IsEmpty()) {
430
- if (ParentClassSpec.StartsWith(TEXT("/Script/"))) {
431
- ResolvedParent = LoadClass<UObject>(nullptr, *ParentClassSpec);
432
- } else {
433
- ResolvedParent = FindObject<UClass>(nullptr, *ParentClassSpec);
434
- // Avoid calling StaticLoadClass on a bare short name like "Actor" which
435
- // can generate engine warnings (e.g., "Class None.Actor"). For short
436
- // names, try common /Script prefixes instead.
437
- const bool bLooksPathLike = ParentClassSpec.Contains(TEXT("/")) ||
438
- ParentClassSpec.Contains(TEXT("."));
439
- if (!ResolvedParent && bLooksPathLike) {
440
- ResolvedParent =
441
- StaticLoadClass(UObject::StaticClass(), nullptr, *ParentClassSpec);
442
- }
443
- if (!ResolvedParent && !bLooksPathLike) {
444
- const TArray<FString> PrefixGuesses = {
445
- FString::Printf(TEXT("/Script/Engine.%s"), *ParentClassSpec),
446
- FString::Printf(TEXT("/Script/GameFramework.%s"), *ParentClassSpec),
447
- FString::Printf(TEXT("/Script/CoreUObject.%s"), *ParentClassSpec)};
448
- for (const FString &Guess : PrefixGuesses) {
449
- UClass *Loaded = FindObject<UClass>(nullptr, *Guess);
450
- if (!Loaded) {
451
- Loaded = StaticLoadClass(UObject::StaticClass(), nullptr, *Guess);
452
- }
453
- if (Loaded) {
454
- ResolvedParent = Loaded;
455
- break;
456
- }
457
- }
458
- }
459
- if (!ResolvedParent) {
460
- for (TObjectIterator<UClass> It; It; ++It) {
461
- UClass *C = *It;
462
- if (!C)
463
- continue;
464
- if (C->GetName().Equals(ParentClassSpec, ESearchCase::IgnoreCase)) {
465
- ResolvedParent = C;
466
- break;
467
- }
468
- }
469
- }
470
- }
471
- }
472
- if (!ResolvedParent && !BlueprintTypeSpec.IsEmpty()) {
473
- const FString LowerType = BlueprintTypeSpec.ToLower();
474
- if (LowerType == TEXT("actor"))
475
- ResolvedParent = AActor::StaticClass();
476
- else if (LowerType == TEXT("pawn"))
477
- ResolvedParent = APawn::StaticClass();
478
- else if (LowerType == TEXT("character"))
479
- ResolvedParent = ACharacter::StaticClass();
480
- }
481
- if (ResolvedParent)
482
- Factory->ParentClass = ResolvedParent;
483
- else
484
- Factory->ParentClass = AActor::StaticClass();
485
-
486
- FAssetToolsModule &AssetToolsModule =
487
- FModuleManager::LoadModuleChecked<FAssetToolsModule>(TEXT("AssetTools"));
488
- UObject *NewObj = AssetToolsModule.Get().CreateAsset(
489
- Name, SavePath, UBlueprint::StaticClass(), Factory);
490
- if (NewObj) {
491
- UE_LOG(LogMcpAutomationBridgeSubsystem, Log,
492
- TEXT("CreateAsset returned object: name=%s path=%s class=%s"),
493
- *NewObj->GetName(), *NewObj->GetPathName(),
494
- *NewObj->GetClass()->GetName());
495
- }
496
-
497
- CreatedBlueprint = Cast<UBlueprint>(NewObj);
498
-
499
- // Apply optional CDO properties immediately if provided
500
- if (CreatedBlueprint && CreatedBlueprint->GeneratedClass) {
501
- const TSharedPtr<FJsonObject> *PropertiesPtr;
502
- if (LocalPayload->TryGetObjectField(TEXT("properties"), PropertiesPtr)) {
503
- UObject *CDO = CreatedBlueprint->GeneratedClass->GetDefaultObject();
504
- if (CDO) {
505
- ApplyPropertiesToObject(CDO, *PropertiesPtr);
506
- // Mark dirty
507
- CreatedBlueprint->Modify();
508
- }
509
- }
510
- }
511
-
512
- if (!CreatedBlueprint) {
513
- // If creation failed, check whether a Blueprint already exists at the
514
- // target path. AssetTools will return nullptr when an asset with the
515
- // same name already exists; in that case we should treat this as an
516
- // idempotent success instead of a hard failure.
517
- FString ExistingNormalized;
518
- FString ExistingError;
519
- UBlueprint *ExistingBP =
520
- LoadBlueprintAsset(CreateKey, ExistingNormalized, ExistingError);
521
- if (ExistingBP) {
522
- CreatedBlueprint = ExistingBP;
523
- CreatedNormalizedPath = !ExistingNormalized.TrimStartAndEnd().IsEmpty()
524
- ? ExistingNormalized
525
- : ExistingBP->GetPathName();
526
- if (CreatedNormalizedPath.Contains(TEXT("."))) {
527
- CreatedNormalizedPath =
528
- CreatedNormalizedPath.Left(CreatedNormalizedPath.Find(TEXT(".")));
529
- }
530
-
531
- TSharedPtr<FJsonObject> ResultPayload = MakeShared<FJsonObject>();
532
- ResultPayload->SetStringField(TEXT("path"), CreatedNormalizedPath);
533
- ResultPayload->SetStringField(TEXT("assetPath"),
534
- ExistingBP->GetPathName());
535
- ResultPayload->SetBoolField(TEXT("saved"), true);
536
-
537
- FScopeLock Lock(&GBlueprintCreateMutex);
538
- if (TArray<TPair<FString, TSharedPtr<FMcpBridgeWebSocket>>> *Subs =
539
- GBlueprintCreateInflight.Find(CreateKey)) {
540
- for (const TPair<FString, TSharedPtr<FMcpBridgeWebSocket>> &Pair :
541
- *Subs) {
542
- Self->SendAutomationResponse(Pair.Value, Pair.Key, true,
543
- TEXT("Blueprint already exists"),
544
- ResultPayload, FString());
545
- }
546
- GBlueprintCreateInflight.Remove(CreateKey);
547
- GBlueprintCreateInflightTs.Remove(CreateKey);
548
- UE_LOG(LogMcpAutomationBridgeSubsystem, Log,
549
- TEXT("blueprint_create RequestId=%s completed (existing "
550
- "blueprint)."),
551
- *RequestId);
552
- } else {
553
- Self->SendAutomationResponse(RequestingSocket, RequestId, true,
554
- TEXT("Blueprint already exists"),
555
- ResultPayload, FString());
556
- }
557
-
558
- return true;
559
- }
560
-
561
- CreationError =
562
- FString::Printf(TEXT("Created asset is not a Blueprint: %s"),
563
- NewObj ? *NewObj->GetPathName() : TEXT("<null>"));
564
-
565
- {
566
- FScopeLock Lock(&GBlueprintCreateMutex);
567
- if (TArray<TPair<FString, TSharedPtr<FMcpBridgeWebSocket>>> *Subs =
568
- GBlueprintCreateInflight.Find(CreateKey)) {
569
- for (const TPair<FString, TSharedPtr<FMcpBridgeWebSocket>> &Pair :
570
- *Subs) {
571
- Self->SendAutomationResponse(Pair.Value, Pair.Key, false,
572
- CreationError, nullptr,
573
- TEXT("CREATE_FAILED"));
574
- }
575
- GBlueprintCreateInflight.Remove(CreateKey);
576
- GBlueprintCreateInflightTs.Remove(CreateKey);
577
- } else {
578
- Self->SendAutomationResponse(RequestingSocket, RequestId, false,
579
- CreationError, nullptr,
580
- TEXT("CREATE_FAILED"));
581
- }
582
- }
583
- return true;
584
- }
585
-
586
- CreatedNormalizedPath = CreatedBlueprint->GetPathName();
587
- if (CreatedNormalizedPath.Contains(TEXT(".")))
588
- CreatedNormalizedPath =
589
- CreatedNormalizedPath.Left(CreatedNormalizedPath.Find(TEXT(".")));
590
- FAssetRegistryModule &AssetRegistryModule =
591
- FModuleManager::LoadModuleChecked<FAssetRegistryModule>(
592
- TEXT("AssetRegistry"));
593
- AssetRegistryModule.AssetCreated(CreatedBlueprint);
594
-
595
- TSharedPtr<FJsonObject> ResultPayload = MakeShared<FJsonObject>();
596
- ResultPayload->SetStringField(TEXT("path"), CreatedNormalizedPath);
597
- ResultPayload->SetStringField(TEXT("assetPath"),
598
- CreatedBlueprint->GetPathName());
599
- ResultPayload->SetBoolField(TEXT("saved"), true);
600
- FScopeLock Lock(&GBlueprintCreateMutex);
601
- if (TArray<TPair<FString, TSharedPtr<FMcpBridgeWebSocket>>> *Subs =
602
- GBlueprintCreateInflight.Find(CreateKey)) {
603
- for (const TPair<FString, TSharedPtr<FMcpBridgeWebSocket>> &Pair : *Subs) {
604
- Self->SendAutomationResponse(Pair.Value, Pair.Key, true,
605
- TEXT("Blueprint created"), ResultPayload,
606
- FString());
607
- }
608
- GBlueprintCreateInflight.Remove(CreateKey);
609
- GBlueprintCreateInflightTs.Remove(CreateKey);
610
- UE_LOG(LogMcpAutomationBridgeSubsystem, Log,
611
- TEXT("blueprint_create RequestId=%s completed (coalesced)."),
612
- *RequestId);
613
- } else {
614
- Self->SendAutomationResponse(RequestingSocket, RequestId, true,
615
- TEXT("Blueprint created"), ResultPayload,
616
- FString());
617
- }
618
-
619
- TWeakObjectPtr<UBlueprint> WeakCreatedBp = CreatedBlueprint;
620
- if (WeakCreatedBp.IsValid()) {
621
- UBlueprint *BP = WeakCreatedBp.Get();
622
- #if WITH_EDITOR
623
- // Force immediate save and registry scan to ensure availability
624
- SaveLoadedAssetThrottled(BP, -1.0, true);
625
- ScanPathSynchronous(BP->GetOutermost()->GetName());
626
- #endif
627
- }
628
-
629
- UE_LOG(LogMcpAutomationBridgeSubsystem, Log,
630
- TEXT("HandleBlueprintCreate EXIT: RequestId=%s created successfully"),
631
- *RequestId);
632
- return true;
633
- #else
634
- UE_LOG(LogMcpAutomationBridgeSubsystem, Warning,
635
- TEXT("HandleBlueprintCreate: WITH_EDITOR not defined - cannot create "
636
- "blueprints"));
637
- Self->SendAutomationResponse(
638
- RequestingSocket, RequestId, false,
639
- TEXT("Blueprint creation requires editor build."), nullptr,
640
- TEXT("NOT_IMPLEMENTED"));
641
- return true;
642
- #endif
643
- }
@@ -1,31 +0,0 @@
1
- #pragma once
2
-
3
- #include "CoreMinimal.h"
4
- #include "Dom/JsonObject.h"
5
-
6
- class UMcpAutomationBridgeSubsystem;
7
- class FMcpBridgeWebSocket;
8
-
9
- /**
10
- * Handle a request to create or instantiate a Blueprint asset or Blueprint-derived object described in the payload.
11
- * @param Self Pointer to the MCP automation bridge subsystem processing the request.
12
- * @param RequestId Correlation identifier for the incoming request/response.
13
- * @param LocalPayload JSON object containing the blueprint creation parameters and metadata.
14
- * @param RequestingSocket WebSocket that originated the request (may be null).
15
- * @returns `true` if the request was parsed and processing was initiated successfully, `false` otherwise.
16
- */
17
-
18
- /**
19
- * Handle a request that probes for a handle or reference to a subobject inside a Blueprint instance.
20
- * @param Self Pointer to the MCP automation bridge subsystem processing the request.
21
- * @param RequestId Correlation identifier for the incoming request/response.
22
- * @param LocalPayload JSON object containing the probe parameters (target blueprint instance and subobject identifiers).
23
- * @param RequestingSocket WebSocket that originated the request (may be null).
24
- * @returns `true` if the probe request was parsed and processing was initiated successfully, `false` otherwise.
25
- */
26
- class FBlueprintCreationHandlers
27
- {
28
- public:
29
- static bool HandleBlueprintCreate(UMcpAutomationBridgeSubsystem* Self, const FString& RequestId, const TSharedPtr<FJsonObject>& LocalPayload, TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
30
- static bool HandleBlueprintProbeSubobjectHandle(UMcpAutomationBridgeSubsystem* Self, const FString& RequestId, const TSharedPtr<FJsonObject>& LocalPayload, TSharedPtr<FMcpBridgeWebSocket> RequestingSocket);
31
- };