unreal-engine-mcp-server 0.4.7 → 0.5.1

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 (454) hide show
  1. package/.env.example +26 -0
  2. package/.env.production +38 -7
  3. package/.eslintrc.json +0 -54
  4. package/.eslintrc.override.json +8 -0
  5. package/.github/ISSUE_TEMPLATE/bug_report.yml +94 -0
  6. package/.github/ISSUE_TEMPLATE/config.yml +8 -0
  7. package/.github/ISSUE_TEMPLATE/feature_request.yml +56 -0
  8. package/.github/copilot-instructions.md +478 -45
  9. package/.github/dependabot.yml +19 -0
  10. package/.github/labeler.yml +24 -0
  11. package/.github/labels.yml +70 -0
  12. package/.github/pull_request_template.md +42 -0
  13. package/.github/release-drafter-config.yml +51 -0
  14. package/.github/workflows/auto-merge.yml +38 -0
  15. package/.github/workflows/ci.yml +38 -0
  16. package/.github/workflows/dependency-review.yml +17 -0
  17. package/.github/workflows/gemini-issue-triage.yml +172 -0
  18. package/.github/workflows/greetings.yml +27 -0
  19. package/.github/workflows/labeler.yml +17 -0
  20. package/.github/workflows/links.yml +80 -0
  21. package/.github/workflows/pr-size-labeler.yml +137 -0
  22. package/.github/workflows/publish-mcp.yml +13 -7
  23. package/.github/workflows/release-drafter.yml +23 -0
  24. package/.github/workflows/release.yml +112 -0
  25. package/.github/workflows/semantic-pull-request.yml +35 -0
  26. package/.github/workflows/smoke-test.yml +36 -0
  27. package/.github/workflows/stale.yml +28 -0
  28. package/CHANGELOG.md +338 -31
  29. package/CONTRIBUTING.md +140 -0
  30. package/GEMINI.md +115 -0
  31. package/Public/Plugin_setup_guide.mp4 +0 -0
  32. package/README.md +189 -128
  33. package/claude_desktop_config_example.json +7 -6
  34. package/dist/automation/bridge.d.ts +50 -0
  35. package/dist/automation/bridge.js +452 -0
  36. package/dist/automation/connection-manager.d.ts +23 -0
  37. package/dist/automation/connection-manager.js +107 -0
  38. package/dist/automation/handshake.d.ts +11 -0
  39. package/dist/automation/handshake.js +89 -0
  40. package/dist/automation/index.d.ts +3 -0
  41. package/dist/automation/index.js +3 -0
  42. package/dist/automation/message-handler.d.ts +12 -0
  43. package/dist/automation/message-handler.js +149 -0
  44. package/dist/automation/request-tracker.d.ts +25 -0
  45. package/dist/automation/request-tracker.js +98 -0
  46. package/dist/automation/types.d.ts +130 -0
  47. package/dist/automation/types.js +2 -0
  48. package/dist/cli.js +32 -5
  49. package/dist/config.d.ts +26 -0
  50. package/dist/config.js +59 -0
  51. package/dist/constants.d.ts +16 -0
  52. package/dist/constants.js +16 -0
  53. package/dist/graphql/loaders.d.ts +64 -0
  54. package/dist/graphql/loaders.js +117 -0
  55. package/dist/graphql/resolvers.d.ts +268 -0
  56. package/dist/graphql/resolvers.js +746 -0
  57. package/dist/graphql/schema.d.ts +5 -0
  58. package/dist/graphql/schema.js +437 -0
  59. package/dist/graphql/server.d.ts +26 -0
  60. package/dist/graphql/server.js +117 -0
  61. package/dist/graphql/types.d.ts +9 -0
  62. package/dist/graphql/types.js +2 -0
  63. package/dist/handlers/resource-handlers.d.ts +20 -0
  64. package/dist/handlers/resource-handlers.js +180 -0
  65. package/dist/index.d.ts +33 -18
  66. package/dist/index.js +130 -619
  67. package/dist/resources/actors.d.ts +17 -12
  68. package/dist/resources/actors.js +56 -76
  69. package/dist/resources/assets.d.ts +6 -14
  70. package/dist/resources/assets.js +115 -147
  71. package/dist/resources/levels.d.ts +13 -13
  72. package/dist/resources/levels.js +25 -34
  73. package/dist/server/resource-registry.d.ts +20 -0
  74. package/dist/server/resource-registry.js +37 -0
  75. package/dist/server/tool-registry.d.ts +23 -0
  76. package/dist/server/tool-registry.js +322 -0
  77. package/dist/server-setup.d.ts +20 -0
  78. package/dist/server-setup.js +71 -0
  79. package/dist/services/health-monitor.d.ts +34 -0
  80. package/dist/services/health-monitor.js +105 -0
  81. package/dist/services/metrics-server.d.ts +11 -0
  82. package/dist/services/metrics-server.js +105 -0
  83. package/dist/tools/actors.d.ts +163 -9
  84. package/dist/tools/actors.js +356 -311
  85. package/dist/tools/animation.d.ts +135 -4
  86. package/dist/tools/animation.js +510 -411
  87. package/dist/tools/assets.d.ts +75 -29
  88. package/dist/tools/assets.js +265 -284
  89. package/dist/tools/audio.d.ts +102 -42
  90. package/dist/tools/audio.js +272 -685
  91. package/dist/tools/base-tool.d.ts +17 -0
  92. package/dist/tools/base-tool.js +46 -0
  93. package/dist/tools/behavior-tree.d.ts +94 -0
  94. package/dist/tools/behavior-tree.js +39 -0
  95. package/dist/tools/blueprint.d.ts +208 -126
  96. package/dist/tools/blueprint.js +685 -832
  97. package/dist/tools/consolidated-tool-definitions.d.ts +5462 -1781
  98. package/dist/tools/consolidated-tool-definitions.js +829 -496
  99. package/dist/tools/consolidated-tool-handlers.d.ts +2 -1
  100. package/dist/tools/consolidated-tool-handlers.js +198 -1027
  101. package/dist/tools/debug.d.ts +143 -85
  102. package/dist/tools/debug.js +234 -180
  103. package/dist/tools/dynamic-handler-registry.d.ts +13 -0
  104. package/dist/tools/dynamic-handler-registry.js +23 -0
  105. package/dist/tools/editor.d.ts +30 -83
  106. package/dist/tools/editor.js +247 -244
  107. package/dist/tools/engine.d.ts +10 -4
  108. package/dist/tools/engine.js +13 -5
  109. package/dist/tools/environment.d.ts +30 -0
  110. package/dist/tools/environment.js +267 -0
  111. package/dist/tools/foliage.d.ts +65 -99
  112. package/dist/tools/foliage.js +221 -331
  113. package/dist/tools/handlers/actor-handlers.d.ts +3 -0
  114. package/dist/tools/handlers/actor-handlers.js +227 -0
  115. package/dist/tools/handlers/animation-handlers.d.ts +3 -0
  116. package/dist/tools/handlers/animation-handlers.js +185 -0
  117. package/dist/tools/handlers/argument-helper.d.ts +16 -0
  118. package/dist/tools/handlers/argument-helper.js +80 -0
  119. package/dist/tools/handlers/asset-handlers.d.ts +3 -0
  120. package/dist/tools/handlers/asset-handlers.js +496 -0
  121. package/dist/tools/handlers/audio-handlers.d.ts +3 -0
  122. package/dist/tools/handlers/audio-handlers.js +166 -0
  123. package/dist/tools/handlers/blueprint-handlers.d.ts +4 -0
  124. package/dist/tools/handlers/blueprint-handlers.js +358 -0
  125. package/dist/tools/handlers/common-handlers.d.ts +14 -0
  126. package/dist/tools/handlers/common-handlers.js +56 -0
  127. package/dist/tools/handlers/editor-handlers.d.ts +3 -0
  128. package/dist/tools/handlers/editor-handlers.js +119 -0
  129. package/dist/tools/handlers/effect-handlers.d.ts +3 -0
  130. package/dist/tools/handlers/effect-handlers.js +171 -0
  131. package/dist/tools/handlers/environment-handlers.d.ts +3 -0
  132. package/dist/tools/handlers/environment-handlers.js +170 -0
  133. package/dist/tools/handlers/graph-handlers.d.ts +3 -0
  134. package/dist/tools/handlers/graph-handlers.js +90 -0
  135. package/dist/tools/handlers/input-handlers.d.ts +3 -0
  136. package/dist/tools/handlers/input-handlers.js +21 -0
  137. package/dist/tools/handlers/inspect-handlers.d.ts +3 -0
  138. package/dist/tools/handlers/inspect-handlers.js +383 -0
  139. package/dist/tools/handlers/level-handlers.d.ts +3 -0
  140. package/dist/tools/handlers/level-handlers.js +237 -0
  141. package/dist/tools/handlers/lighting-handlers.d.ts +3 -0
  142. package/dist/tools/handlers/lighting-handlers.js +144 -0
  143. package/dist/tools/handlers/performance-handlers.d.ts +3 -0
  144. package/dist/tools/handlers/performance-handlers.js +130 -0
  145. package/dist/tools/handlers/pipeline-handlers.d.ts +3 -0
  146. package/dist/tools/handlers/pipeline-handlers.js +110 -0
  147. package/dist/tools/handlers/sequence-handlers.d.ts +3 -0
  148. package/dist/tools/handlers/sequence-handlers.js +376 -0
  149. package/dist/tools/handlers/system-handlers.d.ts +4 -0
  150. package/dist/tools/handlers/system-handlers.js +506 -0
  151. package/dist/tools/input.d.ts +19 -0
  152. package/dist/tools/input.js +89 -0
  153. package/dist/tools/introspection.d.ts +103 -40
  154. package/dist/tools/introspection.js +425 -568
  155. package/dist/tools/landscape.d.ts +54 -93
  156. package/dist/tools/landscape.js +284 -409
  157. package/dist/tools/level.d.ts +66 -27
  158. package/dist/tools/level.js +647 -675
  159. package/dist/tools/lighting.d.ts +77 -38
  160. package/dist/tools/lighting.js +445 -943
  161. package/dist/tools/logs.d.ts +3 -3
  162. package/dist/tools/logs.js +5 -57
  163. package/dist/tools/materials.d.ts +91 -24
  164. package/dist/tools/materials.js +194 -118
  165. package/dist/tools/niagara.d.ts +149 -39
  166. package/dist/tools/niagara.js +267 -182
  167. package/dist/tools/performance.d.ts +27 -13
  168. package/dist/tools/performance.js +203 -122
  169. package/dist/tools/physics.d.ts +32 -77
  170. package/dist/tools/physics.js +175 -582
  171. package/dist/tools/property-dictionary.d.ts +13 -0
  172. package/dist/tools/property-dictionary.js +82 -0
  173. package/dist/tools/sequence.d.ts +85 -60
  174. package/dist/tools/sequence.js +208 -747
  175. package/dist/tools/tool-definition-utils.d.ts +59 -0
  176. package/dist/tools/tool-definition-utils.js +35 -0
  177. package/dist/tools/ui.d.ts +64 -34
  178. package/dist/tools/ui.js +134 -214
  179. package/dist/types/automation-responses.d.ts +115 -0
  180. package/dist/types/automation-responses.js +2 -0
  181. package/dist/types/env.d.ts +0 -3
  182. package/dist/types/env.js +0 -7
  183. package/dist/types/responses.d.ts +249 -0
  184. package/dist/types/responses.js +2 -0
  185. package/dist/types/tool-interfaces.d.ts +898 -0
  186. package/dist/types/tool-interfaces.js +2 -0
  187. package/dist/types/tool-types.d.ts +183 -19
  188. package/dist/types/tool-types.js +0 -4
  189. package/dist/unreal-bridge.d.ts +24 -131
  190. package/dist/unreal-bridge.js +364 -1506
  191. package/dist/utils/command-validator.d.ts +9 -0
  192. package/dist/utils/command-validator.js +68 -0
  193. package/dist/utils/elicitation.d.ts +1 -1
  194. package/dist/utils/elicitation.js +12 -15
  195. package/dist/utils/error-handler.d.ts +2 -51
  196. package/dist/utils/error-handler.js +11 -87
  197. package/dist/utils/ini-reader.d.ts +3 -0
  198. package/dist/utils/ini-reader.js +69 -0
  199. package/dist/utils/logger.js +9 -6
  200. package/dist/utils/normalize.d.ts +3 -0
  201. package/dist/utils/normalize.js +56 -0
  202. package/dist/utils/path-security.d.ts +2 -0
  203. package/dist/utils/path-security.js +24 -0
  204. package/dist/utils/response-factory.d.ts +7 -0
  205. package/dist/utils/response-factory.js +27 -0
  206. package/dist/utils/response-validator.d.ts +3 -24
  207. package/dist/utils/response-validator.js +130 -81
  208. package/dist/utils/result-helpers.d.ts +4 -5
  209. package/dist/utils/result-helpers.js +15 -16
  210. package/dist/utils/safe-json.js +5 -11
  211. package/dist/utils/unreal-command-queue.d.ts +24 -0
  212. package/dist/utils/unreal-command-queue.js +120 -0
  213. package/dist/utils/validation.d.ts +0 -40
  214. package/dist/utils/validation.js +1 -78
  215. package/dist/wasm/index.d.ts +70 -0
  216. package/dist/wasm/index.js +535 -0
  217. package/docs/GraphQL-API.md +888 -0
  218. package/docs/Migration-Guide-v0.5.0.md +684 -0
  219. package/docs/Roadmap.md +53 -0
  220. package/docs/WebAssembly-Integration.md +628 -0
  221. package/docs/editor-plugin-extension.md +370 -0
  222. package/docs/handler-mapping.md +242 -0
  223. package/docs/native-automation-progress.md +128 -0
  224. package/docs/testing-guide.md +423 -0
  225. package/mcp-config-example.json +6 -6
  226. package/package.json +67 -28
  227. package/plugins/McpAutomationBridge/Config/FilterPlugin.ini +8 -0
  228. package/plugins/McpAutomationBridge/McpAutomationBridge.uplugin +64 -0
  229. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/McpAutomationBridge.Build.cs +189 -0
  230. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.cpp +22 -0
  231. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.h +30 -0
  232. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeHelpers.h +1983 -0
  233. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeModule.cpp +72 -0
  234. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSettings.cpp +46 -0
  235. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSubsystem.cpp +581 -0
  236. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AnimationHandlers.cpp +2394 -0
  237. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetQueryHandlers.cpp +300 -0
  238. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetWorkflowHandlers.cpp +2807 -0
  239. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AudioHandlers.cpp +1087 -0
  240. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BehaviorTreeHandlers.cpp +488 -0
  241. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.cpp +643 -0
  242. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.h +31 -0
  243. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintGraphHandlers.cpp +1184 -0
  244. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers.cpp +5652 -0
  245. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers_List.cpp +152 -0
  246. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ControlHandlers.cpp +2614 -0
  247. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_DebugHandlers.cpp +42 -0
  248. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EditorFunctionHandlers.cpp +1237 -0
  249. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EffectHandlers.cpp +1701 -0
  250. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EnvironmentHandlers.cpp +2145 -0
  251. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_FoliageHandlers.cpp +954 -0
  252. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InputHandlers.cpp +209 -0
  253. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InsightsHandlers.cpp +41 -0
  254. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LandscapeHandlers.cpp +1164 -0
  255. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LevelHandlers.cpp +762 -0
  256. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LightingHandlers.cpp +634 -0
  257. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LogHandlers.cpp +136 -0
  258. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_MaterialGraphHandlers.cpp +494 -0
  259. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraGraphHandlers.cpp +278 -0
  260. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraHandlers.cpp +625 -0
  261. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PerformanceHandlers.cpp +401 -0
  262. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PipelineHandlers.cpp +67 -0
  263. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ProcessRequest.cpp +735 -0
  264. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PropertyHandlers.cpp +2634 -0
  265. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_RenderHandlers.cpp +189 -0
  266. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.cpp +917 -0
  267. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.h +39 -0
  268. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequenceHandlers.cpp +2670 -0
  269. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequencerHandlers.cpp +519 -0
  270. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_TestHandlers.cpp +38 -0
  271. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_UiHandlers.cpp +668 -0
  272. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_WorldPartitionHandlers.cpp +346 -0
  273. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.cpp +1330 -0
  274. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.h +149 -0
  275. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpConnectionManager.cpp +783 -0
  276. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSettings.h +115 -0
  277. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSubsystem.h +796 -0
  278. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpConnectionManager.h +117 -0
  279. package/scripts/check-unreal-connection.mjs +19 -0
  280. package/scripts/clean-tmp.js +23 -0
  281. package/scripts/patch-wasm.js +26 -0
  282. package/scripts/run-all-tests.mjs +136 -0
  283. package/scripts/smoke-test.ts +94 -0
  284. package/scripts/sync-mcp-plugin.js +143 -0
  285. package/scripts/test-no-plugin-alternates.mjs +113 -0
  286. package/scripts/validate-server.js +46 -0
  287. package/scripts/verify-automation-bridge.js +200 -0
  288. package/server.json +58 -21
  289. package/src/automation/bridge.ts +558 -0
  290. package/src/automation/connection-manager.ts +130 -0
  291. package/src/automation/handshake.ts +99 -0
  292. package/src/automation/index.ts +2 -0
  293. package/src/automation/message-handler.ts +167 -0
  294. package/src/automation/request-tracker.ts +123 -0
  295. package/src/automation/types.ts +107 -0
  296. package/src/cli.ts +33 -6
  297. package/src/config.ts +73 -0
  298. package/src/constants.ts +19 -0
  299. package/src/graphql/loaders.ts +244 -0
  300. package/src/graphql/resolvers.ts +1008 -0
  301. package/src/graphql/schema.ts +452 -0
  302. package/src/graphql/server.ts +156 -0
  303. package/src/graphql/types.ts +10 -0
  304. package/src/handlers/resource-handlers.ts +186 -0
  305. package/src/index.ts +166 -664
  306. package/src/resources/actors.ts +58 -76
  307. package/src/resources/assets.ts +148 -134
  308. package/src/resources/levels.ts +28 -33
  309. package/src/server/resource-registry.ts +47 -0
  310. package/src/server/tool-registry.ts +354 -0
  311. package/src/server-setup.ts +114 -0
  312. package/src/services/health-monitor.ts +132 -0
  313. package/src/services/metrics-server.ts +142 -0
  314. package/src/tools/actors.ts +426 -323
  315. package/src/tools/animation.ts +672 -461
  316. package/src/tools/assets.ts +364 -289
  317. package/src/tools/audio.ts +323 -766
  318. package/src/tools/base-tool.ts +52 -0
  319. package/src/tools/behavior-tree.ts +45 -0
  320. package/src/tools/blueprint.ts +792 -970
  321. package/src/tools/consolidated-tool-definitions.ts +993 -515
  322. package/src/tools/consolidated-tool-handlers.ts +258 -1146
  323. package/src/tools/debug.ts +292 -187
  324. package/src/tools/dynamic-handler-registry.ts +33 -0
  325. package/src/tools/editor.ts +329 -253
  326. package/src/tools/engine.ts +14 -3
  327. package/src/tools/environment.ts +281 -0
  328. package/src/tools/foliage.ts +330 -392
  329. package/src/tools/handlers/actor-handlers.ts +265 -0
  330. package/src/tools/handlers/animation-handlers.ts +237 -0
  331. package/src/tools/handlers/argument-helper.ts +142 -0
  332. package/src/tools/handlers/asset-handlers.ts +532 -0
  333. package/src/tools/handlers/audio-handlers.ts +194 -0
  334. package/src/tools/handlers/blueprint-handlers.ts +380 -0
  335. package/src/tools/handlers/common-handlers.ts +87 -0
  336. package/src/tools/handlers/editor-handlers.ts +123 -0
  337. package/src/tools/handlers/effect-handlers.ts +220 -0
  338. package/src/tools/handlers/environment-handlers.ts +183 -0
  339. package/src/tools/handlers/graph-handlers.ts +116 -0
  340. package/src/tools/handlers/input-handlers.ts +28 -0
  341. package/src/tools/handlers/inspect-handlers.ts +450 -0
  342. package/src/tools/handlers/level-handlers.ts +252 -0
  343. package/src/tools/handlers/lighting-handlers.ts +147 -0
  344. package/src/tools/handlers/performance-handlers.ts +132 -0
  345. package/src/tools/handlers/pipeline-handlers.ts +127 -0
  346. package/src/tools/handlers/sequence-handlers.ts +415 -0
  347. package/src/tools/handlers/system-handlers.ts +564 -0
  348. package/src/tools/input.ts +101 -0
  349. package/src/tools/introspection.ts +493 -584
  350. package/src/tools/landscape.ts +418 -507
  351. package/src/tools/level.ts +786 -708
  352. package/src/tools/lighting.ts +588 -984
  353. package/src/tools/logs.ts +9 -57
  354. package/src/tools/materials.ts +237 -121
  355. package/src/tools/niagara.ts +335 -168
  356. package/src/tools/performance.ts +320 -169
  357. package/src/tools/physics.ts +274 -613
  358. package/src/tools/property-dictionary.ts +98 -0
  359. package/src/tools/sequence.ts +276 -820
  360. package/src/tools/tool-definition-utils.ts +35 -0
  361. package/src/tools/ui.ts +205 -283
  362. package/src/types/automation-responses.ts +119 -0
  363. package/src/types/env.ts +0 -10
  364. package/src/types/responses.ts +355 -0
  365. package/src/types/tool-interfaces.ts +250 -0
  366. package/src/types/tool-types.ts +243 -21
  367. package/src/unreal-bridge.ts +460 -1550
  368. package/src/utils/command-validator.ts +76 -0
  369. package/src/utils/elicitation.ts +10 -7
  370. package/src/utils/error-handler.ts +14 -90
  371. package/src/utils/ini-reader.ts +86 -0
  372. package/src/utils/logger.ts +8 -3
  373. package/src/utils/normalize.test.ts +162 -0
  374. package/src/utils/normalize.ts +60 -0
  375. package/src/utils/path-security.ts +43 -0
  376. package/src/utils/response-factory.ts +44 -0
  377. package/src/utils/response-validator.ts +176 -56
  378. package/src/utils/result-helpers.ts +21 -19
  379. package/src/utils/safe-json.test.ts +90 -0
  380. package/src/utils/safe-json.ts +14 -11
  381. package/src/utils/unreal-command-queue.ts +152 -0
  382. package/src/utils/validation.test.ts +184 -0
  383. package/src/utils/validation.ts +4 -1
  384. package/src/wasm/index.ts +838 -0
  385. package/test-server.mjs +100 -0
  386. package/tests/run-unreal-tool-tests.mjs +242 -14
  387. package/tests/test-animation.mjs +369 -0
  388. package/tests/test-asset-advanced.mjs +82 -0
  389. package/tests/test-asset-errors.mjs +35 -0
  390. package/tests/test-asset-graph.mjs +311 -0
  391. package/tests/test-audio.mjs +417 -0
  392. package/tests/test-automation-timeouts.mjs +98 -0
  393. package/tests/test-behavior-tree.mjs +444 -0
  394. package/tests/test-blueprint-graph.mjs +410 -0
  395. package/tests/test-blueprint.mjs +577 -0
  396. package/tests/test-client-mode.mjs +86 -0
  397. package/tests/test-console-command.mjs +56 -0
  398. package/tests/test-control-actor.mjs +425 -0
  399. package/tests/test-control-editor.mjs +112 -0
  400. package/tests/test-graphql.mjs +372 -0
  401. package/tests/test-input.mjs +349 -0
  402. package/tests/test-inspect.mjs +302 -0
  403. package/tests/test-landscape.mjs +316 -0
  404. package/tests/test-lighting.mjs +428 -0
  405. package/tests/test-manage-asset.mjs +438 -0
  406. package/tests/test-manage-level.mjs +89 -0
  407. package/tests/test-materials.mjs +356 -0
  408. package/tests/test-niagara.mjs +185 -0
  409. package/tests/test-no-inline-python.mjs +122 -0
  410. package/tests/test-performance.mjs +539 -0
  411. package/tests/test-plugin-handshake.mjs +82 -0
  412. package/tests/test-runner.mjs +933 -0
  413. package/tests/test-sequence.mjs +104 -0
  414. package/tests/test-system.mjs +96 -0
  415. package/tests/test-wasm.mjs +283 -0
  416. package/tests/test-world-partition.mjs +215 -0
  417. package/tsconfig.json +3 -3
  418. package/vitest.config.ts +35 -0
  419. package/wasm/Cargo.lock +363 -0
  420. package/wasm/Cargo.toml +42 -0
  421. package/wasm/LICENSE +21 -0
  422. package/wasm/README.md +253 -0
  423. package/wasm/src/dependency_resolver.rs +377 -0
  424. package/wasm/src/lib.rs +153 -0
  425. package/wasm/src/property_parser.rs +271 -0
  426. package/wasm/src/transform_math.rs +396 -0
  427. package/wasm/tests/integration.rs +109 -0
  428. package/.github/workflows/smithery-build.yml +0 -29
  429. package/dist/prompts/index.d.ts +0 -21
  430. package/dist/prompts/index.js +0 -217
  431. package/dist/tools/build_environment_advanced.d.ts +0 -65
  432. package/dist/tools/build_environment_advanced.js +0 -633
  433. package/dist/tools/rc.d.ts +0 -110
  434. package/dist/tools/rc.js +0 -437
  435. package/dist/tools/visual.d.ts +0 -40
  436. package/dist/tools/visual.js +0 -282
  437. package/dist/utils/http.d.ts +0 -6
  438. package/dist/utils/http.js +0 -151
  439. package/dist/utils/python-output.d.ts +0 -18
  440. package/dist/utils/python-output.js +0 -290
  441. package/dist/utils/python.d.ts +0 -2
  442. package/dist/utils/python.js +0 -4
  443. package/dist/utils/stdio-redirect.d.ts +0 -2
  444. package/dist/utils/stdio-redirect.js +0 -20
  445. package/docs/unreal-tool-test-cases.md +0 -574
  446. package/smithery.yaml +0 -29
  447. package/src/prompts/index.ts +0 -249
  448. package/src/tools/build_environment_advanced.ts +0 -732
  449. package/src/tools/rc.ts +0 -515
  450. package/src/tools/visual.ts +0 -281
  451. package/src/utils/http.ts +0 -187
  452. package/src/utils/python-output.ts +0 -351
  453. package/src/utils/python.ts +0 -3
  454. package/src/utils/stdio-redirect.ts +0 -18
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Condensed Console Command Test Suite (15 cases)
4
+ * Tool: system_control (action: console_command)
5
+ */
6
+
7
+ import { runToolTests } from './test-runner.mjs';
8
+
9
+ const testCases = [
10
+ { scenario: 'Show FPS stats', toolName: 'system_control', arguments: { action: 'console_command', command: 'stat fps' }, expected: 'success - command executed' },
11
+ { scenario: 'Show unit stats', toolName: 'system_control', arguments: { action: 'console_command', command: 'stat unit' }, expected: 'success - unit stats shown' },
12
+ { scenario: 'Set resolution 1280x720 windowed', toolName: 'system_control', arguments: { action: 'console_command', command: 'r.SetRes 1280x720w' }, expected: 'success - resolution set' },
13
+ { scenario: 'Enable wireframe view', toolName: 'system_control', arguments: { action: 'console_command', command: 'viewmode wireframe' }, expected: 'success - wireframe enabled' },
14
+ { scenario: 'Enable lit view', toolName: 'system_control', arguments: { action: 'console_command', command: 'viewmode lit' }, expected: 'success - lit view enabled' },
15
+ { scenario: 'Show GPU profiler', toolName: 'system_control', arguments: { action: 'console_command', command: 'profilegpu' }, expected: 'success - GPU profiler shown' },
16
+ { scenario: 'Toggle collision visibility', toolName: 'system_control', arguments: { action: 'console_command', command: 'show collision' }, expected: 'success - collision visibility toggled' },
17
+ { scenario: 'Set screen percentage to 100', toolName: 'system_control', arguments: { action: 'console_command', command: 'r.ScreenPercentage 100' }, expected: 'success - screen percentage set' },
18
+ { scenario: 'Enable temporal AA weight', toolName: 'system_control', arguments: { action: 'console_command', command: 'r.TemporalAACurrentFrameWeight 0.04' }, expected: 'success - TAA weight set' },
19
+ { scenario: 'Set VSync on', toolName: 'system_control', arguments: { action: 'console_command', command: 'r.VSync 1' }, expected: 'success - VSync enabled' },
20
+ { scenario: 'Set max FPS to 60', toolName: 'system_control', arguments: { action: 'console_command', command: 't.MaxFPS 60' }, expected: 'success - max FPS set' },
21
+ { scenario: 'Show RHI stats', toolName: 'system_control', arguments: { action: 'console_command', command: 'stat rhi' }, expected: 'success - RHI stats shown' },
22
+ { scenario: 'Show game thread stats', toolName: 'system_control', arguments: { action: 'console_command', command: 'stat game' }, expected: 'success - game thread stats shown' },
23
+ { scenario: 'Show animation stats', toolName: 'system_control', arguments: { action: 'console_command', command: 'stat anim' }, expected: 'success - animation stats shown' },
24
+ { scenario: 'Reset viewmode to lit', toolName: 'system_control', arguments: { action: 'console_command', command: 'viewmode lit' }, expected: 'success - viewmode reset' },
25
+ { scenario: 'Show GPU', toolName: 'system_control', arguments: { action: 'console_command', command: 'stat gpu' }, expected: 'success or handled' },
26
+ { scenario: 'Show memory', toolName: 'system_control', arguments: { action: 'console_command', command: 'stat memory' }, expected: 'success or handled' },
27
+ { scenario: 'Set Mip LOD Bias', toolName: 'system_control', arguments: { action: 'console_command', command: 'r.MipMapLODBias 0' }, expected: 'success or handled' },
28
+ { scenario: 'Set AA Quality', toolName: 'system_control', arguments: { action: 'console_command', command: 'r.PostProcessAAQuality 4' }, expected: 'success or handled' },
29
+ { scenario: 'Flush rendering commands', toolName: 'system_control', arguments: { action: 'console_command', command: 'r.FlushRenderingCommands' }, expected: 'success or handled' },
30
+ {
31
+ scenario: "Blocked: Dangerous quit",
32
+ toolName: "system_control",
33
+ arguments: { action: "console_command", command: "quit" },
34
+ expected: "blocked|dangerous"
35
+ },
36
+ {
37
+ scenario: "Error: Empty command",
38
+ toolName: "system_control",
39
+ arguments: { action: "console_command", command: "" },
40
+ expected: "error|empty"
41
+ },
42
+ {
43
+ scenario: "Edge: Very long safe command",
44
+ toolName: "system_control",
45
+ arguments: { action: "console_command", command: "stat fps; stat gpu; stat memory" },
46
+ expected: "success"
47
+ },
48
+ {
49
+ scenario: "Warning: Unknown command",
50
+ toolName: "system_control",
51
+ arguments: { action: "console_command", command: "unknowncmd" },
52
+ expected: "warning|unknown"
53
+ }
54
+ ];
55
+
56
+ await runToolTests('Console Command', testCases);
@@ -0,0 +1,425 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Condensed Actor Control Test Suite (15 cases) — safe for real Editor runs.
4
+ * Tool: control_actor
5
+ */
6
+
7
+ import { runToolTests } from './test-runner.mjs';
8
+
9
+ const testCases = [
10
+ {
11
+ scenario: 'Spawn StaticMeshActor (engine cube)',
12
+ toolName: 'control_actor',
13
+ arguments: { action: 'spawn', classPath: '/Engine/BasicShapes/Cube', actorName: 'TC_Cube', location: { x: 0, y: 0, z: 200 } },
14
+ expected: 'success - actor spawned'
15
+ },
16
+ {
17
+ scenario: 'Spawn CameraActor',
18
+ toolName: 'control_actor',
19
+ arguments: { action: 'spawn', classPath: 'CameraActor', actorName: 'TC_Camera', location: { x: 300, y: 0, z: 300 } },
20
+ expected: 'success - camera spawned'
21
+ },
22
+ {
23
+ scenario: 'Spawn PointLight',
24
+ toolName: 'control_actor',
25
+ arguments: { action: 'spawn', classPath: 'PointLight', actorName: 'TC_PointLight', location: { x: -300, y: 0, z: 300 } },
26
+ expected: 'success - light spawned'
27
+ },
28
+ {
29
+ scenario: 'Spawn Physics Cube (use control_actor instead of Python)',
30
+ toolName: 'control_actor',
31
+ arguments: { action: 'spawn', classPath: '/Engine/BasicShapes/Cube', actorName: 'TC_Physics', location: { x: 0, y: 0, z: 500 } },
32
+ expected: 'success - physics actor created'
33
+ },
34
+ {
35
+ scenario: 'Apply force to Physics actor',
36
+ toolName: 'control_actor',
37
+ arguments: { action: 'apply_force', actorName: 'TC_Physics', force: { x: 200000, y: 0, z: 0 } },
38
+ expected: 'success - force applied'
39
+ },
40
+ {
41
+ scenario: 'Set transform on an actor',
42
+ toolName: 'control_actor',
43
+ arguments: { action: 'set_transform', actorName: 'TC_Cube', location: { x: 100, y: 100, z: 400 }, rotation: { pitch: 0, yaw: 45, roll: 0 } },
44
+ expected: 'success - actor transform set'
45
+ },
46
+ {
47
+ scenario: 'Get actor transform',
48
+ toolName: 'control_actor',
49
+ arguments: { action: 'get_transform', actorName: 'TC_Cube' },
50
+ expected: 'success - actor transform retrieved'
51
+ },
52
+ {
53
+ scenario: 'Add PointLight component to actor',
54
+ toolName: 'control_actor',
55
+ arguments: { action: 'add_component', actorName: 'TC_Cube', componentType: 'PointLightComponent', componentName: 'TC_PointLightComp', properties: { Intensity: 3000 } },
56
+ expected: 'success - component added'
57
+ },
58
+ {
59
+ scenario: 'Set component properties',
60
+ toolName: 'control_actor',
61
+ arguments: { action: 'set_component_properties', actorName: 'TC_Cube', componentName: 'TC_PointLightComp', properties: { Intensity: 1500 } },
62
+ expected: 'success - component properties set'
63
+ },
64
+ {
65
+ scenario: 'Get components of actor',
66
+ toolName: 'control_actor',
67
+ arguments: { action: 'get_components', actorName: 'TC_Cube' },
68
+ expected: 'success - actor components retrieved'
69
+ },
70
+ {
71
+ scenario: 'Toggle actor visibility',
72
+ toolName: 'control_actor',
73
+ arguments: { action: 'set_visibility', actorName: 'TC_Cube', visible: false },
74
+ expected: 'success - actor visibility updated'
75
+ },
76
+ {
77
+ scenario: 'Duplicate actor',
78
+ toolName: 'control_actor',
79
+ arguments: { action: 'duplicate', actorName: 'TC_Cube', newName: 'TC_Cube_Copy', offset: { x: 50, y: 0, z: 0 } },
80
+ expected: 'success - actor duplicated'
81
+ },
82
+ {
83
+ scenario: 'Attach actor to another',
84
+ toolName: 'control_actor',
85
+ arguments: { action: 'attach', childActor: 'TC_Cube_Copy', parentActor: 'TC_Cube' },
86
+ expected: 'success - actor attached'
87
+ },
88
+ {
89
+ scenario: 'Detach actor',
90
+ toolName: 'control_actor',
91
+ arguments: { action: 'detach', actorName: 'TC_Cube_Copy' },
92
+ expected: 'success - actor detached'
93
+ },
94
+ {
95
+ scenario: 'Tag actor',
96
+ toolName: 'control_actor',
97
+ arguments: { action: 'add_tag', actorName: 'TC_Cube', tag: 'TC_Tag' },
98
+ expected: 'success - actor tagged'
99
+ },
100
+ {
101
+ scenario: 'Find actors by tag',
102
+ toolName: 'control_actor',
103
+ arguments: { action: 'find_by_tag', tag: 'TC_Tag' },
104
+ expected: 'success - actors found by tag'
105
+ },
106
+ {
107
+ scenario: 'Find actors by name',
108
+ toolName: 'control_actor',
109
+ arguments: { action: 'find_by_name', name: 'TC_Cube' },
110
+ expected: 'success - actors found by name'
111
+ },
112
+ {
113
+ scenario: 'Create snapshot for an actor',
114
+ toolName: 'control_actor',
115
+ arguments: { action: 'create_snapshot', actorName: 'TC_Cube', snapshotName: 'TC_Before' },
116
+ expected: 'success - actor snapshot created'
117
+ },
118
+ {
119
+ scenario: 'Create test blueprint first (BP_TestActor)',
120
+ toolName: 'manage_blueprint',
121
+ arguments: { action: 'create', path: '/Game/Blueprints/BP_TestActor', parentClass: 'Actor', blueprintType: 'actor' },
122
+ expected: 'success - blueprint created for testing'
123
+ },
124
+ {
125
+ scenario: 'Add Health variable to test blueprint',
126
+ toolName: 'manage_blueprint',
127
+ arguments: { action: 'add_variable', blueprintPath: '/Game/Blueprints/BP_TestActor', variableName: 'Health', variableType: 'float', defaultValue: 100.0 },
128
+ expected: 'success - Health variable added'
129
+ },
130
+ {
131
+ scenario: 'Add IsActive variable to test blueprint',
132
+ toolName: 'manage_blueprint',
133
+ arguments: { action: 'add_variable', blueprintPath: '/Game/Blueprints/BP_TestActor', variableName: 'IsActive', variableType: 'bool', defaultValue: false },
134
+ expected: 'success - IsActive variable added'
135
+ },
136
+ {
137
+ scenario: 'Spawn blueprint instance',
138
+ toolName: 'control_actor',
139
+ arguments: { action: 'spawn_blueprint', blueprintPath: '/Game/Blueprints/BP_TestActor', actorName: 'TC_BP_Instance', location: { x: 600, y: 0, z: 200 } },
140
+ expected: 'success - blueprint instance spawned'
141
+ },
142
+ {
143
+ scenario: 'Set blueprint variables',
144
+ toolName: 'control_actor',
145
+ arguments: { action: 'set_blueprint_variables', actorName: 'TC_BP_Instance', variables: { Health: 120, IsActive: true } },
146
+ expected: 'success - blueprint variables set'
147
+ },
148
+ {
149
+ scenario: 'Delete by tag filter',
150
+ toolName: 'control_actor',
151
+ arguments: { action: 'delete_by_tag', tag: 'TC_Tag' },
152
+ expected: 'success - actors deleted by tag'
153
+ },
154
+ // Real-World Scenario: Composite Actor (Parent-Child)
155
+ {
156
+ scenario: 'Composite Actor - Spawn Parent (Car)',
157
+ toolName: 'control_actor',
158
+ arguments: { action: 'spawn', classPath: '/Engine/BasicShapes/Cube', actorName: 'TC_Car_Body', location: { x: 1000, y: 0, z: 100 } },
159
+ expected: 'success'
160
+ },
161
+ {
162
+ scenario: 'Composite Actor - Spawn Child (Wheel)',
163
+ toolName: 'control_actor',
164
+ arguments: { action: 'spawn', classPath: '/Engine/BasicShapes/Cylinder', actorName: 'TC_Car_Wheel', location: { x: 1050, y: 50, z: 50 } },
165
+ expected: 'success'
166
+ },
167
+ {
168
+ scenario: 'Composite Actor - Attach Wheel to Body',
169
+ toolName: 'control_actor',
170
+ arguments: { action: 'attach', childActor: 'TC_Car_Wheel', parentActor: 'TC_Car_Body' },
171
+ expected: 'success'
172
+ },
173
+ {
174
+ scenario: 'Composite Actor - Move Parent',
175
+ toolName: 'control_actor',
176
+ arguments: { action: 'set_transform', actorName: 'TC_Car_Body', location: { x: 1200, y: 0, z: 100 } },
177
+ expected: 'success'
178
+ },
179
+
180
+ // Real-World Scenario: Batch Operations
181
+ {
182
+ scenario: 'Batch Ops - Spawn Crowd 1',
183
+ toolName: 'control_actor',
184
+ arguments: { action: 'spawn', classPath: '/Engine/BasicShapes/Cube', actorName: 'TC_Crowd_1', location: { x: 2000, y: 0, z: 0 } },
185
+ expected: 'success'
186
+ },
187
+ {
188
+ scenario: 'Batch Ops - Spawn Crowd 2',
189
+ toolName: 'control_actor',
190
+ arguments: { action: 'spawn', classPath: '/Engine/BasicShapes/Cube', actorName: 'TC_Crowd_2', location: { x: 2100, y: 0, z: 0 } },
191
+ expected: 'success'
192
+ },
193
+ {
194
+ scenario: 'Batch Ops - Tag Crowd',
195
+ toolName: 'control_actor',
196
+ arguments: { action: 'add_tag', actorName: 'TC_Crowd_1', tag: 'TC_Crowd' },
197
+ expected: 'success'
198
+ },
199
+ {
200
+ scenario: 'Batch Ops - Tag Crowd 2',
201
+ toolName: 'control_actor',
202
+ arguments: { action: 'add_tag', actorName: 'TC_Crowd_2', tag: 'TC_Crowd' },
203
+ expected: 'success'
204
+ },
205
+ {
206
+ scenario: 'Batch Ops - Find by Tag',
207
+ toolName: 'control_actor',
208
+ arguments: { action: 'find_by_tag', tag: 'TC_Crowd' },
209
+ expected: 'success'
210
+ },
211
+
212
+ // Cleanup
213
+ {
214
+ scenario: 'Cleanup - delete test actors',
215
+ toolName: 'control_actor',
216
+ arguments: { action: 'delete', actorNames: ['TC_Cube_Copy', 'TC_Physics', 'TC_PointLight', 'TC_BP_Instance', 'TC_Camera', 'TC_Car_Wheel', 'TC_Car_Body', 'TC_Crowd_1', 'TC_Crowd_2'] },
217
+ expected: 'success - actors deleted'
218
+ },
219
+ // Robust Blueprint Cleanup Sequence
220
+ {
221
+ scenario: 'Cleanup - Force GC (Pre-BP Delete)',
222
+ toolName: 'system_control',
223
+ arguments: { action: 'console_command', command: 'obj gc' },
224
+ expected: 'success'
225
+ },
226
+ {
227
+ scenario: 'Cleanup - Wait for GC',
228
+ toolName: 'system_control',
229
+ arguments: { action: 'console_command', command: 'Sleep 1' },
230
+ expected: 'success'
231
+ },
232
+ {
233
+ scenario: 'Cleanup - Delete Test Blueprint',
234
+ toolName: 'manage_asset',
235
+ arguments: { action: 'delete_assets', paths: ['/Game/Blueprints/BP_TestActor'], force: true },
236
+ expected: 'success|not_found|error' // Accept any result to avoid failing test on cleanup
237
+ },
238
+ {
239
+ scenario: "Error: Invalid action",
240
+ toolName: "control_actor",
241
+ arguments: { action: "invalid_action" },
242
+ expected: "error|validation|unknown_action"
243
+ },
244
+ {
245
+ scenario: "Error: Spawn invalid class",
246
+ toolName: "control_actor",
247
+ arguments: { action: "spawn", classPath: "InvalidClassDoesNotExist", actorName: "TestInvalid" },
248
+ expected: "error|class_not_found"
249
+ },
250
+ {
251
+ scenario: "Edge: Zero force (no-op)",
252
+ toolName: "control_actor",
253
+ arguments: { action: "apply_force", actorName: "TC_Physics", force: { x: 0, y: 0, z: 0 } },
254
+ expected: "success"
255
+ },
256
+ {
257
+ scenario: "Border: Extreme location",
258
+ toolName: "control_actor",
259
+ arguments: { action: "spawn", classPath: "/Engine/BasicShapes/Cube", actorName: "TC_Extreme", location: { x: 1000000, y: 1000000, z: 1000000 } },
260
+ expected: "success"
261
+ },
262
+ {
263
+ scenario: "Error: Non-existent actor",
264
+ toolName: "control_actor",
265
+ arguments: { action: "delete", actorName: "NonExistentActor" },
266
+ expected: "not_found|error"
267
+ },
268
+ {
269
+ scenario: "Edge: Empty tag array (find)",
270
+ toolName: "control_actor",
271
+ arguments: { action: "find_by_tag", tag: "" },
272
+ expected: "success|empty"
273
+ },
274
+ {
275
+ scenario: "Timeout test (short timeout fail)",
276
+ toolName: "control_actor",
277
+ arguments: { action: "spawn", classPath: "StaticMeshActor", timeoutMs: 100 },
278
+ expected: "timeout|error"
279
+ },
280
+ {
281
+ scenario: "Batch delete empty array",
282
+ toolName: "control_actor",
283
+ arguments: { action: "delete", actorNames: [] },
284
+ expected: "success|no_op"
285
+ },
286
+ // --- New Test Cases (+20) ---
287
+ {
288
+ scenario: "Restore TC_Cube for new tests",
289
+ toolName: "control_actor",
290
+ arguments: { action: "spawn", classPath: "/Engine/BasicShapes/Cube", actorName: "TC_Cube", location: { x: 0, y: 0, z: 0 } },
291
+ expected: "success"
292
+ },
293
+ {
294
+ scenario: "Set transform: Location only",
295
+ toolName: "control_actor",
296
+ arguments: { action: "set_transform", actorName: "TC_Cube", location: { x: 50, y: 50, z: 50 } },
297
+ expected: "success"
298
+ },
299
+ {
300
+ scenario: "Set transform: Rotation only",
301
+ toolName: "control_actor",
302
+ arguments: { action: "set_transform", actorName: "TC_Cube", rotation: { pitch: 90, yaw: 0, roll: 0 } },
303
+ expected: "success"
304
+ },
305
+ {
306
+ scenario: "Set transform: Scale only",
307
+ toolName: "control_actor",
308
+ arguments: { action: "set_transform", actorName: "TC_Cube", scale: { x: 2, y: 2, z: 2 } },
309
+ expected: "success"
310
+ },
311
+ {
312
+ scenario: "Error: Get transform non-existent",
313
+ toolName: "control_actor",
314
+ arguments: { action: "get_transform", actorName: "NonExistentActor_123" },
315
+ expected: "error|not_found"
316
+ },
317
+ {
318
+ scenario: "Error: Attach to self (cycle)",
319
+ toolName: "control_actor",
320
+ arguments: { action: "attach", childActor: "TC_Cube", parentActor: "TC_Cube" },
321
+ expected: "error|cycle"
322
+ },
323
+ {
324
+ scenario: "Error: Attach to non-existent parent",
325
+ toolName: "control_actor",
326
+ arguments: { action: "attach", childActor: "TC_Cube", parentActor: "NonExistentParent" },
327
+ expected: "error|not_found"
328
+ },
329
+ {
330
+ scenario: "Error: Attach non-existent child",
331
+ toolName: "control_actor",
332
+ arguments: { action: "attach", childActor: "NonExistentChild", parentActor: "TC_Cube" },
333
+ expected: "error|not_found"
334
+ },
335
+ {
336
+ scenario: "Detach: Not attached (safe)",
337
+ toolName: "control_actor",
338
+ arguments: { action: "detach", actorName: "TC_Cube" },
339
+ expected: "success" // Should be safe/idempotent
340
+ },
341
+ {
342
+ scenario: "Visibility: Non-existent actor",
343
+ toolName: "control_actor",
344
+ arguments: { action: "set_visibility", actorName: "NonExistentActor_Vis", visible: true },
345
+ expected: "error|not_found"
346
+ },
347
+ {
348
+ scenario: "Tags: Add existing tag (idempotent)",
349
+ toolName: "control_actor",
350
+ arguments: { action: "add_tag", actorName: "TC_Cube", tag: "TC_Tag" },
351
+ expected: "success"
352
+ },
353
+ {
354
+ scenario: "Tags: Remove non-existent tag",
355
+ toolName: "control_actor",
356
+ arguments: { action: "remove_tag", actorName: "TC_Cube", tag: "NonExistentTag" },
357
+ expected: "success|not_found"
358
+ },
359
+ {
360
+ scenario: "Tags: Remove existing tag",
361
+ toolName: "control_actor",
362
+ arguments: { action: "remove_tag", actorName: "TC_Cube", tag: "TC_Tag" },
363
+ expected: "success"
364
+ },
365
+ {
366
+ scenario: "Components: Get from non-existent",
367
+ toolName: "control_actor",
368
+ arguments: { action: "get_components", actorName: "NonExistentActor_Comp" },
369
+ expected: "error|not_found"
370
+ },
371
+ {
372
+ scenario: "List actors: All",
373
+ toolName: "control_actor",
374
+ arguments: { action: "list" },
375
+ expected: "success"
376
+ },
377
+ {
378
+ scenario: "Snapshot: Non-existent actor",
379
+ toolName: "control_actor",
380
+ arguments: { action: "create_snapshot", actorName: "GhostActor", snapshotName: "Snap1" },
381
+ expected: "error|not_found"
382
+ },
383
+ {
384
+ scenario: "Duplicate: Non-existent actor",
385
+ toolName: "control_actor",
386
+ arguments: { action: "duplicate", actorName: "GhostActor", newName: "GhostCopy" },
387
+ expected: "error|not_found"
388
+ },
389
+ {
390
+ scenario: "Force: Non-existent actor",
391
+ toolName: "control_actor",
392
+ arguments: { action: "apply_force", actorName: "GhostActor", force: { x: 100, y: 0, z: 0 } },
393
+ expected: "error|not_found"
394
+ },
395
+ {
396
+ scenario: "Spawn: Hidden",
397
+ toolName: "control_actor",
398
+ arguments: {
399
+ action: "spawn",
400
+ classPath: "/Engine/BasicShapes/Sphere",
401
+ actorName: "TC_HiddenSphere",
402
+ properties: { bHidden: true }
403
+ },
404
+ expected: "success"
405
+ },
406
+ {
407
+ scenario: "Set properties: Non-existent component",
408
+ toolName: "control_actor",
409
+ arguments: {
410
+ action: "set_component_properties",
411
+ actorName: "TC_Cube",
412
+ componentName: "InvalidComp",
413
+ properties: { Intensity: 5000 }
414
+ },
415
+ expected: "error|not_found"
416
+ },
417
+ {
418
+ scenario: "Final Cleanup",
419
+ toolName: "control_actor",
420
+ arguments: { action: "delete", actorNames: ["TC_Cube", "TC_HiddenSphere"] },
421
+ expected: "success"
422
+ }
423
+ ];
424
+
425
+ await runToolTests('Actor Control', testCases);
@@ -0,0 +1,112 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Comprehensive Editor Control Test Suite
4
+ * Tool: control_editor
5
+ * Coverage: All 24 actions with success, error, and edge cases
6
+ */
7
+
8
+ import { runToolTests } from './test-runner.mjs';
9
+
10
+ const testCases = [
11
+ // === PRE-FIX ===
12
+ {
13
+ scenario: 'Pre-Fix: Remove Invalid Data Layers (Native)',
14
+ toolName: 'manage_level',
15
+ arguments: {
16
+ action: 'cleanup_invalid_datalayers'
17
+ },
18
+ expected: 'success'
19
+ },
20
+
21
+ // === PIE CONTROL (play, stop, stop_pie, pause, resume) ===
22
+ { scenario: 'Start PIE (Play in Editor)', toolName: 'control_editor', arguments: { action: 'play' }, expected: 'success - PIE started' },
23
+ { scenario: 'Pause PIE', toolName: 'control_editor', arguments: { action: 'pause' }, expected: 'success - PIE paused' },
24
+ { scenario: 'Resume PIE', toolName: 'control_editor', arguments: { action: 'resume' }, expected: 'success - PIE resumed' },
25
+ { scenario: 'Stop PIE', toolName: 'control_editor', arguments: { action: 'stop' }, expected: 'success - PIE stopped' },
26
+ { scenario: 'Stop PIE (alias)', toolName: 'control_editor', arguments: { action: 'stop_pie' }, expected: 'success - PIE stopped' },
27
+
28
+ // === GAME SPEED ===
29
+ { scenario: 'Set game speed 0.5x', toolName: 'control_editor', arguments: { action: 'set_game_speed', speed: 0.5 }, expected: 'success' },
30
+ { scenario: 'Set game speed 2x', toolName: 'control_editor', arguments: { action: 'set_game_speed', speed: 2.0 }, expected: 'success' },
31
+ { scenario: 'Set game speed 1x (reset)', toolName: 'control_editor', arguments: { action: 'set_game_speed', speed: 1.0 }, expected: 'success' },
32
+
33
+ // === EJECT / POSSESS ===
34
+ { scenario: 'Eject from possessed pawn', toolName: 'control_editor', arguments: { action: 'eject' }, expected: 'success|handled' },
35
+ { scenario: 'Possess pawn', toolName: 'control_editor', arguments: { action: 'possess' }, expected: 'success|handled' },
36
+
37
+ // === CAMERA CONTROL ===
38
+ { scenario: 'Set camera location and rotation', toolName: 'control_editor', arguments: { action: 'set_camera', location: { x: 0, y: 0, z: 500 }, rotation: { pitch: -45, yaw: 0, roll: 0 } }, expected: 'success - camera set' },
39
+ { scenario: 'Set camera position only', toolName: 'control_editor', arguments: { action: 'set_camera_position', location: { x: 100, y: 100, z: 300 } }, expected: 'success' },
40
+ { scenario: 'Set camera rotation only', toolName: 'control_editor', arguments: { action: 'set_camera', rotation: { pitch: -30, yaw: 45, roll: 0 } }, expected: 'success' },
41
+ { scenario: 'Focus camera on actor', toolName: 'control_editor', arguments: { action: 'set_camera', targetActor: 'TC_Cube' }, expected: 'success - camera focused' },
42
+ { scenario: 'Set camera FOV 90', toolName: 'control_editor', arguments: { action: 'set_camera_fov', fov: 90 }, expected: 'success' },
43
+ { scenario: 'Set camera FOV 60', toolName: 'control_editor', arguments: { action: 'set_camera_fov', fov: 60 }, expected: 'success' },
44
+ { scenario: 'Set camera FOV extreme (120)', toolName: 'control_editor', arguments: { action: 'set_camera_fov', fov: 120 }, expected: 'success' },
45
+
46
+ // === VIEW MODE ===
47
+ { scenario: 'Set view mode to Lit', toolName: 'control_editor', arguments: { action: 'set_view_mode', viewMode: 'Lit' }, expected: 'success - view mode set' },
48
+ { scenario: 'Set view mode to Wireframe', toolName: 'control_editor', arguments: { action: 'set_view_mode', viewMode: 'Wireframe' }, expected: 'success - view mode set' },
49
+ { scenario: 'Set view mode to Unlit', toolName: 'control_editor', arguments: { action: 'set_view_mode', viewMode: 'Unlit' }, expected: 'success' },
50
+ { scenario: 'Set view mode to PathTracing', toolName: 'control_editor', arguments: { action: 'set_view_mode', viewMode: 'PathTracing' }, expected: 'success|not_supported' },
51
+
52
+ // === VIEWPORT SETTINGS ===
53
+ { scenario: 'Set viewport resolution 1920x1080', toolName: 'control_editor', arguments: { action: 'set_viewport_resolution', width: 1920, height: 1080 }, expected: 'success' },
54
+ { scenario: 'Set viewport resolution 1280x720', toolName: 'control_editor', arguments: { action: 'set_viewport_resolution', width: 1280, height: 720 }, expected: 'success' },
55
+ { scenario: 'Set viewport realtime on', toolName: 'control_editor', arguments: { action: 'set_viewport_realtime', enabled: true }, expected: 'success' },
56
+ { scenario: 'Set viewport realtime off', toolName: 'control_editor', arguments: { action: 'set_viewport_realtime', enabled: false }, expected: 'success' },
57
+
58
+ // === SCREENSHOT ===
59
+ { scenario: 'Take screenshot', toolName: 'control_editor', arguments: { action: 'screenshot', filename: 'TC_Screenshot' }, expected: 'success - screenshot taken' },
60
+ { scenario: 'Take screenshot with resolution', toolName: 'control_editor', arguments: { action: 'screenshot', filename: 'TC_Screenshot_HD', width: 1920, height: 1080 }, expected: 'success' },
61
+
62
+ // === RECORDING ===
63
+ { scenario: 'Start recording', toolName: 'control_editor', arguments: { action: 'start_recording', filename: 'TC_Record', frameRate: 30 }, expected: 'success - recording started' },
64
+ { scenario: 'Stop recording', toolName: 'control_editor', arguments: { action: 'stop_recording' }, expected: 'success - recording stopped' },
65
+
66
+ // === FRAME STEPPING ===
67
+ { scenario: 'Step single frame', toolName: 'control_editor', arguments: { action: 'step_frame' }, expected: 'success - frame stepped' },
68
+ { scenario: 'Step multiple frames', toolName: 'control_editor', arguments: { action: 'step_frame', steps: 5 }, expected: 'success' },
69
+
70
+ // === BOOKMARKS ===
71
+ { scenario: 'Create camera bookmark', toolName: 'control_editor', arguments: { action: 'create_bookmark', bookmarkName: 'TC_Bookmark_1' }, expected: 'success - bookmark created' },
72
+ { scenario: 'Create second bookmark', toolName: 'control_editor', arguments: { action: 'create_bookmark', bookmarkName: 'TC_Bookmark_2' }, expected: 'success' },
73
+ { scenario: 'Jump to bookmark 1', toolName: 'control_editor', arguments: { action: 'jump_to_bookmark', bookmarkName: 'TC_Bookmark_1' }, expected: 'success - jumped to bookmark' },
74
+ { scenario: 'Jump to bookmark 2', toolName: 'control_editor', arguments: { action: 'jump_to_bookmark', bookmarkName: 'TC_Bookmark_2' }, expected: 'success' },
75
+
76
+ // === PREFERENCES ===
77
+ { scenario: 'Set editor preferences - grid', toolName: 'control_editor', arguments: { action: 'set_preferences', category: 'Editor', preferences: { UseGrid: true, SnapToGrid: true } }, expected: 'success - editor preferences set' },
78
+ { scenario: 'Set editor preferences - realtime', toolName: 'control_editor', arguments: { action: 'set_preferences', category: 'Viewport', preferences: { bRealtimeUpdate: true } }, expected: 'success' },
79
+
80
+ // === CONSOLE COMMANDS ===
81
+ { scenario: 'Execute console command (stat fps)', toolName: 'control_editor', arguments: { action: 'execute_command', command: 'stat fps' }, expected: 'success' },
82
+ { scenario: 'Console command (alias)', toolName: 'control_editor', arguments: { action: 'console_command', command: 'stat unit' }, expected: 'success' },
83
+ { scenario: 'Console command - toggle stat', toolName: 'control_editor', arguments: { action: 'console_command', command: 'stat none' }, expected: 'success' },
84
+
85
+ // === OPEN ASSET ===
86
+ { scenario: 'Open asset in editor', toolName: 'control_editor', arguments: { action: 'open_asset', assetPath: '/Engine/BasicShapes/Cube' }, expected: 'success' },
87
+ { scenario: 'Open material asset', toolName: 'control_editor', arguments: { action: 'open_asset', assetPath: '/Engine/EngineMaterials/DefaultMaterial' }, expected: 'success' },
88
+
89
+ // === SIMULATE INPUT ===
90
+ { scenario: 'Simulate key press W', toolName: 'control_editor', arguments: { action: 'simulate_input', keyName: 'W', eventType: 'KeyDown' }, expected: 'success' },
91
+ { scenario: 'Simulate key release W', toolName: 'control_editor', arguments: { action: 'simulate_input', keyName: 'W', eventType: 'KeyUp' }, expected: 'success' },
92
+ { scenario: 'Simulate key press and release Space', toolName: 'control_editor', arguments: { action: 'simulate_input', keyName: 'SpaceBar', eventType: 'Both' }, expected: 'success' },
93
+
94
+ // === ERROR CASES ===
95
+ { scenario: 'Error: Invalid view mode', toolName: 'control_editor', arguments: { action: 'set_view_mode', viewMode: 'InvalidMode' }, expected: 'error|unknown_viewmode' },
96
+ { scenario: 'Error: Invalid bookmark', toolName: 'control_editor', arguments: { action: 'jump_to_bookmark', bookmarkName: 'NonExistent_Bookmark_XYZ' }, expected: 'error|not_found' },
97
+ { scenario: 'Error: Empty command', toolName: 'control_editor', arguments: { action: 'console_command', command: '' }, expected: 'error|empty' },
98
+ { scenario: 'Error: Invalid resolution', toolName: 'control_editor', arguments: { action: 'set_viewport_resolution', width: -100, height: -100 }, expected: 'error|validation' },
99
+ { scenario: 'Error: Open non-existent asset', toolName: 'control_editor', arguments: { action: 'open_asset', assetPath: '/Game/NonExistent/Asset' }, expected: 'error|not_found' },
100
+ { scenario: 'Error: Screenshot invalid resolution', toolName: 'control_editor', arguments: { action: 'screenshot', resolution: 'invalidxres' }, expected: 'error' },
101
+
102
+ // === EDGE CASES ===
103
+ { scenario: 'Edge: Extreme FOV (1 degree)', toolName: 'control_editor', arguments: { action: 'set_camera_fov', fov: 1 }, expected: 'success' },
104
+ { scenario: 'Edge: Negative speed', toolName: 'control_editor', arguments: { action: 'set_game_speed', speed: -1 }, expected: 'success|handled' },
105
+ { scenario: 'Edge: Zero speed (frozen)', toolName: 'control_editor', arguments: { action: 'set_game_speed', speed: 0 }, expected: 'success' },
106
+ { scenario: 'Edge: Very high speed', toolName: 'control_editor', arguments: { action: 'set_game_speed', speed: 10.0 }, expected: 'success' },
107
+
108
+ // === TIMEOUT TEST ===
109
+ { scenario: 'Timeout short fail', toolName: 'control_editor', arguments: { action: 'play', timeoutMs: 1 }, expected: 'timeout|error' }
110
+ ];
111
+
112
+ await runToolTests('Editor Control', testCases);