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.
- package/CHANGELOG.md +247 -4
- package/README.md +140 -85
- package/dist/automation/bridge.d.ts +8 -0
- package/dist/automation/bridge.d.ts.map +1 -1
- package/dist/automation/bridge.js +94 -14
- package/dist/automation/bridge.js.map +1 -1
- package/dist/automation/connection-manager.d.ts.map +1 -1
- package/dist/automation/connection-manager.js +13 -5
- package/dist/automation/connection-manager.js.map +1 -1
- package/dist/automation/handshake.d.ts.map +1 -1
- package/dist/automation/handshake.js +40 -27
- package/dist/automation/handshake.js.map +1 -1
- package/dist/automation/index.d.ts +1 -1
- package/dist/automation/index.d.ts.map +1 -1
- package/dist/automation/index.js +0 -1
- package/dist/automation/index.js.map +1 -1
- package/dist/automation/message-handler.d.ts.map +1 -1
- package/dist/automation/message-handler.js +13 -9
- package/dist/automation/message-handler.js.map +1 -1
- package/dist/automation/message-schema.d.ts.map +1 -1
- package/dist/automation/message-schema.js +19 -18
- package/dist/automation/message-schema.js.map +1 -1
- package/dist/automation/request-tracker.d.ts +1 -0
- package/dist/automation/request-tracker.d.ts.map +1 -1
- package/dist/automation/request-tracker.js +30 -31
- package/dist/automation/request-tracker.js.map +1 -1
- package/dist/automation/types.d.ts +38 -32
- package/dist/automation/types.d.ts.map +1 -1
- package/dist/cli.js +14 -16
- package/dist/cli.js.map +1 -1
- package/dist/config/class-aliases.d.ts.map +1 -1
- package/dist/config/class-aliases.js +10 -2
- package/dist/config/class-aliases.js.map +1 -1
- package/dist/config.d.ts +9 -8
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +58 -32
- package/dist/config.js.map +1 -1
- package/dist/handlers/resource-handlers.d.ts +15 -2
- package/dist/handlers/resource-handlers.d.ts.map +1 -1
- package/dist/handlers/resource-handlers.js +46 -63
- package/dist/handlers/resource-handlers.js.map +1 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +42 -48
- package/dist/index.js.map +1 -1
- package/dist/resources/assets.d.ts.map +1 -1
- package/dist/resources/assets.js +34 -9
- package/dist/resources/assets.js.map +1 -1
- package/dist/resources/levels.d.ts +3 -0
- package/dist/resources/levels.d.ts.map +1 -1
- package/dist/resources/levels.js +33 -17
- package/dist/resources/levels.js.map +1 -1
- package/dist/server/resource-registry.d.ts +15 -2
- package/dist/server/resource-registry.d.ts.map +1 -1
- package/dist/server/resource-registry.js +9 -8
- package/dist/server/resource-registry.js.map +1 -1
- package/dist/server/tool-registry.d.ts +0 -1
- package/dist/server/tool-registry.d.ts.map +1 -1
- package/dist/server/tool-registry.js +91 -101
- package/dist/server/tool-registry.js.map +1 -1
- package/dist/server-setup.d.ts +5 -2
- package/dist/server-setup.d.ts.map +1 -1
- package/dist/server-setup.js +15 -19
- package/dist/server-setup.js.map +1 -1
- package/dist/services/health-monitor.d.ts +3 -0
- package/dist/services/health-monitor.d.ts.map +1 -1
- package/dist/services/health-monitor.js +30 -11
- package/dist/services/health-monitor.js.map +1 -1
- package/dist/services/metrics-server.d.ts +1 -1
- package/dist/services/metrics-server.d.ts.map +1 -1
- package/dist/services/metrics-server.js +65 -3
- package/dist/services/metrics-server.js.map +1 -1
- package/dist/tools/base-tool.d.ts.map +1 -1
- package/dist/tools/base-tool.js +14 -16
- package/dist/tools/base-tool.js.map +1 -1
- package/dist/tools/consolidated-tool-definitions.d.ts +16 -1
- package/dist/tools/consolidated-tool-definitions.d.ts.map +1 -1
- package/dist/tools/consolidated-tool-definitions.js +1479 -2538
- package/dist/tools/consolidated-tool-definitions.js.map +1 -1
- package/dist/tools/consolidated-tool-handlers.d.ts.map +1 -1
- package/dist/tools/consolidated-tool-handlers.js +195 -217
- package/dist/tools/consolidated-tool-handlers.js.map +1 -1
- package/dist/tools/dynamic-handler-registry.d.ts +1 -0
- package/dist/tools/dynamic-handler-registry.d.ts.map +1 -1
- package/dist/tools/dynamic-handler-registry.js +15 -7
- package/dist/tools/dynamic-handler-registry.js.map +1 -1
- package/dist/tools/dynamic-tool-manager.d.ts +1 -1
- package/dist/tools/dynamic-tool-manager.d.ts.map +1 -1
- package/dist/tools/dynamic-tool-manager.js +30 -18
- package/dist/tools/dynamic-tool-manager.js.map +1 -1
- package/dist/tools/editor.d.ts +2 -2
- package/dist/tools/editor.d.ts.map +1 -1
- package/dist/tools/editor.js +4 -4
- package/dist/tools/editor.js.map +1 -1
- package/dist/tools/handlers/actor-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/actor-handlers.js +66 -7
- package/dist/tools/handlers/actor-handlers.js.map +1 -1
- package/dist/tools/handlers/ai-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/ai-handlers.js +24 -13
- package/dist/tools/handlers/ai-handlers.js.map +1 -1
- package/dist/tools/handlers/animation-authoring-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/animation-authoring-handlers.js +285 -218
- package/dist/tools/handlers/animation-authoring-handlers.js.map +1 -1
- package/dist/tools/handlers/animation-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/animation-handlers.js +69 -21
- package/dist/tools/handlers/animation-handlers.js.map +1 -1
- package/dist/tools/handlers/asset-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/asset-handlers.js +75 -16
- package/dist/tools/handlers/asset-handlers.js.map +1 -1
- package/dist/tools/handlers/audio-authoring-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/audio-authoring-handlers.js +102 -9
- package/dist/tools/handlers/audio-authoring-handlers.js.map +1 -1
- package/dist/tools/handlers/audio-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/audio-handlers.js +48 -13
- package/dist/tools/handlers/audio-handlers.js.map +1 -1
- package/dist/tools/handlers/blueprint-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/blueprint-handlers.js +28 -48
- package/dist/tools/handlers/blueprint-handlers.js.map +1 -1
- package/dist/tools/handlers/character-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/character-handlers.js +13 -12
- package/dist/tools/handlers/character-handlers.js.map +1 -1
- package/dist/tools/handlers/combat-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/combat-handlers.js +12 -12
- package/dist/tools/handlers/combat-handlers.js.map +1 -1
- package/dist/tools/handlers/common-handlers.d.ts +14 -0
- package/dist/tools/handlers/common-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/common-handlers.js +117 -9
- package/dist/tools/handlers/common-handlers.js.map +1 -1
- package/dist/tools/handlers/editor-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/editor-handlers.js +139 -67
- package/dist/tools/handlers/editor-handlers.js.map +1 -1
- package/dist/tools/handlers/effect-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/effect-handlers.js +324 -36
- package/dist/tools/handlers/effect-handlers.js.map +1 -1
- package/dist/tools/handlers/environment-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/environment-handlers.js +186 -21
- package/dist/tools/handlers/environment-handlers.js.map +1 -1
- package/dist/tools/handlers/game-framework-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/game-framework-handlers.js +10 -12
- package/dist/tools/handlers/game-framework-handlers.js.map +1 -1
- package/dist/tools/handlers/gas-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/gas-handlers.js +136 -20
- package/dist/tools/handlers/gas-handlers.js.map +1 -1
- package/dist/tools/handlers/geometry-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/geometry-handlers.js +130 -7
- package/dist/tools/handlers/geometry-handlers.js.map +1 -1
- package/dist/tools/handlers/graph-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/graph-handlers.js +46 -11
- package/dist/tools/handlers/graph-handlers.js.map +1 -1
- package/dist/tools/handlers/input-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/input-handlers.js +33 -75
- package/dist/tools/handlers/input-handlers.js.map +1 -1
- package/dist/tools/handlers/inspect-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/inspect-handlers.js +136 -39
- package/dist/tools/handlers/inspect-handlers.js.map +1 -1
- package/dist/tools/handlers/interaction-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/interaction-handlers.js +14 -12
- package/dist/tools/handlers/interaction-handlers.js.map +1 -1
- package/dist/tools/handlers/inventory-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/inventory-handlers.js +19 -12
- package/dist/tools/handlers/inventory-handlers.js.map +1 -1
- package/dist/tools/handlers/level-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/level-handlers.js +166 -149
- package/dist/tools/handlers/level-handlers.js.map +1 -1
- package/dist/tools/handlers/level-structure-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/level-structure-handlers.js +18 -34
- package/dist/tools/handlers/level-structure-handlers.js.map +1 -1
- package/dist/tools/handlers/manage-tools-handlers.js +3 -3
- package/dist/tools/handlers/manage-tools-handlers.js.map +1 -1
- package/dist/tools/handlers/material-authoring-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/material-authoring-handlers.js +382 -41
- package/dist/tools/handlers/material-authoring-handlers.js.map +1 -1
- package/dist/tools/handlers/navigation-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/navigation-handlers.js +11 -36
- package/dist/tools/handlers/navigation-handlers.js.map +1 -1
- package/dist/tools/handlers/networking-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/networking-handlers.js +17 -15
- package/dist/tools/handlers/networking-handlers.js.map +1 -1
- package/dist/tools/handlers/niagara-authoring-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/niagara-authoring-handlers.js +24 -23
- package/dist/tools/handlers/niagara-authoring-handlers.js.map +1 -1
- package/dist/tools/handlers/pcg-handlers.d.ts +4 -0
- package/dist/tools/handlers/pcg-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/pcg-handlers.js +77 -0
- package/dist/tools/handlers/pcg-handlers.js.map +1 -0
- package/dist/tools/handlers/performance-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/performance-handlers.js +35 -42
- package/dist/tools/handlers/performance-handlers.js.map +1 -1
- package/dist/tools/handlers/pipeline-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/pipeline-handlers.js +157 -39
- package/dist/tools/handlers/pipeline-handlers.js.map +1 -1
- package/dist/tools/handlers/sequence-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/sequence-handlers.js +6 -4
- package/dist/tools/handlers/sequence-handlers.js.map +1 -1
- package/dist/tools/handlers/sessions-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/sessions-handlers.js +7 -15
- package/dist/tools/handlers/sessions-handlers.js.map +1 -1
- package/dist/tools/handlers/spline-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/spline-handlers.js +8 -35
- package/dist/tools/handlers/spline-handlers.js.map +1 -1
- package/dist/tools/handlers/system-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/system-handlers.js +100 -26
- package/dist/tools/handlers/system-handlers.js.map +1 -1
- package/dist/tools/handlers/texture-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/texture-handlers.js +14 -0
- package/dist/tools/handlers/texture-handlers.js.map +1 -1
- package/dist/tools/handlers/volume-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/volume-handlers.js +6 -33
- package/dist/tools/handlers/volume-handlers.js.map +1 -1
- package/dist/tools/handlers/widget-authoring-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/widget-authoring-handlers.js +26 -20
- package/dist/tools/handlers/widget-authoring-handlers.js.map +1 -1
- package/dist/tools/level.d.ts +2 -2
- package/dist/tools/level.d.ts.map +1 -1
- package/dist/tools/level.js +2 -1
- package/dist/tools/level.js.map +1 -1
- package/dist/tools/property-dictionary.js +1 -1
- package/dist/tools/property-dictionary.js.map +1 -1
- package/dist/tools/schemas/core-tools.d.ts +1 -1
- package/dist/tools/schemas/core-tools.d.ts.map +1 -1
- package/dist/tools/schemas/core-tools.js +94 -57
- package/dist/tools/schemas/core-tools.js.map +1 -1
- package/dist/tools/tool-definition-utils.d.ts +8 -0
- package/dist/tools/tool-definition-utils.d.ts.map +1 -1
- package/dist/tools/tool-definition-utils.js +20 -0
- package/dist/tools/tool-definition-utils.js.map +1 -1
- package/dist/types/automation-responses.d.ts +26 -33
- package/dist/types/automation-responses.d.ts.map +1 -1
- package/dist/types/env.d.ts.map +1 -1
- package/dist/types/env.js +7 -6
- package/dist/types/env.js.map +1 -1
- package/dist/types/handler-types.d.ts +41 -20
- package/dist/types/handler-types.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/tool-interfaces.d.ts +5 -873
- package/dist/types/tool-interfaces.d.ts.map +1 -1
- package/dist/types/tool-types.d.ts +35 -1
- package/dist/types/tool-types.d.ts.map +1 -1
- package/dist/unreal-bridge.d.ts.map +1 -1
- package/dist/unreal-bridge.js +16 -6
- package/dist/unreal-bridge.js.map +1 -1
- package/dist/utils/action-constants.d.ts +4 -1
- package/dist/utils/action-constants.d.ts.map +1 -1
- package/dist/utils/action-constants.js +4 -1
- package/dist/utils/action-constants.js.map +1 -1
- package/dist/utils/command-validator.d.ts.map +1 -1
- package/dist/utils/command-validator.js +5 -4
- package/dist/utils/command-validator.js.map +1 -1
- package/dist/utils/elicitation.d.ts +5 -2
- package/dist/utils/elicitation.d.ts.map +1 -1
- package/dist/utils/elicitation.js +38 -21
- package/dist/utils/elicitation.js.map +1 -1
- package/dist/utils/environment-snapshot.d.ts +17 -0
- package/dist/utils/environment-snapshot.d.ts.map +1 -0
- package/dist/utils/environment-snapshot.js +242 -0
- package/dist/utils/environment-snapshot.js.map +1 -0
- package/dist/utils/error-handler.d.ts +1 -11
- package/dist/utils/error-handler.d.ts.map +1 -1
- package/dist/utils/error-handler.js +41 -25
- package/dist/utils/error-handler.js.map +1 -1
- package/dist/utils/index.d.ts +2 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/ini-reader.js +4 -4
- package/dist/utils/ini-reader.js.map +1 -1
- package/dist/utils/log-reader.d.ts +29 -0
- package/dist/utils/log-reader.d.ts.map +1 -0
- package/dist/utils/log-reader.js +229 -0
- package/dist/utils/log-reader.js.map +1 -0
- package/dist/utils/log-redaction.d.ts +4 -0
- package/dist/utils/log-redaction.d.ts.map +1 -0
- package/dist/utils/log-redaction.js +27 -0
- package/dist/utils/log-redaction.js.map +1 -0
- package/dist/utils/logger.d.ts +1 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +20 -7
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/normalize.d.ts.map +1 -1
- package/dist/utils/normalize.js +31 -30
- package/dist/utils/normalize.js.map +1 -1
- package/dist/utils/path-security.d.ts.map +1 -1
- package/dist/utils/path-security.js +20 -11
- package/dist/utils/path-security.js.map +1 -1
- package/dist/utils/response-factory.d.ts +1 -1
- package/dist/utils/response-factory.d.ts.map +1 -1
- package/dist/utils/response-factory.js +17 -3
- package/dist/utils/response-factory.js.map +1 -1
- package/dist/utils/response-validator.d.ts.map +1 -1
- package/dist/utils/response-validator.js +114 -47
- package/dist/utils/response-validator.js.map +1 -1
- package/dist/utils/safe-json.d.ts.map +1 -1
- package/dist/utils/safe-json.js +24 -18
- package/dist/utils/safe-json.js.map +1 -1
- package/dist/utils/type-coercion.d.ts +2 -3
- package/dist/utils/type-coercion.d.ts.map +1 -1
- package/dist/utils/type-coercion.js +42 -14
- package/dist/utils/type-coercion.js.map +1 -1
- package/dist/utils/type-guards.d.ts +2 -0
- package/dist/utils/type-guards.d.ts.map +1 -0
- package/dist/utils/type-guards.js +4 -0
- package/dist/utils/type-guards.js.map +1 -0
- package/dist/utils/unreal-command-queue.d.ts +2 -0
- package/dist/utils/unreal-command-queue.d.ts.map +1 -1
- package/dist/utils/unreal-command-queue.js +80 -54
- package/dist/utils/unreal-command-queue.js.map +1 -1
- package/dist/utils/validation.d.ts +2 -1
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +44 -34
- package/dist/utils/validation.js.map +1 -1
- package/package.json +4 -6
- package/server.json +3 -3
- package/dist/graphql/loaders.d.ts +0 -64
- package/dist/graphql/loaders.d.ts.map +0 -1
- package/dist/graphql/loaders.js +0 -117
- package/dist/graphql/loaders.js.map +0 -1
- package/dist/graphql/resolvers.d.ts +0 -373
- package/dist/graphql/resolvers.d.ts.map +0 -1
- package/dist/graphql/resolvers.js +0 -776
- package/dist/graphql/resolvers.js.map +0 -1
- package/dist/graphql/schema.d.ts +0 -5
- package/dist/graphql/schema.d.ts.map +0 -1
- package/dist/graphql/schema.js +0 -437
- package/dist/graphql/schema.js.map +0 -1
- package/dist/graphql/server.d.ts +0 -25
- package/dist/graphql/server.d.ts.map +0 -1
- package/dist/graphql/server.js +0 -119
- package/dist/graphql/server.js.map +0 -1
- package/dist/graphql/types.d.ts +0 -9
- package/dist/graphql/types.d.ts.map +0 -1
- package/dist/graphql/types.js +0 -2
- package/dist/graphql/types.js.map +0 -1
- package/dist/tools/actors.d.ts +0 -212
- package/dist/tools/actors.d.ts.map +0 -1
- package/dist/tools/actors.js +0 -456
- package/dist/tools/actors.js.map +0 -1
- package/dist/tools/animation.d.ts +0 -274
- package/dist/tools/animation.d.ts.map +0 -1
- package/dist/tools/animation.js +0 -773
- package/dist/tools/animation.js.map +0 -1
- package/dist/tools/assets.d.ts +0 -82
- package/dist/tools/assets.d.ts.map +0 -1
- package/dist/tools/assets.js +0 -383
- package/dist/tools/assets.js.map +0 -1
- package/dist/tools/blueprint.d.ts +0 -271
- package/dist/tools/blueprint.d.ts.map +0 -1
- package/dist/tools/blueprint.js +0 -828
- package/dist/tools/blueprint.js.map +0 -1
- package/dist/tools/environment.d.ts +0 -37
- package/dist/tools/environment.d.ts.map +0 -1
- package/dist/tools/environment.js +0 -338
- package/dist/tools/environment.js.map +0 -1
- package/dist/tools/foliage.d.ts +0 -140
- package/dist/tools/foliage.d.ts.map +0 -1
- package/dist/tools/foliage.js +0 -405
- package/dist/tools/foliage.js.map +0 -1
- package/dist/tools/landscape.d.ts +0 -120
- package/dist/tools/landscape.d.ts.map +0 -1
- package/dist/tools/landscape.js +0 -454
- package/dist/tools/landscape.js.map +0 -1
- package/dist/tools/lighting.d.ts +0 -240
- package/dist/tools/lighting.d.ts.map +0 -1
- package/dist/tools/lighting.js +0 -856
- package/dist/tools/lighting.js.map +0 -1
- package/dist/tools/logs.d.ts +0 -45
- package/dist/tools/logs.d.ts.map +0 -1
- package/dist/tools/logs.js +0 -235
- package/dist/tools/logs.js.map +0 -1
- package/dist/tools/niagara.d.ts +0 -277
- package/dist/tools/niagara.d.ts.map +0 -1
- package/dist/tools/niagara.js +0 -325
- package/dist/tools/niagara.js.map +0 -1
- package/dist/tools/physics.d.ts +0 -191
- package/dist/tools/physics.d.ts.map +0 -1
- package/dist/tools/physics.js +0 -492
- package/dist/tools/physics.js.map +0 -1
- package/dist/tools/sequence.d.ts +0 -139
- package/dist/tools/sequence.d.ts.map +0 -1
- package/dist/tools/sequence.js +0 -261
- 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('
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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('
|
|
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('
|
|
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('
|
|
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
|
|
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('
|
|
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('
|
|
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
|
-
|
|
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('
|
|
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('
|
|
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('
|
|
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('
|
|
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('
|
|
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('
|
|
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('
|
|
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:
|
|
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) {
|