unreal-engine-mcp-server 0.4.7 → 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 +267 -31
  29. package/CONTRIBUTING.md +140 -0
  30. package/README.md +166 -71
  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 -619
  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 +5462 -1781
  97. package/dist/tools/consolidated-tool-definitions.js +829 -496
  98. package/dist/tools/consolidated-tool-handlers.d.ts +2 -1
  99. package/dist/tools/consolidated-tool-handlers.js +211 -1026
  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 +3 -3
  161. package/dist/tools/logs.js +5 -57
  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 +183 -19
  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 -663
  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 -515
  316. package/src/tools/consolidated-tool-handlers.ts +272 -1139
  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 +9 -57
  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 +243 -21
  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 -574
  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,322 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * GraphQL API Test Suite
4
+ *
5
+ * Tests the GraphQL server functionality
6
+ */
7
+
8
+ import { createServer } from 'http';
9
+ import path from 'node:path';
10
+ import { fileURLToPath } from 'node:url';
11
+ import { GraphQLServer } from '../dist/graphql/server.js';
12
+ import { UnrealBridge } from '../dist/unreal-bridge.js';
13
+ import { AutomationBridge } from '../dist/automation/index.js';
14
+
15
+ // Test automation bridge for verifying GraphQL integration
16
+ class TestAutomationBridge {
17
+ constructor() {
18
+ this.handlers = new Map();
19
+ this.connected = false;
20
+ }
21
+
22
+ on(event, handler) {
23
+ this.handlers.set(event, handler);
24
+ }
25
+
26
+ off(event, handler) {
27
+ const existing = this.handlers.get(event);
28
+ if (!existing) return;
29
+ if (!handler || existing === handler) {
30
+ this.handlers.delete(event);
31
+ }
32
+ }
33
+
34
+ isConnected() {
35
+ return this.connected;
36
+ }
37
+
38
+ start() {
39
+ // Simulate connection
40
+ setTimeout(() => {
41
+ this.connected = true;
42
+ const handler = this.handlers.get('connected');
43
+ if (handler) {
44
+ handler({ metadata: {}, port: 8090, protocol: 'mcp-automation' });
45
+ }
46
+ }, 100);
47
+ }
48
+
49
+ stop() {
50
+ // Cleanup
51
+ }
52
+
53
+ sendAutomationRequest(action, params, options) {
54
+ // Return test data based on action
55
+ switch (action) {
56
+ case 'list_assets':
57
+ return Promise.resolve({
58
+ success: true,
59
+ result: {
60
+ assets: [
61
+ { name: 'Material1', path: '/Game/Materials/Mat1', class: 'Material' },
62
+ { name: 'Material2', path: '/Game/Materials/Mat2', class: 'Material' }
63
+ ],
64
+ totalCount: 2
65
+ }
66
+ });
67
+
68
+ case 'list_actors':
69
+ return Promise.resolve({
70
+ success: true,
71
+ result: {
72
+ actors: [
73
+ { name: 'Cube', class: 'StaticMeshActor', location: { x: 0, y: 0, z: 100 } },
74
+ { name: 'Sphere', class: 'StaticMeshActor', location: { x: 100, y: 0, z: 100 } }
75
+ ]
76
+ }
77
+ });
78
+
79
+ case 'get_blueprint':
80
+ return Promise.resolve({
81
+ success: true,
82
+ result: {
83
+ name: 'BP_Test',
84
+ path: '/Game/Blueprints/BP_Test',
85
+ parentClass: 'Actor',
86
+ variables: [{ name: 'Health', type: 'Float', defaultValue: 100 }],
87
+ functions: [{ name: 'TakeDamage', inputs: [{ name: 'Damage', type: 'Float' }] }],
88
+ events: [{ name: 'BeginPlay', type: 'Event' }],
89
+ components: []
90
+ }
91
+ });
92
+
93
+ case 'list_blueprints':
94
+ return Promise.resolve({
95
+ success: true,
96
+ result: {
97
+ blueprints: [
98
+ { name: 'BP_Player', path: '/Game/Blueprints/BP_Player', parentClass: 'Character' },
99
+ { name: 'BP_Enemy', path: '/Game/Blueprints/BP_Enemy', parentClass: 'Character' }
100
+ ],
101
+ totalCount: 2
102
+ }
103
+ });
104
+
105
+ case 'search':
106
+ return Promise.resolve({
107
+ success: true,
108
+ result: {
109
+ results: [
110
+ { name: 'Material1', path: '/Game/Materials/Mat1', class: 'Material' },
111
+ { name: 'Cube', class: 'StaticMeshActor' }
112
+ ]
113
+ }
114
+ });
115
+
116
+ default:
117
+ return Promise.resolve({ success: true, result: {} });
118
+ }
119
+ }
120
+ }
121
+
122
+ const log = {
123
+ info: (...args) => console.log('[INFO]', ...args),
124
+ warn: (...args) => console.warn('[WARN]', ...args),
125
+ error: (...args) => console.error('[ERROR]', ...args),
126
+ debug: (...args) => console.debug('[DEBUG]', ...args)
127
+ };
128
+
129
+ async function testGraphQLServer() {
130
+ log.info('Starting GraphQL server test...');
131
+
132
+ const bridge = new UnrealBridge();
133
+ const testAutomationBridge = new TestAutomationBridge();
134
+ bridge.setAutomationBridge(testAutomationBridge);
135
+
136
+ const graphQLServer = new GraphQLServer(bridge, testAutomationBridge, {
137
+ enabled: true,
138
+ port: 4000,
139
+ host: '127.0.0.1'
140
+ });
141
+
142
+ try {
143
+ await graphQLServer.start();
144
+ log.info('✅ GraphQL server started successfully');
145
+
146
+ // Give the server a moment to start
147
+ await new Promise(resolve => setTimeout(resolve, 500));
148
+
149
+ log.info('GraphQL server is running at http://127.0.0.1:4000/graphql');
150
+ log.info('You can test it with: curl -X POST -H "Content-Type: application/json" -d \'{"query": "{ assets { edges { node { name path } } } }"\' http://127.0.0.1:4000/graphql');
151
+
152
+ // Run tests
153
+ await runGraphQLTests();
154
+
155
+ // Keep server running for manual testing
156
+ log.info('\nGraphQL server is still running. Press Ctrl+C to stop.');
157
+ } catch (error) {
158
+ log.error('Failed to start GraphQL server:', error);
159
+ process.exit(1);
160
+ }
161
+ }
162
+
163
+ async function runGraphQLTests() {
164
+ log.info('\n=== Running GraphQL Tests ===\n');
165
+
166
+ const tests = [
167
+ {
168
+ name: 'List Assets',
169
+ query: `
170
+ {
171
+ assets {
172
+ edges {
173
+ node {
174
+ name
175
+ path
176
+ class
177
+ }
178
+ }
179
+ totalCount
180
+ }
181
+ }
182
+ `
183
+ },
184
+ {
185
+ name: 'List Actors',
186
+ query: `
187
+ {
188
+ actors {
189
+ edges {
190
+ node {
191
+ name
192
+ class
193
+ location {
194
+ x
195
+ y
196
+ z
197
+ }
198
+ }
199
+ }
200
+ }
201
+ }
202
+ `
203
+ },
204
+ {
205
+ name: 'Get Blueprint',
206
+ query: `
207
+ {
208
+ blueprint(path: "/Game/Blueprints/BP_Test") {
209
+ name
210
+ path
211
+ parentClass
212
+ variables {
213
+ name
214
+ type
215
+ defaultValue
216
+ }
217
+ functions {
218
+ name
219
+ inputs {
220
+ name
221
+ type
222
+ }
223
+ }
224
+ events {
225
+ name
226
+ type
227
+ }
228
+ }
229
+ }
230
+ `
231
+ },
232
+ {
233
+ name: 'List Blueprints',
234
+ query: `
235
+ {
236
+ blueprints {
237
+ edges {
238
+ node {
239
+ name
240
+ path
241
+ parentClass
242
+ }
243
+ }
244
+ totalCount
245
+ }
246
+ }
247
+ `
248
+ },
249
+ {
250
+ name: 'Search',
251
+ query: `
252
+ {
253
+ search(query: "Material", type: ASSETS) {
254
+ ... on Asset {
255
+ name
256
+ path
257
+ class
258
+ }
259
+ }
260
+ }
261
+ `
262
+ }
263
+ ];
264
+
265
+ let passed = 0;
266
+ let failed = 0;
267
+
268
+ for (const test of tests) {
269
+ try {
270
+ log.info(`Testing: ${test.name}`);
271
+
272
+ const response = await fetch('http://127.0.0.1:4000/graphql', {
273
+ method: 'POST',
274
+ headers: { 'Content-Type': 'application/json' },
275
+ body: JSON.stringify({ query: test.query })
276
+ });
277
+
278
+ const result = await response.json();
279
+
280
+ if (result.errors) {
281
+ log.error(` ❌ ${test.name} - GraphQL Errors:`, JSON.stringify(result.errors));
282
+ failed++;
283
+ } else if (result.data) {
284
+ log.info(` ✅ ${test.name} - Success`);
285
+ passed++;
286
+ } else {
287
+ log.error(` ❌ ${test.name} - No data returned`);
288
+ failed++;
289
+ }
290
+ } catch (error) {
291
+ log.error(` ❌ ${test.name} - Error:`, error.message);
292
+ failed++;
293
+ }
294
+ }
295
+
296
+ log.info('\n=== Test Results ===');
297
+ log.info(`Passed: ${passed}/${tests.length}`);
298
+ log.info(`Failed: ${failed}/${tests.length}`);
299
+
300
+ return { passed, failed, total: tests.length };
301
+ }
302
+
303
+ // Handle graceful shutdown
304
+ process.on('SIGINT', () => {
305
+ log.info('\nShutting down...');
306
+ process.exit(0);
307
+ });
308
+
309
+ const thisFilePath = fileURLToPath(import.meta.url);
310
+ const isMainModule = (() => {
311
+ const argvPath = process.argv[1];
312
+ if (!argvPath) return false;
313
+ const resolvedArgvPath = path.resolve(argvPath);
314
+ return thisFilePath === resolvedArgvPath;
315
+ })();
316
+
317
+ if (isMainModule) {
318
+ testGraphQLServer().catch(error => {
319
+ log.error('Test failed:', error);
320
+ process.exit(1);
321
+ });
322
+ }
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Condensed Inspect Test Suite (15 cases) — safe for real Editor runs.
4
+ * Tools used: control_actor (bootstrap), inspect
5
+ */
6
+
7
+ import { runToolTests } from './test-runner.mjs';
8
+
9
+ const testCases = [
10
+ // 1. Bootstrap: spawn a mesh actor for inspection (using control_actor instead of execute_python)
11
+ { scenario: 'Bootstrap - spawn InspectActor', toolName: 'control_actor', arguments: { action: 'spawn', classPath: '/Engine/BasicShapes/Cube', actorName: 'Inspect_A', location: { x: 0, y: 0, z: 200 } }, expected: 'success - bootstrap created' },
12
+ // 2. Inspect actor by name
13
+ { scenario: 'Inspect actor by name', toolName: 'inspect', arguments: { action: 'inspect_object', name: 'Inspect_A' }, expected: 'success - object inspected' },
14
+ // 3. Get a property from the actor
15
+ { scenario: 'Get actor location property', toolName: 'inspect', arguments: { action: 'get_property', name: 'Inspect_A', propertyPath: 'ActorLocation' }, expected: 'success - property retrieved' },
16
+ // 4. Set a property on the actor
17
+ { scenario: 'Set actor hidden property', toolName: 'inspect', arguments: { action: 'set_property', name: 'Inspect_A', propertyPath: 'bHidden', value: true }, expected: 'success - property set' },
18
+ // 5. Inspect component list
19
+ { scenario: 'Get components on actor', toolName: 'inspect', arguments: { action: 'get_components', name: 'Inspect_A' }, expected: 'success - components returned' },
20
+ // 6. Get component property
21
+ { scenario: 'Get static mesh component mesh', toolName: 'inspect', arguments: { action: 'get_component_property', name: 'Inspect_A', componentName: 'StaticMeshComponent', propertyPath: 'StaticMesh' }, expected: 'success - component property retrieved' },
22
+ // 7. Set component mobility
23
+ { scenario: 'Set component mobility', toolName: 'inspect', arguments: { action: 'set_component_property', name: 'Inspect_A', componentName: 'StaticMeshComponent', propertyPath: 'Mobility', value: 'Movable' }, expected: 'success - component property set' },
24
+ // 8. Query actor metadata (best-effort)
25
+ { scenario: 'Get actor metadata', toolName: 'inspect', arguments: { action: 'get_metadata', name: 'Inspect_A' }, expected: 'success - metadata returned' },
26
+ // 9. Add a tag to the actor
27
+ { scenario: 'Add tag to actor', toolName: 'inspect', arguments: { action: 'add_tag', name: 'Inspect_A', tag: 'InspectTC' }, expected: 'success - tag added' },
28
+ // 10. Find actors by tag
29
+ { scenario: 'Find actors by tag', toolName: 'inspect', arguments: { action: 'find_by_tag', tag: 'InspectTC' }, expected: 'success - actors found' },
30
+ // 11. Save actor state (best-effort)
31
+ { scenario: 'Save actor snapshot', toolName: 'inspect', arguments: { action: 'create_snapshot', name: 'Inspect_A', snapshotName: 'Inspect_A_Snap' }, expected: 'success - snapshot created' },
32
+ // 12. Restore actor state
33
+ { scenario: 'Restore actor snapshot', toolName: 'inspect', arguments: { action: 'restore_snapshot', name: 'Inspect_A', snapshotName: 'Inspect_A_Snap' }, expected: 'success - snapshot restored' },
34
+ // 13. Export actor to JSON
35
+ { scenario: 'Export actor', toolName: 'inspect', arguments: { action: 'export', name: 'Inspect_A', format: 'JSON', outputPath: './tests/reports/inspect_actor_export.json' }, expected: 'success - actor exported' },
36
+ // 14. Delete test actor via inspect
37
+ { scenario: 'Delete actor', toolName: 'inspect', arguments: { action: 'delete_object', name: 'Inspect_A' }, expected: 'success - actor deleted' },
38
+ // 15. Verify deletion with a simple list
39
+ { scenario: 'Verify actor deleted', toolName: 'inspect', arguments: { action: 'list_objects', filter: 'Inspect_A' }, expected: 'success - deleted or not found' },
40
+ // Additional
41
+ { scenario: 'List objects', toolName: 'inspect', arguments: { action: 'list_objects', filter: 'Inspect_' }, expected: 'success or handled' },
42
+ { scenario: 'Find by class', toolName: 'inspect', arguments: { action: 'find_by_class', className: 'StaticMeshActor' }, expected: 'success or handled' },
43
+ { scenario: 'Get bounding box', toolName: 'inspect', arguments: { action: 'get_bounding_box', name: 'Inspect_A' }, expected: 'error|ACTOR_NOT_FOUND' },
44
+ { scenario: 'Inspect blueprint class (best-effort)', toolName: 'inspect', arguments: { action: 'inspect_class', classPath: '/Game/Blueprints/BP_Auto' }, expected: 'success or handled' },
45
+ { scenario: 'Verify delete again', toolName: 'inspect', arguments: { action: 'delete_object', name: 'Inspect_A' }, expected: 'error|NOT_FOUND' },
46
+ {
47
+ scenario: "Error: Invalid object path",
48
+ toolName: "inspect",
49
+ arguments: { action: "inspect_object", objectPath: "/Invalid/Path" },
50
+ expected: "not_found"
51
+ },
52
+ {
53
+ scenario: "Edge: Set invalid property",
54
+ toolName: "inspect",
55
+ arguments: { action: "set_property", objectPath: "/Valid", propertyName: "InvalidProp", value: 1 },
56
+ expected: "error|unknown_property|OBJECT_NOT_FOUND"
57
+ },
58
+ {
59
+ scenario: "Border: Empty tag add",
60
+ toolName: "inspect",
61
+ arguments: { action: "add_tag", objectPath: "/Valid", tag: "" },
62
+ expected: "success|handled"
63
+ },
64
+ {
65
+ scenario: "Error: Find invalid class",
66
+ toolName: "inspect",
67
+ arguments: { action: "find_by_class", className: "InvalidClass" },
68
+ expected: "no_results|success"
69
+ }
70
+ ];
71
+
72
+ await runToolTests('Inspect', testCases);
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Condensed Environment Building Test Suite (15 cases)
4
+ * Tool: build_environment
5
+ */
6
+
7
+ import { runToolTests } from './test-runner.mjs';
8
+
9
+ const testCases = [
10
+ { scenario: 'Create small landscape', toolName: 'build_environment', arguments: { action: 'create_landscape', name: 'TC_Landscape', sizeX: 4, sizeY: 4 }, expected: 'success - landscape created' },
11
+ { scenario: 'Sculpt landscape - smooth', toolName: 'build_environment', arguments: { action: 'sculpt', name: 'TC_Landscape', tool: 'Smooth' }, expected: 'success or LOAD_FAILED' },
12
+ { scenario: 'Flatten small area', toolName: 'build_environment', arguments: { action: 'sculpt', name: 'TC_Landscape', tool: 'Flatten' }, expected: 'success or LOAD_FAILED' },
13
+ { scenario: 'Add foliage type (trees)', toolName: 'build_environment', arguments: { action: 'add_foliage', foliageType: 'TC_Tree', meshPath: '/Engine/BasicShapes/Cube.Cube', density: 0.1 }, expected: 'success - foliage added' },
14
+ { scenario: 'Paint a small foliage patch', toolName: 'build_environment', arguments: { action: 'paint_foliage', foliageType: 'TC_Tree', position: { x: 0, y: 0, z: 0 }, brushSize: 100, strength: 0.5 }, expected: 'success - foliage painted' },
15
+ { scenario: 'Create procedural terrain', toolName: 'build_environment', arguments: { action: 'create_procedural_terrain', name: 'TC_ProcTerrain', location: { x: 500, y: 0, z: 0 }, subdivisions: 8 }, expected: 'success - procedural terrain created' },
16
+ { scenario: 'Create procedural foliage (small)', toolName: 'build_environment', arguments: { action: 'create_procedural_foliage', bounds: { location: { x: 0, y: 0, z: 0 }, size: { x: 1000, y: 1000, z: 100 } }, seed: 42 }, expected: 'success - procedural foliage created' },
17
+ { scenario: 'Add grass foliage', toolName: 'build_environment', arguments: { action: 'add_foliage', meshPath: '/Engine/BasicShapes/Cube.Cube', density: 0.5 }, expected: 'success - grass added' },
18
+ { scenario: 'Generate small LODs (best-effort)', toolName: 'build_environment', arguments: { action: 'generate_lods', assetPath: '/Game/Meshes/SM_Test', lodCount: 2 }, expected: 'success or ASSET_NOT_FOUND' },
19
+ { scenario: 'Bake lightmap for a small area (preview)', toolName: 'build_environment', arguments: { action: 'bake_lightmap', quality: 'Preview' }, expected: 'success - lightmap bake requested' },
20
+ { scenario: 'Create landscape grass type', toolName: 'build_environment', arguments: { action: 'create_landscape_grass_type', name: 'TC_Grass', meshPath: '/Engine/BasicShapes/Cube.Cube' }, expected: 'success - grass type created' },
21
+ { scenario: 'Add foliage instances', toolName: 'build_environment', arguments: { action: 'add_foliage', foliageType: 'TC_Tree', locations: [{ x: 0, y: 0, z: 0 }] }, expected: 'success - instances added' },
22
+ { scenario: 'Export environment snapshot', toolName: 'build_environment', arguments: { action: 'export_snapshot', path: './tests/reports/env_snapshot.json' }, expected: 'success - snapshot exported' },
23
+ { scenario: 'Import environment snapshot', toolName: 'build_environment', arguments: { action: 'import_snapshot', path: './tests/reports/env_snapshot.json' }, expected: 'success - import handled' },
24
+ { scenario: 'Cleanup landscape artifacts', toolName: 'build_environment', arguments: { action: 'delete', names: ['TC_Landscape', 'TC_ProcTerrain'] }, expected: 'success or DELETE_PARTIAL' },
25
+ // Additional
26
+ // Real-World Scenario: Terrain Sculpting
27
+ { scenario: 'Sculpting - Create Landscape', toolName: 'build_environment', arguments: { action: 'create_landscape', name: 'TC_Sculpt_Landscape', sizeX: 8, sizeY: 8 }, expected: 'success' },
28
+ { scenario: 'Sculpting - Apply Noise', toolName: 'build_environment', arguments: { action: 'sculpt', name: 'TC_Sculpt_Landscape', tool: 'Noise', strength: 0.2 }, expected: 'success or LOAD_FAILED' },
29
+ { scenario: 'Sculpting - Assign Material', toolName: 'build_environment', arguments: { action: 'set_landscape_material', name: 'TC_Sculpt_Landscape', materialPath: '/Engine/EngineMaterials/WorldGridMaterial.WorldGridMaterial' }, expected: 'success or LOAD_FAILED' },
30
+
31
+ // Cleanup
32
+ { scenario: 'Cleanup - Delete Sculpt Landscape', toolName: 'build_environment', arguments: { action: 'delete', names: ['TC_Sculpt_Landscape'] }, expected: 'success or DELETE_PARTIAL' },
33
+
34
+ {
35
+ scenario: "Error: Invalid sculpt tool",
36
+ toolName: "build_environment",
37
+ arguments: { action: "sculpt", tool: "InvalidTool" },
38
+ expected: "error"
39
+ },
40
+ {
41
+ scenario: "Edge: Landscape size 0",
42
+ toolName: "build_environment",
43
+ arguments: { action: "create_landscape", sizeX: 0, sizeY: 0 },
44
+ expected: "error|validation|required"
45
+ },
46
+ {
47
+ scenario: "Border: Zero density foliage",
48
+ toolName: "build_environment",
49
+ arguments: { action: "add_foliage", meshPath: "/Game/Valid", density: 0 },
50
+ expected: "success|no_instances|LOAD_FAILED|ASSET_NOT_FOUND|INVALID_ARGUMENT"
51
+ },
52
+ {
53
+ scenario: "Edge: Empty foliage types",
54
+ toolName: "build_environment",
55
+ arguments: { action: "create_procedural_foliage", foliageTypes: [] },
56
+ expected: "success|no_op"
57
+ }
58
+ ];
59
+
60
+ await runToolTests('Environment Building', testCases);