unreal-engine-mcp-server 0.4.7 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (454) hide show
  1. package/.env.example +26 -0
  2. package/.env.production +38 -7
  3. package/.eslintrc.json +0 -54
  4. package/.eslintrc.override.json +8 -0
  5. package/.github/ISSUE_TEMPLATE/bug_report.yml +94 -0
  6. package/.github/ISSUE_TEMPLATE/config.yml +8 -0
  7. package/.github/ISSUE_TEMPLATE/feature_request.yml +56 -0
  8. package/.github/copilot-instructions.md +478 -45
  9. package/.github/dependabot.yml +19 -0
  10. package/.github/labeler.yml +24 -0
  11. package/.github/labels.yml +70 -0
  12. package/.github/pull_request_template.md +42 -0
  13. package/.github/release-drafter-config.yml +51 -0
  14. package/.github/workflows/auto-merge.yml +38 -0
  15. package/.github/workflows/ci.yml +38 -0
  16. package/.github/workflows/dependency-review.yml +17 -0
  17. package/.github/workflows/gemini-issue-triage.yml +172 -0
  18. package/.github/workflows/greetings.yml +27 -0
  19. package/.github/workflows/labeler.yml +17 -0
  20. package/.github/workflows/links.yml +80 -0
  21. package/.github/workflows/pr-size-labeler.yml +137 -0
  22. package/.github/workflows/publish-mcp.yml +13 -7
  23. package/.github/workflows/release-drafter.yml +23 -0
  24. package/.github/workflows/release.yml +112 -0
  25. package/.github/workflows/semantic-pull-request.yml +35 -0
  26. package/.github/workflows/smoke-test.yml +36 -0
  27. package/.github/workflows/stale.yml +28 -0
  28. package/CHANGELOG.md +338 -31
  29. package/CONTRIBUTING.md +140 -0
  30. package/GEMINI.md +115 -0
  31. package/Public/Plugin_setup_guide.mp4 +0 -0
  32. package/README.md +189 -128
  33. package/claude_desktop_config_example.json +7 -6
  34. package/dist/automation/bridge.d.ts +50 -0
  35. package/dist/automation/bridge.js +452 -0
  36. package/dist/automation/connection-manager.d.ts +23 -0
  37. package/dist/automation/connection-manager.js +107 -0
  38. package/dist/automation/handshake.d.ts +11 -0
  39. package/dist/automation/handshake.js +89 -0
  40. package/dist/automation/index.d.ts +3 -0
  41. package/dist/automation/index.js +3 -0
  42. package/dist/automation/message-handler.d.ts +12 -0
  43. package/dist/automation/message-handler.js +149 -0
  44. package/dist/automation/request-tracker.d.ts +25 -0
  45. package/dist/automation/request-tracker.js +98 -0
  46. package/dist/automation/types.d.ts +130 -0
  47. package/dist/automation/types.js +2 -0
  48. package/dist/cli.js +32 -5
  49. package/dist/config.d.ts +26 -0
  50. package/dist/config.js +59 -0
  51. package/dist/constants.d.ts +16 -0
  52. package/dist/constants.js +16 -0
  53. package/dist/graphql/loaders.d.ts +64 -0
  54. package/dist/graphql/loaders.js +117 -0
  55. package/dist/graphql/resolvers.d.ts +268 -0
  56. package/dist/graphql/resolvers.js +746 -0
  57. package/dist/graphql/schema.d.ts +5 -0
  58. package/dist/graphql/schema.js +437 -0
  59. package/dist/graphql/server.d.ts +26 -0
  60. package/dist/graphql/server.js +117 -0
  61. package/dist/graphql/types.d.ts +9 -0
  62. package/dist/graphql/types.js +2 -0
  63. package/dist/handlers/resource-handlers.d.ts +20 -0
  64. package/dist/handlers/resource-handlers.js +180 -0
  65. package/dist/index.d.ts +33 -18
  66. package/dist/index.js +130 -619
  67. package/dist/resources/actors.d.ts +17 -12
  68. package/dist/resources/actors.js +56 -76
  69. package/dist/resources/assets.d.ts +6 -14
  70. package/dist/resources/assets.js +115 -147
  71. package/dist/resources/levels.d.ts +13 -13
  72. package/dist/resources/levels.js +25 -34
  73. package/dist/server/resource-registry.d.ts +20 -0
  74. package/dist/server/resource-registry.js +37 -0
  75. package/dist/server/tool-registry.d.ts +23 -0
  76. package/dist/server/tool-registry.js +322 -0
  77. package/dist/server-setup.d.ts +20 -0
  78. package/dist/server-setup.js +71 -0
  79. package/dist/services/health-monitor.d.ts +34 -0
  80. package/dist/services/health-monitor.js +105 -0
  81. package/dist/services/metrics-server.d.ts +11 -0
  82. package/dist/services/metrics-server.js +105 -0
  83. package/dist/tools/actors.d.ts +163 -9
  84. package/dist/tools/actors.js +356 -311
  85. package/dist/tools/animation.d.ts +135 -4
  86. package/dist/tools/animation.js +510 -411
  87. package/dist/tools/assets.d.ts +75 -29
  88. package/dist/tools/assets.js +265 -284
  89. package/dist/tools/audio.d.ts +102 -42
  90. package/dist/tools/audio.js +272 -685
  91. package/dist/tools/base-tool.d.ts +17 -0
  92. package/dist/tools/base-tool.js +46 -0
  93. package/dist/tools/behavior-tree.d.ts +94 -0
  94. package/dist/tools/behavior-tree.js +39 -0
  95. package/dist/tools/blueprint.d.ts +208 -126
  96. package/dist/tools/blueprint.js +685 -832
  97. package/dist/tools/consolidated-tool-definitions.d.ts +5462 -1781
  98. package/dist/tools/consolidated-tool-definitions.js +829 -496
  99. package/dist/tools/consolidated-tool-handlers.d.ts +2 -1
  100. package/dist/tools/consolidated-tool-handlers.js +198 -1027
  101. package/dist/tools/debug.d.ts +143 -85
  102. package/dist/tools/debug.js +234 -180
  103. package/dist/tools/dynamic-handler-registry.d.ts +13 -0
  104. package/dist/tools/dynamic-handler-registry.js +23 -0
  105. package/dist/tools/editor.d.ts +30 -83
  106. package/dist/tools/editor.js +247 -244
  107. package/dist/tools/engine.d.ts +10 -4
  108. package/dist/tools/engine.js +13 -5
  109. package/dist/tools/environment.d.ts +30 -0
  110. package/dist/tools/environment.js +267 -0
  111. package/dist/tools/foliage.d.ts +65 -99
  112. package/dist/tools/foliage.js +221 -331
  113. package/dist/tools/handlers/actor-handlers.d.ts +3 -0
  114. package/dist/tools/handlers/actor-handlers.js +227 -0
  115. package/dist/tools/handlers/animation-handlers.d.ts +3 -0
  116. package/dist/tools/handlers/animation-handlers.js +185 -0
  117. package/dist/tools/handlers/argument-helper.d.ts +16 -0
  118. package/dist/tools/handlers/argument-helper.js +80 -0
  119. package/dist/tools/handlers/asset-handlers.d.ts +3 -0
  120. package/dist/tools/handlers/asset-handlers.js +496 -0
  121. package/dist/tools/handlers/audio-handlers.d.ts +3 -0
  122. package/dist/tools/handlers/audio-handlers.js +166 -0
  123. package/dist/tools/handlers/blueprint-handlers.d.ts +4 -0
  124. package/dist/tools/handlers/blueprint-handlers.js +358 -0
  125. package/dist/tools/handlers/common-handlers.d.ts +14 -0
  126. package/dist/tools/handlers/common-handlers.js +56 -0
  127. package/dist/tools/handlers/editor-handlers.d.ts +3 -0
  128. package/dist/tools/handlers/editor-handlers.js +119 -0
  129. package/dist/tools/handlers/effect-handlers.d.ts +3 -0
  130. package/dist/tools/handlers/effect-handlers.js +171 -0
  131. package/dist/tools/handlers/environment-handlers.d.ts +3 -0
  132. package/dist/tools/handlers/environment-handlers.js +170 -0
  133. package/dist/tools/handlers/graph-handlers.d.ts +3 -0
  134. package/dist/tools/handlers/graph-handlers.js +90 -0
  135. package/dist/tools/handlers/input-handlers.d.ts +3 -0
  136. package/dist/tools/handlers/input-handlers.js +21 -0
  137. package/dist/tools/handlers/inspect-handlers.d.ts +3 -0
  138. package/dist/tools/handlers/inspect-handlers.js +383 -0
  139. package/dist/tools/handlers/level-handlers.d.ts +3 -0
  140. package/dist/tools/handlers/level-handlers.js +237 -0
  141. package/dist/tools/handlers/lighting-handlers.d.ts +3 -0
  142. package/dist/tools/handlers/lighting-handlers.js +144 -0
  143. package/dist/tools/handlers/performance-handlers.d.ts +3 -0
  144. package/dist/tools/handlers/performance-handlers.js +130 -0
  145. package/dist/tools/handlers/pipeline-handlers.d.ts +3 -0
  146. package/dist/tools/handlers/pipeline-handlers.js +110 -0
  147. package/dist/tools/handlers/sequence-handlers.d.ts +3 -0
  148. package/dist/tools/handlers/sequence-handlers.js +376 -0
  149. package/dist/tools/handlers/system-handlers.d.ts +4 -0
  150. package/dist/tools/handlers/system-handlers.js +506 -0
  151. package/dist/tools/input.d.ts +19 -0
  152. package/dist/tools/input.js +89 -0
  153. package/dist/tools/introspection.d.ts +103 -40
  154. package/dist/tools/introspection.js +425 -568
  155. package/dist/tools/landscape.d.ts +54 -93
  156. package/dist/tools/landscape.js +284 -409
  157. package/dist/tools/level.d.ts +66 -27
  158. package/dist/tools/level.js +647 -675
  159. package/dist/tools/lighting.d.ts +77 -38
  160. package/dist/tools/lighting.js +445 -943
  161. package/dist/tools/logs.d.ts +3 -3
  162. package/dist/tools/logs.js +5 -57
  163. package/dist/tools/materials.d.ts +91 -24
  164. package/dist/tools/materials.js +194 -118
  165. package/dist/tools/niagara.d.ts +149 -39
  166. package/dist/tools/niagara.js +267 -182
  167. package/dist/tools/performance.d.ts +27 -13
  168. package/dist/tools/performance.js +203 -122
  169. package/dist/tools/physics.d.ts +32 -77
  170. package/dist/tools/physics.js +175 -582
  171. package/dist/tools/property-dictionary.d.ts +13 -0
  172. package/dist/tools/property-dictionary.js +82 -0
  173. package/dist/tools/sequence.d.ts +85 -60
  174. package/dist/tools/sequence.js +208 -747
  175. package/dist/tools/tool-definition-utils.d.ts +59 -0
  176. package/dist/tools/tool-definition-utils.js +35 -0
  177. package/dist/tools/ui.d.ts +64 -34
  178. package/dist/tools/ui.js +134 -214
  179. package/dist/types/automation-responses.d.ts +115 -0
  180. package/dist/types/automation-responses.js +2 -0
  181. package/dist/types/env.d.ts +0 -3
  182. package/dist/types/env.js +0 -7
  183. package/dist/types/responses.d.ts +249 -0
  184. package/dist/types/responses.js +2 -0
  185. package/dist/types/tool-interfaces.d.ts +898 -0
  186. package/dist/types/tool-interfaces.js +2 -0
  187. package/dist/types/tool-types.d.ts +183 -19
  188. package/dist/types/tool-types.js +0 -4
  189. package/dist/unreal-bridge.d.ts +24 -131
  190. package/dist/unreal-bridge.js +364 -1506
  191. package/dist/utils/command-validator.d.ts +9 -0
  192. package/dist/utils/command-validator.js +68 -0
  193. package/dist/utils/elicitation.d.ts +1 -1
  194. package/dist/utils/elicitation.js +12 -15
  195. package/dist/utils/error-handler.d.ts +2 -51
  196. package/dist/utils/error-handler.js +11 -87
  197. package/dist/utils/ini-reader.d.ts +3 -0
  198. package/dist/utils/ini-reader.js +69 -0
  199. package/dist/utils/logger.js +9 -6
  200. package/dist/utils/normalize.d.ts +3 -0
  201. package/dist/utils/normalize.js +56 -0
  202. package/dist/utils/path-security.d.ts +2 -0
  203. package/dist/utils/path-security.js +24 -0
  204. package/dist/utils/response-factory.d.ts +7 -0
  205. package/dist/utils/response-factory.js +27 -0
  206. package/dist/utils/response-validator.d.ts +3 -24
  207. package/dist/utils/response-validator.js +130 -81
  208. package/dist/utils/result-helpers.d.ts +4 -5
  209. package/dist/utils/result-helpers.js +15 -16
  210. package/dist/utils/safe-json.js +5 -11
  211. package/dist/utils/unreal-command-queue.d.ts +24 -0
  212. package/dist/utils/unreal-command-queue.js +120 -0
  213. package/dist/utils/validation.d.ts +0 -40
  214. package/dist/utils/validation.js +1 -78
  215. package/dist/wasm/index.d.ts +70 -0
  216. package/dist/wasm/index.js +535 -0
  217. package/docs/GraphQL-API.md +888 -0
  218. package/docs/Migration-Guide-v0.5.0.md +684 -0
  219. package/docs/Roadmap.md +53 -0
  220. package/docs/WebAssembly-Integration.md +628 -0
  221. package/docs/editor-plugin-extension.md +370 -0
  222. package/docs/handler-mapping.md +242 -0
  223. package/docs/native-automation-progress.md +128 -0
  224. package/docs/testing-guide.md +423 -0
  225. package/mcp-config-example.json +6 -6
  226. package/package.json +67 -28
  227. package/plugins/McpAutomationBridge/Config/FilterPlugin.ini +8 -0
  228. package/plugins/McpAutomationBridge/McpAutomationBridge.uplugin +64 -0
  229. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/McpAutomationBridge.Build.cs +189 -0
  230. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.cpp +22 -0
  231. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.h +30 -0
  232. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeHelpers.h +1983 -0
  233. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeModule.cpp +72 -0
  234. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSettings.cpp +46 -0
  235. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSubsystem.cpp +581 -0
  236. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AnimationHandlers.cpp +2394 -0
  237. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetQueryHandlers.cpp +300 -0
  238. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetWorkflowHandlers.cpp +2807 -0
  239. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AudioHandlers.cpp +1087 -0
  240. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BehaviorTreeHandlers.cpp +488 -0
  241. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.cpp +643 -0
  242. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.h +31 -0
  243. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintGraphHandlers.cpp +1184 -0
  244. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers.cpp +5652 -0
  245. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers_List.cpp +152 -0
  246. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ControlHandlers.cpp +2614 -0
  247. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_DebugHandlers.cpp +42 -0
  248. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EditorFunctionHandlers.cpp +1237 -0
  249. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EffectHandlers.cpp +1701 -0
  250. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EnvironmentHandlers.cpp +2145 -0
  251. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_FoliageHandlers.cpp +954 -0
  252. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InputHandlers.cpp +209 -0
  253. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InsightsHandlers.cpp +41 -0
  254. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LandscapeHandlers.cpp +1164 -0
  255. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LevelHandlers.cpp +762 -0
  256. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LightingHandlers.cpp +634 -0
  257. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LogHandlers.cpp +136 -0
  258. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_MaterialGraphHandlers.cpp +494 -0
  259. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraGraphHandlers.cpp +278 -0
  260. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraHandlers.cpp +625 -0
  261. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PerformanceHandlers.cpp +401 -0
  262. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PipelineHandlers.cpp +67 -0
  263. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ProcessRequest.cpp +735 -0
  264. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PropertyHandlers.cpp +2634 -0
  265. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_RenderHandlers.cpp +189 -0
  266. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.cpp +917 -0
  267. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.h +39 -0
  268. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequenceHandlers.cpp +2670 -0
  269. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequencerHandlers.cpp +519 -0
  270. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_TestHandlers.cpp +38 -0
  271. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_UiHandlers.cpp +668 -0
  272. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_WorldPartitionHandlers.cpp +346 -0
  273. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.cpp +1330 -0
  274. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.h +149 -0
  275. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpConnectionManager.cpp +783 -0
  276. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSettings.h +115 -0
  277. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSubsystem.h +796 -0
  278. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpConnectionManager.h +117 -0
  279. package/scripts/check-unreal-connection.mjs +19 -0
  280. package/scripts/clean-tmp.js +23 -0
  281. package/scripts/patch-wasm.js +26 -0
  282. package/scripts/run-all-tests.mjs +136 -0
  283. package/scripts/smoke-test.ts +94 -0
  284. package/scripts/sync-mcp-plugin.js +143 -0
  285. package/scripts/test-no-plugin-alternates.mjs +113 -0
  286. package/scripts/validate-server.js +46 -0
  287. package/scripts/verify-automation-bridge.js +200 -0
  288. package/server.json +58 -21
  289. package/src/automation/bridge.ts +558 -0
  290. package/src/automation/connection-manager.ts +130 -0
  291. package/src/automation/handshake.ts +99 -0
  292. package/src/automation/index.ts +2 -0
  293. package/src/automation/message-handler.ts +167 -0
  294. package/src/automation/request-tracker.ts +123 -0
  295. package/src/automation/types.ts +107 -0
  296. package/src/cli.ts +33 -6
  297. package/src/config.ts +73 -0
  298. package/src/constants.ts +19 -0
  299. package/src/graphql/loaders.ts +244 -0
  300. package/src/graphql/resolvers.ts +1008 -0
  301. package/src/graphql/schema.ts +452 -0
  302. package/src/graphql/server.ts +156 -0
  303. package/src/graphql/types.ts +10 -0
  304. package/src/handlers/resource-handlers.ts +186 -0
  305. package/src/index.ts +166 -664
  306. package/src/resources/actors.ts +58 -76
  307. package/src/resources/assets.ts +148 -134
  308. package/src/resources/levels.ts +28 -33
  309. package/src/server/resource-registry.ts +47 -0
  310. package/src/server/tool-registry.ts +354 -0
  311. package/src/server-setup.ts +114 -0
  312. package/src/services/health-monitor.ts +132 -0
  313. package/src/services/metrics-server.ts +142 -0
  314. package/src/tools/actors.ts +426 -323
  315. package/src/tools/animation.ts +672 -461
  316. package/src/tools/assets.ts +364 -289
  317. package/src/tools/audio.ts +323 -766
  318. package/src/tools/base-tool.ts +52 -0
  319. package/src/tools/behavior-tree.ts +45 -0
  320. package/src/tools/blueprint.ts +792 -970
  321. package/src/tools/consolidated-tool-definitions.ts +993 -515
  322. package/src/tools/consolidated-tool-handlers.ts +258 -1146
  323. package/src/tools/debug.ts +292 -187
  324. package/src/tools/dynamic-handler-registry.ts +33 -0
  325. package/src/tools/editor.ts +329 -253
  326. package/src/tools/engine.ts +14 -3
  327. package/src/tools/environment.ts +281 -0
  328. package/src/tools/foliage.ts +330 -392
  329. package/src/tools/handlers/actor-handlers.ts +265 -0
  330. package/src/tools/handlers/animation-handlers.ts +237 -0
  331. package/src/tools/handlers/argument-helper.ts +142 -0
  332. package/src/tools/handlers/asset-handlers.ts +532 -0
  333. package/src/tools/handlers/audio-handlers.ts +194 -0
  334. package/src/tools/handlers/blueprint-handlers.ts +380 -0
  335. package/src/tools/handlers/common-handlers.ts +87 -0
  336. package/src/tools/handlers/editor-handlers.ts +123 -0
  337. package/src/tools/handlers/effect-handlers.ts +220 -0
  338. package/src/tools/handlers/environment-handlers.ts +183 -0
  339. package/src/tools/handlers/graph-handlers.ts +116 -0
  340. package/src/tools/handlers/input-handlers.ts +28 -0
  341. package/src/tools/handlers/inspect-handlers.ts +450 -0
  342. package/src/tools/handlers/level-handlers.ts +252 -0
  343. package/src/tools/handlers/lighting-handlers.ts +147 -0
  344. package/src/tools/handlers/performance-handlers.ts +132 -0
  345. package/src/tools/handlers/pipeline-handlers.ts +127 -0
  346. package/src/tools/handlers/sequence-handlers.ts +415 -0
  347. package/src/tools/handlers/system-handlers.ts +564 -0
  348. package/src/tools/input.ts +101 -0
  349. package/src/tools/introspection.ts +493 -584
  350. package/src/tools/landscape.ts +418 -507
  351. package/src/tools/level.ts +786 -708
  352. package/src/tools/lighting.ts +588 -984
  353. package/src/tools/logs.ts +9 -57
  354. package/src/tools/materials.ts +237 -121
  355. package/src/tools/niagara.ts +335 -168
  356. package/src/tools/performance.ts +320 -169
  357. package/src/tools/physics.ts +274 -613
  358. package/src/tools/property-dictionary.ts +98 -0
  359. package/src/tools/sequence.ts +276 -820
  360. package/src/tools/tool-definition-utils.ts +35 -0
  361. package/src/tools/ui.ts +205 -283
  362. package/src/types/automation-responses.ts +119 -0
  363. package/src/types/env.ts +0 -10
  364. package/src/types/responses.ts +355 -0
  365. package/src/types/tool-interfaces.ts +250 -0
  366. package/src/types/tool-types.ts +243 -21
  367. package/src/unreal-bridge.ts +460 -1550
  368. package/src/utils/command-validator.ts +76 -0
  369. package/src/utils/elicitation.ts +10 -7
  370. package/src/utils/error-handler.ts +14 -90
  371. package/src/utils/ini-reader.ts +86 -0
  372. package/src/utils/logger.ts +8 -3
  373. package/src/utils/normalize.test.ts +162 -0
  374. package/src/utils/normalize.ts +60 -0
  375. package/src/utils/path-security.ts +43 -0
  376. package/src/utils/response-factory.ts +44 -0
  377. package/src/utils/response-validator.ts +176 -56
  378. package/src/utils/result-helpers.ts +21 -19
  379. package/src/utils/safe-json.test.ts +90 -0
  380. package/src/utils/safe-json.ts +14 -11
  381. package/src/utils/unreal-command-queue.ts +152 -0
  382. package/src/utils/validation.test.ts +184 -0
  383. package/src/utils/validation.ts +4 -1
  384. package/src/wasm/index.ts +838 -0
  385. package/test-server.mjs +100 -0
  386. package/tests/run-unreal-tool-tests.mjs +242 -14
  387. package/tests/test-animation.mjs +369 -0
  388. package/tests/test-asset-advanced.mjs +82 -0
  389. package/tests/test-asset-errors.mjs +35 -0
  390. package/tests/test-asset-graph.mjs +311 -0
  391. package/tests/test-audio.mjs +417 -0
  392. package/tests/test-automation-timeouts.mjs +98 -0
  393. package/tests/test-behavior-tree.mjs +444 -0
  394. package/tests/test-blueprint-graph.mjs +410 -0
  395. package/tests/test-blueprint.mjs +577 -0
  396. package/tests/test-client-mode.mjs +86 -0
  397. package/tests/test-console-command.mjs +56 -0
  398. package/tests/test-control-actor.mjs +425 -0
  399. package/tests/test-control-editor.mjs +112 -0
  400. package/tests/test-graphql.mjs +372 -0
  401. package/tests/test-input.mjs +349 -0
  402. package/tests/test-inspect.mjs +302 -0
  403. package/tests/test-landscape.mjs +316 -0
  404. package/tests/test-lighting.mjs +428 -0
  405. package/tests/test-manage-asset.mjs +438 -0
  406. package/tests/test-manage-level.mjs +89 -0
  407. package/tests/test-materials.mjs +356 -0
  408. package/tests/test-niagara.mjs +185 -0
  409. package/tests/test-no-inline-python.mjs +122 -0
  410. package/tests/test-performance.mjs +539 -0
  411. package/tests/test-plugin-handshake.mjs +82 -0
  412. package/tests/test-runner.mjs +933 -0
  413. package/tests/test-sequence.mjs +104 -0
  414. package/tests/test-system.mjs +96 -0
  415. package/tests/test-wasm.mjs +283 -0
  416. package/tests/test-world-partition.mjs +215 -0
  417. package/tsconfig.json +3 -3
  418. package/vitest.config.ts +35 -0
  419. package/wasm/Cargo.lock +363 -0
  420. package/wasm/Cargo.toml +42 -0
  421. package/wasm/LICENSE +21 -0
  422. package/wasm/README.md +253 -0
  423. package/wasm/src/dependency_resolver.rs +377 -0
  424. package/wasm/src/lib.rs +153 -0
  425. package/wasm/src/property_parser.rs +271 -0
  426. package/wasm/src/transform_math.rs +396 -0
  427. package/wasm/tests/integration.rs +109 -0
  428. package/.github/workflows/smithery-build.yml +0 -29
  429. package/dist/prompts/index.d.ts +0 -21
  430. package/dist/prompts/index.js +0 -217
  431. package/dist/tools/build_environment_advanced.d.ts +0 -65
  432. package/dist/tools/build_environment_advanced.js +0 -633
  433. package/dist/tools/rc.d.ts +0 -110
  434. package/dist/tools/rc.js +0 -437
  435. package/dist/tools/visual.d.ts +0 -40
  436. package/dist/tools/visual.js +0 -282
  437. package/dist/utils/http.d.ts +0 -6
  438. package/dist/utils/http.js +0 -151
  439. package/dist/utils/python-output.d.ts +0 -18
  440. package/dist/utils/python-output.js +0 -290
  441. package/dist/utils/python.d.ts +0 -2
  442. package/dist/utils/python.js +0 -4
  443. package/dist/utils/stdio-redirect.d.ts +0 -2
  444. package/dist/utils/stdio-redirect.js +0 -20
  445. package/docs/unreal-tool-test-cases.md +0 -574
  446. package/smithery.yaml +0 -29
  447. package/src/prompts/index.ts +0 -249
  448. package/src/tools/build_environment_advanced.ts +0 -732
  449. package/src/tools/rc.ts +0 -515
  450. package/src/tools/visual.ts +0 -281
  451. package/src/utils/http.ts +0 -187
  452. package/src/utils/python-output.ts +0 -351
  453. package/src/utils/python.ts +0 -3
  454. package/src/utils/stdio-redirect.ts +0 -18
@@ -1,282 +0,0 @@
1
- import { loadEnv } from '../types/env.js';
2
- import { Logger } from '../utils/logger.js';
3
- import { coerceStringArray, interpretStandardResult } from '../utils/result-helpers.js';
4
- import { promises as fs } from 'fs';
5
- import path from 'path';
6
- export class VisualTools {
7
- bridge;
8
- env = loadEnv();
9
- log = new Logger('VisualTools');
10
- constructor(bridge) {
11
- this.bridge = bridge;
12
- }
13
- // Take a screenshot of viewport (high res or standard). Returns path and base64 (truncated)
14
- async takeScreenshot(params) {
15
- const res = params.resolution && /^\d+x\d+$/i.test(params.resolution) ? params.resolution : '';
16
- const primaryCommand = res ? `HighResShot ${res}` : 'Shot';
17
- const captureStartedAt = Date.now();
18
- try {
19
- const firstAttempt = await this.bridge.executeConsoleCommand(primaryCommand);
20
- const firstSummary = this.bridge.summarizeConsoleCommand(primaryCommand, firstAttempt);
21
- if (!res) {
22
- const output = (firstSummary.output || '').toLowerCase();
23
- const badInput = output.includes('bad input') || output.includes('unrecognized command');
24
- const hasErrorLine = firstSummary.logLines?.some(line => /error:/i.test(line));
25
- if (badInput || hasErrorLine) {
26
- this.log.debug(`Screenshot primary command reported an error (${firstSummary.output || 'no output'})`);
27
- }
28
- }
29
- // Give the engine a moment to write the file (UE can flush asynchronously)
30
- await new Promise(r => setTimeout(r, 1200));
31
- const p = await this.findLatestScreenshot(captureStartedAt);
32
- if (!p) {
33
- this.log.warn('Screenshot captured but output file was not found');
34
- return { success: true, message: 'Screenshot triggered, but could not locate output file' };
35
- }
36
- let b64;
37
- let truncated = false;
38
- let sizeBytes;
39
- let mime;
40
- try {
41
- const stat = await fs.stat(p);
42
- sizeBytes = stat.size;
43
- const max = 1024 * 1024; // 1 MiB cap for inline payloads
44
- if (stat.size <= max) {
45
- const buf = await fs.readFile(p);
46
- b64 = buf.toString('base64');
47
- }
48
- else {
49
- truncated = true;
50
- }
51
- const ext = path.extname(p).toLowerCase();
52
- if (ext === '.png')
53
- mime = 'image/png';
54
- else if (ext === '.jpg' || ext === '.jpeg')
55
- mime = 'image/jpeg';
56
- else if (ext === '.bmp')
57
- mime = 'image/bmp';
58
- }
59
- catch { }
60
- return {
61
- success: true,
62
- imagePath: p.replace(/\\/g, '/'),
63
- imageMimeType: mime,
64
- imageSizeBytes: sizeBytes,
65
- imageBase64: b64,
66
- imageBase64Truncated: truncated
67
- };
68
- }
69
- catch (err) {
70
- return { success: false, error: String(err?.message || err) };
71
- }
72
- }
73
- async getEngineScreenshotDirectories() {
74
- const python = `
75
- import unreal
76
- import json
77
- import os
78
-
79
- result = {
80
- "success": True,
81
- "message": "",
82
- "error": "",
83
- "directories": [],
84
- "warnings": [],
85
- "details": []
86
- }
87
-
88
- def finalize():
89
- data = dict(result)
90
- if data.get("success"):
91
- if not data.get("message"):
92
- data["message"] = "Collected screenshot directories"
93
- data.pop("error", None)
94
- else:
95
- if not data.get("error"):
96
- data["error"] = data.get("message") or "Failed to collect screenshot directories"
97
- if not data.get("message"):
98
- data["message"] = data["error"]
99
- if not data.get("warnings"):
100
- data.pop("warnings", None)
101
- if not data.get("details"):
102
- data.pop("details", None)
103
- if not data.get("directories"):
104
- data.pop("directories", None)
105
- return data
106
-
107
- def add_path(candidate, note=None):
108
- if not candidate:
109
- return
110
- try:
111
- abs_path = os.path.abspath(os.path.normpath(candidate))
112
- except Exception as normalize_error:
113
- result["warnings"].append(f"Failed to normalize path {candidate}: {normalize_error}")
114
- return
115
- if abs_path not in result["directories"]:
116
- result["directories"].append(abs_path)
117
- if note:
118
- result["details"].append(f"{note}: {abs_path}")
119
- else:
120
- result["details"].append(f"Discovered screenshot directory: {abs_path}")
121
-
122
- try:
123
- automation_dir = unreal.AutomationLibrary.get_screenshot_directory()
124
- add_path(automation_dir, "Automation screenshot directory")
125
- except Exception as automation_error:
126
- result["warnings"].append(f"Automation screenshot directory unavailable: {automation_error}")
127
-
128
- try:
129
- project_saved = unreal.Paths.project_saved_dir()
130
- add_path(project_saved, "Project Saved directory")
131
- if project_saved:
132
- add_path(os.path.join(project_saved, 'Screenshots'), "Project Saved screenshots")
133
- add_path(os.path.join(project_saved, 'Screenshots', 'Windows'), "Project Saved Windows screenshots")
134
- add_path(os.path.join(project_saved, 'Screenshots', 'WindowsEditor'), "Project Saved WindowsEditor screenshots")
135
- try:
136
- platform_name = unreal.SystemLibrary.get_platform_user_name()
137
- if platform_name:
138
- add_path(os.path.join(project_saved, 'Screenshots', platform_name), f"Project Saved screenshots for {platform_name}")
139
- add_path(os.path.join(project_saved, 'Screenshots', f"{platform_name}Editor"), f"Project Saved editor screenshots for {platform_name}")
140
- except Exception as platform_error:
141
- result["warnings"].append(f"Failed to resolve platform-specific screenshot directories: {platform_error}")
142
- except Exception as saved_error:
143
- result["warnings"].append(f"Project Saved directory unavailable: {saved_error}")
144
-
145
- try:
146
- project_file = unreal.Paths.get_project_file_path()
147
- if project_file:
148
- project_dir = os.path.dirname(project_file)
149
- add_path(os.path.join(project_dir, 'Saved', 'Screenshots'), "Project directory screenshots")
150
- add_path(os.path.join(project_dir, 'Saved', 'Screenshots', 'Windows'), "Project directory Windows screenshots")
151
- add_path(os.path.join(project_dir, 'Saved', 'Screenshots', 'WindowsEditor'), "Project directory WindowsEditor screenshots")
152
- except Exception as project_error:
153
- result["warnings"].append(f"Project directory screenshots unavailable: {project_error}")
154
-
155
- if not result["directories"]:
156
- result["warnings"].append("No screenshot directories discovered")
157
-
158
- print('RESULT:' + json.dumps(finalize()))
159
- `.trim()
160
- .replace(/\r?\n/g, '\n');
161
- try {
162
- const response = await this.bridge.executePython(python);
163
- const interpreted = interpretStandardResult(response, {
164
- successMessage: 'Collected screenshot directories',
165
- failureMessage: 'Failed to collect screenshot directories'
166
- });
167
- if (interpreted.details) {
168
- for (const entry of interpreted.details) {
169
- this.log.debug(entry);
170
- }
171
- }
172
- if (interpreted.warnings) {
173
- for (const warning of interpreted.warnings) {
174
- this.log.debug(`Screenshot directory warning: ${warning}`);
175
- }
176
- }
177
- const directories = coerceStringArray(interpreted.payload.directories);
178
- if (directories?.length) {
179
- return directories;
180
- }
181
- if (!interpreted.success && interpreted.error) {
182
- this.log.warn(`Screenshot path probe failed: ${interpreted.error}`);
183
- }
184
- if (interpreted.rawText) {
185
- try {
186
- const fallback = JSON.parse(interpreted.rawText);
187
- const fallbackDirs = coerceStringArray(fallback);
188
- if (fallbackDirs?.length) {
189
- return fallbackDirs;
190
- }
191
- }
192
- catch { }
193
- }
194
- }
195
- catch (err) {
196
- this.log.debug('Screenshot path probe failed', err);
197
- }
198
- return [];
199
- }
200
- async findLatestScreenshot(since) {
201
- // Try env override, otherwise look in common UE Saved/Screenshots folder under project
202
- const candidates = [];
203
- const seen = new Set();
204
- const addCandidate = (candidate) => {
205
- if (!candidate)
206
- return;
207
- const normalized = path.isAbsolute(candidate)
208
- ? path.normalize(candidate)
209
- : path.resolve(candidate);
210
- if (!seen.has(normalized)) {
211
- seen.add(normalized);
212
- candidates.push(normalized);
213
- }
214
- };
215
- if (this.env.UE_SCREENSHOT_DIR)
216
- addCandidate(this.env.UE_SCREENSHOT_DIR);
217
- if (this.env.UE_PROJECT_PATH) {
218
- const projectDir = path.dirname(this.env.UE_PROJECT_PATH);
219
- addCandidate(path.join(projectDir, 'Saved', 'Screenshots'));
220
- addCandidate(path.join(projectDir, 'Saved', 'Screenshots', 'Windows'));
221
- addCandidate(path.join(projectDir, 'Saved', 'Screenshots', 'WindowsEditor'));
222
- }
223
- const engineDirs = await this.getEngineScreenshotDirectories();
224
- for (const dir of engineDirs) {
225
- addCandidate(dir);
226
- }
227
- // Fallback: common locations relative to current working directory
228
- addCandidate(path.join(process.cwd(), 'Saved', 'Screenshots'));
229
- addCandidate(path.join(process.cwd(), 'Saved', 'Screenshots', 'Windows'));
230
- addCandidate(path.join(process.cwd(), 'Saved', 'Screenshots', 'WindowsEditor'));
231
- const searchDirs = new Set();
232
- const queue = [...candidates];
233
- while (queue.length) {
234
- const candidate = queue.pop();
235
- if (!candidate || searchDirs.has(candidate))
236
- continue;
237
- searchDirs.add(candidate);
238
- try {
239
- const entries = await fs.readdir(candidate, { withFileTypes: true });
240
- for (const entry of entries) {
241
- if (entry.isDirectory()) {
242
- queue.push(path.join(candidate, entry.name));
243
- }
244
- }
245
- }
246
- catch { }
247
- }
248
- let latest = null;
249
- let latestSince = null;
250
- const cutoff = since ? since - 2000 : undefined; // allow slight clock drift
251
- for (const dirPath of searchDirs) {
252
- let entries;
253
- try {
254
- entries = await fs.readdir(dirPath);
255
- }
256
- catch {
257
- continue;
258
- }
259
- for (const entry of entries) {
260
- const fp = path.join(dirPath, entry);
261
- if (!/\.(png|jpg|jpeg|bmp)$/i.test(fp))
262
- continue;
263
- try {
264
- const st = await fs.stat(fp);
265
- const info = { path: fp, mtime: st.mtimeMs };
266
- if (!latest || info.mtime > latest.mtime) {
267
- latest = info;
268
- }
269
- if (cutoff !== undefined && st.mtimeMs >= cutoff) {
270
- if (!latestSince || info.mtime > latestSince.mtime) {
271
- latestSince = info;
272
- }
273
- }
274
- }
275
- catch { }
276
- }
277
- }
278
- const chosen = latestSince || latest;
279
- return chosen?.path || null;
280
- }
281
- }
282
- //# sourceMappingURL=visual.js.map
@@ -1,6 +0,0 @@
1
- import { AxiosInstance } from 'axios';
2
- /**
3
- * Enhanced HTTP client factory with connection pooling and request timing
4
- */
5
- export declare function createHttpClient(baseURL: string): AxiosInstance;
6
- //# sourceMappingURL=http.d.ts.map
@@ -1,151 +0,0 @@
1
- import axios from 'axios';
2
- import http from 'http';
3
- import https from 'https';
4
- import { Logger } from './logger.js';
5
- class SimpleCache {
6
- cache = new Map();
7
- maxSize = 100;
8
- set(key, data, ttl = 60000) {
9
- // Prevent unbounded growth
10
- if (this.cache.size >= this.maxSize) {
11
- const firstKey = this.cache.keys().next().value;
12
- if (firstKey !== undefined) {
13
- this.cache.delete(firstKey);
14
- }
15
- }
16
- this.cache.set(key, {
17
- data,
18
- timestamp: Date.now(),
19
- ttl
20
- });
21
- }
22
- get(key) {
23
- const entry = this.cache.get(key);
24
- if (!entry)
25
- return null;
26
- // Check if expired
27
- if (Date.now() - entry.timestamp > entry.ttl) {
28
- this.cache.delete(key);
29
- return null;
30
- }
31
- return entry.data;
32
- }
33
- clear() {
34
- this.cache.clear();
35
- }
36
- getStats() {
37
- return { size: this.cache.size, maxSize: this.maxSize };
38
- }
39
- }
40
- const responseCache = new SimpleCache();
41
- // Enhanced connection pooling configuration to prevent socket failures
42
- const httpAgent = new http.Agent({
43
- keepAlive: true,
44
- keepAliveMsecs: 60000, // Increased keep-alive time
45
- maxSockets: 20, // Increased socket pool
46
- maxFreeSockets: 10, // More free sockets
47
- timeout: 60000, // Longer timeout
48
- });
49
- const httpsAgent = new https.Agent({
50
- keepAlive: true,
51
- keepAliveMsecs: 60000, // Increased keep-alive time
52
- maxSockets: 20, // Increased socket pool
53
- maxFreeSockets: 10, // More free sockets
54
- timeout: 60000, // Longer timeout
55
- });
56
- const log = new Logger('HTTP');
57
- /**
58
- * Enhanced HTTP client factory with connection pooling and request timing
59
- */
60
- export function createHttpClient(baseURL) {
61
- const client = axios.create({
62
- baseURL,
63
- headers: {
64
- 'Content-Type': 'application/json',
65
- 'Accept': 'application/json'
66
- },
67
- timeout: 15000,
68
- httpAgent,
69
- httpsAgent,
70
- // Ensure proper handling of request body transformation
71
- transformRequest: [(data, headers) => {
72
- // Remove Content-Length if it's set incorrectly
73
- delete headers['Content-Length'];
74
- delete headers['content-length'];
75
- // Properly stringify JSON data
76
- if (data && typeof data === 'object') {
77
- const jsonStr = JSON.stringify(data);
78
- // Let axios set Content-Length automatically
79
- return jsonStr;
80
- }
81
- return data;
82
- }],
83
- // Optimize response handling
84
- maxContentLength: 50 * 1024 * 1024, // 50MB
85
- maxBodyLength: 50 * 1024 * 1024,
86
- decompress: true
87
- });
88
- // Request interceptor: timing, caching check, and logging
89
- client.interceptors.request.use((config) => {
90
- // Add metadata for performance tracking
91
- config.metadata = { startTime: Date.now() };
92
- // Check cache for GET requests
93
- if (config.method?.toLowerCase() === 'get' && config.url) {
94
- const cacheKey = `${config.url}:${JSON.stringify(config.params || {})}`;
95
- const cached = responseCache.get(cacheKey);
96
- if (cached) {
97
- log.debug(`[HTTP Cache Hit] ${config.url}`);
98
- // Return cached response
99
- config.cached = cached;
100
- }
101
- }
102
- return config;
103
- }, (error) => {
104
- log.error('[HTTP Request Error]', error);
105
- return Promise.reject(error);
106
- });
107
- // Response interceptor: timing, caching, and error handling
108
- client.interceptors.response.use((response) => {
109
- // Check if we used cached response
110
- if (response.config.cached) {
111
- return Promise.resolve({
112
- ...response,
113
- data: response.config.cached,
114
- status: 200,
115
- statusText: 'OK (Cached)',
116
- headers: {},
117
- config: response.config
118
- });
119
- }
120
- // Performance tracking
121
- const duration = Date.now() - (response.config.metadata?.startTime || 0);
122
- if (duration > 5000) {
123
- log.warn(`[HTTP Slow] ${response.config.url} took ${duration}ms`);
124
- }
125
- else if (duration > 1000) {
126
- log.debug(`[HTTP] ${response.config.url} took ${duration}ms`);
127
- }
128
- // Cache successful GET responses
129
- if (response.config.method?.toLowerCase() === 'get' &&
130
- response.status === 200 &&
131
- response.config.url) {
132
- const cacheKey = `${response.config.url}:${JSON.stringify(response.config.params || {})}`;
133
- // Cache for 30 seconds by default
134
- responseCache.set(cacheKey, response.data, 30000);
135
- }
136
- return response;
137
- }, (error) => {
138
- // Enhanced error logging
139
- const duration = Date.now() - (error.config?.metadata?.startTime || 0);
140
- log.error(`[HTTP Error] ${error.config?.url} failed after ${duration}ms:`, {
141
- status: error.response?.status,
142
- message: error.message,
143
- code: error.code
144
- });
145
- return Promise.reject(error);
146
- });
147
- return client;
148
- }
149
- // No retry helpers are exported; consolidated command flows rely on
150
- // Unreal's own retry/backoff semantics to avoid duplicate side effects.
151
- //# sourceMappingURL=http.js.map
@@ -1,18 +0,0 @@
1
- export interface PythonOutput {
2
- raw: unknown;
3
- text: string;
4
- }
5
- export interface TaggedJsonResult<T> extends PythonOutput {
6
- data: T | null;
7
- }
8
- export interface StandardResultPayload {
9
- success?: boolean;
10
- message?: string;
11
- error?: string;
12
- [key: string]: unknown;
13
- }
14
- export declare function toPythonOutput(response: unknown): PythonOutput;
15
- export declare function parseStandardResult(response: unknown, tag?: string): TaggedJsonResult<StandardResultPayload>;
16
- export declare function stripTaggedResultLines(text: string, tag?: string): string;
17
- export declare function extractTaggedLine(output: string | PythonOutput, prefix: string): string | null;
18
- //# sourceMappingURL=python-output.d.ts.map