unreal-engine-mcp-server 0.4.7 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (438) hide show
  1. package/.env.example +26 -0
  2. package/.env.production +38 -7
  3. package/.eslintrc.json +0 -54
  4. package/.eslintrc.override.json +8 -0
  5. package/.github/ISSUE_TEMPLATE/bug_report.yml +94 -0
  6. package/.github/ISSUE_TEMPLATE/config.yml +8 -0
  7. package/.github/ISSUE_TEMPLATE/feature_request.yml +56 -0
  8. package/.github/copilot-instructions.md +478 -45
  9. package/.github/dependabot.yml +19 -0
  10. package/.github/labeler.yml +24 -0
  11. package/.github/labels.yml +70 -0
  12. package/.github/pull_request_template.md +42 -0
  13. package/.github/release-drafter.yml +148 -0
  14. package/.github/workflows/auto-merge.yml +38 -0
  15. package/.github/workflows/ci.yml +38 -0
  16. package/.github/workflows/dependency-review.yml +17 -0
  17. package/.github/workflows/gemini-issue-triage.yml +172 -0
  18. package/.github/workflows/greetings.yml +23 -0
  19. package/.github/workflows/labeler.yml +16 -0
  20. package/.github/workflows/links.yml +80 -0
  21. package/.github/workflows/pr-size-labeler.yml +137 -0
  22. package/.github/workflows/publish-mcp.yml +12 -7
  23. package/.github/workflows/release-drafter.yml +23 -0
  24. package/.github/workflows/release.yml +112 -0
  25. package/.github/workflows/semantic-pull-request.yml +35 -0
  26. package/.github/workflows/smoke-test.yml +36 -0
  27. package/.github/workflows/stale.yml +28 -0
  28. package/CHANGELOG.md +267 -31
  29. package/CONTRIBUTING.md +140 -0
  30. package/README.md +166 -71
  31. package/claude_desktop_config_example.json +7 -6
  32. package/dist/automation/bridge.d.ts +50 -0
  33. package/dist/automation/bridge.js +452 -0
  34. package/dist/automation/connection-manager.d.ts +23 -0
  35. package/dist/automation/connection-manager.js +107 -0
  36. package/dist/automation/handshake.d.ts +11 -0
  37. package/dist/automation/handshake.js +89 -0
  38. package/dist/automation/index.d.ts +3 -0
  39. package/dist/automation/index.js +3 -0
  40. package/dist/automation/message-handler.d.ts +12 -0
  41. package/dist/automation/message-handler.js +149 -0
  42. package/dist/automation/request-tracker.d.ts +25 -0
  43. package/dist/automation/request-tracker.js +98 -0
  44. package/dist/automation/types.d.ts +130 -0
  45. package/dist/automation/types.js +2 -0
  46. package/dist/cli.js +32 -5
  47. package/dist/config.d.ts +27 -0
  48. package/dist/config.js +60 -0
  49. package/dist/constants.d.ts +12 -0
  50. package/dist/constants.js +12 -0
  51. package/dist/graphql/resolvers.d.ts +268 -0
  52. package/dist/graphql/resolvers.js +743 -0
  53. package/dist/graphql/schema.d.ts +5 -0
  54. package/dist/graphql/schema.js +437 -0
  55. package/dist/graphql/server.d.ts +26 -0
  56. package/dist/graphql/server.js +115 -0
  57. package/dist/graphql/types.d.ts +7 -0
  58. package/dist/graphql/types.js +2 -0
  59. package/dist/handlers/resource-handlers.d.ts +20 -0
  60. package/dist/handlers/resource-handlers.js +180 -0
  61. package/dist/index.d.ts +31 -18
  62. package/dist/index.js +119 -619
  63. package/dist/prompts/index.js +4 -4
  64. package/dist/resources/actors.d.ts +17 -12
  65. package/dist/resources/actors.js +56 -76
  66. package/dist/resources/assets.d.ts +6 -14
  67. package/dist/resources/assets.js +115 -147
  68. package/dist/resources/levels.d.ts +13 -13
  69. package/dist/resources/levels.js +25 -34
  70. package/dist/server/resource-registry.d.ts +20 -0
  71. package/dist/server/resource-registry.js +37 -0
  72. package/dist/server/tool-registry.d.ts +23 -0
  73. package/dist/server/tool-registry.js +322 -0
  74. package/dist/server-setup.d.ts +21 -0
  75. package/dist/server-setup.js +111 -0
  76. package/dist/services/health-monitor.d.ts +34 -0
  77. package/dist/services/health-monitor.js +105 -0
  78. package/dist/services/metrics-server.d.ts +11 -0
  79. package/dist/services/metrics-server.js +105 -0
  80. package/dist/tools/actors.d.ts +147 -9
  81. package/dist/tools/actors.js +350 -311
  82. package/dist/tools/animation.d.ts +135 -4
  83. package/dist/tools/animation.js +510 -411
  84. package/dist/tools/assets.d.ts +117 -19
  85. package/dist/tools/assets.js +259 -284
  86. package/dist/tools/audio.d.ts +102 -42
  87. package/dist/tools/audio.js +272 -685
  88. package/dist/tools/base-tool.d.ts +17 -0
  89. package/dist/tools/base-tool.js +46 -0
  90. package/dist/tools/behavior-tree.d.ts +94 -0
  91. package/dist/tools/behavior-tree.js +39 -0
  92. package/dist/tools/blueprint/helpers.d.ts +29 -0
  93. package/dist/tools/blueprint/helpers.js +182 -0
  94. package/dist/tools/blueprint.d.ts +228 -118
  95. package/dist/tools/blueprint.js +685 -832
  96. package/dist/tools/consolidated-tool-definitions.d.ts +5462 -1781
  97. package/dist/tools/consolidated-tool-definitions.js +829 -496
  98. package/dist/tools/consolidated-tool-handlers.d.ts +2 -1
  99. package/dist/tools/consolidated-tool-handlers.js +211 -1026
  100. package/dist/tools/debug.d.ts +143 -85
  101. package/dist/tools/debug.js +234 -180
  102. package/dist/tools/dynamic-handler-registry.d.ts +11 -0
  103. package/dist/tools/dynamic-handler-registry.js +101 -0
  104. package/dist/tools/editor.d.ts +139 -18
  105. package/dist/tools/editor.js +239 -244
  106. package/dist/tools/engine.d.ts +10 -4
  107. package/dist/tools/engine.js +13 -5
  108. package/dist/tools/environment.d.ts +36 -0
  109. package/dist/tools/environment.js +267 -0
  110. package/dist/tools/foliage.d.ts +105 -14
  111. package/dist/tools/foliage.js +219 -331
  112. package/dist/tools/handlers/actor-handlers.d.ts +3 -0
  113. package/dist/tools/handlers/actor-handlers.js +232 -0
  114. package/dist/tools/handlers/animation-handlers.d.ts +3 -0
  115. package/dist/tools/handlers/animation-handlers.js +185 -0
  116. package/dist/tools/handlers/argument-helper.d.ts +16 -0
  117. package/dist/tools/handlers/argument-helper.js +80 -0
  118. package/dist/tools/handlers/asset-handlers.d.ts +3 -0
  119. package/dist/tools/handlers/asset-handlers.js +496 -0
  120. package/dist/tools/handlers/audio-handlers.d.ts +3 -0
  121. package/dist/tools/handlers/audio-handlers.js +166 -0
  122. package/dist/tools/handlers/blueprint-handlers.d.ts +4 -0
  123. package/dist/tools/handlers/blueprint-handlers.js +358 -0
  124. package/dist/tools/handlers/common-handlers.d.ts +14 -0
  125. package/dist/tools/handlers/common-handlers.js +56 -0
  126. package/dist/tools/handlers/editor-handlers.d.ts +3 -0
  127. package/dist/tools/handlers/editor-handlers.js +119 -0
  128. package/dist/tools/handlers/effect-handlers.d.ts +3 -0
  129. package/dist/tools/handlers/effect-handlers.js +171 -0
  130. package/dist/tools/handlers/environment-handlers.d.ts +3 -0
  131. package/dist/tools/handlers/environment-handlers.js +170 -0
  132. package/dist/tools/handlers/graph-handlers.d.ts +3 -0
  133. package/dist/tools/handlers/graph-handlers.js +90 -0
  134. package/dist/tools/handlers/input-handlers.d.ts +3 -0
  135. package/dist/tools/handlers/input-handlers.js +21 -0
  136. package/dist/tools/handlers/inspect-handlers.d.ts +3 -0
  137. package/dist/tools/handlers/inspect-handlers.js +383 -0
  138. package/dist/tools/handlers/level-handlers.d.ts +3 -0
  139. package/dist/tools/handlers/level-handlers.js +237 -0
  140. package/dist/tools/handlers/lighting-handlers.d.ts +3 -0
  141. package/dist/tools/handlers/lighting-handlers.js +144 -0
  142. package/dist/tools/handlers/performance-handlers.d.ts +3 -0
  143. package/dist/tools/handlers/performance-handlers.js +130 -0
  144. package/dist/tools/handlers/pipeline-handlers.d.ts +3 -0
  145. package/dist/tools/handlers/pipeline-handlers.js +110 -0
  146. package/dist/tools/handlers/sequence-handlers.d.ts +3 -0
  147. package/dist/tools/handlers/sequence-handlers.js +376 -0
  148. package/dist/tools/handlers/system-handlers.d.ts +4 -0
  149. package/dist/tools/handlers/system-handlers.js +506 -0
  150. package/dist/tools/input.d.ts +19 -0
  151. package/dist/tools/input.js +89 -0
  152. package/dist/tools/introspection.d.ts +103 -40
  153. package/dist/tools/introspection.js +425 -568
  154. package/dist/tools/landscape.d.ts +97 -36
  155. package/dist/tools/landscape.js +280 -409
  156. package/dist/tools/level.d.ts +130 -10
  157. package/dist/tools/level.js +639 -675
  158. package/dist/tools/lighting.d.ts +77 -38
  159. package/dist/tools/lighting.js +441 -943
  160. package/dist/tools/logs.d.ts +3 -3
  161. package/dist/tools/logs.js +5 -57
  162. package/dist/tools/materials.d.ts +91 -24
  163. package/dist/tools/materials.js +190 -118
  164. package/dist/tools/niagara.d.ts +149 -39
  165. package/dist/tools/niagara.js +232 -182
  166. package/dist/tools/performance.d.ts +27 -12
  167. package/dist/tools/performance.js +204 -122
  168. package/dist/tools/physics.d.ts +32 -77
  169. package/dist/tools/physics.js +171 -582
  170. package/dist/tools/property-dictionary.d.ts +13 -0
  171. package/dist/tools/property-dictionary.js +82 -0
  172. package/dist/tools/sequence.d.ts +73 -48
  173. package/dist/tools/sequence.js +196 -748
  174. package/dist/tools/tool-definition-utils.d.ts +59 -0
  175. package/dist/tools/tool-definition-utils.js +35 -0
  176. package/dist/tools/ui.d.ts +66 -34
  177. package/dist/tools/ui.js +134 -214
  178. package/dist/types/env.d.ts +0 -3
  179. package/dist/types/env.js +0 -7
  180. package/dist/types/tool-interfaces.d.ts +898 -0
  181. package/dist/types/tool-interfaces.js +2 -0
  182. package/dist/types/tool-types.d.ts +183 -19
  183. package/dist/types/tool-types.js +0 -4
  184. package/dist/unreal-bridge.d.ts +24 -131
  185. package/dist/unreal-bridge.js +364 -1506
  186. package/dist/utils/command-validator.d.ts +9 -0
  187. package/dist/utils/command-validator.js +67 -0
  188. package/dist/utils/elicitation.d.ts +1 -1
  189. package/dist/utils/elicitation.js +12 -15
  190. package/dist/utils/error-handler.d.ts +2 -51
  191. package/dist/utils/error-handler.js +11 -87
  192. package/dist/utils/ini-reader.d.ts +3 -0
  193. package/dist/utils/ini-reader.js +69 -0
  194. package/dist/utils/logger.js +9 -6
  195. package/dist/utils/normalize.d.ts +3 -0
  196. package/dist/utils/normalize.js +56 -0
  197. package/dist/utils/response-factory.d.ts +7 -0
  198. package/dist/utils/response-factory.js +33 -0
  199. package/dist/utils/response-validator.d.ts +3 -24
  200. package/dist/utils/response-validator.js +130 -81
  201. package/dist/utils/result-helpers.d.ts +4 -5
  202. package/dist/utils/result-helpers.js +15 -16
  203. package/dist/utils/safe-json.js +5 -11
  204. package/dist/utils/unreal-command-queue.d.ts +24 -0
  205. package/dist/utils/unreal-command-queue.js +120 -0
  206. package/dist/utils/validation.d.ts +0 -40
  207. package/dist/utils/validation.js +1 -78
  208. package/dist/wasm/index.d.ts +70 -0
  209. package/dist/wasm/index.js +535 -0
  210. package/docs/GraphQL-API.md +888 -0
  211. package/docs/Migration-Guide-v0.5.0.md +692 -0
  212. package/docs/Roadmap.md +53 -0
  213. package/docs/WebAssembly-Integration.md +628 -0
  214. package/docs/editor-plugin-extension.md +370 -0
  215. package/docs/handler-mapping.md +242 -0
  216. package/docs/native-automation-progress.md +128 -0
  217. package/docs/testing-guide.md +423 -0
  218. package/mcp-config-example.json +6 -6
  219. package/package.json +60 -27
  220. package/plugins/McpAutomationBridge/Config/FilterPlugin.ini +8 -0
  221. package/plugins/McpAutomationBridge/McpAutomationBridge.uplugin +64 -0
  222. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/McpAutomationBridge.Build.cs +189 -0
  223. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.cpp +22 -0
  224. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.h +30 -0
  225. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeHelpers.h +1983 -0
  226. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeModule.cpp +72 -0
  227. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSettings.cpp +46 -0
  228. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSubsystem.cpp +581 -0
  229. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AnimationHandlers.cpp +2394 -0
  230. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetQueryHandlers.cpp +300 -0
  231. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetWorkflowHandlers.cpp +2807 -0
  232. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AudioHandlers.cpp +1087 -0
  233. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BehaviorTreeHandlers.cpp +488 -0
  234. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.cpp +643 -0
  235. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.h +31 -0
  236. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintGraphHandlers.cpp +1184 -0
  237. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers.cpp +5652 -0
  238. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers_List.cpp +152 -0
  239. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ControlHandlers.cpp +2614 -0
  240. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_DebugHandlers.cpp +42 -0
  241. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EditorFunctionHandlers.cpp +1237 -0
  242. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EffectHandlers.cpp +1701 -0
  243. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EnvironmentHandlers.cpp +2145 -0
  244. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_FoliageHandlers.cpp +954 -0
  245. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InputHandlers.cpp +209 -0
  246. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InsightsHandlers.cpp +41 -0
  247. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LandscapeHandlers.cpp +1164 -0
  248. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LevelHandlers.cpp +762 -0
  249. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LightingHandlers.cpp +634 -0
  250. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LogHandlers.cpp +136 -0
  251. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_MaterialGraphHandlers.cpp +494 -0
  252. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraGraphHandlers.cpp +278 -0
  253. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraHandlers.cpp +625 -0
  254. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PerformanceHandlers.cpp +401 -0
  255. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PipelineHandlers.cpp +67 -0
  256. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ProcessRequest.cpp +735 -0
  257. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PropertyHandlers.cpp +2634 -0
  258. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_RenderHandlers.cpp +189 -0
  259. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.cpp +917 -0
  260. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.h +39 -0
  261. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequenceHandlers.cpp +2670 -0
  262. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequencerHandlers.cpp +519 -0
  263. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_TestHandlers.cpp +38 -0
  264. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_UiHandlers.cpp +668 -0
  265. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_WorldPartitionHandlers.cpp +346 -0
  266. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.cpp +1330 -0
  267. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.h +149 -0
  268. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpConnectionManager.cpp +783 -0
  269. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSettings.h +115 -0
  270. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSubsystem.h +796 -0
  271. package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpConnectionManager.h +117 -0
  272. package/scripts/check-unreal-connection.mjs +19 -0
  273. package/scripts/clean-tmp.js +23 -0
  274. package/scripts/patch-wasm.js +26 -0
  275. package/scripts/run-all-tests.mjs +131 -0
  276. package/scripts/smoke-test.ts +94 -0
  277. package/scripts/sync-mcp-plugin.js +143 -0
  278. package/scripts/test-no-plugin-alternates.mjs +113 -0
  279. package/scripts/validate-server.js +46 -0
  280. package/scripts/verify-automation-bridge.js +200 -0
  281. package/server.json +57 -21
  282. package/src/automation/bridge.ts +558 -0
  283. package/src/automation/connection-manager.ts +130 -0
  284. package/src/automation/handshake.ts +99 -0
  285. package/src/automation/index.ts +2 -0
  286. package/src/automation/message-handler.ts +167 -0
  287. package/src/automation/request-tracker.ts +123 -0
  288. package/src/automation/types.ts +107 -0
  289. package/src/cli.ts +33 -6
  290. package/src/config.ts +73 -0
  291. package/src/constants.ts +12 -0
  292. package/src/graphql/resolvers.ts +1010 -0
  293. package/src/graphql/schema.ts +452 -0
  294. package/src/graphql/server.ts +154 -0
  295. package/src/graphql/types.ts +7 -0
  296. package/src/handlers/resource-handlers.ts +186 -0
  297. package/src/index.ts +152 -663
  298. package/src/prompts/index.ts +4 -4
  299. package/src/resources/actors.ts +58 -76
  300. package/src/resources/assets.ts +147 -134
  301. package/src/resources/levels.ts +28 -33
  302. package/src/server/resource-registry.ts +47 -0
  303. package/src/server/tool-registry.ts +354 -0
  304. package/src/server-setup.ts +148 -0
  305. package/src/services/health-monitor.ts +132 -0
  306. package/src/services/metrics-server.ts +142 -0
  307. package/src/tools/actors.ts +417 -322
  308. package/src/tools/animation.ts +671 -461
  309. package/src/tools/assets.ts +353 -289
  310. package/src/tools/audio.ts +323 -766
  311. package/src/tools/base-tool.ts +52 -0
  312. package/src/tools/behavior-tree.ts +45 -0
  313. package/src/tools/blueprint/helpers.ts +189 -0
  314. package/src/tools/blueprint.ts +787 -965
  315. package/src/tools/consolidated-tool-definitions.ts +993 -515
  316. package/src/tools/consolidated-tool-handlers.ts +272 -1139
  317. package/src/tools/debug.ts +292 -187
  318. package/src/tools/dynamic-handler-registry.ts +151 -0
  319. package/src/tools/editor.ts +309 -246
  320. package/src/tools/engine.ts +14 -3
  321. package/src/tools/environment.ts +287 -0
  322. package/src/tools/foliage.ts +314 -379
  323. package/src/tools/handlers/actor-handlers.ts +271 -0
  324. package/src/tools/handlers/animation-handlers.ts +237 -0
  325. package/src/tools/handlers/argument-helper.ts +142 -0
  326. package/src/tools/handlers/asset-handlers.ts +532 -0
  327. package/src/tools/handlers/audio-handlers.ts +194 -0
  328. package/src/tools/handlers/blueprint-handlers.ts +380 -0
  329. package/src/tools/handlers/common-handlers.ts +87 -0
  330. package/src/tools/handlers/editor-handlers.ts +123 -0
  331. package/src/tools/handlers/effect-handlers.ts +220 -0
  332. package/src/tools/handlers/environment-handlers.ts +183 -0
  333. package/src/tools/handlers/graph-handlers.ts +116 -0
  334. package/src/tools/handlers/input-handlers.ts +28 -0
  335. package/src/tools/handlers/inspect-handlers.ts +450 -0
  336. package/src/tools/handlers/level-handlers.ts +252 -0
  337. package/src/tools/handlers/lighting-handlers.ts +147 -0
  338. package/src/tools/handlers/performance-handlers.ts +132 -0
  339. package/src/tools/handlers/pipeline-handlers.ts +127 -0
  340. package/src/tools/handlers/sequence-handlers.ts +415 -0
  341. package/src/tools/handlers/system-handlers.ts +564 -0
  342. package/src/tools/input.ts +101 -0
  343. package/src/tools/introspection.ts +493 -584
  344. package/src/tools/landscape.ts +394 -489
  345. package/src/tools/level.ts +752 -694
  346. package/src/tools/lighting.ts +583 -984
  347. package/src/tools/logs.ts +9 -57
  348. package/src/tools/materials.ts +231 -121
  349. package/src/tools/niagara.ts +293 -168
  350. package/src/tools/performance.ts +320 -168
  351. package/src/tools/physics.ts +268 -613
  352. package/src/tools/property-dictionary.ts +98 -0
  353. package/src/tools/sequence.ts +255 -815
  354. package/src/tools/tool-definition-utils.ts +35 -0
  355. package/src/tools/ui.ts +207 -283
  356. package/src/types/env.ts +0 -10
  357. package/src/types/tool-interfaces.ts +250 -0
  358. package/src/types/tool-types.ts +243 -21
  359. package/src/unreal-bridge.ts +460 -1550
  360. package/src/utils/command-validator.ts +75 -0
  361. package/src/utils/elicitation.ts +10 -7
  362. package/src/utils/error-handler.ts +14 -90
  363. package/src/utils/ini-reader.ts +86 -0
  364. package/src/utils/logger.ts +8 -3
  365. package/src/utils/normalize.ts +60 -0
  366. package/src/utils/response-factory.ts +39 -0
  367. package/src/utils/response-validator.ts +176 -56
  368. package/src/utils/result-helpers.ts +21 -19
  369. package/src/utils/safe-json.ts +14 -11
  370. package/src/utils/unreal-command-queue.ts +152 -0
  371. package/src/utils/validation.ts +4 -1
  372. package/src/wasm/index.ts +838 -0
  373. package/test-server.mjs +100 -0
  374. package/tests/run-unreal-tool-tests.mjs +242 -14
  375. package/tests/test-animation.mjs +44 -0
  376. package/tests/test-asset-advanced.mjs +82 -0
  377. package/tests/test-asset-errors.mjs +35 -0
  378. package/tests/test-audio.mjs +219 -0
  379. package/tests/test-automation-timeouts.mjs +98 -0
  380. package/tests/test-behavior-tree.mjs +261 -0
  381. package/tests/test-blueprint-events.mjs +35 -0
  382. package/tests/test-blueprint-graph.mjs +79 -0
  383. package/tests/test-blueprint.mjs +577 -0
  384. package/tests/test-client-mode.mjs +86 -0
  385. package/tests/test-console-command.mjs +56 -0
  386. package/tests/test-control-actor.mjs +425 -0
  387. package/tests/test-control-editor.mjs +80 -0
  388. package/tests/test-extra-tools.mjs +38 -0
  389. package/tests/test-graphql.mjs +322 -0
  390. package/tests/test-inspect.mjs +72 -0
  391. package/tests/test-landscape.mjs +60 -0
  392. package/tests/test-manage-asset.mjs +438 -0
  393. package/tests/test-manage-level.mjs +70 -0
  394. package/tests/test-materials.mjs +356 -0
  395. package/tests/test-niagara.mjs +185 -0
  396. package/tests/test-no-inline-python.mjs +122 -0
  397. package/tests/test-plugin-handshake.mjs +82 -0
  398. package/tests/test-render.mjs +33 -0
  399. package/tests/test-runner.mjs +933 -0
  400. package/tests/test-search-assets.mjs +66 -0
  401. package/tests/test-sequence.mjs +68 -0
  402. package/tests/test-system.mjs +57 -0
  403. package/tests/test-wasm.mjs +193 -0
  404. package/tests/test-world-partition.mjs +215 -0
  405. package/tsconfig.json +3 -3
  406. package/wasm/Cargo.lock +363 -0
  407. package/wasm/Cargo.toml +42 -0
  408. package/wasm/LICENSE +21 -0
  409. package/wasm/README.md +253 -0
  410. package/wasm/src/dependency_resolver.rs +377 -0
  411. package/wasm/src/lib.rs +153 -0
  412. package/wasm/src/property_parser.rs +271 -0
  413. package/wasm/src/transform_math.rs +396 -0
  414. package/wasm/tests/integration.rs +109 -0
  415. package/.github/workflows/smithery-build.yml +0 -29
  416. package/dist/tools/build_environment_advanced.d.ts +0 -65
  417. package/dist/tools/build_environment_advanced.js +0 -633
  418. package/dist/tools/rc.d.ts +0 -110
  419. package/dist/tools/rc.js +0 -437
  420. package/dist/tools/visual.d.ts +0 -40
  421. package/dist/tools/visual.js +0 -282
  422. package/dist/utils/http.d.ts +0 -6
  423. package/dist/utils/http.js +0 -151
  424. package/dist/utils/python-output.d.ts +0 -18
  425. package/dist/utils/python-output.js +0 -290
  426. package/dist/utils/python.d.ts +0 -2
  427. package/dist/utils/python.js +0 -4
  428. package/dist/utils/stdio-redirect.d.ts +0 -2
  429. package/dist/utils/stdio-redirect.js +0 -20
  430. package/docs/unreal-tool-test-cases.md +0 -574
  431. package/smithery.yaml +0 -29
  432. package/src/tools/build_environment_advanced.ts +0 -732
  433. package/src/tools/rc.ts +0 -515
  434. package/src/tools/visual.ts +0 -281
  435. package/src/utils/http.ts +0 -187
  436. package/src/utils/python-output.ts +0 -351
  437. package/src/utils/python.ts +0 -3
  438. package/src/utils/stdio-redirect.ts +0 -18
@@ -0,0 +1,219 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Audio Management Test Suite (20 cases)
4
+ * Tool: manage_audio
5
+ */
6
+
7
+ import { runToolTests } from './test-runner.mjs';
8
+
9
+ const testCases = [
10
+ {
11
+ scenario: "Create Sound Cue",
12
+ toolName: "manage_audio",
13
+ arguments: {
14
+ action: "create_sound_cue",
15
+ name: "SC_TestCue",
16
+ soundPath: "/Engine/EngineSounds/WhiteNoise",
17
+ location: { x: 0, y: 0, z: 0 }, // Optional but checking if accepted
18
+ volume: 0.8,
19
+ pitch: 1.2
20
+ },
21
+ expected: "success"
22
+ },
23
+ {
24
+ scenario: "Play Sound at Location",
25
+ toolName: "manage_audio",
26
+ arguments: {
27
+ action: "play_sound_at_location",
28
+ soundPath: "/Engine/EngineSounds/WhiteNoise",
29
+ location: { x: 100, y: 0, z: 50 },
30
+ volume: 1.0,
31
+ pitch: 1.0
32
+ },
33
+ expected: "success"
34
+ },
35
+ {
36
+ scenario: "Play Sound 2D",
37
+ toolName: "manage_audio",
38
+ arguments: {
39
+ action: "play_sound_2d",
40
+ soundPath: "/Engine/EngineSounds/WhiteNoise",
41
+ volume: 0.5,
42
+ pitch: 1.0
43
+ },
44
+ expected: "success"
45
+ },
46
+ {
47
+ scenario: "Create Audio Component",
48
+ toolName: "manage_audio",
49
+ arguments: {
50
+ action: "create_audio_component",
51
+ soundPath: "/Engine/EngineSounds/WhiteNoise",
52
+ location: { x: 200, y: 0, z: 0 },
53
+ volume: 0.7
54
+ },
55
+ expected: "success"
56
+ },
57
+ {
58
+ scenario: "Create Sound Mix",
59
+ toolName: "manage_audio",
60
+ arguments: {
61
+ action: "create_sound_mix",
62
+ name: "SM_TestMix"
63
+ },
64
+ expected: "success"
65
+ },
66
+ {
67
+ scenario: "Push Sound Mix",
68
+ toolName: "manage_audio",
69
+ arguments: {
70
+ action: "push_sound_mix",
71
+ name: "SM_TestMix" // Assuming name param maps to mixName or it handles name
72
+ },
73
+ expected: "success"
74
+ },
75
+ {
76
+ scenario: "Pop Sound Mix", // Note: Pop might not be explicitly in definitions but let's check if supported or if push toggles
77
+ toolName: "manage_audio",
78
+ arguments: {
79
+ action: "push_sound_mix", // Re-pushing might not be pop, checking if pop exists. Definition says 'push_sound_mix'.
80
+ // Actually, 'manage_audio' def has: create_sound_cue, play_sound_at_location, play_sound_2d, create_audio_component, create_sound_mix, push_sound_mix.
81
+ // It lacks 'pop_sound_mix' in the enum in definition, but handler might have it?
82
+ // Let's stick to supported ones.
83
+ name: "SM_TestMix"
84
+ },
85
+ expected: "success"
86
+ },
87
+ // Expanding with edge cases and variations
88
+ {
89
+ scenario: "Play Sound with Rotation",
90
+ toolName: "manage_audio",
91
+ arguments: {
92
+ action: "play_sound_at_location",
93
+ soundPath: "/Engine/EngineSounds/WhiteNoise",
94
+ location: { x: 0, y: 0, z: 0 },
95
+ rotation: { pitch: 45, yaw: 90, roll: 0 },
96
+ volume: 1.0
97
+ },
98
+ expected: "success"
99
+ },
100
+ {
101
+ scenario: "Play Sound Low Volume",
102
+ toolName: "manage_audio",
103
+ arguments: {
104
+ action: "play_sound_2d",
105
+ soundPath: "/Engine/EngineSounds/WhiteNoise",
106
+ volume: 0.01
107
+ },
108
+ expected: "success"
109
+ },
110
+ {
111
+ scenario: "Play Sound High Pitch",
112
+ toolName: "manage_audio",
113
+ arguments: {
114
+ action: "play_sound_2d",
115
+ soundPath: "/Engine/EngineSounds/WhiteNoise",
116
+ pitch: 2.0
117
+ },
118
+ expected: "success"
119
+ },
120
+ {
121
+ scenario: "Create Component Attached (Logic check)",
122
+ toolName: "manage_audio",
123
+ arguments: {
124
+ action: "create_audio_component",
125
+ soundPath: "/Engine/EngineSounds/WhiteNoise",
126
+ attachTo: "RootComponent" // If supported by handler logic
127
+ },
128
+ expected: "success|handled"
129
+ },
130
+ {
131
+ scenario: "Error: Play Non-Existent Sound",
132
+ toolName: "manage_audio",
133
+ arguments: {
134
+ action: "play_sound_2d",
135
+ soundPath: "/Game/NonExistentSound"
136
+ },
137
+ expected: "error|not_found"
138
+ },
139
+ {
140
+ scenario: "Error: Create Cue Invalid Path",
141
+ toolName: "manage_audio",
142
+ arguments: {
143
+ action: "create_sound_cue",
144
+ name: "SC_Invalid",
145
+ soundPath: "/Game/InvalidSound"
146
+ },
147
+ expected: "error|not_found"
148
+ },
149
+ {
150
+ scenario: "Edge: Volume 0",
151
+ toolName: "manage_audio",
152
+ arguments: {
153
+ action: "play_sound_2d",
154
+ soundPath: "/Engine/EngineSounds/WhiteNoise",
155
+ volume: 0
156
+ },
157
+ expected: "success"
158
+ },
159
+ {
160
+ scenario: "Edge: Negative Pitch (Clamped?)",
161
+ toolName: "manage_audio",
162
+ arguments: {
163
+ action: "play_sound_2d",
164
+ soundPath: "/Engine/EngineSounds/WhiteNoise",
165
+ pitch: -1.0
166
+ },
167
+ expected: "success|clamped"
168
+ },
169
+ {
170
+ scenario: "Create Sound Mix With Adjusters (if supported args)",
171
+ toolName: "manage_audio",
172
+ arguments: {
173
+ action: "create_sound_mix",
174
+ name: "SM_ComplexMix"
175
+ },
176
+ expected: "success"
177
+ },
178
+ {
179
+ scenario: "Batch Play (Stress)",
180
+ toolName: "manage_audio",
181
+ arguments: {
182
+ action: "play_sound_2d",
183
+ soundPath: "/Engine/EngineSounds/WhiteNoise"
184
+ },
185
+ expected: "success"
186
+ },
187
+ {
188
+ scenario: "Validation: Missing Sound Path",
189
+ toolName: "manage_audio",
190
+ arguments: {
191
+ action: "play_sound_2d"
192
+ },
193
+ expected: "error|missing"
194
+ },
195
+ {
196
+ scenario: "Validation: Missing Name",
197
+ toolName: "manage_audio",
198
+ arguments: {
199
+ action: "create_sound_cue",
200
+ soundPath: "/Engine/EngineSounds/WhiteNoise"
201
+ },
202
+ expected: "error|missing"
203
+ },
204
+ {
205
+ scenario: "Cleanup Audio Assets",
206
+ toolName: "manage_asset", // Helper cleanup
207
+ arguments: {
208
+ action: "delete",
209
+ assetPaths: [
210
+ "/Game/Audio/SC_TestCue",
211
+ "/Game/Audio/SM_TestMix",
212
+ "/Game/Audio/SM_ComplexMix"
213
+ ]
214
+ },
215
+ expected: "success|handled"
216
+ }
217
+ ];
218
+
219
+ await runToolTests('Audio Management', testCases);
@@ -0,0 +1,98 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Automation Timeout Behaviour Test Suite
4
+ *
5
+ * Validates that long-running automation bridge actions honour timeout
6
+ * overrides, surface automation_event completions, and emit structured
7
+ * error payloads when exceeding configured limits.
8
+ */
9
+
10
+ import { runToolTests } from './test-runner.mjs';
11
+
12
+ const LONG_TIMEOUT_MS = 60000;
13
+ const SHORT_TIMEOUT_MS = 2500;
14
+
15
+ const testCases = [
16
+ {
17
+ scenario: 'Blueprint add_variable completes within custom timeout',
18
+ groupName: 'Automation Timeout',
19
+ toolName: 'manage_blueprint',
20
+ arguments: {
21
+ action: 'add_variable',
22
+ name: '/Game/Blueprints/BP_TimeTest',
23
+ variableName: 'TempVar',
24
+ variableType: 'Float',
25
+ waitForCompletion: true,
26
+ waitForCompletionTimeoutMs: LONG_TIMEOUT_MS
27
+ },
28
+ expected: 'success'
29
+ },
30
+ {
31
+ scenario: 'Blueprint add_variable short waitForCompletion timeout should fail',
32
+ groupName: 'Automation Timeout',
33
+ toolName: 'manage_blueprint',
34
+ arguments: {
35
+ action: 'add_variable',
36
+ name: '/Game/Blueprints/BP_TimeTest',
37
+ variableName: 'ShortTimeoutVar',
38
+ variableType: 'Float',
39
+ waitForCompletion: true,
40
+ waitForCompletionTimeoutMs: SHORT_TIMEOUT_MS
41
+ },
42
+ expected: 'fail or timeout'
43
+ },
44
+ {
45
+ scenario: 'Sequence create honours waitForCompletion timeout override',
46
+ groupName: 'Automation Timeout',
47
+ toolName: 'manage_sequence',
48
+ arguments: {
49
+ action: 'create',
50
+ sequenceName: 'Seq_TempAutomation',
51
+ path: '/Game/Sequences',
52
+ waitForCompletion: true,
53
+ waitForCompletionTimeoutMs: LONG_TIMEOUT_MS
54
+ },
55
+ expected: 'success'
56
+ },
57
+ {
58
+ scenario: 'Sequence create fails when waitForCompletion timeout too small',
59
+ groupName: 'Automation Timeout',
60
+ toolName: 'manage_sequence',
61
+ arguments: {
62
+ action: 'create',
63
+ sequenceName: 'Seq_TimeoutAutomation',
64
+ path: '/Game/Sequences',
65
+ waitForCompletion: true,
66
+ waitForCompletionTimeoutMs: SHORT_TIMEOUT_MS
67
+ },
68
+ expected: 'fail or timeout'
69
+ },
70
+ {
71
+ scenario: 'Set object property with explicit timeout succeeds',
72
+ groupName: 'Automation Timeout',
73
+ toolName: 'inspect',
74
+ arguments: {
75
+ action: 'set_property',
76
+ objectPath: '/Game/Blueprints/BP_TimeTest',
77
+ propertyName: 'bAllowTickBeforeBeginPlay',
78
+ value: true,
79
+ timeoutMs: LONG_TIMEOUT_MS
80
+ },
81
+ expected: 'success'
82
+ },
83
+ {
84
+ scenario: 'Set object property fails with too-small timeout override',
85
+ groupName: 'Automation Timeout',
86
+ toolName: 'inspect',
87
+ arguments: {
88
+ action: 'set_property',
89
+ objectPath: '/Game/Blueprints/BP_TimeTest',
90
+ propertyName: 'bAllowTickBeforeBeginPlay',
91
+ value: false,
92
+ timeoutMs: SHORT_TIMEOUT_MS
93
+ },
94
+ expected: 'fail or timeout'
95
+ }
96
+ ];
97
+
98
+ await runToolTests('Automation Timeout', testCases);
@@ -0,0 +1,261 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Behavior Tree Test Suite (20 cases)
4
+ * Tool: manage_behavior_tree
5
+ */
6
+
7
+ import { runToolTests } from './test-runner.mjs';
8
+
9
+ const btPath = '/Game/AI/BT_TestTree';
10
+
11
+ const testCases = [
12
+ // Setup: Create a Behavior Tree asset first
13
+ {
14
+ scenario: "Create Behavior Tree Asset",
15
+ toolName: "manage_asset",
16
+ arguments: {
17
+ action: "create_asset", // Assuming generic asset creation or create_behavior_tree if specialized
18
+ // Actually, let's use generic import or assume it exists for now,
19
+ // or create via blueprint/asset tools if supported.
20
+ // Fallback: use generic create_asset with BehaviorTree class if supported,
21
+ // otherwise 'create_behavior_tree' might be needed in manage_asset or manage_behavior_tree.
22
+ // Checking consolidated definitions: manage_behavior_tree has add_node etc, but no create_tree.
23
+ // manage_asset has import/create_material... maybe generic create?
24
+ // Let's assume we use a pre-existing one or create one via a helper if available.
25
+ // For test, let's try to create one using manage_asset generic if possible, or skip creation.
26
+ // Let's try to assume it exists or use a known path.
27
+ // For robustness, let's try to create via a python command in 'system_control' if we can't natively.
28
+ action: "execute_console_command",
29
+ command: "py.exec \"unreal.AssetToolsHelpers.get_asset_tools().create_asset('BT_TestTree', '/Game/AI', unreal.BehaviorTree, unreal.BehaviorTreeFactory())\""
30
+ },
31
+ toolName: "system_control",
32
+ expected: "success"
33
+ },
34
+ {
35
+ scenario: "Add Root Node (Selector)",
36
+ toolName: "manage_behavior_tree",
37
+ arguments: {
38
+ action: "add_node",
39
+ assetPath: btPath,
40
+ nodeType: "Selector",
41
+ nodeId: "RootSelector",
42
+ x: 0,
43
+ y: 0
44
+ },
45
+ expected: "success"
46
+ },
47
+ {
48
+ scenario: "Add Sequence Node",
49
+ toolName: "manage_behavior_tree",
50
+ arguments: {
51
+ action: "add_node",
52
+ assetPath: btPath,
53
+ nodeType: "Sequence",
54
+ nodeId: "MainSequence",
55
+ x: -200,
56
+ y: 150
57
+ },
58
+ expected: "success"
59
+ },
60
+ {
61
+ scenario: "Connect Root to Sequence",
62
+ toolName: "manage_behavior_tree",
63
+ arguments: {
64
+ action: "connect_nodes",
65
+ assetPath: btPath,
66
+ parentNodeId: "RootSelector",
67
+ childNodeId: "MainSequence"
68
+ },
69
+ expected: "success"
70
+ },
71
+ {
72
+ scenario: "Add Task Node (Wait)",
73
+ toolName: "manage_behavior_tree",
74
+ arguments: {
75
+ action: "add_node",
76
+ assetPath: btPath,
77
+ nodeType: "Task",
78
+ nodeClass: "BTTask_Wait", // Assuming class name resolution
79
+ nodeId: "WaitTask",
80
+ x: -300,
81
+ y: 300
82
+ },
83
+ expected: "success"
84
+ },
85
+ {
86
+ scenario: "Connect Sequence to Task",
87
+ toolName: "manage_behavior_tree",
88
+ arguments: {
89
+ action: "connect_nodes",
90
+ assetPath: btPath,
91
+ parentNodeId: "MainSequence",
92
+ childNodeId: "WaitTask"
93
+ },
94
+ expected: "success"
95
+ },
96
+ {
97
+ scenario: "Set Task Property (Wait Time)",
98
+ toolName: "manage_behavior_tree",
99
+ arguments: {
100
+ action: "set_node_properties",
101
+ assetPath: btPath,
102
+ nodeId: "WaitTask",
103
+ properties: {
104
+ "WaitTime": 5.0
105
+ }
106
+ },
107
+ expected: "success"
108
+ },
109
+ {
110
+ scenario: "Add Decorator (Blackboard)",
111
+ toolName: "manage_behavior_tree",
112
+ arguments: {
113
+ action: "add_node",
114
+ assetPath: btPath,
115
+ nodeType: "Decorator",
116
+ nodeClass: "BTDecorator_Blackboard",
117
+ parentNodeId: "MainSequence", // Decorators attach to nodes (composites/tasks)
118
+ nodeId: "BBDecorator"
119
+ },
120
+ expected: "success"
121
+ },
122
+ {
123
+ scenario: "Set Decorator Property",
124
+ toolName: "manage_behavior_tree",
125
+ arguments: {
126
+ action: "set_node_properties",
127
+ assetPath: btPath,
128
+ nodeId: "BBDecorator",
129
+ properties: {
130
+ "BlackboardKey": "TargetActor"
131
+ }
132
+ },
133
+ expected: "success"
134
+ },
135
+ {
136
+ scenario: "Add Service (Default Focus)",
137
+ toolName: "manage_behavior_tree",
138
+ arguments: {
139
+ action: "add_node",
140
+ assetPath: btPath,
141
+ nodeType: "Service",
142
+ nodeClass: "BTService_DefaultFocus",
143
+ parentNodeId: "RootSelector",
144
+ nodeId: "FocusService"
145
+ },
146
+ expected: "success"
147
+ },
148
+ {
149
+ scenario: "Remove Node (Wait Task)",
150
+ toolName: "manage_behavior_tree",
151
+ arguments: {
152
+ action: "remove_node",
153
+ assetPath: btPath,
154
+ nodeId: "WaitTask"
155
+ },
156
+ expected: "success"
157
+ },
158
+ {
159
+ scenario: "Break Connections",
160
+ toolName: "manage_behavior_tree",
161
+ arguments: {
162
+ action: "break_connections",
163
+ assetPath: btPath,
164
+ parentNodeId: "RootSelector",
165
+ childNodeId: "MainSequence"
166
+ },
167
+ expected: "success"
168
+ },
169
+ {
170
+ scenario: "Add Parallel Node",
171
+ toolName: "manage_behavior_tree",
172
+ arguments: {
173
+ action: "add_node",
174
+ assetPath: btPath,
175
+ nodeType: "SimpleParallel",
176
+ nodeId: "ParallelNode",
177
+ x: 200,
178
+ y: 150
179
+ },
180
+ expected: "success"
181
+ },
182
+ {
183
+ scenario: "Connect Root to Parallel",
184
+ toolName: "manage_behavior_tree",
185
+ arguments: {
186
+ action: "connect_nodes",
187
+ assetPath: btPath,
188
+ parentNodeId: "RootSelector",
189
+ childNodeId: "ParallelNode"
190
+ },
191
+ expected: "success"
192
+ },
193
+ {
194
+ scenario: "Add Custom Task (MoveTo)",
195
+ toolName: "manage_behavior_tree",
196
+ arguments: {
197
+ action: "add_node",
198
+ assetPath: btPath,
199
+ nodeType: "Task",
200
+ nodeClass: "BTTask_MoveTo",
201
+ nodeId: "MoveToTask",
202
+ x: 200,
203
+ y: 300
204
+ },
205
+ expected: "success"
206
+ },
207
+ {
208
+ scenario: "Error: Add Invalid Node Type",
209
+ toolName: "manage_behavior_tree",
210
+ arguments: {
211
+ action: "add_node",
212
+ assetPath: btPath,
213
+ nodeType: "InvalidType"
214
+ },
215
+ expected: "error"
216
+ },
217
+ {
218
+ scenario: "Error: Connect Cycle",
219
+ toolName: "manage_behavior_tree",
220
+ arguments: {
221
+ action: "connect_nodes",
222
+ assetPath: btPath,
223
+ parentNodeId: "MoveToTask",
224
+ childNodeId: "RootSelector"
225
+ },
226
+ expected: "error"
227
+ },
228
+ {
229
+ scenario: "Error: Set Property on Invalid Node",
230
+ toolName: "manage_behavior_tree",
231
+ arguments: {
232
+ action: "set_node_properties",
233
+ assetPath: btPath,
234
+ nodeId: "NonExistentNode",
235
+ properties: { "Val": 1 }
236
+ },
237
+ expected: "error|not_found"
238
+ },
239
+ {
240
+ scenario: "Edge: Comment String",
241
+ toolName: "manage_behavior_tree",
242
+ arguments: {
243
+ action: "set_node_properties",
244
+ assetPath: btPath,
245
+ nodeId: "RootSelector",
246
+ comment: "Main Entry Point"
247
+ },
248
+ expected: "success"
249
+ },
250
+ {
251
+ scenario: "Cleanup BT Asset",
252
+ toolName: "manage_asset",
253
+ arguments: {
254
+ action: "delete",
255
+ assetPaths: [btPath]
256
+ },
257
+ expected: "success"
258
+ }
259
+ ];
260
+
261
+ await runToolTests('Behavior Tree', testCases);
@@ -0,0 +1,35 @@
1
+ import { UnrealAutomationClient } from '../src/unreal-client.js';
2
+ import { runUnrealTests, assert } from './run-unreal-tool-tests.mjs';
3
+
4
+ runUnrealTests('manage_blueprint_graph_events', [
5
+ {
6
+ name: 'Create Event Node',
7
+ action: async (client) => {
8
+ const blueprintPath = '/Game/Tests/Integration/BP_EventTest';
9
+
10
+ // 1. Create a blueprint to test with
11
+ await client.sendRequest('blueprint_create', {
12
+ path: blueprintPath,
13
+ parentClass: 'Actor',
14
+ type: 'Normal'
15
+ });
16
+
17
+ // 2. Add BeginPlay event node
18
+ const result = await client.sendRequest('manage_blueprint_graph', {
19
+ blueprintPath: blueprintPath,
20
+ graphName: 'EventGraph',
21
+ subAction: 'create_node',
22
+ nodeType: 'Event',
23
+ eventName: 'ReceiveBeginPlay',
24
+ x: 200,
25
+ y: 200
26
+ });
27
+
28
+ assert(result.success, 'Failed to create Event node');
29
+ assert(result.nodeId, 'Missing nodeId');
30
+
31
+ // 3. Cleanup
32
+ await client.sendRequest('delete_asset', { path: blueprintPath });
33
+ }
34
+ }
35
+ ]);
@@ -0,0 +1,79 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Blueprint Graph Test Suite
4
+ * Tools: manage_blueprint, manage_blueprint_graph
5
+ */
6
+
7
+ import { runToolTests } from './test-runner.mjs';
8
+
9
+ // Use a unique blueprint name per run to avoid collisions
10
+ const ts = new Date().toISOString().replace(/[^0-9]/g, '').slice(0, 12);
11
+ const BP_NAME = `BP_Graph_${ts}`;
12
+ const BP_PATH = `/Game/Blueprints/${BP_NAME}`;
13
+
14
+ const testCases = [
15
+ {
16
+ scenario: 'Create blueprint for graph tests',
17
+ toolName: 'manage_blueprint',
18
+ arguments: {
19
+ action: 'create',
20
+ name: BP_NAME,
21
+ blueprintType: 'Actor',
22
+ savePath: '/Game/Blueprints',
23
+ waitForCompletion: true
24
+ },
25
+ expected: 'success'
26
+ },
27
+ {
28
+ scenario: 'Create Literal object node via manage_blueprint_graph',
29
+ toolName: 'manage_blueprint_graph',
30
+ arguments: {
31
+ action: 'create_node',
32
+ blueprintPath: BP_PATH,
33
+ graphName: 'EventGraph',
34
+ nodeType: 'Literal',
35
+ literalType: 'object',
36
+ objectPath: '/Engine/BasicShapes/Cube.Cube',
37
+ x: 0,
38
+ y: 0
39
+ },
40
+ expected: 'success'
41
+ },
42
+ {
43
+ scenario: 'Error: Literal object path not found',
44
+ toolName: 'manage_blueprint_graph',
45
+ arguments: {
46
+ action: 'create_node',
47
+ blueprintPath: BP_PATH,
48
+ graphName: 'EventGraph',
49
+ nodeType: 'Literal',
50
+ literalType: 'object',
51
+ objectPath: '/Engine/BasicShapes/DoesNotExist.DoesNotExist',
52
+ x: 100,
53
+ y: 0
54
+ },
55
+ expected: 'error|object_not_found'
56
+ },
57
+ {
58
+ scenario: 'Get graph details via manage_blueprint_graph',
59
+ toolName: 'manage_blueprint_graph',
60
+ arguments: {
61
+ action: 'get_graph_details',
62
+ blueprintPath: BP_PATH,
63
+ graphName: 'EventGraph'
64
+ },
65
+ expected: 'success'
66
+ },
67
+ {
68
+ scenario: 'Error: Graph not found for manage_blueprint_graph',
69
+ toolName: 'manage_blueprint_graph',
70
+ arguments: {
71
+ action: 'get_graph_details',
72
+ blueprintPath: BP_PATH,
73
+ graphName: 'InvalidGraphName_DOES_NOT_EXIST'
74
+ },
75
+ expected: 'error|graph_not_found'
76
+ }
77
+ ];
78
+
79
+ await runToolTests('BlueprintGraph', testCases);