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,356 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Condensed Materials Test Suite (15 cases) — minimal safe operations.
4
+ * Tool: manage_asset
5
+ */
6
+
7
+ import { runToolTests } from './test-runner.mjs';
8
+
9
+ const testCases = [
10
+ {
11
+ scenario: "Create base material",
12
+ toolName: "manage_asset",
13
+ arguments: {
14
+ action: "create_material",
15
+ name: "M_BaseMaterial_TC",
16
+ path: "/Game/Materials"
17
+ },
18
+ expected: "success - material created"
19
+ },
20
+ {
21
+ scenario: "Create master material",
22
+ toolName: "manage_asset",
23
+ arguments: {
24
+ action: "create_material",
25
+ name: "M_MasterMaterial_TC",
26
+ path: "/Game/Materials",
27
+ materialType: "Master"
28
+ },
29
+ expected: "success - master material created"
30
+ },
31
+ {
32
+ scenario: "Create material instance",
33
+ toolName: "manage_asset",
34
+ arguments: {
35
+ action: "create_material_instance",
36
+ name: "MI_TestInstance_TC",
37
+ path: "/Game/Materials",
38
+ parentMaterial: "/Game/Materials/M_MasterMaterial_TC",
39
+ parameters: {
40
+ BaseColor: [0.8, 0.2, 0.2, 1.0]
41
+ }
42
+ },
43
+ expected: "success - material instance created"
44
+ },
45
+ {
46
+ scenario: "List materials folder",
47
+ toolName: "manage_asset",
48
+ arguments: {
49
+ action: "list",
50
+ directory: "/Game/Materials"
51
+ },
52
+ expected: "success - materials listed"
53
+ },
54
+ {
55
+ scenario: "Duplicate material instance",
56
+ toolName: "manage_asset",
57
+ arguments: {
58
+ action: "duplicate",
59
+ sourcePath: "/Game/Materials/MI_TestInstance_TC",
60
+ destinationPath: "/Game/Materials/Copies",
61
+ newName: "MI_TestInstance_Copy_TC",
62
+ save: true
63
+ },
64
+ expected: "success - duplicated"
65
+ },
66
+ {
67
+ scenario: "Rename duplicated material",
68
+ toolName: "manage_asset",
69
+ arguments: {
70
+ action: "rename",
71
+ assetPath: "/Game/Materials/Copies/MI_TestInstance_Copy_TC",
72
+ newName: "MI_TestInstance_Renamed_TC"
73
+ },
74
+ expected: "success - renamed"
75
+ },
76
+ {
77
+ scenario: "Get dependencies",
78
+ toolName: "manage_asset",
79
+ arguments: {
80
+ action: "get_dependencies",
81
+ assetPath: "/Game/Materials/MI_TestInstance_TC"
82
+ },
83
+ expected: "success - dependencies returned"
84
+ },
85
+ {
86
+ scenario: "Create thumbnail",
87
+ toolName: "manage_asset",
88
+ arguments: {
89
+ action: "create_thumbnail",
90
+ assetPath: "/Game/Materials/M_BaseMaterial_TC"
91
+ },
92
+ expected: "success - thumbnail created"
93
+ },
94
+ {
95
+ scenario: "Set tags",
96
+ toolName: "manage_asset",
97
+ arguments: {
98
+ action: "set_tags",
99
+ assetPath: "/Game/Materials/M_BaseMaterial_TC",
100
+ tags: ["TC", "Material"]
101
+ },
102
+ expected: "success - tags set"
103
+ },
104
+ /*
105
+ {
106
+ scenario: "Validate asset",
107
+ toolName: "manage_asset",
108
+ arguments: {
109
+ action: "validate",
110
+ assetPath: "/Game/Materials/M_BaseMaterial_TC"
111
+ },
112
+ expected: "success - asset validated"
113
+ },
114
+ {
115
+ scenario: "Generate small report",
116
+ toolName: "manage_asset",
117
+ arguments: {
118
+ action: "generate_report",
119
+ directory: "/Game/Materials",
120
+ reportType: "Size",
121
+ outputPath: "./tests/reports/materials_report_tc.json"
122
+ },
123
+ expected: "success - report generated"
124
+ },
125
+ */
126
+ {
127
+ scenario: "Move material to subfolder",
128
+ toolName: "manage_asset",
129
+ arguments: {
130
+ action: "move",
131
+ assetPath: "/Game/Materials/M_BaseMaterial_TC",
132
+ destinationPath: "/Game/Materials/TC"
133
+ },
134
+ expected: "success - moved"
135
+ },
136
+ {
137
+ scenario: "Delete duplicated assets",
138
+ toolName: "manage_asset",
139
+ arguments: {
140
+ action: "delete",
141
+ assetPaths: [
142
+ "/Game/Materials/Copies/MI_TestInstance_Renamed_TC"
143
+ ]
144
+ },
145
+ expected: "success - deleted"
146
+ },
147
+
148
+ {
149
+ scenario: "Remove materials folder",
150
+ toolName: "manage_asset",
151
+ arguments: {
152
+ action: "delete",
153
+ assetPath: "/Game/Materials/TC"
154
+ },
155
+ expected: "success - folder removed"
156
+ },
157
+ {
158
+ scenario: "Inheritance Chain - Create Master",
159
+ toolName: "manage_asset",
160
+ arguments: {
161
+ action: "create_material",
162
+ name: "M_Chain_Master",
163
+ path: "/Game/Materials/Chain",
164
+ materialType: "Master"
165
+ },
166
+ expected: "success"
167
+ },
168
+ {
169
+ scenario: "Inheritance Chain - Create Child A",
170
+ toolName: "manage_asset",
171
+ arguments: {
172
+ action: "create_material_instance",
173
+ name: "MI_Chain_A",
174
+ path: "/Game/Materials/Chain",
175
+ parentMaterial: "/Game/Materials/Chain/M_Chain_Master",
176
+ parameters: {
177
+ BaseColor: [1.0, 0.0, 0.0, 1.0]
178
+ }
179
+ },
180
+ expected: "success"
181
+ },
182
+ {
183
+ scenario: "Inheritance Chain - Create Child B (Grandchild)",
184
+ toolName: "manage_asset",
185
+ arguments: {
186
+ action: "create_material_instance",
187
+ name: "MI_Chain_B",
188
+ path: "/Game/Materials/Chain",
189
+ parentMaterial: "/Game/Materials/Chain/MI_Chain_A",
190
+ parameters: {
191
+ BaseColor: [0.0, 1.0, 0.0, 1.0]
192
+ }
193
+ },
194
+ expected: "success"
195
+ },
196
+ {
197
+ scenario: "Inheritance Chain - Verify Dependencies",
198
+ toolName: "manage_asset",
199
+ arguments: {
200
+ action: "get_dependencies",
201
+ assetPath: "/Game/Materials/Chain/MI_Chain_B"
202
+ },
203
+ expected: "success"
204
+ },
205
+ {
206
+ scenario: "Cleanup Inheritance Chain",
207
+ toolName: "manage_asset",
208
+ arguments: {
209
+ action: "delete",
210
+ assetPaths: [
211
+ "/Game/Materials/Chain"
212
+ ]
213
+ },
214
+ expected: "success"
215
+ },
216
+ {
217
+ scenario: "Error: Invalid parent material",
218
+ toolName: "manage_asset",
219
+ arguments: { action: "create_material_instance", name: "TestMI", path: "/Game/Test", parentMaterial: "/Invalid/Parent" },
220
+ expected: "not_found"
221
+ },
222
+ {
223
+ scenario: "Edge: Empty parameters object",
224
+ toolName: "manage_asset",
225
+ arguments: { action: "create_material_instance", name: "Test", path: "/Game/Test", parentMaterial: "/Valid", parameters: {} },
226
+ expected: "success"
227
+ },
228
+ {
229
+ scenario: "Border: Extreme color param [255,255,255,0]",
230
+ toolName: "manage_asset",
231
+ arguments: { action: "create_material_instance", name: "TestExtreme", path: "/Game/Test", parentMaterial: "/Valid", parameters: { BaseColor: [255, 255, 255, 0] } },
232
+ expected: "success"
233
+ },
234
+ {
235
+ scenario: "Error: Non-material duplicate",
236
+ toolName: "manage_asset",
237
+ arguments: { action: "duplicate", assetPath: "/Engine/BasicShapes/Cube" },
238
+ expected: "error|not_material"
239
+ },
240
+ // --- New Test Cases (+20) ---
241
+ {
242
+ scenario: "Create Unlit Material",
243
+ toolName: "manage_asset",
244
+ arguments: { action: "create_material", name: "M_Unlit_TC", path: "/Game/Materials", properties: { ShadingModel: "Unlit" } },
245
+ expected: "success"
246
+ },
247
+ {
248
+ scenario: "Create Translucent Material",
249
+ toolName: "manage_asset",
250
+ arguments: { action: "create_material", name: "M_Translucent_TC", path: "/Game/Materials", properties: { BlendMode: "Translucent" } },
251
+ expected: "success"
252
+ },
253
+ {
254
+ scenario: "Create Two-Sided Material",
255
+ toolName: "manage_asset",
256
+ arguments: { action: "create_material", name: "M_TwoSided_TC", path: "/Game/Materials", properties: { TwoSided: true } },
257
+ expected: "success"
258
+ },
259
+ {
260
+ scenario: "Add Scalar Parameter",
261
+ toolName: "manage_asset",
262
+ arguments: { action: "add_material_parameter", assetPath: "/Game/Materials/M_MasterMaterial_TC", parameterName: "Roughness", parameterType: "Scalar", defaultValue: 0.5 },
263
+ expected: "success"
264
+ },
265
+ {
266
+ scenario: "Add Vector Parameter",
267
+ toolName: "manage_asset",
268
+ arguments: { action: "add_material_parameter", assetPath: "/Game/Materials/M_MasterMaterial_TC", parameterName: "EmissiveColor", parameterType: "Vector", defaultValue: [1, 0, 0, 1] },
269
+ expected: "success"
270
+ },
271
+ {
272
+ scenario: "Add Texture Parameter",
273
+ toolName: "manage_asset",
274
+ arguments: { action: "add_material_parameter", assetPath: "/Game/Materials/M_MasterMaterial_TC", parameterName: "BaseTexture", parameterType: "Texture" },
275
+ expected: "success"
276
+ },
277
+ {
278
+ scenario: "Add Static Switch",
279
+ toolName: "manage_asset",
280
+ arguments: { action: "add_material_parameter", assetPath: "/Game/Materials/M_MasterMaterial_TC", parameterName: "UseTexture", parameterType: "StaticSwitch", defaultValue: false },
281
+ expected: "success"
282
+ },
283
+ {
284
+ scenario: "Create Constant Instance",
285
+ toolName: "manage_asset",
286
+ arguments: { action: "create_material_instance", name: "MIC_Test", path: "/Game/Materials", parentMaterial: "/Game/Materials/M_MasterMaterial_TC", constant: true },
287
+ expected: "success"
288
+ },
289
+ {
290
+ scenario: "List Material Instances",
291
+ toolName: "manage_asset",
292
+ arguments: { action: "list_instances", assetPath: "/Game/Materials/M_MasterMaterial_TC" },
293
+ expected: "success"
294
+ },
295
+ {
296
+ scenario: "Reset Instance Parameters",
297
+ toolName: "manage_asset",
298
+ arguments: { action: "reset_instance_parameters", assetPath: "/Game/Materials/MI_TestInstance_TC" },
299
+ expected: "success"
300
+ },
301
+ {
302
+ scenario: "Check Material Exists",
303
+ toolName: "manage_asset",
304
+ arguments: { action: "exists", assetPath: "/Game/Materials/M_MasterMaterial_TC" },
305
+ expected: "true"
306
+ },
307
+ {
308
+ scenario: "Get Material Stats",
309
+ toolName: "manage_asset",
310
+ arguments: { action: "get_material_stats", assetPath: "/Game/Materials/M_MasterMaterial_TC" },
311
+ expected: "success"
312
+ },
313
+ {
314
+ scenario: "Error: Add existing parameter",
315
+ toolName: "manage_asset",
316
+ arguments: { action: "add_material_parameter", assetPath: "/Game/Materials/M_MasterMaterial_TC", parameterName: "Roughness", parameterType: "Scalar" },
317
+ expected: "success"
318
+ },
319
+ {
320
+ scenario: "Error: Create invalid shading model",
321
+ toolName: "manage_asset",
322
+ arguments: { action: "create_material", name: "M_Invalid", path: "/Game/Materials", properties: { ShadingModel: "InvalidModel" } },
323
+ expected: "error|invalid_property"
324
+ },
325
+ {
326
+ scenario: "Edge: Translucent Unlit",
327
+ toolName: "manage_asset",
328
+ arguments: { action: "create_material", name: "M_Glass", path: "/Game/Materials", properties: { ShadingModel: "Unlit", BlendMode: "Translucent" } },
329
+ expected: "success"
330
+ },
331
+ {
332
+ scenario: "Validation: Missing parent for instance",
333
+ toolName: "manage_asset",
334
+ arguments: { action: "create_material_instance", name: "MI_Orphan", path: "/Game/Materials" },
335
+ expected: "error|missing_parent"
336
+ },
337
+ {
338
+ scenario: "Cleanup New Materials",
339
+ toolName: "manage_asset",
340
+ arguments: {
341
+ action: "delete", assetPaths: [
342
+ "/Game/Materials/M_Unlit_TC",
343
+ "/Game/Materials/M_Translucent_TC",
344
+ "/Game/Materials/M_TwoSided_TC",
345
+ "/Game/Materials/MIC_Test",
346
+ "/Game/Materials/M_Glass",
347
+ "/Game/Materials/TC/M_BaseMaterial_TC",
348
+ "/Game/Materials/MI_TestInstance_TC",
349
+ "/Game/Materials/M_MasterMaterial_TC"
350
+ ]
351
+ },
352
+ expected: "success"
353
+ }
354
+ ];
355
+
356
+ await runToolTests('Materials', testCases);
@@ -0,0 +1,185 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Condensed Effects & Visual Test Suite (15 cases)
4
+ * Tool: manage_effect
5
+ */
6
+
7
+ import { runToolTests } from './test-runner.mjs';
8
+
9
+ const systemPath = '/Game/Effects/Niagara/TC_System';
10
+
11
+ const testCases = [
12
+ // 1. Create real Niagara System asset first
13
+ { scenario: 'Create real Niagara System', toolName: 'manage_effect', arguments: { action: 'create_niagara_system', name: 'TC_System', template: 'Fountain' }, expected: 'success - system created' },
14
+
15
+ { scenario: 'Spawn basic particle (engine)', toolName: 'manage_effect', arguments: { action: 'particle', preset: '/Engine/BasicShapes/Cube', location: { x: 0, y: 0, z: 100 } }, expected: 'success - particle spawned' },
16
+ { scenario: 'Spawn smoke particle', toolName: 'manage_effect', arguments: { action: 'particle', preset: '/Engine/BasicShapes/Cube', location: { x: 200, y: 0, z: 100 } }, expected: 'success - smoke spawned' },
17
+ { scenario: 'Spawn explosion particle', toolName: 'manage_effect', arguments: { action: 'particle', preset: '/Engine/BasicShapes/Cube', location: { x: 400, y: 0, z: 100 } }, expected: 'success - explosion spawned' },
18
+ { scenario: 'Create debug line', toolName: 'manage_effect', arguments: { action: 'debug_shape', shapeType: 'Line', start: { x: 0, y: 0, z: 0 }, end: { x: 1000, y: 0, z: 0 }, color: { r: 1, g: 0, b: 0, a: 1 } }, expected: 'success - debug drawn' },
19
+ { scenario: 'Create debug box', toolName: 'manage_effect', arguments: { action: 'debug_shape', shapeType: 'Box', location: { x: 0, y: 0, z: 100 }, extent: { x: 100, y: 100, z: 100 } }, expected: 'success - debug box' },
20
+ { scenario: 'Create debug sphere', toolName: 'manage_effect', arguments: { action: 'debug_shape', shapeType: 'Sphere', location: { x: 500, y: 500, z: 100 }, radius: 150 }, expected: 'success - debug sphere' },
21
+
22
+ // Use the created system path
23
+ { scenario: 'Spawn a simple Niagara system (safe path)', toolName: 'manage_effect', arguments: { action: 'niagara', systemPath: systemPath, location: { x: 0, y: 0, z: 200 }, autoActivate: true, name: 'TC_System_Actor' }, expected: 'success - niagara spawned', timeout: 180000 },
24
+ { scenario: 'Spawn niagara with parameters (best-effort)', toolName: 'manage_effect', arguments: { action: 'niagara', systemPath: systemPath, parameters: { FloatParam: 1.0 }, location: { x: 100, y: 100, z: 200 } }, expected: 'success - niagara params applied' },
25
+ { scenario: 'Create volumetric fog (lightweight)', toolName: 'manage_effect', arguments: { action: 'create_volumetric_fog', fogName: 'TC_Fog', bounds: { min: { x: -500, y: -500, z: 0 }, max: { x: 500, y: 500, z: 500 } }, density: 0.01, systemPath: systemPath }, expected: 'success - fog created' },
26
+ { scenario: 'Create dynamic light pulse', toolName: 'manage_effect', arguments: { action: 'create_dynamic_light', lightName: 'TC_Pulse', lightType: 'Point', location: { x: 0, y: 0, z: 300 }, intensity: 2000, pulse: { enabled: true, frequency: 1.0 } }, expected: 'success - dynamic light created' },
27
+ { scenario: 'Create particle trail simple', toolName: 'manage_effect', arguments: { action: 'create_particle_trail', trailName: 'TC_Trail', emitterCount: 2, particleCount: 50, lifetime: 2.0, systemPath: systemPath }, expected: 'success - particle trail created' },
28
+ { scenario: 'Create environmental effect', toolName: 'manage_effect', arguments: { action: 'create_environment_effect', effectType: 'Leaves', count: 20, spawnArea: { min: { x: -500, y: -500, z: 0 }, max: { x: 500, y: 500, z: 200 } }, systemPath: systemPath }, expected: 'success - environment effect' },
29
+ { scenario: 'Create impact effect (best-effort)', toolName: 'manage_effect', arguments: { action: 'create_impact_effect', surfaceType: 'Default', location: { x: 100, y: 100, z: 100 }, effects: {}, systemPath: systemPath }, expected: 'success - impact effect' },
30
+ { scenario: 'Create niagara ribbon (best-effort)', toolName: 'manage_effect', arguments: { action: 'create_niagara_ribbon', ribbonName: 'TC_Ribbon', startPoint: { x: -200, y: 0, z: 200 }, endPoint: { x: 200, y: 0, z: 200 }, width: 10, segments: 10, systemPath: systemPath }, expected: 'success - ribbon created' },
31
+
32
+ { scenario: 'Cleanup effect actors', toolName: 'manage_effect', arguments: { action: 'cleanup', filter: 'TC_' }, expected: 'success - cleanup performed' },
33
+ { scenario: 'Niagara - Create System (redundant check)', toolName: 'manage_effect', arguments: { action: 'niagara', systemPath: systemPath, location: { x: 1000, y: 0, z: 100 }, autoActivate: false }, expected: 'success' },
34
+ { scenario: 'Niagara - Override Parameter', toolName: 'manage_effect', arguments: { action: 'set_niagara_parameter', systemName: 'TC_System', parameterName: 'User.FloatParam', parameterType: 'Float', value: 2.5, isUserParameter: true }, expected: 'error' },
35
+ { scenario: 'Niagara - Activate', toolName: 'manage_effect', arguments: { action: 'activate_effect', actorName: 'TC_System' }, expected: 'error' },
36
+ {
37
+ scenario: "Error: Invalid Niagara system",
38
+ toolName: "manage_effect",
39
+ arguments: { action: "niagara", systemPath: "/Invalid/System" },
40
+ expected: "SYSTEM_NOT_FOUND"
41
+ },
42
+ {
43
+ scenario: "Edge: Scale 0",
44
+ toolName: "manage_effect",
45
+ arguments: { action: "niagara", systemPath: systemPath, scale: 0 },
46
+ expected: "success"
47
+ },
48
+ {
49
+ scenario: "Border: Invalid param type",
50
+ toolName: "manage_effect",
51
+ arguments: { action: "set_niagara_parameter", systemName: "Test", parameterName: "FloatParam", parameterType: "Invalid", value: 1 },
52
+ expected: "error"
53
+ },
54
+ {
55
+ scenario: "Edge: Empty filter cleanup",
56
+ toolName: "manage_effect",
57
+ arguments: { action: "cleanup", filter: "" },
58
+ expected: "success|no_op"
59
+ },
60
+ // --- New Test Cases (+20) ---
61
+ {
62
+ scenario: "Create Empty System",
63
+ toolName: "manage_effect",
64
+ arguments: { action: "create_niagara_system", name: "NS_Empty_TC", path: "/Game/Effects/Niagara" },
65
+ expected: "success"
66
+ },
67
+ {
68
+ scenario: "Create System from Emitters",
69
+ toolName: "manage_effect",
70
+ arguments: { action: "create_niagara_system", name: "NS_FromEmitters_TC", path: "/Game/Effects/Niagara", emitterAssets: ["/Engine/Niagara/Emitters/Fountain"] },
71
+ expected: "success"
72
+ },
73
+ // SKIPPED: Add/Remove Emitter not implemented in C++ yet
74
+ // {
75
+ // scenario: "Add Emitter to System",
76
+ // toolName: "manage_effect",
77
+ // arguments: { action: "add_emitter", systemPath: "/Game/Effects/Niagara/NS_Empty_TC", emitterPath: "/Engine/Niagara/Emitters/OmniDirectionalBurst" },
78
+ // expected: "success"
79
+ // },
80
+ // {
81
+ // scenario: "Remove Emitter from System",
82
+ // toolName: "manage_effect",
83
+ // arguments: { action: "remove_emitter", systemPath: "/Game/Effects/Niagara/NS_Empty_TC", emitterName: "OmniDirectionalBurst" },
84
+ // expected: "success"
85
+ // },
86
+ {
87
+ scenario: "Re-spawn TC_System_Actor for parameter tests",
88
+ toolName: "manage_effect",
89
+ arguments: { action: "niagara", systemPath: systemPath, location: { x: 0, y: 0, z: 200 }, autoActivate: true, name: "TC_System_Actor" },
90
+ expected: "success"
91
+ },
92
+ {
93
+ scenario: "Set Float Parameter",
94
+ toolName: "manage_effect",
95
+ arguments: { action: "set_niagara_parameter", actorName: "TC_System_Actor", parameterName: "User.SpawnRate", value: 50.0, type: "float" },
96
+ expected: "success"
97
+ },
98
+ {
99
+ scenario: "Set Color Parameter",
100
+ toolName: "manage_effect",
101
+ arguments: { action: "set_niagara_parameter", actorName: "TC_System_Actor", parameterName: "User.Color", value: [1.0, 0.0, 0.0, 1.0], type: "color" },
102
+ expected: "success"
103
+ },
104
+ /*
105
+ {
106
+ scenario: "Set Vector Parameter",
107
+ toolName: "manage_effect",
108
+ arguments: { action: "set_niagara_parameter", actorName: "TC_System_Actor", parameterName: "User.Position", value: [100.0, 0.0, 0.0], type: "vector" },
109
+ expected: "success"
110
+ },
111
+ */
112
+ {
113
+ scenario: "Set Bool Parameter",
114
+ toolName: "manage_effect",
115
+ arguments: { action: "set_niagara_parameter", actorName: "TC_System_Actor", parameterName: "User.Enabled", value: true, type: "bool" },
116
+ expected: "success"
117
+ },
118
+ {
119
+ scenario: "Activate System Actor",
120
+ toolName: "manage_effect",
121
+ arguments: { action: "activate", actorName: "TC_System_Actor" },
122
+ expected: "success"
123
+ },
124
+ {
125
+ scenario: "Deactivate System Actor",
126
+ toolName: "manage_effect",
127
+ arguments: { action: "deactivate", actorName: "TC_System_Actor" },
128
+ expected: "success"
129
+ },
130
+ {
131
+ scenario: "Reset System Simulation",
132
+ toolName: "manage_effect",
133
+ arguments: { action: "reset", actorName: "TC_System_Actor" },
134
+ expected: "success"
135
+ },
136
+ {
137
+ scenario: "Advance Simulation",
138
+ toolName: "manage_effect",
139
+ arguments: { action: "advance_simulation", actorName: "TC_System_Actor", deltaTime: 0.1, steps: 1 },
140
+ expected: "success"
141
+ },
142
+ {
143
+ scenario: "Spawn at absolute location",
144
+ toolName: "manage_effect",
145
+ arguments: { action: "niagara", systemPath: systemPath, location: { x: 500, y: 500, z: 500 }, rotation: { pitch: 0, yaw: 90, roll: 0 }, scale: { x: 2, y: 2, z: 2 } },
146
+ expected: "success"
147
+ },
148
+ {
149
+ scenario: "Spawn attached to actor",
150
+ toolName: "manage_effect",
151
+ arguments: { action: "niagara", systemPath: systemPath, attachToActor: "TC_Cube", attachPoint: "RootComponent" },
152
+ expected: "success"
153
+ },
154
+ {
155
+ scenario: "Error: Add invalid emitter",
156
+ toolName: "manage_effect",
157
+ arguments: { action: "add_emitter", systemPath: systemPath, emitterPath: "/Game/InvalidEmitter" },
158
+ expected: "error|not_found"
159
+ },
160
+ {
161
+ scenario: "Error: Set invalid parameter type",
162
+ toolName: "manage_effect",
163
+ arguments: { action: "set_niagara_parameter", systemPath: systemPath, parameterName: "User.SpawnRate", value: "invalid", type: "float" },
164
+ expected: "error"
165
+ },
166
+ {
167
+ scenario: "Edge: Advance simulation 0 time",
168
+ toolName: "manage_effect",
169
+ arguments: { action: "advance_simulation", actorName: "TC_System_Actor", deltaTime: 0 },
170
+ expected: "success|no_op"
171
+ },
172
+ {
173
+ scenario: "Cleanup Niagara Tests",
174
+ toolName: "manage_asset",
175
+ arguments: {
176
+ action: "delete", assetPaths: [
177
+ "/Game/Effects/Niagara/NS_Empty_TC",
178
+ "/Game/Effects/Niagara/NS_FromEmitters_TC"
179
+ ]
180
+ },
181
+ expected: "success"
182
+ }
183
+ ];
184
+
185
+ await runToolTests('Effects & Visual', testCases);
@@ -0,0 +1,122 @@
1
+ #!/usr/bin/env node
2
+ import fs from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+
6
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
7
+ const repoRoot = path.resolve(__dirname, '..');
8
+ const srcRoot = path.resolve(repoRoot, 'src');
9
+
10
+ function isPositionInsideLiteralOrComment(content, pos) {
11
+ let inSingle = false;
12
+ let inDouble = false;
13
+ let inBacktick = false;
14
+ let inLineComment = false;
15
+ let inBlockComment = false;
16
+
17
+ for (let i = 0; i < pos; i += 1) {
18
+ const ch = content[i];
19
+ const next = content[i + 1];
20
+
21
+ if (inLineComment) {
22
+ if (ch === '\n') inLineComment = false;
23
+ continue;
24
+ }
25
+ if (inBlockComment) {
26
+ if (ch === '*' && next === '/') {
27
+ inBlockComment = false; i += 1; continue;
28
+ }
29
+ continue;
30
+ }
31
+ if (inSingle) {
32
+ if (ch === "\\") { i += 1; continue; }
33
+ if (ch === "'") { inSingle = false; }
34
+ continue;
35
+ }
36
+ if (inDouble) {
37
+ if (ch === "\\") { i += 1; continue; }
38
+ if (ch === '"') { inDouble = false; }
39
+ continue;
40
+ }
41
+ if (inBacktick) {
42
+ if (ch === "\\") { i += 1; continue; }
43
+ if (ch === '`') { inBacktick = false; }
44
+ continue;
45
+ }
46
+
47
+ // Not inside any literal/comment
48
+ if (ch === '/' && next === '/') { inLineComment = true; i += 1; continue; }
49
+ if (ch === '/' && next === '*') { inBlockComment = true; i += 1; continue; }
50
+ if (ch === "'") { inSingle = true; continue; }
51
+ if (ch === '"') { inDouble = true; continue; }
52
+ if (ch === '`') { inBacktick = true; continue; }
53
+ }
54
+
55
+ return inSingle || inDouble || inBacktick || inLineComment || inBlockComment;
56
+ }
57
+
58
+ async function listTsFiles(dir) {
59
+ const out = [];
60
+ const entries = await fs.readdir(dir, { withFileTypes: true });
61
+ for (const ent of entries) {
62
+ if (ent.name === 'node_modules' || ent.name === 'dist' || ent.name === '.git') continue;
63
+ const full = path.join(dir, ent.name);
64
+ if (ent.isDirectory()) {
65
+ out.push(...(await listTsFiles(full)));
66
+ } else if (ent.isFile() && full.endsWith('.ts')) {
67
+ out.push(full);
68
+ }
69
+ }
70
+ return out;
71
+ }
72
+
73
+ function toLineCol(content, index) {
74
+ const before = content.slice(0, index);
75
+ const lines = before.split(/\r?\n/);
76
+ const line = lines.length;
77
+ const col = lines[lines.length - 1].length + 1;
78
+ return { line, col };
79
+ }
80
+
81
+ async function main() {
82
+ const patterns = [
83
+ { name: 'import_unreal', re: /import\s+unreal\b/g },
84
+ { name: 'python_def', re: /\bdef\s+[A-Za-z_][A-Za-z0-9_]*/g },
85
+ { name: 'print_result', re: /print\s*\(\s*['\"]RESULT:/g },
86
+ { name: 'json_dumps', re: /json\.dumps\s*\(/g }
87
+ ];
88
+
89
+ const files = await listTsFiles(srcRoot);
90
+ const failures = [];
91
+
92
+ for (const f of files) {
93
+ const content = await fs.readFile(f, 'utf8');
94
+ for (const p of patterns) {
95
+ let m;
96
+ while ((m = p.re.exec(content)) !== null) {
97
+ const idx = m.index;
98
+ if (isPositionInsideLiteralOrComment(content, idx)) continue;
99
+ const pos = toLineCol(content, idx);
100
+ const snippetLine = content.split(/\r?\n/)[pos.line - 1] ?? '';
101
+ failures.push({ file: f, pattern: p.name, match: m[0], line: pos.line, col: pos.col, snippet: snippetLine.trim() });
102
+ }
103
+ }
104
+ }
105
+
106
+ if (failures.length > 0) {
107
+ console.error('\nInline Python detected outside of string literals or comments in TypeScript source files:');
108
+ for (const fail of failures) {
109
+ console.error(`\n - ${path.relative(repoRoot, fail.file)}:${fail.line}:${fail.col} [${fail.pattern}] -> ${fail.snippet}`);
110
+ }
111
+ console.error('\nPlease move Python code into a dedicated helper module and keep TypeScript files free of raw Python.');
112
+ process.exitCode = 1;
113
+ return;
114
+ }
115
+
116
+ console.log('No inline Python found in TypeScript source files (outside of string literals/comments).');
117
+ }
118
+
119
+ main().catch((err) => {
120
+ console.error('Test failed with unexpected error:', err);
121
+ process.exitCode = 2;
122
+ });