unreal-engine-mcp-server 0.5.3 → 0.5.5

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 (480) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/dist/automation/bridge.d.ts +1 -0
  3. package/dist/automation/bridge.d.ts.map +1 -0
  4. package/dist/automation/bridge.js +62 -4
  5. package/dist/automation/bridge.js.map +1 -0
  6. package/dist/automation/connection-manager.d.ts.map +1 -0
  7. package/dist/automation/connection-manager.js.map +1 -0
  8. package/dist/automation/handshake.d.ts.map +1 -0
  9. package/dist/automation/handshake.js.map +1 -0
  10. package/dist/automation/index.d.ts.map +1 -0
  11. package/dist/automation/index.js.map +1 -0
  12. package/dist/automation/message-handler.d.ts.map +1 -0
  13. package/dist/automation/message-handler.js.map +1 -0
  14. package/dist/automation/request-tracker.d.ts.map +1 -0
  15. package/dist/automation/request-tracker.js.map +1 -0
  16. package/dist/automation/types.d.ts +1 -0
  17. package/dist/automation/types.d.ts.map +1 -0
  18. package/dist/automation/types.js.map +1 -0
  19. package/dist/cli.d.ts.map +1 -0
  20. package/dist/cli.js +4 -3
  21. package/dist/cli.js.map +1 -0
  22. package/dist/config/class-aliases.d.ts.map +1 -0
  23. package/dist/config/class-aliases.js.map +1 -0
  24. package/dist/config.d.ts.map +1 -0
  25. package/dist/config.js.map +1 -0
  26. package/dist/constants.d.ts +2 -0
  27. package/dist/constants.d.ts.map +1 -0
  28. package/dist/constants.js +2 -0
  29. package/dist/constants.js.map +1 -0
  30. package/dist/graphql/loaders.d.ts.map +1 -0
  31. package/dist/graphql/loaders.js.map +1 -0
  32. package/dist/graphql/resolvers.d.ts.map +1 -0
  33. package/dist/graphql/resolvers.js +29 -29
  34. package/dist/graphql/resolvers.js.map +1 -0
  35. package/dist/graphql/schema.d.ts.map +1 -0
  36. package/dist/graphql/schema.js.map +1 -0
  37. package/dist/graphql/server.d.ts +0 -1
  38. package/dist/graphql/server.d.ts.map +1 -0
  39. package/dist/graphql/server.js +15 -16
  40. package/dist/graphql/server.js.map +1 -0
  41. package/dist/graphql/types.d.ts.map +1 -0
  42. package/dist/graphql/types.js.map +1 -0
  43. package/dist/handlers/resource-handlers.d.ts.map +1 -0
  44. package/dist/handlers/resource-handlers.js.map +1 -0
  45. package/dist/index.d.ts +1 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +64 -7
  48. package/dist/index.js.map +1 -0
  49. package/dist/resources/actors.d.ts.map +1 -0
  50. package/dist/resources/actors.js.map +1 -0
  51. package/dist/resources/assets.d.ts.map +1 -0
  52. package/dist/resources/assets.js +6 -4
  53. package/dist/resources/assets.js.map +1 -0
  54. package/dist/resources/levels.d.ts.map +1 -0
  55. package/dist/resources/levels.js.map +1 -0
  56. package/dist/server/resource-registry.d.ts.map +1 -0
  57. package/dist/server/resource-registry.js.map +1 -0
  58. package/dist/server/tool-registry.d.ts.map +1 -0
  59. package/dist/server/tool-registry.js.map +1 -0
  60. package/dist/server-setup.d.ts.map +1 -0
  61. package/dist/server-setup.js.map +1 -0
  62. package/dist/services/health-monitor.d.ts.map +1 -0
  63. package/dist/services/health-monitor.js.map +1 -0
  64. package/dist/services/metrics-server.d.ts.map +1 -0
  65. package/dist/services/metrics-server.js +3 -3
  66. package/dist/services/metrics-server.js.map +1 -0
  67. package/dist/tools/actors.d.ts.map +1 -0
  68. package/dist/tools/actors.js +3 -1
  69. package/dist/tools/actors.js.map +1 -0
  70. package/dist/tools/animation.d.ts.map +1 -0
  71. package/dist/tools/animation.js +2 -2
  72. package/dist/tools/animation.js.map +1 -0
  73. package/dist/tools/assets.d.ts.map +1 -0
  74. package/dist/tools/assets.js.map +1 -0
  75. package/dist/tools/audio.d.ts.map +1 -0
  76. package/dist/tools/audio.js.map +1 -0
  77. package/dist/tools/base-tool.d.ts.map +1 -0
  78. package/dist/tools/base-tool.js.map +1 -0
  79. package/dist/tools/behavior-tree.d.ts.map +1 -0
  80. package/dist/tools/behavior-tree.js.map +1 -0
  81. package/dist/tools/blueprint.d.ts.map +1 -0
  82. package/dist/tools/blueprint.js +4 -2
  83. package/dist/tools/blueprint.js.map +1 -0
  84. package/dist/tools/consolidated-tool-definitions.d.ts.map +1 -0
  85. package/dist/tools/consolidated-tool-definitions.js.map +1 -0
  86. package/dist/tools/consolidated-tool-handlers.d.ts.map +1 -0
  87. package/dist/tools/consolidated-tool-handlers.js.map +1 -0
  88. package/dist/tools/debug.d.ts.map +1 -0
  89. package/dist/tools/debug.js +3 -1
  90. package/dist/tools/debug.js.map +1 -0
  91. package/dist/tools/dynamic-handler-registry.d.ts.map +1 -0
  92. package/dist/tools/dynamic-handler-registry.js +3 -1
  93. package/dist/tools/dynamic-handler-registry.js.map +1 -0
  94. package/dist/tools/editor.d.ts.map +1 -0
  95. package/dist/tools/editor.js +1 -1
  96. package/dist/tools/editor.js.map +1 -0
  97. package/dist/tools/engine.d.ts.map +1 -0
  98. package/dist/tools/engine.js.map +1 -0
  99. package/dist/tools/environment.d.ts.map +1 -0
  100. package/dist/tools/environment.js +2 -2
  101. package/dist/tools/environment.js.map +1 -0
  102. package/dist/tools/foliage.d.ts.map +1 -0
  103. package/dist/tools/foliage.js.map +1 -0
  104. package/dist/tools/handlers/actor-handlers.d.ts +1 -1
  105. package/dist/tools/handlers/actor-handlers.d.ts.map +1 -0
  106. package/dist/tools/handlers/actor-handlers.js +6 -5
  107. package/dist/tools/handlers/actor-handlers.js.map +1 -0
  108. package/dist/tools/handlers/animation-handlers.d.ts.map +1 -0
  109. package/dist/tools/handlers/animation-handlers.js.map +1 -0
  110. package/dist/tools/handlers/argument-helper.d.ts.map +1 -0
  111. package/dist/tools/handlers/argument-helper.js.map +1 -0
  112. package/dist/tools/handlers/asset-handlers.d.ts.map +1 -0
  113. package/dist/tools/handlers/asset-handlers.js +5 -1
  114. package/dist/tools/handlers/asset-handlers.js.map +1 -0
  115. package/dist/tools/handlers/audio-handlers.d.ts.map +1 -0
  116. package/dist/tools/handlers/audio-handlers.js.map +1 -0
  117. package/dist/tools/handlers/blueprint-handlers.d.ts.map +1 -0
  118. package/dist/tools/handlers/blueprint-handlers.js +2 -1
  119. package/dist/tools/handlers/blueprint-handlers.js.map +1 -0
  120. package/dist/tools/handlers/common-handlers.d.ts.map +1 -0
  121. package/dist/tools/handlers/common-handlers.js.map +1 -0
  122. package/dist/tools/handlers/editor-handlers.d.ts.map +1 -0
  123. package/dist/tools/handlers/editor-handlers.js +12 -2
  124. package/dist/tools/handlers/editor-handlers.js.map +1 -0
  125. package/dist/tools/handlers/effect-handlers.d.ts.map +1 -0
  126. package/dist/tools/handlers/effect-handlers.js.map +1 -0
  127. package/dist/tools/handlers/environment-handlers.d.ts.map +1 -0
  128. package/dist/tools/handlers/environment-handlers.js.map +1 -0
  129. package/dist/tools/handlers/graph-handlers.d.ts.map +1 -0
  130. package/dist/tools/handlers/graph-handlers.js +61 -1
  131. package/dist/tools/handlers/graph-handlers.js.map +1 -0
  132. package/dist/tools/handlers/input-handlers.d.ts.map +1 -0
  133. package/dist/tools/handlers/input-handlers.js.map +1 -0
  134. package/dist/tools/handlers/inspect-handlers.d.ts.map +1 -0
  135. package/dist/tools/handlers/inspect-handlers.js.map +1 -0
  136. package/dist/tools/handlers/level-handlers.d.ts.map +1 -0
  137. package/dist/tools/handlers/level-handlers.js.map +1 -0
  138. package/dist/tools/handlers/lighting-handlers.d.ts.map +1 -0
  139. package/dist/tools/handlers/lighting-handlers.js +23 -1
  140. package/dist/tools/handlers/lighting-handlers.js.map +1 -0
  141. package/dist/tools/handlers/performance-handlers.d.ts.map +1 -0
  142. package/dist/tools/handlers/performance-handlers.js +15 -2
  143. package/dist/tools/handlers/performance-handlers.js.map +1 -0
  144. package/dist/tools/handlers/pipeline-handlers.d.ts.map +1 -0
  145. package/dist/tools/handlers/pipeline-handlers.js +61 -7
  146. package/dist/tools/handlers/pipeline-handlers.js.map +1 -0
  147. package/dist/tools/handlers/sequence-handlers.d.ts.map +1 -0
  148. package/dist/tools/handlers/sequence-handlers.js.map +1 -0
  149. package/dist/tools/handlers/system-handlers.d.ts.map +1 -0
  150. package/dist/tools/handlers/system-handlers.js +16 -1
  151. package/dist/tools/handlers/system-handlers.js.map +1 -0
  152. package/dist/tools/input.d.ts.map +1 -0
  153. package/dist/tools/input.js +3 -1
  154. package/dist/tools/input.js.map +1 -0
  155. package/dist/tools/introspection.d.ts.map +1 -0
  156. package/dist/tools/introspection.js.map +1 -0
  157. package/dist/tools/landscape.d.ts.map +1 -0
  158. package/dist/tools/landscape.js +3 -1
  159. package/dist/tools/landscape.js.map +1 -0
  160. package/dist/tools/level.d.ts.map +1 -0
  161. package/dist/tools/level.js.map +1 -0
  162. package/dist/tools/lighting.d.ts.map +1 -0
  163. package/dist/tools/lighting.js +3 -1
  164. package/dist/tools/lighting.js.map +1 -0
  165. package/dist/tools/logs.d.ts.map +1 -0
  166. package/dist/tools/logs.js.map +1 -0
  167. package/dist/tools/materials.d.ts.map +1 -0
  168. package/dist/tools/materials.js +3 -1
  169. package/dist/tools/materials.js.map +1 -0
  170. package/dist/tools/niagara.d.ts.map +1 -0
  171. package/dist/tools/niagara.js +7 -5
  172. package/dist/tools/niagara.js.map +1 -0
  173. package/dist/tools/performance.d.ts.map +1 -0
  174. package/dist/tools/performance.js.map +1 -0
  175. package/dist/tools/physics.d.ts.map +1 -0
  176. package/dist/tools/physics.js +9 -7
  177. package/dist/tools/physics.js.map +1 -0
  178. package/dist/tools/property-dictionary.d.ts.map +1 -0
  179. package/dist/tools/property-dictionary.js.map +1 -0
  180. package/dist/tools/sequence.d.ts.map +1 -0
  181. package/dist/tools/sequence.js +3 -1
  182. package/dist/tools/sequence.js.map +1 -0
  183. package/dist/tools/tool-definition-utils.d.ts.map +1 -0
  184. package/dist/tools/tool-definition-utils.js.map +1 -0
  185. package/dist/tools/ui.d.ts.map +1 -0
  186. package/dist/tools/ui.js +3 -1
  187. package/dist/tools/ui.js.map +1 -0
  188. package/dist/types/automation-responses.d.ts.map +1 -0
  189. package/dist/types/automation-responses.js.map +1 -0
  190. package/dist/types/env.d.ts.map +1 -0
  191. package/dist/types/env.js.map +1 -0
  192. package/dist/types/handler-types.d.ts.map +1 -0
  193. package/dist/types/handler-types.js.map +1 -0
  194. package/dist/types/tool-interfaces.d.ts.map +1 -0
  195. package/dist/types/tool-interfaces.js.map +1 -0
  196. package/dist/types/tool-types.d.ts.map +1 -0
  197. package/dist/types/tool-types.js.map +1 -0
  198. package/dist/unreal-bridge.d.ts +1 -0
  199. package/dist/unreal-bridge.d.ts.map +1 -0
  200. package/dist/unreal-bridge.js +8 -0
  201. package/dist/unreal-bridge.js.map +1 -0
  202. package/dist/utils/command-validator.d.ts.map +1 -0
  203. package/dist/utils/command-validator.js.map +1 -0
  204. package/dist/utils/elicitation.d.ts.map +1 -0
  205. package/dist/utils/elicitation.js.map +1 -0
  206. package/dist/utils/error-handler.d.ts.map +1 -0
  207. package/dist/utils/error-handler.js.map +1 -0
  208. package/dist/utils/ini-reader.d.ts.map +1 -0
  209. package/dist/utils/ini-reader.js.map +1 -0
  210. package/dist/utils/logger.d.ts.map +1 -0
  211. package/dist/utils/logger.js.map +1 -0
  212. package/dist/utils/normalize.d.ts.map +1 -0
  213. package/dist/utils/normalize.js.map +1 -0
  214. package/dist/utils/path-security.d.ts.map +1 -0
  215. package/dist/utils/path-security.js.map +1 -0
  216. package/dist/utils/response-factory.d.ts.map +1 -0
  217. package/dist/utils/response-factory.js +3 -1
  218. package/dist/utils/response-factory.js.map +1 -0
  219. package/dist/utils/response-validator.d.ts.map +1 -0
  220. package/dist/utils/response-validator.js.map +1 -0
  221. package/dist/utils/result-helpers.d.ts.map +1 -0
  222. package/dist/utils/result-helpers.js.map +1 -0
  223. package/dist/utils/safe-json.d.ts.map +1 -0
  224. package/dist/utils/safe-json.js.map +1 -0
  225. package/dist/utils/unreal-command-queue.d.ts.map +1 -0
  226. package/dist/utils/unreal-command-queue.js.map +1 -0
  227. package/dist/utils/validation.d.ts.map +1 -0
  228. package/dist/utils/validation.js.map +1 -0
  229. package/dist/wasm/index.d.ts.map +1 -0
  230. package/dist/wasm/index.js.map +1 -0
  231. package/package.json +12 -34
  232. package/server.json +2 -2
  233. package/.dockerignore +0 -57
  234. package/.env.example +0 -26
  235. package/.env.production +0 -61
  236. package/.eslintrc.json +0 -0
  237. package/.eslintrc.override.json +0 -8
  238. package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -94
  239. package/.github/ISSUE_TEMPLATE/config.yml +0 -8
  240. package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -56
  241. package/.github/copilot-instructions.md +0 -478
  242. package/.github/dependabot.yml +0 -19
  243. package/.github/labeler.yml +0 -24
  244. package/.github/labels.yml +0 -70
  245. package/.github/pull_request_template.md +0 -42
  246. package/.github/release-drafter-config.yml +0 -51
  247. package/.github/workflows/auto-merge.yml +0 -38
  248. package/.github/workflows/ci.yml +0 -38
  249. package/.github/workflows/dependency-review.yml +0 -17
  250. package/.github/workflows/gemini-issue-triage.yml +0 -172
  251. package/.github/workflows/greetings.yml +0 -27
  252. package/.github/workflows/labeler.yml +0 -17
  253. package/.github/workflows/links.yml +0 -80
  254. package/.github/workflows/pr-size-labeler.yml +0 -137
  255. package/.github/workflows/publish-mcp.yml +0 -79
  256. package/.github/workflows/release-drafter.yml +0 -24
  257. package/.github/workflows/release.yml +0 -112
  258. package/.github/workflows/semantic-pull-request.yml +0 -35
  259. package/.github/workflows/smoke-test.yml +0 -36
  260. package/.github/workflows/stale.yml +0 -28
  261. package/CONTRIBUTING.md +0 -140
  262. package/Dockerfile +0 -37
  263. package/GEMINI.md +0 -115
  264. package/Public/Plugin_setup_guide.mp4 +0 -0
  265. package/Public/icon.png +0 -0
  266. package/claude_desktop_config_example.json +0 -15
  267. package/dist/types/responses.d.ts +0 -249
  268. package/dist/types/responses.js +0 -2
  269. package/docs/GraphQL-API.md +0 -888
  270. package/docs/Migration-Guide-v0.5.0.md +0 -684
  271. package/docs/Roadmap.md +0 -53
  272. package/docs/WebAssembly-Integration.md +0 -628
  273. package/docs/editor-plugin-extension.md +0 -370
  274. package/docs/handler-mapping.md +0 -249
  275. package/docs/native-automation-progress.md +0 -128
  276. package/docs/testing-guide.md +0 -423
  277. package/eslint.config.mjs +0 -68
  278. package/mcp-config-example.json +0 -14
  279. package/plugins/McpAutomationBridge/Config/FilterPlugin.ini +0 -8
  280. package/plugins/McpAutomationBridge/McpAutomationBridge.uplugin +0 -64
  281. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/McpAutomationBridge.Build.cs +0 -189
  282. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.cpp +0 -22
  283. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.h +0 -30
  284. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeHelpers.h +0 -1983
  285. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeModule.cpp +0 -72
  286. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSettings.cpp +0 -46
  287. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSubsystem.cpp +0 -846
  288. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AnimationHandlers.cpp +0 -2393
  289. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetQueryHandlers.cpp +0 -300
  290. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetWorkflowHandlers.cpp +0 -2807
  291. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AudioHandlers.cpp +0 -1087
  292. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BehaviorTreeHandlers.cpp +0 -488
  293. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.cpp +0 -643
  294. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.h +0 -31
  295. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintGraphHandlers.cpp +0 -1094
  296. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers.cpp +0 -5750
  297. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers_List.cpp +0 -152
  298. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ControlHandlers.cpp +0 -2614
  299. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_DebugHandlers.cpp +0 -42
  300. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EditorFunctionHandlers.cpp +0 -1237
  301. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EffectHandlers.cpp +0 -1725
  302. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EnvironmentHandlers.cpp +0 -2241
  303. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_FoliageHandlers.cpp +0 -954
  304. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InputHandlers.cpp +0 -209
  305. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InsightsHandlers.cpp +0 -41
  306. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LandscapeHandlers.cpp +0 -1164
  307. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LevelHandlers.cpp +0 -762
  308. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LightingHandlers.cpp +0 -663
  309. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LogHandlers.cpp +0 -136
  310. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_MaterialGraphHandlers.cpp +0 -494
  311. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraGraphHandlers.cpp +0 -278
  312. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraHandlers.cpp +0 -625
  313. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PerformanceHandlers.cpp +0 -401
  314. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PipelineHandlers.cpp +0 -67
  315. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ProcessRequest.cpp +0 -472
  316. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PropertyHandlers.cpp +0 -2634
  317. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_RenderHandlers.cpp +0 -189
  318. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.cpp +0 -917
  319. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.h +0 -39
  320. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequenceHandlers.cpp +0 -2706
  321. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequencerHandlers.cpp +0 -519
  322. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_TestHandlers.cpp +0 -38
  323. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_UiHandlers.cpp +0 -668
  324. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_WorldPartitionHandlers.cpp +0 -346
  325. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.cpp +0 -1330
  326. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.h +0 -149
  327. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpConnectionManager.cpp +0 -782
  328. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSettings.h +0 -115
  329. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSubsystem.h +0 -796
  330. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpConnectionManager.h +0 -117
  331. package/scripts/check-unreal-connection.mjs +0 -19
  332. package/scripts/clean-tmp.js +0 -23
  333. package/scripts/patch-wasm.js +0 -26
  334. package/scripts/run-all-tests.mjs +0 -136
  335. package/scripts/smoke-test.ts +0 -94
  336. package/scripts/sync-mcp-plugin.js +0 -143
  337. package/scripts/test-no-plugin-alternates.mjs +0 -113
  338. package/scripts/validate-server.js +0 -46
  339. package/scripts/verify-automation-bridge.js +0 -200
  340. package/src/automation/bridge.ts +0 -560
  341. package/src/automation/connection-manager.ts +0 -148
  342. package/src/automation/handshake.ts +0 -99
  343. package/src/automation/index.ts +0 -2
  344. package/src/automation/message-handler.ts +0 -192
  345. package/src/automation/request-tracker.ts +0 -155
  346. package/src/automation/types.ts +0 -107
  347. package/src/cli.ts +0 -34
  348. package/src/config/class-aliases.ts +0 -65
  349. package/src/config.ts +0 -73
  350. package/src/constants.ts +0 -24
  351. package/src/graphql/loaders.ts +0 -244
  352. package/src/graphql/resolvers.ts +0 -1008
  353. package/src/graphql/schema.ts +0 -452
  354. package/src/graphql/server.ts +0 -156
  355. package/src/graphql/types.ts +0 -10
  356. package/src/handlers/resource-handlers.ts +0 -186
  357. package/src/index.ts +0 -243
  358. package/src/resources/actors.ts +0 -127
  359. package/src/resources/assets.ts +0 -286
  360. package/src/resources/levels.ts +0 -68
  361. package/src/server/resource-registry.ts +0 -47
  362. package/src/server/tool-registry.ts +0 -354
  363. package/src/server-setup.ts +0 -114
  364. package/src/services/health-monitor.ts +0 -132
  365. package/src/services/metrics-server.ts +0 -176
  366. package/src/tools/actors.ts +0 -564
  367. package/src/tools/animation.ts +0 -941
  368. package/src/tools/assets.ts +0 -394
  369. package/src/tools/audio.ts +0 -499
  370. package/src/tools/base-tool.ts +0 -52
  371. package/src/tools/behavior-tree.ts +0 -45
  372. package/src/tools/blueprint.ts +0 -940
  373. package/src/tools/consolidated-tool-definitions.ts +0 -1256
  374. package/src/tools/consolidated-tool-handlers.ts +0 -302
  375. package/src/tools/debug.ts +0 -622
  376. package/src/tools/dynamic-handler-registry.ts +0 -33
  377. package/src/tools/editor.ts +0 -435
  378. package/src/tools/engine.ts +0 -43
  379. package/src/tools/environment.ts +0 -281
  380. package/src/tools/foliage.ts +0 -596
  381. package/src/tools/handlers/actor-handlers.ts +0 -244
  382. package/src/tools/handlers/animation-handlers.ts +0 -237
  383. package/src/tools/handlers/argument-helper.ts +0 -142
  384. package/src/tools/handlers/asset-handlers.ts +0 -550
  385. package/src/tools/handlers/audio-handlers.ts +0 -194
  386. package/src/tools/handlers/blueprint-handlers.ts +0 -380
  387. package/src/tools/handlers/common-handlers.ts +0 -108
  388. package/src/tools/handlers/editor-handlers.ts +0 -124
  389. package/src/tools/handlers/effect-handlers.ts +0 -224
  390. package/src/tools/handlers/environment-handlers.ts +0 -183
  391. package/src/tools/handlers/graph-handlers.ts +0 -117
  392. package/src/tools/handlers/input-handlers.ts +0 -28
  393. package/src/tools/handlers/inspect-handlers.ts +0 -450
  394. package/src/tools/handlers/level-handlers.ts +0 -253
  395. package/src/tools/handlers/lighting-handlers.ts +0 -151
  396. package/src/tools/handlers/performance-handlers.ts +0 -132
  397. package/src/tools/handlers/pipeline-handlers.ts +0 -128
  398. package/src/tools/handlers/sequence-handlers.ts +0 -438
  399. package/src/tools/handlers/system-handlers.ts +0 -564
  400. package/src/tools/input.ts +0 -160
  401. package/src/tools/introspection.ts +0 -689
  402. package/src/tools/landscape.ts +0 -649
  403. package/src/tools/level.ts +0 -989
  404. package/src/tools/lighting.ts +0 -1052
  405. package/src/tools/logs.ts +0 -219
  406. package/src/tools/materials.ts +0 -295
  407. package/src/tools/niagara.ts +0 -485
  408. package/src/tools/performance.ts +0 -661
  409. package/src/tools/physics.ts +0 -679
  410. package/src/tools/property-dictionary.ts +0 -98
  411. package/src/tools/sequence.ts +0 -385
  412. package/src/tools/tool-definition-utils.ts +0 -35
  413. package/src/tools/ui.ts +0 -452
  414. package/src/types/automation-responses.ts +0 -119
  415. package/src/types/env.ts +0 -17
  416. package/src/types/handler-types.ts +0 -442
  417. package/src/types/responses.ts +0 -355
  418. package/src/types/tool-interfaces.ts +0 -250
  419. package/src/types/tool-types.ts +0 -575
  420. package/src/unreal-bridge.ts +0 -693
  421. package/src/utils/command-validator.ts +0 -139
  422. package/src/utils/elicitation.ts +0 -132
  423. package/src/utils/error-handler.ts +0 -287
  424. package/src/utils/ini-reader.ts +0 -86
  425. package/src/utils/logger.ts +0 -35
  426. package/src/utils/normalize.test.ts +0 -162
  427. package/src/utils/normalize.ts +0 -146
  428. package/src/utils/path-security.ts +0 -43
  429. package/src/utils/response-factory.ts +0 -44
  430. package/src/utils/response-validator.ts +0 -395
  431. package/src/utils/result-helpers.ts +0 -195
  432. package/src/utils/safe-json.test.ts +0 -90
  433. package/src/utils/safe-json.ts +0 -70
  434. package/src/utils/unreal-command-queue.ts +0 -166
  435. package/src/utils/validation.test.ts +0 -184
  436. package/src/utils/validation.ts +0 -312
  437. package/src/wasm/index.ts +0 -838
  438. package/test-server.mjs +0 -100
  439. package/tests/run-unreal-tool-tests.mjs +0 -948
  440. package/tests/test-animation.mjs +0 -369
  441. package/tests/test-asset-advanced.mjs +0 -82
  442. package/tests/test-asset-errors.mjs +0 -35
  443. package/tests/test-asset-graph.mjs +0 -311
  444. package/tests/test-audio.mjs +0 -417
  445. package/tests/test-automation-timeouts.mjs +0 -98
  446. package/tests/test-behavior-tree.mjs +0 -444
  447. package/tests/test-blueprint-graph.mjs +0 -410
  448. package/tests/test-blueprint.mjs +0 -577
  449. package/tests/test-client-mode.mjs +0 -86
  450. package/tests/test-console-command.mjs +0 -56
  451. package/tests/test-control-actor.mjs +0 -425
  452. package/tests/test-control-editor.mjs +0 -112
  453. package/tests/test-graphql.mjs +0 -372
  454. package/tests/test-input.mjs +0 -349
  455. package/tests/test-inspect.mjs +0 -302
  456. package/tests/test-landscape.mjs +0 -316
  457. package/tests/test-lighting.mjs +0 -428
  458. package/tests/test-manage-asset.mjs +0 -438
  459. package/tests/test-manage-level.mjs +0 -89
  460. package/tests/test-materials.mjs +0 -356
  461. package/tests/test-niagara.mjs +0 -185
  462. package/tests/test-no-inline-python.mjs +0 -122
  463. package/tests/test-performance.mjs +0 -539
  464. package/tests/test-plugin-handshake.mjs +0 -82
  465. package/tests/test-runner.mjs +0 -933
  466. package/tests/test-sequence.mjs +0 -104
  467. package/tests/test-system.mjs +0 -96
  468. package/tests/test-wasm.mjs +0 -283
  469. package/tests/test-world-partition.mjs +0 -215
  470. package/tsconfig.json +0 -56
  471. package/vitest.config.ts +0 -35
  472. package/wasm/Cargo.lock +0 -363
  473. package/wasm/Cargo.toml +0 -42
  474. package/wasm/LICENSE +0 -21
  475. package/wasm/README.md +0 -253
  476. package/wasm/src/dependency_resolver.rs +0 -377
  477. package/wasm/src/lib.rs +0 -153
  478. package/wasm/src/property_parser.rs +0 -271
  479. package/wasm/src/transform_math.rs +0 -396
  480. package/wasm/tests/integration.rs +0 -109
@@ -1,679 +0,0 @@
1
- // Physics tools for Unreal Engine using Automation Bridge
2
- import { UnrealBridge } from '../unreal-bridge.js';
3
- import { AutomationBridge } from '../automation/index.js';
4
- import { validateAssetParams, resolveSkeletalMeshPath, concurrencyDelay } from '../utils/validation.js';
5
- import { coerceString, coerceStringArray } from '../utils/result-helpers.js';
6
- import { wasmIntegration } from '../wasm/index.js';
7
-
8
- export class PhysicsTools {
9
- constructor(private bridge: UnrealBridge, private automationBridge?: AutomationBridge) { }
10
-
11
- setAutomationBridge(automationBridge?: AutomationBridge) { this.automationBridge = automationBridge; }
12
-
13
- /**
14
- * Helper to find a valid skeletal mesh in the project
15
- */
16
- private async findValidSkeletalMesh(): Promise<string | null> {
17
- if (!this.automationBridge) {
18
- // Return common fallback paths without plugin
19
- return '/Game/Characters/Mannequins/Meshes/SKM_Manny_Simple';
20
- }
21
-
22
- try {
23
- const response = await this.automationBridge.sendAutomationRequest('find_skeletal_mesh', {
24
- commonPaths: [
25
- '/Game/Characters/Mannequins/Meshes/SKM_Manny',
26
- '/Game/Characters/Mannequins/Meshes/SKM_Manny_Simple',
27
- '/Game/Characters/Mannequins/Meshes/SKM_Manny_Complex',
28
- '/Game/Characters/Mannequins/Meshes/SKM_Quinn',
29
- '/Game/Characters/Mannequins/Meshes/SKM_Quinn_Simple',
30
- '/Game/Characters/Mannequins/Meshes/SKM_Quinn_Complex'
31
- ],
32
- fallback: '/Engine/EngineMeshes/SkeletalCube'
33
- }, {
34
- timeoutMs: 30000
35
- });
36
-
37
- if (response.success !== false && response.result) {
38
- const meshPath = coerceString((response.result as any).meshPath);
39
- if (meshPath) {
40
- return meshPath;
41
- }
42
- }
43
-
44
- // Fallback to alternate path
45
- const alternate = coerceString((response.result as any)?.alternate);
46
- if (alternate) {
47
- return alternate;
48
- }
49
- } catch (error) {
50
- console.error('Failed to find skeletal mesh:', error);
51
- }
52
-
53
- return '/Engine/EngineMeshes/SkeletalCube';
54
- }
55
-
56
- /**
57
- * Setup Ragdoll Physics
58
- * NOTE: Requires a valid skeletal mesh to create physics asset
59
- * @param skeletonPath - Path to an existing skeletal mesh asset (required)
60
- * @param physicsAssetName - Name for the new physics asset
61
- * @param savePath - Directory to save the asset (default: /Game/Physics)
62
- */
63
- async setupRagdoll(params: {
64
- skeletonPath: string;
65
- physicsAssetName: string;
66
- savePath?: string;
67
- blendWeight?: number;
68
- constraints?: Array<{
69
- boneName: string;
70
- constraintType: 'Fixed' | 'Limited' | 'Free';
71
- limits?: {
72
- swing1?: number;
73
- swing2?: number;
74
- twist?: number;
75
- };
76
- }>;
77
- }) {
78
- try {
79
- // Strong validation for physics asset name
80
- if (!params.physicsAssetName || params.physicsAssetName.trim() === '') {
81
- return {
82
- success: false,
83
- message: 'Failed to setup ragdoll: Name cannot be empty',
84
- error: 'Name cannot be empty'
85
- };
86
- }
87
-
88
- // Check for invalid characters in name
89
- if (params.physicsAssetName.includes('@') || params.physicsAssetName.includes('#') ||
90
- params.physicsAssetName.includes('$') || params.physicsAssetName.includes('%')) {
91
- return {
92
- success: false,
93
- message: 'Failed to setup ragdoll: Name contains invalid characters',
94
- error: 'Name contains invalid characters'
95
- };
96
- }
97
-
98
- // Check if skeleton path is provided instead of skeletal mesh
99
- if (params.skeletonPath && (params.skeletonPath.includes('_Skeleton') ||
100
- params.skeletonPath.includes('SK_Mannequin') && !params.skeletonPath.includes('SKM_'))) {
101
- return {
102
- success: false,
103
- message: 'Failed to setup ragdoll: Must specify a valid skeletal mesh',
104
- error: 'Must specify a valid skeletal mesh, not a skeleton'
105
- };
106
- }
107
-
108
- // Validate and sanitize parameters
109
- const validation = validateAssetParams({
110
- name: params.physicsAssetName,
111
- savePath: params.savePath || '/Game/Physics'
112
- });
113
-
114
- if (!validation.valid) {
115
- return {
116
- success: false,
117
- message: `Failed to setup ragdoll: ${validation.error}`,
118
- error: validation.error
119
- };
120
- }
121
-
122
- const sanitizedParams = validation.sanitized;
123
- const path = sanitizedParams.savePath || '/Game/Physics';
124
-
125
- // Resolve skeletal mesh path
126
- let meshPath = params.skeletonPath;
127
-
128
- // Try to resolve skeleton to mesh mapping
129
- const resolvedPath = resolveSkeletalMeshPath(meshPath);
130
- if (resolvedPath && resolvedPath !== meshPath) {
131
- console.error(`Auto-correcting path from ${meshPath} to ${resolvedPath}`);
132
- meshPath = resolvedPath;
133
- }
134
-
135
- // Auto-resolve if it looks like a skeleton path or is empty
136
- if (!meshPath || meshPath.includes('_Skeleton') || meshPath === 'None' || meshPath === '') {
137
- console.error('Resolving skeletal mesh path...');
138
- const resolvedMesh = await this.findValidSkeletalMesh();
139
- if (resolvedMesh) {
140
- meshPath = resolvedMesh;
141
- console.error(`Using resolved skeletal mesh: ${meshPath}`);
142
- }
143
- }
144
-
145
- // Add concurrency delay to prevent race conditions
146
- await concurrencyDelay();
147
-
148
- // IMPORTANT: Physics assets require a SKELETAL MESH, not a skeleton
149
- // UE5 uses: /Game/Characters/Mannequins/Meshes/SKM_Manny_Simple or SKM_Quinn_Simple
150
- // UE4 used: /Game/Mannequin/Character/Mesh/SK_Mannequin (which no longer exists)
151
- // Alternate path: /Engine/EngineMeshes/SkeletalCube
152
-
153
- // Common skeleton paths that should be replaced with actual skeletal mesh paths
154
- const skeletonToMeshMap: { [key: string]: string } = {
155
- '/Game/Mannequin/Character/Mesh/UE4_Mannequin_Skeleton': '/Game/Characters/Mannequins/Meshes/SKM_Manny_Simple',
156
- '/Game/Characters/Mannequins/Meshes/SK_Mannequin': '/Game/Characters/Mannequins/Meshes/SKM_Manny_Simple',
157
- '/Game/Mannequin/Character/Mesh/SK_Mannequin': '/Game/Characters/Mannequins/Meshes/SKM_Manny_Simple',
158
- '/Game/Characters/Mannequins/Skeletons/UE5_Mannequin_Skeleton': '/Game/Characters/Mannequins/Meshes/SKM_Manny_Simple',
159
- '/Game/Characters/Mannequins/Skeletons/UE5_Female_Mannequin_Skeleton': '/Game/Characters/Mannequins/Meshes/SKM_Quinn_Simple'
160
- };
161
-
162
- // Auto-fix common incorrect paths
163
- let actualSkeletonPath = params.skeletonPath;
164
- if (actualSkeletonPath && skeletonToMeshMap[actualSkeletonPath]) {
165
- console.error(`Auto-correcting path from ${actualSkeletonPath} to ${skeletonToMeshMap[actualSkeletonPath]}`);
166
- actualSkeletonPath = skeletonToMeshMap[actualSkeletonPath];
167
- }
168
-
169
- if (actualSkeletonPath && (actualSkeletonPath.includes('_Skeleton') || actualSkeletonPath.includes('SK_Mannequin'))) {
170
- // This is likely a skeleton path, not a skeletal mesh
171
- console.error('Warning: Path appears to be a skeleton, not a skeletal mesh. Auto-correcting to SKM_Manny_Simple.');
172
- }
173
-
174
- // Use Automation Bridge for physics asset creation
175
- if (!this.automationBridge) {
176
- throw new Error('Automation Bridge not available. Physics asset creation requires plugin support.');
177
- }
178
-
179
- try {
180
- const response = await this.automationBridge.sendAutomationRequest('setup_ragdoll', {
181
- meshPath,
182
- physicsAssetName: sanitizedParams.name,
183
- savePath: path,
184
- blendWeight: params.blendWeight,
185
- constraints: params.constraints
186
- }, {
187
- timeoutMs: 120000 // 2 minutes for complex physics asset creation
188
- });
189
-
190
- if (response.success === false) {
191
- return {
192
- success: false,
193
- message: response.error || response.message || `Failed to setup ragdoll for ${sanitizedParams.name}`,
194
- error: response.error || response.message || 'Failed to setup ragdoll'
195
- };
196
- }
197
-
198
- const result = response.result as any;
199
- return {
200
- success: true,
201
- message: response.message || `Ragdoll physics setup completed for ${sanitizedParams.name}`,
202
- path: coerceString(result?.path) ?? coerceString(result?.physicsAssetPath) ?? `${path}/${sanitizedParams.name}`,
203
- existingAsset: result?.existingAsset,
204
- ...(result || {})
205
- };
206
- } catch (error) {
207
- return {
208
- success: false,
209
- message: 'Failed to setup ragdoll physics',
210
- error: String(error)
211
- };
212
- }
213
- } catch (err) {
214
- return { success: false, error: `Failed to setup ragdoll: ${err}` };
215
- }
216
- }
217
-
218
-
219
- /**
220
- * Create Physics Constraint
221
- */
222
- async createConstraint(params: {
223
- name: string;
224
- actor1: string;
225
- actor2: string;
226
- constraintType: 'Fixed' | 'Hinge' | 'Prismatic' | 'Ball' | 'Cone';
227
- location: [number, number, number];
228
- breakThreshold?: number;
229
- limits?: {
230
- swing1?: number;
231
- swing2?: number;
232
- twist?: number;
233
- linear?: number;
234
- };
235
- }) {
236
- try {
237
- // Spawn constraint actor
238
- const spawnCmd = `spawnactor /Script/Engine.PhysicsConstraintActor ${params.location[0]} ${params.location[1]} ${params.location[2]}`;
239
- await this.bridge.executeConsoleCommand(spawnCmd);
240
-
241
- // Configure constraint
242
- const commands = [
243
- `SetConstraintActors ${params.name} ${params.actor1} ${params.actor2}`,
244
- `SetConstraintType ${params.name} ${params.constraintType}`
245
- ];
246
-
247
- if (params.breakThreshold) {
248
- commands.push(`SetConstraintBreakThreshold ${params.name} ${params.breakThreshold}`);
249
- }
250
-
251
- if (params.limits) {
252
- const limits = params.limits;
253
- if (limits.swing1 !== undefined) {
254
- commands.push(`SetConstraintSwing1 ${params.name} ${limits.swing1}`);
255
- }
256
- if (limits.swing2 !== undefined) {
257
- commands.push(`SetConstraintSwing2 ${params.name} ${limits.swing2}`);
258
- }
259
- if (limits.twist !== undefined) {
260
- commands.push(`SetConstraintTwist ${params.name} ${limits.twist}`);
261
- }
262
- if (limits.linear !== undefined) {
263
- commands.push(`SetConstraintLinear ${params.name} ${limits.linear}`);
264
- }
265
- }
266
-
267
- await this.bridge.executeConsoleCommands(commands);
268
-
269
- return {
270
- success: true,
271
- message: `Physics constraint ${params.name} created between ${params.actor1} and ${params.actor2}`
272
- };
273
- } catch (err) {
274
- return { success: false, error: `Failed to create constraint: ${err}` };
275
- }
276
- }
277
-
278
- /**
279
- * Setup Chaos Destruction
280
- */
281
- async setupDestruction(params: {
282
- meshPath: string;
283
- destructionName: string;
284
- savePath?: string;
285
- fractureSettings?: {
286
- cellCount: number;
287
- minimumVolumeSize: number;
288
- seed: number;
289
- };
290
- damageThreshold?: number;
291
- debrisLifetime?: number;
292
- }) {
293
- try {
294
- const path = params.savePath || '/Game/Destruction';
295
-
296
- const commands = [
297
- `CreateGeometryCollection ${params.destructionName} ${params.meshPath} ${path}`
298
- ];
299
-
300
- // Configure fracture
301
- if (params.fractureSettings) {
302
- const settings = params.fractureSettings;
303
- commands.push(
304
- `FractureGeometry ${params.destructionName} ${settings.cellCount} ${settings.minimumVolumeSize} ${settings.seed}`
305
- );
306
- }
307
-
308
- // Set damage threshold
309
- if (params.damageThreshold) {
310
- commands.push(`SetDamageThreshold ${params.destructionName} ${params.damageThreshold}`);
311
- }
312
-
313
- // Set debris lifetime
314
- if (params.debrisLifetime) {
315
- commands.push(`SetDebrisLifetime ${params.destructionName} ${params.debrisLifetime}`);
316
- }
317
-
318
- await this.bridge.executeConsoleCommands(commands);
319
-
320
- return {
321
- success: true,
322
- message: `Chaos destruction ${params.destructionName} created`,
323
- path: `${path}/${params.destructionName}`
324
- };
325
- } catch (err) {
326
- return { success: false, error: `Failed to setup destruction: ${err}` };
327
- }
328
- }
329
-
330
- /**
331
- * Configure Vehicle Physics
332
- */
333
- async configureVehicle(params: {
334
- vehicleName: string;
335
- vehicleType: string;
336
- wheels?: Array<{
337
- name: string;
338
- radius: number;
339
- width: number;
340
- mass: number;
341
- isSteering: boolean;
342
- isDriving: boolean;
343
- }>;
344
- engine?: {
345
- maxRPM: number;
346
- torqueCurve: Array<[number, number]>;
347
- };
348
- transmission?: {
349
- gears: number[];
350
- finalDriveRatio: number;
351
- };
352
- pluginDependencies?: string[];
353
- }) {
354
- // Plugin check removed as ensurePluginsEnabled is deprecated.
355
- // Users should ensure required plugins are enabled in the editor.
356
-
357
- const rawParams: any = params as any;
358
-
359
- const pluginDeps: string[] | undefined = Array.isArray(params.pluginDependencies) && params.pluginDependencies.length > 0
360
- ? params.pluginDependencies
361
- : (Array.isArray(rawParams.plugins) && rawParams.plugins.length > 0 ? rawParams.plugins : undefined);
362
-
363
- if (pluginDeps && pluginDeps.length > 0) {
364
- return {
365
- success: false,
366
- error: 'MISSING_ENGINE_PLUGINS',
367
- missingPlugins: pluginDeps,
368
- message: `Required engine plugins not enabled: ${pluginDeps.join(', ')}`
369
- };
370
- }
371
-
372
- const warnings: string[] = [];
373
-
374
- const hasExplicitEmptyWheels = Array.isArray(params.wheels) && params.wheels.length === 0;
375
-
376
- const effectiveVehicleType = typeof params.vehicleType === 'string' && params.vehicleType.trim().length > 0
377
- ? params.vehicleType
378
- : 'Car';
379
-
380
- const commands = [
381
- `CreateVehicle ${params.vehicleName} ${effectiveVehicleType}`
382
- ];
383
-
384
- // Configure wheels when provided
385
- if (Array.isArray(params.wheels) && params.wheels.length > 0) {
386
- for (const wheel of params.wheels) {
387
- commands.push(
388
- `AddVehicleWheel ${params.vehicleName} ${wheel.name} ${wheel.radius} ${wheel.width} ${wheel.mass}`
389
- );
390
-
391
- if (wheel.isSteering) {
392
- commands.push(`SetWheelSteering ${params.vehicleName} ${wheel.name} true`);
393
- }
394
- if (wheel.isDriving) {
395
- commands.push(`SetWheelDriving ${params.vehicleName} ${wheel.name} true`);
396
- }
397
- }
398
- }
399
-
400
- // Configure engine (optional). Clamp negative RPMs and tolerate missing torqueCurve.
401
- const effectiveEngine = params.engine ?? ((typeof rawParams.maxRPM === 'number' || Array.isArray(rawParams.torqueCurve))
402
- ? { maxRPM: rawParams.maxRPM, torqueCurve: rawParams.torqueCurve }
403
- : undefined);
404
-
405
- if (effectiveEngine) {
406
- let maxRPM = typeof effectiveEngine.maxRPM === 'number' ? effectiveEngine.maxRPM : 0;
407
- if (maxRPM < 0) {
408
- maxRPM = 0;
409
- warnings.push('Engine maxRPM was negative and has been clamped to 0.');
410
- }
411
- commands.push(`SetEngineMaxRPM ${params.vehicleName} ${maxRPM}`);
412
-
413
- const rawCurve = Array.isArray(effectiveEngine.torqueCurve) ? effectiveEngine.torqueCurve : [];
414
- for (const point of rawCurve) {
415
- let rpm: number | undefined;
416
- let torque: number | undefined;
417
-
418
- if (Array.isArray(point) && point.length >= 2) {
419
- rpm = Number(point[0]);
420
- torque = Number(point[1]);
421
- } else if (point && typeof point === 'object') {
422
- const anyPoint: any = point;
423
- rpm = typeof anyPoint.rpm === 'number' ? anyPoint.rpm : undefined;
424
- torque = typeof anyPoint.torque === 'number' ? anyPoint.torque : undefined;
425
- }
426
-
427
- if (typeof rpm === 'number' && typeof torque === 'number') {
428
- commands.push(`AddTorqueCurvePoint ${params.vehicleName} ${rpm} ${torque}`);
429
- }
430
- }
431
- }
432
-
433
- // Configure transmission
434
- if (params.transmission) {
435
- if (Array.isArray(params.transmission.gears)) {
436
- for (let i = 0; i < params.transmission.gears.length; i++) {
437
- commands.push(
438
- `SetGearRatio ${params.vehicleName} ${i} ${params.transmission.gears[i]}`
439
- );
440
- }
441
- }
442
- if (typeof params.transmission.finalDriveRatio === 'number') {
443
- commands.push(
444
- `SetFinalDriveRatio ${params.vehicleName} ${params.transmission.finalDriveRatio}`
445
- );
446
- }
447
- }
448
-
449
- try {
450
- await this.bridge.executeConsoleCommands(commands);
451
- } catch (_error) {
452
- // If vehicle console commands fail (e.g., `Command not executed`), treat this as
453
- // a best-effort configuration that falls back to engine defaults.
454
- if (warnings.length === 0) {
455
- warnings.push('Vehicle configuration commands could not be executed; using engine defaults.');
456
- }
457
- }
458
-
459
- if (hasExplicitEmptyWheels) {
460
- warnings.push('No wheels specified; using default wheels from vehicle preset.');
461
- }
462
-
463
- if (warnings.length === 0) {
464
- warnings.push('Verify wheel class assignments and offsets in the vehicle movement component to ensure they match your project defaults.');
465
- }
466
-
467
- return {
468
- success: true,
469
- message: `Vehicle ${params.vehicleName} configured`,
470
- warnings
471
- };
472
- }
473
-
474
- /**
475
- * Apply Force or Impulse to Actor
476
- */
477
- async applyForce(params: {
478
- actorName: string;
479
- forceType: 'Force' | 'Impulse' | 'Velocity' | 'Torque';
480
- vector: [number, number, number];
481
- boneName?: string;
482
- isLocal?: boolean;
483
- }) {
484
- if (!this.automationBridge) {
485
- throw new Error('Automation Bridge not available. Physics force application requires plugin support.');
486
- }
487
-
488
- try {
489
- // Use WASM for vector normalization/validation
490
- const zeroVector: [number, number, number] = [0, 0, 0];
491
- const normalizedVector = wasmIntegration.vectorAdd(zeroVector, params.vector);
492
- console.error('[WASM] Using vectorAdd for physics force vector processing');
493
-
494
- const response = await this.automationBridge.sendAutomationRequest('apply_force', {
495
- actorName: params.actorName,
496
- forceType: params.forceType,
497
- vector: normalizedVector,
498
- boneName: params.boneName,
499
- isLocal: params.isLocal
500
- }, {
501
- timeoutMs: 30000
502
- });
503
-
504
- if (response.success === false) {
505
- const result = response.result as any;
506
- return {
507
- success: false,
508
- error: response.error || response.message || 'Force application failed',
509
- availableActors: result?.available_actors ? coerceStringArray(result.available_actors) : undefined,
510
- details: result?.details
511
- };
512
- }
513
-
514
- const result = response.result as any;
515
- return {
516
- success: true,
517
- message: response.message || `Applied ${params.forceType} to ${params.actorName}`,
518
- availableActors: result?.available_actors ? coerceStringArray(result.available_actors) : undefined,
519
- ...(result || {})
520
- };
521
- } catch (err) {
522
- return { success: false, error: `Failed to apply force: ${err}` };
523
- }
524
- }
525
-
526
- /**
527
- * Configure Cloth Simulation
528
- */
529
- async setupCloth(params: {
530
- meshName: string;
531
- clothPreset: 'Silk' | 'Leather' | 'Denim' | 'Rubber' | 'Custom';
532
- customSettings?: {
533
- stiffness?: number;
534
- damping?: number;
535
- friction?: number;
536
- density?: number;
537
- gravity?: number;
538
- windVelocity?: [number, number, number];
539
- };
540
- }) {
541
- try {
542
- const commands = [
543
- `EnableClothSimulation ${params.meshName}`,
544
- `SetClothPreset ${params.meshName} ${params.clothPreset}`
545
- ];
546
-
547
- if (params.clothPreset === 'Custom' && params.customSettings) {
548
- const settings = params.customSettings;
549
-
550
- if (settings.stiffness !== undefined) {
551
- commands.push(`SetClothStiffness ${params.meshName} ${settings.stiffness}`);
552
- }
553
- if (settings.damping !== undefined) {
554
- commands.push(`SetClothDamping ${params.meshName} ${settings.damping}`);
555
- }
556
- if (settings.friction !== undefined) {
557
- commands.push(`SetClothFriction ${params.meshName} ${settings.friction}`);
558
- }
559
- if (settings.density !== undefined) {
560
- commands.push(`SetClothDensity ${params.meshName} ${settings.density}`);
561
- }
562
- if (settings.gravity !== undefined) {
563
- commands.push(`SetClothGravity ${params.meshName} ${settings.gravity}`);
564
- }
565
- if (settings.windVelocity) {
566
- const wind = settings.windVelocity;
567
- commands.push(`SetClothWind ${params.meshName} ${wind[0]} ${wind[1]} ${wind[2]}`);
568
- }
569
- }
570
-
571
- await this.bridge.executeConsoleCommands(commands);
572
-
573
- return {
574
- success: true,
575
- message: `Cloth simulation enabled for ${params.meshName}`
576
- };
577
- } catch (err) {
578
- return { success: false, error: `Failed to setup cloth: ${err}` };
579
- }
580
- }
581
-
582
- /**
583
- * Create Fluid Simulation (Niagara-based)
584
- */
585
- async createFluidSimulation(params: {
586
- name: string;
587
- fluidType: 'Water' | 'Smoke' | 'Fire' | 'Lava' | 'Custom';
588
- location: [number, number, number];
589
- volume: [number, number, number];
590
- customSettings?: {
591
- viscosity?: number;
592
- density?: number;
593
- temperature?: number;
594
- turbulence?: number;
595
- color?: [number, number, number, number];
596
- };
597
- }) {
598
- try {
599
- const locStr = `${params.location[0]} ${params.location[1]} ${params.location[2]}`;
600
- const volStr = `${params.volume[0]} ${params.volume[1]} ${params.volume[2]}`;
601
-
602
- const commands = [
603
- `CreateFluidSimulation ${params.name} ${params.fluidType} ${locStr} ${volStr}`
604
- ];
605
-
606
- if (params.customSettings) {
607
- const settings = params.customSettings;
608
-
609
- if (settings.viscosity !== undefined) {
610
- commands.push(`SetFluidViscosity ${params.name} ${settings.viscosity}`);
611
- }
612
- if (settings.density !== undefined) {
613
- commands.push(`SetFluidDensity ${params.name} ${settings.density}`);
614
- }
615
- if (settings.temperature !== undefined) {
616
- commands.push(`SetFluidTemperature ${params.name} ${settings.temperature}`);
617
- }
618
- if (settings.turbulence !== undefined) {
619
- commands.push(`SetFluidTurbulence ${params.name} ${settings.turbulence}`);
620
- }
621
- if (settings.color) {
622
- const color = settings.color;
623
- commands.push(
624
- `SetFluidColor ${params.name} ${color[0]} ${color[1]} ${color[2]} ${color[3]}`
625
- );
626
- }
627
- }
628
-
629
- await this.bridge.executeConsoleCommands(commands);
630
-
631
- return {
632
- success: true,
633
- message: `Fluid simulation ${params.name} created`
634
- };
635
- } catch (err) {
636
- return { success: false, error: `Failed to create fluid simulation: ${err}` };
637
- }
638
- }
639
-
640
- /**
641
- * Setup Physics Simulation (Create Physics Asset)
642
- */
643
- async setupPhysicsSimulation(params: {
644
- meshPath?: string;
645
- skeletonPath?: string;
646
- physicsAssetName?: string;
647
- savePath?: string;
648
- }) {
649
- if (!this.automationBridge) {
650
- throw new Error('Automation Bridge not available. Physics asset creation requires plugin support.');
651
- }
652
-
653
- try {
654
- const response = await this.automationBridge.sendAutomationRequest('animation_physics', {
655
- action: 'setup_physics_simulation',
656
- ...params
657
- }, {
658
- timeoutMs: 60000
659
- });
660
-
661
- if (response.success === false) {
662
- return {
663
- success: false,
664
- message: response.error || response.message || 'Failed to setup physics simulation',
665
- error: response.error || response.message
666
- };
667
- }
668
-
669
- return {
670
- success: true,
671
- message: response.message || 'Physics simulation setup completed',
672
- ...(response.result || {})
673
- };
674
- } catch (err) {
675
- return { success: false, error: `Failed to setup physics simulation: ${err}` };
676
- }
677
- }
678
-
679
- }