unreal-engine-mcp-server 0.4.7 → 0.5.1

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