unreal-engine-mcp-server 0.4.6 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (438) hide show
  1. package/.env.example +26 -0
  2. package/.env.production +38 -7
  3. package/.eslintrc.json +0 -54
  4. package/.eslintrc.override.json +8 -0
  5. package/.github/ISSUE_TEMPLATE/bug_report.yml +94 -0
  6. package/.github/ISSUE_TEMPLATE/config.yml +8 -0
  7. package/.github/ISSUE_TEMPLATE/feature_request.yml +56 -0
  8. package/.github/copilot-instructions.md +478 -45
  9. package/.github/dependabot.yml +19 -0
  10. package/.github/labeler.yml +24 -0
  11. package/.github/labels.yml +70 -0
  12. package/.github/pull_request_template.md +42 -0
  13. package/.github/release-drafter.yml +148 -0
  14. package/.github/workflows/auto-merge.yml +38 -0
  15. package/.github/workflows/ci.yml +38 -0
  16. package/.github/workflows/dependency-review.yml +17 -0
  17. package/.github/workflows/gemini-issue-triage.yml +172 -0
  18. package/.github/workflows/greetings.yml +23 -0
  19. package/.github/workflows/labeler.yml +16 -0
  20. package/.github/workflows/links.yml +80 -0
  21. package/.github/workflows/pr-size-labeler.yml +137 -0
  22. package/.github/workflows/publish-mcp.yml +12 -7
  23. package/.github/workflows/release-drafter.yml +23 -0
  24. package/.github/workflows/release.yml +112 -0
  25. package/.github/workflows/semantic-pull-request.yml +35 -0
  26. package/.github/workflows/smoke-test.yml +36 -0
  27. package/.github/workflows/stale.yml +28 -0
  28. package/CHANGELOG.md +269 -22
  29. package/CONTRIBUTING.md +140 -0
  30. package/README.md +166 -72
  31. package/claude_desktop_config_example.json +7 -6
  32. package/dist/automation/bridge.d.ts +50 -0
  33. package/dist/automation/bridge.js +452 -0
  34. package/dist/automation/connection-manager.d.ts +23 -0
  35. package/dist/automation/connection-manager.js +107 -0
  36. package/dist/automation/handshake.d.ts +11 -0
  37. package/dist/automation/handshake.js +89 -0
  38. package/dist/automation/index.d.ts +3 -0
  39. package/dist/automation/index.js +3 -0
  40. package/dist/automation/message-handler.d.ts +12 -0
  41. package/dist/automation/message-handler.js +149 -0
  42. package/dist/automation/request-tracker.d.ts +25 -0
  43. package/dist/automation/request-tracker.js +98 -0
  44. package/dist/automation/types.d.ts +130 -0
  45. package/dist/automation/types.js +2 -0
  46. package/dist/cli.js +32 -5
  47. package/dist/config.d.ts +27 -0
  48. package/dist/config.js +60 -0
  49. package/dist/constants.d.ts +12 -0
  50. package/dist/constants.js +12 -0
  51. package/dist/graphql/resolvers.d.ts +268 -0
  52. package/dist/graphql/resolvers.js +743 -0
  53. package/dist/graphql/schema.d.ts +5 -0
  54. package/dist/graphql/schema.js +437 -0
  55. package/dist/graphql/server.d.ts +26 -0
  56. package/dist/graphql/server.js +115 -0
  57. package/dist/graphql/types.d.ts +7 -0
  58. package/dist/graphql/types.js +2 -0
  59. package/dist/handlers/resource-handlers.d.ts +20 -0
  60. package/dist/handlers/resource-handlers.js +180 -0
  61. package/dist/index.d.ts +31 -18
  62. package/dist/index.js +119 -604
  63. package/dist/prompts/index.js +4 -4
  64. package/dist/resources/actors.d.ts +17 -12
  65. package/dist/resources/actors.js +56 -76
  66. package/dist/resources/assets.d.ts +6 -14
  67. package/dist/resources/assets.js +115 -147
  68. package/dist/resources/levels.d.ts +13 -13
  69. package/dist/resources/levels.js +25 -34
  70. package/dist/server/resource-registry.d.ts +20 -0
  71. package/dist/server/resource-registry.js +37 -0
  72. package/dist/server/tool-registry.d.ts +23 -0
  73. package/dist/server/tool-registry.js +322 -0
  74. package/dist/server-setup.d.ts +21 -0
  75. package/dist/server-setup.js +111 -0
  76. package/dist/services/health-monitor.d.ts +34 -0
  77. package/dist/services/health-monitor.js +105 -0
  78. package/dist/services/metrics-server.d.ts +11 -0
  79. package/dist/services/metrics-server.js +105 -0
  80. package/dist/tools/actors.d.ts +147 -9
  81. package/dist/tools/actors.js +350 -311
  82. package/dist/tools/animation.d.ts +135 -4
  83. package/dist/tools/animation.js +510 -411
  84. package/dist/tools/assets.d.ts +117 -19
  85. package/dist/tools/assets.js +259 -284
  86. package/dist/tools/audio.d.ts +102 -42
  87. package/dist/tools/audio.js +272 -685
  88. package/dist/tools/base-tool.d.ts +17 -0
  89. package/dist/tools/base-tool.js +46 -0
  90. package/dist/tools/behavior-tree.d.ts +94 -0
  91. package/dist/tools/behavior-tree.js +39 -0
  92. package/dist/tools/blueprint/helpers.d.ts +29 -0
  93. package/dist/tools/blueprint/helpers.js +182 -0
  94. package/dist/tools/blueprint.d.ts +228 -118
  95. package/dist/tools/blueprint.js +685 -832
  96. package/dist/tools/consolidated-tool-definitions.d.ts +5475 -1627
  97. package/dist/tools/consolidated-tool-definitions.js +829 -482
  98. package/dist/tools/consolidated-tool-handlers.d.ts +2 -1
  99. package/dist/tools/consolidated-tool-handlers.js +211 -1009
  100. package/dist/tools/debug.d.ts +143 -85
  101. package/dist/tools/debug.js +234 -180
  102. package/dist/tools/dynamic-handler-registry.d.ts +11 -0
  103. package/dist/tools/dynamic-handler-registry.js +101 -0
  104. package/dist/tools/editor.d.ts +139 -18
  105. package/dist/tools/editor.js +239 -244
  106. package/dist/tools/engine.d.ts +10 -4
  107. package/dist/tools/engine.js +13 -5
  108. package/dist/tools/environment.d.ts +36 -0
  109. package/dist/tools/environment.js +267 -0
  110. package/dist/tools/foliage.d.ts +105 -14
  111. package/dist/tools/foliage.js +219 -331
  112. package/dist/tools/handlers/actor-handlers.d.ts +3 -0
  113. package/dist/tools/handlers/actor-handlers.js +232 -0
  114. package/dist/tools/handlers/animation-handlers.d.ts +3 -0
  115. package/dist/tools/handlers/animation-handlers.js +185 -0
  116. package/dist/tools/handlers/argument-helper.d.ts +16 -0
  117. package/dist/tools/handlers/argument-helper.js +80 -0
  118. package/dist/tools/handlers/asset-handlers.d.ts +3 -0
  119. package/dist/tools/handlers/asset-handlers.js +496 -0
  120. package/dist/tools/handlers/audio-handlers.d.ts +3 -0
  121. package/dist/tools/handlers/audio-handlers.js +166 -0
  122. package/dist/tools/handlers/blueprint-handlers.d.ts +4 -0
  123. package/dist/tools/handlers/blueprint-handlers.js +358 -0
  124. package/dist/tools/handlers/common-handlers.d.ts +14 -0
  125. package/dist/tools/handlers/common-handlers.js +56 -0
  126. package/dist/tools/handlers/editor-handlers.d.ts +3 -0
  127. package/dist/tools/handlers/editor-handlers.js +119 -0
  128. package/dist/tools/handlers/effect-handlers.d.ts +3 -0
  129. package/dist/tools/handlers/effect-handlers.js +171 -0
  130. package/dist/tools/handlers/environment-handlers.d.ts +3 -0
  131. package/dist/tools/handlers/environment-handlers.js +170 -0
  132. package/dist/tools/handlers/graph-handlers.d.ts +3 -0
  133. package/dist/tools/handlers/graph-handlers.js +90 -0
  134. package/dist/tools/handlers/input-handlers.d.ts +3 -0
  135. package/dist/tools/handlers/input-handlers.js +21 -0
  136. package/dist/tools/handlers/inspect-handlers.d.ts +3 -0
  137. package/dist/tools/handlers/inspect-handlers.js +383 -0
  138. package/dist/tools/handlers/level-handlers.d.ts +3 -0
  139. package/dist/tools/handlers/level-handlers.js +237 -0
  140. package/dist/tools/handlers/lighting-handlers.d.ts +3 -0
  141. package/dist/tools/handlers/lighting-handlers.js +144 -0
  142. package/dist/tools/handlers/performance-handlers.d.ts +3 -0
  143. package/dist/tools/handlers/performance-handlers.js +130 -0
  144. package/dist/tools/handlers/pipeline-handlers.d.ts +3 -0
  145. package/dist/tools/handlers/pipeline-handlers.js +110 -0
  146. package/dist/tools/handlers/sequence-handlers.d.ts +3 -0
  147. package/dist/tools/handlers/sequence-handlers.js +376 -0
  148. package/dist/tools/handlers/system-handlers.d.ts +4 -0
  149. package/dist/tools/handlers/system-handlers.js +506 -0
  150. package/dist/tools/input.d.ts +19 -0
  151. package/dist/tools/input.js +89 -0
  152. package/dist/tools/introspection.d.ts +103 -40
  153. package/dist/tools/introspection.js +425 -568
  154. package/dist/tools/landscape.d.ts +97 -36
  155. package/dist/tools/landscape.js +280 -409
  156. package/dist/tools/level.d.ts +130 -10
  157. package/dist/tools/level.js +639 -675
  158. package/dist/tools/lighting.d.ts +77 -38
  159. package/dist/tools/lighting.js +441 -943
  160. package/dist/tools/logs.d.ts +45 -0
  161. package/dist/tools/logs.js +210 -0
  162. package/dist/tools/materials.d.ts +91 -24
  163. package/dist/tools/materials.js +190 -118
  164. package/dist/tools/niagara.d.ts +149 -39
  165. package/dist/tools/niagara.js +232 -182
  166. package/dist/tools/performance.d.ts +27 -12
  167. package/dist/tools/performance.js +204 -122
  168. package/dist/tools/physics.d.ts +32 -77
  169. package/dist/tools/physics.js +171 -582
  170. package/dist/tools/property-dictionary.d.ts +13 -0
  171. package/dist/tools/property-dictionary.js +82 -0
  172. package/dist/tools/sequence.d.ts +73 -48
  173. package/dist/tools/sequence.js +196 -748
  174. package/dist/tools/tool-definition-utils.d.ts +59 -0
  175. package/dist/tools/tool-definition-utils.js +35 -0
  176. package/dist/tools/ui.d.ts +66 -34
  177. package/dist/tools/ui.js +134 -214
  178. package/dist/types/env.d.ts +0 -3
  179. package/dist/types/env.js +0 -7
  180. package/dist/types/tool-interfaces.d.ts +898 -0
  181. package/dist/types/tool-interfaces.js +2 -0
  182. package/dist/types/tool-types.d.ts +195 -11
  183. package/dist/types/tool-types.js +0 -4
  184. package/dist/unreal-bridge.d.ts +24 -131
  185. package/dist/unreal-bridge.js +364 -1506
  186. package/dist/utils/command-validator.d.ts +9 -0
  187. package/dist/utils/command-validator.js +67 -0
  188. package/dist/utils/elicitation.d.ts +1 -1
  189. package/dist/utils/elicitation.js +12 -15
  190. package/dist/utils/error-handler.d.ts +2 -51
  191. package/dist/utils/error-handler.js +11 -87
  192. package/dist/utils/ini-reader.d.ts +3 -0
  193. package/dist/utils/ini-reader.js +69 -0
  194. package/dist/utils/logger.js +9 -6
  195. package/dist/utils/normalize.d.ts +3 -0
  196. package/dist/utils/normalize.js +56 -0
  197. package/dist/utils/response-factory.d.ts +7 -0
  198. package/dist/utils/response-factory.js +33 -0
  199. package/dist/utils/response-validator.d.ts +3 -24
  200. package/dist/utils/response-validator.js +130 -81
  201. package/dist/utils/result-helpers.d.ts +4 -5
  202. package/dist/utils/result-helpers.js +15 -16
  203. package/dist/utils/safe-json.js +5 -11
  204. package/dist/utils/unreal-command-queue.d.ts +24 -0
  205. package/dist/utils/unreal-command-queue.js +120 -0
  206. package/dist/utils/validation.d.ts +0 -40
  207. package/dist/utils/validation.js +1 -78
  208. package/dist/wasm/index.d.ts +70 -0
  209. package/dist/wasm/index.js +535 -0
  210. package/docs/GraphQL-API.md +888 -0
  211. package/docs/Migration-Guide-v0.5.0.md +692 -0
  212. package/docs/Roadmap.md +53 -0
  213. package/docs/WebAssembly-Integration.md +628 -0
  214. package/docs/editor-plugin-extension.md +370 -0
  215. package/docs/handler-mapping.md +242 -0
  216. package/docs/native-automation-progress.md +128 -0
  217. package/docs/testing-guide.md +423 -0
  218. package/mcp-config-example.json +6 -6
  219. package/package.json +60 -27
  220. package/plugins/McpAutomationBridge/Config/FilterPlugin.ini +8 -0
  221. package/plugins/McpAutomationBridge/McpAutomationBridge.uplugin +64 -0
  222. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/McpAutomationBridge.Build.cs +189 -0
  223. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.cpp +22 -0
  224. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.h +30 -0
  225. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeHelpers.h +1983 -0
  226. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeModule.cpp +72 -0
  227. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSettings.cpp +46 -0
  228. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSubsystem.cpp +581 -0
  229. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AnimationHandlers.cpp +2394 -0
  230. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetQueryHandlers.cpp +300 -0
  231. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetWorkflowHandlers.cpp +2807 -0
  232. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AudioHandlers.cpp +1087 -0
  233. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BehaviorTreeHandlers.cpp +488 -0
  234. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.cpp +643 -0
  235. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.h +31 -0
  236. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintGraphHandlers.cpp +1184 -0
  237. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers.cpp +5652 -0
  238. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers_List.cpp +152 -0
  239. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ControlHandlers.cpp +2614 -0
  240. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_DebugHandlers.cpp +42 -0
  241. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EditorFunctionHandlers.cpp +1237 -0
  242. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EffectHandlers.cpp +1701 -0
  243. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EnvironmentHandlers.cpp +2145 -0
  244. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_FoliageHandlers.cpp +954 -0
  245. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InputHandlers.cpp +209 -0
  246. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InsightsHandlers.cpp +41 -0
  247. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LandscapeHandlers.cpp +1164 -0
  248. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LevelHandlers.cpp +762 -0
  249. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LightingHandlers.cpp +634 -0
  250. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LogHandlers.cpp +136 -0
  251. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_MaterialGraphHandlers.cpp +494 -0
  252. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraGraphHandlers.cpp +278 -0
  253. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraHandlers.cpp +625 -0
  254. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PerformanceHandlers.cpp +401 -0
  255. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PipelineHandlers.cpp +67 -0
  256. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ProcessRequest.cpp +735 -0
  257. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PropertyHandlers.cpp +2634 -0
  258. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_RenderHandlers.cpp +189 -0
  259. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.cpp +917 -0
  260. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.h +39 -0
  261. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequenceHandlers.cpp +2670 -0
  262. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequencerHandlers.cpp +519 -0
  263. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_TestHandlers.cpp +38 -0
  264. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_UiHandlers.cpp +668 -0
  265. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_WorldPartitionHandlers.cpp +346 -0
  266. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.cpp +1330 -0
  267. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.h +149 -0
  268. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpConnectionManager.cpp +783 -0
  269. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSettings.h +115 -0
  270. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSubsystem.h +796 -0
  271. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpConnectionManager.h +117 -0
  272. package/scripts/check-unreal-connection.mjs +19 -0
  273. package/scripts/clean-tmp.js +23 -0
  274. package/scripts/patch-wasm.js +26 -0
  275. package/scripts/run-all-tests.mjs +131 -0
  276. package/scripts/smoke-test.ts +94 -0
  277. package/scripts/sync-mcp-plugin.js +143 -0
  278. package/scripts/test-no-plugin-alternates.mjs +113 -0
  279. package/scripts/validate-server.js +46 -0
  280. package/scripts/verify-automation-bridge.js +200 -0
  281. package/server.json +57 -21
  282. package/src/automation/bridge.ts +558 -0
  283. package/src/automation/connection-manager.ts +130 -0
  284. package/src/automation/handshake.ts +99 -0
  285. package/src/automation/index.ts +2 -0
  286. package/src/automation/message-handler.ts +167 -0
  287. package/src/automation/request-tracker.ts +123 -0
  288. package/src/automation/types.ts +107 -0
  289. package/src/cli.ts +33 -6
  290. package/src/config.ts +73 -0
  291. package/src/constants.ts +12 -0
  292. package/src/graphql/resolvers.ts +1010 -0
  293. package/src/graphql/schema.ts +452 -0
  294. package/src/graphql/server.ts +154 -0
  295. package/src/graphql/types.ts +7 -0
  296. package/src/handlers/resource-handlers.ts +186 -0
  297. package/src/index.ts +152 -649
  298. package/src/prompts/index.ts +4 -4
  299. package/src/resources/actors.ts +58 -76
  300. package/src/resources/assets.ts +147 -134
  301. package/src/resources/levels.ts +28 -33
  302. package/src/server/resource-registry.ts +47 -0
  303. package/src/server/tool-registry.ts +354 -0
  304. package/src/server-setup.ts +148 -0
  305. package/src/services/health-monitor.ts +132 -0
  306. package/src/services/metrics-server.ts +142 -0
  307. package/src/tools/actors.ts +417 -322
  308. package/src/tools/animation.ts +671 -461
  309. package/src/tools/assets.ts +353 -289
  310. package/src/tools/audio.ts +323 -766
  311. package/src/tools/base-tool.ts +52 -0
  312. package/src/tools/behavior-tree.ts +45 -0
  313. package/src/tools/blueprint/helpers.ts +189 -0
  314. package/src/tools/blueprint.ts +787 -965
  315. package/src/tools/consolidated-tool-definitions.ts +993 -500
  316. package/src/tools/consolidated-tool-handlers.ts +272 -1122
  317. package/src/tools/debug.ts +292 -187
  318. package/src/tools/dynamic-handler-registry.ts +151 -0
  319. package/src/tools/editor.ts +309 -246
  320. package/src/tools/engine.ts +14 -3
  321. package/src/tools/environment.ts +287 -0
  322. package/src/tools/foliage.ts +314 -379
  323. package/src/tools/handlers/actor-handlers.ts +271 -0
  324. package/src/tools/handlers/animation-handlers.ts +237 -0
  325. package/src/tools/handlers/argument-helper.ts +142 -0
  326. package/src/tools/handlers/asset-handlers.ts +532 -0
  327. package/src/tools/handlers/audio-handlers.ts +194 -0
  328. package/src/tools/handlers/blueprint-handlers.ts +380 -0
  329. package/src/tools/handlers/common-handlers.ts +87 -0
  330. package/src/tools/handlers/editor-handlers.ts +123 -0
  331. package/src/tools/handlers/effect-handlers.ts +220 -0
  332. package/src/tools/handlers/environment-handlers.ts +183 -0
  333. package/src/tools/handlers/graph-handlers.ts +116 -0
  334. package/src/tools/handlers/input-handlers.ts +28 -0
  335. package/src/tools/handlers/inspect-handlers.ts +450 -0
  336. package/src/tools/handlers/level-handlers.ts +252 -0
  337. package/src/tools/handlers/lighting-handlers.ts +147 -0
  338. package/src/tools/handlers/performance-handlers.ts +132 -0
  339. package/src/tools/handlers/pipeline-handlers.ts +127 -0
  340. package/src/tools/handlers/sequence-handlers.ts +415 -0
  341. package/src/tools/handlers/system-handlers.ts +564 -0
  342. package/src/tools/input.ts +101 -0
  343. package/src/tools/introspection.ts +493 -584
  344. package/src/tools/landscape.ts +394 -489
  345. package/src/tools/level.ts +752 -694
  346. package/src/tools/lighting.ts +583 -984
  347. package/src/tools/logs.ts +219 -0
  348. package/src/tools/materials.ts +231 -121
  349. package/src/tools/niagara.ts +293 -168
  350. package/src/tools/performance.ts +320 -168
  351. package/src/tools/physics.ts +268 -613
  352. package/src/tools/property-dictionary.ts +98 -0
  353. package/src/tools/sequence.ts +255 -815
  354. package/src/tools/tool-definition-utils.ts +35 -0
  355. package/src/tools/ui.ts +207 -283
  356. package/src/types/env.ts +0 -10
  357. package/src/types/tool-interfaces.ts +250 -0
  358. package/src/types/tool-types.ts +250 -13
  359. package/src/unreal-bridge.ts +460 -1550
  360. package/src/utils/command-validator.ts +75 -0
  361. package/src/utils/elicitation.ts +10 -7
  362. package/src/utils/error-handler.ts +14 -90
  363. package/src/utils/ini-reader.ts +86 -0
  364. package/src/utils/logger.ts +8 -3
  365. package/src/utils/normalize.ts +60 -0
  366. package/src/utils/response-factory.ts +39 -0
  367. package/src/utils/response-validator.ts +176 -56
  368. package/src/utils/result-helpers.ts +21 -19
  369. package/src/utils/safe-json.ts +14 -11
  370. package/src/utils/unreal-command-queue.ts +152 -0
  371. package/src/utils/validation.ts +4 -1
  372. package/src/wasm/index.ts +838 -0
  373. package/test-server.mjs +100 -0
  374. package/tests/run-unreal-tool-tests.mjs +242 -14
  375. package/tests/test-animation.mjs +44 -0
  376. package/tests/test-asset-advanced.mjs +82 -0
  377. package/tests/test-asset-errors.mjs +35 -0
  378. package/tests/test-audio.mjs +219 -0
  379. package/tests/test-automation-timeouts.mjs +98 -0
  380. package/tests/test-behavior-tree.mjs +261 -0
  381. package/tests/test-blueprint-events.mjs +35 -0
  382. package/tests/test-blueprint-graph.mjs +79 -0
  383. package/tests/test-blueprint.mjs +577 -0
  384. package/tests/test-client-mode.mjs +86 -0
  385. package/tests/test-console-command.mjs +56 -0
  386. package/tests/test-control-actor.mjs +425 -0
  387. package/tests/test-control-editor.mjs +80 -0
  388. package/tests/test-extra-tools.mjs +38 -0
  389. package/tests/test-graphql.mjs +322 -0
  390. package/tests/test-inspect.mjs +72 -0
  391. package/tests/test-landscape.mjs +60 -0
  392. package/tests/test-manage-asset.mjs +438 -0
  393. package/tests/test-manage-level.mjs +70 -0
  394. package/tests/test-materials.mjs +356 -0
  395. package/tests/test-niagara.mjs +185 -0
  396. package/tests/test-no-inline-python.mjs +122 -0
  397. package/tests/test-plugin-handshake.mjs +82 -0
  398. package/tests/test-render.mjs +33 -0
  399. package/tests/test-runner.mjs +933 -0
  400. package/tests/test-search-assets.mjs +66 -0
  401. package/tests/test-sequence.mjs +68 -0
  402. package/tests/test-system.mjs +57 -0
  403. package/tests/test-wasm.mjs +193 -0
  404. package/tests/test-world-partition.mjs +215 -0
  405. package/tsconfig.json +3 -3
  406. package/wasm/Cargo.lock +363 -0
  407. package/wasm/Cargo.toml +42 -0
  408. package/wasm/LICENSE +21 -0
  409. package/wasm/README.md +253 -0
  410. package/wasm/src/dependency_resolver.rs +377 -0
  411. package/wasm/src/lib.rs +153 -0
  412. package/wasm/src/property_parser.rs +271 -0
  413. package/wasm/src/transform_math.rs +396 -0
  414. package/wasm/tests/integration.rs +109 -0
  415. package/.github/workflows/smithery-build.yml +0 -29
  416. package/dist/tools/build_environment_advanced.d.ts +0 -65
  417. package/dist/tools/build_environment_advanced.js +0 -633
  418. package/dist/tools/rc.d.ts +0 -110
  419. package/dist/tools/rc.js +0 -437
  420. package/dist/tools/visual.d.ts +0 -40
  421. package/dist/tools/visual.js +0 -282
  422. package/dist/utils/http.d.ts +0 -6
  423. package/dist/utils/http.js +0 -151
  424. package/dist/utils/python-output.d.ts +0 -18
  425. package/dist/utils/python-output.js +0 -290
  426. package/dist/utils/python.d.ts +0 -2
  427. package/dist/utils/python.js +0 -4
  428. package/dist/utils/stdio-redirect.d.ts +0 -2
  429. package/dist/utils/stdio-redirect.js +0 -20
  430. package/docs/unreal-tool-test-cases.md +0 -572
  431. package/smithery.yaml +0 -29
  432. package/src/tools/build_environment_advanced.ts +0 -732
  433. package/src/tools/rc.ts +0 -515
  434. package/src/tools/visual.ts +0 -281
  435. package/src/utils/http.ts +0 -187
  436. package/src/utils/python-output.ts +0 -351
  437. package/src/utils/python.ts +0 -3
  438. package/src/utils/stdio-redirect.ts +0 -18
@@ -1,99 +1,40 @@
1
1
  // Debug visualization tools for Unreal Engine
2
+ // Uses Automation Bridge and console commands for all operations
3
+
2
4
  import { UnrealBridge } from '../unreal-bridge.js';
3
- import { bestEffortInterpretedText, coerceString, interpretStandardResult } from '../utils/result-helpers.js';
4
- import { parseStandardResult } from '../utils/python-output.js';
5
+ import { AutomationBridge } from '../automation/index.js';
5
6
 
6
7
  export class DebugVisualizationTools {
7
- constructor(private bridge: UnrealBridge) {}
8
-
9
- // Helper to draw via Python SystemLibrary with the editor world
10
- private async pyDraw(scriptBody: string, meta?: { action: string; params?: Record<string, unknown> }) {
11
- const action = (meta?.action || 'debug_draw').replace(/\\/g, '\\\\').replace(/'/g, "\\'");
12
- const payloadObject = meta?.params ?? {};
13
- const payloadJson = JSON.stringify(payloadObject).replace(/\\/g, '\\\\').replace(/'/g, "\\'");
14
- const indentedBody = scriptBody
15
- .split(/\r?\n/)
16
- .map(line => ` ${line}`)
17
- .join('\n');
18
-
19
- const script = `
20
- import unreal
21
- import json
22
-
23
- payload = json.loads('${payloadJson}')
24
- ues = unreal.get_editor_subsystem(unreal.UnrealEditorSubsystem)
25
- if not ues:
26
- raise Exception('UnrealEditorSubsystem not available')
27
- world = ues.get_editor_world()
28
- if not world:
29
- raise Exception('Editor world unavailable')
30
- try:
31
- ${indentedBody}
32
- print('DEBUG_DRAW:' + json.dumps({'action': '${action}', 'params': payload}))
33
- print('RESULT:' + json.dumps({'success': True, 'action': '${action}', 'params': payload}))
34
- except Exception as e:
35
- print('DEBUG_DRAW_ERROR:' + str(e))
36
- print('RESULT:' + json.dumps({'success': False, 'action': '${action}', 'error': str(e)}))
37
- `.trim()
38
- .replace(/\r?\n/g, '\n');
8
+ private bridge: UnrealBridge;
9
+ private automationBridge?: AutomationBridge;
39
10
 
40
- try {
41
- const response = await this.bridge.executePython(script);
42
- let interpreted = interpretStandardResult(response, {
43
- successMessage: `${action} executed`,
44
- failureMessage: `${action} failed`
45
- });
11
+ constructor(bridge: UnrealBridge) {
12
+ this.bridge = bridge;
13
+ }
46
14
 
47
- const parsed = parseStandardResult(response);
48
- const parsedPayload = parsed.data ?? {};
49
- const parsedSuccessValue = (parsedPayload as any).success;
50
- const normalizedSuccess = typeof parsedSuccessValue === 'string'
51
- ? ['true', '1', 'yes'].includes(parsedSuccessValue.toLowerCase())
52
- : parsedSuccessValue === true;
53
-
54
- if (!interpreted.success && normalizedSuccess) {
55
- interpreted = {
56
- ...interpreted,
57
- success: true,
58
- error: undefined,
59
- message: interpreted.message || `${action} executed`,
60
- payload: { ...parsedPayload }
61
- };
62
- }
15
+ setAutomationBridge(automationBridge: AutomationBridge) {
16
+ this.automationBridge = automationBridge;
17
+ }
63
18
 
64
- const finalSuccess = interpreted.success || normalizedSuccess;
65
-
66
- const resolvedAction = coerceString(interpreted.payload.action) ?? action;
67
- const fallbackOutput = typeof parsed.text === 'string' ? parsed.text : '';
68
- const rawOutput = bestEffortInterpretedText(interpreted) ?? (fallbackOutput ? fallbackOutput : undefined);
69
-
70
- if (finalSuccess) {
71
- return {
72
- ...interpreted.payload,
73
- success: true,
74
- action: resolvedAction,
75
- warnings: interpreted.warnings,
76
- details: interpreted.details,
77
- rawOutput,
78
- raw: parsed.raw ?? interpreted.raw
79
- };
80
- }
19
+ // Helper to use Automation Bridge for debug operations
20
+ private async useAutomationBridge(action: string, params: any) {
21
+ if (!this.automationBridge) {
22
+ return { success: false, error: 'AUTOMATION_BRIDGE_NOT_AVAILABLE', message: 'Automation Bridge not available for debug operations' };
23
+ }
81
24
 
82
- return {
83
- success: false,
84
- action: resolvedAction,
85
- error: interpreted.error ?? `${resolvedAction} failed`,
86
- warnings: interpreted.warnings,
87
- details: interpreted.details,
88
- rawOutput,
89
- raw: parsed.raw ?? interpreted.raw
90
- };
91
- } catch (e) {
92
- return { success: false, error: String(e), action: meta?.action || 'debug_draw' };
25
+ try {
26
+ const response = await this.automationBridge.sendAutomationRequest('create_effect', {
27
+ action: 'debug_shape',
28
+ shapeType: action,
29
+ ...params
30
+ });
31
+ return response;
32
+ } catch (error) {
33
+ return { success: false, error: 'AUTOMATION_BRIDGE_ERROR', message: String(error) };
93
34
  }
94
35
  }
95
36
 
96
- // Draw debug line using Python SystemLibrary
37
+ // Draw debug line using Automation Bridge
97
38
  async drawDebugLine(params: {
98
39
  start: [number, number, number];
99
40
  end: [number, number, number];
@@ -104,17 +45,24 @@ except Exception as e:
104
45
  const color = params.color || [255, 0, 0, 255];
105
46
  const duration = params.duration ?? 5.0;
106
47
  const thickness = params.thickness ?? 1.0;
107
- const [sr, sg, sb, sa] = color;
108
- const [sx, sy, sz] = params.start;
109
- const [ex, ey, ez] = params.end;
110
- const script = `
111
- start = unreal.Vector(${sx}, ${sy}, ${sz})
112
- end = unreal.Vector(${ex}, ${ey}, ${ez})
113
- color = unreal.LinearColor(${sr}/255.0, ${sg}/255.0, ${sb}/255.0, ${sa}/255.0)
114
- unreal.SystemLibrary.draw_debug_line(world, start, end, color, ${duration}, ${thickness})
115
- `;
116
- return this.pyDraw(script, {
117
- action: 'debug_line',
48
+
49
+ // Try Automation Bridge first
50
+ const result = await this.useAutomationBridge('line', {
51
+ start: params.start,
52
+ end: params.end,
53
+ color,
54
+ duration,
55
+ thickness
56
+ });
57
+
58
+ if (result.success) {
59
+ return result;
60
+ }
61
+
62
+ return {
63
+ success: false,
64
+ error: result.error || 'AUTOMATION_BRIDGE_REQUIRED',
65
+ message: result.message || 'Drawing debug lines requires Automation Bridge debug_shape handler',
118
66
  params: {
119
67
  start: params.start,
120
68
  end: params.end,
@@ -122,10 +70,10 @@ unreal.SystemLibrary.draw_debug_line(world, start, end, color, ${duration}, ${th
122
70
  duration,
123
71
  thickness
124
72
  }
125
- });
73
+ };
126
74
  }
127
75
 
128
- // Draw debug box using Python SystemLibrary
76
+ // Draw debug box using Automation Bridge
129
77
  async drawDebugBox(params: {
130
78
  center: [number, number, number];
131
79
  extent: [number, number, number];
@@ -138,19 +86,24 @@ unreal.SystemLibrary.draw_debug_line(world, start, end, color, ${duration}, ${th
138
86
  const rotation = params.rotation || [0, 0, 0];
139
87
  const duration = params.duration ?? 5.0;
140
88
  const thickness = params.thickness ?? 1.0;
141
- const [cr, cg, cb, ca] = color;
142
- const [cx, cy, cz] = params.center;
143
- const [ex, ey, ez] = params.extent;
144
- const [rp, ry, rr] = rotation;
145
- const script = `
146
- center = unreal.Vector(${cx}, ${cy}, ${cz})
147
- extent = unreal.Vector(${ex}, ${ey}, ${ez})
148
- rot = unreal.Rotator(${rp}, ${ry}, ${rr})
149
- color = unreal.LinearColor(${cr}/255.0, ${cg}/255.0, ${cb}/255.0, ${ca}/255.0)
150
- unreal.SystemLibrary.draw_debug_box(world, center, extent, color, rot, ${duration}, ${thickness})
151
- `;
152
- return this.pyDraw(script, {
153
- action: 'debug_box',
89
+
90
+ const result = await this.useAutomationBridge('box', {
91
+ center: params.center,
92
+ extent: params.extent,
93
+ rotation,
94
+ color,
95
+ duration,
96
+ thickness
97
+ });
98
+
99
+ if (result.success) {
100
+ return result;
101
+ }
102
+
103
+ return {
104
+ success: false,
105
+ error: result.error || 'AUTOMATION_BRIDGE_REQUIRED',
106
+ message: result.message || 'Drawing debug boxes requires Automation Bridge debug_shape handler',
154
107
  params: {
155
108
  center: params.center,
156
109
  extent: params.extent,
@@ -159,10 +112,10 @@ unreal.SystemLibrary.draw_debug_box(world, center, extent, color, rot, ${duratio
159
112
  duration,
160
113
  thickness
161
114
  }
162
- });
115
+ };
163
116
  }
164
117
 
165
- // Draw debug sphere using Python SystemLibrary
118
+ // Draw debug sphere using Automation Bridge
166
119
  async drawDebugSphere(params: {
167
120
  center: [number, number, number];
168
121
  radius: number;
@@ -175,15 +128,24 @@ unreal.SystemLibrary.draw_debug_box(world, center, extent, color, rot, ${duratio
175
128
  const color = params.color || [0, 0, 255, 255];
176
129
  const duration = params.duration ?? 5.0;
177
130
  const thickness = params.thickness ?? 1.0;
178
- const [cr, cg, cb, ca] = color;
179
- const [cx, cy, cz] = params.center;
180
- const script = `
181
- center = unreal.Vector(${cx}, ${cy}, ${cz})
182
- color = unreal.LinearColor(${cr}/255.0, ${cg}/255.0, ${cb}/255.0, ${ca}/255.0)
183
- unreal.SystemLibrary.draw_debug_sphere(world, center, ${params.radius}, ${segments}, color, ${duration}, ${thickness})
184
- `;
185
- return this.pyDraw(script, {
186
- action: 'debug_sphere',
131
+
132
+ const result = await this.useAutomationBridge('sphere', {
133
+ center: params.center,
134
+ radius: params.radius,
135
+ segments,
136
+ color,
137
+ duration,
138
+ thickness
139
+ });
140
+
141
+ if (result.success) {
142
+ return result;
143
+ }
144
+
145
+ return {
146
+ success: false,
147
+ error: result.error || 'AUTOMATION_BRIDGE_REQUIRED',
148
+ message: result.message || 'Drawing debug spheres requires Automation Bridge debug_shape handler',
187
149
  params: {
188
150
  center: params.center,
189
151
  radius: params.radius,
@@ -192,11 +154,9 @@ unreal.SystemLibrary.draw_debug_sphere(world, center, ${params.radius}, ${segmen
192
154
  duration,
193
155
  thickness
194
156
  }
195
- });
157
+ };
196
158
  }
197
159
 
198
- // The rest keep console-command fallbacks or editor helpers as before
199
-
200
160
  async drawDebugCapsule(params: {
201
161
  center: [number, number, number];
202
162
  halfHeight: number;
@@ -208,12 +168,24 @@ unreal.SystemLibrary.draw_debug_sphere(world, center, ${params.radius}, ${segmen
208
168
  const rotation = params.rotation || [0, 0, 0];
209
169
  const color = params.color || [255, 255, 0, 255];
210
170
  const duration = params.duration || 5.0;
211
- const [cx, cy, cz] = params.center;
212
- const [rp, ry, rr] = rotation;
213
- const [cr, cg, cb, ca] = color;
214
- const script = `\ncenter = unreal.Vector(${cx}, ${cy}, ${cz})\nrot = unreal.Rotator(${rp}, ${ry}, ${rr})\ncolor = unreal.LinearColor(${cr}/255.0, ${cg}/255.0, ${cb}/255.0, ${ca}/255.0)\nunreal.SystemLibrary.draw_debug_capsule(world, center, ${params.halfHeight}, ${params.radius}, rot, color, ${duration}, 1.0)\n`;
215
- return this.pyDraw(script, {
216
- action: 'debug_capsule',
171
+
172
+ const result = await this.useAutomationBridge('capsule', {
173
+ center: params.center,
174
+ halfHeight: params.halfHeight,
175
+ radius: params.radius,
176
+ rotation,
177
+ color,
178
+ duration
179
+ });
180
+
181
+ if (result.success) {
182
+ return result;
183
+ }
184
+
185
+ return {
186
+ success: false,
187
+ error: result.error || 'AUTOMATION_BRIDGE_REQUIRED',
188
+ message: result.message || 'Drawing debug capsules requires Automation Bridge debug_shape handler',
217
189
  params: {
218
190
  center: params.center,
219
191
  halfHeight: params.halfHeight,
@@ -222,7 +194,7 @@ unreal.SystemLibrary.draw_debug_sphere(world, center, ${params.radius}, ${segmen
222
194
  color,
223
195
  duration
224
196
  }
225
- });
197
+ };
226
198
  }
227
199
 
228
200
  async drawDebugCone(params: {
@@ -237,12 +209,26 @@ unreal.SystemLibrary.draw_debug_sphere(world, center, ${params.radius}, ${segmen
237
209
  }) {
238
210
  const color = params.color || [255, 0, 255, 255];
239
211
  const duration = params.duration || 5.0;
240
- const [ox, oy, oz] = params.origin;
241
- const [dx, dy, dz] = params.direction;
242
- const [cr, cg, cb, ca] = color;
243
- const script = `\norigin = unreal.Vector(${ox}, ${oy}, ${oz})\ndir = unreal.Vector(${dx}, ${dy}, ${dz})\ncolor = unreal.LinearColor(${cr}/255.0, ${cg}/255.0, ${cb}/255.0, ${ca}/255.0)\nunreal.SystemLibrary.draw_debug_cone(world, origin, dir, ${params.length}, ${params.angleWidth}, ${params.angleHeight}, ${params.numSides || 12}, color, ${duration}, 1.0)\n`;
244
- return this.pyDraw(script, {
245
- action: 'debug_cone',
212
+
213
+ const result = await this.useAutomationBridge('cone', {
214
+ origin: params.origin,
215
+ direction: params.direction,
216
+ length: params.length,
217
+ angleWidth: params.angleWidth,
218
+ angleHeight: params.angleHeight,
219
+ numSides: params.numSides || 12,
220
+ color,
221
+ duration
222
+ });
223
+
224
+ if (result.success) {
225
+ return result;
226
+ }
227
+
228
+ return {
229
+ success: false,
230
+ error: result.error || 'AUTOMATION_BRIDGE_REQUIRED',
231
+ message: result.message || 'Drawing debug cones requires Automation Bridge debug_shape handler',
246
232
  params: {
247
233
  origin: params.origin,
248
234
  direction: params.direction,
@@ -253,7 +239,7 @@ unreal.SystemLibrary.draw_debug_sphere(world, center, ${params.radius}, ${segmen
253
239
  color,
254
240
  duration
255
241
  }
256
- });
242
+ };
257
243
  }
258
244
 
259
245
  async drawDebugString(params: {
@@ -265,11 +251,23 @@ unreal.SystemLibrary.draw_debug_sphere(world, center, ${params.radius}, ${segmen
265
251
  }) {
266
252
  const color = params.color || [255, 255, 255, 255];
267
253
  const duration = params.duration || 5.0;
268
- const [x, y, z] = params.location;
269
- const [r, g, b, a] = color;
270
- const script = `\nloc = unreal.Vector(${x}, ${y}, ${z})\ncolor = unreal.LinearColor(${r}/255.0, ${g}/255.0, ${b}/255.0, ${a}/255.0)\nunreal.SystemLibrary.draw_debug_string(world, loc, "${params.text.replace(/"/g, '\\"')}", None, color, ${duration})\n`;
271
- return this.pyDraw(script, {
272
- action: 'debug_string',
254
+
255
+ const result = await this.useAutomationBridge('string', {
256
+ location: params.location,
257
+ text: params.text,
258
+ color,
259
+ duration,
260
+ fontSize: params.fontSize
261
+ });
262
+
263
+ if (result.success) {
264
+ return result;
265
+ }
266
+
267
+ return {
268
+ success: false,
269
+ error: result.error || 'AUTOMATION_BRIDGE_REQUIRED',
270
+ message: result.message || 'Drawing debug strings requires Automation Bridge debug_shape handler',
273
271
  params: {
274
272
  location: params.location,
275
273
  text: params.text,
@@ -277,7 +275,7 @@ unreal.SystemLibrary.draw_debug_sphere(world, center, ${params.radius}, ${segmen
277
275
  duration,
278
276
  fontSize: params.fontSize
279
277
  }
280
- });
278
+ };
281
279
  }
282
280
 
283
281
  async drawDebugArrow(params: {
@@ -291,12 +289,24 @@ unreal.SystemLibrary.draw_debug_sphere(world, center, ${params.radius}, ${segmen
291
289
  const color = params.color || [0, 255, 255, 255];
292
290
  const duration = params.duration || 5.0;
293
291
  const thickness = params.thickness || 2.0;
294
- const [sx, sy, sz] = params.start;
295
- const [ex, ey, ez] = params.end;
296
- const [r, g, b, a] = color;
297
- const script = `\nstart = unreal.Vector(${sx}, ${sy}, ${sz})\nend = unreal.Vector(${ex}, ${ey}, ${ez})\ncolor = unreal.LinearColor(${r}/255.0, ${g}/255.0, ${b}/255.0, ${a}/255.0)\nunreal.SystemLibrary.draw_debug_arrow(world, start, end, ${params.arrowSize || 10.0}, color, ${duration}, ${thickness})\n`;
298
- return this.pyDraw(script, {
299
- action: 'debug_arrow',
292
+
293
+ const result = await this.useAutomationBridge('arrow', {
294
+ start: params.start,
295
+ end: params.end,
296
+ arrowSize: params.arrowSize || 10.0,
297
+ color,
298
+ duration,
299
+ thickness
300
+ });
301
+
302
+ if (result.success) {
303
+ return result;
304
+ }
305
+
306
+ return {
307
+ success: false,
308
+ error: result.error || 'AUTOMATION_BRIDGE_REQUIRED',
309
+ message: result.message || 'Drawing debug arrows requires Automation Bridge debug_shape handler',
300
310
  params: {
301
311
  start: params.start,
302
312
  end: params.end,
@@ -305,7 +315,7 @@ unreal.SystemLibrary.draw_debug_sphere(world, center, ${params.radius}, ${segmen
305
315
  duration,
306
316
  thickness
307
317
  }
308
- });
318
+ };
309
319
  }
310
320
 
311
321
  async drawDebugPoint(params: {
@@ -317,18 +327,29 @@ unreal.SystemLibrary.draw_debug_sphere(world, center, ${params.radius}, ${segmen
317
327
  const size = params.size || 10.0;
318
328
  const color = params.color || [255, 255, 255, 255];
319
329
  const duration = params.duration || 5.0;
320
- const [x, y, z] = params.location;
321
- const [r, g, b, a] = color;
322
- const script = `\nloc = unreal.Vector(${x}, ${y}, ${z})\ncolor = unreal.LinearColor(${r}/255.0, ${g}/255.0, ${b}/255.0, ${a}/255.0)\nunreal.SystemLibrary.draw_debug_point(world, loc, ${size}, color, ${duration})\n`;
323
- return this.pyDraw(script, {
324
- action: 'debug_point',
330
+
331
+ const result = await this.useAutomationBridge('point', {
332
+ location: params.location,
333
+ size,
334
+ color,
335
+ duration
336
+ });
337
+
338
+ if (result.success) {
339
+ return result;
340
+ }
341
+
342
+ return {
343
+ success: false,
344
+ error: result.error || 'AUTOMATION_BRIDGE_REQUIRED',
345
+ message: result.message || 'Drawing debug points requires Automation Bridge debug_shape handler',
325
346
  params: {
326
347
  location: params.location,
327
348
  size,
328
349
  color,
329
350
  duration
330
351
  }
331
- });
352
+ };
332
353
  }
333
354
 
334
355
  async drawDebugCoordinateSystem(params: {
@@ -338,12 +359,15 @@ unreal.SystemLibrary.draw_debug_sphere(world, center, ${params.radius}, ${segmen
338
359
  duration?: number;
339
360
  thickness?: number;
340
361
  }) {
341
- const rotation = params.rotation || [0, 0, 0];
342
- const scale = params.scale || 100.0;
343
- const duration = params.duration || 5.0;
344
- const thickness = params.thickness || 2.0;
345
- const command = `DrawDebugCoordinateSystem ${params.location.join(' ')} ${rotation.join(' ')} ${scale} ${duration} ${thickness}`;
346
- return this.bridge.executeConsoleCommand(command);
362
+ const result = await this.useAutomationBridge('coordinate_system', {
363
+ location: params.location,
364
+ rotation: params.rotation || [0, 0, 0],
365
+ scale: params.scale || 1.0,
366
+ duration: params.duration || 5.0,
367
+ thickness: params.thickness || 1.0
368
+ });
369
+
370
+ return result;
347
371
  }
348
372
 
349
373
  async drawDebugFrustum(params: {
@@ -361,12 +385,26 @@ unreal.SystemLibrary.draw_debug_sphere(world, center, ${params.radius}, ${segmen
361
385
  const farPlane = params.farPlane || 1000.0;
362
386
  const color = params.color || [128, 128, 255, 255];
363
387
  const duration = params.duration || 5.0;
364
- const [ox, oy, oz] = params.origin;
365
- const [rp, ry, rr] = params.rotation;
366
- const [r, g, b, a] = color;
367
- const script = `\norigin = unreal.Vector(${ox}, ${oy}, ${oz})\nrot = unreal.Rotator(${rp}, ${ry}, ${rr})\ncolor = unreal.LinearColor(${r}/255.0, ${g}/255.0, ${b}/255.0, ${a}/255.0)\nunreal.SystemLibrary.draw_debug_frustum(world, origin, rot, ${params.fov}, ${aspectRatio}, ${nearPlane}, ${farPlane}, color, ${duration})\n`;
368
- return this.pyDraw(script, {
369
- action: 'debug_frustum',
388
+
389
+ const result = await this.useAutomationBridge('frustum', {
390
+ origin: params.origin,
391
+ rotation: params.rotation,
392
+ fov: params.fov,
393
+ aspectRatio,
394
+ nearPlane,
395
+ farPlane,
396
+ color,
397
+ duration
398
+ });
399
+
400
+ if (result.success) {
401
+ return result;
402
+ }
403
+
404
+ return {
405
+ success: false,
406
+ error: result.error || 'AUTOMATION_BRIDGE_REQUIRED',
407
+ message: result.message || 'Drawing debug frustums requires Automation Bridge debug_shape handler',
370
408
  params: {
371
409
  origin: params.origin,
372
410
  rotation: params.rotation,
@@ -377,10 +415,17 @@ unreal.SystemLibrary.draw_debug_sphere(world, center, ${params.radius}, ${segmen
377
415
  color,
378
416
  duration
379
417
  }
380
- });
418
+ };
381
419
  }
382
420
 
383
421
  async clearDebugDrawings() {
422
+ if (this.automationBridge) {
423
+ const response = await this.automationBridge.sendAutomationRequest('clear_debug_shapes', {});
424
+ if (response.success) {
425
+ return response;
426
+ }
427
+ }
428
+
384
429
  return this.bridge.executeConsoleCommand('FlushPersistentDebugLines');
385
430
  }
386
431
 
@@ -388,7 +433,7 @@ unreal.SystemLibrary.draw_debug_sphere(world, center, ${params.radius}, ${segmen
388
433
  enabled: boolean;
389
434
  type?: 'Simple' | 'Complex' | 'Both';
390
435
  }) {
391
- const commands: string[] = [];
436
+ const commands: string[] = [];
392
437
  if (params.enabled) {
393
438
  const typeCmd = params.type === 'Simple' ? '1' : params.type === 'Complex' ? '2' : '3';
394
439
  commands.push(`show Collision ${typeCmd}`);
@@ -429,7 +474,7 @@ unreal.SystemLibrary.draw_debug_sphere(world, center, ${params.radius}, ${segmen
429
474
  ];
430
475
  if (UNSAFE_VIEWMODES.includes(params.mode)) {
431
476
  console.error(`⚠️ Viewmode '${params.mode}' may be unstable in some UE configurations.`);
432
- try { await this.bridge.executeConsoleCommand('stop'); } catch {}
477
+ try { await this.bridge.executeConsoleCommand('stop'); } catch { }
433
478
  await new Promise(resolve => setTimeout(resolve, 100));
434
479
  }
435
480
 
@@ -471,12 +516,31 @@ unreal.SystemLibrary.draw_debug_sphere(world, center, ${params.radius}, ${segmen
471
516
  const color = params.color || [255, 128, 0, 255];
472
517
  const duration = params.duration || 5.0;
473
518
  const thickness = params.thickness || 2.0;
474
- for (let i = 0; i < params.points.length - 1; i++) {
475
- const start = params.points[i];
476
- const end = params.points[i + 1];
477
- await this.drawDebugLine({ start, end, color, duration, thickness });
519
+
520
+ // Try Automation Bridge for path drawing
521
+ const result = await this.useAutomationBridge('path', {
522
+ points: params.points,
523
+ color,
524
+ duration,
525
+ thickness
526
+ });
527
+
528
+ if (result.success) {
529
+ return result;
478
530
  }
479
- return { success: true, message: `Debug path drawn with ${params.points.length} points` };
531
+
532
+ // If Automation Bridge is unavailable or fails, do not claim success
533
+ return {
534
+ success: false,
535
+ error: result.error || 'AUTOMATION_BRIDGE_REQUIRED',
536
+ message: result.message || 'Drawing debug paths requires Automation Bridge debug_shape handler',
537
+ params: {
538
+ points: params.points,
539
+ color,
540
+ duration,
541
+ thickness
542
+ }
543
+ };
480
544
  }
481
545
 
482
546
  async showNavigationMesh(params: { enabled: boolean; }) {
@@ -492,18 +556,59 @@ unreal.SystemLibrary.draw_debug_sphere(world, center, ${params.radius}, ${segmen
492
556
  color?: [number, number, number, number];
493
557
  }) {
494
558
  if (params.enabled && params.message) {
495
- const key = params.key || -1;
496
- const duration = params.duration || 5.0;
497
- const color = params.color || [255, 255, 255, 255];
498
- const command = `ke * DisplayDebugMessage ${key} "${params.message}" ${duration} ${color.join(' ')}`;
499
- return this.bridge.executeConsoleCommand(command);
500
- } else {
501
- return this.bridge.executeConsoleCommand('DisableAllScreenMessages');
559
+ // Use Automation Bridge for on-screen messages
560
+ const result = await this.useAutomationBridge('message', {
561
+ message: params.message,
562
+ duration: params.duration || 5.0,
563
+ color: params.color || [255, 255, 255, 255]
564
+ });
565
+
566
+ if (result.success) {
567
+ return result;
568
+ }
569
+
570
+ return {
571
+ success: false,
572
+ error: 'AUTOMATION_BRIDGE_REQUIRED',
573
+ message: 'Showing on-screen messages requires Automation Bridge'
574
+ };
502
575
  }
576
+
577
+ const command = params.enabled ? 'EnableAllScreenMessages' : 'DisableAllScreenMessages';
578
+ return this.bridge.executeConsoleCommand(command);
503
579
  }
504
580
 
505
581
  async showSkeletalMeshBones(params: { actorName: string; enabled: boolean; }) {
506
- const command = params.enabled ? `ShowDebugSkelMesh ${params.actorName}` : `HideDebugSkelMesh ${params.actorName}`;
507
- return this.bridge.executeConsoleCommand(command);
582
+ // Use Automation Bridge for skeletal mesh visualization
583
+ const result = await this.useAutomationBridge('skeletal_meshes', {
584
+ actorName: params.actorName,
585
+ enabled: params.enabled
586
+ });
587
+
588
+ if (result.success) {
589
+ return result;
590
+ }
591
+
592
+ return {
593
+ success: false,
594
+ error: 'AUTOMATION_BRIDGE_REQUIRED',
595
+ message: 'Showing skeletal mesh bones requires Automation Bridge'
596
+ };
597
+ }
598
+
599
+ async clearDebugShapes() {
600
+ if (this.automationBridge) {
601
+ const response = await this.automationBridge.sendAutomationRequest('clear_debug_shapes', {});
602
+ if (response.success) {
603
+ return response;
604
+ }
605
+ }
606
+
607
+ try {
608
+ await this.bridge.executeConsoleCommand('FlushPersistentDebugLines');
609
+ return { success: true, message: 'Debug shapes cleared' };
610
+ } catch (err) {
611
+ return { success: false, error: `Failed to clear debug shapes: ${err}` };
612
+ }
508
613
  }
509
614
  }