unreal-engine-mcp-server 0.4.6 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (438) hide show
  1. package/.env.example +26 -0
  2. package/.env.production +38 -7
  3. package/.eslintrc.json +0 -54
  4. package/.eslintrc.override.json +8 -0
  5. package/.github/ISSUE_TEMPLATE/bug_report.yml +94 -0
  6. package/.github/ISSUE_TEMPLATE/config.yml +8 -0
  7. package/.github/ISSUE_TEMPLATE/feature_request.yml +56 -0
  8. package/.github/copilot-instructions.md +478 -45
  9. package/.github/dependabot.yml +19 -0
  10. package/.github/labeler.yml +24 -0
  11. package/.github/labels.yml +70 -0
  12. package/.github/pull_request_template.md +42 -0
  13. package/.github/release-drafter.yml +148 -0
  14. package/.github/workflows/auto-merge.yml +38 -0
  15. package/.github/workflows/ci.yml +38 -0
  16. package/.github/workflows/dependency-review.yml +17 -0
  17. package/.github/workflows/gemini-issue-triage.yml +172 -0
  18. package/.github/workflows/greetings.yml +23 -0
  19. package/.github/workflows/labeler.yml +16 -0
  20. package/.github/workflows/links.yml +80 -0
  21. package/.github/workflows/pr-size-labeler.yml +137 -0
  22. package/.github/workflows/publish-mcp.yml +12 -7
  23. package/.github/workflows/release-drafter.yml +23 -0
  24. package/.github/workflows/release.yml +112 -0
  25. package/.github/workflows/semantic-pull-request.yml +35 -0
  26. package/.github/workflows/smoke-test.yml +36 -0
  27. package/.github/workflows/stale.yml +28 -0
  28. package/CHANGELOG.md +269 -22
  29. package/CONTRIBUTING.md +140 -0
  30. package/README.md +166 -72
  31. package/claude_desktop_config_example.json +7 -6
  32. package/dist/automation/bridge.d.ts +50 -0
  33. package/dist/automation/bridge.js +452 -0
  34. package/dist/automation/connection-manager.d.ts +23 -0
  35. package/dist/automation/connection-manager.js +107 -0
  36. package/dist/automation/handshake.d.ts +11 -0
  37. package/dist/automation/handshake.js +89 -0
  38. package/dist/automation/index.d.ts +3 -0
  39. package/dist/automation/index.js +3 -0
  40. package/dist/automation/message-handler.d.ts +12 -0
  41. package/dist/automation/message-handler.js +149 -0
  42. package/dist/automation/request-tracker.d.ts +25 -0
  43. package/dist/automation/request-tracker.js +98 -0
  44. package/dist/automation/types.d.ts +130 -0
  45. package/dist/automation/types.js +2 -0
  46. package/dist/cli.js +32 -5
  47. package/dist/config.d.ts +27 -0
  48. package/dist/config.js +60 -0
  49. package/dist/constants.d.ts +12 -0
  50. package/dist/constants.js +12 -0
  51. package/dist/graphql/resolvers.d.ts +268 -0
  52. package/dist/graphql/resolvers.js +743 -0
  53. package/dist/graphql/schema.d.ts +5 -0
  54. package/dist/graphql/schema.js +437 -0
  55. package/dist/graphql/server.d.ts +26 -0
  56. package/dist/graphql/server.js +115 -0
  57. package/dist/graphql/types.d.ts +7 -0
  58. package/dist/graphql/types.js +2 -0
  59. package/dist/handlers/resource-handlers.d.ts +20 -0
  60. package/dist/handlers/resource-handlers.js +180 -0
  61. package/dist/index.d.ts +31 -18
  62. package/dist/index.js +119 -604
  63. package/dist/prompts/index.js +4 -4
  64. package/dist/resources/actors.d.ts +17 -12
  65. package/dist/resources/actors.js +56 -76
  66. package/dist/resources/assets.d.ts +6 -14
  67. package/dist/resources/assets.js +115 -147
  68. package/dist/resources/levels.d.ts +13 -13
  69. package/dist/resources/levels.js +25 -34
  70. package/dist/server/resource-registry.d.ts +20 -0
  71. package/dist/server/resource-registry.js +37 -0
  72. package/dist/server/tool-registry.d.ts +23 -0
  73. package/dist/server/tool-registry.js +322 -0
  74. package/dist/server-setup.d.ts +21 -0
  75. package/dist/server-setup.js +111 -0
  76. package/dist/services/health-monitor.d.ts +34 -0
  77. package/dist/services/health-monitor.js +105 -0
  78. package/dist/services/metrics-server.d.ts +11 -0
  79. package/dist/services/metrics-server.js +105 -0
  80. package/dist/tools/actors.d.ts +147 -9
  81. package/dist/tools/actors.js +350 -311
  82. package/dist/tools/animation.d.ts +135 -4
  83. package/dist/tools/animation.js +510 -411
  84. package/dist/tools/assets.d.ts +117 -19
  85. package/dist/tools/assets.js +259 -284
  86. package/dist/tools/audio.d.ts +102 -42
  87. package/dist/tools/audio.js +272 -685
  88. package/dist/tools/base-tool.d.ts +17 -0
  89. package/dist/tools/base-tool.js +46 -0
  90. package/dist/tools/behavior-tree.d.ts +94 -0
  91. package/dist/tools/behavior-tree.js +39 -0
  92. package/dist/tools/blueprint/helpers.d.ts +29 -0
  93. package/dist/tools/blueprint/helpers.js +182 -0
  94. package/dist/tools/blueprint.d.ts +228 -118
  95. package/dist/tools/blueprint.js +685 -832
  96. package/dist/tools/consolidated-tool-definitions.d.ts +5475 -1627
  97. package/dist/tools/consolidated-tool-definitions.js +829 -482
  98. package/dist/tools/consolidated-tool-handlers.d.ts +2 -1
  99. package/dist/tools/consolidated-tool-handlers.js +211 -1009
  100. package/dist/tools/debug.d.ts +143 -85
  101. package/dist/tools/debug.js +234 -180
  102. package/dist/tools/dynamic-handler-registry.d.ts +11 -0
  103. package/dist/tools/dynamic-handler-registry.js +101 -0
  104. package/dist/tools/editor.d.ts +139 -18
  105. package/dist/tools/editor.js +239 -244
  106. package/dist/tools/engine.d.ts +10 -4
  107. package/dist/tools/engine.js +13 -5
  108. package/dist/tools/environment.d.ts +36 -0
  109. package/dist/tools/environment.js +267 -0
  110. package/dist/tools/foliage.d.ts +105 -14
  111. package/dist/tools/foliage.js +219 -331
  112. package/dist/tools/handlers/actor-handlers.d.ts +3 -0
  113. package/dist/tools/handlers/actor-handlers.js +232 -0
  114. package/dist/tools/handlers/animation-handlers.d.ts +3 -0
  115. package/dist/tools/handlers/animation-handlers.js +185 -0
  116. package/dist/tools/handlers/argument-helper.d.ts +16 -0
  117. package/dist/tools/handlers/argument-helper.js +80 -0
  118. package/dist/tools/handlers/asset-handlers.d.ts +3 -0
  119. package/dist/tools/handlers/asset-handlers.js +496 -0
  120. package/dist/tools/handlers/audio-handlers.d.ts +3 -0
  121. package/dist/tools/handlers/audio-handlers.js +166 -0
  122. package/dist/tools/handlers/blueprint-handlers.d.ts +4 -0
  123. package/dist/tools/handlers/blueprint-handlers.js +358 -0
  124. package/dist/tools/handlers/common-handlers.d.ts +14 -0
  125. package/dist/tools/handlers/common-handlers.js +56 -0
  126. package/dist/tools/handlers/editor-handlers.d.ts +3 -0
  127. package/dist/tools/handlers/editor-handlers.js +119 -0
  128. package/dist/tools/handlers/effect-handlers.d.ts +3 -0
  129. package/dist/tools/handlers/effect-handlers.js +171 -0
  130. package/dist/tools/handlers/environment-handlers.d.ts +3 -0
  131. package/dist/tools/handlers/environment-handlers.js +170 -0
  132. package/dist/tools/handlers/graph-handlers.d.ts +3 -0
  133. package/dist/tools/handlers/graph-handlers.js +90 -0
  134. package/dist/tools/handlers/input-handlers.d.ts +3 -0
  135. package/dist/tools/handlers/input-handlers.js +21 -0
  136. package/dist/tools/handlers/inspect-handlers.d.ts +3 -0
  137. package/dist/tools/handlers/inspect-handlers.js +383 -0
  138. package/dist/tools/handlers/level-handlers.d.ts +3 -0
  139. package/dist/tools/handlers/level-handlers.js +237 -0
  140. package/dist/tools/handlers/lighting-handlers.d.ts +3 -0
  141. package/dist/tools/handlers/lighting-handlers.js +144 -0
  142. package/dist/tools/handlers/performance-handlers.d.ts +3 -0
  143. package/dist/tools/handlers/performance-handlers.js +130 -0
  144. package/dist/tools/handlers/pipeline-handlers.d.ts +3 -0
  145. package/dist/tools/handlers/pipeline-handlers.js +110 -0
  146. package/dist/tools/handlers/sequence-handlers.d.ts +3 -0
  147. package/dist/tools/handlers/sequence-handlers.js +376 -0
  148. package/dist/tools/handlers/system-handlers.d.ts +4 -0
  149. package/dist/tools/handlers/system-handlers.js +506 -0
  150. package/dist/tools/input.d.ts +19 -0
  151. package/dist/tools/input.js +89 -0
  152. package/dist/tools/introspection.d.ts +103 -40
  153. package/dist/tools/introspection.js +425 -568
  154. package/dist/tools/landscape.d.ts +97 -36
  155. package/dist/tools/landscape.js +280 -409
  156. package/dist/tools/level.d.ts +130 -10
  157. package/dist/tools/level.js +639 -675
  158. package/dist/tools/lighting.d.ts +77 -38
  159. package/dist/tools/lighting.js +441 -943
  160. package/dist/tools/logs.d.ts +45 -0
  161. package/dist/tools/logs.js +210 -0
  162. package/dist/tools/materials.d.ts +91 -24
  163. package/dist/tools/materials.js +190 -118
  164. package/dist/tools/niagara.d.ts +149 -39
  165. package/dist/tools/niagara.js +232 -182
  166. package/dist/tools/performance.d.ts +27 -12
  167. package/dist/tools/performance.js +204 -122
  168. package/dist/tools/physics.d.ts +32 -77
  169. package/dist/tools/physics.js +171 -582
  170. package/dist/tools/property-dictionary.d.ts +13 -0
  171. package/dist/tools/property-dictionary.js +82 -0
  172. package/dist/tools/sequence.d.ts +73 -48
  173. package/dist/tools/sequence.js +196 -748
  174. package/dist/tools/tool-definition-utils.d.ts +59 -0
  175. package/dist/tools/tool-definition-utils.js +35 -0
  176. package/dist/tools/ui.d.ts +66 -34
  177. package/dist/tools/ui.js +134 -214
  178. package/dist/types/env.d.ts +0 -3
  179. package/dist/types/env.js +0 -7
  180. package/dist/types/tool-interfaces.d.ts +898 -0
  181. package/dist/types/tool-interfaces.js +2 -0
  182. package/dist/types/tool-types.d.ts +195 -11
  183. package/dist/types/tool-types.js +0 -4
  184. package/dist/unreal-bridge.d.ts +24 -131
  185. package/dist/unreal-bridge.js +364 -1506
  186. package/dist/utils/command-validator.d.ts +9 -0
  187. package/dist/utils/command-validator.js +67 -0
  188. package/dist/utils/elicitation.d.ts +1 -1
  189. package/dist/utils/elicitation.js +12 -15
  190. package/dist/utils/error-handler.d.ts +2 -51
  191. package/dist/utils/error-handler.js +11 -87
  192. package/dist/utils/ini-reader.d.ts +3 -0
  193. package/dist/utils/ini-reader.js +69 -0
  194. package/dist/utils/logger.js +9 -6
  195. package/dist/utils/normalize.d.ts +3 -0
  196. package/dist/utils/normalize.js +56 -0
  197. package/dist/utils/response-factory.d.ts +7 -0
  198. package/dist/utils/response-factory.js +33 -0
  199. package/dist/utils/response-validator.d.ts +3 -24
  200. package/dist/utils/response-validator.js +130 -81
  201. package/dist/utils/result-helpers.d.ts +4 -5
  202. package/dist/utils/result-helpers.js +15 -16
  203. package/dist/utils/safe-json.js +5 -11
  204. package/dist/utils/unreal-command-queue.d.ts +24 -0
  205. package/dist/utils/unreal-command-queue.js +120 -0
  206. package/dist/utils/validation.d.ts +0 -40
  207. package/dist/utils/validation.js +1 -78
  208. package/dist/wasm/index.d.ts +70 -0
  209. package/dist/wasm/index.js +535 -0
  210. package/docs/GraphQL-API.md +888 -0
  211. package/docs/Migration-Guide-v0.5.0.md +692 -0
  212. package/docs/Roadmap.md +53 -0
  213. package/docs/WebAssembly-Integration.md +628 -0
  214. package/docs/editor-plugin-extension.md +370 -0
  215. package/docs/handler-mapping.md +242 -0
  216. package/docs/native-automation-progress.md +128 -0
  217. package/docs/testing-guide.md +423 -0
  218. package/mcp-config-example.json +6 -6
  219. package/package.json +60 -27
  220. package/plugins/McpAutomationBridge/Config/FilterPlugin.ini +8 -0
  221. package/plugins/McpAutomationBridge/McpAutomationBridge.uplugin +64 -0
  222. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/McpAutomationBridge.Build.cs +189 -0
  223. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.cpp +22 -0
  224. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.h +30 -0
  225. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeHelpers.h +1983 -0
  226. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeModule.cpp +72 -0
  227. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSettings.cpp +46 -0
  228. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSubsystem.cpp +581 -0
  229. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AnimationHandlers.cpp +2394 -0
  230. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetQueryHandlers.cpp +300 -0
  231. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetWorkflowHandlers.cpp +2807 -0
  232. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AudioHandlers.cpp +1087 -0
  233. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BehaviorTreeHandlers.cpp +488 -0
  234. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.cpp +643 -0
  235. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.h +31 -0
  236. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintGraphHandlers.cpp +1184 -0
  237. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers.cpp +5652 -0
  238. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers_List.cpp +152 -0
  239. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ControlHandlers.cpp +2614 -0
  240. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_DebugHandlers.cpp +42 -0
  241. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EditorFunctionHandlers.cpp +1237 -0
  242. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EffectHandlers.cpp +1701 -0
  243. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EnvironmentHandlers.cpp +2145 -0
  244. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_FoliageHandlers.cpp +954 -0
  245. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InputHandlers.cpp +209 -0
  246. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InsightsHandlers.cpp +41 -0
  247. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LandscapeHandlers.cpp +1164 -0
  248. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LevelHandlers.cpp +762 -0
  249. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LightingHandlers.cpp +634 -0
  250. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LogHandlers.cpp +136 -0
  251. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_MaterialGraphHandlers.cpp +494 -0
  252. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraGraphHandlers.cpp +278 -0
  253. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraHandlers.cpp +625 -0
  254. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PerformanceHandlers.cpp +401 -0
  255. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PipelineHandlers.cpp +67 -0
  256. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ProcessRequest.cpp +735 -0
  257. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PropertyHandlers.cpp +2634 -0
  258. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_RenderHandlers.cpp +189 -0
  259. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.cpp +917 -0
  260. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.h +39 -0
  261. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequenceHandlers.cpp +2670 -0
  262. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequencerHandlers.cpp +519 -0
  263. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_TestHandlers.cpp +38 -0
  264. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_UiHandlers.cpp +668 -0
  265. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_WorldPartitionHandlers.cpp +346 -0
  266. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.cpp +1330 -0
  267. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.h +149 -0
  268. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpConnectionManager.cpp +783 -0
  269. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSettings.h +115 -0
  270. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSubsystem.h +796 -0
  271. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpConnectionManager.h +117 -0
  272. package/scripts/check-unreal-connection.mjs +19 -0
  273. package/scripts/clean-tmp.js +23 -0
  274. package/scripts/patch-wasm.js +26 -0
  275. package/scripts/run-all-tests.mjs +131 -0
  276. package/scripts/smoke-test.ts +94 -0
  277. package/scripts/sync-mcp-plugin.js +143 -0
  278. package/scripts/test-no-plugin-alternates.mjs +113 -0
  279. package/scripts/validate-server.js +46 -0
  280. package/scripts/verify-automation-bridge.js +200 -0
  281. package/server.json +57 -21
  282. package/src/automation/bridge.ts +558 -0
  283. package/src/automation/connection-manager.ts +130 -0
  284. package/src/automation/handshake.ts +99 -0
  285. package/src/automation/index.ts +2 -0
  286. package/src/automation/message-handler.ts +167 -0
  287. package/src/automation/request-tracker.ts +123 -0
  288. package/src/automation/types.ts +107 -0
  289. package/src/cli.ts +33 -6
  290. package/src/config.ts +73 -0
  291. package/src/constants.ts +12 -0
  292. package/src/graphql/resolvers.ts +1010 -0
  293. package/src/graphql/schema.ts +452 -0
  294. package/src/graphql/server.ts +154 -0
  295. package/src/graphql/types.ts +7 -0
  296. package/src/handlers/resource-handlers.ts +186 -0
  297. package/src/index.ts +152 -649
  298. package/src/prompts/index.ts +4 -4
  299. package/src/resources/actors.ts +58 -76
  300. package/src/resources/assets.ts +147 -134
  301. package/src/resources/levels.ts +28 -33
  302. package/src/server/resource-registry.ts +47 -0
  303. package/src/server/tool-registry.ts +354 -0
  304. package/src/server-setup.ts +148 -0
  305. package/src/services/health-monitor.ts +132 -0
  306. package/src/services/metrics-server.ts +142 -0
  307. package/src/tools/actors.ts +417 -322
  308. package/src/tools/animation.ts +671 -461
  309. package/src/tools/assets.ts +353 -289
  310. package/src/tools/audio.ts +323 -766
  311. package/src/tools/base-tool.ts +52 -0
  312. package/src/tools/behavior-tree.ts +45 -0
  313. package/src/tools/blueprint/helpers.ts +189 -0
  314. package/src/tools/blueprint.ts +787 -965
  315. package/src/tools/consolidated-tool-definitions.ts +993 -500
  316. package/src/tools/consolidated-tool-handlers.ts +272 -1122
  317. package/src/tools/debug.ts +292 -187
  318. package/src/tools/dynamic-handler-registry.ts +151 -0
  319. package/src/tools/editor.ts +309 -246
  320. package/src/tools/engine.ts +14 -3
  321. package/src/tools/environment.ts +287 -0
  322. package/src/tools/foliage.ts +314 -379
  323. package/src/tools/handlers/actor-handlers.ts +271 -0
  324. package/src/tools/handlers/animation-handlers.ts +237 -0
  325. package/src/tools/handlers/argument-helper.ts +142 -0
  326. package/src/tools/handlers/asset-handlers.ts +532 -0
  327. package/src/tools/handlers/audio-handlers.ts +194 -0
  328. package/src/tools/handlers/blueprint-handlers.ts +380 -0
  329. package/src/tools/handlers/common-handlers.ts +87 -0
  330. package/src/tools/handlers/editor-handlers.ts +123 -0
  331. package/src/tools/handlers/effect-handlers.ts +220 -0
  332. package/src/tools/handlers/environment-handlers.ts +183 -0
  333. package/src/tools/handlers/graph-handlers.ts +116 -0
  334. package/src/tools/handlers/input-handlers.ts +28 -0
  335. package/src/tools/handlers/inspect-handlers.ts +450 -0
  336. package/src/tools/handlers/level-handlers.ts +252 -0
  337. package/src/tools/handlers/lighting-handlers.ts +147 -0
  338. package/src/tools/handlers/performance-handlers.ts +132 -0
  339. package/src/tools/handlers/pipeline-handlers.ts +127 -0
  340. package/src/tools/handlers/sequence-handlers.ts +415 -0
  341. package/src/tools/handlers/system-handlers.ts +564 -0
  342. package/src/tools/input.ts +101 -0
  343. package/src/tools/introspection.ts +493 -584
  344. package/src/tools/landscape.ts +394 -489
  345. package/src/tools/level.ts +752 -694
  346. package/src/tools/lighting.ts +583 -984
  347. package/src/tools/logs.ts +219 -0
  348. package/src/tools/materials.ts +231 -121
  349. package/src/tools/niagara.ts +293 -168
  350. package/src/tools/performance.ts +320 -168
  351. package/src/tools/physics.ts +268 -613
  352. package/src/tools/property-dictionary.ts +98 -0
  353. package/src/tools/sequence.ts +255 -815
  354. package/src/tools/tool-definition-utils.ts +35 -0
  355. package/src/tools/ui.ts +207 -283
  356. package/src/types/env.ts +0 -10
  357. package/src/types/tool-interfaces.ts +250 -0
  358. package/src/types/tool-types.ts +250 -13
  359. package/src/unreal-bridge.ts +460 -1550
  360. package/src/utils/command-validator.ts +75 -0
  361. package/src/utils/elicitation.ts +10 -7
  362. package/src/utils/error-handler.ts +14 -90
  363. package/src/utils/ini-reader.ts +86 -0
  364. package/src/utils/logger.ts +8 -3
  365. package/src/utils/normalize.ts +60 -0
  366. package/src/utils/response-factory.ts +39 -0
  367. package/src/utils/response-validator.ts +176 -56
  368. package/src/utils/result-helpers.ts +21 -19
  369. package/src/utils/safe-json.ts +14 -11
  370. package/src/utils/unreal-command-queue.ts +152 -0
  371. package/src/utils/validation.ts +4 -1
  372. package/src/wasm/index.ts +838 -0
  373. package/test-server.mjs +100 -0
  374. package/tests/run-unreal-tool-tests.mjs +242 -14
  375. package/tests/test-animation.mjs +44 -0
  376. package/tests/test-asset-advanced.mjs +82 -0
  377. package/tests/test-asset-errors.mjs +35 -0
  378. package/tests/test-audio.mjs +219 -0
  379. package/tests/test-automation-timeouts.mjs +98 -0
  380. package/tests/test-behavior-tree.mjs +261 -0
  381. package/tests/test-blueprint-events.mjs +35 -0
  382. package/tests/test-blueprint-graph.mjs +79 -0
  383. package/tests/test-blueprint.mjs +577 -0
  384. package/tests/test-client-mode.mjs +86 -0
  385. package/tests/test-console-command.mjs +56 -0
  386. package/tests/test-control-actor.mjs +425 -0
  387. package/tests/test-control-editor.mjs +80 -0
  388. package/tests/test-extra-tools.mjs +38 -0
  389. package/tests/test-graphql.mjs +322 -0
  390. package/tests/test-inspect.mjs +72 -0
  391. package/tests/test-landscape.mjs +60 -0
  392. package/tests/test-manage-asset.mjs +438 -0
  393. package/tests/test-manage-level.mjs +70 -0
  394. package/tests/test-materials.mjs +356 -0
  395. package/tests/test-niagara.mjs +185 -0
  396. package/tests/test-no-inline-python.mjs +122 -0
  397. package/tests/test-plugin-handshake.mjs +82 -0
  398. package/tests/test-render.mjs +33 -0
  399. package/tests/test-runner.mjs +933 -0
  400. package/tests/test-search-assets.mjs +66 -0
  401. package/tests/test-sequence.mjs +68 -0
  402. package/tests/test-system.mjs +57 -0
  403. package/tests/test-wasm.mjs +193 -0
  404. package/tests/test-world-partition.mjs +215 -0
  405. package/tsconfig.json +3 -3
  406. package/wasm/Cargo.lock +363 -0
  407. package/wasm/Cargo.toml +42 -0
  408. package/wasm/LICENSE +21 -0
  409. package/wasm/README.md +253 -0
  410. package/wasm/src/dependency_resolver.rs +377 -0
  411. package/wasm/src/lib.rs +153 -0
  412. package/wasm/src/property_parser.rs +271 -0
  413. package/wasm/src/transform_math.rs +396 -0
  414. package/wasm/tests/integration.rs +109 -0
  415. package/.github/workflows/smithery-build.yml +0 -29
  416. package/dist/tools/build_environment_advanced.d.ts +0 -65
  417. package/dist/tools/build_environment_advanced.js +0 -633
  418. package/dist/tools/rc.d.ts +0 -110
  419. package/dist/tools/rc.js +0 -437
  420. package/dist/tools/visual.d.ts +0 -40
  421. package/dist/tools/visual.js +0 -282
  422. package/dist/utils/http.d.ts +0 -6
  423. package/dist/utils/http.js +0 -151
  424. package/dist/utils/python-output.d.ts +0 -18
  425. package/dist/utils/python-output.js +0 -290
  426. package/dist/utils/python.d.ts +0 -2
  427. package/dist/utils/python.js +0 -4
  428. package/dist/utils/stdio-redirect.d.ts +0 -2
  429. package/dist/utils/stdio-redirect.js +0 -20
  430. package/docs/unreal-tool-test-cases.md +0 -572
  431. package/smithery.yaml +0 -29
  432. package/src/tools/build_environment_advanced.ts +0 -732
  433. package/src/tools/rc.ts +0 -515
  434. package/src/tools/visual.ts +0 -281
  435. package/src/utils/http.ts +0 -187
  436. package/src/utils/python-output.ts +0 -351
  437. package/src/utils/python.ts +0 -3
  438. package/src/utils/stdio-redirect.ts +0 -18
@@ -1,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,52 @@ 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
+ enableBatching: params.enableBatching,
358
+ mergeActors: params.mergeActors,
359
+ actors: actors
360
+ };
361
+ const response = await this.automationBridge.sendAutomationRequest('merge_actors', payload);
362
+ return response.success
363
+ ? { success: true, message: response.message || 'Actors merged for optimization' }
364
+ : { success: false, error: response.message || response.error || 'Failed to merge actors' };
365
+ }
366
+ catch (error) {
367
+ return { success: false, error: `Failed to merge actors: ${error instanceof Error ? error.message : String(error)}` };
368
+ }
369
+ }
370
+ throw new Error('Actor merging requires Automation Bridge support');
371
+ }
295
372
  const commands = [];
296
373
  if (params.enableInstancing !== undefined) {
297
374
  commands.push(`r.MeshDrawCommands.DynamicInstancing ${params.enableInstancing ? 1 : 0}`);
298
375
  }
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
376
  await this.bridge.executeConsoleCommands(commands);
304
377
  return { success: true, message: 'Draw call optimization configured' };
305
378
  }
306
- // Occlusion culling
307
379
  async configureOcclusionCulling(params) {
308
380
  const commands = [];
309
- // Enable/disable HZB occlusion (boolean)
310
381
  commands.push(`r.HZBOcclusion ${params.enabled ? 1 : 0}`);
311
- // Optional freeze rendering toggle
312
382
  if (params.freezeRendering !== undefined) {
313
383
  commands.push(`FreezeRendering ${params.freezeRendering ? 1 : 0}`);
314
384
  }
315
385
  await this.bridge.executeConsoleCommands(commands);
316
386
  return { success: true, message: 'Occlusion culling configured' };
317
387
  }
318
- // Shader compilation
319
388
  async optimizeShaders(params) {
320
389
  const commands = [];
321
390
  if (params.compileOnDemand !== undefined) {
@@ -330,8 +399,26 @@ print('RESULT:' + json.dumps(result))
330
399
  await this.bridge.executeConsoleCommands(commands);
331
400
  return { success: true, message: 'Shader optimization configured' };
332
401
  }
333
- // Nanite settings
334
402
  async configureNanite(params) {
403
+ if (this.automationBridge) {
404
+ try {
405
+ const response = await this.automationBridge.sendAutomationRequest('configure_nanite', {
406
+ enabled: params.enabled,
407
+ maxPixelsPerEdge: params.maxPixelsPerEdge,
408
+ streamingPoolSize: params.streamingPoolSize
409
+ });
410
+ if (params.maxPixelsPerEdge !== undefined) {
411
+ await this.bridge.executeConsoleCommand(`r.Nanite.MaxPixelsPerEdge ${params.maxPixelsPerEdge}`);
412
+ }
413
+ if (params.streamingPoolSize !== undefined) {
414
+ await this.bridge.executeConsoleCommand(`r.Nanite.StreamingPoolSize ${params.streamingPoolSize}`);
415
+ }
416
+ if (response.success)
417
+ return { success: true, message: 'Nanite configured' };
418
+ }
419
+ catch (_e) {
420
+ }
421
+ }
335
422
  const commands = [];
336
423
  commands.push(`r.Nanite ${params.enabled ? 1 : 0}`);
337
424
  if (params.maxPixelsPerEdge !== undefined) {
@@ -343,7 +430,6 @@ print('RESULT:' + json.dumps(result))
343
430
  await this.bridge.executeConsoleCommands(commands);
344
431
  return { success: true, message: 'Nanite configured' };
345
432
  }
346
- // World Partition streaming
347
433
  async configureWorldPartition(params) {
348
434
  const commands = [];
349
435
  commands.push(`wp.Runtime.EnableStreaming ${params.enabled ? 1 : 0}`);
@@ -356,14 +442,10 @@ print('RESULT:' + json.dumps(result))
356
442
  await this.bridge.executeConsoleCommands(commands);
357
443
  return { success: true, message: 'World Partition configured' };
358
444
  }
359
- // Benchmark
360
445
  async runBenchmark(params) {
361
446
  const duration = params.duration || 60;
362
- // Start recording and GPU profiling
363
447
  await this.bridge.executeConsoleCommands(['stat startfile', 'profilegpu']);
364
- // Wait for the requested duration
365
448
  await new Promise(resolve => setTimeout(resolve, duration * 1000));
366
- // Stop recording and clear stats
367
449
  await this.bridge.executeConsoleCommands(['stat stopfile', 'stat none']);
368
450
  return { success: true, message: `Benchmark completed for ${duration} seconds` };
369
451
  }
@@ -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