unreal-engine-mcp-server 0.5.21 → 0.5.30

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 (382) hide show
  1. package/CHANGELOG.md +247 -4
  2. package/README.md +140 -85
  3. package/dist/automation/bridge.d.ts +8 -0
  4. package/dist/automation/bridge.d.ts.map +1 -1
  5. package/dist/automation/bridge.js +94 -14
  6. package/dist/automation/bridge.js.map +1 -1
  7. package/dist/automation/connection-manager.d.ts.map +1 -1
  8. package/dist/automation/connection-manager.js +13 -5
  9. package/dist/automation/connection-manager.js.map +1 -1
  10. package/dist/automation/handshake.d.ts.map +1 -1
  11. package/dist/automation/handshake.js +40 -27
  12. package/dist/automation/handshake.js.map +1 -1
  13. package/dist/automation/index.d.ts +1 -1
  14. package/dist/automation/index.d.ts.map +1 -1
  15. package/dist/automation/index.js +0 -1
  16. package/dist/automation/index.js.map +1 -1
  17. package/dist/automation/message-handler.d.ts.map +1 -1
  18. package/dist/automation/message-handler.js +13 -9
  19. package/dist/automation/message-handler.js.map +1 -1
  20. package/dist/automation/message-schema.d.ts.map +1 -1
  21. package/dist/automation/message-schema.js +19 -18
  22. package/dist/automation/message-schema.js.map +1 -1
  23. package/dist/automation/request-tracker.d.ts +1 -0
  24. package/dist/automation/request-tracker.d.ts.map +1 -1
  25. package/dist/automation/request-tracker.js +30 -31
  26. package/dist/automation/request-tracker.js.map +1 -1
  27. package/dist/automation/types.d.ts +38 -32
  28. package/dist/automation/types.d.ts.map +1 -1
  29. package/dist/cli.js +14 -16
  30. package/dist/cli.js.map +1 -1
  31. package/dist/config/class-aliases.d.ts.map +1 -1
  32. package/dist/config/class-aliases.js +10 -2
  33. package/dist/config/class-aliases.js.map +1 -1
  34. package/dist/config.d.ts +9 -8
  35. package/dist/config.d.ts.map +1 -1
  36. package/dist/config.js +58 -32
  37. package/dist/config.js.map +1 -1
  38. package/dist/handlers/resource-handlers.d.ts +15 -2
  39. package/dist/handlers/resource-handlers.d.ts.map +1 -1
  40. package/dist/handlers/resource-handlers.js +46 -63
  41. package/dist/handlers/resource-handlers.js.map +1 -1
  42. package/dist/index.d.ts +0 -2
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +42 -48
  45. package/dist/index.js.map +1 -1
  46. package/dist/resources/assets.d.ts.map +1 -1
  47. package/dist/resources/assets.js +34 -9
  48. package/dist/resources/assets.js.map +1 -1
  49. package/dist/resources/levels.d.ts +3 -0
  50. package/dist/resources/levels.d.ts.map +1 -1
  51. package/dist/resources/levels.js +33 -17
  52. package/dist/resources/levels.js.map +1 -1
  53. package/dist/server/resource-registry.d.ts +15 -2
  54. package/dist/server/resource-registry.d.ts.map +1 -1
  55. package/dist/server/resource-registry.js +9 -8
  56. package/dist/server/resource-registry.js.map +1 -1
  57. package/dist/server/tool-registry.d.ts +0 -1
  58. package/dist/server/tool-registry.d.ts.map +1 -1
  59. package/dist/server/tool-registry.js +91 -101
  60. package/dist/server/tool-registry.js.map +1 -1
  61. package/dist/server-setup.d.ts +5 -2
  62. package/dist/server-setup.d.ts.map +1 -1
  63. package/dist/server-setup.js +15 -19
  64. package/dist/server-setup.js.map +1 -1
  65. package/dist/services/health-monitor.d.ts +3 -0
  66. package/dist/services/health-monitor.d.ts.map +1 -1
  67. package/dist/services/health-monitor.js +30 -11
  68. package/dist/services/health-monitor.js.map +1 -1
  69. package/dist/services/metrics-server.d.ts +1 -1
  70. package/dist/services/metrics-server.d.ts.map +1 -1
  71. package/dist/services/metrics-server.js +65 -3
  72. package/dist/services/metrics-server.js.map +1 -1
  73. package/dist/tools/base-tool.d.ts.map +1 -1
  74. package/dist/tools/base-tool.js +14 -16
  75. package/dist/tools/base-tool.js.map +1 -1
  76. package/dist/tools/consolidated-tool-definitions.d.ts +16 -1
  77. package/dist/tools/consolidated-tool-definitions.d.ts.map +1 -1
  78. package/dist/tools/consolidated-tool-definitions.js +1479 -2538
  79. package/dist/tools/consolidated-tool-definitions.js.map +1 -1
  80. package/dist/tools/consolidated-tool-handlers.d.ts.map +1 -1
  81. package/dist/tools/consolidated-tool-handlers.js +195 -217
  82. package/dist/tools/consolidated-tool-handlers.js.map +1 -1
  83. package/dist/tools/dynamic-handler-registry.d.ts +1 -0
  84. package/dist/tools/dynamic-handler-registry.d.ts.map +1 -1
  85. package/dist/tools/dynamic-handler-registry.js +15 -7
  86. package/dist/tools/dynamic-handler-registry.js.map +1 -1
  87. package/dist/tools/dynamic-tool-manager.d.ts +1 -1
  88. package/dist/tools/dynamic-tool-manager.d.ts.map +1 -1
  89. package/dist/tools/dynamic-tool-manager.js +30 -18
  90. package/dist/tools/dynamic-tool-manager.js.map +1 -1
  91. package/dist/tools/editor.d.ts +2 -2
  92. package/dist/tools/editor.d.ts.map +1 -1
  93. package/dist/tools/editor.js +4 -4
  94. package/dist/tools/editor.js.map +1 -1
  95. package/dist/tools/handlers/actor-handlers.d.ts.map +1 -1
  96. package/dist/tools/handlers/actor-handlers.js +66 -7
  97. package/dist/tools/handlers/actor-handlers.js.map +1 -1
  98. package/dist/tools/handlers/ai-handlers.d.ts.map +1 -1
  99. package/dist/tools/handlers/ai-handlers.js +24 -13
  100. package/dist/tools/handlers/ai-handlers.js.map +1 -1
  101. package/dist/tools/handlers/animation-authoring-handlers.d.ts.map +1 -1
  102. package/dist/tools/handlers/animation-authoring-handlers.js +285 -218
  103. package/dist/tools/handlers/animation-authoring-handlers.js.map +1 -1
  104. package/dist/tools/handlers/animation-handlers.d.ts.map +1 -1
  105. package/dist/tools/handlers/animation-handlers.js +69 -21
  106. package/dist/tools/handlers/animation-handlers.js.map +1 -1
  107. package/dist/tools/handlers/asset-handlers.d.ts.map +1 -1
  108. package/dist/tools/handlers/asset-handlers.js +75 -16
  109. package/dist/tools/handlers/asset-handlers.js.map +1 -1
  110. package/dist/tools/handlers/audio-authoring-handlers.d.ts.map +1 -1
  111. package/dist/tools/handlers/audio-authoring-handlers.js +102 -9
  112. package/dist/tools/handlers/audio-authoring-handlers.js.map +1 -1
  113. package/dist/tools/handlers/audio-handlers.d.ts.map +1 -1
  114. package/dist/tools/handlers/audio-handlers.js +48 -13
  115. package/dist/tools/handlers/audio-handlers.js.map +1 -1
  116. package/dist/tools/handlers/blueprint-handlers.d.ts.map +1 -1
  117. package/dist/tools/handlers/blueprint-handlers.js +28 -48
  118. package/dist/tools/handlers/blueprint-handlers.js.map +1 -1
  119. package/dist/tools/handlers/character-handlers.d.ts.map +1 -1
  120. package/dist/tools/handlers/character-handlers.js +13 -12
  121. package/dist/tools/handlers/character-handlers.js.map +1 -1
  122. package/dist/tools/handlers/combat-handlers.d.ts.map +1 -1
  123. package/dist/tools/handlers/combat-handlers.js +12 -12
  124. package/dist/tools/handlers/combat-handlers.js.map +1 -1
  125. package/dist/tools/handlers/common-handlers.d.ts +14 -0
  126. package/dist/tools/handlers/common-handlers.d.ts.map +1 -1
  127. package/dist/tools/handlers/common-handlers.js +117 -9
  128. package/dist/tools/handlers/common-handlers.js.map +1 -1
  129. package/dist/tools/handlers/editor-handlers.d.ts.map +1 -1
  130. package/dist/tools/handlers/editor-handlers.js +139 -67
  131. package/dist/tools/handlers/editor-handlers.js.map +1 -1
  132. package/dist/tools/handlers/effect-handlers.d.ts.map +1 -1
  133. package/dist/tools/handlers/effect-handlers.js +324 -36
  134. package/dist/tools/handlers/effect-handlers.js.map +1 -1
  135. package/dist/tools/handlers/environment-handlers.d.ts.map +1 -1
  136. package/dist/tools/handlers/environment-handlers.js +186 -21
  137. package/dist/tools/handlers/environment-handlers.js.map +1 -1
  138. package/dist/tools/handlers/game-framework-handlers.d.ts.map +1 -1
  139. package/dist/tools/handlers/game-framework-handlers.js +10 -12
  140. package/dist/tools/handlers/game-framework-handlers.js.map +1 -1
  141. package/dist/tools/handlers/gas-handlers.d.ts.map +1 -1
  142. package/dist/tools/handlers/gas-handlers.js +136 -20
  143. package/dist/tools/handlers/gas-handlers.js.map +1 -1
  144. package/dist/tools/handlers/geometry-handlers.d.ts.map +1 -1
  145. package/dist/tools/handlers/geometry-handlers.js +130 -7
  146. package/dist/tools/handlers/geometry-handlers.js.map +1 -1
  147. package/dist/tools/handlers/graph-handlers.d.ts.map +1 -1
  148. package/dist/tools/handlers/graph-handlers.js +46 -11
  149. package/dist/tools/handlers/graph-handlers.js.map +1 -1
  150. package/dist/tools/handlers/input-handlers.d.ts.map +1 -1
  151. package/dist/tools/handlers/input-handlers.js +33 -75
  152. package/dist/tools/handlers/input-handlers.js.map +1 -1
  153. package/dist/tools/handlers/inspect-handlers.d.ts.map +1 -1
  154. package/dist/tools/handlers/inspect-handlers.js +136 -39
  155. package/dist/tools/handlers/inspect-handlers.js.map +1 -1
  156. package/dist/tools/handlers/interaction-handlers.d.ts.map +1 -1
  157. package/dist/tools/handlers/interaction-handlers.js +14 -12
  158. package/dist/tools/handlers/interaction-handlers.js.map +1 -1
  159. package/dist/tools/handlers/inventory-handlers.d.ts.map +1 -1
  160. package/dist/tools/handlers/inventory-handlers.js +19 -12
  161. package/dist/tools/handlers/inventory-handlers.js.map +1 -1
  162. package/dist/tools/handlers/level-handlers.d.ts.map +1 -1
  163. package/dist/tools/handlers/level-handlers.js +166 -149
  164. package/dist/tools/handlers/level-handlers.js.map +1 -1
  165. package/dist/tools/handlers/level-structure-handlers.d.ts.map +1 -1
  166. package/dist/tools/handlers/level-structure-handlers.js +18 -34
  167. package/dist/tools/handlers/level-structure-handlers.js.map +1 -1
  168. package/dist/tools/handlers/manage-tools-handlers.js +3 -3
  169. package/dist/tools/handlers/manage-tools-handlers.js.map +1 -1
  170. package/dist/tools/handlers/material-authoring-handlers.d.ts.map +1 -1
  171. package/dist/tools/handlers/material-authoring-handlers.js +382 -41
  172. package/dist/tools/handlers/material-authoring-handlers.js.map +1 -1
  173. package/dist/tools/handlers/navigation-handlers.d.ts.map +1 -1
  174. package/dist/tools/handlers/navigation-handlers.js +11 -36
  175. package/dist/tools/handlers/navigation-handlers.js.map +1 -1
  176. package/dist/tools/handlers/networking-handlers.d.ts.map +1 -1
  177. package/dist/tools/handlers/networking-handlers.js +17 -15
  178. package/dist/tools/handlers/networking-handlers.js.map +1 -1
  179. package/dist/tools/handlers/niagara-authoring-handlers.d.ts.map +1 -1
  180. package/dist/tools/handlers/niagara-authoring-handlers.js +24 -23
  181. package/dist/tools/handlers/niagara-authoring-handlers.js.map +1 -1
  182. package/dist/tools/handlers/pcg-handlers.d.ts +4 -0
  183. package/dist/tools/handlers/pcg-handlers.d.ts.map +1 -0
  184. package/dist/tools/handlers/pcg-handlers.js +77 -0
  185. package/dist/tools/handlers/pcg-handlers.js.map +1 -0
  186. package/dist/tools/handlers/performance-handlers.d.ts.map +1 -1
  187. package/dist/tools/handlers/performance-handlers.js +35 -42
  188. package/dist/tools/handlers/performance-handlers.js.map +1 -1
  189. package/dist/tools/handlers/pipeline-handlers.d.ts.map +1 -1
  190. package/dist/tools/handlers/pipeline-handlers.js +157 -39
  191. package/dist/tools/handlers/pipeline-handlers.js.map +1 -1
  192. package/dist/tools/handlers/sequence-handlers.d.ts.map +1 -1
  193. package/dist/tools/handlers/sequence-handlers.js +6 -4
  194. package/dist/tools/handlers/sequence-handlers.js.map +1 -1
  195. package/dist/tools/handlers/sessions-handlers.d.ts.map +1 -1
  196. package/dist/tools/handlers/sessions-handlers.js +7 -15
  197. package/dist/tools/handlers/sessions-handlers.js.map +1 -1
  198. package/dist/tools/handlers/spline-handlers.d.ts.map +1 -1
  199. package/dist/tools/handlers/spline-handlers.js +8 -35
  200. package/dist/tools/handlers/spline-handlers.js.map +1 -1
  201. package/dist/tools/handlers/system-handlers.d.ts.map +1 -1
  202. package/dist/tools/handlers/system-handlers.js +100 -26
  203. package/dist/tools/handlers/system-handlers.js.map +1 -1
  204. package/dist/tools/handlers/texture-handlers.d.ts.map +1 -1
  205. package/dist/tools/handlers/texture-handlers.js +14 -0
  206. package/dist/tools/handlers/texture-handlers.js.map +1 -1
  207. package/dist/tools/handlers/volume-handlers.d.ts.map +1 -1
  208. package/dist/tools/handlers/volume-handlers.js +6 -33
  209. package/dist/tools/handlers/volume-handlers.js.map +1 -1
  210. package/dist/tools/handlers/widget-authoring-handlers.d.ts.map +1 -1
  211. package/dist/tools/handlers/widget-authoring-handlers.js +26 -20
  212. package/dist/tools/handlers/widget-authoring-handlers.js.map +1 -1
  213. package/dist/tools/level.d.ts +2 -2
  214. package/dist/tools/level.d.ts.map +1 -1
  215. package/dist/tools/level.js +2 -1
  216. package/dist/tools/level.js.map +1 -1
  217. package/dist/tools/property-dictionary.js +1 -1
  218. package/dist/tools/property-dictionary.js.map +1 -1
  219. package/dist/tools/schemas/core-tools.d.ts +1 -1
  220. package/dist/tools/schemas/core-tools.d.ts.map +1 -1
  221. package/dist/tools/schemas/core-tools.js +94 -57
  222. package/dist/tools/schemas/core-tools.js.map +1 -1
  223. package/dist/tools/tool-definition-utils.d.ts +8 -0
  224. package/dist/tools/tool-definition-utils.d.ts.map +1 -1
  225. package/dist/tools/tool-definition-utils.js +20 -0
  226. package/dist/tools/tool-definition-utils.js.map +1 -1
  227. package/dist/types/automation-responses.d.ts +26 -33
  228. package/dist/types/automation-responses.d.ts.map +1 -1
  229. package/dist/types/env.d.ts.map +1 -1
  230. package/dist/types/env.js +7 -6
  231. package/dist/types/env.js.map +1 -1
  232. package/dist/types/handler-types.d.ts +41 -20
  233. package/dist/types/handler-types.d.ts.map +1 -1
  234. package/dist/types/index.d.ts +2 -2
  235. package/dist/types/index.d.ts.map +1 -1
  236. package/dist/types/index.js.map +1 -1
  237. package/dist/types/tool-interfaces.d.ts +5 -873
  238. package/dist/types/tool-interfaces.d.ts.map +1 -1
  239. package/dist/types/tool-types.d.ts +35 -1
  240. package/dist/types/tool-types.d.ts.map +1 -1
  241. package/dist/unreal-bridge.d.ts.map +1 -1
  242. package/dist/unreal-bridge.js +16 -6
  243. package/dist/unreal-bridge.js.map +1 -1
  244. package/dist/utils/action-constants.d.ts +4 -1
  245. package/dist/utils/action-constants.d.ts.map +1 -1
  246. package/dist/utils/action-constants.js +4 -1
  247. package/dist/utils/action-constants.js.map +1 -1
  248. package/dist/utils/command-validator.d.ts.map +1 -1
  249. package/dist/utils/command-validator.js +5 -4
  250. package/dist/utils/command-validator.js.map +1 -1
  251. package/dist/utils/elicitation.d.ts +5 -2
  252. package/dist/utils/elicitation.d.ts.map +1 -1
  253. package/dist/utils/elicitation.js +38 -21
  254. package/dist/utils/elicitation.js.map +1 -1
  255. package/dist/utils/environment-snapshot.d.ts +17 -0
  256. package/dist/utils/environment-snapshot.d.ts.map +1 -0
  257. package/dist/utils/environment-snapshot.js +242 -0
  258. package/dist/utils/environment-snapshot.js.map +1 -0
  259. package/dist/utils/error-handler.d.ts +1 -11
  260. package/dist/utils/error-handler.d.ts.map +1 -1
  261. package/dist/utils/error-handler.js +41 -25
  262. package/dist/utils/error-handler.js.map +1 -1
  263. package/dist/utils/index.d.ts +2 -1
  264. package/dist/utils/index.d.ts.map +1 -1
  265. package/dist/utils/index.js +2 -1
  266. package/dist/utils/index.js.map +1 -1
  267. package/dist/utils/ini-reader.js +4 -4
  268. package/dist/utils/ini-reader.js.map +1 -1
  269. package/dist/utils/log-reader.d.ts +29 -0
  270. package/dist/utils/log-reader.d.ts.map +1 -0
  271. package/dist/utils/log-reader.js +229 -0
  272. package/dist/utils/log-reader.js.map +1 -0
  273. package/dist/utils/log-redaction.d.ts +4 -0
  274. package/dist/utils/log-redaction.d.ts.map +1 -0
  275. package/dist/utils/log-redaction.js +27 -0
  276. package/dist/utils/log-redaction.js.map +1 -0
  277. package/dist/utils/logger.d.ts +1 -0
  278. package/dist/utils/logger.d.ts.map +1 -1
  279. package/dist/utils/logger.js +20 -7
  280. package/dist/utils/logger.js.map +1 -1
  281. package/dist/utils/normalize.d.ts.map +1 -1
  282. package/dist/utils/normalize.js +31 -30
  283. package/dist/utils/normalize.js.map +1 -1
  284. package/dist/utils/path-security.d.ts.map +1 -1
  285. package/dist/utils/path-security.js +20 -11
  286. package/dist/utils/path-security.js.map +1 -1
  287. package/dist/utils/response-factory.d.ts +1 -1
  288. package/dist/utils/response-factory.d.ts.map +1 -1
  289. package/dist/utils/response-factory.js +17 -3
  290. package/dist/utils/response-factory.js.map +1 -1
  291. package/dist/utils/response-validator.d.ts.map +1 -1
  292. package/dist/utils/response-validator.js +114 -47
  293. package/dist/utils/response-validator.js.map +1 -1
  294. package/dist/utils/safe-json.d.ts.map +1 -1
  295. package/dist/utils/safe-json.js +24 -18
  296. package/dist/utils/safe-json.js.map +1 -1
  297. package/dist/utils/type-coercion.d.ts +2 -3
  298. package/dist/utils/type-coercion.d.ts.map +1 -1
  299. package/dist/utils/type-coercion.js +42 -14
  300. package/dist/utils/type-coercion.js.map +1 -1
  301. package/dist/utils/type-guards.d.ts +2 -0
  302. package/dist/utils/type-guards.d.ts.map +1 -0
  303. package/dist/utils/type-guards.js +4 -0
  304. package/dist/utils/type-guards.js.map +1 -0
  305. package/dist/utils/unreal-command-queue.d.ts +2 -0
  306. package/dist/utils/unreal-command-queue.d.ts.map +1 -1
  307. package/dist/utils/unreal-command-queue.js +80 -54
  308. package/dist/utils/unreal-command-queue.js.map +1 -1
  309. package/dist/utils/validation.d.ts +2 -1
  310. package/dist/utils/validation.d.ts.map +1 -1
  311. package/dist/utils/validation.js +44 -34
  312. package/dist/utils/validation.js.map +1 -1
  313. package/package.json +4 -6
  314. package/server.json +3 -3
  315. package/dist/graphql/loaders.d.ts +0 -64
  316. package/dist/graphql/loaders.d.ts.map +0 -1
  317. package/dist/graphql/loaders.js +0 -117
  318. package/dist/graphql/loaders.js.map +0 -1
  319. package/dist/graphql/resolvers.d.ts +0 -373
  320. package/dist/graphql/resolvers.d.ts.map +0 -1
  321. package/dist/graphql/resolvers.js +0 -776
  322. package/dist/graphql/resolvers.js.map +0 -1
  323. package/dist/graphql/schema.d.ts +0 -5
  324. package/dist/graphql/schema.d.ts.map +0 -1
  325. package/dist/graphql/schema.js +0 -437
  326. package/dist/graphql/schema.js.map +0 -1
  327. package/dist/graphql/server.d.ts +0 -25
  328. package/dist/graphql/server.d.ts.map +0 -1
  329. package/dist/graphql/server.js +0 -119
  330. package/dist/graphql/server.js.map +0 -1
  331. package/dist/graphql/types.d.ts +0 -9
  332. package/dist/graphql/types.d.ts.map +0 -1
  333. package/dist/graphql/types.js +0 -2
  334. package/dist/graphql/types.js.map +0 -1
  335. package/dist/tools/actors.d.ts +0 -212
  336. package/dist/tools/actors.d.ts.map +0 -1
  337. package/dist/tools/actors.js +0 -456
  338. package/dist/tools/actors.js.map +0 -1
  339. package/dist/tools/animation.d.ts +0 -274
  340. package/dist/tools/animation.d.ts.map +0 -1
  341. package/dist/tools/animation.js +0 -773
  342. package/dist/tools/animation.js.map +0 -1
  343. package/dist/tools/assets.d.ts +0 -82
  344. package/dist/tools/assets.d.ts.map +0 -1
  345. package/dist/tools/assets.js +0 -383
  346. package/dist/tools/assets.js.map +0 -1
  347. package/dist/tools/blueprint.d.ts +0 -271
  348. package/dist/tools/blueprint.d.ts.map +0 -1
  349. package/dist/tools/blueprint.js +0 -828
  350. package/dist/tools/blueprint.js.map +0 -1
  351. package/dist/tools/environment.d.ts +0 -37
  352. package/dist/tools/environment.d.ts.map +0 -1
  353. package/dist/tools/environment.js +0 -338
  354. package/dist/tools/environment.js.map +0 -1
  355. package/dist/tools/foliage.d.ts +0 -140
  356. package/dist/tools/foliage.d.ts.map +0 -1
  357. package/dist/tools/foliage.js +0 -405
  358. package/dist/tools/foliage.js.map +0 -1
  359. package/dist/tools/landscape.d.ts +0 -120
  360. package/dist/tools/landscape.d.ts.map +0 -1
  361. package/dist/tools/landscape.js +0 -454
  362. package/dist/tools/landscape.js.map +0 -1
  363. package/dist/tools/lighting.d.ts +0 -240
  364. package/dist/tools/lighting.d.ts.map +0 -1
  365. package/dist/tools/lighting.js +0 -856
  366. package/dist/tools/lighting.js.map +0 -1
  367. package/dist/tools/logs.d.ts +0 -45
  368. package/dist/tools/logs.d.ts.map +0 -1
  369. package/dist/tools/logs.js +0 -235
  370. package/dist/tools/logs.js.map +0 -1
  371. package/dist/tools/niagara.d.ts +0 -277
  372. package/dist/tools/niagara.d.ts.map +0 -1
  373. package/dist/tools/niagara.js +0 -325
  374. package/dist/tools/niagara.js.map +0 -1
  375. package/dist/tools/physics.d.ts +0 -191
  376. package/dist/tools/physics.d.ts.map +0 -1
  377. package/dist/tools/physics.js +0 -492
  378. package/dist/tools/physics.js.map +0 -1
  379. package/dist/tools/sequence.d.ts +0 -139
  380. package/dist/tools/sequence.d.ts.map +0 -1
  381. package/dist/tools/sequence.js +0 -261
  382. package/dist/tools/sequence.js.map +0 -1
@@ -1,4 +1,5 @@
1
- import { executeAutomationRequest } from './common-handlers.js';
1
+ import { executeAutomationRequest, normalizePathFields } from './common-handlers.js';
2
+ import { sanitizePath } from '../../utils/path-security.js';
2
3
  import { normalizeArgs, extractString, extractOptionalString, extractOptionalNumber, extractOptionalBoolean, extractOptionalObject, } from './argument-helper.js';
3
4
  function parseMaterialPath(fullPath) {
4
5
  if (!fullPath)
@@ -12,6 +13,11 @@ function parseMaterialPath(fullPath) {
12
13
  }
13
14
  import { ResponseFactory } from '../../utils/response-factory.js';
14
15
  import { TOOL_ACTIONS } from '../../utils/action-constants.js';
16
+ import { MATERIAL_AUTHORING_ACTIONS } from '../consolidated-tool-definitions.js';
17
+ function normalizeAssetPath(p) {
18
+ const normalized = normalizePathFields({ path: p }, ['path']).path;
19
+ return sanitizePath(normalized);
20
+ }
15
21
  export async function handleMaterialAuthoringTools(action, args, tools) {
16
22
  try {
17
23
  switch (action) {
@@ -23,9 +29,9 @@ export async function handleMaterialAuthoringTools(action, args, tools) {
23
29
  let name;
24
30
  let path;
25
31
  if (materialPath) {
26
- const parsed = parseMaterialPath(materialPath);
27
- if (!parsed) {
28
- return ResponseFactory.error('Invalid materialPath format', 'INVALID_ARGUMENT');
32
+ const parsed = parseMaterialPath(normalizeAssetPath(materialPath));
33
+ if (!parsed || !parsed.name || !parsed.path) {
34
+ return ResponseFactory.error('manage_material_authoring.create_material: invalid materialPath format', 'INVALID_ARGUMENT');
29
35
  }
30
36
  name = parsed.name;
31
37
  path = parsed.path;
@@ -36,7 +42,7 @@ export async function handleMaterialAuthoringTools(action, args, tools) {
36
42
  { key: 'path', aliases: ['directory'], default: '/Game/Materials' },
37
43
  ]);
38
44
  name = extractString(params, 'name');
39
- path = extractOptionalString(params, 'path') ?? '/Game/Materials';
45
+ path = normalizeAssetPath(extractOptionalString(params, 'path') ?? '/Game/Materials');
40
46
  }
41
47
  const materialDomain = extractOptionalString(rawArgs, 'materialDomain') ??
42
48
  extractOptionalString(rawArgs, 'domain') ?? 'Surface';
@@ -61,7 +67,7 @@ export async function handleMaterialAuthoringTools(action, args, tools) {
61
67
  }
62
68
  case 'set_blend_mode': {
63
69
  const params = normalizeArgs(args, [
64
- { key: 'assetPath', aliases: ['materialPath'], required: true },
70
+ { key: 'assetPath', aliases: ['materialPath', 'instancePath'], required: true },
65
71
  { key: 'blendMode', required: true },
66
72
  { key: 'save', default: true },
67
73
  ]);
@@ -81,7 +87,7 @@ export async function handleMaterialAuthoringTools(action, args, tools) {
81
87
  }
82
88
  case 'set_shading_model': {
83
89
  const params = normalizeArgs(args, [
84
- { key: 'assetPath', aliases: ['materialPath'], required: true },
90
+ { key: 'assetPath', aliases: ['materialPath', 'instancePath'], required: true },
85
91
  { key: 'shadingModel', required: true },
86
92
  { key: 'save', default: true },
87
93
  ]);
@@ -349,6 +355,8 @@ export async function handleMaterialAuthoringTools(action, args, tools) {
349
355
  { key: 'code', aliases: ['hlsl'], required: true },
350
356
  { key: 'outputType', default: 'Float1' },
351
357
  { key: 'description' },
358
+ { key: 'inputs' },
359
+ { key: 'additionalOutputs' },
352
360
  { key: 'x', default: 0 },
353
361
  { key: 'y', default: 0 },
354
362
  ]);
@@ -356,9 +364,36 @@ export async function handleMaterialAuthoringTools(action, args, tools) {
356
364
  const code = extractString(params, 'code');
357
365
  const outputType = extractOptionalString(params, 'outputType') ?? 'Float1';
358
366
  const description = extractOptionalString(params, 'description');
367
+ const inputs = params.inputs;
368
+ const additionalOutputs = params.additionalOutputs;
369
+ if (inputs != null && !Array.isArray(inputs)) {
370
+ return ResponseFactory.error('manage_material_authoring.add_custom_expression: inputs must be an array', 'INVALID_INPUTS');
371
+ }
372
+ if (inputs != null && Array.isArray(inputs)) {
373
+ for (let i = 0; i < inputs.length; i++) {
374
+ const item = inputs[i];
375
+ if (!item || typeof item !== 'object' || typeof item.name !== 'string' || !item.name.trim()) {
376
+ return ResponseFactory.error(`manage_material_authoring.add_custom_expression: inputs[${i}] must be an object with a non-empty string "name"`, 'INVALID_INPUTS');
377
+ }
378
+ }
379
+ }
380
+ if (additionalOutputs != null && !Array.isArray(additionalOutputs)) {
381
+ return ResponseFactory.error('manage_material_authoring.add_custom_expression: additionalOutputs must be an array', 'INVALID_OUTPUTS');
382
+ }
383
+ if (additionalOutputs != null && Array.isArray(additionalOutputs)) {
384
+ for (let i = 0; i < additionalOutputs.length; i++) {
385
+ const item = additionalOutputs[i];
386
+ if (!item || typeof item !== 'object' || typeof item.name !== 'string' || !item.name.trim()) {
387
+ return ResponseFactory.error(`manage_material_authoring.add_custom_expression: additionalOutputs[${i}] must be an object with a non-empty string "name"`, 'INVALID_OUTPUTS');
388
+ }
389
+ if (item.type != null && typeof item.type !== 'string') {
390
+ return ResponseFactory.error(`manage_material_authoring.add_custom_expression: additionalOutputs[${i}].type must be a string if provided`, 'INVALID_OUTPUTS');
391
+ }
392
+ }
393
+ }
359
394
  const x = extractOptionalNumber(params, 'x') ?? 0;
360
395
  const y = extractOptionalNumber(params, 'y') ?? 0;
361
- const res = (await executeAutomationRequest(tools, TOOL_ACTIONS.MANAGE_MATERIAL_AUTHORING, {
396
+ const payload = {
362
397
  subAction: 'add_custom_expression',
363
398
  assetPath,
364
399
  code,
@@ -366,11 +401,25 @@ export async function handleMaterialAuthoringTools(action, args, tools) {
366
401
  description,
367
402
  x,
368
403
  y,
369
- }));
404
+ };
405
+ if (inputs != null) {
406
+ payload.inputs = inputs;
407
+ }
408
+ if (additionalOutputs != null) {
409
+ payload.additionalOutputs = additionalOutputs;
410
+ }
411
+ const res = (await executeAutomationRequest(tools, TOOL_ACTIONS.MANAGE_MATERIAL_AUTHORING, payload));
370
412
  if (res.success === false) {
371
413
  return ResponseFactory.error(res.error ?? 'Failed to add custom expression', res.errorCode);
372
414
  }
373
- return ResponseFactory.success(res, res.message ?? 'Custom HLSL expression added');
415
+ const response = ResponseFactory.success(res, res.message ?? 'Custom HLSL expression added');
416
+ const result = res.result;
417
+ if (result && typeof result === 'object' && !Array.isArray(result)) {
418
+ const nodeId = result.nodeId;
419
+ if (typeof nodeId === 'string')
420
+ response.nodeId = nodeId;
421
+ }
422
+ return response;
374
423
  }
375
424
  case 'connect_nodes':
376
425
  case 'connect_material_pins': {
@@ -378,22 +427,28 @@ export async function handleMaterialAuthoringTools(action, args, tools) {
378
427
  const assetPath = extractOptionalString(rawArgs, 'assetPath') ??
379
428
  extractOptionalString(rawArgs, 'materialPath') ?? '';
380
429
  const sourceNodeId = extractOptionalString(rawArgs, 'sourceNodeId') ??
381
- extractOptionalString(rawArgs, 'fromNode') ?? '';
382
- const targetNodeId = extractOptionalString(rawArgs, 'targetNodeId') ??
430
+ extractOptionalString(rawArgs, 'fromNode') ??
431
+ extractOptionalString(rawArgs, 'nodeId') ?? '';
432
+ let targetNodeId = extractOptionalString(rawArgs, 'targetNodeId') ??
383
433
  extractOptionalString(rawArgs, 'toNode') ?? '';
384
434
  const sourcePin = extractOptionalString(rawArgs, 'sourcePin') ??
385
435
  extractOptionalString(rawArgs, 'fromPin') ?? '';
386
436
  const targetPin = extractOptionalString(rawArgs, 'targetPin') ??
387
437
  extractOptionalString(rawArgs, 'toPin') ??
388
438
  extractOptionalString(rawArgs, 'inputName') ?? '';
439
+ if (!targetNodeId && targetPin) {
440
+ targetNodeId = 'Main';
441
+ }
442
+ else if (targetNodeId.toLowerCase() === 'root') {
443
+ targetNodeId = 'Main';
444
+ }
389
445
  const effectiveSourceId = sourceNodeId || sourcePin;
390
- const effectiveTargetId = targetNodeId || targetPin;
391
446
  const res = (await executeAutomationRequest(tools, TOOL_ACTIONS.MANAGE_MATERIAL_AUTHORING, {
392
447
  subAction: 'connect_nodes',
393
448
  assetPath,
394
449
  sourceNodeId: effectiveSourceId,
395
450
  sourcePin,
396
- targetNodeId: effectiveTargetId,
451
+ targetNodeId,
397
452
  inputName: targetPin,
398
453
  }));
399
454
  if (res.success === false) {
@@ -410,10 +465,10 @@ export async function handleMaterialAuthoringTools(action, args, tools) {
410
465
  extractOptionalString(rawArgs, 'pinName') ?? '';
411
466
  const pinName = extractOptionalString(rawArgs, 'pinName');
412
467
  if (!assetPath) {
413
- return ResponseFactory.error('Missing required argument: assetPath or materialPath', 'MISSING_ASSET_PATH');
468
+ return ResponseFactory.error('manage_material_authoring.disconnect_nodes: missing required argument assetPath', 'MISSING_ASSET_PATH');
414
469
  }
415
470
  if (!nodeId) {
416
- return ResponseFactory.error('Missing required argument: nodeId (or pinName)', 'MISSING_NODE_ID');
471
+ return ResponseFactory.error('manage_material_authoring.disconnect_nodes: missing required argument nodeId (or pinName)', 'MISSING_NODE_ID');
417
472
  }
418
473
  const res = (await executeAutomationRequest(tools, TOOL_ACTIONS.MANAGE_MATERIAL_AUTHORING, {
419
474
  subAction: 'disconnect_nodes',
@@ -461,7 +516,7 @@ export async function handleMaterialAuthoringTools(action, args, tools) {
461
516
  { key: 'x', default: 0 },
462
517
  { key: 'y', default: 0 },
463
518
  ]);
464
- const assetPath = extractString(params, 'assetPath');
519
+ const assetPath = normalizeAssetPath(extractString(params, 'assetPath'));
465
520
  const inputName = extractString(params, 'inputName');
466
521
  const inputType = extractOptionalString(params, 'inputType') ?? 'Float3';
467
522
  const x = extractOptionalNumber(params, 'x') ?? 0;
@@ -486,8 +541,8 @@ export async function handleMaterialAuthoringTools(action, args, tools) {
486
541
  { key: 'x', default: 0 },
487
542
  { key: 'y', default: 0 },
488
543
  ]);
489
- const assetPath = extractString(params, 'assetPath');
490
- const functionPath = extractString(params, 'functionPath');
544
+ const assetPath = normalizeAssetPath(extractString(params, 'assetPath'));
545
+ const functionPath = normalizeAssetPath(extractString(params, 'functionPath'));
491
546
  const x = extractOptionalNumber(params, 'x') ?? 0;
492
547
  const y = extractOptionalNumber(params, 'y') ?? 0;
493
548
  const res = (await executeAutomationRequest(tools, TOOL_ACTIONS.MANAGE_MATERIAL_AUTHORING, {
@@ -515,9 +570,9 @@ export async function handleMaterialAuthoringTools(action, args, tools) {
515
570
  let path;
516
571
  let parentMaterial;
517
572
  if (instancePath) {
518
- const parsed = parseMaterialPath(instancePath);
519
- if (!parsed) {
520
- return ResponseFactory.error('Invalid instancePath format', 'INVALID_ARGUMENT');
573
+ const parsed = parseMaterialPath(normalizeAssetPath(instancePath));
574
+ if (!parsed || !parsed.name || !parsed.path) {
575
+ return ResponseFactory.error('manage_material_authoring.create_material_instance: invalid instancePath format', 'INVALID_ARGUMENT');
521
576
  }
522
577
  name = parsed.name;
523
578
  path = parsed.path;
@@ -530,11 +585,11 @@ export async function handleMaterialAuthoringTools(action, args, tools) {
530
585
  { key: 'parentMaterial', aliases: ['parent'], required: true },
531
586
  ]);
532
587
  name = extractString(params, 'name');
533
- path = extractOptionalString(params, 'path') ?? '/Game/Materials';
588
+ path = normalizeAssetPath(extractOptionalString(params, 'path') ?? '/Game/Materials');
534
589
  parentMaterial = extractString(params, 'parentMaterial');
535
590
  }
536
591
  if (!parentMaterial) {
537
- return ResponseFactory.error('parentMaterialPath or parent is required', 'MISSING_PARENT');
592
+ return ResponseFactory.error('manage_material_authoring.create_material_instance: parentMaterialPath or parent is required', 'MISSING_PARENT');
538
593
  }
539
594
  const save = extractOptionalBoolean(rawArgs, 'save') ?? true;
540
595
  const res = (await executeAutomationRequest(tools, TOOL_ACTIONS.MANAGE_MATERIAL_AUTHORING, {
@@ -697,31 +752,310 @@ export async function handleMaterialAuthoringTools(action, args, tools) {
697
752
  }
698
753
  case 'get_material_info': {
699
754
  const params = normalizeArgs(args, [
700
- { key: 'assetPath', aliases: ['materialPath'], required: true },
755
+ { key: 'assetPath', aliases: ['materialPath', 'functionPath'], required: true },
756
+ { key: 'filter' },
701
757
  ]);
702
- const assetPath = extractString(params, 'assetPath');
703
- const res = (await executeAutomationRequest(tools, TOOL_ACTIONS.MANAGE_MATERIAL_AUTHORING, {
758
+ const assetPath = normalizeAssetPath(extractString(params, 'assetPath'));
759
+ const filter = extractOptionalString(params, 'filter');
760
+ const payload = {
704
761
  subAction: 'get_material_info',
705
762
  assetPath,
706
- }));
763
+ };
764
+ if (filter)
765
+ payload.filter = filter;
766
+ const res = (await executeAutomationRequest(tools, TOOL_ACTIONS.MANAGE_MATERIAL_AUTHORING, payload));
707
767
  if (res.success === false) {
708
768
  return ResponseFactory.error(res.error ?? 'Failed to get material info', res.errorCode);
709
769
  }
710
770
  return ResponseFactory.success(res, res.message ?? 'Material info retrieved');
711
771
  }
772
+ case 'find_node': {
773
+ const params = normalizeArgs(args, [
774
+ { key: 'assetPath', aliases: ['materialPath', 'functionPath'], required: true },
775
+ { key: 'nodeType' },
776
+ { key: 'name' },
777
+ ]);
778
+ const assetPath = normalizeAssetPath(extractString(params, 'assetPath'));
779
+ const nodeType = extractOptionalString(params, 'nodeType');
780
+ const name = extractOptionalString(params, 'name');
781
+ if (!nodeType && !name) {
782
+ return ResponseFactory.error('manage_material_authoring.find_node: requires at least one of nodeType or name', 'MISSING_SEARCH_CRITERIA');
783
+ }
784
+ const payload = {
785
+ subAction: 'find_node',
786
+ assetPath,
787
+ };
788
+ if (nodeType)
789
+ payload.nodeType = nodeType;
790
+ if (name)
791
+ payload.name = name;
792
+ const res = (await executeAutomationRequest(tools, TOOL_ACTIONS.MANAGE_MATERIAL_AUTHORING, payload));
793
+ if (res.success === false) {
794
+ return ResponseFactory.error(res.error ?? 'Failed to find node', res.errorCode);
795
+ }
796
+ return ResponseFactory.success(res, res.message ?? 'Node search complete');
797
+ }
798
+ case 'get_node_connections': {
799
+ const params = normalizeArgs(args, [
800
+ { key: 'assetPath', aliases: ['materialPath', 'functionPath'], required: true },
801
+ { key: 'nodeId', required: true },
802
+ { key: 'direction' },
803
+ { key: 'depth', default: 1 },
804
+ { key: 'upstream' },
805
+ { key: 'downstream' },
806
+ ]);
807
+ const assetPath = normalizeAssetPath(extractString(params, 'assetPath'));
808
+ const nodeId = extractString(params, 'nodeId');
809
+ const payload = {
810
+ subAction: 'get_node_connections',
811
+ assetPath,
812
+ nodeId,
813
+ };
814
+ const direction = extractOptionalString(params, 'direction');
815
+ const depth = extractOptionalNumber(params, 'depth');
816
+ const upstream = extractOptionalBoolean(params, 'upstream');
817
+ const downstream = extractOptionalBoolean(params, 'downstream');
818
+ if (direction)
819
+ payload.direction = direction;
820
+ if (depth !== undefined && depth !== null)
821
+ payload.depth = depth;
822
+ if (upstream !== undefined && upstream !== null)
823
+ payload.upstream = upstream;
824
+ if (downstream !== undefined && downstream !== null)
825
+ payload.downstream = downstream;
826
+ const res = (await executeAutomationRequest(tools, TOOL_ACTIONS.MANAGE_MATERIAL_AUTHORING, payload));
827
+ if (res.success === false) {
828
+ return ResponseFactory.error(res.error ?? 'Failed to get node connections', res.errorCode);
829
+ }
830
+ return ResponseFactory.success(res, res.message ?? 'Node connections retrieved');
831
+ }
832
+ case 'get_node_properties': {
833
+ const params = normalizeArgs(args, [
834
+ { key: 'assetPath', aliases: ['materialPath', 'functionPath'], required: true },
835
+ { key: 'nodeId', required: true },
836
+ ]);
837
+ const assetPath = normalizeAssetPath(extractString(params, 'assetPath'));
838
+ const nodeId = extractString(params, 'nodeId');
839
+ const res = (await executeAutomationRequest(tools, TOOL_ACTIONS.MANAGE_MATERIAL_AUTHORING, {
840
+ subAction: 'get_node_properties',
841
+ assetPath,
842
+ nodeId,
843
+ }));
844
+ if (res.success === false) {
845
+ return ResponseFactory.error(res.error ?? 'Failed to get node properties', res.errorCode);
846
+ }
847
+ return ResponseFactory.success(res, res.message ?? 'Node properties retrieved');
848
+ }
849
+ case 'set_static_switch_parameter_value': {
850
+ const params = normalizeArgs(args, [
851
+ { key: 'assetPath', aliases: ['materialPath', 'instancePath'], required: true },
852
+ { key: 'parameterName', required: true },
853
+ { key: 'value', required: true },
854
+ { key: 'save', default: true },
855
+ ]);
856
+ const assetPath = normalizeAssetPath(extractString(params, 'assetPath'));
857
+ const parameterName = extractString(params, 'parameterName');
858
+ const value = extractOptionalBoolean(params, 'value');
859
+ if (value === undefined) {
860
+ return ResponseFactory.error('manage_material_authoring.set_static_switch_parameter_value: value must be a boolean', 'INVALID_VALUE');
861
+ }
862
+ const save = extractOptionalBoolean(params, 'save') ?? true;
863
+ const res = (await executeAutomationRequest(tools, TOOL_ACTIONS.MANAGE_MATERIAL_AUTHORING, {
864
+ subAction: 'set_static_switch_parameter_value',
865
+ assetPath,
866
+ parameterName,
867
+ value,
868
+ save,
869
+ }));
870
+ if (res.success === false) {
871
+ return ResponseFactory.error(res.error ?? 'Failed to set static switch parameter', res.errorCode);
872
+ }
873
+ return ResponseFactory.success(res, res.message ?? 'Static switch parameter set');
874
+ }
875
+ case 'delete_node': {
876
+ const rawArgs = args;
877
+ const assetPath = normalizeAssetPath(extractOptionalString(rawArgs, 'assetPath') ??
878
+ extractOptionalString(rawArgs, 'materialPath') ??
879
+ extractOptionalString(rawArgs, 'functionPath') ?? '');
880
+ if (!assetPath) {
881
+ return ResponseFactory.error('manage_material_authoring.delete_node: missing required argument assetPath', 'MISSING_ASSET_PATH');
882
+ }
883
+ const nodeId = extractOptionalString(rawArgs, 'nodeId');
884
+ const nodeIdsRaw = Array.isArray(rawArgs.nodeIds) ? rawArgs.nodeIds : undefined;
885
+ const nodeIds = nodeIdsRaw?.filter((id) => typeof id === 'string' && id.trim().length > 0);
886
+ if (nodeIdsRaw && (!nodeIds || nodeIds.length !== nodeIdsRaw.length)) {
887
+ return ResponseFactory.error('manage_material_authoring.delete_node: nodeIds must be an array of non-empty strings', 'INVALID_NODE_IDS');
888
+ }
889
+ if (!nodeId && (!nodeIds || nodeIds.length === 0)) {
890
+ return ResponseFactory.error('manage_material_authoring.delete_node: provide nodeId or a non-empty nodeIds array', 'MISSING_NODE_ID');
891
+ }
892
+ const payload = {
893
+ subAction: 'delete_node',
894
+ assetPath,
895
+ };
896
+ if (nodeId)
897
+ payload.nodeId = nodeId;
898
+ if (nodeIds && nodeIds.length > 0)
899
+ payload.nodeIds = nodeIds;
900
+ const res = (await executeAutomationRequest(tools, TOOL_ACTIONS.MANAGE_MATERIAL_AUTHORING, payload));
901
+ if (res.success === false) {
902
+ return ResponseFactory.error(res.error ?? 'Failed to delete node(s)', res.errorCode);
903
+ }
904
+ return ResponseFactory.success(res, res.message ?? 'Node(s) deleted');
905
+ }
906
+ case 'update_custom_expression': {
907
+ const params = normalizeArgs(args, [
908
+ { key: 'assetPath', aliases: ['materialPath', 'functionPath'], required: true },
909
+ { key: 'nodeId', required: true },
910
+ { key: 'code' },
911
+ { key: 'description' },
912
+ { key: 'outputType' },
913
+ { key: 'inputs' },
914
+ { key: 'additionalOutputs' },
915
+ ]);
916
+ const assetPath = normalizeAssetPath(extractString(params, 'assetPath'));
917
+ const nodeId = extractString(params, 'nodeId');
918
+ const payload = {
919
+ subAction: 'update_custom_expression',
920
+ assetPath,
921
+ nodeId,
922
+ };
923
+ const code = extractOptionalString(params, 'code');
924
+ const description = extractOptionalString(params, 'description');
925
+ const outputType = extractOptionalString(params, 'outputType');
926
+ const inputs = params.inputs;
927
+ const additionalOutputs = params.additionalOutputs;
928
+ if (inputs != null && !Array.isArray(inputs)) {
929
+ return ResponseFactory.error('manage_material_authoring.update_custom_expression: inputs must be an array', 'INVALID_INPUTS');
930
+ }
931
+ if (inputs != null && Array.isArray(inputs)) {
932
+ for (let i = 0; i < inputs.length; i++) {
933
+ const item = inputs[i];
934
+ if (!item || typeof item !== 'object' || typeof item.name !== 'string' || !item.name.trim()) {
935
+ return ResponseFactory.error(`manage_material_authoring.update_custom_expression: inputs[${i}] must be an object with a non-empty string "name"`, 'INVALID_INPUTS');
936
+ }
937
+ }
938
+ }
939
+ if (additionalOutputs != null && !Array.isArray(additionalOutputs)) {
940
+ return ResponseFactory.error('manage_material_authoring.update_custom_expression: additionalOutputs must be an array', 'INVALID_OUTPUTS');
941
+ }
942
+ if (additionalOutputs != null && Array.isArray(additionalOutputs)) {
943
+ for (let i = 0; i < additionalOutputs.length; i++) {
944
+ const item = additionalOutputs[i];
945
+ if (!item || typeof item !== 'object' || typeof item.name !== 'string' || !item.name.trim()) {
946
+ return ResponseFactory.error(`manage_material_authoring.update_custom_expression: additionalOutputs[${i}] must be an object with a non-empty string "name"`, 'INVALID_OUTPUTS');
947
+ }
948
+ if (item.type != null && typeof item.type !== 'string') {
949
+ return ResponseFactory.error(`manage_material_authoring.update_custom_expression: additionalOutputs[${i}].type must be a string if provided`, 'INVALID_OUTPUTS');
950
+ }
951
+ }
952
+ }
953
+ const hasCode = code !== undefined && code !== null;
954
+ const hasDescription = description !== undefined && description !== null;
955
+ const hasOutputType = outputType !== undefined && outputType !== null;
956
+ const hasInputs = inputs !== undefined && inputs !== null;
957
+ const hasAdditionalOutputs = additionalOutputs !== undefined && additionalOutputs !== null;
958
+ if (!hasCode && !hasDescription && !hasOutputType && !hasInputs && !hasAdditionalOutputs) {
959
+ return ResponseFactory.error('manage_material_authoring.update_custom_expression: provide at least one field to update', 'MISSING_UPDATE_FIELDS');
960
+ }
961
+ if (hasCode)
962
+ payload.code = code;
963
+ if (hasDescription)
964
+ payload.description = description;
965
+ if (hasOutputType)
966
+ payload.outputType = outputType;
967
+ if (hasInputs)
968
+ payload.inputs = inputs;
969
+ if (hasAdditionalOutputs)
970
+ payload.additionalOutputs = additionalOutputs;
971
+ const res = (await executeAutomationRequest(tools, TOOL_ACTIONS.MANAGE_MATERIAL_AUTHORING, payload));
972
+ if (res.success === false) {
973
+ return ResponseFactory.error(res.error ?? 'Failed to update custom expression', res.errorCode);
974
+ }
975
+ return ResponseFactory.success(res, res.message ?? 'Custom expression updated');
976
+ }
977
+ case 'get_node_chain': {
978
+ const params = normalizeArgs(args, [
979
+ { key: 'assetPath', aliases: ['materialPath', 'functionPath'], required: true },
980
+ { key: 'startNodeId', required: true },
981
+ { key: 'endNodeId' },
982
+ { key: 'endPin' },
983
+ ]);
984
+ const assetPath = normalizeAssetPath(extractString(params, 'assetPath'));
985
+ const startNodeId = extractString(params, 'startNodeId');
986
+ const endNodeId = extractOptionalString(params, 'endNodeId');
987
+ const endPin = extractOptionalString(params, 'endPin');
988
+ if (!endNodeId && !endPin) {
989
+ return ResponseFactory.error('manage_material_authoring.get_node_chain: provide endNodeId or endPin', 'INVALID_ARGUMENT');
990
+ }
991
+ const payload = {
992
+ subAction: 'get_node_chain',
993
+ assetPath,
994
+ startNodeId,
995
+ };
996
+ if (endNodeId)
997
+ payload.endNodeId = endNodeId;
998
+ if (endPin)
999
+ payload.endPin = endPin;
1000
+ const res = (await executeAutomationRequest(tools, TOOL_ACTIONS.MANAGE_MATERIAL_AUTHORING, payload));
1001
+ if (res.success === false) {
1002
+ return ResponseFactory.error(res.error ?? 'Failed to trace node chain', res.errorCode);
1003
+ }
1004
+ return ResponseFactory.success(res, res.message ?? 'Node chain traced');
1005
+ }
1006
+ case 'get_connected_subgraph': {
1007
+ const rawArgs = args;
1008
+ const assetPath = normalizeAssetPath(extractOptionalString(rawArgs, 'assetPath') ??
1009
+ extractOptionalString(rawArgs, 'materialPath') ??
1010
+ extractOptionalString(rawArgs, 'functionPath') ?? '');
1011
+ if (!assetPath) {
1012
+ return ResponseFactory.error('manage_material_authoring.get_connected_subgraph: missing required argument assetPath', 'MISSING_ASSET_PATH');
1013
+ }
1014
+ const nodeId = extractOptionalString(rawArgs, 'nodeId');
1015
+ const orphansOnly = extractOptionalBoolean(rawArgs, 'orphansOnly') ?? false;
1016
+ if (!nodeId && !orphansOnly) {
1017
+ return ResponseFactory.error('manage_material_authoring.get_connected_subgraph: provide nodeId or set orphansOnly=true', 'MISSING_NODE_ID');
1018
+ }
1019
+ const payload = {
1020
+ subAction: 'get_connected_subgraph',
1021
+ assetPath,
1022
+ orphansOnly,
1023
+ };
1024
+ if (nodeId)
1025
+ payload.nodeId = nodeId;
1026
+ const res = (await executeAutomationRequest(tools, TOOL_ACTIONS.MANAGE_MATERIAL_AUTHORING, payload));
1027
+ if (res.success === false) {
1028
+ return ResponseFactory.error(res.error ?? 'Failed to get connected subgraph', res.errorCode);
1029
+ }
1030
+ return ResponseFactory.success(res, res.message ?? 'Connected subgraph retrieved');
1031
+ }
1032
+ case 'get_material_function_info': {
1033
+ const params = normalizeArgs(args, [
1034
+ { key: 'assetPath', aliases: ['functionPath', 'materialFunctionPath'], required: true },
1035
+ ]);
1036
+ const assetPath = normalizeAssetPath(extractString(params, 'assetPath'));
1037
+ const res = (await executeAutomationRequest(tools, TOOL_ACTIONS.MANAGE_MATERIAL_AUTHORING, {
1038
+ subAction: 'get_material_function_info',
1039
+ assetPath,
1040
+ }));
1041
+ if (res.success === false) {
1042
+ return ResponseFactory.error(res.error ?? 'Failed to get material function info', res.errorCode);
1043
+ }
1044
+ return ResponseFactory.success(res, res.message ?? 'Material function info retrieved');
1045
+ }
712
1046
  case 'add_material_node': {
713
1047
  const rawArgs = args;
714
1048
  const assetPath = extractOptionalString(rawArgs, 'assetPath') ??
715
1049
  extractOptionalString(rawArgs, 'materialPath') ?? '';
716
1050
  const nodeType = extractOptionalString(rawArgs, 'nodeType') ??
717
1051
  extractOptionalString(rawArgs, 'type') ?? '';
718
- const x = extractOptionalNumber(rawArgs, 'x') ?? 0;
719
- const y = extractOptionalNumber(rawArgs, 'y') ?? 0;
1052
+ const x = extractOptionalNumber(rawArgs, 'x') ?? extractOptionalNumber(rawArgs, 'posX') ?? 0;
1053
+ const y = extractOptionalNumber(rawArgs, 'y') ?? extractOptionalNumber(rawArgs, 'posY') ?? 0;
720
1054
  if (!assetPath) {
721
- return ResponseFactory.error('Missing required argument: assetPath or materialPath', 'MISSING_ASSET_PATH');
1055
+ return ResponseFactory.error('manage_material_authoring.add_material_node: missing required argument assetPath', 'MISSING_ASSET_PATH');
722
1056
  }
723
1057
  if (!nodeType) {
724
- return ResponseFactory.error('Missing required argument: nodeType', 'MISSING_NODE_TYPE');
1058
+ return ResponseFactory.error('manage_material_authoring.add_material_node: missing required argument nodeType', 'MISSING_NODE_TYPE');
725
1059
  }
726
1060
  const res = (await executeAutomationRequest(tools, TOOL_ACTIONS.MANAGE_MATERIAL_AUTHORING, {
727
1061
  subAction: 'add_material_node',
@@ -733,7 +1067,14 @@ export async function handleMaterialAuthoringTools(action, args, tools) {
733
1067
  if (res.success === false) {
734
1068
  return ResponseFactory.error(res.error ?? 'Failed to add material node', res.errorCode);
735
1069
  }
736
- return ResponseFactory.success(res, res.message ?? `Material node '${nodeType}' added`);
1070
+ const response = ResponseFactory.success(res, res.message ?? `Material node '${nodeType}' added`);
1071
+ const result = res.result;
1072
+ if (result && typeof result === 'object' && !Array.isArray(result)) {
1073
+ const nodeId = result.nodeId;
1074
+ if (typeof nodeId === 'string')
1075
+ response.nodeId = nodeId;
1076
+ }
1077
+ return response;
737
1078
  }
738
1079
  case 'rebuild_material':
739
1080
  return handleMaterialAuthoringTools('compile_material', args, tools);
@@ -747,13 +1088,13 @@ export async function handleMaterialAuthoringTools(action, args, tools) {
747
1088
  const save = extractOptionalBoolean(rawArgs, 'save') ?? true;
748
1089
  const value = rawArgs.value;
749
1090
  if (!assetPath) {
750
- return ResponseFactory.error('Missing required argument: assetPath (or instancePath, materialPath)', 'MISSING_ASSET_PATH');
1091
+ return ResponseFactory.error('manage_material_authoring.set_material_parameter: missing required argument assetPath', 'MISSING_ASSET_PATH');
751
1092
  }
752
1093
  if (!parameterName) {
753
- return ResponseFactory.error('Missing required argument: parameterName', 'MISSING_PARAMETER_NAME');
1094
+ return ResponseFactory.error('manage_material_authoring.set_material_parameter: missing required argument parameterName', 'MISSING_PARAMETER_NAME');
754
1095
  }
755
1096
  if (value === undefined) {
756
- return ResponseFactory.error('Missing required argument: value', 'MISSING_VALUE');
1097
+ return ResponseFactory.error('manage_material_authoring.set_material_parameter: missing required argument value', 'MISSING_VALUE');
757
1098
  }
758
1099
  const res = (await executeAutomationRequest(tools, TOOL_ACTIONS.MANAGE_MATERIAL_AUTHORING, {
759
1100
  subAction: 'set_material_parameter',
@@ -774,10 +1115,10 @@ export async function handleMaterialAuthoringTools(action, args, tools) {
774
1115
  extractOptionalString(rawArgs, 'materialPath') ?? '';
775
1116
  const nodeId = extractOptionalString(rawArgs, 'nodeId') ?? '';
776
1117
  if (!assetPath) {
777
- return ResponseFactory.error('Missing required argument: assetPath or materialPath', 'MISSING_ASSET_PATH');
1118
+ return ResponseFactory.error('manage_material_authoring.get_material_node_details: missing required argument assetPath', 'MISSING_ASSET_PATH');
778
1119
  }
779
1120
  if (!nodeId) {
780
- return ResponseFactory.error('Missing required argument: nodeId', 'MISSING_NODE_ID');
1121
+ return ResponseFactory.error('manage_material_authoring.get_material_node_details: missing required argument nodeId', 'MISSING_NODE_ID');
781
1122
  }
782
1123
  const res = (await executeAutomationRequest(tools, TOOL_ACTIONS.MANAGE_MATERIAL_AUTHORING, {
783
1124
  subAction: 'get_material_node_details',
@@ -795,10 +1136,10 @@ export async function handleMaterialAuthoringTools(action, args, tools) {
795
1136
  extractOptionalString(rawArgs, 'materialPath') ?? '';
796
1137
  const nodeId = extractOptionalString(rawArgs, 'nodeId') ?? '';
797
1138
  if (!assetPath) {
798
- return ResponseFactory.error('Missing required argument: assetPath or materialPath', 'MISSING_ASSET_PATH');
1139
+ return ResponseFactory.error('manage_material_authoring.remove_material_node: missing required argument assetPath', 'MISSING_ASSET_PATH');
799
1140
  }
800
1141
  if (!nodeId) {
801
- return ResponseFactory.error('Missing required argument: nodeId', 'MISSING_NODE_ID');
1142
+ return ResponseFactory.error('manage_material_authoring.remove_material_node: missing required argument nodeId', 'MISSING_NODE_ID');
802
1143
  }
803
1144
  const res = (await executeAutomationRequest(tools, TOOL_ACTIONS.MANAGE_MATERIAL_AUTHORING, {
804
1145
  subAction: 'remove_material_node',
@@ -851,7 +1192,7 @@ export async function handleMaterialAuthoringTools(action, args, tools) {
851
1192
  return ResponseFactory.success(res, res.message ?? `Cast shadows set to ${castShadows}`);
852
1193
  }
853
1194
  default:
854
- return ResponseFactory.error(`Unknown material authoring action: ${action}. Available actions: create_material, set_blend_mode, set_shading_model, add_texture_sample, add_scalar_parameter, add_vector_parameter, add_math_node, connect_nodes, create_material_instance, set_scalar_parameter_value, set_vector_parameter_value, set_texture_parameter_value, compile_material, get_material_info`, 'UNKNOWN_ACTION');
1195
+ return ResponseFactory.error(`Unknown material authoring action: ${action}. Available actions: ${MATERIAL_AUTHORING_ACTIONS.join(', ')}`, 'UNKNOWN_ACTION');
855
1196
  }
856
1197
  }
857
1198
  catch (error) {