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,11 +1,28 @@
1
- import { coerceBoolean, coerceNumber, interpretStandardResult } from '../utils/result-helpers.js';
1
+ import { Logger } from '../utils/logger.js';
2
2
  export class PerformanceTools {
3
3
  bridge;
4
- constructor(bridge) {
4
+ log = new Logger('PerformanceTools');
5
+ automationBridge;
6
+ constructor(bridge, automationBridge) {
5
7
  this.bridge = bridge;
8
+ this.automationBridge = automationBridge;
9
+ }
10
+ setAutomationBridge(automationBridge) {
11
+ this.automationBridge = automationBridge;
6
12
  }
7
- // Start profiling
8
13
  async startProfiling(params) {
14
+ if (this.automationBridge) {
15
+ try {
16
+ const response = await this.automationBridge.sendAutomationRequest('start_profiling', {
17
+ type: params.type,
18
+ duration: params.duration
19
+ });
20
+ if (response.success)
21
+ return { success: true, message: `${params.type} profiling started (bridge)` };
22
+ }
23
+ catch (_e) {
24
+ }
25
+ }
9
26
  const commands = [];
10
27
  switch (params.type) {
11
28
  case 'CPU':
@@ -35,8 +52,16 @@ export class PerformanceTools {
35
52
  await this.bridge.executeConsoleCommands(commands);
36
53
  return { success: true, message: `${params.type} profiling started` };
37
54
  }
38
- // Stop profiling
39
55
  async stopProfiling() {
56
+ if (this.automationBridge) {
57
+ try {
58
+ const response = await this.automationBridge.sendAutomationRequest('stop_profiling', {});
59
+ if (response.success)
60
+ return { success: true, message: 'Profiling stopped (bridge)' };
61
+ }
62
+ catch (_e) {
63
+ }
64
+ }
40
65
  const commands = [
41
66
  'stat stopfile',
42
67
  'stat none'
@@ -44,19 +69,32 @@ export class PerformanceTools {
44
69
  await this.bridge.executeConsoleCommands(commands);
45
70
  return { success: true, message: 'Profiling stopped' };
46
71
  }
47
- // Show FPS
48
72
  async showFPS(params) {
49
73
  const startTime = Date.now();
50
- console.log('[PerformanceTools] Starting showFPS with params:', params);
74
+ this.log.debug('Starting showFPS with params:', params);
75
+ if (this.automationBridge) {
76
+ try {
77
+ const response = await this.automationBridge.sendAutomationRequest('show_fps', {
78
+ enabled: params.enabled,
79
+ verbose: params.verbose
80
+ });
81
+ if (response.success)
82
+ return {
83
+ success: true,
84
+ message: params.enabled ? 'FPS display enabled (bridge)' : 'FPS display disabled (bridge)',
85
+ fpsVisible: params.enabled
86
+ };
87
+ }
88
+ catch (_e) {
89
+ }
90
+ }
51
91
  try {
52
- // Use stat fps as requested - shows FPS counter
53
- // For more detailed timing info, use 'stat unit' instead
54
92
  const command = params.enabled
55
93
  ? (params.verbose ? 'stat unit' : 'stat fps')
56
94
  : 'stat none';
57
- console.log(`[PerformanceTools] Executing command: ${command}`);
95
+ this.log.debug(`Executing command: ${command}`);
58
96
  await this.bridge.executeConsoleCommand(command);
59
- console.log(`[PerformanceTools] Command completed in ${Date.now() - startTime}ms`);
97
+ this.log.debug(`Command completed in ${Date.now() - startTime}ms`);
60
98
  return {
61
99
  success: true,
62
100
  message: params.enabled ? 'FPS display enabled' : 'FPS display disabled',
@@ -72,17 +110,37 @@ export class PerformanceTools {
72
110
  };
73
111
  }
74
112
  }
75
- // Show performance stats
76
113
  async showStats(params) {
114
+ if (this.automationBridge) {
115
+ try {
116
+ const response = await this.automationBridge.sendAutomationRequest('show_stats', {
117
+ category: params.category,
118
+ enabled: params.enabled
119
+ });
120
+ if (response.success)
121
+ return { success: true, message: `Stat '${params.category}' configured (bridge)` };
122
+ }
123
+ catch (_e) {
124
+ }
125
+ }
77
126
  const command = params.enabled
78
127
  ? `stat ${params.category.toLowerCase()}`
79
128
  : 'stat none';
80
129
  return this.bridge.executeConsoleCommand(command);
81
130
  }
82
- // Set scalability settings using console commands
83
131
  async setScalability(params) {
84
- // Map incoming category to the base name expected by "sg.<Base>Quality"
85
- // Note: Several CVars use singular form (Shadow/Texture/Reflection)
132
+ if (this.automationBridge) {
133
+ try {
134
+ const response = await this.automationBridge.sendAutomationRequest('set_scalability', {
135
+ category: params.category,
136
+ level: params.level
137
+ });
138
+ if (response.success)
139
+ return { success: true, message: `${params.category} quality set to level ${params.level} (bridge)` };
140
+ }
141
+ catch (_e) {
142
+ }
143
+ }
86
144
  const categoryBaseMap = {
87
145
  ViewDistance: 'ViewDistance',
88
146
  AntiAliasing: 'AntiAliasing',
@@ -104,98 +162,35 @@ export class PerformanceTools {
104
162
  };
105
163
  }
106
164
  const base = categoryBaseMap[params.category] || params.category;
107
- // Use direct console command to set with highest priority (SetByConsole)
108
- // This avoids conflicts with the scalability system
109
165
  const setCommand = `sg.${base}Quality ${requestedLevel}`;
110
- // Apply the console command directly
111
166
  await this.bridge.executeConsoleCommand(setCommand);
112
- // Skip GameUserSettings entirely to avoid any scalability triggers
113
- // Console command already applied with correct priority
114
- /* eslint-disable no-useless-escape */
115
- const py = `
116
- import unreal, json
117
- result = {'success': True, 'category': '${base}', 'requested': ${requestedLevel}, 'actual': ${requestedLevel}, 'method': 'ConsoleOnly'}
118
-
119
- # Simply verify the console variable was set correctly
120
- try:
121
- # Try to read the console variable directly to verify it was set
122
- # This doesn't trigger any scalability system
123
- import sys
124
- from io import StringIO
125
-
126
- # Capture console output
127
- old_stdout = sys.stdout
128
- sys.stdout = StringIO()
129
-
130
- # Execute console command to query the value
131
- try:
132
- unreal.SystemLibrary.execute_console_command(None, 'sg.${base}Quality', None)
133
- except:
134
- pass
135
-
136
- # Get the output
137
- console_output = sys.stdout.getvalue()
138
- sys.stdout = old_stdout
139
-
140
- # Parse the output to get the actual value
141
- if 'sg.${base}Quality' in console_output:
142
- # Extract the value from output like 'sg.ShadowQuality = "3"'
143
- import re
144
- match = re.search(r'sg\.${base}Quality\\s*=\\s*"(\\d+)"', console_output)
145
- if match:
146
- result['actual'] = int(match.group(1))
147
- result['verified'] = True
148
-
149
- result['method'] = 'ConsoleOnly'
150
- except Exception as e:
151
- # Even on error, the console command was applied
152
- result['method'] = 'ConsoleOnly'
153
- result['note'] = str(e)
154
-
155
- print('RESULT:' + json.dumps(result))
156
- `.trim();
157
- /* eslint-enable no-useless-escape */
158
- // Always try to apply through Python for consistency
159
- try {
160
- const pyResp = await this.bridge.executePython(py);
161
- const interpreted = interpretStandardResult(pyResp, {
162
- successMessage: `${params.category} quality set to level ${requestedLevel}`,
163
- failureMessage: `Failed to set ${params.category} quality`
164
- });
165
- if (interpreted.success) {
166
- const actual = coerceNumber(interpreted.payload.actual) ?? requestedLevel;
167
- const verified = coerceBoolean(interpreted.payload.success, true) === true && actual === requestedLevel;
168
- return {
169
- success: true,
170
- message: interpreted.message,
171
- verified,
172
- readback: actual,
173
- method: interpreted.payload.method || 'ConsoleOnly'
174
- };
175
- }
176
- }
177
- catch {
178
- // Ignore Python errors and fall through
179
- }
180
- // If Python fails, the console command was still applied
181
167
  return {
182
168
  success: true,
183
169
  message: `${params.category} quality set to level ${requestedLevel}`,
184
- method: 'CVarOnly'
170
+ method: 'Console'
185
171
  };
186
172
  }
187
- // Set resolution scale
188
173
  async setResolutionScale(params) {
189
- // Validate input
190
174
  if (params.scale === undefined || params.scale === null || isNaN(params.scale)) {
191
175
  return { success: false, error: 'Invalid scale parameter' };
192
176
  }
193
- // Clamp scale between 10% (0.1) and 200% (2.0) - Unreal Engine limits
194
- // Note: r.ScreenPercentage takes values from 10 to 200, not 0.5 to 2.0
195
- const clampedScale = Math.max(0.1, Math.min(2.0, params.scale));
196
- const percentage = Math.round(clampedScale * 100);
197
- // Ensure percentage is within Unreal's valid range
177
+ let percentage;
178
+ if (params.scale >= 10) {
179
+ percentage = Math.round(params.scale);
180
+ }
181
+ else {
182
+ percentage = Math.round(params.scale * 100);
183
+ }
198
184
  const finalPercentage = Math.max(10, Math.min(200, percentage));
185
+ if (this.automationBridge) {
186
+ try {
187
+ const response = await this.automationBridge.sendAutomationRequest('set_resolution_scale', { scale: finalPercentage });
188
+ if (response.success)
189
+ return { success: true, message: `Resolution scale set to ${finalPercentage}% (bridge)`, actualScale: finalPercentage / 100 };
190
+ }
191
+ catch (_e) {
192
+ }
193
+ }
199
194
  const command = `r.ScreenPercentage ${finalPercentage}`;
200
195
  try {
201
196
  await this.bridge.executeConsoleCommand(command);
@@ -209,23 +204,53 @@ print('RESULT:' + json.dumps(result))
209
204
  return { success: false, error: `Failed to set resolution scale: ${e}` };
210
205
  }
211
206
  }
212
- // Enable/disable vsync
213
207
  async setVSync(params) {
208
+ if (this.automationBridge) {
209
+ try {
210
+ const response = await this.automationBridge.sendAutomationRequest('set_vsync', { enabled: params.enabled });
211
+ if (response.success)
212
+ return { success: true, message: 'VSync configured (bridge)' };
213
+ }
214
+ catch (_e) {
215
+ }
216
+ }
214
217
  const command = `r.VSync ${params.enabled ? 1 : 0}`;
215
218
  return this.bridge.executeConsoleCommand(command);
216
219
  }
217
- // Set frame rate limit
218
220
  async setFrameRateLimit(params) {
221
+ if (this.automationBridge) {
222
+ try {
223
+ const response = await this.automationBridge.sendAutomationRequest('set_frame_rate_limit', { maxFPS: params.maxFPS });
224
+ if (response.success)
225
+ return { success: true, message: 'Max FPS set (bridge)' };
226
+ }
227
+ catch (_e) {
228
+ }
229
+ }
219
230
  const command = `t.MaxFPS ${params.maxFPS}`;
220
231
  return this.bridge.executeConsoleCommand(command);
221
232
  }
222
- // Enable GPU timing
223
233
  async enableGPUTiming(params) {
224
234
  const command = `r.GPUStatsEnabled ${params.enabled ? 1 : 0}`;
225
235
  return this.bridge.executeConsoleCommand(command);
226
236
  }
227
- // Memory report
228
237
  async generateMemoryReport(params) {
238
+ if (this.automationBridge) {
239
+ try {
240
+ const response = await this.automationBridge.sendAutomationRequest('generate_memory_report', {
241
+ detailed: params.detailed ?? false,
242
+ outputPath: params.outputPath
243
+ });
244
+ if (response.success) {
245
+ return { success: true, message: response.message || 'Memory report generated' };
246
+ }
247
+ }
248
+ catch (error) {
249
+ if (params.outputPath) {
250
+ return { success: false, error: `Failed to generate memory report: ${error instanceof Error ? error.message : String(error)}` };
251
+ }
252
+ }
253
+ }
229
254
  const commands = [];
230
255
  if (params.detailed) {
231
256
  commands.push('memreport -full');
@@ -234,43 +259,67 @@ print('RESULT:' + json.dumps(result))
234
259
  commands.push('memreport');
235
260
  }
236
261
  if (params.outputPath) {
237
- commands.push(`obj savepackage ${params.outputPath}`);
262
+ throw new Error('Saving memreport to a file requires Automation Bridge support');
238
263
  }
239
264
  await this.bridge.executeConsoleCommands(commands);
240
265
  return { success: true, message: 'Memory report generated' };
241
266
  }
242
- // Texture streaming
243
267
  async configureTextureStreaming(params) {
268
+ if (this.automationBridge) {
269
+ try {
270
+ const response = await this.automationBridge.sendAutomationRequest('configure_texture_streaming', {
271
+ enabled: params.enabled,
272
+ poolSize: params.poolSize,
273
+ boostPlayerLocation: params.boostPlayerLocation
274
+ });
275
+ if (response.success)
276
+ return { success: true, message: response.message || 'Texture streaming configured (bridge)' };
277
+ }
278
+ catch (_error) {
279
+ }
280
+ }
281
+ if (params.boostPlayerLocation && !this.automationBridge) {
282
+ throw new Error('Boosting player location for streaming requires Automation Bridge support');
283
+ }
244
284
  const commands = [];
245
285
  commands.push(`r.TextureStreaming ${params.enabled ? 1 : 0}`);
246
286
  if (params.poolSize !== undefined) {
247
287
  commands.push(`r.Streaming.PoolSize ${params.poolSize}`);
248
288
  }
249
- if (params.boostPlayerLocation !== undefined) {
250
- commands.push(`r.Streaming.UseFixedPoolSize ${params.boostPlayerLocation ? 1 : 0}`);
251
- }
252
289
  await this.bridge.executeConsoleCommands(commands);
253
290
  return { success: true, message: 'Texture streaming configured' };
254
291
  }
255
- // LOD settings
256
292
  async configureLOD(params) {
293
+ if (this.automationBridge) {
294
+ try {
295
+ const response = await this.automationBridge.sendAutomationRequest('configure_lod', {
296
+ forceLOD: params.forceLOD,
297
+ lodBias: params.lodBias
298
+ });
299
+ if (params.distanceScale !== undefined) {
300
+ await this.bridge.executeConsoleCommand(`r.StaticMeshLODDistanceScale ${params.distanceScale}`);
301
+ await this.bridge.executeConsoleCommand(`r.SkeletalMeshLODDistanceScale ${params.distanceScale}`);
302
+ }
303
+ if (response.success)
304
+ return { success: true, message: 'LOD settings configured' };
305
+ }
306
+ catch (_e) {
307
+ }
308
+ }
257
309
  const commands = [];
258
310
  if (params.forceLOD !== undefined) {
259
311
  commands.push(`r.ForceLOD ${params.forceLOD}`);
260
312
  }
261
313
  if (params.lodBias !== undefined) {
262
- // Skeletal mesh LOD bias is an integer bias value
263
314
  commands.push(`r.SkeletalMeshLODBias ${params.lodBias}`);
264
315
  }
265
316
  if (params.distanceScale !== undefined) {
266
- // Apply distance scale to both static and skeletal meshes
267
317
  commands.push(`r.StaticMeshLODDistanceScale ${params.distanceScale}`);
268
318
  commands.push(`r.SkeletalMeshLODDistanceScale ${params.distanceScale}`);
269
319
  }
270
320
  await this.bridge.executeConsoleCommands(commands);
271
321
  return { success: true, message: 'LOD settings configured' };
272
322
  }
273
- // Apply a baseline performance profile (explicit CVar enforcement)
274
323
  async applyBaselinePerformanceSettings(params) {
275
324
  const p = {
276
325
  distanceScale: params?.distanceScale ?? 1.0,
@@ -290,32 +339,51 @@ print('RESULT:' + json.dumps(result))
290
339
  await this.bridge.executeConsoleCommands(commands);
291
340
  return { success: true, message: 'Baseline performance settings applied', params: p };
292
341
  }
293
- // Draw call optimization
294
342
  async optimizeDrawCalls(params) {
343
+ if (params.mergeActors) {
344
+ if (this.automationBridge) {
345
+ try {
346
+ const actors = Array.isArray(params.actors)
347
+ ? params.actors.filter((name) => typeof name === 'string' && name.length > 0)
348
+ : undefined;
349
+ if (!actors || actors.length < 2) {
350
+ return {
351
+ success: false,
352
+ error: 'Merge actors requires an "actors" array with at least 2 valid actor names.'
353
+ };
354
+ }
355
+ const payload = {
356
+ enableInstancing: params.enableInstancing,
357
+ mergeActors: params.mergeActors,
358
+ actors: actors
359
+ };
360
+ const response = await this.automationBridge.sendAutomationRequest('merge_actors', payload);
361
+ return response.success
362
+ ? { success: true, message: response.message || 'Actors merged for optimization' }
363
+ : { success: false, error: response.message || response.error || 'Failed to merge actors' };
364
+ }
365
+ catch (error) {
366
+ return { success: false, error: `Failed to merge actors: ${error instanceof Error ? error.message : String(error)}` };
367
+ }
368
+ }
369
+ throw new Error('Actor merging requires Automation Bridge support');
370
+ }
295
371
  const commands = [];
296
372
  if (params.enableInstancing !== undefined) {
297
373
  commands.push(`r.MeshDrawCommands.DynamicInstancing ${params.enableInstancing ? 1 : 0}`);
298
374
  }
299
- // Avoid using r.RHICmdBypass; it's a low-level debug toggle and not suitable for general batching control
300
- if (params.mergeActors) {
301
- commands.push('MergeActors');
302
- }
303
375
  await this.bridge.executeConsoleCommands(commands);
304
376
  return { success: true, message: 'Draw call optimization configured' };
305
377
  }
306
- // Occlusion culling
307
378
  async configureOcclusionCulling(params) {
308
379
  const commands = [];
309
- // Enable/disable HZB occlusion (boolean)
310
380
  commands.push(`r.HZBOcclusion ${params.enabled ? 1 : 0}`);
311
- // Optional freeze rendering toggle
312
381
  if (params.freezeRendering !== undefined) {
313
382
  commands.push(`FreezeRendering ${params.freezeRendering ? 1 : 0}`);
314
383
  }
315
384
  await this.bridge.executeConsoleCommands(commands);
316
385
  return { success: true, message: 'Occlusion culling configured' };
317
386
  }
318
- // Shader compilation
319
387
  async optimizeShaders(params) {
320
388
  const commands = [];
321
389
  if (params.compileOnDemand !== undefined) {
@@ -330,8 +398,26 @@ print('RESULT:' + json.dumps(result))
330
398
  await this.bridge.executeConsoleCommands(commands);
331
399
  return { success: true, message: 'Shader optimization configured' };
332
400
  }
333
- // Nanite settings
334
401
  async configureNanite(params) {
402
+ if (this.automationBridge) {
403
+ try {
404
+ const response = await this.automationBridge.sendAutomationRequest('configure_nanite', {
405
+ enabled: params.enabled,
406
+ maxPixelsPerEdge: params.maxPixelsPerEdge,
407
+ streamingPoolSize: params.streamingPoolSize
408
+ });
409
+ if (params.maxPixelsPerEdge !== undefined) {
410
+ await this.bridge.executeConsoleCommand(`r.Nanite.MaxPixelsPerEdge ${params.maxPixelsPerEdge}`);
411
+ }
412
+ if (params.streamingPoolSize !== undefined) {
413
+ await this.bridge.executeConsoleCommand(`r.Nanite.StreamingPoolSize ${params.streamingPoolSize}`);
414
+ }
415
+ if (response.success)
416
+ return { success: true, message: 'Nanite configured' };
417
+ }
418
+ catch (_e) {
419
+ }
420
+ }
335
421
  const commands = [];
336
422
  commands.push(`r.Nanite ${params.enabled ? 1 : 0}`);
337
423
  if (params.maxPixelsPerEdge !== undefined) {
@@ -343,7 +429,6 @@ print('RESULT:' + json.dumps(result))
343
429
  await this.bridge.executeConsoleCommands(commands);
344
430
  return { success: true, message: 'Nanite configured' };
345
431
  }
346
- // World Partition streaming
347
432
  async configureWorldPartition(params) {
348
433
  const commands = [];
349
434
  commands.push(`wp.Runtime.EnableStreaming ${params.enabled ? 1 : 0}`);
@@ -356,14 +441,10 @@ print('RESULT:' + json.dumps(result))
356
441
  await this.bridge.executeConsoleCommands(commands);
357
442
  return { success: true, message: 'World Partition configured' };
358
443
  }
359
- // Benchmark
360
444
  async runBenchmark(params) {
361
445
  const duration = params.duration || 60;
362
- // Start recording and GPU profiling
363
446
  await this.bridge.executeConsoleCommands(['stat startfile', 'profilegpu']);
364
- // Wait for the requested duration
365
447
  await new Promise(resolve => setTimeout(resolve, duration * 1000));
366
- // Stop recording and clear stats
367
448
  await this.bridge.executeConsoleCommands(['stat stopfile', 'stat none']);
368
449
  return { success: true, message: `Benchmark completed for ${duration} seconds` };
369
450
  }
@@ -1,18 +1,11 @@
1
1
  import { UnrealBridge } from '../unreal-bridge.js';
2
+ import { AutomationBridge } from '../automation/index.js';
2
3
  export declare class PhysicsTools {
3
4
  private bridge;
4
- constructor(bridge: UnrealBridge);
5
- /**
6
- * Helper to find a valid skeletal mesh in the project
7
- */
5
+ private automationBridge?;
6
+ constructor(bridge: UnrealBridge, automationBridge?: AutomationBridge | undefined);
7
+ setAutomationBridge(automationBridge?: AutomationBridge): void;
8
8
  private findValidSkeletalMesh;
9
- /**
10
- * Setup Ragdoll Physics
11
- * NOTE: Requires a valid skeletal mesh to create physics asset
12
- * @param skeletonPath - Path to an existing skeletal mesh asset (required)
13
- * @param physicsAssetName - Name for the new physics asset
14
- * @param savePath - Directory to save the asset (default: /Game/Physics)
15
- */
16
9
  setupRagdoll(params: {
17
10
  skeletonPath: string;
18
11
  physicsAssetName: string;
@@ -27,35 +20,7 @@ export declare class PhysicsTools {
27
20
  twist?: number;
28
21
  };
29
22
  }>;
30
- }): Promise<{
31
- success: true;
32
- message: string;
33
- path: string;
34
- existingAsset?: boolean;
35
- warnings?: string[];
36
- details?: string[];
37
- } | {
38
- success: boolean;
39
- message: string;
40
- error: string | undefined;
41
- warnings?: undefined;
42
- details?: undefined;
43
- } | {
44
- success: false;
45
- message: string;
46
- error: string;
47
- warnings: string[] | undefined;
48
- details: string[] | undefined;
49
- } | {
50
- success: boolean;
51
- error: string;
52
- message?: undefined;
53
- warnings?: undefined;
54
- details?: undefined;
55
- }>;
56
- /**
57
- * Create Physics Constraint
58
- */
23
+ }): Promise<any>;
59
24
  createConstraint(params: {
60
25
  name: string;
61
26
  actor1: string;
@@ -78,9 +43,6 @@ export declare class PhysicsTools {
78
43
  error: string;
79
44
  message?: undefined;
80
45
  }>;
81
- /**
82
- * Setup Chaos Destruction
83
- */
84
46
  setupDestruction(params: {
85
47
  meshPath: string;
86
48
  destructionName: string;
@@ -103,9 +65,6 @@ export declare class PhysicsTools {
103
65
  message?: undefined;
104
66
  path?: undefined;
105
67
  }>;
106
- /**
107
- * Configure Vehicle Physics
108
- */
109
68
  configureVehicle(params: {
110
69
  vehicleName: string;
111
70
  vehicleType: 'Car' | 'Bike' | 'Tank' | 'Aircraft';
@@ -125,46 +84,27 @@ export declare class PhysicsTools {
125
84
  gears: number[];
126
85
  finalDriveRatio: number;
127
86
  };
87
+ pluginDependencies?: string[];
128
88
  }): Promise<{
129
89
  success: boolean;
90
+ error: string;
91
+ missingPlugins: string[];
130
92
  message: string;
131
- error?: undefined;
93
+ warnings?: undefined;
132
94
  } | {
133
95
  success: boolean;
134
- error: string;
135
- message?: undefined;
96
+ message: string;
97
+ warnings: string[];
98
+ error?: undefined;
99
+ missingPlugins?: undefined;
136
100
  }>;
137
- /**
138
- * Apply Force or Impulse to Actor
139
- */
140
101
  applyForce(params: {
141
102
  actorName: string;
142
103
  forceType: 'Force' | 'Impulse' | 'Velocity' | 'Torque';
143
104
  vector: [number, number, number];
144
105
  boneName?: string;
145
106
  isLocal?: boolean;
146
- }): Promise<{
147
- success: boolean;
148
- message: string;
149
- availableActors: string[] | undefined;
150
- details: string[] | undefined;
151
- error?: undefined;
152
- } | {
153
- success: boolean;
154
- error: string;
155
- availableActors: string[] | undefined;
156
- details: string[] | undefined;
157
- message?: undefined;
158
- } | {
159
- success: boolean;
160
- error: string;
161
- message?: undefined;
162
- availableActors?: undefined;
163
- details?: undefined;
164
- }>;
165
- /**
166
- * Configure Cloth Simulation
167
- */
107
+ }): Promise<any>;
168
108
  setupCloth(params: {
169
109
  meshName: string;
170
110
  clothPreset: 'Silk' | 'Leather' | 'Denim' | 'Rubber' | 'Custom';
@@ -185,9 +125,6 @@ export declare class PhysicsTools {
185
125
  error: string;
186
126
  message?: undefined;
187
127
  }>;
188
- /**
189
- * Create Fluid Simulation (Niagara-based)
190
- */
191
128
  createFluidSimulation(params: {
192
129
  name: string;
193
130
  fluidType: 'Water' | 'Smoke' | 'Fire' | 'Lava' | 'Custom';
@@ -209,5 +146,23 @@ export declare class PhysicsTools {
209
146
  error: string;
210
147
  message?: undefined;
211
148
  }>;
149
+ setupPhysicsSimulation(params: {
150
+ meshPath?: string;
151
+ skeletonPath?: string;
152
+ physicsAssetName?: string;
153
+ savePath?: string;
154
+ }): Promise<{
155
+ success: boolean;
156
+ message: string;
157
+ error: string | undefined;
158
+ } | {
159
+ success: boolean;
160
+ message: string;
161
+ error?: undefined;
162
+ } | {
163
+ success: boolean;
164
+ error: string;
165
+ message?: undefined;
166
+ }>;
212
167
  }
213
168
  //# sourceMappingURL=physics.d.ts.map