unreal-engine-mcp-server 0.4.6 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (438) hide show
  1. package/.env.example +26 -0
  2. package/.env.production +38 -7
  3. package/.eslintrc.json +0 -54
  4. package/.eslintrc.override.json +8 -0
  5. package/.github/ISSUE_TEMPLATE/bug_report.yml +94 -0
  6. package/.github/ISSUE_TEMPLATE/config.yml +8 -0
  7. package/.github/ISSUE_TEMPLATE/feature_request.yml +56 -0
  8. package/.github/copilot-instructions.md +478 -45
  9. package/.github/dependabot.yml +19 -0
  10. package/.github/labeler.yml +24 -0
  11. package/.github/labels.yml +70 -0
  12. package/.github/pull_request_template.md +42 -0
  13. package/.github/release-drafter.yml +148 -0
  14. package/.github/workflows/auto-merge.yml +38 -0
  15. package/.github/workflows/ci.yml +38 -0
  16. package/.github/workflows/dependency-review.yml +17 -0
  17. package/.github/workflows/gemini-issue-triage.yml +172 -0
  18. package/.github/workflows/greetings.yml +23 -0
  19. package/.github/workflows/labeler.yml +16 -0
  20. package/.github/workflows/links.yml +80 -0
  21. package/.github/workflows/pr-size-labeler.yml +137 -0
  22. package/.github/workflows/publish-mcp.yml +12 -7
  23. package/.github/workflows/release-drafter.yml +23 -0
  24. package/.github/workflows/release.yml +112 -0
  25. package/.github/workflows/semantic-pull-request.yml +35 -0
  26. package/.github/workflows/smoke-test.yml +36 -0
  27. package/.github/workflows/stale.yml +28 -0
  28. package/CHANGELOG.md +269 -22
  29. package/CONTRIBUTING.md +140 -0
  30. package/README.md +166 -72
  31. package/claude_desktop_config_example.json +7 -6
  32. package/dist/automation/bridge.d.ts +50 -0
  33. package/dist/automation/bridge.js +452 -0
  34. package/dist/automation/connection-manager.d.ts +23 -0
  35. package/dist/automation/connection-manager.js +107 -0
  36. package/dist/automation/handshake.d.ts +11 -0
  37. package/dist/automation/handshake.js +89 -0
  38. package/dist/automation/index.d.ts +3 -0
  39. package/dist/automation/index.js +3 -0
  40. package/dist/automation/message-handler.d.ts +12 -0
  41. package/dist/automation/message-handler.js +149 -0
  42. package/dist/automation/request-tracker.d.ts +25 -0
  43. package/dist/automation/request-tracker.js +98 -0
  44. package/dist/automation/types.d.ts +130 -0
  45. package/dist/automation/types.js +2 -0
  46. package/dist/cli.js +32 -5
  47. package/dist/config.d.ts +27 -0
  48. package/dist/config.js +60 -0
  49. package/dist/constants.d.ts +12 -0
  50. package/dist/constants.js +12 -0
  51. package/dist/graphql/resolvers.d.ts +268 -0
  52. package/dist/graphql/resolvers.js +743 -0
  53. package/dist/graphql/schema.d.ts +5 -0
  54. package/dist/graphql/schema.js +437 -0
  55. package/dist/graphql/server.d.ts +26 -0
  56. package/dist/graphql/server.js +115 -0
  57. package/dist/graphql/types.d.ts +7 -0
  58. package/dist/graphql/types.js +2 -0
  59. package/dist/handlers/resource-handlers.d.ts +20 -0
  60. package/dist/handlers/resource-handlers.js +180 -0
  61. package/dist/index.d.ts +31 -18
  62. package/dist/index.js +119 -604
  63. package/dist/prompts/index.js +4 -4
  64. package/dist/resources/actors.d.ts +17 -12
  65. package/dist/resources/actors.js +56 -76
  66. package/dist/resources/assets.d.ts +6 -14
  67. package/dist/resources/assets.js +115 -147
  68. package/dist/resources/levels.d.ts +13 -13
  69. package/dist/resources/levels.js +25 -34
  70. package/dist/server/resource-registry.d.ts +20 -0
  71. package/dist/server/resource-registry.js +37 -0
  72. package/dist/server/tool-registry.d.ts +23 -0
  73. package/dist/server/tool-registry.js +322 -0
  74. package/dist/server-setup.d.ts +21 -0
  75. package/dist/server-setup.js +111 -0
  76. package/dist/services/health-monitor.d.ts +34 -0
  77. package/dist/services/health-monitor.js +105 -0
  78. package/dist/services/metrics-server.d.ts +11 -0
  79. package/dist/services/metrics-server.js +105 -0
  80. package/dist/tools/actors.d.ts +147 -9
  81. package/dist/tools/actors.js +350 -311
  82. package/dist/tools/animation.d.ts +135 -4
  83. package/dist/tools/animation.js +510 -411
  84. package/dist/tools/assets.d.ts +117 -19
  85. package/dist/tools/assets.js +259 -284
  86. package/dist/tools/audio.d.ts +102 -42
  87. package/dist/tools/audio.js +272 -685
  88. package/dist/tools/base-tool.d.ts +17 -0
  89. package/dist/tools/base-tool.js +46 -0
  90. package/dist/tools/behavior-tree.d.ts +94 -0
  91. package/dist/tools/behavior-tree.js +39 -0
  92. package/dist/tools/blueprint/helpers.d.ts +29 -0
  93. package/dist/tools/blueprint/helpers.js +182 -0
  94. package/dist/tools/blueprint.d.ts +228 -118
  95. package/dist/tools/blueprint.js +685 -832
  96. package/dist/tools/consolidated-tool-definitions.d.ts +5475 -1627
  97. package/dist/tools/consolidated-tool-definitions.js +829 -482
  98. package/dist/tools/consolidated-tool-handlers.d.ts +2 -1
  99. package/dist/tools/consolidated-tool-handlers.js +211 -1009
  100. package/dist/tools/debug.d.ts +143 -85
  101. package/dist/tools/debug.js +234 -180
  102. package/dist/tools/dynamic-handler-registry.d.ts +11 -0
  103. package/dist/tools/dynamic-handler-registry.js +101 -0
  104. package/dist/tools/editor.d.ts +139 -18
  105. package/dist/tools/editor.js +239 -244
  106. package/dist/tools/engine.d.ts +10 -4
  107. package/dist/tools/engine.js +13 -5
  108. package/dist/tools/environment.d.ts +36 -0
  109. package/dist/tools/environment.js +267 -0
  110. package/dist/tools/foliage.d.ts +105 -14
  111. package/dist/tools/foliage.js +219 -331
  112. package/dist/tools/handlers/actor-handlers.d.ts +3 -0
  113. package/dist/tools/handlers/actor-handlers.js +232 -0
  114. package/dist/tools/handlers/animation-handlers.d.ts +3 -0
  115. package/dist/tools/handlers/animation-handlers.js +185 -0
  116. package/dist/tools/handlers/argument-helper.d.ts +16 -0
  117. package/dist/tools/handlers/argument-helper.js +80 -0
  118. package/dist/tools/handlers/asset-handlers.d.ts +3 -0
  119. package/dist/tools/handlers/asset-handlers.js +496 -0
  120. package/dist/tools/handlers/audio-handlers.d.ts +3 -0
  121. package/dist/tools/handlers/audio-handlers.js +166 -0
  122. package/dist/tools/handlers/blueprint-handlers.d.ts +4 -0
  123. package/dist/tools/handlers/blueprint-handlers.js +358 -0
  124. package/dist/tools/handlers/common-handlers.d.ts +14 -0
  125. package/dist/tools/handlers/common-handlers.js +56 -0
  126. package/dist/tools/handlers/editor-handlers.d.ts +3 -0
  127. package/dist/tools/handlers/editor-handlers.js +119 -0
  128. package/dist/tools/handlers/effect-handlers.d.ts +3 -0
  129. package/dist/tools/handlers/effect-handlers.js +171 -0
  130. package/dist/tools/handlers/environment-handlers.d.ts +3 -0
  131. package/dist/tools/handlers/environment-handlers.js +170 -0
  132. package/dist/tools/handlers/graph-handlers.d.ts +3 -0
  133. package/dist/tools/handlers/graph-handlers.js +90 -0
  134. package/dist/tools/handlers/input-handlers.d.ts +3 -0
  135. package/dist/tools/handlers/input-handlers.js +21 -0
  136. package/dist/tools/handlers/inspect-handlers.d.ts +3 -0
  137. package/dist/tools/handlers/inspect-handlers.js +383 -0
  138. package/dist/tools/handlers/level-handlers.d.ts +3 -0
  139. package/dist/tools/handlers/level-handlers.js +237 -0
  140. package/dist/tools/handlers/lighting-handlers.d.ts +3 -0
  141. package/dist/tools/handlers/lighting-handlers.js +144 -0
  142. package/dist/tools/handlers/performance-handlers.d.ts +3 -0
  143. package/dist/tools/handlers/performance-handlers.js +130 -0
  144. package/dist/tools/handlers/pipeline-handlers.d.ts +3 -0
  145. package/dist/tools/handlers/pipeline-handlers.js +110 -0
  146. package/dist/tools/handlers/sequence-handlers.d.ts +3 -0
  147. package/dist/tools/handlers/sequence-handlers.js +376 -0
  148. package/dist/tools/handlers/system-handlers.d.ts +4 -0
  149. package/dist/tools/handlers/system-handlers.js +506 -0
  150. package/dist/tools/input.d.ts +19 -0
  151. package/dist/tools/input.js +89 -0
  152. package/dist/tools/introspection.d.ts +103 -40
  153. package/dist/tools/introspection.js +425 -568
  154. package/dist/tools/landscape.d.ts +97 -36
  155. package/dist/tools/landscape.js +280 -409
  156. package/dist/tools/level.d.ts +130 -10
  157. package/dist/tools/level.js +639 -675
  158. package/dist/tools/lighting.d.ts +77 -38
  159. package/dist/tools/lighting.js +441 -943
  160. package/dist/tools/logs.d.ts +45 -0
  161. package/dist/tools/logs.js +210 -0
  162. package/dist/tools/materials.d.ts +91 -24
  163. package/dist/tools/materials.js +190 -118
  164. package/dist/tools/niagara.d.ts +149 -39
  165. package/dist/tools/niagara.js +232 -182
  166. package/dist/tools/performance.d.ts +27 -12
  167. package/dist/tools/performance.js +204 -122
  168. package/dist/tools/physics.d.ts +32 -77
  169. package/dist/tools/physics.js +171 -582
  170. package/dist/tools/property-dictionary.d.ts +13 -0
  171. package/dist/tools/property-dictionary.js +82 -0
  172. package/dist/tools/sequence.d.ts +73 -48
  173. package/dist/tools/sequence.js +196 -748
  174. package/dist/tools/tool-definition-utils.d.ts +59 -0
  175. package/dist/tools/tool-definition-utils.js +35 -0
  176. package/dist/tools/ui.d.ts +66 -34
  177. package/dist/tools/ui.js +134 -214
  178. package/dist/types/env.d.ts +0 -3
  179. package/dist/types/env.js +0 -7
  180. package/dist/types/tool-interfaces.d.ts +898 -0
  181. package/dist/types/tool-interfaces.js +2 -0
  182. package/dist/types/tool-types.d.ts +195 -11
  183. package/dist/types/tool-types.js +0 -4
  184. package/dist/unreal-bridge.d.ts +24 -131
  185. package/dist/unreal-bridge.js +364 -1506
  186. package/dist/utils/command-validator.d.ts +9 -0
  187. package/dist/utils/command-validator.js +67 -0
  188. package/dist/utils/elicitation.d.ts +1 -1
  189. package/dist/utils/elicitation.js +12 -15
  190. package/dist/utils/error-handler.d.ts +2 -51
  191. package/dist/utils/error-handler.js +11 -87
  192. package/dist/utils/ini-reader.d.ts +3 -0
  193. package/dist/utils/ini-reader.js +69 -0
  194. package/dist/utils/logger.js +9 -6
  195. package/dist/utils/normalize.d.ts +3 -0
  196. package/dist/utils/normalize.js +56 -0
  197. package/dist/utils/response-factory.d.ts +7 -0
  198. package/dist/utils/response-factory.js +33 -0
  199. package/dist/utils/response-validator.d.ts +3 -24
  200. package/dist/utils/response-validator.js +130 -81
  201. package/dist/utils/result-helpers.d.ts +4 -5
  202. package/dist/utils/result-helpers.js +15 -16
  203. package/dist/utils/safe-json.js +5 -11
  204. package/dist/utils/unreal-command-queue.d.ts +24 -0
  205. package/dist/utils/unreal-command-queue.js +120 -0
  206. package/dist/utils/validation.d.ts +0 -40
  207. package/dist/utils/validation.js +1 -78
  208. package/dist/wasm/index.d.ts +70 -0
  209. package/dist/wasm/index.js +535 -0
  210. package/docs/GraphQL-API.md +888 -0
  211. package/docs/Migration-Guide-v0.5.0.md +692 -0
  212. package/docs/Roadmap.md +53 -0
  213. package/docs/WebAssembly-Integration.md +628 -0
  214. package/docs/editor-plugin-extension.md +370 -0
  215. package/docs/handler-mapping.md +242 -0
  216. package/docs/native-automation-progress.md +128 -0
  217. package/docs/testing-guide.md +423 -0
  218. package/mcp-config-example.json +6 -6
  219. package/package.json +60 -27
  220. package/plugins/McpAutomationBridge/Config/FilterPlugin.ini +8 -0
  221. package/plugins/McpAutomationBridge/McpAutomationBridge.uplugin +64 -0
  222. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/McpAutomationBridge.Build.cs +189 -0
  223. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.cpp +22 -0
  224. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.h +30 -0
  225. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeHelpers.h +1983 -0
  226. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeModule.cpp +72 -0
  227. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSettings.cpp +46 -0
  228. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSubsystem.cpp +581 -0
  229. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AnimationHandlers.cpp +2394 -0
  230. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetQueryHandlers.cpp +300 -0
  231. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetWorkflowHandlers.cpp +2807 -0
  232. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AudioHandlers.cpp +1087 -0
  233. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BehaviorTreeHandlers.cpp +488 -0
  234. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.cpp +643 -0
  235. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.h +31 -0
  236. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintGraphHandlers.cpp +1184 -0
  237. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers.cpp +5652 -0
  238. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers_List.cpp +152 -0
  239. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ControlHandlers.cpp +2614 -0
  240. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_DebugHandlers.cpp +42 -0
  241. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EditorFunctionHandlers.cpp +1237 -0
  242. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EffectHandlers.cpp +1701 -0
  243. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EnvironmentHandlers.cpp +2145 -0
  244. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_FoliageHandlers.cpp +954 -0
  245. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InputHandlers.cpp +209 -0
  246. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InsightsHandlers.cpp +41 -0
  247. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LandscapeHandlers.cpp +1164 -0
  248. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LevelHandlers.cpp +762 -0
  249. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LightingHandlers.cpp +634 -0
  250. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LogHandlers.cpp +136 -0
  251. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_MaterialGraphHandlers.cpp +494 -0
  252. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraGraphHandlers.cpp +278 -0
  253. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraHandlers.cpp +625 -0
  254. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PerformanceHandlers.cpp +401 -0
  255. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PipelineHandlers.cpp +67 -0
  256. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ProcessRequest.cpp +735 -0
  257. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PropertyHandlers.cpp +2634 -0
  258. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_RenderHandlers.cpp +189 -0
  259. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.cpp +917 -0
  260. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.h +39 -0
  261. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequenceHandlers.cpp +2670 -0
  262. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequencerHandlers.cpp +519 -0
  263. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_TestHandlers.cpp +38 -0
  264. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_UiHandlers.cpp +668 -0
  265. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_WorldPartitionHandlers.cpp +346 -0
  266. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.cpp +1330 -0
  267. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.h +149 -0
  268. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpConnectionManager.cpp +783 -0
  269. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSettings.h +115 -0
  270. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSubsystem.h +796 -0
  271. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpConnectionManager.h +117 -0
  272. package/scripts/check-unreal-connection.mjs +19 -0
  273. package/scripts/clean-tmp.js +23 -0
  274. package/scripts/patch-wasm.js +26 -0
  275. package/scripts/run-all-tests.mjs +131 -0
  276. package/scripts/smoke-test.ts +94 -0
  277. package/scripts/sync-mcp-plugin.js +143 -0
  278. package/scripts/test-no-plugin-alternates.mjs +113 -0
  279. package/scripts/validate-server.js +46 -0
  280. package/scripts/verify-automation-bridge.js +200 -0
  281. package/server.json +57 -21
  282. package/src/automation/bridge.ts +558 -0
  283. package/src/automation/connection-manager.ts +130 -0
  284. package/src/automation/handshake.ts +99 -0
  285. package/src/automation/index.ts +2 -0
  286. package/src/automation/message-handler.ts +167 -0
  287. package/src/automation/request-tracker.ts +123 -0
  288. package/src/automation/types.ts +107 -0
  289. package/src/cli.ts +33 -6
  290. package/src/config.ts +73 -0
  291. package/src/constants.ts +12 -0
  292. package/src/graphql/resolvers.ts +1010 -0
  293. package/src/graphql/schema.ts +452 -0
  294. package/src/graphql/server.ts +154 -0
  295. package/src/graphql/types.ts +7 -0
  296. package/src/handlers/resource-handlers.ts +186 -0
  297. package/src/index.ts +152 -649
  298. package/src/prompts/index.ts +4 -4
  299. package/src/resources/actors.ts +58 -76
  300. package/src/resources/assets.ts +147 -134
  301. package/src/resources/levels.ts +28 -33
  302. package/src/server/resource-registry.ts +47 -0
  303. package/src/server/tool-registry.ts +354 -0
  304. package/src/server-setup.ts +148 -0
  305. package/src/services/health-monitor.ts +132 -0
  306. package/src/services/metrics-server.ts +142 -0
  307. package/src/tools/actors.ts +417 -322
  308. package/src/tools/animation.ts +671 -461
  309. package/src/tools/assets.ts +353 -289
  310. package/src/tools/audio.ts +323 -766
  311. package/src/tools/base-tool.ts +52 -0
  312. package/src/tools/behavior-tree.ts +45 -0
  313. package/src/tools/blueprint/helpers.ts +189 -0
  314. package/src/tools/blueprint.ts +787 -965
  315. package/src/tools/consolidated-tool-definitions.ts +993 -500
  316. package/src/tools/consolidated-tool-handlers.ts +272 -1122
  317. package/src/tools/debug.ts +292 -187
  318. package/src/tools/dynamic-handler-registry.ts +151 -0
  319. package/src/tools/editor.ts +309 -246
  320. package/src/tools/engine.ts +14 -3
  321. package/src/tools/environment.ts +287 -0
  322. package/src/tools/foliage.ts +314 -379
  323. package/src/tools/handlers/actor-handlers.ts +271 -0
  324. package/src/tools/handlers/animation-handlers.ts +237 -0
  325. package/src/tools/handlers/argument-helper.ts +142 -0
  326. package/src/tools/handlers/asset-handlers.ts +532 -0
  327. package/src/tools/handlers/audio-handlers.ts +194 -0
  328. package/src/tools/handlers/blueprint-handlers.ts +380 -0
  329. package/src/tools/handlers/common-handlers.ts +87 -0
  330. package/src/tools/handlers/editor-handlers.ts +123 -0
  331. package/src/tools/handlers/effect-handlers.ts +220 -0
  332. package/src/tools/handlers/environment-handlers.ts +183 -0
  333. package/src/tools/handlers/graph-handlers.ts +116 -0
  334. package/src/tools/handlers/input-handlers.ts +28 -0
  335. package/src/tools/handlers/inspect-handlers.ts +450 -0
  336. package/src/tools/handlers/level-handlers.ts +252 -0
  337. package/src/tools/handlers/lighting-handlers.ts +147 -0
  338. package/src/tools/handlers/performance-handlers.ts +132 -0
  339. package/src/tools/handlers/pipeline-handlers.ts +127 -0
  340. package/src/tools/handlers/sequence-handlers.ts +415 -0
  341. package/src/tools/handlers/system-handlers.ts +564 -0
  342. package/src/tools/input.ts +101 -0
  343. package/src/tools/introspection.ts +493 -584
  344. package/src/tools/landscape.ts +394 -489
  345. package/src/tools/level.ts +752 -694
  346. package/src/tools/lighting.ts +583 -984
  347. package/src/tools/logs.ts +219 -0
  348. package/src/tools/materials.ts +231 -121
  349. package/src/tools/niagara.ts +293 -168
  350. package/src/tools/performance.ts +320 -168
  351. package/src/tools/physics.ts +268 -613
  352. package/src/tools/property-dictionary.ts +98 -0
  353. package/src/tools/sequence.ts +255 -815
  354. package/src/tools/tool-definition-utils.ts +35 -0
  355. package/src/tools/ui.ts +207 -283
  356. package/src/types/env.ts +0 -10
  357. package/src/types/tool-interfaces.ts +250 -0
  358. package/src/types/tool-types.ts +250 -13
  359. package/src/unreal-bridge.ts +460 -1550
  360. package/src/utils/command-validator.ts +75 -0
  361. package/src/utils/elicitation.ts +10 -7
  362. package/src/utils/error-handler.ts +14 -90
  363. package/src/utils/ini-reader.ts +86 -0
  364. package/src/utils/logger.ts +8 -3
  365. package/src/utils/normalize.ts +60 -0
  366. package/src/utils/response-factory.ts +39 -0
  367. package/src/utils/response-validator.ts +176 -56
  368. package/src/utils/result-helpers.ts +21 -19
  369. package/src/utils/safe-json.ts +14 -11
  370. package/src/utils/unreal-command-queue.ts +152 -0
  371. package/src/utils/validation.ts +4 -1
  372. package/src/wasm/index.ts +838 -0
  373. package/test-server.mjs +100 -0
  374. package/tests/run-unreal-tool-tests.mjs +242 -14
  375. package/tests/test-animation.mjs +44 -0
  376. package/tests/test-asset-advanced.mjs +82 -0
  377. package/tests/test-asset-errors.mjs +35 -0
  378. package/tests/test-audio.mjs +219 -0
  379. package/tests/test-automation-timeouts.mjs +98 -0
  380. package/tests/test-behavior-tree.mjs +261 -0
  381. package/tests/test-blueprint-events.mjs +35 -0
  382. package/tests/test-blueprint-graph.mjs +79 -0
  383. package/tests/test-blueprint.mjs +577 -0
  384. package/tests/test-client-mode.mjs +86 -0
  385. package/tests/test-console-command.mjs +56 -0
  386. package/tests/test-control-actor.mjs +425 -0
  387. package/tests/test-control-editor.mjs +80 -0
  388. package/tests/test-extra-tools.mjs +38 -0
  389. package/tests/test-graphql.mjs +322 -0
  390. package/tests/test-inspect.mjs +72 -0
  391. package/tests/test-landscape.mjs +60 -0
  392. package/tests/test-manage-asset.mjs +438 -0
  393. package/tests/test-manage-level.mjs +70 -0
  394. package/tests/test-materials.mjs +356 -0
  395. package/tests/test-niagara.mjs +185 -0
  396. package/tests/test-no-inline-python.mjs +122 -0
  397. package/tests/test-plugin-handshake.mjs +82 -0
  398. package/tests/test-render.mjs +33 -0
  399. package/tests/test-runner.mjs +933 -0
  400. package/tests/test-search-assets.mjs +66 -0
  401. package/tests/test-sequence.mjs +68 -0
  402. package/tests/test-system.mjs +57 -0
  403. package/tests/test-wasm.mjs +193 -0
  404. package/tests/test-world-partition.mjs +215 -0
  405. package/tsconfig.json +3 -3
  406. package/wasm/Cargo.lock +363 -0
  407. package/wasm/Cargo.toml +42 -0
  408. package/wasm/LICENSE +21 -0
  409. package/wasm/README.md +253 -0
  410. package/wasm/src/dependency_resolver.rs +377 -0
  411. package/wasm/src/lib.rs +153 -0
  412. package/wasm/src/property_parser.rs +271 -0
  413. package/wasm/src/transform_math.rs +396 -0
  414. package/wasm/tests/integration.rs +109 -0
  415. package/.github/workflows/smithery-build.yml +0 -29
  416. package/dist/tools/build_environment_advanced.d.ts +0 -65
  417. package/dist/tools/build_environment_advanced.js +0 -633
  418. package/dist/tools/rc.d.ts +0 -110
  419. package/dist/tools/rc.js +0 -437
  420. package/dist/tools/visual.d.ts +0 -40
  421. package/dist/tools/visual.js +0 -282
  422. package/dist/utils/http.d.ts +0 -6
  423. package/dist/utils/http.js +0 -151
  424. package/dist/utils/python-output.d.ts +0 -18
  425. package/dist/utils/python-output.js +0 -290
  426. package/dist/utils/python.d.ts +0 -2
  427. package/dist/utils/python.js +0 -4
  428. package/dist/utils/stdio-redirect.d.ts +0 -2
  429. package/dist/utils/stdio-redirect.js +0 -20
  430. package/docs/unreal-tool-test-cases.md +0 -572
  431. package/smithery.yaml +0 -29
  432. package/src/tools/build_environment_advanced.ts +0 -732
  433. package/src/tools/rc.ts +0 -515
  434. package/src/tools/visual.ts +0 -281
  435. package/src/utils/http.ts +0 -187
  436. package/src/utils/python-output.ts +0 -351
  437. package/src/utils/python.ts +0 -3
  438. package/src/utils/stdio-redirect.ts +0 -18
@@ -1,145 +1,249 @@
1
1
  import { sanitizeAssetName, validateAssetParams } from '../utils/validation.js';
2
- import { interpretStandardResult, coerceString } from '../utils/result-helpers.js';
3
2
  export class NiagaraTools {
4
3
  bridge;
5
- constructor(bridge) {
4
+ automationBridge;
5
+ constructor(bridge, automationBridge) {
6
6
  this.bridge = bridge;
7
+ this.automationBridge = automationBridge;
7
8
  }
8
- /**
9
- * Create Niagara System (real asset via Python)
10
- */
9
+ setAutomationBridge(automationBridge) { this.automationBridge = automationBridge; }
11
10
  async createSystem(params) {
12
11
  try {
12
+ if (!this.automationBridge || typeof this.automationBridge.sendAutomationRequest !== 'function') {
13
+ throw new Error('Automation Bridge not available. Niagara system creation requires plugin support.');
14
+ }
13
15
  const path = params.savePath || '/Game/Effects/Niagara';
14
- const python = `
15
- import unreal
16
- import json
17
-
18
- path = r"${path}"
19
- name = r"${params.name}"
20
- full_path = f"{path}/{name}"
21
-
22
- if unreal.EditorAssetLibrary.does_asset_exist(full_path):
23
- print('RESULT:' + json.dumps({'success': True, 'path': full_path, 'existing': True}))
24
- else:
25
- asset_tools = unreal.AssetToolsHelpers.get_asset_tools()
26
- factory = None
27
- try:
28
- factory = unreal.NiagaraSystemFactoryNew()
29
- except Exception:
30
- factory = None
31
-
32
- if factory is None:
33
- print('RESULT:' + json.dumps({'success': False, 'error': 'NiagaraSystemFactoryNew unavailable'}))
34
- else:
35
- asset = asset_tools.create_asset(asset_name=name, package_path=path, asset_class=unreal.NiagaraSystem, factory=factory)
36
- if asset:
37
- unreal.EditorAssetLibrary.save_asset(full_path)
38
- print('RESULT:' + json.dumps({'success': True, 'path': full_path}))
39
- else:
40
- print('RESULT:' + json.dumps({'success': False, 'error': 'AssetTools create_asset failed'}))
41
- `.trim();
42
- const resp = await this.bridge.executePython(python);
43
- const interpreted = interpretStandardResult(resp, {
44
- successMessage: `Niagara system ${params.name} created`,
45
- failureMessage: `Failed to create Niagara system ${params.name}`
46
- });
47
- if (!interpreted.success) {
48
- return { success: false, error: interpreted.error ?? interpreted.message };
16
+ const response = await this.automationBridge.sendAutomationRequest('create_niagara_system', { name: params.name, savePath: path, template: params.template }, { timeoutMs: 60000 });
17
+ if (response && response.success !== false) {
18
+ const result = response.result ?? {};
19
+ const systemName = result.systemName ?? params.name;
20
+ const systemPath = response.path ?? result.systemPath ?? result.path ?? `${path}/${params.name}`;
21
+ return {
22
+ success: true,
23
+ systemName,
24
+ path: systemPath,
25
+ message: response.message || result.message || `Niagara system ${systemName} created`
26
+ };
49
27
  }
50
- const pathFromPayload = coerceString(interpreted.payload.path) ?? `${path}/${params.name}`;
51
28
  return {
52
- success: true,
53
- path: pathFromPayload,
54
- message: interpreted.message
29
+ success: false,
30
+ error: response?.error ?? 'CREATE_NIAGARA_SYSTEM_FAILED',
31
+ message: response?.message ?? 'Niagara system creation failed'
55
32
  };
56
33
  }
57
- catch (err) {
58
- return { success: false, error: `Failed to create Niagara system: ${err}` };
34
+ catch (error) {
35
+ const message = error instanceof Error ? error.message : String(error);
36
+ return { success: false, error: `Failed to create Niagara system: ${message}` };
37
+ }
38
+ }
39
+ async createEmitter(params) {
40
+ if (!this.automationBridge || typeof this.automationBridge.sendAutomationRequest !== 'function') {
41
+ return { success: false, error: 'AUTOMATION_BRIDGE_UNAVAILABLE', message: 'createEmitter requires automation bridge' };
42
+ }
43
+ const requestPayload = {
44
+ name: params.name,
45
+ savePath: params.savePath ?? '/Game/Effects/Niagara'
46
+ };
47
+ if (params.systemPath)
48
+ requestPayload.systemPath = params.systemPath;
49
+ if (params.template)
50
+ requestPayload.template = params.template;
51
+ try {
52
+ const response = await this.automationBridge.sendAutomationRequest('create_niagara_emitter', requestPayload, { timeoutMs: 60000 });
53
+ if (response && response.success !== false) {
54
+ const result = response.result ?? {};
55
+ return {
56
+ success: true,
57
+ emitterPath: response.emitterPath ?? result.emitterPath ?? result.path,
58
+ emitterName: result.emitterName ?? params.name,
59
+ message: response.message || result.message || `Niagara emitter ${params.name} created`
60
+ };
61
+ }
62
+ return {
63
+ success: false,
64
+ error: response?.error ?? 'CREATE_NIAGARA_EMITTER_FAILED',
65
+ message: response?.message ?? 'Niagara emitter creation failed'
66
+ };
67
+ }
68
+ catch (error) {
69
+ const message = error instanceof Error ? error.message : String(error);
70
+ return { success: false, error: `Failed to create Niagara emitter: ${message}` };
71
+ }
72
+ }
73
+ async createRibbon(params) {
74
+ if (!this.automationBridge || typeof this.automationBridge.sendAutomationRequest !== 'function') {
75
+ return { success: false, error: 'AUTOMATION_BRIDGE_UNAVAILABLE', message: 'createRibbon requires automation bridge' };
76
+ }
77
+ const toVector = (value) => {
78
+ if (!value)
79
+ return undefined;
80
+ if (Array.isArray(value))
81
+ return [value[0] ?? 0, value[1] ?? 0, value[2] ?? 0];
82
+ return [value.x ?? 0, value.y ?? 0, value.z ?? 0];
83
+ };
84
+ const requestPayload = { systemPath: params.systemPath };
85
+ const start = toVector(params.start);
86
+ const end = toVector(params.end);
87
+ if (start)
88
+ requestPayload.start = start;
89
+ if (end)
90
+ requestPayload.end = end;
91
+ if (params.color)
92
+ requestPayload.color = params.color;
93
+ if (typeof params.width === 'number')
94
+ requestPayload.width = params.width;
95
+ try {
96
+ const response = await this.automationBridge.sendAutomationRequest('create_niagara_ribbon', requestPayload, { timeoutMs: 60000 });
97
+ if (response && response.success !== false) {
98
+ const result = response.result ?? {};
99
+ return {
100
+ success: true,
101
+ ribbonPath: response.ribbonPath ?? result.ribbonPath ?? result.path,
102
+ message: response.message || result.message || 'Niagara ribbon created'
103
+ };
104
+ }
105
+ return {
106
+ success: false,
107
+ error: response?.error ?? 'CREATE_NIAGARA_RIBBON_FAILED',
108
+ message: response?.message ?? 'Niagara ribbon creation failed'
109
+ };
110
+ }
111
+ catch (error) {
112
+ const message = error instanceof Error ? error.message : String(error);
113
+ return { success: false, error: `Failed to create Niagara ribbon: ${message}` };
114
+ }
115
+ }
116
+ async cleanupEffects(params) {
117
+ if (!this.automationBridge || typeof this.automationBridge.sendAutomationRequest !== 'function') {
118
+ return { success: false, error: 'AUTOMATION_BRIDGE_UNAVAILABLE', message: 'cleanupEffects requires automation bridge' };
119
+ }
120
+ if (!params.filter || typeof params.filter !== 'string') {
121
+ return { success: false, error: 'INVALID_ARGUMENT', message: 'filter is required' };
122
+ }
123
+ try {
124
+ const response = await this.automationBridge.sendAutomationRequest('cleanup', { filter: params.filter }, { timeoutMs: 60000 });
125
+ if (response && response.success !== false) {
126
+ const result = response.result ?? {};
127
+ const removedActors = result.removedActors ?? response.removedActors ?? [];
128
+ const removedCount = result.removed ?? removedActors.length;
129
+ return {
130
+ success: true,
131
+ removed: removedCount,
132
+ removedActors,
133
+ message: response.message || result.message || `Cleanup completed (removed=${removedCount})`
134
+ };
135
+ }
136
+ return {
137
+ success: false,
138
+ error: response?.error ?? 'CLEANUP_FAILED',
139
+ message: response?.message ?? 'Niagara cleanup failed'
140
+ };
141
+ }
142
+ catch (error) {
143
+ const message = error instanceof Error ? error.message : String(error);
144
+ return { success: false, error: `Failed to cleanup Niagara effects: ${message}` };
59
145
  }
60
146
  }
61
- /**
62
- * Add Emitter to System (left as-is; console commands may be placeholders)
63
- */
64
147
  async addEmitter(params) {
148
+ if (!this.automationBridge || typeof this.automationBridge.sendAutomationRequest !== 'function') {
149
+ return { success: false, error: 'AUTOMATION_BRIDGE_UNAVAILABLE', message: 'addEmitter requires automation bridge' };
150
+ }
65
151
  try {
66
- const commands = [
67
- `AddNiagaraEmitter ${params.systemName} ${params.emitterName} ${params.emitterType}`
68
- ];
69
- if (params.properties) {
70
- const props = params.properties;
71
- if (props.spawnRate !== undefined) {
72
- commands.push(`SetEmitterSpawnRate ${params.systemName} ${params.emitterName} ${props.spawnRate}`);
73
- }
74
- if (props.lifetime !== undefined) {
75
- commands.push(`SetEmitterLifetime ${params.systemName} ${params.emitterName} ${props.lifetime}`);
76
- }
77
- if (props.velocityMin && props.velocityMax) {
78
- const min = props.velocityMin;
79
- const max = props.velocityMax;
80
- commands.push(`SetEmitterVelocity ${params.systemName} ${params.emitterName} ${min[0]} ${min[1]} ${min[2]} ${max[0]} ${max[1]} ${max[2]}`);
81
- }
82
- if (props.size !== undefined) {
83
- commands.push(`SetEmitterSize ${params.systemName} ${params.emitterName} ${props.size}`);
84
- }
85
- if (props.color) {
86
- const color = props.color;
87
- commands.push(`SetEmitterColor ${params.systemName} ${params.emitterName} ${color[0]} ${color[1]} ${color[2]} ${color[3]}`);
88
- }
89
- if (props.material) {
90
- commands.push(`SetEmitterMaterial ${params.systemName} ${params.emitterName} ${props.material}`);
91
- }
92
- if (props.mesh && params.emitterType === 'Mesh') {
93
- commands.push(`SetEmitterMesh ${params.systemName} ${params.emitterName} ${props.mesh}`);
94
- }
152
+ const resp = await this.automationBridge.sendAutomationRequest('manage_niagara_graph', {
153
+ subAction: 'add_emitter',
154
+ systemName: params.systemName,
155
+ emitterName: params.emitterName,
156
+ emitterType: params.emitterType,
157
+ properties: params.properties
158
+ });
159
+ if (resp && resp.success !== false) {
160
+ return {
161
+ success: true,
162
+ message: resp.message || `Emitter ${params.emitterName} added to ${params.systemName}`,
163
+ emitterId: resp.result?.emitterId
164
+ };
95
165
  }
96
- await this.bridge.executeConsoleCommands(commands);
97
- return { success: true, message: `Emitter ${params.emitterName} added to ${params.systemName}` };
166
+ return {
167
+ success: false,
168
+ error: resp?.error || 'ADD_EMITTER_FAILED',
169
+ message: resp?.message || 'Failed to add emitter'
170
+ };
98
171
  }
99
- catch (err) {
100
- return { success: false, error: `Failed to add emitter: ${err}` };
172
+ catch (e) {
173
+ const message = e instanceof Error ? e.message : String(e);
174
+ return { success: false, error: 'ADD_EMITTER_FAILED', message };
101
175
  }
102
176
  }
177
+ async addModule(params) {
178
+ if (!params.systemPath)
179
+ return { success: false, error: 'INVALID_SYSTEM_PATH', message: 'System path is required' };
180
+ if (!params.modulePath)
181
+ return { success: false, error: 'INVALID_MODULE_PATH', message: 'Module path is required' };
182
+ const res = await this.automationBridge?.sendAutomationRequest('manage_niagara_graph', {
183
+ subAction: 'add_module',
184
+ assetPath: params.systemPath,
185
+ modulePath: params.modulePath,
186
+ emitterName: params.emitterName,
187
+ scriptType: params.scriptType
188
+ });
189
+ return res;
190
+ }
191
+ async connectPins(params) {
192
+ if (!params.systemPath)
193
+ return { success: false, error: 'INVALID_SYSTEM_PATH', message: 'System path is required' };
194
+ const res = await this.automationBridge?.sendAutomationRequest('manage_niagara_graph', {
195
+ subAction: 'connect_pins',
196
+ assetPath: params.systemPath,
197
+ fromNode: params.fromNodeId,
198
+ fromPin: params.fromPinName,
199
+ toNode: params.toNodeId,
200
+ toPin: params.toPinName,
201
+ emitterName: params.emitterName,
202
+ scriptType: params.scriptType
203
+ });
204
+ return res;
205
+ }
206
+ async removeNode(params) {
207
+ if (!params.systemPath)
208
+ return { success: false, error: 'INVALID_SYSTEM_PATH', message: 'System path is required' };
209
+ if (!params.nodeId)
210
+ return { success: false, error: 'INVALID_NODE_ID', message: 'Node ID is required' };
211
+ const res = await this.automationBridge?.sendAutomationRequest('manage_niagara_graph', {
212
+ subAction: 'remove_node',
213
+ assetPath: params.systemPath,
214
+ nodeId: params.nodeId,
215
+ emitterName: params.emitterName,
216
+ scriptType: params.scriptType
217
+ });
218
+ return res;
219
+ }
103
220
  async setParameter(params) {
104
221
  try {
105
- const paramType = params.isUserParameter ? 'User' : 'System';
106
- let valueStr = '';
107
- switch (params.parameterType) {
108
- case 'Float':
109
- case 'Int':
110
- case 'Bool':
111
- valueStr = String(params.value);
112
- break;
113
- case 'Vector': {
114
- const v = params.value;
115
- valueStr = `${v[0]} ${v[1]} ${v[2]}`;
116
- break;
117
- }
118
- case 'Color': {
119
- const c = params.value;
120
- valueStr = `${c[0]} ${c[1]} ${c[2]} ${c[3] || 1}`;
121
- break;
122
- }
222
+ const automationBridge = this.bridge.automationBridge;
223
+ if (!automationBridge) {
224
+ return { success: false, error: 'Automation bridge not available' };
123
225
  }
124
- const command = `SetNiagara${paramType}Parameter ${params.systemName} ${params.parameterName} ${params.parameterType} ${valueStr}`;
125
- await this.bridge.executeConsoleCommand(command);
126
- return { success: true, message: `Parameter ${params.parameterName} set on ${params.systemName}` };
226
+ const resp = await automationBridge.sendAutomationRequest('set_niagara_parameter', {
227
+ systemName: params.systemName,
228
+ parameterName: params.parameterName,
229
+ parameterType: params.parameterType,
230
+ value: params.value,
231
+ isUserParameter: params.isUserParameter === true
232
+ });
233
+ if (resp && resp.success !== false)
234
+ return { success: true, message: resp.message || `Parameter ${params.parameterName} set on ${params.systemName}`, applied: resp.applied ?? resp.result?.applied };
235
+ return { success: false, message: resp?.message ?? 'Set parameter failed', error: resp?.error ?? 'SET_PARAMETER_FAILED' };
127
236
  }
128
237
  catch (err) {
129
238
  return { success: false, error: `Failed to set parameter: ${err}` };
130
239
  }
131
240
  }
132
- /**
133
- * Create Preset Effect (now creates a real Niagara system asset)
134
- */
135
241
  async createEffect(params) {
136
242
  try {
137
- // Validate effect type at runtime (inputs can come from JSON)
138
- const allowedTypes = ['Fire', 'Smoke', 'Explosion', 'Water', 'Rain', 'Snow', 'Magic', 'Lightning', 'Dust', 'Steam'];
243
+ const allowedTypes = ['Fire', 'Smoke', 'Explosion', 'Water', 'Rain', 'Snow', 'Magic', 'Lightning', 'Dust', 'Steam', 'Default'];
139
244
  if (!params || !allowedTypes.includes(String(params.effectType))) {
140
245
  return { success: false, error: `Invalid effectType: ${String(params?.effectType)}` };
141
246
  }
142
- // Sanitize and validate name and path
143
247
  const defaultPath = '/Game/Effects/Niagara';
144
248
  const nameToUse = sanitizeAssetName(params.name);
145
249
  const validation = validateAssetParams({ name: nameToUse, savePath: defaultPath });
@@ -149,31 +253,10 @@ else:
149
253
  const safeName = validation.sanitized.name;
150
254
  const savePath = validation.sanitized.savePath || defaultPath;
151
255
  const fullPath = `${savePath}/${safeName}`;
152
- // Create or ensure the Niagara system asset exists
153
256
  const createRes = await this.createSystem({ name: safeName, savePath, template: 'Empty' });
154
257
  if (!createRes.success) {
155
258
  return { success: false, error: createRes.error || 'Failed creating Niagara system' };
156
259
  }
157
- // Verify existence via Python to avoid RC EditorAssetLibrary issues
158
- const verifyPy = `
159
- import unreal
160
- import json
161
-
162
- p = r"${fullPath}"
163
- exists = bool(unreal.EditorAssetLibrary.does_asset_exist(p))
164
- print('RESULT:' + json.dumps({'success': True, 'exists': exists}))
165
- `.trim();
166
- const verifyResp = await this.bridge.executePython(verifyPy);
167
- const verifyResult = interpretStandardResult(verifyResp, {
168
- successMessage: 'Niagara asset verification complete',
169
- failureMessage: `Failed to verify Niagara asset at ${fullPath}`
170
- });
171
- if (!verifyResult.success) {
172
- return { success: false, error: verifyResult.error ?? verifyResult.message };
173
- }
174
- if (verifyResult.payload.exists === false) {
175
- return { success: false, error: `Asset not found after creation: ${fullPath}` };
176
- }
177
260
  return { success: true, message: `${params.effectType} effect ${safeName} created`, path: fullPath };
178
261
  }
179
262
  catch (err) {
@@ -204,62 +287,29 @@ print('RESULT:' + json.dumps({'success': True, 'exists': exists}))
204
287
  return { success: false, error: `Failed to create GPU simulation: ${err}` };
205
288
  }
206
289
  }
207
- /**
208
- * Spawn Niagara Effect in Level using Python (NiagaraActor)
209
- */
210
290
  async spawnEffect(params) {
211
291
  try {
212
292
  const loc = Array.isArray(params.location) ? { x: params.location[0], y: params.location[1], z: params.location[2] } : params.location;
213
- const rot = params.rotation || [0, 0, 0];
214
- const scl = Array.isArray(params.scale) ? params.scale : (typeof params.scale === 'number' ? [params.scale, params.scale, params.scale] : [1, 1, 1]);
215
- const py = `
216
- import unreal
217
- import json
218
-
219
- loc = unreal.Vector(${loc.x || 0}, ${loc.y || 0}, ${loc.z || 0})
220
- rot = unreal.Rotator(${rot[0]}, ${rot[1]}, ${rot[2]})
221
- scale = unreal.Vector(${scl[0]}, ${scl[1]}, ${scl[2]})
222
- sys_path = r"${params.systemPath}"
223
-
224
- if unreal.EditorAssetLibrary.does_asset_exist(sys_path):
225
- sys = unreal.EditorAssetLibrary.load_asset(sys_path)
226
- actor_subsystem = unreal.get_editor_subsystem(unreal.EditorActorSubsystem)
227
- actor = actor_subsystem.spawn_actor_from_class(unreal.NiagaraActor, loc, rot)
228
- if actor:
229
- comp = actor.get_niagara_component()
230
- try:
231
- comp.set_asset(sys)
232
- except Exception:
233
- try:
234
- comp.set_editor_property('asset', sys)
235
- except Exception:
236
- pass
237
- comp.set_world_scale3d(scale)
238
- comp.activate(True)
239
- actor.set_actor_label(f"Niagara_{unreal.SystemLibrary.get_game_time_in_seconds(actor.get_world()):.0f}")
240
- print('RESULT:' + json.dumps({'success': True, 'actor': actor.get_actor_label()}))
241
- else:
242
- print('RESULT:' + json.dumps({'success': False, 'error': 'Failed to spawn NiagaraActor'}))
243
- else:
244
- print('RESULT:' + json.dumps({'success': False, 'error': 'System asset not found'}))
245
- `.trim();
246
- const resp = await this.bridge.executePython(py);
247
- const interpreted = interpretStandardResult(resp, {
248
- successMessage: 'Niagara effect spawned',
249
- failureMessage: 'Failed to spawn Niagara effect'
250
- });
251
- const actorLabel = coerceString(interpreted.payload.actor);
252
- if (!interpreted.success) {
253
- return { success: false, error: interpreted.error ?? interpreted.message };
254
- }
255
- const outcome = {
256
- success: true,
257
- message: interpreted.message
258
- };
259
- if (actorLabel) {
260
- outcome.actor = actorLabel;
293
+ if (this.automationBridge && typeof this.automationBridge.sendAutomationRequest === 'function') {
294
+ try {
295
+ const resp = await this.automationBridge.sendAutomationRequest('spawn_niagara', {
296
+ systemPath: params.systemPath,
297
+ location: [loc.x ?? 0, loc.y ?? 0, loc.z ?? 0],
298
+ rotation: params.rotation,
299
+ scale: params.scale,
300
+ autoDestroy: params.autoDestroy,
301
+ attachToActor: params.attachToActor
302
+ });
303
+ if (resp && resp.success !== false) {
304
+ return { success: true, message: resp.message || 'Niagara effect spawned', actor: resp.actor || resp.result?.actor || resp.result?.actorName };
305
+ }
306
+ return { success: false, message: resp?.message ?? 'Spawn failed', error: resp?.error ?? 'SPAWN_FAILED' };
307
+ }
308
+ catch (error) {
309
+ return { success: false, error: `Failed to spawn effect: ${error instanceof Error ? error.message : String(error)}` };
310
+ }
261
311
  }
262
- return outcome;
312
+ throw new Error('Automation Bridge not available. Niagara effect spawning requires plugin support.');
263
313
  }
264
314
  catch (err) {
265
315
  return { success: false, error: `Failed to spawn effect: ${err}` };
@@ -1,7 +1,11 @@
1
1
  import { UnrealBridge } from '../unreal-bridge.js';
2
+ import { AutomationBridge } from '../automation/index.js';
2
3
  export declare class PerformanceTools {
3
4
  private bridge;
4
- constructor(bridge: UnrealBridge);
5
+ private log;
6
+ private automationBridge?;
7
+ constructor(bridge: UnrealBridge, automationBridge?: AutomationBridge);
8
+ setAutomationBridge(automationBridge?: AutomationBridge): void;
5
9
  startProfiling(params: {
6
10
  type: 'CPU' | 'GPU' | 'Memory' | 'RenderThread' | 'GameThread' | 'All';
7
11
  duration?: number;
@@ -17,6 +21,12 @@ export declare class PerformanceTools {
17
21
  enabled: boolean;
18
22
  verbose?: boolean;
19
23
  }): Promise<{
24
+ success: boolean;
25
+ message: string;
26
+ fpsVisible: boolean;
27
+ command?: undefined;
28
+ error?: undefined;
29
+ } | {
20
30
  success: boolean;
21
31
  message: string;
22
32
  fpsVisible: boolean;
@@ -38,25 +48,19 @@ export declare class PerformanceTools {
38
48
  level: 0 | 1 | 2 | 3 | 4;
39
49
  }): Promise<{
40
50
  success: boolean;
41
- error: string;
42
- message?: undefined;
43
- verified?: undefined;
44
- readback?: undefined;
51
+ message: string;
52
+ error?: undefined;
45
53
  method?: undefined;
46
54
  } | {
47
55
  success: boolean;
48
- message: string;
49
- verified: boolean;
50
- readback: number;
51
- method: string;
52
- error?: undefined;
56
+ error: string;
57
+ message?: undefined;
58
+ method?: undefined;
53
59
  } | {
54
60
  success: boolean;
55
61
  message: string;
56
62
  method: string;
57
63
  error?: undefined;
58
- verified?: undefined;
59
- readback?: undefined;
60
64
  }>;
61
65
  setResolutionScale(params: {
62
66
  scale: number;
@@ -86,6 +90,11 @@ export declare class PerformanceTools {
86
90
  }): Promise<{
87
91
  success: boolean;
88
92
  message: string;
93
+ error?: undefined;
94
+ } | {
95
+ success: boolean;
96
+ error: string;
97
+ message?: undefined;
89
98
  }>;
90
99
  configureTextureStreaming(params: {
91
100
  enabled: boolean;
@@ -124,9 +133,15 @@ export declare class PerformanceTools {
124
133
  enableInstancing?: boolean;
125
134
  enableBatching?: boolean;
126
135
  mergeActors?: boolean;
136
+ actors?: string[];
127
137
  }): Promise<{
138
+ success: boolean;
139
+ error: string;
140
+ message?: undefined;
141
+ } | {
128
142
  success: boolean;
129
143
  message: string;
144
+ error?: undefined;
130
145
  }>;
131
146
  configureOcclusionCulling(params: {
132
147
  enabled: boolean;