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
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';
@@ -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,