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,232 @@
1
+ import { cleanObject } from '../../utils/safe-json.js';
2
+ import { executeAutomationRequest } from './common-handlers.js';
3
+ import { Logger } from '../../utils/logger.js';
4
+ import { normalizeArgs } from './argument-helper.js';
5
+ const logger = new Logger('ActorHandlers');
6
+ const handlers = {
7
+ spawn: async (args, tools) => {
8
+ const classAliases = {
9
+ 'SplineActor': '/Script/Engine.Actor',
10
+ 'Spline': '/Script/Engine.Actor',
11
+ 'PointLight': '/Script/Engine.PointLight',
12
+ 'SpotLight': '/Script/Engine.SpotLight',
13
+ 'DirectionalLight': '/Script/Engine.DirectionalLight',
14
+ 'Camera': '/Script/Engine.CameraActor',
15
+ 'CameraActor': '/Script/Engine.CameraActor',
16
+ 'StaticMeshActor': '/Script/Engine.StaticMeshActor',
17
+ 'SkeletalMeshActor': '/Script/Engine.SkeletalMeshActor',
18
+ 'PlayerStart': '/Script/Engine.PlayerStart',
19
+ 'TriggerBox': '/Script/Engine.TriggerBox',
20
+ 'TriggerSphere': '/Script/Engine.TriggerSphere',
21
+ 'BlockingVolume': '/Script/Engine.BlockingVolume',
22
+ 'Pawn': '/Script/Engine.Pawn',
23
+ 'Character': '/Script/Engine.Character',
24
+ 'Actor': '/Script/Engine.Actor'
25
+ };
26
+ const params = normalizeArgs(args, [
27
+ { key: 'classPath', aliases: ['class', 'type', 'actorClass'], required: true, map: classAliases },
28
+ { key: 'actorName', aliases: ['name'] },
29
+ { key: 'timeoutMs', default: undefined }
30
+ ]);
31
+ const timeoutMs = typeof params.timeoutMs === 'number' ? params.timeoutMs : undefined;
32
+ if (typeof timeoutMs === 'number' && timeoutMs > 0 && timeoutMs < 200) {
33
+ return cleanObject({
34
+ success: false,
35
+ error: `Timeout too small for spawn operation: ${timeoutMs}ms`,
36
+ message: 'Timeout too small for spawn operation'
37
+ });
38
+ }
39
+ const originalClass = args.classPath || args.class || args.type || args.actorClass;
40
+ const componentToAdd = (originalClass === 'SplineActor' || originalClass === 'Spline')
41
+ ? 'SplineComponent'
42
+ : undefined;
43
+ const result = await tools.actorTools.spawn({
44
+ classPath: params.classPath,
45
+ actorName: params.actorName,
46
+ location: args.location,
47
+ rotation: args.rotation,
48
+ meshPath: args.meshPath,
49
+ timeoutMs,
50
+ ...(componentToAdd ? { componentToAdd } : {})
51
+ });
52
+ if (result && result.success && result.actorName) {
53
+ return {
54
+ ...result,
55
+ message: `Spawned actor: ${result.actorName}`,
56
+ name: result.actorName
57
+ };
58
+ }
59
+ return result;
60
+ },
61
+ delete: async (args, tools) => {
62
+ if (args.actorNames && Array.isArray(args.actorNames)) {
63
+ return tools.actorTools.delete({ actorNames: args.actorNames });
64
+ }
65
+ const params = normalizeArgs(args, [
66
+ { key: 'actorName', aliases: ['name'], required: true }
67
+ ]);
68
+ return tools.actorTools.delete({ actorName: params.actorName });
69
+ },
70
+ apply_force: async (args, tools) => {
71
+ const params = normalizeArgs(args, [
72
+ { key: 'actorName', aliases: ['name'], required: true }
73
+ ]);
74
+ const force = args.force;
75
+ const tryApplyForce = async () => {
76
+ return await tools.actorTools.applyForce({
77
+ actorName: params.actorName,
78
+ force
79
+ });
80
+ };
81
+ try {
82
+ return await tryApplyForce();
83
+ }
84
+ catch (error) {
85
+ const errorMsg = error.message || String(error);
86
+ if (errorMsg.toUpperCase().includes('PHYSICS')) {
87
+ try {
88
+ const compsResult = await tools.actorTools.getComponents(params.actorName);
89
+ if (compsResult && compsResult.success && Array.isArray(compsResult.components)) {
90
+ logger.debug('Components found:', JSON.stringify(compsResult.components));
91
+ const meshComp = compsResult.components.find((c) => {
92
+ const name = c.name || c;
93
+ const match = typeof name === 'string' && (name.toLowerCase().includes('staticmesh') ||
94
+ name.toLowerCase().includes('mesh') ||
95
+ name.toLowerCase().includes('primitive'));
96
+ logger.debug(`Checking component '${name}' matches? ${match}`);
97
+ return match;
98
+ });
99
+ if (meshComp) {
100
+ const compName = meshComp.name || meshComp;
101
+ logger.debug(`Auto-enabling physics for component: ${compName}`);
102
+ await tools.actorTools.setComponentProperties({
103
+ actorName: params.actorName,
104
+ componentName: compName,
105
+ properties: { SimulatePhysics: true, bSimulatePhysics: true, Mobility: 2 }
106
+ });
107
+ return await tryApplyForce();
108
+ }
109
+ }
110
+ }
111
+ catch (retryError) {
112
+ throw new Error(`${errorMsg} (Auto-enable physics failed: ${retryError.message})`);
113
+ }
114
+ }
115
+ throw error;
116
+ }
117
+ },
118
+ set_transform: async (args, tools) => {
119
+ const params = normalizeArgs(args, [
120
+ { key: 'actorName', aliases: ['name'], required: true }
121
+ ]);
122
+ return tools.actorTools.setTransform({
123
+ actorName: params.actorName,
124
+ location: args.location,
125
+ rotation: args.rotation,
126
+ scale: args.scale
127
+ });
128
+ },
129
+ get_transform: async (args, tools) => {
130
+ const params = normalizeArgs(args, [
131
+ { key: 'actorName', aliases: ['name'], required: true }
132
+ ]);
133
+ return tools.actorTools.getTransform(params.actorName);
134
+ },
135
+ duplicate: async (args, tools) => {
136
+ const params = normalizeArgs(args, [
137
+ { key: 'actorName', aliases: ['name'], required: true },
138
+ { key: 'newName', aliases: ['nameTo'] }
139
+ ]);
140
+ return tools.actorTools.duplicate({
141
+ actorName: params.actorName,
142
+ newName: params.newName,
143
+ offset: args.offset
144
+ });
145
+ },
146
+ attach: async (args, tools) => {
147
+ const params = normalizeArgs(args, [
148
+ { key: 'childActor', aliases: ['actorName', 'child'], required: true },
149
+ { key: 'parentActor', aliases: ['parent'], required: true }
150
+ ]);
151
+ return tools.actorTools.attach({ childActor: params.childActor, parentActor: params.parentActor });
152
+ },
153
+ detach: async (args, tools) => {
154
+ const params = normalizeArgs(args, [
155
+ { key: 'actorName', aliases: ['childActor', 'child'], required: true }
156
+ ]);
157
+ return tools.actorTools.detach(params.actorName);
158
+ },
159
+ add_tag: async (args, tools) => {
160
+ const params = normalizeArgs(args, [
161
+ { key: 'actorName', aliases: ['name'], required: true },
162
+ { key: 'tag', required: true }
163
+ ]);
164
+ return tools.actorTools.addTag({ actorName: params.actorName, tag: params.tag });
165
+ },
166
+ remove_tag: async (args, tools) => {
167
+ const params = normalizeArgs(args, [
168
+ { key: 'actorName', aliases: ['name'], required: true },
169
+ { key: 'tag', required: true }
170
+ ]);
171
+ return tools.actorTools.removeTag({ actorName: params.actorName, tag: params.tag });
172
+ },
173
+ find_by_tag: async (args, tools) => {
174
+ const params = normalizeArgs(args, [
175
+ { key: 'tag', default: '' }
176
+ ]);
177
+ return tools.actorTools.findByTag({ tag: params.tag, matchType: args.matchType });
178
+ },
179
+ delete_by_tag: async (args, tools) => {
180
+ const params = normalizeArgs(args, [
181
+ { key: 'tag', required: true }
182
+ ]);
183
+ return tools.actorTools.deleteByTag(params.tag);
184
+ },
185
+ spawn_blueprint: async (args, tools) => {
186
+ const params = normalizeArgs(args, [
187
+ { key: 'blueprintPath', aliases: ['path', 'bp'], required: true },
188
+ { key: 'actorName', aliases: ['name'] }
189
+ ]);
190
+ const result = await tools.actorTools.spawnBlueprint({
191
+ blueprintPath: params.blueprintPath,
192
+ actorName: params.actorName,
193
+ location: args.location,
194
+ rotation: args.rotation
195
+ });
196
+ if (result && result.success && result.actorName) {
197
+ return {
198
+ ...result,
199
+ message: `Spawned blueprint: ${result.actorName}`,
200
+ name: result.actorName
201
+ };
202
+ }
203
+ return result;
204
+ },
205
+ list: async (args, tools) => {
206
+ const result = await tools.actorTools.listActors();
207
+ if (result && result.actors && Array.isArray(result.actors)) {
208
+ const limit = typeof args.limit === 'number' ? args.limit : 50;
209
+ const count = result.actors.length;
210
+ const names = result.actors.slice(0, limit).map((a) => a.label || a.name).join(', ');
211
+ const remaining = count - limit;
212
+ const suffix = remaining > 0 ? `... and ${remaining} others` : '';
213
+ result.message = `Found ${count} actors: ${names}${suffix}`;
214
+ }
215
+ return result;
216
+ },
217
+ find_by_name: async (args, tools) => {
218
+ const params = normalizeArgs(args, [
219
+ { key: 'name', aliases: ['actorName', 'query'], required: true }
220
+ ]);
221
+ return tools.actorTools.findByName(params.name);
222
+ }
223
+ };
224
+ export async function handleActorTools(action, args, tools) {
225
+ const handler = handlers[action];
226
+ if (handler) {
227
+ const res = await handler(args, tools);
228
+ return cleanObject(res);
229
+ }
230
+ return executeAutomationRequest(tools, 'control_actor', args);
231
+ }
232
+ //# sourceMappingURL=actor-handlers.js.map
@@ -0,0 +1,3 @@
1
+ import { ITools } from '../../types/tool-interfaces.js';
2
+ export declare function handleAnimationTools(action: string, args: any, tools: ITools): Promise<any>;
3
+ //# sourceMappingURL=animation-handlers.d.ts.map
@@ -0,0 +1,185 @@
1
+ import { cleanObject } from '../../utils/safe-json.js';
2
+ import { executeAutomationRequest } from './common-handlers.js';
3
+ export async function handleAnimationTools(action, args, tools) {
4
+ const animAction = String(action || '').toLowerCase();
5
+ if (animAction === 'create_animation_blueprint' || animAction === 'create_anim_blueprint' || animAction === 'create_animation_bp') {
6
+ const name = args.name ?? args.blueprintName;
7
+ const skeletonPath = args.skeletonPath ?? args.targetSkeleton;
8
+ const savePath = args.savePath ?? args.path ?? '/Game/Animations';
9
+ if (!skeletonPath && args.actorName) {
10
+ try {
11
+ const compsRes = await tools.actorTools.getComponents(args.actorName);
12
+ if (compsRes && Array.isArray(compsRes.components)) {
13
+ const meshComp = compsRes.components.find((c) => c.type === 'SkeletalMeshComponent' || c.className === 'SkeletalMeshComponent');
14
+ if (meshComp && meshComp.skeletalMesh) {
15
+ }
16
+ }
17
+ }
18
+ catch (_e) { }
19
+ }
20
+ const payload = {
21
+ ...args,
22
+ name,
23
+ skeletonPath,
24
+ savePath
25
+ };
26
+ return await executeAutomationRequest(tools, 'create_animation_blueprint', payload, 'Automation bridge not available for animation blueprint creation');
27
+ }
28
+ if (animAction === 'play_anim_montage' || animAction === 'play_montage') {
29
+ const resp = await executeAutomationRequest(tools, 'play_anim_montage', args, 'Automation bridge not available for montage playback');
30
+ const result = resp?.result ?? resp ?? {};
31
+ const errorCode = typeof result.error === 'string' ? result.error.toUpperCase() : '';
32
+ const message = typeof result.message === 'string' ? result.message : '';
33
+ const msgLower = message.toLowerCase();
34
+ if (msgLower.includes('actor not found') || msgLower.includes('no animation played') || errorCode === 'ACTOR_NOT_FOUND') {
35
+ return cleanObject({
36
+ success: false,
37
+ error: 'ACTOR_NOT_FOUND',
38
+ message: message || 'Actor not found; no animation played',
39
+ actorName: args.actorName
40
+ });
41
+ }
42
+ if (errorCode === 'INVALID_ARGUMENT' &&
43
+ msgLower.includes('actorname required') &&
44
+ typeof args.playRate === 'number' &&
45
+ args.playRate === 0) {
46
+ return cleanObject({
47
+ success: true,
48
+ noOp: true,
49
+ message: 'Montage playback skipped: playRate 0 with missing actorName treated as no-op.'
50
+ });
51
+ }
52
+ return cleanObject(resp);
53
+ }
54
+ if (animAction === 'setup_ragdoll' || animAction === 'activate_ragdoll') {
55
+ if (args.actorName && !args.meshPath && !args.skeletonPath) {
56
+ try {
57
+ const compsRes = await tools.actorTools.getComponents(args.actorName);
58
+ if (compsRes && Array.isArray(compsRes.components)) {
59
+ const meshComp = compsRes.components.find((c) => c.type === 'SkeletalMeshComponent' || c.className === 'SkeletalMeshComponent');
60
+ if (meshComp && meshComp.path) {
61
+ args.meshPath = meshComp.path;
62
+ }
63
+ }
64
+ }
65
+ catch (_e) {
66
+ }
67
+ }
68
+ const resp = await executeAutomationRequest(tools, 'setup_ragdoll', args, 'Automation bridge not available for ragdoll setup');
69
+ const result = resp?.result ?? resp ?? {};
70
+ const message = typeof result.message === 'string' ? result.message : '';
71
+ const msgLower = message.toLowerCase();
72
+ if (msgLower.includes('actor not found') || msgLower.includes('no ragdoll applied')) {
73
+ return cleanObject({
74
+ success: false,
75
+ error: 'ACTOR_NOT_FOUND',
76
+ message: message || 'Actor not found; no ragdoll applied',
77
+ actorName: args.actorName
78
+ });
79
+ }
80
+ return cleanObject(resp);
81
+ }
82
+ if (animAction === 'create_blend_space' || animAction === 'create_blend_tree') {
83
+ if (args.horizontalAxis) {
84
+ args.minX = args.horizontalAxis.minValue;
85
+ args.maxX = args.horizontalAxis.maxValue;
86
+ }
87
+ if (args.verticalAxis) {
88
+ args.minY = args.verticalAxis.minValue;
89
+ args.maxY = args.verticalAxis.maxValue;
90
+ }
91
+ }
92
+ switch (animAction) {
93
+ case 'create_blend_space':
94
+ return cleanObject(await tools.animationTools.createBlendSpace({
95
+ name: args.name,
96
+ path: args.path || args.savePath,
97
+ skeletonPath: args.skeletonPath,
98
+ horizontalAxis: args.horizontalAxis,
99
+ verticalAxis: args.verticalAxis
100
+ }));
101
+ case 'create_state_machine':
102
+ return cleanObject(await tools.animationTools.createStateMachine({
103
+ machineName: args.machineName || args.name,
104
+ states: args.states,
105
+ transitions: args.transitions,
106
+ blueprintPath: args.blueprintPath || args.path || args.savePath
107
+ }));
108
+ case 'setup_ik':
109
+ return cleanObject(await tools.animationTools.setupIK({
110
+ actorName: args.actorName,
111
+ ikBones: args.ikBones,
112
+ enableFootPlacement: args.enableFootPlacement
113
+ }));
114
+ case 'create_procedural_anim':
115
+ return cleanObject(await tools.animationTools.createProceduralAnim({
116
+ systemName: args.systemName || args.name,
117
+ baseAnimation: args.baseAnimation,
118
+ modifiers: args.modifiers,
119
+ savePath: args.savePath || args.path
120
+ }));
121
+ case 'create_blend_tree':
122
+ return cleanObject(await tools.animationTools.createBlendTree({
123
+ treeName: args.treeName || args.name,
124
+ blendType: args.blendType,
125
+ basePose: args.basePose,
126
+ additiveAnimations: args.additiveAnimations,
127
+ savePath: args.savePath || args.path
128
+ }));
129
+ case 'cleanup':
130
+ return cleanObject(await tools.animationTools.cleanup(args.artifacts));
131
+ case 'create_animation_asset': {
132
+ let assetType = args.assetType;
133
+ if (!assetType && args.name) {
134
+ if (args.name.toLowerCase().endsWith('montage') || args.name.toLowerCase().includes('montage')) {
135
+ assetType = 'montage';
136
+ }
137
+ }
138
+ return cleanObject(await tools.animationTools.createAnimationAsset({
139
+ name: args.name,
140
+ path: args.path || args.savePath,
141
+ skeletonPath: args.skeletonPath,
142
+ assetType
143
+ }));
144
+ }
145
+ case 'add_notify':
146
+ return cleanObject(await tools.animationTools.addNotify({
147
+ animationPath: args.animationPath,
148
+ assetPath: args.assetPath,
149
+ notifyName: args.notifyName || args.name,
150
+ time: args.time ?? args.startTime
151
+ }));
152
+ case 'configure_vehicle':
153
+ return cleanObject(await tools.physicsTools.configureVehicle({
154
+ vehicleName: args.vehicleName,
155
+ vehicleType: args.vehicleType,
156
+ wheels: args.wheels,
157
+ engine: args.engine,
158
+ transmission: args.transmission,
159
+ pluginDependencies: args.pluginDependencies ?? args.plugins
160
+ }));
161
+ case 'setup_physics_simulation': {
162
+ const payload = {
163
+ meshPath: args.meshPath,
164
+ skeletonPath: args.skeletonPath,
165
+ physicsAssetName: args.physicsAssetName,
166
+ savePath: args.savePath
167
+ };
168
+ if (args.actorName && !args.meshPath && !args.skeletonPath) {
169
+ payload.actorName = args.actorName;
170
+ }
171
+ if (!payload.meshPath && !payload.skeletonPath && !payload.actorName) {
172
+ return cleanObject({
173
+ success: false,
174
+ error: 'INVALID_ARGUMENT',
175
+ message: 'setup_physics_simulation requires meshPath, skeletonPath, or actorName parameter'
176
+ });
177
+ }
178
+ return cleanObject(await tools.physicsTools.setupPhysicsSimulation(payload));
179
+ }
180
+ default:
181
+ const res = await executeAutomationRequest(tools, 'animation_physics', args, 'Automation bridge not available for animation/physics operations');
182
+ return cleanObject(res);
183
+ }
184
+ }
185
+ //# sourceMappingURL=animation-handlers.js.map
@@ -0,0 +1,16 @@
1
+ import { ITools } from '../../types/tool-interfaces.js';
2
+ export interface ArgConfig {
3
+ key: string;
4
+ aliases?: string[];
5
+ required?: boolean;
6
+ default?: any;
7
+ map?: Record<string, string>;
8
+ validator?: (val: any) => void | string;
9
+ }
10
+ export declare function normalizeArgs(args: any, configs: ArgConfig[]): any;
11
+ export declare function resolveObjectPath(args: any, tools: ITools, config?: {
12
+ pathKeys?: string[];
13
+ actorKeys?: string[];
14
+ fallbackToName?: boolean;
15
+ }): Promise<string | undefined>;
16
+ //# sourceMappingURL=argument-helper.d.ts.map
@@ -0,0 +1,80 @@
1
+ export function normalizeArgs(args, configs) {
2
+ const normalized = { ...args };
3
+ for (const config of configs) {
4
+ let val = undefined;
5
+ if (args[config.key] !== undefined && args[config.key] !== null && args[config.key] !== '') {
6
+ val = args[config.key];
7
+ }
8
+ if (val === undefined && config.aliases) {
9
+ for (const alias of config.aliases) {
10
+ if (args[alias] !== undefined && args[alias] !== null && args[alias] !== '') {
11
+ val = args[alias];
12
+ break;
13
+ }
14
+ }
15
+ }
16
+ if (val === undefined && config.default !== undefined) {
17
+ val = config.default;
18
+ }
19
+ if (config.required) {
20
+ if (val === undefined || val === null || (typeof val === 'string' && val.trim() === '')) {
21
+ const aliasStr = config.aliases ? ` (or ${config.aliases.join(', ')})` : '';
22
+ throw new Error(`Missing required argument: ${config.key}${aliasStr}`);
23
+ }
24
+ }
25
+ if (config.map && typeof val === 'string') {
26
+ if (config.map[val]) {
27
+ val = config.map[val];
28
+ }
29
+ }
30
+ if (config.validator && val !== undefined) {
31
+ const err = config.validator(val);
32
+ if (typeof err === 'string') {
33
+ throw new Error(`Invalid argument '${config.key}': ${err}`);
34
+ }
35
+ }
36
+ if (val !== undefined) {
37
+ normalized[config.key] = val;
38
+ }
39
+ }
40
+ return normalized;
41
+ }
42
+ export async function resolveObjectPath(args, tools, config) {
43
+ const pathKeys = config?.pathKeys || ['objectPath', 'path'];
44
+ const actorKeys = config?.actorKeys || ['actorName', 'name'];
45
+ const fallback = config?.fallbackToName !== false;
46
+ for (const key of pathKeys) {
47
+ if (typeof args[key] === 'string' && args[key].trim().length > 0) {
48
+ return args[key].trim().replace(/\/+$/, '');
49
+ }
50
+ }
51
+ let potentialName;
52
+ for (const key of actorKeys) {
53
+ if (typeof args[key] === 'string' && args[key].trim().length > 0) {
54
+ potentialName = args[key].trim();
55
+ break;
56
+ }
57
+ }
58
+ if (potentialName) {
59
+ if (tools.actorTools && typeof tools.actorTools.findByName === 'function') {
60
+ try {
61
+ const res = await tools.actorTools.findByName(potentialName);
62
+ const container = res && (res.result || res);
63
+ const actors = container && Array.isArray(container.actors) ? container.actors : [];
64
+ if (actors.length > 0) {
65
+ const first = actors[0];
66
+ const resolvedPath = first.path || first.objectPath || first.levelPath;
67
+ if (typeof resolvedPath === 'string' && resolvedPath.trim().length > 0) {
68
+ return resolvedPath.trim();
69
+ }
70
+ }
71
+ }
72
+ catch {
73
+ }
74
+ }
75
+ if (fallback)
76
+ return potentialName;
77
+ }
78
+ return undefined;
79
+ }
80
+ //# sourceMappingURL=argument-helper.js.map
@@ -0,0 +1,3 @@
1
+ import { ITools } from '../../types/tool-interfaces.js';
2
+ export declare function handleAssetTools(action: string, args: any, tools: ITools): Promise<any>;
3
+ //# sourceMappingURL=asset-handlers.d.ts.map