unreal-engine-mcp-server 0.4.6 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (438) 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.yml +148 -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 +23 -0
  19. package/.github/workflows/labeler.yml +16 -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 +12 -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 +269 -22
  29. package/CONTRIBUTING.md +140 -0
  30. package/README.md +166 -72
  31. package/claude_desktop_config_example.json +7 -6
  32. package/dist/automation/bridge.d.ts +50 -0
  33. package/dist/automation/bridge.js +452 -0
  34. package/dist/automation/connection-manager.d.ts +23 -0
  35. package/dist/automation/connection-manager.js +107 -0
  36. package/dist/automation/handshake.d.ts +11 -0
  37. package/dist/automation/handshake.js +89 -0
  38. package/dist/automation/index.d.ts +3 -0
  39. package/dist/automation/index.js +3 -0
  40. package/dist/automation/message-handler.d.ts +12 -0
  41. package/dist/automation/message-handler.js +149 -0
  42. package/dist/automation/request-tracker.d.ts +25 -0
  43. package/dist/automation/request-tracker.js +98 -0
  44. package/dist/automation/types.d.ts +130 -0
  45. package/dist/automation/types.js +2 -0
  46. package/dist/cli.js +32 -5
  47. package/dist/config.d.ts +27 -0
  48. package/dist/config.js +60 -0
  49. package/dist/constants.d.ts +12 -0
  50. package/dist/constants.js +12 -0
  51. package/dist/graphql/resolvers.d.ts +268 -0
  52. package/dist/graphql/resolvers.js +743 -0
  53. package/dist/graphql/schema.d.ts +5 -0
  54. package/dist/graphql/schema.js +437 -0
  55. package/dist/graphql/server.d.ts +26 -0
  56. package/dist/graphql/server.js +115 -0
  57. package/dist/graphql/types.d.ts +7 -0
  58. package/dist/graphql/types.js +2 -0
  59. package/dist/handlers/resource-handlers.d.ts +20 -0
  60. package/dist/handlers/resource-handlers.js +180 -0
  61. package/dist/index.d.ts +31 -18
  62. package/dist/index.js +119 -604
  63. package/dist/prompts/index.js +4 -4
  64. package/dist/resources/actors.d.ts +17 -12
  65. package/dist/resources/actors.js +56 -76
  66. package/dist/resources/assets.d.ts +6 -14
  67. package/dist/resources/assets.js +115 -147
  68. package/dist/resources/levels.d.ts +13 -13
  69. package/dist/resources/levels.js +25 -34
  70. package/dist/server/resource-registry.d.ts +20 -0
  71. package/dist/server/resource-registry.js +37 -0
  72. package/dist/server/tool-registry.d.ts +23 -0
  73. package/dist/server/tool-registry.js +322 -0
  74. package/dist/server-setup.d.ts +21 -0
  75. package/dist/server-setup.js +111 -0
  76. package/dist/services/health-monitor.d.ts +34 -0
  77. package/dist/services/health-monitor.js +105 -0
  78. package/dist/services/metrics-server.d.ts +11 -0
  79. package/dist/services/metrics-server.js +105 -0
  80. package/dist/tools/actors.d.ts +147 -9
  81. package/dist/tools/actors.js +350 -311
  82. package/dist/tools/animation.d.ts +135 -4
  83. package/dist/tools/animation.js +510 -411
  84. package/dist/tools/assets.d.ts +117 -19
  85. package/dist/tools/assets.js +259 -284
  86. package/dist/tools/audio.d.ts +102 -42
  87. package/dist/tools/audio.js +272 -685
  88. package/dist/tools/base-tool.d.ts +17 -0
  89. package/dist/tools/base-tool.js +46 -0
  90. package/dist/tools/behavior-tree.d.ts +94 -0
  91. package/dist/tools/behavior-tree.js +39 -0
  92. package/dist/tools/blueprint/helpers.d.ts +29 -0
  93. package/dist/tools/blueprint/helpers.js +182 -0
  94. package/dist/tools/blueprint.d.ts +228 -118
  95. package/dist/tools/blueprint.js +685 -832
  96. package/dist/tools/consolidated-tool-definitions.d.ts +5475 -1627
  97. package/dist/tools/consolidated-tool-definitions.js +829 -482
  98. package/dist/tools/consolidated-tool-handlers.d.ts +2 -1
  99. package/dist/tools/consolidated-tool-handlers.js +211 -1009
  100. package/dist/tools/debug.d.ts +143 -85
  101. package/dist/tools/debug.js +234 -180
  102. package/dist/tools/dynamic-handler-registry.d.ts +11 -0
  103. package/dist/tools/dynamic-handler-registry.js +101 -0
  104. package/dist/tools/editor.d.ts +139 -18
  105. package/dist/tools/editor.js +239 -244
  106. package/dist/tools/engine.d.ts +10 -4
  107. package/dist/tools/engine.js +13 -5
  108. package/dist/tools/environment.d.ts +36 -0
  109. package/dist/tools/environment.js +267 -0
  110. package/dist/tools/foliage.d.ts +105 -14
  111. package/dist/tools/foliage.js +219 -331
  112. package/dist/tools/handlers/actor-handlers.d.ts +3 -0
  113. package/dist/tools/handlers/actor-handlers.js +232 -0
  114. package/dist/tools/handlers/animation-handlers.d.ts +3 -0
  115. package/dist/tools/handlers/animation-handlers.js +185 -0
  116. package/dist/tools/handlers/argument-helper.d.ts +16 -0
  117. package/dist/tools/handlers/argument-helper.js +80 -0
  118. package/dist/tools/handlers/asset-handlers.d.ts +3 -0
  119. package/dist/tools/handlers/asset-handlers.js +496 -0
  120. package/dist/tools/handlers/audio-handlers.d.ts +3 -0
  121. package/dist/tools/handlers/audio-handlers.js +166 -0
  122. package/dist/tools/handlers/blueprint-handlers.d.ts +4 -0
  123. package/dist/tools/handlers/blueprint-handlers.js +358 -0
  124. package/dist/tools/handlers/common-handlers.d.ts +14 -0
  125. package/dist/tools/handlers/common-handlers.js +56 -0
  126. package/dist/tools/handlers/editor-handlers.d.ts +3 -0
  127. package/dist/tools/handlers/editor-handlers.js +119 -0
  128. package/dist/tools/handlers/effect-handlers.d.ts +3 -0
  129. package/dist/tools/handlers/effect-handlers.js +171 -0
  130. package/dist/tools/handlers/environment-handlers.d.ts +3 -0
  131. package/dist/tools/handlers/environment-handlers.js +170 -0
  132. package/dist/tools/handlers/graph-handlers.d.ts +3 -0
  133. package/dist/tools/handlers/graph-handlers.js +90 -0
  134. package/dist/tools/handlers/input-handlers.d.ts +3 -0
  135. package/dist/tools/handlers/input-handlers.js +21 -0
  136. package/dist/tools/handlers/inspect-handlers.d.ts +3 -0
  137. package/dist/tools/handlers/inspect-handlers.js +383 -0
  138. package/dist/tools/handlers/level-handlers.d.ts +3 -0
  139. package/dist/tools/handlers/level-handlers.js +237 -0
  140. package/dist/tools/handlers/lighting-handlers.d.ts +3 -0
  141. package/dist/tools/handlers/lighting-handlers.js +144 -0
  142. package/dist/tools/handlers/performance-handlers.d.ts +3 -0
  143. package/dist/tools/handlers/performance-handlers.js +130 -0
  144. package/dist/tools/handlers/pipeline-handlers.d.ts +3 -0
  145. package/dist/tools/handlers/pipeline-handlers.js +110 -0
  146. package/dist/tools/handlers/sequence-handlers.d.ts +3 -0
  147. package/dist/tools/handlers/sequence-handlers.js +376 -0
  148. package/dist/tools/handlers/system-handlers.d.ts +4 -0
  149. package/dist/tools/handlers/system-handlers.js +506 -0
  150. package/dist/tools/input.d.ts +19 -0
  151. package/dist/tools/input.js +89 -0
  152. package/dist/tools/introspection.d.ts +103 -40
  153. package/dist/tools/introspection.js +425 -568
  154. package/dist/tools/landscape.d.ts +97 -36
  155. package/dist/tools/landscape.js +280 -409
  156. package/dist/tools/level.d.ts +130 -10
  157. package/dist/tools/level.js +639 -675
  158. package/dist/tools/lighting.d.ts +77 -38
  159. package/dist/tools/lighting.js +441 -943
  160. package/dist/tools/logs.d.ts +45 -0
  161. package/dist/tools/logs.js +210 -0
  162. package/dist/tools/materials.d.ts +91 -24
  163. package/dist/tools/materials.js +190 -118
  164. package/dist/tools/niagara.d.ts +149 -39
  165. package/dist/tools/niagara.js +232 -182
  166. package/dist/tools/performance.d.ts +27 -12
  167. package/dist/tools/performance.js +204 -122
  168. package/dist/tools/physics.d.ts +32 -77
  169. package/dist/tools/physics.js +171 -582
  170. package/dist/tools/property-dictionary.d.ts +13 -0
  171. package/dist/tools/property-dictionary.js +82 -0
  172. package/dist/tools/sequence.d.ts +73 -48
  173. package/dist/tools/sequence.js +196 -748
  174. package/dist/tools/tool-definition-utils.d.ts +59 -0
  175. package/dist/tools/tool-definition-utils.js +35 -0
  176. package/dist/tools/ui.d.ts +66 -34
  177. package/dist/tools/ui.js +134 -214
  178. package/dist/types/env.d.ts +0 -3
  179. package/dist/types/env.js +0 -7
  180. package/dist/types/tool-interfaces.d.ts +898 -0
  181. package/dist/types/tool-interfaces.js +2 -0
  182. package/dist/types/tool-types.d.ts +195 -11
  183. package/dist/types/tool-types.js +0 -4
  184. package/dist/unreal-bridge.d.ts +24 -131
  185. package/dist/unreal-bridge.js +364 -1506
  186. package/dist/utils/command-validator.d.ts +9 -0
  187. package/dist/utils/command-validator.js +67 -0
  188. package/dist/utils/elicitation.d.ts +1 -1
  189. package/dist/utils/elicitation.js +12 -15
  190. package/dist/utils/error-handler.d.ts +2 -51
  191. package/dist/utils/error-handler.js +11 -87
  192. package/dist/utils/ini-reader.d.ts +3 -0
  193. package/dist/utils/ini-reader.js +69 -0
  194. package/dist/utils/logger.js +9 -6
  195. package/dist/utils/normalize.d.ts +3 -0
  196. package/dist/utils/normalize.js +56 -0
  197. package/dist/utils/response-factory.d.ts +7 -0
  198. package/dist/utils/response-factory.js +33 -0
  199. package/dist/utils/response-validator.d.ts +3 -24
  200. package/dist/utils/response-validator.js +130 -81
  201. package/dist/utils/result-helpers.d.ts +4 -5
  202. package/dist/utils/result-helpers.js +15 -16
  203. package/dist/utils/safe-json.js +5 -11
  204. package/dist/utils/unreal-command-queue.d.ts +24 -0
  205. package/dist/utils/unreal-command-queue.js +120 -0
  206. package/dist/utils/validation.d.ts +0 -40
  207. package/dist/utils/validation.js +1 -78
  208. package/dist/wasm/index.d.ts +70 -0
  209. package/dist/wasm/index.js +535 -0
  210. package/docs/GraphQL-API.md +888 -0
  211. package/docs/Migration-Guide-v0.5.0.md +692 -0
  212. package/docs/Roadmap.md +53 -0
  213. package/docs/WebAssembly-Integration.md +628 -0
  214. package/docs/editor-plugin-extension.md +370 -0
  215. package/docs/handler-mapping.md +242 -0
  216. package/docs/native-automation-progress.md +128 -0
  217. package/docs/testing-guide.md +423 -0
  218. package/mcp-config-example.json +6 -6
  219. package/package.json +60 -27
  220. package/plugins/McpAutomationBridge/Config/FilterPlugin.ini +8 -0
  221. package/plugins/McpAutomationBridge/McpAutomationBridge.uplugin +64 -0
  222. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/McpAutomationBridge.Build.cs +189 -0
  223. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.cpp +22 -0
  224. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.h +30 -0
  225. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeHelpers.h +1983 -0
  226. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeModule.cpp +72 -0
  227. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSettings.cpp +46 -0
  228. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSubsystem.cpp +581 -0
  229. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AnimationHandlers.cpp +2394 -0
  230. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetQueryHandlers.cpp +300 -0
  231. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetWorkflowHandlers.cpp +2807 -0
  232. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AudioHandlers.cpp +1087 -0
  233. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BehaviorTreeHandlers.cpp +488 -0
  234. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.cpp +643 -0
  235. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.h +31 -0
  236. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintGraphHandlers.cpp +1184 -0
  237. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers.cpp +5652 -0
  238. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers_List.cpp +152 -0
  239. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ControlHandlers.cpp +2614 -0
  240. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_DebugHandlers.cpp +42 -0
  241. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EditorFunctionHandlers.cpp +1237 -0
  242. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EffectHandlers.cpp +1701 -0
  243. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EnvironmentHandlers.cpp +2145 -0
  244. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_FoliageHandlers.cpp +954 -0
  245. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InputHandlers.cpp +209 -0
  246. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InsightsHandlers.cpp +41 -0
  247. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LandscapeHandlers.cpp +1164 -0
  248. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LevelHandlers.cpp +762 -0
  249. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LightingHandlers.cpp +634 -0
  250. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LogHandlers.cpp +136 -0
  251. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_MaterialGraphHandlers.cpp +494 -0
  252. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraGraphHandlers.cpp +278 -0
  253. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraHandlers.cpp +625 -0
  254. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PerformanceHandlers.cpp +401 -0
  255. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PipelineHandlers.cpp +67 -0
  256. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ProcessRequest.cpp +735 -0
  257. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PropertyHandlers.cpp +2634 -0
  258. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_RenderHandlers.cpp +189 -0
  259. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.cpp +917 -0
  260. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.h +39 -0
  261. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequenceHandlers.cpp +2670 -0
  262. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequencerHandlers.cpp +519 -0
  263. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_TestHandlers.cpp +38 -0
  264. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_UiHandlers.cpp +668 -0
  265. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_WorldPartitionHandlers.cpp +346 -0
  266. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.cpp +1330 -0
  267. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.h +149 -0
  268. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpConnectionManager.cpp +783 -0
  269. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSettings.h +115 -0
  270. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSubsystem.h +796 -0
  271. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpConnectionManager.h +117 -0
  272. package/scripts/check-unreal-connection.mjs +19 -0
  273. package/scripts/clean-tmp.js +23 -0
  274. package/scripts/patch-wasm.js +26 -0
  275. package/scripts/run-all-tests.mjs +131 -0
  276. package/scripts/smoke-test.ts +94 -0
  277. package/scripts/sync-mcp-plugin.js +143 -0
  278. package/scripts/test-no-plugin-alternates.mjs +113 -0
  279. package/scripts/validate-server.js +46 -0
  280. package/scripts/verify-automation-bridge.js +200 -0
  281. package/server.json +57 -21
  282. package/src/automation/bridge.ts +558 -0
  283. package/src/automation/connection-manager.ts +130 -0
  284. package/src/automation/handshake.ts +99 -0
  285. package/src/automation/index.ts +2 -0
  286. package/src/automation/message-handler.ts +167 -0
  287. package/src/automation/request-tracker.ts +123 -0
  288. package/src/automation/types.ts +107 -0
  289. package/src/cli.ts +33 -6
  290. package/src/config.ts +73 -0
  291. package/src/constants.ts +12 -0
  292. package/src/graphql/resolvers.ts +1010 -0
  293. package/src/graphql/schema.ts +452 -0
  294. package/src/graphql/server.ts +154 -0
  295. package/src/graphql/types.ts +7 -0
  296. package/src/handlers/resource-handlers.ts +186 -0
  297. package/src/index.ts +152 -649
  298. package/src/prompts/index.ts +4 -4
  299. package/src/resources/actors.ts +58 -76
  300. package/src/resources/assets.ts +147 -134
  301. package/src/resources/levels.ts +28 -33
  302. package/src/server/resource-registry.ts +47 -0
  303. package/src/server/tool-registry.ts +354 -0
  304. package/src/server-setup.ts +148 -0
  305. package/src/services/health-monitor.ts +132 -0
  306. package/src/services/metrics-server.ts +142 -0
  307. package/src/tools/actors.ts +417 -322
  308. package/src/tools/animation.ts +671 -461
  309. package/src/tools/assets.ts +353 -289
  310. package/src/tools/audio.ts +323 -766
  311. package/src/tools/base-tool.ts +52 -0
  312. package/src/tools/behavior-tree.ts +45 -0
  313. package/src/tools/blueprint/helpers.ts +189 -0
  314. package/src/tools/blueprint.ts +787 -965
  315. package/src/tools/consolidated-tool-definitions.ts +993 -500
  316. package/src/tools/consolidated-tool-handlers.ts +272 -1122
  317. package/src/tools/debug.ts +292 -187
  318. package/src/tools/dynamic-handler-registry.ts +151 -0
  319. package/src/tools/editor.ts +309 -246
  320. package/src/tools/engine.ts +14 -3
  321. package/src/tools/environment.ts +287 -0
  322. package/src/tools/foliage.ts +314 -379
  323. package/src/tools/handlers/actor-handlers.ts +271 -0
  324. package/src/tools/handlers/animation-handlers.ts +237 -0
  325. package/src/tools/handlers/argument-helper.ts +142 -0
  326. package/src/tools/handlers/asset-handlers.ts +532 -0
  327. package/src/tools/handlers/audio-handlers.ts +194 -0
  328. package/src/tools/handlers/blueprint-handlers.ts +380 -0
  329. package/src/tools/handlers/common-handlers.ts +87 -0
  330. package/src/tools/handlers/editor-handlers.ts +123 -0
  331. package/src/tools/handlers/effect-handlers.ts +220 -0
  332. package/src/tools/handlers/environment-handlers.ts +183 -0
  333. package/src/tools/handlers/graph-handlers.ts +116 -0
  334. package/src/tools/handlers/input-handlers.ts +28 -0
  335. package/src/tools/handlers/inspect-handlers.ts +450 -0
  336. package/src/tools/handlers/level-handlers.ts +252 -0
  337. package/src/tools/handlers/lighting-handlers.ts +147 -0
  338. package/src/tools/handlers/performance-handlers.ts +132 -0
  339. package/src/tools/handlers/pipeline-handlers.ts +127 -0
  340. package/src/tools/handlers/sequence-handlers.ts +415 -0
  341. package/src/tools/handlers/system-handlers.ts +564 -0
  342. package/src/tools/input.ts +101 -0
  343. package/src/tools/introspection.ts +493 -584
  344. package/src/tools/landscape.ts +394 -489
  345. package/src/tools/level.ts +752 -694
  346. package/src/tools/lighting.ts +583 -984
  347. package/src/tools/logs.ts +219 -0
  348. package/src/tools/materials.ts +231 -121
  349. package/src/tools/niagara.ts +293 -168
  350. package/src/tools/performance.ts +320 -168
  351. package/src/tools/physics.ts +268 -613
  352. package/src/tools/property-dictionary.ts +98 -0
  353. package/src/tools/sequence.ts +255 -815
  354. package/src/tools/tool-definition-utils.ts +35 -0
  355. package/src/tools/ui.ts +207 -283
  356. package/src/types/env.ts +0 -10
  357. package/src/types/tool-interfaces.ts +250 -0
  358. package/src/types/tool-types.ts +250 -13
  359. package/src/unreal-bridge.ts +460 -1550
  360. package/src/utils/command-validator.ts +75 -0
  361. package/src/utils/elicitation.ts +10 -7
  362. package/src/utils/error-handler.ts +14 -90
  363. package/src/utils/ini-reader.ts +86 -0
  364. package/src/utils/logger.ts +8 -3
  365. package/src/utils/normalize.ts +60 -0
  366. package/src/utils/response-factory.ts +39 -0
  367. package/src/utils/response-validator.ts +176 -56
  368. package/src/utils/result-helpers.ts +21 -19
  369. package/src/utils/safe-json.ts +14 -11
  370. package/src/utils/unreal-command-queue.ts +152 -0
  371. package/src/utils/validation.ts +4 -1
  372. package/src/wasm/index.ts +838 -0
  373. package/test-server.mjs +100 -0
  374. package/tests/run-unreal-tool-tests.mjs +242 -14
  375. package/tests/test-animation.mjs +44 -0
  376. package/tests/test-asset-advanced.mjs +82 -0
  377. package/tests/test-asset-errors.mjs +35 -0
  378. package/tests/test-audio.mjs +219 -0
  379. package/tests/test-automation-timeouts.mjs +98 -0
  380. package/tests/test-behavior-tree.mjs +261 -0
  381. package/tests/test-blueprint-events.mjs +35 -0
  382. package/tests/test-blueprint-graph.mjs +79 -0
  383. package/tests/test-blueprint.mjs +577 -0
  384. package/tests/test-client-mode.mjs +86 -0
  385. package/tests/test-console-command.mjs +56 -0
  386. package/tests/test-control-actor.mjs +425 -0
  387. package/tests/test-control-editor.mjs +80 -0
  388. package/tests/test-extra-tools.mjs +38 -0
  389. package/tests/test-graphql.mjs +322 -0
  390. package/tests/test-inspect.mjs +72 -0
  391. package/tests/test-landscape.mjs +60 -0
  392. package/tests/test-manage-asset.mjs +438 -0
  393. package/tests/test-manage-level.mjs +70 -0
  394. package/tests/test-materials.mjs +356 -0
  395. package/tests/test-niagara.mjs +185 -0
  396. package/tests/test-no-inline-python.mjs +122 -0
  397. package/tests/test-plugin-handshake.mjs +82 -0
  398. package/tests/test-render.mjs +33 -0
  399. package/tests/test-runner.mjs +933 -0
  400. package/tests/test-search-assets.mjs +66 -0
  401. package/tests/test-sequence.mjs +68 -0
  402. package/tests/test-system.mjs +57 -0
  403. package/tests/test-wasm.mjs +193 -0
  404. package/tests/test-world-partition.mjs +215 -0
  405. package/tsconfig.json +3 -3
  406. package/wasm/Cargo.lock +363 -0
  407. package/wasm/Cargo.toml +42 -0
  408. package/wasm/LICENSE +21 -0
  409. package/wasm/README.md +253 -0
  410. package/wasm/src/dependency_resolver.rs +377 -0
  411. package/wasm/src/lib.rs +153 -0
  412. package/wasm/src/property_parser.rs +271 -0
  413. package/wasm/src/transform_math.rs +396 -0
  414. package/wasm/tests/integration.rs +109 -0
  415. package/.github/workflows/smithery-build.yml +0 -29
  416. package/dist/tools/build_environment_advanced.d.ts +0 -65
  417. package/dist/tools/build_environment_advanced.js +0 -633
  418. package/dist/tools/rc.d.ts +0 -110
  419. package/dist/tools/rc.js +0 -437
  420. package/dist/tools/visual.d.ts +0 -40
  421. package/dist/tools/visual.js +0 -282
  422. package/dist/utils/http.d.ts +0 -6
  423. package/dist/utils/http.js +0 -151
  424. package/dist/utils/python-output.d.ts +0 -18
  425. package/dist/utils/python-output.js +0 -290
  426. package/dist/utils/python.d.ts +0 -2
  427. package/dist/utils/python.js +0 -4
  428. package/dist/utils/stdio-redirect.d.ts +0 -2
  429. package/dist/utils/stdio-redirect.js +0 -20
  430. package/docs/unreal-tool-test-cases.md +0 -572
  431. package/smithery.yaml +0 -29
  432. package/src/tools/build_environment_advanced.ts +0 -732
  433. package/src/tools/rc.ts +0 -515
  434. package/src/tools/visual.ts +0 -281
  435. package/src/utils/http.ts +0 -187
  436. package/src/utils/python-output.ts +0 -351
  437. package/src/utils/python.ts +0 -3
  438. 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,80 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Condensed Editor Control Test Suite (15 cases) — safe for real Editor runs.
4
+ * Tool: control_editor
5
+ */
6
+
7
+ import { runToolTests } from './test-runner.mjs';
8
+
9
+ const testCases = [
10
+ {
11
+ scenario: 'Pre-Fix: Remove Invalid Data Layers (Native)',
12
+ toolName: 'manage_level',
13
+ arguments: {
14
+ action: 'cleanup_invalid_datalayers'
15
+ },
16
+ // We expect success if supported, or error if not.
17
+ // Since we just added it, it should succeed if plugin is rebuilt.
18
+ // If plugin is NOT rebuilt yet, this will fail with valid error or "unknown action" depending on how it falls through.
19
+ // But since the user is expected to rebuild, we expect success.
20
+ expected: 'success'
21
+ },
22
+ { scenario: 'Start PIE (Play in Editor)', toolName: 'control_editor', arguments: { action: 'play' }, expected: 'success - PIE started' },
23
+ { scenario: 'Stop PIE', toolName: 'control_editor', arguments: { action: 'stop' }, expected: 'success - PIE stopped' },
24
+ { scenario: 'Set camera location', 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' },
25
+ { scenario: 'Focus camera on actor', toolName: 'control_editor', arguments: { action: 'set_camera', targetActor: 'TC_Cube' }, expected: 'success - camera focused' },
26
+ { scenario: 'Set view mode to Lit', toolName: 'control_editor', arguments: { action: 'set_view_mode', viewMode: 'Lit' }, expected: 'success - view mode set' },
27
+ { scenario: 'Set view mode to Wireframe', toolName: 'control_editor', arguments: { action: 'set_view_mode', viewMode: 'Wireframe' }, expected: 'success - view mode set' },
28
+ { scenario: 'Take screenshot', toolName: 'control_editor', arguments: { action: 'screenshot', filename: 'TC_Screenshot' }, expected: 'success - screenshot taken' },
29
+ { scenario: 'Start recording', toolName: 'control_editor', arguments: { action: 'start_recording', filename: 'TC_Record', frameRate: 30 }, expected: 'success - recording started' },
30
+ { scenario: 'Stop recording', toolName: 'control_editor', arguments: { action: 'stop_recording' }, expected: 'success - recording stopped' },
31
+ { scenario: 'Pause PIE', toolName: 'control_editor', arguments: { action: 'pause' }, expected: 'success - PIE paused' },
32
+ { scenario: 'Resume PIE', toolName: 'control_editor', arguments: { action: 'resume' }, expected: 'success - PIE resumed' },
33
+ { scenario: 'Step PIE frame', toolName: 'control_editor', arguments: { action: 'step_frame' }, expected: 'success - frame stepped' },
34
+ { scenario: 'Create camera bookmark', toolName: 'control_editor', arguments: { action: 'create_bookmark', bookmarkName: 'TC_Bookmark' }, expected: 'success - bookmark created' },
35
+ { scenario: 'Jump to camera bookmark', toolName: 'control_editor', arguments: { action: 'jump_to_bookmark', bookmarkName: 'TC_Bookmark' }, expected: 'success - jumped to bookmark' },
36
+ { scenario: 'Set editor preferences', toolName: 'control_editor', arguments: { action: 'set_preferences', category: 'Editor', preferences: { UseGrid: true, SnapToGrid: true } }, expected: 'success - editor preferences set' },
37
+ // Additional
38
+ // Real-World Scenario: Editor Automation
39
+ { scenario: 'Editor Auto - Open Asset', toolName: 'control_editor', arguments: { action: 'open_asset', assetPath: '/Engine/BasicShapes/Cube' }, expected: 'success' },
40
+ { scenario: 'Editor Auto - Focus Viewport', toolName: 'control_editor', arguments: { action: 'set_camera', location: { x: 500, y: 500, z: 500 }, rotation: { pitch: -30, yaw: 225, roll: 0 } }, expected: 'success' },
41
+ { scenario: 'Editor Auto - Run Command', toolName: 'control_editor', arguments: { action: 'execute_command', command: 'stat fps' }, expected: 'success' },
42
+ {
43
+ scenario: "Error: Invalid view mode",
44
+ toolName: "control_editor",
45
+ arguments: { action: "set_view_mode", viewMode: "InvalidMode" },
46
+ expected: "error|unknown_viewmode"
47
+ },
48
+ {
49
+ scenario: "Edge: Extreme FOV (1 degree)",
50
+ toolName: "control_editor",
51
+ arguments: { action: "set_camera_fov", fov: 1 },
52
+ expected: "success"
53
+ },
54
+ {
55
+ scenario: "Border: Negative speed",
56
+ toolName: "control_editor",
57
+ arguments: { action: "set_game_speed", speed: -1 },
58
+ expected: "success|handled"
59
+ },
60
+ {
61
+ scenario: "Error: Screenshot invalid res",
62
+ toolName: "control_editor",
63
+ arguments: { action: "screenshot", resolution: "invalidxres" },
64
+ expected: "error"
65
+ },
66
+ {
67
+ scenario: "Edge: Empty command",
68
+ toolName: "control_editor",
69
+ arguments: { action: "console_command", command: "" },
70
+ expected: "error|empty"
71
+ },
72
+ {
73
+ scenario: "Timeout short fail",
74
+ toolName: "control_editor",
75
+ arguments: { action: "play", timeoutMs: 1 },
76
+ expected: "timeout|error"
77
+ }
78
+ ];
79
+
80
+ await runToolTests('Editor Control', testCases);
@@ -0,0 +1,38 @@
1
+ import { TestRunner } from './test-runner.mjs';
2
+
3
+ const runner = new TestRunner('Extra Tools Tests');
4
+
5
+ runner.addStep('Manage Logs - Subscribe', async (tools) => {
6
+ const result = await tools.executeTool('manage_logs', {
7
+ action: 'subscribe'
8
+ });
9
+ return result.success;
10
+ });
11
+
12
+ runner.addStep('Manage Debug - Spawn Category', async (tools) => {
13
+ const result = await tools.executeTool('manage_debug', {
14
+ action: 'spawn_category',
15
+ category: 'AI'
16
+ });
17
+ return result.success;
18
+ });
19
+
20
+ runner.addStep('Manage Insights - Start Session', async (tools) => {
21
+ const result = await tools.executeTool('manage_insights', {
22
+ action: 'start_session',
23
+ channels: 'cpu,gpu'
24
+ });
25
+ // Insights might fail if not configured/running, treat as soft pass for existence
26
+ return true;
27
+ });
28
+
29
+ runner.addStep('Manage UI - Simulate Input', async (tools) => {
30
+ const result = await tools.executeTool('manage_ui', {
31
+ action: 'simulate_input',
32
+ keyName: 'SpaceBar',
33
+ eventType: 'Both'
34
+ });
35
+ return result.success;
36
+ });
37
+
38
+ runner.run().catch(console.error);