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,743 @@
1
+ export const scalarResolvers = {
2
+ Vector: {
3
+ serialize: (value) => {
4
+ if (!value)
5
+ return null;
6
+ return typeof value === 'object' && 'x' in value && 'y' in value && 'z' in value
7
+ ? value
8
+ : null;
9
+ },
10
+ parseValue: (value) => value,
11
+ parseLiteral: (ast) => {
12
+ if (ast.kind === 'ObjectValue') {
13
+ const value = {};
14
+ ast.fields.forEach((field) => {
15
+ value[field.name.value] = field.value.value;
16
+ });
17
+ return value;
18
+ }
19
+ return null;
20
+ }
21
+ },
22
+ Rotator: {
23
+ serialize: (value) => {
24
+ if (!value)
25
+ return null;
26
+ return typeof value === 'object' && 'pitch' in value && 'yaw' in value && 'roll' in value
27
+ ? value
28
+ : null;
29
+ },
30
+ parseValue: (value) => value,
31
+ parseLiteral: (ast) => {
32
+ if (ast.kind === 'ObjectValue') {
33
+ const value = {};
34
+ ast.fields.forEach((field) => {
35
+ value[field.name.value] = field.value.value;
36
+ });
37
+ return value;
38
+ }
39
+ return null;
40
+ }
41
+ },
42
+ Transform: {
43
+ serialize: (value) => value,
44
+ parseValue: (value) => value,
45
+ parseLiteral: (ast) => {
46
+ if (ast.kind === 'ObjectValue') {
47
+ const value = {};
48
+ ast.fields.forEach((field) => {
49
+ if (field.value.kind === 'ObjectValue') {
50
+ value[field.name.value] = {};
51
+ field.value.fields.forEach((f) => {
52
+ value[field.name.value][f.name.value] = f.value.value;
53
+ });
54
+ }
55
+ else {
56
+ value[field.name.value] = field.value.value;
57
+ }
58
+ });
59
+ return value;
60
+ }
61
+ return null;
62
+ }
63
+ },
64
+ JSON: {
65
+ serialize: (value) => value,
66
+ parseValue: (value) => value,
67
+ parseLiteral: (ast) => {
68
+ switch (ast.kind) {
69
+ case 'StringValue':
70
+ return ast.value;
71
+ case 'BooleanValue':
72
+ return ast.value;
73
+ case 'IntValue':
74
+ case 'FloatValue':
75
+ return Number(ast.value);
76
+ case 'ObjectValue':
77
+ const value = {};
78
+ ast.fields.forEach((field) => {
79
+ value[field.name.value] = scalarResolvers.JSON.parseLiteral(field.value);
80
+ });
81
+ return value;
82
+ case 'ListValue':
83
+ return ast.values.map((v) => scalarResolvers.JSON.parseLiteral(v));
84
+ default:
85
+ return null;
86
+ }
87
+ }
88
+ }
89
+ };
90
+ function logAutomationFailure(source, response) {
91
+ try {
92
+ if (!response || response.success !== false) {
93
+ return;
94
+ }
95
+ const errorText = (response.error || response.message || '').toString();
96
+ if (errorText.length === 0) {
97
+ return;
98
+ }
99
+ console.error(`[GraphQL] ${source} automation failure:`, errorText);
100
+ }
101
+ catch {
102
+ }
103
+ }
104
+ async function getActorProperties(bridge, actorName) {
105
+ try {
106
+ const result = await bridge.getObjectProperty({
107
+ objectPath: actorName,
108
+ propertyName: '*',
109
+ timeoutMs: 5000
110
+ });
111
+ return result.success ? result.value || {} : {};
112
+ }
113
+ catch (error) {
114
+ console.error('Failed to get actor properties:', error);
115
+ return {};
116
+ }
117
+ }
118
+ async function listAssets(automationBridge, filter, pagination) {
119
+ try {
120
+ const response = await automationBridge.sendAutomationRequest('list_assets', {
121
+ filter: filter || {},
122
+ pagination: pagination || { offset: 0, limit: 50 }
123
+ }, { timeoutMs: 30000 });
124
+ if (response.success && response.result) {
125
+ const result = response.result;
126
+ return {
127
+ assets: result.assets || [],
128
+ totalCount: result.totalCount || 0
129
+ };
130
+ }
131
+ logAutomationFailure('list_assets', response);
132
+ console.error('Failed to list assets:', response);
133
+ return { assets: [], totalCount: 0 };
134
+ }
135
+ catch (error) {
136
+ console.error('Failed to list assets:', error);
137
+ return { assets: [], totalCount: 0 };
138
+ }
139
+ }
140
+ async function listActors(automationBridge, filter) {
141
+ try {
142
+ const response = await automationBridge.sendAutomationRequest('list_actors', {
143
+ filter: filter || {}
144
+ }, { timeoutMs: 30000 });
145
+ if (response.success && response.result) {
146
+ const result = response.result;
147
+ return {
148
+ actors: result.actors || []
149
+ };
150
+ }
151
+ logAutomationFailure('list_actors', response);
152
+ return { actors: [] };
153
+ }
154
+ catch (error) {
155
+ console.error('Failed to list actors:', error);
156
+ return { actors: [] };
157
+ }
158
+ }
159
+ async function getBlueprint(automationBridge, blueprintPath) {
160
+ try {
161
+ const response = await automationBridge.sendAutomationRequest('get_blueprint', {
162
+ blueprintPath
163
+ }, { timeoutMs: 30000 });
164
+ if (response.success && response.result) {
165
+ return response.result;
166
+ }
167
+ logAutomationFailure('get_blueprint', response);
168
+ return null;
169
+ }
170
+ catch (error) {
171
+ console.error('Failed to get blueprint:', error);
172
+ return null;
173
+ }
174
+ }
175
+ export const resolvers = {
176
+ Query: {
177
+ assets: async (_, args, context) => {
178
+ const { filter, pagination } = args;
179
+ const { assets, totalCount } = await listAssets(context.automationBridge, filter, pagination);
180
+ const edges = assets.map((asset, index) => ({
181
+ node: asset,
182
+ cursor: Buffer.from(`${asset.path}:${index}`).toString('base64')
183
+ }));
184
+ return {
185
+ edges,
186
+ pageInfo: {
187
+ hasNextPage: (pagination?.offset || 0) + assets.length < totalCount,
188
+ hasPreviousPage: (pagination?.offset || 0) > 0,
189
+ startCursor: edges.length > 0 ? edges[0].cursor : null,
190
+ endCursor: edges.length > 0 ? edges[edges.length - 1].cursor : null
191
+ },
192
+ totalCount
193
+ };
194
+ },
195
+ asset: async (_, { path }, context) => {
196
+ try {
197
+ const response = await context.automationBridge.sendAutomationRequest('get_asset', { assetPath: path }, { timeoutMs: 10000 });
198
+ if (response.success && response.result) {
199
+ return response.result;
200
+ }
201
+ return null;
202
+ }
203
+ catch (error) {
204
+ console.error('Failed to get asset:', error);
205
+ return null;
206
+ }
207
+ },
208
+ actors: async (_, args, context) => {
209
+ const { filter, pagination } = args;
210
+ const { actors } = await listActors(context.automationBridge, filter);
211
+ const offset = pagination?.offset ?? 0;
212
+ const limit = pagination?.limit ?? 50;
213
+ const paginatedActors = actors.slice(offset, offset + limit);
214
+ const edges = paginatedActors.map((actor, index) => ({
215
+ node: actor,
216
+ cursor: Buffer.from(`${actor.name}:${offset + index}`).toString('base64')
217
+ }));
218
+ return {
219
+ edges,
220
+ pageInfo: {
221
+ hasNextPage: offset + paginatedActors.length < actors.length,
222
+ hasPreviousPage: offset > 0,
223
+ startCursor: edges.length > 0 ? edges[0].cursor : null,
224
+ endCursor: edges.length > 0 ? edges[edges.length - 1].cursor : null
225
+ },
226
+ totalCount: actors.length
227
+ };
228
+ },
229
+ actor: async (_, { name }, context) => {
230
+ try {
231
+ const actors = await listActors(context.automationBridge, { tag: name });
232
+ if (actors.actors.length > 0) {
233
+ return actors.actors[0];
234
+ }
235
+ return null;
236
+ }
237
+ catch (error) {
238
+ console.error('Failed to get actor:', error);
239
+ return null;
240
+ }
241
+ },
242
+ blueprints: async (_, args, context) => {
243
+ const { filter, pagination } = args;
244
+ try {
245
+ const response = await context.automationBridge.sendAutomationRequest('list_blueprints', {
246
+ filter: filter || {},
247
+ pagination: pagination || { offset: 0, limit: 50 }
248
+ }, { timeoutMs: 30000 });
249
+ const blueprints = response.success && response.result
250
+ ? response.result.blueprints || []
251
+ : [];
252
+ const edges = blueprints.map((blueprint, index) => ({
253
+ node: blueprint,
254
+ cursor: Buffer.from(`${blueprint.path}:${index}`).toString('base64')
255
+ }));
256
+ return {
257
+ edges,
258
+ pageInfo: {
259
+ hasNextPage: (pagination?.offset || 0) + blueprints.length < response.result?.totalCount || 0,
260
+ hasPreviousPage: (pagination?.offset || 0) > 0,
261
+ startCursor: edges.length > 0 ? edges[0].cursor : null,
262
+ endCursor: edges.length > 0 ? edges[edges.length - 1].cursor : null
263
+ },
264
+ totalCount: blueprints.length
265
+ };
266
+ }
267
+ catch (error) {
268
+ console.error('Failed to list blueprints:', error);
269
+ return {
270
+ edges: [],
271
+ pageInfo: {
272
+ hasNextPage: false,
273
+ hasPreviousPage: false,
274
+ startCursor: null,
275
+ endCursor: null
276
+ },
277
+ totalCount: 0
278
+ };
279
+ }
280
+ },
281
+ blueprint: async (_, { path }, context) => {
282
+ return await getBlueprint(context.automationBridge, path);
283
+ },
284
+ levels: async (_, __, context) => {
285
+ try {
286
+ const response = await context.automationBridge.sendAutomationRequest('list_levels', {}, { timeoutMs: 10000 });
287
+ if (response.success && response.result) {
288
+ return response.result.levels || [];
289
+ }
290
+ return [];
291
+ }
292
+ catch (error) {
293
+ console.error('Failed to list levels:', error);
294
+ return [];
295
+ }
296
+ },
297
+ currentLevel: async (_, __, context) => {
298
+ try {
299
+ const response = await context.automationBridge.sendAutomationRequest('get_current_level', {}, { timeoutMs: 10000 });
300
+ if (response.success && response.result) {
301
+ return response.result;
302
+ }
303
+ return null;
304
+ }
305
+ catch (error) {
306
+ console.error('Failed to get current level:', error);
307
+ return null;
308
+ }
309
+ },
310
+ materials: async (_, args, context) => {
311
+ const { filter, pagination } = args;
312
+ try {
313
+ const materialFilter = { ...filter, class: 'MaterialInterface' };
314
+ const { assets, totalCount } = await listAssets(context.automationBridge, materialFilter, pagination);
315
+ const offset = pagination?.offset ?? 0;
316
+ const edges = assets.map((material, index) => ({
317
+ node: material,
318
+ cursor: Buffer.from(`${material.path}:${offset + index}`).toString('base64')
319
+ }));
320
+ return {
321
+ edges,
322
+ pageInfo: {
323
+ hasNextPage: (pagination?.offset || 0) + assets.length < totalCount,
324
+ hasPreviousPage: (pagination?.offset || 0) > 0,
325
+ startCursor: edges.length > 0 ? edges[0].cursor : null,
326
+ endCursor: edges.length > 0 ? edges[edges.length - 1].cursor : null
327
+ },
328
+ totalCount
329
+ };
330
+ }
331
+ catch (error) {
332
+ console.error('Failed to list materials:', error);
333
+ return {
334
+ edges: [],
335
+ pageInfo: {
336
+ hasNextPage: false,
337
+ hasPreviousPage: false,
338
+ startCursor: null,
339
+ endCursor: null
340
+ },
341
+ totalCount: 0
342
+ };
343
+ }
344
+ },
345
+ sequences: async (_, args, context) => {
346
+ const { filter, pagination } = args;
347
+ try {
348
+ const sequenceFilter = { ...filter, class: 'LevelSequence' };
349
+ const { assets, totalCount } = await listAssets(context.automationBridge, sequenceFilter, pagination);
350
+ const offset = pagination?.offset ?? 0;
351
+ const edges = assets.map((sequence, index) => ({
352
+ node: sequence,
353
+ cursor: Buffer.from(`${sequence.path}:${offset + index}`).toString('base64')
354
+ }));
355
+ return {
356
+ edges,
357
+ pageInfo: {
358
+ hasNextPage: (pagination?.offset || 0) + assets.length < totalCount,
359
+ hasPreviousPage: (pagination?.offset || 0) > 0,
360
+ startCursor: edges.length > 0 ? edges[0].cursor : null,
361
+ endCursor: edges.length > 0 ? edges[edges.length - 1].cursor : null
362
+ },
363
+ totalCount
364
+ };
365
+ }
366
+ catch (error) {
367
+ console.error('Failed to list sequences:', error);
368
+ return {
369
+ edges: [],
370
+ pageInfo: {
371
+ hasNextPage: false,
372
+ hasPreviousPage: false,
373
+ startCursor: null,
374
+ endCursor: null
375
+ },
376
+ totalCount: 0
377
+ };
378
+ }
379
+ },
380
+ worldPartitionCells: async (_, __, context) => {
381
+ try {
382
+ const response = await context.automationBridge.sendAutomationRequest('manage_world_partition', { subAction: 'get_cells' }, { timeoutMs: 10000 });
383
+ if (response.success && response.result) {
384
+ return response.result.cells || [];
385
+ }
386
+ return [];
387
+ }
388
+ catch (error) {
389
+ console.error('Failed to list world partition cells:', error);
390
+ return [];
391
+ }
392
+ },
393
+ niagaraSystems: async (_, args, context) => {
394
+ const { filter, pagination } = args;
395
+ try {
396
+ const niagaraFilter = { ...filter, class: 'NiagaraSystem' };
397
+ const { assets, totalCount } = await listAssets(context.automationBridge, niagaraFilter, pagination);
398
+ const offset = pagination?.offset ?? 0;
399
+ const edges = assets.map((asset, index) => ({
400
+ node: {
401
+ ...asset,
402
+ emitters: [],
403
+ parameters: []
404
+ },
405
+ cursor: Buffer.from(`${asset.path}:${offset + index}`).toString('base64')
406
+ }));
407
+ return {
408
+ edges,
409
+ pageInfo: {
410
+ hasNextPage: (pagination?.offset || 0) + assets.length < totalCount,
411
+ hasPreviousPage: (pagination?.offset || 0) > 0,
412
+ startCursor: edges.length > 0 ? edges[0].cursor : null,
413
+ endCursor: edges.length > 0 ? edges[edges.length - 1].cursor : null
414
+ },
415
+ totalCount
416
+ };
417
+ }
418
+ catch (error) {
419
+ console.error('Failed to list niagara systems:', error);
420
+ return {
421
+ edges: [],
422
+ pageInfo: {
423
+ hasNextPage: false,
424
+ hasPreviousPage: false,
425
+ startCursor: null,
426
+ endCursor: null
427
+ },
428
+ totalCount: 0
429
+ };
430
+ }
431
+ },
432
+ niagaraSystem: async (_, { path }, context) => {
433
+ try {
434
+ const asset = await context.automationBridge.sendAutomationRequest('get_asset', { assetPath: path }, { timeoutMs: 10000 });
435
+ if (asset.success && asset.result && asset.result.class === 'NiagaraSystem') {
436
+ return {
437
+ ...asset.result,
438
+ emitters: [],
439
+ parameters: []
440
+ };
441
+ }
442
+ return null;
443
+ }
444
+ catch (error) {
445
+ console.error('Failed to get niagara system:', error);
446
+ return null;
447
+ }
448
+ },
449
+ search: async (_, { query, type }, context) => {
450
+ try {
451
+ const response = await context.automationBridge.sendAutomationRequest('search', {
452
+ query,
453
+ type: type || 'ALL'
454
+ }, { timeoutMs: 30000 });
455
+ if (response.success && response.result) {
456
+ return response.result.results || [];
457
+ }
458
+ return [];
459
+ }
460
+ catch (error) {
461
+ console.error('Failed to search:', error);
462
+ return [];
463
+ }
464
+ }
465
+ },
466
+ Mutation: {
467
+ duplicateAsset: async (_, { path, newName }, context) => {
468
+ try {
469
+ const response = await context.automationBridge.sendAutomationRequest('duplicate_asset', {
470
+ assetPath: path,
471
+ newName
472
+ }, { timeoutMs: 60000 });
473
+ if (response.success && response.result) {
474
+ return response.result;
475
+ }
476
+ throw new Error(response.error || 'Failed to duplicate asset');
477
+ }
478
+ catch (error) {
479
+ console.error('Failed to duplicate asset:', error);
480
+ throw error;
481
+ }
482
+ },
483
+ moveAsset: async (_, { path, newPath }, context) => {
484
+ try {
485
+ const response = await context.automationBridge.sendAutomationRequest('move_asset', {
486
+ assetPath: path,
487
+ destinationPath: newPath
488
+ }, { timeoutMs: 60000 });
489
+ if (response.success && response.result) {
490
+ return response.result;
491
+ }
492
+ throw new Error(response.error || 'Failed to move asset');
493
+ }
494
+ catch (error) {
495
+ console.error('Failed to move asset:', error);
496
+ throw error;
497
+ }
498
+ },
499
+ deleteAsset: async (_, { path }, context) => {
500
+ try {
501
+ const response = await context.automationBridge.sendAutomationRequest('delete_asset', {
502
+ assetPath: path
503
+ }, { timeoutMs: 30000 });
504
+ return response.success || false;
505
+ }
506
+ catch (error) {
507
+ console.error('Failed to delete asset:', error);
508
+ return false;
509
+ }
510
+ },
511
+ spawnActor: async (_, { input }, context) => {
512
+ try {
513
+ const response = await context.automationBridge.sendAutomationRequest('spawn_actor', input, { timeoutMs: 10000 });
514
+ if (response.success && response.result) {
515
+ return response.result;
516
+ }
517
+ throw new Error(response.error || 'Failed to spawn actor');
518
+ }
519
+ catch (error) {
520
+ console.error('Failed to spawn actor:', error);
521
+ throw error;
522
+ }
523
+ },
524
+ deleteActor: async (_, { name }, context) => {
525
+ try {
526
+ const response = await context.automationBridge.sendAutomationRequest('delete_actor', {
527
+ actorName: name
528
+ }, { timeoutMs: 10000 });
529
+ return response.success || false;
530
+ }
531
+ catch (error) {
532
+ console.error('Failed to delete actor:', error);
533
+ return false;
534
+ }
535
+ },
536
+ setActorTransform: async (_, { name, transform }, context) => {
537
+ try {
538
+ const response = await context.automationBridge.sendAutomationRequest('set_actor_transform', {
539
+ actorName: name,
540
+ transform
541
+ }, { timeoutMs: 10000 });
542
+ if (response.success && response.result) {
543
+ return response.result;
544
+ }
545
+ throw new Error(response.error || 'Failed to set actor transform');
546
+ }
547
+ catch (error) {
548
+ console.error('Failed to set actor transform:', error);
549
+ throw error;
550
+ }
551
+ },
552
+ createBlueprint: async (_, { input }, context) => {
553
+ try {
554
+ const response = await context.automationBridge.sendAutomationRequest('create_blueprint', input, { timeoutMs: 60000 });
555
+ if (response.success && response.result) {
556
+ return response.result;
557
+ }
558
+ throw new Error(response.error || 'Failed to create blueprint');
559
+ }
560
+ catch (error) {
561
+ console.error('Failed to create blueprint:', error);
562
+ throw error;
563
+ }
564
+ },
565
+ addVariableToBlueprint: async (_, { path, input }, context) => {
566
+ try {
567
+ const response = await context.automationBridge.sendAutomationRequest('add_variable_to_blueprint', {
568
+ blueprintPath: path,
569
+ ...input
570
+ }, { timeoutMs: 30000 });
571
+ if (response.success && response.result) {
572
+ return response.result;
573
+ }
574
+ throw new Error(response.error || 'Failed to add variable to blueprint');
575
+ }
576
+ catch (error) {
577
+ console.error('Failed to add variable to blueprint:', error);
578
+ throw error;
579
+ }
580
+ },
581
+ addFunctionToBlueprint: async (_, { path, input }, context) => {
582
+ try {
583
+ const response = await context.automationBridge.sendAutomationRequest('add_function_to_blueprint', {
584
+ blueprintPath: path,
585
+ ...input
586
+ }, { timeoutMs: 30000 });
587
+ if (response.success && response.result) {
588
+ return response.result;
589
+ }
590
+ throw new Error(response.error || 'Failed to add function to blueprint');
591
+ }
592
+ catch (error) {
593
+ console.error('Failed to add function to blueprint:', error);
594
+ throw error;
595
+ }
596
+ },
597
+ loadLevel: async (_, { path }, context) => {
598
+ try {
599
+ const response = await context.automationBridge.sendAutomationRequest('load_level', {
600
+ levelPath: path
601
+ }, { timeoutMs: 30000 });
602
+ if (response.success && response.result) {
603
+ return response.result;
604
+ }
605
+ throw new Error(response.error || 'Failed to load level');
606
+ }
607
+ catch (error) {
608
+ console.error('Failed to load level:', error);
609
+ throw error;
610
+ }
611
+ },
612
+ saveLevel: async (_, { path }, context) => {
613
+ try {
614
+ const response = await context.automationBridge.sendAutomationRequest('save_level', {
615
+ levelPath: path
616
+ }, { timeoutMs: 30000 });
617
+ return response.success || false;
618
+ }
619
+ catch (error) {
620
+ console.error('Failed to save level:', error);
621
+ return false;
622
+ }
623
+ },
624
+ createMaterialInstance: async (_, { parentPath, name, parameters }, context) => {
625
+ try {
626
+ const response = await context.automationBridge.sendAutomationRequest('create_material_instance', {
627
+ parentMaterialPath: parentPath,
628
+ instanceName: name,
629
+ parameters: parameters || {}
630
+ }, { timeoutMs: 30000 });
631
+ if (response.success && response.result) {
632
+ return response.result;
633
+ }
634
+ throw new Error(response.error || 'Failed to create material instance');
635
+ }
636
+ catch (error) {
637
+ console.error('Failed to create material instance:', error);
638
+ throw error;
639
+ }
640
+ }
641
+ },
642
+ Asset: {
643
+ dependencies: async (parent, _, context) => {
644
+ try {
645
+ const response = await context.automationBridge.sendAutomationRequest('get_asset_dependencies', {
646
+ assetPath: parent.path
647
+ }, { timeoutMs: 10000 });
648
+ if (response.success && response.result) {
649
+ return response.result.dependencies || [];
650
+ }
651
+ return [];
652
+ }
653
+ catch (error) {
654
+ console.error('Failed to get asset dependencies:', error);
655
+ return [];
656
+ }
657
+ },
658
+ dependents: async (parent, _, context) => {
659
+ try {
660
+ const response = await context.automationBridge.sendAutomationRequest('get_asset_dependents', {
661
+ assetPath: parent.path
662
+ }, { timeoutMs: 10000 });
663
+ if (response.success && response.result) {
664
+ return response.result.dependents || [];
665
+ }
666
+ return [];
667
+ }
668
+ catch (error) {
669
+ console.error('Failed to get asset dependents:', error);
670
+ return [];
671
+ }
672
+ }
673
+ },
674
+ Actor: {
675
+ properties: async (parent, _, context) => {
676
+ return await getActorProperties(context.bridge, parent.name);
677
+ },
678
+ components: async (parent, _, context) => {
679
+ try {
680
+ const response = await context.automationBridge.sendAutomationRequest('get_actor_components', {
681
+ actorName: parent.name
682
+ }, { timeoutMs: 10000 });
683
+ if (response.success && response.result) {
684
+ return response.result.components || [];
685
+ }
686
+ return [];
687
+ }
688
+ catch (error) {
689
+ console.error('Failed to get actor components:', error);
690
+ return [];
691
+ }
692
+ }
693
+ },
694
+ Blueprint: {
695
+ variables: async (parent, _args, _context) => {
696
+ return parent.variables || [];
697
+ },
698
+ functions: async (parent, _args, _context) => {
699
+ return parent.functions || [];
700
+ },
701
+ events: async (parent, _args, _context) => {
702
+ return parent.events || [];
703
+ },
704
+ components: async (parent, _args, _context) => {
705
+ return parent.components || [];
706
+ }
707
+ },
708
+ Material: {
709
+ parameters: async (parent, _, context) => {
710
+ try {
711
+ const response = await context.automationBridge.sendAutomationRequest('get_material_parameters', {
712
+ materialPath: parent.path
713
+ }, { timeoutMs: 10000 });
714
+ if (response.success && response.result) {
715
+ return response.result.parameters || [];
716
+ }
717
+ return [];
718
+ }
719
+ catch (error) {
720
+ console.error('Failed to get material parameters:', error);
721
+ return [];
722
+ }
723
+ }
724
+ },
725
+ Sequence: {
726
+ tracks: async (parent, _, context) => {
727
+ try {
728
+ const response = await context.automationBridge.sendAutomationRequest('get_sequence_tracks', {
729
+ sequencePath: parent.path
730
+ }, { timeoutMs: 10000 });
731
+ if (response.success && response.result) {
732
+ return response.result.tracks || [];
733
+ }
734
+ return [];
735
+ }
736
+ catch (error) {
737
+ console.error('Failed to get sequence tracks:', error);
738
+ return [];
739
+ }
740
+ }
741
+ }
742
+ };
743
+ //# sourceMappingURL=resolvers.js.map