unreal-engine-mcp-server 0.5.4 → 0.5.6

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 (561) hide show
  1. package/CHANGELOG.md +350 -0
  2. package/dist/automation/bridge.d.ts.map +1 -0
  3. package/dist/automation/bridge.js +5 -4
  4. package/dist/automation/bridge.js.map +1 -0
  5. package/dist/automation/connection-manager.d.ts.map +1 -0
  6. package/dist/automation/connection-manager.js.map +1 -0
  7. package/dist/automation/handshake.d.ts.map +1 -0
  8. package/dist/automation/handshake.js.map +1 -0
  9. package/dist/automation/index.d.ts.map +1 -0
  10. package/dist/automation/index.js.map +1 -0
  11. package/dist/automation/message-handler.d.ts.map +1 -0
  12. package/dist/automation/message-handler.js.map +1 -0
  13. package/dist/automation/request-tracker.d.ts.map +1 -0
  14. package/dist/automation/request-tracker.js.map +1 -0
  15. package/dist/automation/types.d.ts +7 -0
  16. package/dist/automation/types.d.ts.map +1 -0
  17. package/dist/automation/types.js.map +1 -0
  18. package/dist/cli.d.ts.map +1 -0
  19. package/dist/cli.js +6 -4
  20. package/dist/cli.js.map +1 -0
  21. package/dist/config/class-aliases.d.ts.map +1 -0
  22. package/dist/config/class-aliases.js.map +1 -0
  23. package/dist/config.d.ts.map +1 -0
  24. package/dist/config.js.map +1 -0
  25. package/dist/constants.d.ts.map +1 -0
  26. package/dist/constants.js.map +1 -0
  27. package/dist/graphql/loaders.d.ts.map +1 -0
  28. package/dist/graphql/loaders.js.map +1 -0
  29. package/dist/graphql/resolvers.d.ts +174 -69
  30. package/dist/graphql/resolvers.d.ts.map +1 -0
  31. package/dist/graphql/resolvers.js +82 -67
  32. package/dist/graphql/resolvers.js.map +1 -0
  33. package/dist/graphql/schema.d.ts.map +1 -0
  34. package/dist/graphql/schema.js.map +1 -0
  35. package/dist/graphql/server.d.ts.map +1 -0
  36. package/dist/graphql/server.js.map +1 -0
  37. package/dist/graphql/types.d.ts.map +1 -0
  38. package/dist/graphql/types.js.map +1 -0
  39. package/dist/handlers/resource-handlers.d.ts.map +1 -0
  40. package/dist/handlers/resource-handlers.js.map +1 -0
  41. package/dist/index.d.ts +2 -1
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +70 -9
  44. package/dist/index.js.map +1 -0
  45. package/dist/resources/actors.d.ts +7 -4
  46. package/dist/resources/actors.d.ts.map +1 -0
  47. package/dist/resources/actors.js +15 -12
  48. package/dist/resources/actors.js.map +1 -0
  49. package/dist/resources/assets.d.ts +43 -2
  50. package/dist/resources/assets.d.ts.map +1 -0
  51. package/dist/resources/assets.js +21 -12
  52. package/dist/resources/assets.js.map +1 -0
  53. package/dist/resources/levels.d.ts.map +1 -0
  54. package/dist/resources/levels.js +7 -5
  55. package/dist/resources/levels.js.map +1 -0
  56. package/dist/schemas/index.d.ts +4 -0
  57. package/dist/schemas/index.d.ts.map +1 -0
  58. package/dist/schemas/index.js +4 -0
  59. package/dist/schemas/index.js.map +1 -0
  60. package/dist/schemas/parser.d.ts +20 -0
  61. package/dist/schemas/parser.d.ts.map +1 -0
  62. package/dist/schemas/parser.js +61 -0
  63. package/dist/schemas/parser.js.map +1 -0
  64. package/dist/schemas/primitives.d.ts +221 -0
  65. package/dist/schemas/primitives.d.ts.map +1 -0
  66. package/dist/schemas/primitives.js +115 -0
  67. package/dist/schemas/primitives.js.map +1 -0
  68. package/dist/schemas/responses.d.ts +362 -0
  69. package/dist/schemas/responses.d.ts.map +1 -0
  70. package/dist/schemas/responses.js +252 -0
  71. package/dist/schemas/responses.js.map +1 -0
  72. package/dist/server/resource-registry.d.ts.map +1 -0
  73. package/dist/server/resource-registry.js.map +1 -0
  74. package/dist/server/tool-registry.d.ts.map +1 -0
  75. package/dist/server/tool-registry.js +22 -17
  76. package/dist/server/tool-registry.js.map +1 -0
  77. package/dist/server-setup.d.ts.map +1 -0
  78. package/dist/server-setup.js.map +1 -0
  79. package/dist/services/health-monitor.d.ts +1 -1
  80. package/dist/services/health-monitor.d.ts.map +1 -0
  81. package/dist/services/health-monitor.js +4 -3
  82. package/dist/services/health-monitor.js.map +1 -0
  83. package/dist/services/metrics-server.d.ts.map +1 -0
  84. package/dist/services/metrics-server.js.map +1 -0
  85. package/dist/tools/actors.d.ts +27 -27
  86. package/dist/tools/actors.d.ts.map +1 -0
  87. package/dist/tools/actors.js +14 -10
  88. package/dist/tools/actors.js.map +1 -0
  89. package/dist/tools/animation.d.ts +15 -23
  90. package/dist/tools/animation.d.ts.map +1 -0
  91. package/dist/tools/animation.js +17 -13
  92. package/dist/tools/animation.js.map +1 -0
  93. package/dist/tools/assets.d.ts.map +1 -0
  94. package/dist/tools/assets.js +18 -12
  95. package/dist/tools/assets.js.map +1 -0
  96. package/dist/tools/audio.d.ts +10 -10
  97. package/dist/tools/audio.d.ts.map +1 -0
  98. package/dist/tools/audio.js.map +1 -0
  99. package/dist/tools/base-tool.d.ts.map +1 -0
  100. package/dist/tools/base-tool.js.map +1 -0
  101. package/dist/tools/behavior-tree.d.ts +24 -24
  102. package/dist/tools/behavior-tree.d.ts.map +1 -0
  103. package/dist/tools/behavior-tree.js.map +1 -0
  104. package/dist/tools/blueprint.d.ts +14 -3
  105. package/dist/tools/blueprint.d.ts.map +1 -0
  106. package/dist/tools/blueprint.js +5 -3
  107. package/dist/tools/blueprint.js.map +1 -0
  108. package/dist/tools/consolidated-tool-definitions.d.ts +32 -32
  109. package/dist/tools/consolidated-tool-definitions.d.ts.map +1 -0
  110. package/dist/tools/consolidated-tool-definitions.js.map +1 -0
  111. package/dist/tools/consolidated-tool-handlers.d.ts +1 -1
  112. package/dist/tools/consolidated-tool-handlers.d.ts.map +1 -0
  113. package/dist/tools/consolidated-tool-handlers.js +26 -21
  114. package/dist/tools/consolidated-tool-handlers.js.map +1 -0
  115. package/dist/tools/debug.d.ts +25 -7
  116. package/dist/tools/debug.d.ts.map +1 -0
  117. package/dist/tools/debug.js +3 -1
  118. package/dist/tools/debug.js.map +1 -0
  119. package/dist/tools/dynamic-handler-registry.d.ts +1 -1
  120. package/dist/tools/dynamic-handler-registry.d.ts.map +1 -0
  121. package/dist/tools/dynamic-handler-registry.js +3 -1
  122. package/dist/tools/dynamic-handler-registry.js.map +1 -0
  123. package/dist/tools/editor.d.ts.map +1 -0
  124. package/dist/tools/editor.js +8 -6
  125. package/dist/tools/editor.js.map +1 -0
  126. package/dist/tools/engine.d.ts +1 -1
  127. package/dist/tools/engine.d.ts.map +1 -0
  128. package/dist/tools/engine.js +4 -2
  129. package/dist/tools/engine.js.map +1 -0
  130. package/dist/tools/environment.d.ts.map +1 -0
  131. package/dist/tools/environment.js +4 -3
  132. package/dist/tools/environment.js.map +1 -0
  133. package/dist/tools/foliage.d.ts.map +1 -0
  134. package/dist/tools/foliage.js +8 -8
  135. package/dist/tools/foliage.js.map +1 -0
  136. package/dist/tools/handlers/actor-handlers.d.ts +2 -1
  137. package/dist/tools/handlers/actor-handlers.d.ts.map +1 -0
  138. package/dist/tools/handlers/actor-handlers.js +56 -33
  139. package/dist/tools/handlers/actor-handlers.js.map +1 -0
  140. package/dist/tools/handlers/animation-handlers.d.ts +2 -1
  141. package/dist/tools/handlers/animation-handlers.d.ts.map +1 -0
  142. package/dist/tools/handlers/animation-handlers.js +74 -67
  143. package/dist/tools/handlers/animation-handlers.js.map +1 -0
  144. package/dist/tools/handlers/argument-helper.d.ts +24 -4
  145. package/dist/tools/handlers/argument-helper.d.ts.map +1 -0
  146. package/dist/tools/handlers/argument-helper.js +139 -4
  147. package/dist/tools/handlers/argument-helper.js.map +1 -0
  148. package/dist/tools/handlers/asset-handlers.d.ts +2 -1
  149. package/dist/tools/handlers/asset-handlers.d.ts.map +1 -0
  150. package/dist/tools/handlers/asset-handlers.js +155 -94
  151. package/dist/tools/handlers/asset-handlers.js.map +1 -0
  152. package/dist/tools/handlers/audio-handlers.d.ts +2 -1
  153. package/dist/tools/handlers/audio-handlers.d.ts.map +1 -0
  154. package/dist/tools/handlers/audio-handlers.js +82 -80
  155. package/dist/tools/handlers/audio-handlers.js.map +1 -0
  156. package/dist/tools/handlers/blueprint-handlers.d.ts +3 -5
  157. package/dist/tools/handlers/blueprint-handlers.d.ts.map +1 -0
  158. package/dist/tools/handlers/blueprint-handlers.js +150 -142
  159. package/dist/tools/handlers/blueprint-handlers.js.map +1 -0
  160. package/dist/tools/handlers/common-handlers.d.ts +2 -3
  161. package/dist/tools/handlers/common-handlers.d.ts.map +1 -0
  162. package/dist/tools/handlers/common-handlers.js.map +1 -0
  163. package/dist/tools/handlers/editor-handlers.d.ts.map +1 -0
  164. package/dist/tools/handlers/editor-handlers.js +12 -2
  165. package/dist/tools/handlers/editor-handlers.js.map +1 -0
  166. package/dist/tools/handlers/effect-handlers.d.ts +2 -1
  167. package/dist/tools/handlers/effect-handlers.d.ts.map +1 -0
  168. package/dist/tools/handlers/effect-handlers.js +70 -68
  169. package/dist/tools/handlers/effect-handlers.js.map +1 -0
  170. package/dist/tools/handlers/environment-handlers.d.ts +2 -1
  171. package/dist/tools/handlers/environment-handlers.d.ts.map +1 -0
  172. package/dist/tools/handlers/environment-handlers.js +86 -74
  173. package/dist/tools/handlers/environment-handlers.js.map +1 -0
  174. package/dist/tools/handlers/graph-handlers.d.ts +1 -1
  175. package/dist/tools/handlers/graph-handlers.d.ts.map +1 -0
  176. package/dist/tools/handlers/graph-handlers.js +63 -2
  177. package/dist/tools/handlers/graph-handlers.js.map +1 -0
  178. package/dist/tools/handlers/input-handlers.d.ts +2 -5
  179. package/dist/tools/handlers/input-handlers.d.ts.map +1 -0
  180. package/dist/tools/handlers/input-handlers.js +5 -4
  181. package/dist/tools/handlers/input-handlers.js.map +1 -0
  182. package/dist/tools/handlers/inspect-handlers.d.ts +2 -1
  183. package/dist/tools/handlers/inspect-handlers.d.ts.map +1 -0
  184. package/dist/tools/handlers/inspect-handlers.js +61 -37
  185. package/dist/tools/handlers/inspect-handlers.js.map +1 -0
  186. package/dist/tools/handlers/level-handlers.d.ts +2 -2
  187. package/dist/tools/handlers/level-handlers.d.ts.map +1 -0
  188. package/dist/tools/handlers/level-handlers.js +43 -39
  189. package/dist/tools/handlers/level-handlers.js.map +1 -0
  190. package/dist/tools/handlers/lighting-handlers.d.ts +12 -1
  191. package/dist/tools/handlers/lighting-handlers.d.ts.map +1 -0
  192. package/dist/tools/handlers/lighting-handlers.js +90 -47
  193. package/dist/tools/handlers/lighting-handlers.js.map +1 -0
  194. package/dist/tools/handlers/performance-handlers.d.ts +2 -1
  195. package/dist/tools/handlers/performance-handlers.d.ts.map +1 -0
  196. package/dist/tools/handlers/performance-handlers.js +55 -40
  197. package/dist/tools/handlers/performance-handlers.js.map +1 -0
  198. package/dist/tools/handlers/pipeline-handlers.d.ts.map +1 -0
  199. package/dist/tools/handlers/pipeline-handlers.js.map +1 -0
  200. package/dist/tools/handlers/sequence-handlers.d.ts.map +1 -0
  201. package/dist/tools/handlers/sequence-handlers.js.map +1 -0
  202. package/dist/tools/handlers/system-handlers.d.ts +3 -2
  203. package/dist/tools/handlers/system-handlers.d.ts.map +1 -0
  204. package/dist/tools/handlers/system-handlers.js +105 -52
  205. package/dist/tools/handlers/system-handlers.js.map +1 -0
  206. package/dist/tools/input.d.ts.map +1 -0
  207. package/dist/tools/input.js +3 -1
  208. package/dist/tools/input.js.map +1 -0
  209. package/dist/tools/introspection.d.ts +14 -14
  210. package/dist/tools/introspection.d.ts.map +1 -0
  211. package/dist/tools/introspection.js +54 -45
  212. package/dist/tools/introspection.js.map +1 -0
  213. package/dist/tools/landscape.d.ts.map +1 -0
  214. package/dist/tools/landscape.js +15 -13
  215. package/dist/tools/landscape.js.map +1 -0
  216. package/dist/tools/level.d.ts.map +1 -0
  217. package/dist/tools/level.js +3 -2
  218. package/dist/tools/level.js.map +1 -0
  219. package/dist/tools/lighting.d.ts +32 -59
  220. package/dist/tools/lighting.d.ts.map +1 -0
  221. package/dist/tools/lighting.js +56 -19
  222. package/dist/tools/lighting.js.map +1 -0
  223. package/dist/tools/logs.d.ts.map +1 -0
  224. package/dist/tools/logs.js +2 -1
  225. package/dist/tools/logs.js.map +1 -0
  226. package/dist/tools/materials.d.ts +42 -14
  227. package/dist/tools/materials.d.ts.map +1 -0
  228. package/dist/tools/materials.js +15 -9
  229. package/dist/tools/materials.js.map +1 -0
  230. package/dist/tools/niagara.d.ts +63 -39
  231. package/dist/tools/niagara.d.ts.map +1 -0
  232. package/dist/tools/niagara.js +43 -33
  233. package/dist/tools/niagara.js.map +1 -0
  234. package/dist/tools/performance.d.ts +12 -11
  235. package/dist/tools/performance.d.ts.map +1 -0
  236. package/dist/tools/performance.js +3 -2
  237. package/dist/tools/performance.js.map +1 -0
  238. package/dist/tools/physics.d.ts +37 -20
  239. package/dist/tools/physics.d.ts.map +1 -0
  240. package/dist/tools/physics.js +37 -30
  241. package/dist/tools/physics.js.map +1 -0
  242. package/dist/tools/property-dictionary.d.ts.map +1 -0
  243. package/dist/tools/property-dictionary.js.map +1 -0
  244. package/dist/tools/sequence.d.ts +1 -1
  245. package/dist/tools/sequence.d.ts.map +1 -0
  246. package/dist/tools/sequence.js +8 -4
  247. package/dist/tools/sequence.js.map +1 -0
  248. package/dist/tools/tool-definition-utils.d.ts.map +1 -0
  249. package/dist/tools/tool-definition-utils.js.map +1 -0
  250. package/dist/tools/ui.d.ts +11 -11
  251. package/dist/tools/ui.d.ts.map +1 -0
  252. package/dist/tools/ui.js +7 -3
  253. package/dist/tools/ui.js.map +1 -0
  254. package/dist/types/automation-responses.d.ts.map +1 -0
  255. package/dist/types/automation-responses.js.map +1 -0
  256. package/dist/types/env.d.ts.map +1 -0
  257. package/dist/types/env.js.map +1 -0
  258. package/dist/types/handler-types.d.ts +112 -3
  259. package/dist/types/handler-types.d.ts.map +1 -0
  260. package/dist/types/handler-types.js.map +1 -0
  261. package/dist/types/tool-interfaces.d.ts +39 -21
  262. package/dist/types/tool-interfaces.d.ts.map +1 -0
  263. package/dist/types/tool-interfaces.js.map +1 -0
  264. package/dist/types/tool-types.d.ts +8 -8
  265. package/dist/types/tool-types.d.ts.map +1 -0
  266. package/dist/types/tool-types.js.map +1 -0
  267. package/dist/unreal-bridge.d.ts +8 -6
  268. package/dist/unreal-bridge.d.ts.map +1 -0
  269. package/dist/unreal-bridge.js +16 -3
  270. package/dist/unreal-bridge.js.map +1 -0
  271. package/dist/utils/command-validator.d.ts.map +1 -0
  272. package/dist/utils/command-validator.js.map +1 -0
  273. package/dist/utils/elicitation.d.ts +2 -5
  274. package/dist/utils/elicitation.d.ts.map +1 -0
  275. package/dist/utils/elicitation.js +3 -2
  276. package/dist/utils/elicitation.js.map +1 -0
  277. package/dist/utils/error-handler.d.ts.map +1 -0
  278. package/dist/utils/error-handler.js.map +1 -0
  279. package/dist/utils/ini-reader.d.ts +1 -1
  280. package/dist/utils/ini-reader.d.ts.map +1 -0
  281. package/dist/utils/ini-reader.js.map +1 -0
  282. package/dist/utils/logger.d.ts +4 -4
  283. package/dist/utils/logger.d.ts.map +1 -0
  284. package/dist/utils/logger.js.map +1 -0
  285. package/dist/utils/normalize.d.ts +2 -2
  286. package/dist/utils/normalize.d.ts.map +1 -0
  287. package/dist/utils/normalize.js +4 -3
  288. package/dist/utils/normalize.js.map +1 -0
  289. package/dist/utils/path-security.d.ts.map +1 -0
  290. package/dist/utils/path-security.js.map +1 -0
  291. package/dist/utils/response-factory.d.ts +2 -2
  292. package/dist/utils/response-factory.d.ts.map +1 -0
  293. package/dist/utils/response-factory.js +3 -1
  294. package/dist/utils/response-factory.js.map +1 -0
  295. package/dist/utils/response-validator.d.ts +4 -4
  296. package/dist/utils/response-validator.d.ts.map +1 -0
  297. package/dist/utils/response-validator.js +31 -23
  298. package/dist/utils/response-validator.js.map +1 -0
  299. package/dist/utils/result-helpers.d.ts.map +1 -0
  300. package/dist/utils/result-helpers.js.map +1 -0
  301. package/dist/utils/safe-json.d.ts.map +1 -0
  302. package/dist/utils/safe-json.js.map +1 -0
  303. package/dist/utils/unreal-command-queue.d.ts +2 -2
  304. package/dist/utils/unreal-command-queue.d.ts.map +1 -0
  305. package/dist/utils/unreal-command-queue.js +4 -3
  306. package/dist/utils/unreal-command-queue.js.map +1 -0
  307. package/dist/utils/validation.d.ts +1 -1
  308. package/dist/utils/validation.d.ts.map +1 -0
  309. package/dist/utils/validation.js.map +1 -0
  310. package/dist/wasm/index.d.ts +2 -2
  311. package/dist/wasm/index.d.ts.map +1 -0
  312. package/dist/wasm/index.js +11 -7
  313. package/dist/wasm/index.js.map +1 -0
  314. package/package.json +12 -34
  315. package/server.json +2 -2
  316. package/.dockerignore +0 -57
  317. package/.env.example +0 -26
  318. package/.env.production +0 -61
  319. package/.eslintrc.json +0 -0
  320. package/.eslintrc.override.json +0 -8
  321. package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -94
  322. package/.github/ISSUE_TEMPLATE/config.yml +0 -8
  323. package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -56
  324. package/.github/copilot-instructions.md +0 -478
  325. package/.github/dependabot.yml +0 -19
  326. package/.github/labeler.yml +0 -24
  327. package/.github/labels.yml +0 -70
  328. package/.github/pull_request_template.md +0 -42
  329. package/.github/release-drafter-config.yml +0 -51
  330. package/.github/workflows/auto-merge.yml +0 -38
  331. package/.github/workflows/ci.yml +0 -38
  332. package/.github/workflows/dependency-review.yml +0 -17
  333. package/.github/workflows/gemini-issue-triage.yml +0 -172
  334. package/.github/workflows/greetings.yml +0 -27
  335. package/.github/workflows/labeler.yml +0 -17
  336. package/.github/workflows/links.yml +0 -80
  337. package/.github/workflows/pr-size-labeler.yml +0 -137
  338. package/.github/workflows/publish-mcp.yml +0 -79
  339. package/.github/workflows/release-drafter.yml +0 -24
  340. package/.github/workflows/release.yml +0 -112
  341. package/.github/workflows/semantic-pull-request.yml +0 -35
  342. package/.github/workflows/smoke-test.yml +0 -36
  343. package/.github/workflows/stale.yml +0 -28
  344. package/CONTRIBUTING.md +0 -140
  345. package/Dockerfile +0 -37
  346. package/GEMINI.md +0 -115
  347. package/Public/Plugin_setup_guide.mp4 +0 -0
  348. package/Public/icon.png +0 -0
  349. package/claude_desktop_config_example.json +0 -15
  350. package/dist/types/responses.d.ts +0 -249
  351. package/dist/types/responses.js +0 -2
  352. package/docs/GraphQL-API.md +0 -888
  353. package/docs/Migration-Guide-v0.5.0.md +0 -684
  354. package/docs/Roadmap.md +0 -53
  355. package/docs/WebAssembly-Integration.md +0 -628
  356. package/docs/editor-plugin-extension.md +0 -370
  357. package/docs/handler-mapping.md +0 -249
  358. package/docs/native-automation-progress.md +0 -128
  359. package/docs/testing-guide.md +0 -423
  360. package/eslint.config.mjs +0 -68
  361. package/mcp-config-example.json +0 -14
  362. package/plugins/McpAutomationBridge/Config/FilterPlugin.ini +0 -8
  363. package/plugins/McpAutomationBridge/McpAutomationBridge.uplugin +0 -64
  364. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/McpAutomationBridge.Build.cs +0 -189
  365. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.cpp +0 -22
  366. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.h +0 -30
  367. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeHelpers.h +0 -1983
  368. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeModule.cpp +0 -72
  369. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSettings.cpp +0 -46
  370. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSubsystem.cpp +0 -846
  371. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AnimationHandlers.cpp +0 -2393
  372. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetQueryHandlers.cpp +0 -300
  373. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetWorkflowHandlers.cpp +0 -2807
  374. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AudioHandlers.cpp +0 -1087
  375. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BehaviorTreeHandlers.cpp +0 -488
  376. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.cpp +0 -643
  377. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.h +0 -31
  378. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintGraphHandlers.cpp +0 -1094
  379. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers.cpp +0 -5750
  380. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers_List.cpp +0 -152
  381. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ControlHandlers.cpp +0 -2614
  382. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_DebugHandlers.cpp +0 -42
  383. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EditorFunctionHandlers.cpp +0 -1237
  384. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EffectHandlers.cpp +0 -1725
  385. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EnvironmentHandlers.cpp +0 -2265
  386. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_FoliageHandlers.cpp +0 -954
  387. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InputHandlers.cpp +0 -209
  388. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InsightsHandlers.cpp +0 -41
  389. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LandscapeHandlers.cpp +0 -1164
  390. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LevelHandlers.cpp +0 -762
  391. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LightingHandlers.cpp +0 -663
  392. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LogHandlers.cpp +0 -136
  393. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_MaterialGraphHandlers.cpp +0 -494
  394. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraGraphHandlers.cpp +0 -278
  395. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraHandlers.cpp +0 -625
  396. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PerformanceHandlers.cpp +0 -401
  397. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PipelineHandlers.cpp +0 -67
  398. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ProcessRequest.cpp +0 -472
  399. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PropertyHandlers.cpp +0 -2634
  400. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_RenderHandlers.cpp +0 -189
  401. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.cpp +0 -917
  402. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.h +0 -39
  403. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequenceHandlers.cpp +0 -2706
  404. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequencerHandlers.cpp +0 -519
  405. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_TestHandlers.cpp +0 -38
  406. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_UiHandlers.cpp +0 -668
  407. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_WorldPartitionHandlers.cpp +0 -346
  408. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.cpp +0 -1345
  409. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.h +0 -149
  410. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpConnectionManager.cpp +0 -782
  411. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSettings.h +0 -115
  412. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSubsystem.h +0 -796
  413. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpConnectionManager.h +0 -117
  414. package/scripts/check-unreal-connection.mjs +0 -19
  415. package/scripts/clean-tmp.js +0 -23
  416. package/scripts/patch-wasm.js +0 -26
  417. package/scripts/run-all-tests.mjs +0 -136
  418. package/scripts/smoke-test.ts +0 -94
  419. package/scripts/sync-mcp-plugin.js +0 -143
  420. package/scripts/test-no-plugin-alternates.mjs +0 -113
  421. package/scripts/validate-server.js +0 -46
  422. package/scripts/verify-automation-bridge.js +0 -200
  423. package/src/automation/bridge.ts +0 -630
  424. package/src/automation/connection-manager.ts +0 -148
  425. package/src/automation/handshake.ts +0 -99
  426. package/src/automation/index.ts +0 -2
  427. package/src/automation/message-handler.ts +0 -192
  428. package/src/automation/request-tracker.ts +0 -155
  429. package/src/automation/types.ts +0 -108
  430. package/src/cli.ts +0 -34
  431. package/src/config/class-aliases.ts +0 -65
  432. package/src/config.ts +0 -73
  433. package/src/constants.ts +0 -29
  434. package/src/graphql/loaders.ts +0 -244
  435. package/src/graphql/resolvers.ts +0 -1008
  436. package/src/graphql/schema.ts +0 -452
  437. package/src/graphql/server.ts +0 -156
  438. package/src/graphql/types.ts +0 -10
  439. package/src/handlers/resource-handlers.ts +0 -186
  440. package/src/index.ts +0 -243
  441. package/src/resources/actors.ts +0 -127
  442. package/src/resources/assets.ts +0 -286
  443. package/src/resources/levels.ts +0 -68
  444. package/src/server/resource-registry.ts +0 -47
  445. package/src/server/tool-registry.ts +0 -354
  446. package/src/server-setup.ts +0 -114
  447. package/src/services/health-monitor.ts +0 -132
  448. package/src/services/metrics-server.ts +0 -176
  449. package/src/tools/actors.ts +0 -564
  450. package/src/tools/animation.ts +0 -941
  451. package/src/tools/assets.ts +0 -394
  452. package/src/tools/audio.ts +0 -499
  453. package/src/tools/base-tool.ts +0 -52
  454. package/src/tools/behavior-tree.ts +0 -45
  455. package/src/tools/blueprint.ts +0 -940
  456. package/src/tools/consolidated-tool-definitions.ts +0 -1256
  457. package/src/tools/consolidated-tool-handlers.ts +0 -302
  458. package/src/tools/debug.ts +0 -622
  459. package/src/tools/dynamic-handler-registry.ts +0 -33
  460. package/src/tools/editor.ts +0 -435
  461. package/src/tools/engine.ts +0 -43
  462. package/src/tools/environment.ts +0 -281
  463. package/src/tools/foliage.ts +0 -596
  464. package/src/tools/handlers/actor-handlers.ts +0 -244
  465. package/src/tools/handlers/animation-handlers.ts +0 -237
  466. package/src/tools/handlers/argument-helper.ts +0 -142
  467. package/src/tools/handlers/asset-handlers.ts +0 -550
  468. package/src/tools/handlers/audio-handlers.ts +0 -194
  469. package/src/tools/handlers/blueprint-handlers.ts +0 -380
  470. package/src/tools/handlers/common-handlers.ts +0 -108
  471. package/src/tools/handlers/editor-handlers.ts +0 -124
  472. package/src/tools/handlers/effect-handlers.ts +0 -224
  473. package/src/tools/handlers/environment-handlers.ts +0 -183
  474. package/src/tools/handlers/graph-handlers.ts +0 -117
  475. package/src/tools/handlers/input-handlers.ts +0 -28
  476. package/src/tools/handlers/inspect-handlers.ts +0 -450
  477. package/src/tools/handlers/level-handlers.ts +0 -253
  478. package/src/tools/handlers/lighting-handlers.ts +0 -151
  479. package/src/tools/handlers/performance-handlers.ts +0 -132
  480. package/src/tools/handlers/pipeline-handlers.ts +0 -194
  481. package/src/tools/handlers/sequence-handlers.ts +0 -438
  482. package/src/tools/handlers/system-handlers.ts +0 -564
  483. package/src/tools/input.ts +0 -160
  484. package/src/tools/introspection.ts +0 -689
  485. package/src/tools/landscape.ts +0 -649
  486. package/src/tools/level.ts +0 -989
  487. package/src/tools/lighting.ts +0 -1052
  488. package/src/tools/logs.ts +0 -219
  489. package/src/tools/materials.ts +0 -295
  490. package/src/tools/niagara.ts +0 -485
  491. package/src/tools/performance.ts +0 -661
  492. package/src/tools/physics.ts +0 -679
  493. package/src/tools/property-dictionary.ts +0 -98
  494. package/src/tools/sequence.ts +0 -385
  495. package/src/tools/tool-definition-utils.ts +0 -35
  496. package/src/tools/ui.ts +0 -452
  497. package/src/types/automation-responses.ts +0 -119
  498. package/src/types/env.ts +0 -17
  499. package/src/types/handler-types.ts +0 -442
  500. package/src/types/responses.ts +0 -355
  501. package/src/types/tool-interfaces.ts +0 -250
  502. package/src/types/tool-types.ts +0 -575
  503. package/src/unreal-bridge.ts +0 -693
  504. package/src/utils/command-validator.ts +0 -139
  505. package/src/utils/elicitation.ts +0 -132
  506. package/src/utils/error-handler.ts +0 -287
  507. package/src/utils/ini-reader.ts +0 -86
  508. package/src/utils/logger.ts +0 -35
  509. package/src/utils/normalize.test.ts +0 -162
  510. package/src/utils/normalize.ts +0 -146
  511. package/src/utils/path-security.ts +0 -43
  512. package/src/utils/response-factory.ts +0 -44
  513. package/src/utils/response-validator.ts +0 -395
  514. package/src/utils/result-helpers.ts +0 -195
  515. package/src/utils/safe-json.test.ts +0 -90
  516. package/src/utils/safe-json.ts +0 -70
  517. package/src/utils/unreal-command-queue.ts +0 -166
  518. package/src/utils/validation.test.ts +0 -184
  519. package/src/utils/validation.ts +0 -312
  520. package/src/wasm/index.ts +0 -838
  521. package/test-server.mjs +0 -100
  522. package/tests/test-animation.mjs +0 -369
  523. package/tests/test-asset-advanced.mjs +0 -82
  524. package/tests/test-asset-graph.mjs +0 -311
  525. package/tests/test-audio.mjs +0 -417
  526. package/tests/test-automation-timeouts.mjs +0 -98
  527. package/tests/test-behavior-tree.mjs +0 -444
  528. package/tests/test-blueprint-graph.mjs +0 -410
  529. package/tests/test-blueprint.mjs +0 -577
  530. package/tests/test-client-mode.mjs +0 -86
  531. package/tests/test-console-command.mjs +0 -56
  532. package/tests/test-control-actor.mjs +0 -425
  533. package/tests/test-control-editor.mjs +0 -112
  534. package/tests/test-graphql.mjs +0 -372
  535. package/tests/test-input.mjs +0 -349
  536. package/tests/test-inspect.mjs +0 -302
  537. package/tests/test-landscape.mjs +0 -316
  538. package/tests/test-lighting.mjs +0 -428
  539. package/tests/test-manage-asset.mjs +0 -438
  540. package/tests/test-manage-level.mjs +0 -89
  541. package/tests/test-materials.mjs +0 -356
  542. package/tests/test-niagara.mjs +0 -185
  543. package/tests/test-no-inline-python.mjs +0 -122
  544. package/tests/test-performance.mjs +0 -539
  545. package/tests/test-plugin-handshake.mjs +0 -82
  546. package/tests/test-runner.mjs +0 -993
  547. package/tests/test-sequence.mjs +0 -104
  548. package/tests/test-system.mjs +0 -96
  549. package/tests/test-wasm.mjs +0 -283
  550. package/tests/test-world-partition.mjs +0 -215
  551. package/tsconfig.json +0 -56
  552. package/vitest.config.ts +0 -35
  553. package/wasm/Cargo.lock +0 -363
  554. package/wasm/Cargo.toml +0 -42
  555. package/wasm/LICENSE +0 -21
  556. package/wasm/README.md +0 -253
  557. package/wasm/src/dependency_resolver.rs +0 -377
  558. package/wasm/src/lib.rs +0 -153
  559. package/wasm/src/property_parser.rs +0 -271
  560. package/wasm/src/transform_math.rs +0 -396
  561. package/wasm/tests/integration.rs +0 -109
@@ -1,846 +0,0 @@
1
- // Ensure the subsystem type and bridge socket types are available
2
- #include "McpAutomationBridgeSubsystem.h"
3
- #include "HAL/PlatformFilemanager.h"
4
- #include "HAL/PlatformTime.h"
5
- #include "McpAutomationBridgeGlobals.h"
6
- #include "McpAutomationBridgeSettings.h"
7
- #include "McpBridgeWebSocket.h"
8
- #include "McpConnectionManager.h"
9
- #include "Misc/FileHelper.h"
10
- #include "Misc/Guid.h"
11
- #include "Misc/Paths.h"
12
- #include "Serialization/JsonReader.h"
13
- #include "Serialization/JsonSerializer.h"
14
-
15
- // Define the subsystem log category declared in the public header.
16
- DEFINE_LOG_CATEGORY(LogMcpAutomationBridgeSubsystem);
17
-
18
- // Sanitize incoming text for logging: replace control characters with
19
- // '?' and truncate long messages so logs remain readable and do not
20
- // attempt to render unprintable glyphs in the editor which can spam
21
- /**
22
- * @brief Produces a log-safe copy of a string by replacing control characters
23
- * and truncating long input.
24
- *
25
- * Creates a sanitized version of the input string where characters with code
26
- * points less than 32 or equal to 127 are replaced with '?' and the result is
27
- * truncated to 512 characters with "[TRUNCATED]" appended if the input is
28
- * longer.
29
- *
30
- * @param In Input string to sanitize.
31
- * @return FString Sanitized string suitable for logging.
32
- */
33
- static inline FString SanitizeForLog(const FString &In) {
34
- if (In.IsEmpty())
35
- return FString();
36
- FString Out;
37
- Out.Reserve(FMath::Min<int32>(In.Len(), 1024));
38
- for (int32 i = 0; i < In.Len(); ++i) {
39
- const TCHAR C = In[i];
40
- if (C >= 32 && C != 127)
41
- Out.AppendChar(C);
42
- else
43
- Out.AppendChar('?');
44
- }
45
- if (Out.Len() > 512)
46
- Out = Out.Left(512) + TEXT("[TRUNCATED]");
47
- return Out;
48
- }
49
-
50
- /**
51
- * @brief Initialize the automation bridge subsystem, preparing networking,
52
- * handlers, and periodic processing.
53
- *
54
- * Creates and initializes the connection manager, registers automation action
55
- * handlers and a message-received callback, starts the connection manager, and
56
- * registers a recurring ticker to process pending automation requests.
57
- *
58
- * @param Collection Subsystem collection provided by the engine during
59
- * initialization.
60
- */
61
- void UMcpAutomationBridgeSubsystem::Initialize(
62
- FSubsystemCollectionBase &Collection) {
63
- Super::Initialize(Collection);
64
-
65
- UE_LOG(LogMcpAutomationBridgeSubsystem, Log,
66
- TEXT("McpAutomationBridgeSubsystem initializing."));
67
-
68
- // Create and initialize the connection manager
69
- ConnectionManager = MakeShared<FMcpConnectionManager>();
70
- ConnectionManager->Initialize(GetDefault<UMcpAutomationBridgeSettings>());
71
-
72
- // Bind message received delegate
73
- ConnectionManager->SetOnMessageReceived(
74
- FMcpMessageReceivedCallback::CreateWeakLambda(
75
- this, [this](const FString &RequestId, const FString &Action,
76
- const TSharedPtr<FJsonObject> &Payload,
77
- TSharedPtr<FMcpBridgeWebSocket> Socket) {
78
- ProcessAutomationRequest(RequestId, Action, Payload, Socket);
79
- }));
80
-
81
- // Initialize the handler registry
82
- InitializeHandlers();
83
-
84
- // Start the connection manager
85
- ConnectionManager->Start();
86
-
87
- // Register Ticker
88
- TickHandle = FTSTicker::GetCoreTicker().AddTicker(
89
- FTickerDelegate::CreateUObject(this,
90
- &UMcpAutomationBridgeSubsystem::Tick),
91
- 0.1f // Tick every 0.1s is sufficient for automation queue processing
92
- );
93
-
94
- UE_LOG(LogMcpAutomationBridgeSubsystem, Log,
95
- TEXT("McpAutomationBridgeSubsystem Initialized."));
96
- }
97
-
98
- /**
99
- * @brief Shuts down the MCP Automation Bridge subsystem and releases its
100
- * resources.
101
- *
102
- * Removes the registered ticker, stops and clears the connection manager,
103
- * detaches and clears the log capture device, and calls the superclass
104
- * deinitialization.
105
- */
106
- void UMcpAutomationBridgeSubsystem::Deinitialize() {
107
- if (TickHandle.IsValid()) {
108
- FTSTicker::GetCoreTicker().RemoveTicker(TickHandle);
109
- TickHandle.Reset();
110
- }
111
-
112
- UE_LOG(LogMcpAutomationBridgeSubsystem, Log,
113
- TEXT("McpAutomationBridgeSubsystem deinitializing."));
114
-
115
- if (ConnectionManager.IsValid()) {
116
- ConnectionManager->Stop();
117
- ConnectionManager.Reset();
118
- }
119
-
120
- if (LogCaptureDevice.IsValid()) {
121
- if (GLog)
122
- GLog->RemoveOutputDevice(LogCaptureDevice.Get());
123
- LogCaptureDevice.Reset();
124
- }
125
-
126
- Super::Deinitialize();
127
- }
128
-
129
- /**
130
- * @brief Reports whether the automation bridge currently has any active
131
- * connections.
132
- *
133
- * @return `true` if the connection manager exists and has one or more active
134
- * sockets, `false` otherwise.
135
- */
136
- bool UMcpAutomationBridgeSubsystem::IsBridgeActive() const {
137
- return ConnectionManager.IsValid() &&
138
- ConnectionManager->GetActiveSocketCount() > 0;
139
- }
140
-
141
- /**
142
- * @brief Determine the bridge's connection state from active sockets.
143
- *
144
- * @return EMcpAutomationBridgeState `EMcpAutomationBridgeState::Connected` if
145
- * one or more active sockets are present,
146
- * `EMcpAutomationBridgeState::Disconnected` otherwise.
147
- */
148
- EMcpAutomationBridgeState
149
- UMcpAutomationBridgeSubsystem::GetBridgeState() const {
150
- // Map connection manager state if needed, for now just check if we have
151
- // active sockets
152
- return IsBridgeActive() ? EMcpAutomationBridgeState::Connected
153
- : EMcpAutomationBridgeState::Disconnected;
154
- }
155
-
156
- /**
157
- * @brief Forward a raw text message to the connection manager for transmission.
158
- *
159
- * @param Message The raw message string to send.
160
- * @return `true` if the connection manager accepted the message for sending,
161
- * `false` otherwise.
162
- */
163
- bool UMcpAutomationBridgeSubsystem::SendRawMessage(const FString &Message) {
164
- if (ConnectionManager.IsValid()) {
165
- return ConnectionManager->SendRawMessage(Message);
166
- }
167
- return false;
168
- }
169
-
170
- /**
171
- * @brief Per-frame tick that processes deferred automation requests when it is
172
- * safe to do so.
173
- *
174
- * Invokes processing of any pending automation requests that were previously
175
- * deferred due to unsafe engine states (saving, garbage collection, or async
176
- * loading).
177
- *
178
- * @param DeltaTime Time elapsed since the last tick, in seconds.
179
- * @return true to remain registered and continue receiving ticks.
180
- */
181
- bool UMcpAutomationBridgeSubsystem::Tick(float DeltaTime) {
182
- // Check if we have pending requests that were deferred due to unsafe engine
183
- // states
184
- if (bPendingRequestsScheduled && !GIsSavingPackage &&
185
- !IsGarbageCollecting() && !IsAsyncLoading()) {
186
- ProcessPendingAutomationRequests();
187
- }
188
- return true;
189
- }
190
-
191
- // The in-file implementation of ProcessAutomationRequest was intentionally
192
- // removed from this translation unit. The function is now implemented in
193
- // McpAutomationBridge_ProcessRequest.cpp to avoid duplicate definitions and
194
- // to keep this file focused. See that file for the full request dispatcher
195
- /**
196
- * @brief Sends an automation response for a specific request to the given
197
- * socket.
198
- *
199
- * If the connection manager is not available this call is a no-op.
200
- *
201
- * @param TargetSocket WebSocket to which the response will be sent.
202
- * @param RequestId Identifier of the automation request being responded to.
203
- * @param bSuccess `true` if the request succeeded, `false` otherwise.
204
- * @param Message Human-readable message or description associated with the
205
- * response.
206
- * @param Result Optional JSON object containing result data; may be null.
207
- * @param ErrorCode Error code string to include when `bSuccess` is `false`.
208
- */
209
-
210
- void UMcpAutomationBridgeSubsystem::SendAutomationResponse(
211
- TSharedPtr<FMcpBridgeWebSocket> TargetSocket, const FString &RequestId,
212
- const bool bSuccess, const FString &Message,
213
- const TSharedPtr<FJsonObject> &Result, const FString &ErrorCode) {
214
- if (ConnectionManager.IsValid()) {
215
- ConnectionManager->SendAutomationResponse(TargetSocket, RequestId, bSuccess,
216
- Message, Result, ErrorCode);
217
- }
218
- }
219
-
220
- /**
221
- * @brief Log a failure and send a standardized automation error response.
222
- *
223
- * Resolves an empty ErrorCode to "AUTOMATION_ERROR", logs a sanitized warning
224
- * with the resolved error and message, and sends a failure response for the
225
- * specified request.
226
- *
227
- * @param TargetSocket Optional socket to target the response; may be null to
228
- * broadcast or use a default.
229
- * @param RequestId Identifier of the automation request that failed.
230
- * @param Message Human-readable failure message.
231
- * @param ErrorCode Error code to include with the response; "AUTOMATION_ERROR"
232
- * is used if empty.
233
- */
234
- void UMcpAutomationBridgeSubsystem::SendAutomationError(
235
- TSharedPtr<FMcpBridgeWebSocket> TargetSocket, const FString &RequestId,
236
- const FString &Message, const FString &ErrorCode) {
237
- const FString ResolvedError =
238
- ErrorCode.IsEmpty() ? TEXT("AUTOMATION_ERROR") : ErrorCode;
239
- UE_LOG(LogMcpAutomationBridgeSubsystem, Warning,
240
- TEXT("Automation request failed (%s): %s"), *ResolvedError,
241
- *SanitizeForLog(Message));
242
- SendAutomationResponse(TargetSocket, RequestId, false, Message, nullptr,
243
- ResolvedError);
244
- }
245
-
246
- /**
247
- * @brief Records telemetry for an automation request with outcome details.
248
- *
249
- * Forwards the request identifier, success flag, human-readable message, and
250
- * error code to the connection manager for telemetry/logging.
251
- *
252
- * @param RequestId Unique identifier of the automation request.
253
- * @param bSuccess `true` if the request completed successfully, `false`
254
- * otherwise.
255
- * @param Message Human-readable message describing the outcome or context.
256
- * @param ErrorCode Short error identifier (empty if none).
257
- */
258
- void UMcpAutomationBridgeSubsystem::RecordAutomationTelemetry(
259
- const FString &RequestId, const bool bSuccess, const FString &Message,
260
- const FString &ErrorCode) {
261
- if (ConnectionManager.IsValid()) {
262
- ConnectionManager->RecordAutomationTelemetry(RequestId, bSuccess, Message,
263
- ErrorCode);
264
- }
265
- }
266
-
267
- /**
268
- * @brief Registers an automation action handler for the given action string.
269
- *
270
- * If a non-empty handler is provided, stores it under Action (replacing any
271
- * existing handler for the same key). If Handler is null/invalid, the call is a
272
- * no-op.
273
- *
274
- * @param Action The action identifier string used to look up the handler.
275
- * @param Handler Callable invoked when the specified action is requested.
276
- */
277
- void UMcpAutomationBridgeSubsystem::RegisterHandler(
278
- const FString &Action, FAutomationHandler Handler) {
279
- if (Handler) {
280
- AutomationHandlers.Add(Action, Handler);
281
- }
282
- }
283
-
284
- /**
285
- * @brief Registers all automation action handlers used by the MCP Automation
286
- * Bridge.
287
- *
288
- * Populates the subsystem's handler registry with mappings from action name
289
- * strings (for example: core/property actions, array/map/set container ops,
290
- * asset dependency queries, console/system and editor tooling actions,
291
- * blueprint/world/asset management, rendering/materials, input/control,
292
- * audio/lighting/physics/effects, and performance actions) to the functions
293
- * that handle those actions so incoming automation requests can be dispatched
294
- * by action name.
295
- *
296
- * This also registers a few common alias actions (e.g., "create_effect",
297
- * "clear_debug_shapes") so those actions dispatch directly to the intended
298
- * handler.
299
- */
300
- void UMcpAutomationBridgeSubsystem::InitializeHandlers() {
301
- // Core & Properties
302
- RegisterHandler(TEXT("execute_editor_function"),
303
- [this](const FString &R, const FString &A,
304
- const TSharedPtr<FJsonObject> &P,
305
- TSharedPtr<FMcpBridgeWebSocket> S) {
306
- return HandleExecuteEditorFunction(R, A, P, S);
307
- });
308
- RegisterHandler(TEXT("set_object_property"),
309
- [this](const FString &R, const FString &A,
310
- const TSharedPtr<FJsonObject> &P,
311
- TSharedPtr<FMcpBridgeWebSocket> S) {
312
- return HandleSetObjectProperty(R, A, P, S);
313
- });
314
- RegisterHandler(TEXT("get_object_property"),
315
- [this](const FString &R, const FString &A,
316
- const TSharedPtr<FJsonObject> &P,
317
- TSharedPtr<FMcpBridgeWebSocket> S) {
318
- return HandleGetObjectProperty(R, A, P, S);
319
- });
320
-
321
- // Containers (Arrays, Maps, Sets)
322
- RegisterHandler(TEXT("array_append"),
323
- [this](const FString &R, const FString &A,
324
- const TSharedPtr<FJsonObject> &P,
325
- TSharedPtr<FMcpBridgeWebSocket> S) {
326
- return HandleArrayAppend(R, A, P, S);
327
- });
328
- RegisterHandler(TEXT("array_remove"),
329
- [this](const FString &R, const FString &A,
330
- const TSharedPtr<FJsonObject> &P,
331
- TSharedPtr<FMcpBridgeWebSocket> S) {
332
- return HandleArrayRemove(R, A, P, S);
333
- });
334
- RegisterHandler(TEXT("array_insert"),
335
- [this](const FString &R, const FString &A,
336
- const TSharedPtr<FJsonObject> &P,
337
- TSharedPtr<FMcpBridgeWebSocket> S) {
338
- return HandleArrayInsert(R, A, P, S);
339
- });
340
- RegisterHandler(TEXT("array_get_element"),
341
- [this](const FString &R, const FString &A,
342
- const TSharedPtr<FJsonObject> &P,
343
- TSharedPtr<FMcpBridgeWebSocket> S) {
344
- return HandleArrayGetElement(R, A, P, S);
345
- });
346
- RegisterHandler(TEXT("array_set_element"),
347
- [this](const FString &R, const FString &A,
348
- const TSharedPtr<FJsonObject> &P,
349
- TSharedPtr<FMcpBridgeWebSocket> S) {
350
- return HandleArraySetElement(R, A, P, S);
351
- });
352
- RegisterHandler(TEXT("array_clear"),
353
- [this](const FString &R, const FString &A,
354
- const TSharedPtr<FJsonObject> &P,
355
- TSharedPtr<FMcpBridgeWebSocket> S) {
356
- return HandleArrayClear(R, A, P, S);
357
- });
358
-
359
- RegisterHandler(TEXT("map_set_value"),
360
- [this](const FString &R, const FString &A,
361
- const TSharedPtr<FJsonObject> &P,
362
- TSharedPtr<FMcpBridgeWebSocket> S) {
363
- return HandleMapSetValue(R, A, P, S);
364
- });
365
- RegisterHandler(TEXT("map_get_value"),
366
- [this](const FString &R, const FString &A,
367
- const TSharedPtr<FJsonObject> &P,
368
- TSharedPtr<FMcpBridgeWebSocket> S) {
369
- return HandleMapGetValue(R, A, P, S);
370
- });
371
- RegisterHandler(TEXT("map_remove_key"),
372
- [this](const FString &R, const FString &A,
373
- const TSharedPtr<FJsonObject> &P,
374
- TSharedPtr<FMcpBridgeWebSocket> S) {
375
- return HandleMapRemoveKey(R, A, P, S);
376
- });
377
- RegisterHandler(TEXT("map_has_key"),
378
- [this](const FString &R, const FString &A,
379
- const TSharedPtr<FJsonObject> &P,
380
- TSharedPtr<FMcpBridgeWebSocket> S) {
381
- return HandleMapHasKey(R, A, P, S);
382
- });
383
- RegisterHandler(TEXT("map_get_keys"),
384
- [this](const FString &R, const FString &A,
385
- const TSharedPtr<FJsonObject> &P,
386
- TSharedPtr<FMcpBridgeWebSocket> S) {
387
- return HandleMapGetKeys(R, A, P, S);
388
- });
389
- RegisterHandler(TEXT("map_clear"), [this](const FString &R, const FString &A,
390
- const TSharedPtr<FJsonObject> &P,
391
- TSharedPtr<FMcpBridgeWebSocket> S) {
392
- return HandleMapClear(R, A, P, S);
393
- });
394
-
395
- RegisterHandler(TEXT("set_add"), [this](const FString &R, const FString &A,
396
- const TSharedPtr<FJsonObject> &P,
397
- TSharedPtr<FMcpBridgeWebSocket> S) {
398
- return HandleSetAdd(R, A, P, S);
399
- });
400
- RegisterHandler(TEXT("set_remove"),
401
- [this](const FString &R, const FString &A,
402
- const TSharedPtr<FJsonObject> &P,
403
- TSharedPtr<FMcpBridgeWebSocket> S) {
404
- return HandleSetRemove(R, A, P, S);
405
- });
406
- RegisterHandler(TEXT("set_contains"),
407
- [this](const FString &R, const FString &A,
408
- const TSharedPtr<FJsonObject> &P,
409
- TSharedPtr<FMcpBridgeWebSocket> S) {
410
- return HandleSetContains(R, A, P, S);
411
- });
412
- RegisterHandler(TEXT("set_clear"), [this](const FString &R, const FString &A,
413
- const TSharedPtr<FJsonObject> &P,
414
- TSharedPtr<FMcpBridgeWebSocket> S) {
415
- return HandleSetClear(R, A, P, S);
416
- });
417
-
418
- // Asset Dependency
419
- RegisterHandler(TEXT("get_asset_references"),
420
- [this](const FString &R, const FString &A,
421
- const TSharedPtr<FJsonObject> &P,
422
- TSharedPtr<FMcpBridgeWebSocket> S) {
423
- return HandleGetAssetReferences(R, A, P, S);
424
- });
425
- RegisterHandler(TEXT("get_asset_dependencies"),
426
- [this](const FString &R, const FString &A,
427
- const TSharedPtr<FJsonObject> &P,
428
- TSharedPtr<FMcpBridgeWebSocket> S) {
429
- return HandleGetAssetDependencies(R, A, P, S);
430
- });
431
-
432
- // Asset Workflow
433
- RegisterHandler(TEXT("fixup_redirectors"),
434
- [this](const FString &R, const FString &A,
435
- const TSharedPtr<FJsonObject> &P,
436
- TSharedPtr<FMcpBridgeWebSocket> S) {
437
- return HandleFixupRedirectors(R, A, P, S);
438
- });
439
- RegisterHandler(TEXT("source_control_checkout"),
440
- [this](const FString &R, const FString &A,
441
- const TSharedPtr<FJsonObject> &P,
442
- TSharedPtr<FMcpBridgeWebSocket> S) {
443
- return HandleSourceControlCheckout(R, A, P, S);
444
- });
445
- RegisterHandler(TEXT("source_control_submit"),
446
- [this](const FString &R, const FString &A,
447
- const TSharedPtr<FJsonObject> &P,
448
- TSharedPtr<FMcpBridgeWebSocket> S) {
449
- return HandleSourceControlSubmit(R, A, P, S);
450
- });
451
- RegisterHandler(TEXT("bulk_rename_assets"),
452
- [this](const FString &R, const FString &A,
453
- const TSharedPtr<FJsonObject> &P,
454
- TSharedPtr<FMcpBridgeWebSocket> S) {
455
- return HandleBulkRenameAssets(R, A, P, S);
456
- });
457
- RegisterHandler(TEXT("bulk_delete_assets"),
458
- [this](const FString &R, const FString &A,
459
- const TSharedPtr<FJsonObject> &P,
460
- TSharedPtr<FMcpBridgeWebSocket> S) {
461
- return HandleBulkDeleteAssets(R, A, P, S);
462
- });
463
- RegisterHandler(TEXT("generate_thumbnail"),
464
- [this](const FString &R, const FString &A,
465
- const TSharedPtr<FJsonObject> &P,
466
- TSharedPtr<FMcpBridgeWebSocket> S) {
467
- return HandleGenerateThumbnail(R, A, P, S);
468
- });
469
-
470
- // Landscape
471
- RegisterHandler(TEXT("create_landscape"),
472
- [this](const FString &R, const FString &A,
473
- const TSharedPtr<FJsonObject> &P,
474
- TSharedPtr<FMcpBridgeWebSocket> S) {
475
- return HandleCreateLandscape(R, A, P, S);
476
- });
477
- RegisterHandler(TEXT("create_procedural_terrain"),
478
- [this](const FString &R, const FString &A,
479
- const TSharedPtr<FJsonObject> &P,
480
- TSharedPtr<FMcpBridgeWebSocket> S) {
481
- return HandleCreateProceduralTerrain(R, A, P, S);
482
- });
483
- RegisterHandler(TEXT("create_landscape_grass_type"),
484
- [this](const FString &R, const FString &A,
485
- const TSharedPtr<FJsonObject> &P,
486
- TSharedPtr<FMcpBridgeWebSocket> S) {
487
- return HandleCreateLandscapeGrassType(R, A, P, S);
488
- });
489
- RegisterHandler(TEXT("sculpt_landscape"),
490
- [this](const FString &R, const FString &A,
491
- const TSharedPtr<FJsonObject> &P,
492
- TSharedPtr<FMcpBridgeWebSocket> S) {
493
- return HandleSculptLandscape(R, A, P, S);
494
- });
495
- RegisterHandler(TEXT("set_landscape_material"),
496
- [this](const FString &R, const FString &A,
497
- const TSharedPtr<FJsonObject> &P,
498
- TSharedPtr<FMcpBridgeWebSocket> S) {
499
- return HandleSetLandscapeMaterial(R, A, P, S);
500
- });
501
- RegisterHandler(TEXT("edit_landscape"),
502
- [this](const FString &R, const FString &A,
503
- const TSharedPtr<FJsonObject> &P,
504
- TSharedPtr<FMcpBridgeWebSocket> S) {
505
- return HandleEditLandscape(R, A, P, S);
506
- });
507
-
508
- // Foliage
509
- RegisterHandler(TEXT("add_foliage_type"),
510
- [this](const FString &R, const FString &A,
511
- const TSharedPtr<FJsonObject> &P,
512
- TSharedPtr<FMcpBridgeWebSocket> S) {
513
- return HandleAddFoliageType(R, A, P, S);
514
- });
515
- RegisterHandler(TEXT("create_procedural_foliage"),
516
- [this](const FString &R, const FString &A,
517
- const TSharedPtr<FJsonObject> &P,
518
- TSharedPtr<FMcpBridgeWebSocket> S) {
519
- return HandleCreateProceduralFoliage(R, A, P, S);
520
- });
521
- RegisterHandler(TEXT("paint_foliage"),
522
- [this](const FString &R, const FString &A,
523
- const TSharedPtr<FJsonObject> &P,
524
- TSharedPtr<FMcpBridgeWebSocket> S) {
525
- return HandlePaintFoliage(R, A, P, S);
526
- });
527
- RegisterHandler(TEXT("add_foliage_instances"),
528
- [this](const FString &R, const FString &A,
529
- const TSharedPtr<FJsonObject> &P,
530
- TSharedPtr<FMcpBridgeWebSocket> S) {
531
- return HandleAddFoliageInstances(R, A, P, S);
532
- });
533
- RegisterHandler(TEXT("remove_foliage"),
534
- [this](const FString &R, const FString &A,
535
- const TSharedPtr<FJsonObject> &P,
536
- TSharedPtr<FMcpBridgeWebSocket> S) {
537
- return HandleRemoveFoliage(R, A, P, S);
538
- });
539
- RegisterHandler(TEXT("get_foliage_instances"),
540
- [this](const FString &R, const FString &A,
541
- const TSharedPtr<FJsonObject> &P,
542
- TSharedPtr<FMcpBridgeWebSocket> S) {
543
- return HandleGetFoliageInstances(R, A, P, S);
544
- });
545
-
546
- // Niagara
547
- RegisterHandler(TEXT("create_niagara_system"),
548
- [this](const FString &R, const FString &A,
549
- const TSharedPtr<FJsonObject> &P,
550
- TSharedPtr<FMcpBridgeWebSocket> S) {
551
- return HandleCreateNiagaraSystem(R, A, P, S);
552
- });
553
- RegisterHandler(TEXT("create_niagara_ribbon"),
554
- [this](const FString &R, const FString &A,
555
- const TSharedPtr<FJsonObject> &P,
556
- TSharedPtr<FMcpBridgeWebSocket> S) {
557
- return HandleCreateNiagaraRibbon(R, A, P, S);
558
- });
559
- RegisterHandler(TEXT("create_niagara_emitter"),
560
- [this](const FString &R, const FString &A,
561
- const TSharedPtr<FJsonObject> &P,
562
- TSharedPtr<FMcpBridgeWebSocket> S) {
563
- return HandleCreateNiagaraEmitter(R, A, P, S);
564
- });
565
- RegisterHandler(TEXT("spawn_niagara_actor"),
566
- [this](const FString &R, const FString &A,
567
- const TSharedPtr<FJsonObject> &P,
568
- TSharedPtr<FMcpBridgeWebSocket> S) {
569
- return HandleSpawnNiagaraActor(R, A, P, S);
570
- });
571
- RegisterHandler(TEXT("modify_niagara_parameter"),
572
- [this](const FString &R, const FString &A,
573
- const TSharedPtr<FJsonObject> &P,
574
- TSharedPtr<FMcpBridgeWebSocket> S) {
575
- return HandleModifyNiagaraParameter(R, A, P, S);
576
- });
577
-
578
- // Animation
579
- RegisterHandler(TEXT("create_anim_blueprint"),
580
- [this](const FString &R, const FString &A,
581
- const TSharedPtr<FJsonObject> &P,
582
- TSharedPtr<FMcpBridgeWebSocket> S) {
583
- return HandleCreateAnimBlueprint(R, A, P, S);
584
- });
585
- RegisterHandler(TEXT("play_anim_montage"),
586
- [this](const FString &R, const FString &A,
587
- const TSharedPtr<FJsonObject> &P,
588
- TSharedPtr<FMcpBridgeWebSocket> S) {
589
- return HandlePlayAnimMontage(R, A, P, S);
590
- });
591
- RegisterHandler(TEXT("setup_ragdoll"),
592
- [this](const FString &R, const FString &A,
593
- const TSharedPtr<FJsonObject> &P,
594
- TSharedPtr<FMcpBridgeWebSocket> S) {
595
- return HandleSetupRagdoll(R, A, P, S);
596
- });
597
-
598
- // Material Graph
599
- RegisterHandler(TEXT("add_material_texture_sample"),
600
- [this](const FString &R, const FString &A,
601
- const TSharedPtr<FJsonObject> &P,
602
- TSharedPtr<FMcpBridgeWebSocket> S) {
603
- return HandleAddMaterialTextureSample(R, A, P, S);
604
- });
605
- RegisterHandler(TEXT("add_material_expression"),
606
- [this](const FString &R, const FString &A,
607
- const TSharedPtr<FJsonObject> &P,
608
- TSharedPtr<FMcpBridgeWebSocket> S) {
609
- return HandleAddMaterialExpression(R, A, P, S);
610
- });
611
- RegisterHandler(TEXT("create_material_nodes"),
612
- [this](const FString &R, const FString &A,
613
- const TSharedPtr<FJsonObject> &P,
614
- TSharedPtr<FMcpBridgeWebSocket> S) {
615
- return HandleCreateMaterialNodes(R, A, P, S);
616
- });
617
-
618
- // Sequencer
619
- RegisterHandler(TEXT("add_sequencer_keyframe"),
620
- [this](const FString &R, const FString &A,
621
- const TSharedPtr<FJsonObject> &P,
622
- TSharedPtr<FMcpBridgeWebSocket> S) {
623
- return HandleAddSequencerKeyframe(R, A, P, S);
624
- });
625
- RegisterHandler(TEXT("manage_sequencer_track"),
626
- [this](const FString &R, const FString &A,
627
- const TSharedPtr<FJsonObject> &P,
628
- TSharedPtr<FMcpBridgeWebSocket> S) {
629
- return HandleManageSequencerTrack(R, A, P, S);
630
- });
631
- RegisterHandler(TEXT("add_camera_track"),
632
- [this](const FString &R, const FString &A,
633
- const TSharedPtr<FJsonObject> &P,
634
- TSharedPtr<FMcpBridgeWebSocket> S) {
635
- return HandleAddCameraTrack(R, A, P, S);
636
- });
637
- RegisterHandler(TEXT("add_animation_track"),
638
- [this](const FString &R, const FString &A,
639
- const TSharedPtr<FJsonObject> &P,
640
- TSharedPtr<FMcpBridgeWebSocket> S) {
641
- return HandleAddAnimationTrack(R, A, P, S);
642
- });
643
- RegisterHandler(TEXT("add_transform_track"),
644
- [this](const FString &R, const FString &A,
645
- const TSharedPtr<FJsonObject> &P,
646
- TSharedPtr<FMcpBridgeWebSocket> S) {
647
- return HandleAddTransformTrack(R, A, P, S);
648
- });
649
-
650
- // UI & Environment
651
- RegisterHandler(TEXT("manage_ui"), [this](const FString &R, const FString &A,
652
- const TSharedPtr<FJsonObject> &P,
653
- TSharedPtr<FMcpBridgeWebSocket> S) {
654
- return HandleUiAction(R, A, P, S);
655
- });
656
- RegisterHandler(TEXT("control_environment"),
657
- [this](const FString &R, const FString &A,
658
- const TSharedPtr<FJsonObject> &P,
659
- TSharedPtr<FMcpBridgeWebSocket> S) {
660
- return HandleControlEnvironmentAction(R, A, P, S);
661
- });
662
- RegisterHandler(TEXT("build_environment"),
663
- [this](const FString &R, const FString &A,
664
- const TSharedPtr<FJsonObject> &P,
665
- TSharedPtr<FMcpBridgeWebSocket> S) {
666
- return HandleBuildEnvironmentAction(R, A, P, S);
667
- });
668
-
669
- // Tools & System
670
- RegisterHandler(TEXT("console_command"),
671
- [this](const FString &R, const FString &A,
672
- const TSharedPtr<FJsonObject> &P,
673
- TSharedPtr<FMcpBridgeWebSocket> S) {
674
- return HandleConsoleCommandAction(R, A, P, S);
675
- });
676
- RegisterHandler(TEXT("inspect"), [this](const FString &R, const FString &A,
677
- const TSharedPtr<FJsonObject> &P,
678
- TSharedPtr<FMcpBridgeWebSocket> S) {
679
- return HandleInspectAction(R, A, P, S);
680
- });
681
- RegisterHandler(TEXT("system_control"),
682
- [this](const FString &R, const FString &A,
683
- const TSharedPtr<FJsonObject> &P,
684
- TSharedPtr<FMcpBridgeWebSocket> S) {
685
- return HandleSystemControlAction(R, A, P, S);
686
- });
687
- RegisterHandler(TEXT("manage_blueprint_graph"),
688
- [this](const FString &R, const FString &A,
689
- const TSharedPtr<FJsonObject> &P,
690
- TSharedPtr<FMcpBridgeWebSocket> S) {
691
- return HandleBlueprintGraphAction(R, A, P, S);
692
- });
693
- RegisterHandler(TEXT("list_blueprints"),
694
- [this](const FString &R, const FString &A,
695
- const TSharedPtr<FJsonObject> &P,
696
- TSharedPtr<FMcpBridgeWebSocket> S) {
697
- return HandleListBlueprints(R, A, P, S);
698
- });
699
- RegisterHandler(TEXT("manage_world_partition"),
700
- [this](const FString &R, const FString &A,
701
- const TSharedPtr<FJsonObject> &P,
702
- TSharedPtr<FMcpBridgeWebSocket> S) {
703
- return HandleWorldPartitionAction(R, A, P, S);
704
- });
705
- RegisterHandler(TEXT("manage_render"),
706
- [this](const FString &R, const FString &A,
707
- const TSharedPtr<FJsonObject> &P,
708
- TSharedPtr<FMcpBridgeWebSocket> S) {
709
- return HandleRenderAction(R, A, P, S);
710
- });
711
-
712
- RegisterHandler(TEXT("manage_input"),
713
- [this](const FString &R, const FString &A,
714
- const TSharedPtr<FJsonObject> &P,
715
- TSharedPtr<FMcpBridgeWebSocket> S) {
716
- return HandleInputAction(R, A, P, S);
717
- });
718
-
719
- RegisterHandler(TEXT("control_actor"),
720
- [this](const FString &R, const FString &A,
721
- const TSharedPtr<FJsonObject> &P,
722
- TSharedPtr<FMcpBridgeWebSocket> S) {
723
- return HandleControlActorAction(R, A, P, S);
724
- });
725
-
726
- RegisterHandler(TEXT("manage_level"),
727
- [this](const FString &R, const FString &A,
728
- const TSharedPtr<FJsonObject> &P,
729
- TSharedPtr<FMcpBridgeWebSocket> S) {
730
- return HandleLevelAction(R, A, P, S);
731
- });
732
-
733
- RegisterHandler(TEXT("manage_sequence"),
734
- [this](const FString &R, const FString &A,
735
- const TSharedPtr<FJsonObject> &P,
736
- TSharedPtr<FMcpBridgeWebSocket> S) {
737
- return HandleSequenceAction(R, A, P, S);
738
- });
739
-
740
- RegisterHandler(TEXT("manage_asset"),
741
- [this](const FString &R, const FString &A,
742
- const TSharedPtr<FJsonObject> &P,
743
- TSharedPtr<FMcpBridgeWebSocket> S) {
744
- return HandleAssetAction(R, A, P, S);
745
- });
746
-
747
- RegisterHandler(TEXT("rebuild_material"),
748
- [this](const FString &R, const FString &A,
749
- const TSharedPtr<FJsonObject> &P,
750
- TSharedPtr<FMcpBridgeWebSocket> S) {
751
- return HandleRebuildMaterial(R, P, S);
752
- });
753
-
754
- RegisterHandler(TEXT("manage_behavior_tree"),
755
- [this](const FString &R, const FString &A,
756
- const TSharedPtr<FJsonObject> &P,
757
- TSharedPtr<FMcpBridgeWebSocket> S) {
758
- return HandleBehaviorTreeAction(R, A, P, S);
759
- });
760
-
761
- RegisterHandler(TEXT("manage_audio"),
762
- [this](const FString &R, const FString &A,
763
- const TSharedPtr<FJsonObject> &P,
764
- TSharedPtr<FMcpBridgeWebSocket> S) {
765
- return HandleAudioAction(R, A, P, S);
766
- });
767
-
768
- RegisterHandler(TEXT("manage_lighting"),
769
- [this](const FString &R, const FString &A,
770
- const TSharedPtr<FJsonObject> &P,
771
- TSharedPtr<FMcpBridgeWebSocket> S) {
772
- return HandleLightingAction(R, A, P, S);
773
- });
774
-
775
- RegisterHandler(TEXT("manage_physics"),
776
- [this](const FString &R, const FString &A,
777
- const TSharedPtr<FJsonObject> &P,
778
- TSharedPtr<FMcpBridgeWebSocket> S) {
779
- return HandleAnimationPhysicsAction(R, A, P, S);
780
- });
781
-
782
- RegisterHandler(TEXT("manage_effect"),
783
- [this](const FString &R, const FString &A,
784
- const TSharedPtr<FJsonObject> &P,
785
- TSharedPtr<FMcpBridgeWebSocket> S) {
786
- return HandleEffectAction(R, A, P, S);
787
- });
788
-
789
- // Common effect aliases used by the Node server; registering them here keeps
790
- // dispatch O(1) and avoids relying on the late handler chain.
791
- RegisterHandler(TEXT("create_effect"),
792
- [this](const FString &R, const FString &A,
793
- const TSharedPtr<FJsonObject> &P,
794
- TSharedPtr<FMcpBridgeWebSocket> S) {
795
- return HandleEffectAction(R, A, P, S);
796
- });
797
- RegisterHandler(TEXT("clear_debug_shapes"),
798
- [this](const FString &R, const FString &A,
799
- const TSharedPtr<FJsonObject> &P,
800
- TSharedPtr<FMcpBridgeWebSocket> S) {
801
- return HandleEffectAction(R, A, P, S);
802
- });
803
-
804
- RegisterHandler(TEXT("manage_performance"),
805
- [this](const FString &R, const FString &A,
806
- const TSharedPtr<FJsonObject> &P,
807
- TSharedPtr<FMcpBridgeWebSocket> S) {
808
- return HandlePerformanceAction(R, A, P, S);
809
- });
810
- }
811
-
812
- // Drain and process any automation requests that were enqueued while the
813
- // subsystem was busy. This implementation lives in the primary subsystem
814
- // translation unit to ensure the symbol is available at link time for
815
- /**
816
- * @brief Processes all queued automation requests on the game thread.
817
- *
818
- * Ensures execution on the game thread (re-dispatches if called from another
819
- * thread), moves the shared pending-request queue into a local list under a
820
- * lock, clears the shared queue and the scheduled flag, then dispatches each
821
- * request to ProcessAutomationRequest.
822
- */
823
- void UMcpAutomationBridgeSubsystem::ProcessPendingAutomationRequests() {
824
- if (!IsInGameThread()) {
825
- AsyncTask(ENamedThreads::GameThread,
826
- [this]() { this->ProcessPendingAutomationRequests(); });
827
- return;
828
- }
829
-
830
- TArray<FPendingAutomationRequest> LocalQueue;
831
- {
832
- FScopeLock Lock(&PendingAutomationRequestsMutex);
833
- if (PendingAutomationRequests.Num() == 0) {
834
- bPendingRequestsScheduled = false;
835
- return;
836
- }
837
- LocalQueue = MoveTemp(PendingAutomationRequests);
838
- PendingAutomationRequests.Empty();
839
- bPendingRequestsScheduled = false;
840
- }
841
-
842
- for (const FPendingAutomationRequest &Req : LocalQueue) {
843
- ProcessAutomationRequest(Req.RequestId, Req.Action, Req.Payload,
844
- Req.RequestingSocket);
845
- }
846
- }