unreal-engine-mcp-server 0.4.7 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (454) hide show
  1. package/.env.example +26 -0
  2. package/.env.production +38 -7
  3. package/.eslintrc.json +0 -54
  4. package/.eslintrc.override.json +8 -0
  5. package/.github/ISSUE_TEMPLATE/bug_report.yml +94 -0
  6. package/.github/ISSUE_TEMPLATE/config.yml +8 -0
  7. package/.github/ISSUE_TEMPLATE/feature_request.yml +56 -0
  8. package/.github/copilot-instructions.md +478 -45
  9. package/.github/dependabot.yml +19 -0
  10. package/.github/labeler.yml +24 -0
  11. package/.github/labels.yml +70 -0
  12. package/.github/pull_request_template.md +42 -0
  13. package/.github/release-drafter-config.yml +51 -0
  14. package/.github/workflows/auto-merge.yml +38 -0
  15. package/.github/workflows/ci.yml +38 -0
  16. package/.github/workflows/dependency-review.yml +17 -0
  17. package/.github/workflows/gemini-issue-triage.yml +172 -0
  18. package/.github/workflows/greetings.yml +27 -0
  19. package/.github/workflows/labeler.yml +17 -0
  20. package/.github/workflows/links.yml +80 -0
  21. package/.github/workflows/pr-size-labeler.yml +137 -0
  22. package/.github/workflows/publish-mcp.yml +13 -7
  23. package/.github/workflows/release-drafter.yml +23 -0
  24. package/.github/workflows/release.yml +112 -0
  25. package/.github/workflows/semantic-pull-request.yml +35 -0
  26. package/.github/workflows/smoke-test.yml +36 -0
  27. package/.github/workflows/stale.yml +28 -0
  28. package/CHANGELOG.md +338 -31
  29. package/CONTRIBUTING.md +140 -0
  30. package/GEMINI.md +115 -0
  31. package/Public/Plugin_setup_guide.mp4 +0 -0
  32. package/README.md +189 -128
  33. package/claude_desktop_config_example.json +7 -6
  34. package/dist/automation/bridge.d.ts +50 -0
  35. package/dist/automation/bridge.js +452 -0
  36. package/dist/automation/connection-manager.d.ts +23 -0
  37. package/dist/automation/connection-manager.js +107 -0
  38. package/dist/automation/handshake.d.ts +11 -0
  39. package/dist/automation/handshake.js +89 -0
  40. package/dist/automation/index.d.ts +3 -0
  41. package/dist/automation/index.js +3 -0
  42. package/dist/automation/message-handler.d.ts +12 -0
  43. package/dist/automation/message-handler.js +149 -0
  44. package/dist/automation/request-tracker.d.ts +25 -0
  45. package/dist/automation/request-tracker.js +98 -0
  46. package/dist/automation/types.d.ts +130 -0
  47. package/dist/automation/types.js +2 -0
  48. package/dist/cli.js +32 -5
  49. package/dist/config.d.ts +26 -0
  50. package/dist/config.js +59 -0
  51. package/dist/constants.d.ts +16 -0
  52. package/dist/constants.js +16 -0
  53. package/dist/graphql/loaders.d.ts +64 -0
  54. package/dist/graphql/loaders.js +117 -0
  55. package/dist/graphql/resolvers.d.ts +268 -0
  56. package/dist/graphql/resolvers.js +746 -0
  57. package/dist/graphql/schema.d.ts +5 -0
  58. package/dist/graphql/schema.js +437 -0
  59. package/dist/graphql/server.d.ts +26 -0
  60. package/dist/graphql/server.js +117 -0
  61. package/dist/graphql/types.d.ts +9 -0
  62. package/dist/graphql/types.js +2 -0
  63. package/dist/handlers/resource-handlers.d.ts +20 -0
  64. package/dist/handlers/resource-handlers.js +180 -0
  65. package/dist/index.d.ts +33 -18
  66. package/dist/index.js +130 -619
  67. package/dist/resources/actors.d.ts +17 -12
  68. package/dist/resources/actors.js +56 -76
  69. package/dist/resources/assets.d.ts +6 -14
  70. package/dist/resources/assets.js +115 -147
  71. package/dist/resources/levels.d.ts +13 -13
  72. package/dist/resources/levels.js +25 -34
  73. package/dist/server/resource-registry.d.ts +20 -0
  74. package/dist/server/resource-registry.js +37 -0
  75. package/dist/server/tool-registry.d.ts +23 -0
  76. package/dist/server/tool-registry.js +322 -0
  77. package/dist/server-setup.d.ts +20 -0
  78. package/dist/server-setup.js +71 -0
  79. package/dist/services/health-monitor.d.ts +34 -0
  80. package/dist/services/health-monitor.js +105 -0
  81. package/dist/services/metrics-server.d.ts +11 -0
  82. package/dist/services/metrics-server.js +105 -0
  83. package/dist/tools/actors.d.ts +163 -9
  84. package/dist/tools/actors.js +356 -311
  85. package/dist/tools/animation.d.ts +135 -4
  86. package/dist/tools/animation.js +510 -411
  87. package/dist/tools/assets.d.ts +75 -29
  88. package/dist/tools/assets.js +265 -284
  89. package/dist/tools/audio.d.ts +102 -42
  90. package/dist/tools/audio.js +272 -685
  91. package/dist/tools/base-tool.d.ts +17 -0
  92. package/dist/tools/base-tool.js +46 -0
  93. package/dist/tools/behavior-tree.d.ts +94 -0
  94. package/dist/tools/behavior-tree.js +39 -0
  95. package/dist/tools/blueprint.d.ts +208 -126
  96. package/dist/tools/blueprint.js +685 -832
  97. package/dist/tools/consolidated-tool-definitions.d.ts +5462 -1781
  98. package/dist/tools/consolidated-tool-definitions.js +829 -496
  99. package/dist/tools/consolidated-tool-handlers.d.ts +2 -1
  100. package/dist/tools/consolidated-tool-handlers.js +198 -1027
  101. package/dist/tools/debug.d.ts +143 -85
  102. package/dist/tools/debug.js +234 -180
  103. package/dist/tools/dynamic-handler-registry.d.ts +13 -0
  104. package/dist/tools/dynamic-handler-registry.js +23 -0
  105. package/dist/tools/editor.d.ts +30 -83
  106. package/dist/tools/editor.js +247 -244
  107. package/dist/tools/engine.d.ts +10 -4
  108. package/dist/tools/engine.js +13 -5
  109. package/dist/tools/environment.d.ts +30 -0
  110. package/dist/tools/environment.js +267 -0
  111. package/dist/tools/foliage.d.ts +65 -99
  112. package/dist/tools/foliage.js +221 -331
  113. package/dist/tools/handlers/actor-handlers.d.ts +3 -0
  114. package/dist/tools/handlers/actor-handlers.js +227 -0
  115. package/dist/tools/handlers/animation-handlers.d.ts +3 -0
  116. package/dist/tools/handlers/animation-handlers.js +185 -0
  117. package/dist/tools/handlers/argument-helper.d.ts +16 -0
  118. package/dist/tools/handlers/argument-helper.js +80 -0
  119. package/dist/tools/handlers/asset-handlers.d.ts +3 -0
  120. package/dist/tools/handlers/asset-handlers.js +496 -0
  121. package/dist/tools/handlers/audio-handlers.d.ts +3 -0
  122. package/dist/tools/handlers/audio-handlers.js +166 -0
  123. package/dist/tools/handlers/blueprint-handlers.d.ts +4 -0
  124. package/dist/tools/handlers/blueprint-handlers.js +358 -0
  125. package/dist/tools/handlers/common-handlers.d.ts +14 -0
  126. package/dist/tools/handlers/common-handlers.js +56 -0
  127. package/dist/tools/handlers/editor-handlers.d.ts +3 -0
  128. package/dist/tools/handlers/editor-handlers.js +119 -0
  129. package/dist/tools/handlers/effect-handlers.d.ts +3 -0
  130. package/dist/tools/handlers/effect-handlers.js +171 -0
  131. package/dist/tools/handlers/environment-handlers.d.ts +3 -0
  132. package/dist/tools/handlers/environment-handlers.js +170 -0
  133. package/dist/tools/handlers/graph-handlers.d.ts +3 -0
  134. package/dist/tools/handlers/graph-handlers.js +90 -0
  135. package/dist/tools/handlers/input-handlers.d.ts +3 -0
  136. package/dist/tools/handlers/input-handlers.js +21 -0
  137. package/dist/tools/handlers/inspect-handlers.d.ts +3 -0
  138. package/dist/tools/handlers/inspect-handlers.js +383 -0
  139. package/dist/tools/handlers/level-handlers.d.ts +3 -0
  140. package/dist/tools/handlers/level-handlers.js +237 -0
  141. package/dist/tools/handlers/lighting-handlers.d.ts +3 -0
  142. package/dist/tools/handlers/lighting-handlers.js +144 -0
  143. package/dist/tools/handlers/performance-handlers.d.ts +3 -0
  144. package/dist/tools/handlers/performance-handlers.js +130 -0
  145. package/dist/tools/handlers/pipeline-handlers.d.ts +3 -0
  146. package/dist/tools/handlers/pipeline-handlers.js +110 -0
  147. package/dist/tools/handlers/sequence-handlers.d.ts +3 -0
  148. package/dist/tools/handlers/sequence-handlers.js +376 -0
  149. package/dist/tools/handlers/system-handlers.d.ts +4 -0
  150. package/dist/tools/handlers/system-handlers.js +506 -0
  151. package/dist/tools/input.d.ts +19 -0
  152. package/dist/tools/input.js +89 -0
  153. package/dist/tools/introspection.d.ts +103 -40
  154. package/dist/tools/introspection.js +425 -568
  155. package/dist/tools/landscape.d.ts +54 -93
  156. package/dist/tools/landscape.js +284 -409
  157. package/dist/tools/level.d.ts +66 -27
  158. package/dist/tools/level.js +647 -675
  159. package/dist/tools/lighting.d.ts +77 -38
  160. package/dist/tools/lighting.js +445 -943
  161. package/dist/tools/logs.d.ts +3 -3
  162. package/dist/tools/logs.js +5 -57
  163. package/dist/tools/materials.d.ts +91 -24
  164. package/dist/tools/materials.js +194 -118
  165. package/dist/tools/niagara.d.ts +149 -39
  166. package/dist/tools/niagara.js +267 -182
  167. package/dist/tools/performance.d.ts +27 -13
  168. package/dist/tools/performance.js +203 -122
  169. package/dist/tools/physics.d.ts +32 -77
  170. package/dist/tools/physics.js +175 -582
  171. package/dist/tools/property-dictionary.d.ts +13 -0
  172. package/dist/tools/property-dictionary.js +82 -0
  173. package/dist/tools/sequence.d.ts +85 -60
  174. package/dist/tools/sequence.js +208 -747
  175. package/dist/tools/tool-definition-utils.d.ts +59 -0
  176. package/dist/tools/tool-definition-utils.js +35 -0
  177. package/dist/tools/ui.d.ts +64 -34
  178. package/dist/tools/ui.js +134 -214
  179. package/dist/types/automation-responses.d.ts +115 -0
  180. package/dist/types/automation-responses.js +2 -0
  181. package/dist/types/env.d.ts +0 -3
  182. package/dist/types/env.js +0 -7
  183. package/dist/types/responses.d.ts +249 -0
  184. package/dist/types/responses.js +2 -0
  185. package/dist/types/tool-interfaces.d.ts +898 -0
  186. package/dist/types/tool-interfaces.js +2 -0
  187. package/dist/types/tool-types.d.ts +183 -19
  188. package/dist/types/tool-types.js +0 -4
  189. package/dist/unreal-bridge.d.ts +24 -131
  190. package/dist/unreal-bridge.js +364 -1506
  191. package/dist/utils/command-validator.d.ts +9 -0
  192. package/dist/utils/command-validator.js +68 -0
  193. package/dist/utils/elicitation.d.ts +1 -1
  194. package/dist/utils/elicitation.js +12 -15
  195. package/dist/utils/error-handler.d.ts +2 -51
  196. package/dist/utils/error-handler.js +11 -87
  197. package/dist/utils/ini-reader.d.ts +3 -0
  198. package/dist/utils/ini-reader.js +69 -0
  199. package/dist/utils/logger.js +9 -6
  200. package/dist/utils/normalize.d.ts +3 -0
  201. package/dist/utils/normalize.js +56 -0
  202. package/dist/utils/path-security.d.ts +2 -0
  203. package/dist/utils/path-security.js +24 -0
  204. package/dist/utils/response-factory.d.ts +7 -0
  205. package/dist/utils/response-factory.js +27 -0
  206. package/dist/utils/response-validator.d.ts +3 -24
  207. package/dist/utils/response-validator.js +130 -81
  208. package/dist/utils/result-helpers.d.ts +4 -5
  209. package/dist/utils/result-helpers.js +15 -16
  210. package/dist/utils/safe-json.js +5 -11
  211. package/dist/utils/unreal-command-queue.d.ts +24 -0
  212. package/dist/utils/unreal-command-queue.js +120 -0
  213. package/dist/utils/validation.d.ts +0 -40
  214. package/dist/utils/validation.js +1 -78
  215. package/dist/wasm/index.d.ts +70 -0
  216. package/dist/wasm/index.js +535 -0
  217. package/docs/GraphQL-API.md +888 -0
  218. package/docs/Migration-Guide-v0.5.0.md +684 -0
  219. package/docs/Roadmap.md +53 -0
  220. package/docs/WebAssembly-Integration.md +628 -0
  221. package/docs/editor-plugin-extension.md +370 -0
  222. package/docs/handler-mapping.md +242 -0
  223. package/docs/native-automation-progress.md +128 -0
  224. package/docs/testing-guide.md +423 -0
  225. package/mcp-config-example.json +6 -6
  226. package/package.json +67 -28
  227. package/plugins/McpAutomationBridge/Config/FilterPlugin.ini +8 -0
  228. package/plugins/McpAutomationBridge/McpAutomationBridge.uplugin +64 -0
  229. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/McpAutomationBridge.Build.cs +189 -0
  230. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.cpp +22 -0
  231. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.h +30 -0
  232. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeHelpers.h +1983 -0
  233. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeModule.cpp +72 -0
  234. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSettings.cpp +46 -0
  235. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSubsystem.cpp +581 -0
  236. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AnimationHandlers.cpp +2394 -0
  237. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetQueryHandlers.cpp +300 -0
  238. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetWorkflowHandlers.cpp +2807 -0
  239. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AudioHandlers.cpp +1087 -0
  240. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BehaviorTreeHandlers.cpp +488 -0
  241. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.cpp +643 -0
  242. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.h +31 -0
  243. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintGraphHandlers.cpp +1184 -0
  244. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers.cpp +5652 -0
  245. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers_List.cpp +152 -0
  246. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ControlHandlers.cpp +2614 -0
  247. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_DebugHandlers.cpp +42 -0
  248. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EditorFunctionHandlers.cpp +1237 -0
  249. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EffectHandlers.cpp +1701 -0
  250. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EnvironmentHandlers.cpp +2145 -0
  251. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_FoliageHandlers.cpp +954 -0
  252. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InputHandlers.cpp +209 -0
  253. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InsightsHandlers.cpp +41 -0
  254. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LandscapeHandlers.cpp +1164 -0
  255. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LevelHandlers.cpp +762 -0
  256. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LightingHandlers.cpp +634 -0
  257. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LogHandlers.cpp +136 -0
  258. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_MaterialGraphHandlers.cpp +494 -0
  259. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraGraphHandlers.cpp +278 -0
  260. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraHandlers.cpp +625 -0
  261. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PerformanceHandlers.cpp +401 -0
  262. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PipelineHandlers.cpp +67 -0
  263. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ProcessRequest.cpp +735 -0
  264. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PropertyHandlers.cpp +2634 -0
  265. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_RenderHandlers.cpp +189 -0
  266. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.cpp +917 -0
  267. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.h +39 -0
  268. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequenceHandlers.cpp +2670 -0
  269. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequencerHandlers.cpp +519 -0
  270. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_TestHandlers.cpp +38 -0
  271. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_UiHandlers.cpp +668 -0
  272. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_WorldPartitionHandlers.cpp +346 -0
  273. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.cpp +1330 -0
  274. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.h +149 -0
  275. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpConnectionManager.cpp +783 -0
  276. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSettings.h +115 -0
  277. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSubsystem.h +796 -0
  278. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpConnectionManager.h +117 -0
  279. package/scripts/check-unreal-connection.mjs +19 -0
  280. package/scripts/clean-tmp.js +23 -0
  281. package/scripts/patch-wasm.js +26 -0
  282. package/scripts/run-all-tests.mjs +136 -0
  283. package/scripts/smoke-test.ts +94 -0
  284. package/scripts/sync-mcp-plugin.js +143 -0
  285. package/scripts/test-no-plugin-alternates.mjs +113 -0
  286. package/scripts/validate-server.js +46 -0
  287. package/scripts/verify-automation-bridge.js +200 -0
  288. package/server.json +58 -21
  289. package/src/automation/bridge.ts +558 -0
  290. package/src/automation/connection-manager.ts +130 -0
  291. package/src/automation/handshake.ts +99 -0
  292. package/src/automation/index.ts +2 -0
  293. package/src/automation/message-handler.ts +167 -0
  294. package/src/automation/request-tracker.ts +123 -0
  295. package/src/automation/types.ts +107 -0
  296. package/src/cli.ts +33 -6
  297. package/src/config.ts +73 -0
  298. package/src/constants.ts +19 -0
  299. package/src/graphql/loaders.ts +244 -0
  300. package/src/graphql/resolvers.ts +1008 -0
  301. package/src/graphql/schema.ts +452 -0
  302. package/src/graphql/server.ts +156 -0
  303. package/src/graphql/types.ts +10 -0
  304. package/src/handlers/resource-handlers.ts +186 -0
  305. package/src/index.ts +166 -664
  306. package/src/resources/actors.ts +58 -76
  307. package/src/resources/assets.ts +148 -134
  308. package/src/resources/levels.ts +28 -33
  309. package/src/server/resource-registry.ts +47 -0
  310. package/src/server/tool-registry.ts +354 -0
  311. package/src/server-setup.ts +114 -0
  312. package/src/services/health-monitor.ts +132 -0
  313. package/src/services/metrics-server.ts +142 -0
  314. package/src/tools/actors.ts +426 -323
  315. package/src/tools/animation.ts +672 -461
  316. package/src/tools/assets.ts +364 -289
  317. package/src/tools/audio.ts +323 -766
  318. package/src/tools/base-tool.ts +52 -0
  319. package/src/tools/behavior-tree.ts +45 -0
  320. package/src/tools/blueprint.ts +792 -970
  321. package/src/tools/consolidated-tool-definitions.ts +993 -515
  322. package/src/tools/consolidated-tool-handlers.ts +258 -1146
  323. package/src/tools/debug.ts +292 -187
  324. package/src/tools/dynamic-handler-registry.ts +33 -0
  325. package/src/tools/editor.ts +329 -253
  326. package/src/tools/engine.ts +14 -3
  327. package/src/tools/environment.ts +281 -0
  328. package/src/tools/foliage.ts +330 -392
  329. package/src/tools/handlers/actor-handlers.ts +265 -0
  330. package/src/tools/handlers/animation-handlers.ts +237 -0
  331. package/src/tools/handlers/argument-helper.ts +142 -0
  332. package/src/tools/handlers/asset-handlers.ts +532 -0
  333. package/src/tools/handlers/audio-handlers.ts +194 -0
  334. package/src/tools/handlers/blueprint-handlers.ts +380 -0
  335. package/src/tools/handlers/common-handlers.ts +87 -0
  336. package/src/tools/handlers/editor-handlers.ts +123 -0
  337. package/src/tools/handlers/effect-handlers.ts +220 -0
  338. package/src/tools/handlers/environment-handlers.ts +183 -0
  339. package/src/tools/handlers/graph-handlers.ts +116 -0
  340. package/src/tools/handlers/input-handlers.ts +28 -0
  341. package/src/tools/handlers/inspect-handlers.ts +450 -0
  342. package/src/tools/handlers/level-handlers.ts +252 -0
  343. package/src/tools/handlers/lighting-handlers.ts +147 -0
  344. package/src/tools/handlers/performance-handlers.ts +132 -0
  345. package/src/tools/handlers/pipeline-handlers.ts +127 -0
  346. package/src/tools/handlers/sequence-handlers.ts +415 -0
  347. package/src/tools/handlers/system-handlers.ts +564 -0
  348. package/src/tools/input.ts +101 -0
  349. package/src/tools/introspection.ts +493 -584
  350. package/src/tools/landscape.ts +418 -507
  351. package/src/tools/level.ts +786 -708
  352. package/src/tools/lighting.ts +588 -984
  353. package/src/tools/logs.ts +9 -57
  354. package/src/tools/materials.ts +237 -121
  355. package/src/tools/niagara.ts +335 -168
  356. package/src/tools/performance.ts +320 -169
  357. package/src/tools/physics.ts +274 -613
  358. package/src/tools/property-dictionary.ts +98 -0
  359. package/src/tools/sequence.ts +276 -820
  360. package/src/tools/tool-definition-utils.ts +35 -0
  361. package/src/tools/ui.ts +205 -283
  362. package/src/types/automation-responses.ts +119 -0
  363. package/src/types/env.ts +0 -10
  364. package/src/types/responses.ts +355 -0
  365. package/src/types/tool-interfaces.ts +250 -0
  366. package/src/types/tool-types.ts +243 -21
  367. package/src/unreal-bridge.ts +460 -1550
  368. package/src/utils/command-validator.ts +76 -0
  369. package/src/utils/elicitation.ts +10 -7
  370. package/src/utils/error-handler.ts +14 -90
  371. package/src/utils/ini-reader.ts +86 -0
  372. package/src/utils/logger.ts +8 -3
  373. package/src/utils/normalize.test.ts +162 -0
  374. package/src/utils/normalize.ts +60 -0
  375. package/src/utils/path-security.ts +43 -0
  376. package/src/utils/response-factory.ts +44 -0
  377. package/src/utils/response-validator.ts +176 -56
  378. package/src/utils/result-helpers.ts +21 -19
  379. package/src/utils/safe-json.test.ts +90 -0
  380. package/src/utils/safe-json.ts +14 -11
  381. package/src/utils/unreal-command-queue.ts +152 -0
  382. package/src/utils/validation.test.ts +184 -0
  383. package/src/utils/validation.ts +4 -1
  384. package/src/wasm/index.ts +838 -0
  385. package/test-server.mjs +100 -0
  386. package/tests/run-unreal-tool-tests.mjs +242 -14
  387. package/tests/test-animation.mjs +369 -0
  388. package/tests/test-asset-advanced.mjs +82 -0
  389. package/tests/test-asset-errors.mjs +35 -0
  390. package/tests/test-asset-graph.mjs +311 -0
  391. package/tests/test-audio.mjs +417 -0
  392. package/tests/test-automation-timeouts.mjs +98 -0
  393. package/tests/test-behavior-tree.mjs +444 -0
  394. package/tests/test-blueprint-graph.mjs +410 -0
  395. package/tests/test-blueprint.mjs +577 -0
  396. package/tests/test-client-mode.mjs +86 -0
  397. package/tests/test-console-command.mjs +56 -0
  398. package/tests/test-control-actor.mjs +425 -0
  399. package/tests/test-control-editor.mjs +112 -0
  400. package/tests/test-graphql.mjs +372 -0
  401. package/tests/test-input.mjs +349 -0
  402. package/tests/test-inspect.mjs +302 -0
  403. package/tests/test-landscape.mjs +316 -0
  404. package/tests/test-lighting.mjs +428 -0
  405. package/tests/test-manage-asset.mjs +438 -0
  406. package/tests/test-manage-level.mjs +89 -0
  407. package/tests/test-materials.mjs +356 -0
  408. package/tests/test-niagara.mjs +185 -0
  409. package/tests/test-no-inline-python.mjs +122 -0
  410. package/tests/test-performance.mjs +539 -0
  411. package/tests/test-plugin-handshake.mjs +82 -0
  412. package/tests/test-runner.mjs +933 -0
  413. package/tests/test-sequence.mjs +104 -0
  414. package/tests/test-system.mjs +96 -0
  415. package/tests/test-wasm.mjs +283 -0
  416. package/tests/test-world-partition.mjs +215 -0
  417. package/tsconfig.json +3 -3
  418. package/vitest.config.ts +35 -0
  419. package/wasm/Cargo.lock +363 -0
  420. package/wasm/Cargo.toml +42 -0
  421. package/wasm/LICENSE +21 -0
  422. package/wasm/README.md +253 -0
  423. package/wasm/src/dependency_resolver.rs +377 -0
  424. package/wasm/src/lib.rs +153 -0
  425. package/wasm/src/property_parser.rs +271 -0
  426. package/wasm/src/transform_math.rs +396 -0
  427. package/wasm/tests/integration.rs +109 -0
  428. package/.github/workflows/smithery-build.yml +0 -29
  429. package/dist/prompts/index.d.ts +0 -21
  430. package/dist/prompts/index.js +0 -217
  431. package/dist/tools/build_environment_advanced.d.ts +0 -65
  432. package/dist/tools/build_environment_advanced.js +0 -633
  433. package/dist/tools/rc.d.ts +0 -110
  434. package/dist/tools/rc.js +0 -437
  435. package/dist/tools/visual.d.ts +0 -40
  436. package/dist/tools/visual.js +0 -282
  437. package/dist/utils/http.d.ts +0 -6
  438. package/dist/utils/http.js +0 -151
  439. package/dist/utils/python-output.d.ts +0 -18
  440. package/dist/utils/python-output.js +0 -290
  441. package/dist/utils/python.d.ts +0 -2
  442. package/dist/utils/python.js +0 -4
  443. package/dist/utils/stdio-redirect.d.ts +0 -2
  444. package/dist/utils/stdio-redirect.js +0 -20
  445. package/docs/unreal-tool-test-cases.md +0 -574
  446. package/smithery.yaml +0 -29
  447. package/src/prompts/index.ts +0 -249
  448. package/src/tools/build_environment_advanced.ts +0 -732
  449. package/src/tools/rc.ts +0 -515
  450. package/src/tools/visual.ts +0 -281
  451. package/src/utils/http.ts +0 -187
  452. package/src/utils/python-output.ts +0 -351
  453. package/src/utils/python.ts +0 -3
  454. package/src/utils/stdio-redirect.ts +0 -18
package/dist/tools/ui.js CHANGED
@@ -1,228 +1,167 @@
1
1
  import { bestEffortInterpretedText, interpretStandardResult } from '../utils/result-helpers.js';
2
2
  export class UITools {
3
3
  bridge;
4
- constructor(bridge) {
4
+ automationBridge;
5
+ constructor(bridge, automationBridge) {
5
6
  this.bridge = bridge;
7
+ this.automationBridge = automationBridge;
8
+ }
9
+ setAutomationBridge(automationBridge) {
10
+ this.automationBridge = automationBridge;
6
11
  }
7
- // Create widget blueprint
8
12
  async createWidget(params) {
9
13
  const path = params.savePath || '/Game/UI/Widgets';
10
- const py = `
11
- import unreal
12
- import json
13
- name = r"${params.name}"
14
- path = r"${path}"
15
- try:
16
- asset_tools = unreal.AssetToolsHelpers.get_asset_tools()
17
- try:
18
- factory = unreal.WidgetBlueprintFactory()
19
- except Exception:
20
- factory = None
21
- if not factory:
22
- print('RESULT:' + json.dumps({'success': False, 'error': 'WidgetBlueprintFactory unavailable'}))
23
- else:
24
- # Try setting parent_class in a version-tolerant way
25
- try:
26
- factory.parent_class = unreal.UserWidget
27
- except Exception:
28
- try:
29
- factory.set_editor_property('parent_class', unreal.UserWidget)
30
- except Exception:
31
- pass
32
- asset = asset_tools.create_asset(asset_name=name, package_path=path, asset_class=unreal.WidgetBlueprint, factory=factory)
33
- if asset:
34
- unreal.EditorAssetLibrary.save_asset(f"{path}/{name}")
35
- print('RESULT:' + json.dumps({'success': True}))
36
- else:
37
- print('RESULT:' + json.dumps({'success': False, 'error': 'Failed to create WidgetBlueprint'}))
38
- except Exception as e:
39
- print('RESULT:' + json.dumps({'success': False, 'error': str(e)}))
40
- `.trim();
41
- try {
42
- const resp = await this.bridge.executePython(py);
43
- const interpreted = interpretStandardResult(resp, {
44
- successMessage: 'Widget blueprint created',
45
- failureMessage: 'Failed to create WidgetBlueprint'
46
- });
47
- if (interpreted.success) {
48
- return { success: true, message: interpreted.message };
14
+ if (this.automationBridge && typeof this.automationBridge.sendAutomationRequest === 'function') {
15
+ try {
16
+ const resp = await this.automationBridge.sendAutomationRequest('system_control', {
17
+ action: 'create_widget',
18
+ name: params.name,
19
+ widgetType: params.type,
20
+ savePath: path
21
+ });
22
+ if (resp && resp.success !== false) {
23
+ const result = resp.result ?? resp;
24
+ const resultObj = result && typeof result === 'object' ? result : undefined;
25
+ const widgetPath = typeof resultObj?.widgetPath === 'string' ? resultObj.widgetPath : `${path}/${params.name}`;
26
+ const message = resp.message || `Widget created at ${widgetPath}`;
27
+ return {
28
+ success: true,
29
+ message,
30
+ widgetPath,
31
+ exists: Boolean(resultObj?.exists),
32
+ ...(resultObj || {})
33
+ };
34
+ }
49
35
  }
50
- return {
51
- success: false,
52
- error: interpreted.error ?? 'Failed to create widget blueprint',
53
- details: bestEffortInterpretedText(interpreted)
36
+ catch (error) {
37
+ console.warn('UITools.createWidget automation bridge request failed, falling back to editor function:', error);
38
+ }
39
+ }
40
+ try {
41
+ const payload = {
42
+ asset_name: params.name,
43
+ package_path: path,
44
+ factory_class: 'WidgetBlueprintFactory',
45
+ asset_class: 'unreal.WidgetBlueprint'
54
46
  };
47
+ const resp = await this.bridge.executeEditorFunction('CREATE_ASSET', payload);
48
+ const result = resp && typeof resp === 'object' ? (resp.result ?? resp) : resp;
49
+ if (result && (result.success === true || result.created === true || Boolean(result.path))) {
50
+ return { success: true, message: result.message ?? `Widget created at ${result.path ?? `${path}/${params.name}`}` };
51
+ }
52
+ if (result && result.success === false) {
53
+ return { success: false, error: result.error ?? result.message ?? 'Failed to create widget blueprint', details: result };
54
+ }
55
+ return { success: false, error: 'Failed to create widget blueprint' };
55
56
  }
56
57
  catch (e) {
57
58
  return { success: false, error: `Failed to create widget blueprint: ${e}` };
58
59
  }
59
60
  }
60
- // Add widget component
61
- async addWidgetComponent(params) {
62
- const commands = [];
63
- commands.push(`AddWidgetComponent ${params.widgetName} ${params.componentType} ${params.componentName}`);
64
- if (params.slot) {
65
- if (params.slot.position) {
66
- commands.push(`SetWidgetPosition ${params.widgetName}.${params.componentName} ${params.slot.position.join(' ')}`);
67
- }
68
- if (params.slot.size) {
69
- commands.push(`SetWidgetSize ${params.widgetName}.${params.componentName} ${params.slot.size.join(' ')}`);
70
- }
71
- if (params.slot.anchor) {
72
- commands.push(`SetWidgetAnchor ${params.widgetName}.${params.componentName} ${params.slot.anchor.join(' ')}`);
73
- }
74
- if (params.slot.alignment) {
75
- commands.push(`SetWidgetAlignment ${params.widgetName}.${params.componentName} ${params.slot.alignment.join(' ')}`);
76
- }
77
- }
78
- await this.bridge.executeConsoleCommands(commands);
79
- return { success: true, message: `Component ${params.componentName} added to widget` };
61
+ async showWidget(widgetPath) {
62
+ return this.addWidgetToViewport({ widgetClass: widgetPath });
80
63
  }
81
- // Set text
82
- async setWidgetText(params) {
83
- const commands = [];
84
- commands.push(`SetWidgetText ${params.widgetName}.${params.componentName} "${params.text}"`);
85
- if (params.fontSize !== undefined) {
86
- commands.push(`SetWidgetFontSize ${params.widgetName}.${params.componentName} ${params.fontSize}`);
64
+ async addWidgetComponent(_params) {
65
+ if (!this.automationBridge) {
66
+ throw new Error('Automation bridge required for widget component operations');
87
67
  }
88
- if (params.color) {
89
- commands.push(`SetWidgetTextColor ${params.widgetName}.${params.componentName} ${params.color.join(' ')}`);
68
+ try {
69
+ const response = await this.automationBridge.sendAutomationRequest('manage_ui', {
70
+ action: 'add_widget_child',
71
+ widgetPath: _params.widgetName,
72
+ childClass: _params.componentType,
73
+ parentName: _params.slot ? 'Root' : undefined,
74
+ });
75
+ return response.success
76
+ ? { success: true, message: response.message || 'Widget component added', ...(response.result || {}) }
77
+ : { success: false, error: response.error || response.message || 'Failed to add widget component' };
90
78
  }
91
- if (params.fontFamily) {
92
- commands.push(`SetWidgetFont ${params.widgetName}.${params.componentName} ${params.fontFamily}`);
79
+ catch (error) {
80
+ return { success: false, error: `Failed to add widget component: ${error instanceof Error ? error.message : String(error)}` };
93
81
  }
94
- await this.bridge.executeConsoleCommands(commands);
95
- return { success: true, message: 'Widget text updated' };
96
82
  }
97
- // Set image
98
- async setWidgetImage(params) {
99
- const commands = [];
100
- commands.push(`SetWidgetImage ${params.widgetName}.${params.componentName} ${params.imagePath}`);
101
- if (params.tint) {
102
- commands.push(`SetWidgetImageTint ${params.widgetName}.${params.componentName} ${params.tint.join(' ')}`);
83
+ async setWidgetText(_params) {
84
+ if (!this.automationBridge) {
85
+ throw new Error('Automation bridge required for setting widget text');
103
86
  }
104
- if (params.sizeToContent !== undefined) {
105
- commands.push(`SetWidgetSizeToContent ${params.widgetName}.${params.componentName} ${params.sizeToContent}`);
87
+ try {
88
+ const response = await this.automationBridge.sendAutomationRequest('system_control', {
89
+ subAction: 'set_widget_text',
90
+ key: _params.key,
91
+ value: _params.value
92
+ });
93
+ return response.success
94
+ ? { success: true, message: response.message || 'Widget text set', ...(response.result || {}) }
95
+ : { success: false, error: response.error || response.message || 'Failed to set widget text' };
96
+ }
97
+ catch (error) {
98
+ return { success: false, error: `Failed to set widget text: ${error instanceof Error ? error.message : String(error)}` };
106
99
  }
107
- await this.bridge.executeConsoleCommands(commands);
108
- return { success: true, message: 'Widget image updated' };
109
100
  }
110
- // Create HUD
111
- async createHUD(params) {
112
- const commands = [];
113
- commands.push(`CreateHUDClass ${params.name}`);
114
- if (params.elements) {
115
- for (const element of params.elements) {
116
- const size = element.size || [100, 50];
117
- commands.push(`AddHUDElement ${params.name} ${element.type} ${element.position.join(' ')} ${size.join(' ')}`);
118
- }
101
+ async setWidgetImage(_params) {
102
+ if (!this.automationBridge) {
103
+ throw new Error('Automation bridge required for setting widget images');
104
+ }
105
+ try {
106
+ const response = await this.automationBridge.sendAutomationRequest('system_control', {
107
+ subAction: 'set_widget_image',
108
+ key: _params.key,
109
+ texturePath: _params.texturePath
110
+ });
111
+ return response.success
112
+ ? { success: true, message: response.message || 'Widget image set', ...(response.result || {}) }
113
+ : { success: false, error: response.error || response.message || 'Failed to set widget image' };
114
+ }
115
+ catch (error) {
116
+ return { success: false, error: `Failed to set widget image: ${error instanceof Error ? error.message : String(error)}` };
119
117
  }
120
- await this.bridge.executeConsoleCommands(commands);
121
- return { success: true, message: `HUD ${params.name} created` };
122
118
  }
123
- // Show/Hide widget
124
- async setWidgetVisibility(params) {
125
- const playerIndex = params.playerIndex ?? 0;
126
- const widgetName = params.widgetName?.trim();
127
- if (!widgetName) {
128
- return { success: false, error: 'widgetName is required' };
119
+ async createHUD(_params) {
120
+ if (!this.automationBridge) {
121
+ throw new Error('Automation bridge required for creating HUDs');
129
122
  }
130
- const verifyScript = `
131
- import unreal, json
132
- name = r"${widgetName}"
133
- candidates = []
134
- if name.startswith('/Game/'):
135
- candidates.append(name)
136
- else:
137
- candidates.append(f"/Game/UI/Widgets/{name}")
138
- candidates.append(f"/Game/{name}")
139
-
140
- found_path = ''
141
- for path in candidates:
142
- if unreal.EditorAssetLibrary.does_asset_exist(path):
143
- found_path = path
144
- break
145
-
146
- print('RESULT:' + json.dumps({'success': bool(found_path), 'path': found_path, 'candidates': candidates}))
147
- `.trim();
148
- const verify = await this.bridge.executePythonWithResult(verifyScript);
149
- if (!verify?.success) {
150
- return { success: false, error: `Widget asset not found for ${widgetName}` };
123
+ const widgetPath = _params.name.startsWith('/Game') ? _params.name : `/Game/UI/${_params.name}`;
124
+ try {
125
+ const response = await this.automationBridge.sendAutomationRequest('system_control', {
126
+ subAction: 'create_hud',
127
+ widgetPath: widgetPath
128
+ });
129
+ return response.success
130
+ ? { success: true, message: response.message || 'HUD created', widgetName: response.result?.widgetName, ...(response.result || {}) }
131
+ : { success: false, error: response.error || response.message || 'Failed to create HUD' };
132
+ }
133
+ catch (error) {
134
+ return { success: false, error: `Failed to create HUD: ${error instanceof Error ? error.message : String(error)}` };
151
135
  }
152
- const command = params.visible
153
- ? `ShowWidget ${widgetName} ${playerIndex}`
154
- : `HideWidget ${widgetName} ${playerIndex}`;
155
- const raw = await this.bridge.executeConsoleCommand(command);
156
- const summary = this.bridge.summarizeConsoleCommand(command, raw);
157
- return {
158
- success: true,
159
- message: params.visible ? `Widget ${widgetName} show command issued` : `Widget ${widgetName} hide command issued`,
160
- command: summary.command,
161
- output: summary.output || undefined,
162
- logLines: summary.logLines?.length ? summary.logLines : undefined
163
- };
164
136
  }
165
- // Add widget to viewport
137
+ async setWidgetVisibility(params) {
138
+ if (!this.automationBridge)
139
+ return { success: false, error: 'NO_BRIDGE' };
140
+ const response = await this.automationBridge.sendAutomationRequest('system_control', {
141
+ subAction: 'set_widget_visibility',
142
+ key: params.key,
143
+ visible: params.visible
144
+ });
145
+ return response.success
146
+ ? { success: true, message: response.message || 'Widget visibility set', ...(response.result || {}) }
147
+ : { success: false, error: response.error || response.message || 'Failed to set widget visibility' };
148
+ }
149
+ async removeWidgetFromViewport(params) {
150
+ if (!this.automationBridge)
151
+ return { success: false, error: 'NO_BRIDGE' };
152
+ const response = await this.automationBridge.sendAutomationRequest('system_control', {
153
+ subAction: 'remove_widget_from_viewport',
154
+ key: params.key
155
+ });
156
+ return response.success
157
+ ? { success: true, message: response.message || 'Widget removed from viewport', ...(response.result || {}) }
158
+ : { success: false, error: response.error || response.message || 'Failed to remove widget from viewport' };
159
+ }
166
160
  async addWidgetToViewport(params) {
167
161
  const zOrder = params.zOrder ?? 0;
168
162
  const playerIndex = params.playerIndex ?? 0;
169
- // Use Python API to create and add widget to viewport
170
- const py = `
171
- import unreal
172
- import json
173
- widget_path = r"${params.widgetClass}"
174
- z_order = ${zOrder}
175
- player_index = ${playerIndex}
176
- try:
177
- # Load the widget blueprint class
178
- if not unreal.EditorAssetLibrary.does_asset_exist(widget_path):
179
- print('RESULT:' + json.dumps({'success': False, 'error': f'Widget class not found: {widget_path}'}))
180
- else:
181
- widget_bp = unreal.EditorAssetLibrary.load_asset(widget_path)
182
- if not widget_bp:
183
- print('RESULT:' + json.dumps({'success': False, 'error': 'Failed to load widget blueprint'}))
184
- else:
185
- # Get the generated class from the widget blueprint
186
- widget_class = widget_bp.generated_class() if hasattr(widget_bp, 'generated_class') else widget_bp
187
-
188
- # Get the world and player controller via modern subsystems
189
- world = None
190
- try:
191
- world = unreal.EditorUtilityLibrary.get_editor_world()
192
- except Exception:
193
- pass
194
-
195
- if not world:
196
- editor_subsystem = unreal.get_editor_subsystem(unreal.UnrealEditorSubsystem)
197
- if editor_subsystem and hasattr(editor_subsystem, 'get_editor_world'):
198
- world = editor_subsystem.get_editor_world()
199
-
200
- if not world:
201
- print('RESULT:' + json.dumps({'success': False, 'error': 'No editor world available. Start a PIE session or enable Editor Scripting Utilities.'}))
202
- else:
203
- # Try to get player controller
204
- try:
205
- player_controller = unreal.GameplayStatics.get_player_controller(world, player_index)
206
- except Exception:
207
- player_controller = None
208
-
209
- if not player_controller:
210
- # If no player controller in PIE, try to get the first one or create a dummy
211
- print('RESULT:' + json.dumps({'success': False, 'error': 'No player controller available. Run in PIE mode first.'}))
212
- else:
213
- # Create the widget
214
- widget = unreal.WidgetBlueprintLibrary.create(world, widget_class, player_controller)
215
- if widget:
216
- # Add to viewport
217
- widget.add_to_viewport(z_order)
218
- print('RESULT:' + json.dumps({'success': True}))
219
- else:
220
- print('RESULT:' + json.dumps({'success': False, 'error': 'Failed to create widget instance'}))
221
- except Exception as e:
222
- print('RESULT:' + json.dumps({'success': False, 'error': str(e)}))
223
- `.trim();
224
163
  try {
225
- const resp = await this.bridge.executePython(py);
164
+ const resp = await this.bridge.executeEditorFunction('ADD_WIDGET_TO_VIEWPORT', { widget_path: params.widgetClass, z_order: zOrder, player_index: playerIndex });
226
165
  const interpreted = interpretStandardResult(resp, {
227
166
  successMessage: `Widget added to viewport with z-order ${zOrder}`,
228
167
  failureMessage: 'Failed to add widget to viewport'
@@ -230,23 +169,12 @@ except Exception as e:
230
169
  if (interpreted.success) {
231
170
  return { success: true, message: interpreted.message };
232
171
  }
233
- return {
234
- success: false,
235
- error: interpreted.error ?? 'Failed to add widget to viewport',
236
- details: bestEffortInterpretedText(interpreted)
237
- };
172
+ return { success: false, error: interpreted.error ?? 'Failed to add widget to viewport', details: bestEffortInterpretedText(interpreted) };
238
173
  }
239
174
  catch (e) {
240
175
  return { success: false, error: `Failed to add widget to viewport: ${e}` };
241
176
  }
242
177
  }
243
- // Remove widget from viewport
244
- async removeWidgetFromViewport(params) {
245
- const playerIndex = params.playerIndex ?? 0;
246
- const command = `RemoveWidgetFromViewport ${params.widgetName} ${playerIndex}`;
247
- return this.bridge.executeConsoleCommand(command);
248
- }
249
- // Create menu
250
178
  async createMenu(params) {
251
179
  const commands = [];
252
180
  commands.push(`CreateMenuWidget ${params.name} ${params.menuType}`);
@@ -259,7 +187,6 @@ except Exception as e:
259
187
  await this.bridge.executeConsoleCommands(commands);
260
188
  return { success: true, message: `Menu ${params.name} created` };
261
189
  }
262
- // Set widget animation
263
190
  async createWidgetAnimation(params) {
264
191
  const commands = [];
265
192
  commands.push(`CreateWidgetAnimation ${params.widgetName} ${params.animationName} ${params.duration}`);
@@ -275,14 +202,12 @@ except Exception as e:
275
202
  await this.bridge.executeConsoleCommands(commands);
276
203
  return { success: true, message: `Animation ${params.animationName} created` };
277
204
  }
278
- // Play widget animation
279
205
  async playWidgetAnimation(params) {
280
206
  const playMode = params.playMode || 'Forward';
281
207
  const loops = params.loops ?? 1;
282
208
  const command = `PlayWidgetAnimation ${params.widgetName} ${params.animationName} ${playMode} ${loops}`;
283
209
  return this.bridge.executeConsoleCommand(command);
284
210
  }
285
- // Set widget style
286
211
  async setWidgetStyle(params) {
287
212
  const commands = [];
288
213
  if (params.style.backgroundColor) {
@@ -303,12 +228,10 @@ except Exception as e:
303
228
  await this.bridge.executeConsoleCommands(commands);
304
229
  return { success: true, message: 'Widget style updated' };
305
230
  }
306
- // Bind widget event
307
231
  async bindWidgetEvent(params) {
308
232
  const command = `BindWidgetEvent ${params.widgetName}.${params.componentName} ${params.eventType} ${params.functionName}`;
309
233
  return this.bridge.executeConsoleCommand(command);
310
234
  }
311
- // Set input mode
312
235
  async setInputMode(params) {
313
236
  const commands = [];
314
237
  commands.push(`SetInputMode ${params.mode}`);
@@ -321,13 +244,11 @@ except Exception as e:
321
244
  await this.bridge.executeConsoleCommands(commands);
322
245
  return { success: true, message: `Input mode set to ${params.mode}` };
323
246
  }
324
- // Create tooltip
325
247
  async createTooltip(params) {
326
248
  const delay = params.delay ?? 0.5;
327
249
  const command = `SetWidgetTooltip ${params.widgetName}.${params.componentName} "${params.text}" ${delay}`;
328
250
  return this.bridge.executeConsoleCommand(command);
329
251
  }
330
- // Create drag and drop
331
252
  async setupDragDrop(params) {
332
253
  const commands = [];
333
254
  commands.push(`EnableDragDrop ${params.widgetName}.${params.componentName}`);
@@ -342,7 +263,6 @@ except Exception as e:
342
263
  await this.bridge.executeConsoleCommands(commands);
343
264
  return { success: true, message: 'Drag and drop configured' };
344
265
  }
345
- // Create notification
346
266
  async showNotification(params) {
347
267
  const duration = params.duration ?? 3.0;
348
268
  const type = params.type || 'Info';
@@ -0,0 +1,115 @@
1
+ export interface AutomationResponse {
2
+ success: boolean;
3
+ message?: string;
4
+ error?: string | {
5
+ message: string;
6
+ code?: string;
7
+ };
8
+ result?: unknown;
9
+ warnings?: string[];
10
+ details?: unknown;
11
+ data?: unknown;
12
+ [key: string]: unknown;
13
+ }
14
+ export interface LevelResponse extends AutomationResponse {
15
+ levelPath?: string;
16
+ level?: string;
17
+ path?: string;
18
+ packagePath?: string;
19
+ objectPath?: string;
20
+ currentMap?: string;
21
+ currentMapPath?: string;
22
+ currentWorldLevels?: unknown[];
23
+ allMaps?: unknown[];
24
+ partitioned?: boolean;
25
+ streaming?: boolean;
26
+ loaded?: boolean;
27
+ visible?: boolean;
28
+ skipped?: boolean;
29
+ reason?: string;
30
+ }
31
+ export interface ActorResponse extends AutomationResponse {
32
+ actorName?: string;
33
+ actorLabel?: string;
34
+ actorPath?: string;
35
+ actors?: unknown[];
36
+ components?: unknown[];
37
+ location?: {
38
+ x: number;
39
+ y: number;
40
+ z: number;
41
+ };
42
+ rotation?: {
43
+ pitch: number;
44
+ yaw: number;
45
+ roll: number;
46
+ };
47
+ scale?: {
48
+ x: number;
49
+ y: number;
50
+ z: number;
51
+ };
52
+ transform?: unknown;
53
+ tags?: string[];
54
+ properties?: Record<string, unknown>;
55
+ deleted?: boolean;
56
+ deletedCount?: number;
57
+ }
58
+ export interface AssetResponse extends AutomationResponse {
59
+ assetPath?: string;
60
+ asset?: string;
61
+ assets?: unknown[];
62
+ source?: string;
63
+ saved?: boolean;
64
+ metadata?: Record<string, unknown>;
65
+ tags?: string[];
66
+ graph?: Record<string, unknown[]>;
67
+ }
68
+ export interface EditorResponse extends AutomationResponse {
69
+ viewMode?: string;
70
+ fov?: number;
71
+ location?: {
72
+ x: number;
73
+ y: number;
74
+ z: number;
75
+ };
76
+ rotation?: {
77
+ pitch: number;
78
+ yaw: number;
79
+ roll: number;
80
+ };
81
+ cameraSettings?: unknown;
82
+ camera?: {
83
+ location?: unknown;
84
+ rotation?: unknown;
85
+ };
86
+ resolution?: {
87
+ width: number;
88
+ height: number;
89
+ };
90
+ filename?: string;
91
+ filePath?: string;
92
+ isPlaying?: boolean;
93
+ isPaused?: boolean;
94
+ isInPIE?: boolean;
95
+ playSessionId?: string;
96
+ bookmarkName?: string;
97
+ bookmarks?: unknown[];
98
+ realtime?: boolean;
99
+ }
100
+ export interface SequenceResponse extends AutomationResponse {
101
+ sequencePath?: string;
102
+ sequence?: string;
103
+ bindingId?: string;
104
+ trackName?: string;
105
+ keyframe?: unknown;
106
+ frameNumber?: number;
107
+ length?: number;
108
+ playbackPosition?: number;
109
+ requestId?: string;
110
+ }
111
+ export interface ConsoleResponse extends AutomationResponse {
112
+ output?: string;
113
+ command?: string;
114
+ }
115
+ //# sourceMappingURL=automation-responses.d.ts.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=automation-responses.js.map
@@ -1,7 +1,4 @@
1
1
  export interface Env {
2
- UE_HOST: string;
3
- UE_RC_WS_PORT: number;
4
- UE_RC_HTTP_PORT: number;
5
2
  UE_PROJECT_PATH?: string;
6
3
  UE_EDITOR_EXE?: string;
7
4
  UE_SCREENSHOT_DIR?: string;
package/dist/types/env.js CHANGED
@@ -1,15 +1,8 @@
1
1
  export function loadEnv() {
2
- const host = process.env.UE_HOST || '127.0.0.1';
3
- // Note: UE5 default is HTTP on 30010, WebSocket on 30020
4
- const wsPort = Number(process.env.UE_RC_WS_PORT || process.env.UE_REMOTE_CONTROL_WS_PORT || 30020);
5
- const httpPort = Number(process.env.UE_RC_HTTP_PORT || process.env.UE_REMOTE_CONTROL_HTTP_PORT || 30010);
6
2
  const projectPath = process.env.UE_PROJECT_PATH;
7
3
  const editorExe = process.env.UE_EDITOR_EXE;
8
4
  const screenshotDir = process.env.UE_SCREENSHOT_DIR;
9
5
  return {
10
- UE_HOST: host,
11
- UE_RC_WS_PORT: wsPort,
12
- UE_RC_HTTP_PORT: httpPort,
13
6
  UE_PROJECT_PATH: projectPath,
14
7
  UE_EDITOR_EXE: editorExe,
15
8
  UE_SCREENSHOT_DIR: screenshotDir,