unreal-engine-mcp-server 0.4.7 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +26 -0
- package/.env.production +38 -7
- package/.eslintrc.json +0 -54
- package/.eslintrc.override.json +8 -0
- package/.github/ISSUE_TEMPLATE/bug_report.yml +94 -0
- package/.github/ISSUE_TEMPLATE/config.yml +8 -0
- package/.github/ISSUE_TEMPLATE/feature_request.yml +56 -0
- package/.github/copilot-instructions.md +478 -45
- package/.github/dependabot.yml +19 -0
- package/.github/labeler.yml +24 -0
- package/.github/labels.yml +70 -0
- package/.github/pull_request_template.md +42 -0
- package/.github/release-drafter.yml +148 -0
- package/.github/workflows/auto-merge.yml +38 -0
- package/.github/workflows/ci.yml +38 -0
- package/.github/workflows/dependency-review.yml +17 -0
- package/.github/workflows/gemini-issue-triage.yml +172 -0
- package/.github/workflows/greetings.yml +23 -0
- package/.github/workflows/labeler.yml +16 -0
- package/.github/workflows/links.yml +80 -0
- package/.github/workflows/pr-size-labeler.yml +137 -0
- package/.github/workflows/publish-mcp.yml +12 -7
- package/.github/workflows/release-drafter.yml +23 -0
- package/.github/workflows/release.yml +112 -0
- package/.github/workflows/semantic-pull-request.yml +35 -0
- package/.github/workflows/smoke-test.yml +36 -0
- package/.github/workflows/stale.yml +28 -0
- package/CHANGELOG.md +267 -31
- package/CONTRIBUTING.md +140 -0
- package/README.md +166 -71
- package/claude_desktop_config_example.json +7 -6
- package/dist/automation/bridge.d.ts +50 -0
- package/dist/automation/bridge.js +452 -0
- package/dist/automation/connection-manager.d.ts +23 -0
- package/dist/automation/connection-manager.js +107 -0
- package/dist/automation/handshake.d.ts +11 -0
- package/dist/automation/handshake.js +89 -0
- package/dist/automation/index.d.ts +3 -0
- package/dist/automation/index.js +3 -0
- package/dist/automation/message-handler.d.ts +12 -0
- package/dist/automation/message-handler.js +149 -0
- package/dist/automation/request-tracker.d.ts +25 -0
- package/dist/automation/request-tracker.js +98 -0
- package/dist/automation/types.d.ts +130 -0
- package/dist/automation/types.js +2 -0
- package/dist/cli.js +32 -5
- package/dist/config.d.ts +27 -0
- package/dist/config.js +60 -0
- package/dist/constants.d.ts +12 -0
- package/dist/constants.js +12 -0
- package/dist/graphql/resolvers.d.ts +268 -0
- package/dist/graphql/resolvers.js +743 -0
- package/dist/graphql/schema.d.ts +5 -0
- package/dist/graphql/schema.js +437 -0
- package/dist/graphql/server.d.ts +26 -0
- package/dist/graphql/server.js +115 -0
- package/dist/graphql/types.d.ts +7 -0
- package/dist/graphql/types.js +2 -0
- package/dist/handlers/resource-handlers.d.ts +20 -0
- package/dist/handlers/resource-handlers.js +180 -0
- package/dist/index.d.ts +31 -18
- package/dist/index.js +119 -619
- package/dist/prompts/index.js +4 -4
- package/dist/resources/actors.d.ts +17 -12
- package/dist/resources/actors.js +56 -76
- package/dist/resources/assets.d.ts +6 -14
- package/dist/resources/assets.js +115 -147
- package/dist/resources/levels.d.ts +13 -13
- package/dist/resources/levels.js +25 -34
- package/dist/server/resource-registry.d.ts +20 -0
- package/dist/server/resource-registry.js +37 -0
- package/dist/server/tool-registry.d.ts +23 -0
- package/dist/server/tool-registry.js +322 -0
- package/dist/server-setup.d.ts +21 -0
- package/dist/server-setup.js +111 -0
- package/dist/services/health-monitor.d.ts +34 -0
- package/dist/services/health-monitor.js +105 -0
- package/dist/services/metrics-server.d.ts +11 -0
- package/dist/services/metrics-server.js +105 -0
- package/dist/tools/actors.d.ts +147 -9
- package/dist/tools/actors.js +350 -311
- package/dist/tools/animation.d.ts +135 -4
- package/dist/tools/animation.js +510 -411
- package/dist/tools/assets.d.ts +117 -19
- package/dist/tools/assets.js +259 -284
- package/dist/tools/audio.d.ts +102 -42
- package/dist/tools/audio.js +272 -685
- package/dist/tools/base-tool.d.ts +17 -0
- package/dist/tools/base-tool.js +46 -0
- package/dist/tools/behavior-tree.d.ts +94 -0
- package/dist/tools/behavior-tree.js +39 -0
- package/dist/tools/blueprint/helpers.d.ts +29 -0
- package/dist/tools/blueprint/helpers.js +182 -0
- package/dist/tools/blueprint.d.ts +228 -118
- package/dist/tools/blueprint.js +685 -832
- package/dist/tools/consolidated-tool-definitions.d.ts +5462 -1781
- package/dist/tools/consolidated-tool-definitions.js +829 -496
- package/dist/tools/consolidated-tool-handlers.d.ts +2 -1
- package/dist/tools/consolidated-tool-handlers.js +211 -1026
- package/dist/tools/debug.d.ts +143 -85
- package/dist/tools/debug.js +234 -180
- package/dist/tools/dynamic-handler-registry.d.ts +11 -0
- package/dist/tools/dynamic-handler-registry.js +101 -0
- package/dist/tools/editor.d.ts +139 -18
- package/dist/tools/editor.js +239 -244
- package/dist/tools/engine.d.ts +10 -4
- package/dist/tools/engine.js +13 -5
- package/dist/tools/environment.d.ts +36 -0
- package/dist/tools/environment.js +267 -0
- package/dist/tools/foliage.d.ts +105 -14
- package/dist/tools/foliage.js +219 -331
- package/dist/tools/handlers/actor-handlers.d.ts +3 -0
- package/dist/tools/handlers/actor-handlers.js +232 -0
- package/dist/tools/handlers/animation-handlers.d.ts +3 -0
- package/dist/tools/handlers/animation-handlers.js +185 -0
- package/dist/tools/handlers/argument-helper.d.ts +16 -0
- package/dist/tools/handlers/argument-helper.js +80 -0
- package/dist/tools/handlers/asset-handlers.d.ts +3 -0
- package/dist/tools/handlers/asset-handlers.js +496 -0
- package/dist/tools/handlers/audio-handlers.d.ts +3 -0
- package/dist/tools/handlers/audio-handlers.js +166 -0
- package/dist/tools/handlers/blueprint-handlers.d.ts +4 -0
- package/dist/tools/handlers/blueprint-handlers.js +358 -0
- package/dist/tools/handlers/common-handlers.d.ts +14 -0
- package/dist/tools/handlers/common-handlers.js +56 -0
- package/dist/tools/handlers/editor-handlers.d.ts +3 -0
- package/dist/tools/handlers/editor-handlers.js +119 -0
- package/dist/tools/handlers/effect-handlers.d.ts +3 -0
- package/dist/tools/handlers/effect-handlers.js +171 -0
- package/dist/tools/handlers/environment-handlers.d.ts +3 -0
- package/dist/tools/handlers/environment-handlers.js +170 -0
- package/dist/tools/handlers/graph-handlers.d.ts +3 -0
- package/dist/tools/handlers/graph-handlers.js +90 -0
- package/dist/tools/handlers/input-handlers.d.ts +3 -0
- package/dist/tools/handlers/input-handlers.js +21 -0
- package/dist/tools/handlers/inspect-handlers.d.ts +3 -0
- package/dist/tools/handlers/inspect-handlers.js +383 -0
- package/dist/tools/handlers/level-handlers.d.ts +3 -0
- package/dist/tools/handlers/level-handlers.js +237 -0
- package/dist/tools/handlers/lighting-handlers.d.ts +3 -0
- package/dist/tools/handlers/lighting-handlers.js +144 -0
- package/dist/tools/handlers/performance-handlers.d.ts +3 -0
- package/dist/tools/handlers/performance-handlers.js +130 -0
- package/dist/tools/handlers/pipeline-handlers.d.ts +3 -0
- package/dist/tools/handlers/pipeline-handlers.js +110 -0
- package/dist/tools/handlers/sequence-handlers.d.ts +3 -0
- package/dist/tools/handlers/sequence-handlers.js +376 -0
- package/dist/tools/handlers/system-handlers.d.ts +4 -0
- package/dist/tools/handlers/system-handlers.js +506 -0
- package/dist/tools/input.d.ts +19 -0
- package/dist/tools/input.js +89 -0
- package/dist/tools/introspection.d.ts +103 -40
- package/dist/tools/introspection.js +425 -568
- package/dist/tools/landscape.d.ts +97 -36
- package/dist/tools/landscape.js +280 -409
- package/dist/tools/level.d.ts +130 -10
- package/dist/tools/level.js +639 -675
- package/dist/tools/lighting.d.ts +77 -38
- package/dist/tools/lighting.js +441 -943
- package/dist/tools/logs.d.ts +3 -3
- package/dist/tools/logs.js +5 -57
- package/dist/tools/materials.d.ts +91 -24
- package/dist/tools/materials.js +190 -118
- package/dist/tools/niagara.d.ts +149 -39
- package/dist/tools/niagara.js +232 -182
- package/dist/tools/performance.d.ts +27 -12
- package/dist/tools/performance.js +204 -122
- package/dist/tools/physics.d.ts +32 -77
- package/dist/tools/physics.js +171 -582
- package/dist/tools/property-dictionary.d.ts +13 -0
- package/dist/tools/property-dictionary.js +82 -0
- package/dist/tools/sequence.d.ts +73 -48
- package/dist/tools/sequence.js +196 -748
- package/dist/tools/tool-definition-utils.d.ts +59 -0
- package/dist/tools/tool-definition-utils.js +35 -0
- package/dist/tools/ui.d.ts +66 -34
- package/dist/tools/ui.js +134 -214
- package/dist/types/env.d.ts +0 -3
- package/dist/types/env.js +0 -7
- package/dist/types/tool-interfaces.d.ts +898 -0
- package/dist/types/tool-interfaces.js +2 -0
- package/dist/types/tool-types.d.ts +183 -19
- package/dist/types/tool-types.js +0 -4
- package/dist/unreal-bridge.d.ts +24 -131
- package/dist/unreal-bridge.js +364 -1506
- package/dist/utils/command-validator.d.ts +9 -0
- package/dist/utils/command-validator.js +67 -0
- package/dist/utils/elicitation.d.ts +1 -1
- package/dist/utils/elicitation.js +12 -15
- package/dist/utils/error-handler.d.ts +2 -51
- package/dist/utils/error-handler.js +11 -87
- package/dist/utils/ini-reader.d.ts +3 -0
- package/dist/utils/ini-reader.js +69 -0
- package/dist/utils/logger.js +9 -6
- package/dist/utils/normalize.d.ts +3 -0
- package/dist/utils/normalize.js +56 -0
- package/dist/utils/response-factory.d.ts +7 -0
- package/dist/utils/response-factory.js +33 -0
- package/dist/utils/response-validator.d.ts +3 -24
- package/dist/utils/response-validator.js +130 -81
- package/dist/utils/result-helpers.d.ts +4 -5
- package/dist/utils/result-helpers.js +15 -16
- package/dist/utils/safe-json.js +5 -11
- package/dist/utils/unreal-command-queue.d.ts +24 -0
- package/dist/utils/unreal-command-queue.js +120 -0
- package/dist/utils/validation.d.ts +0 -40
- package/dist/utils/validation.js +1 -78
- package/dist/wasm/index.d.ts +70 -0
- package/dist/wasm/index.js +535 -0
- package/docs/GraphQL-API.md +888 -0
- package/docs/Migration-Guide-v0.5.0.md +692 -0
- package/docs/Roadmap.md +53 -0
- package/docs/WebAssembly-Integration.md +628 -0
- package/docs/editor-plugin-extension.md +370 -0
- package/docs/handler-mapping.md +242 -0
- package/docs/native-automation-progress.md +128 -0
- package/docs/testing-guide.md +423 -0
- package/mcp-config-example.json +6 -6
- package/package.json +60 -27
- package/plugins/McpAutomationBridge/Config/FilterPlugin.ini +8 -0
- package/plugins/McpAutomationBridge/McpAutomationBridge.uplugin +64 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/McpAutomationBridge.Build.cs +189 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.cpp +22 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.h +30 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeHelpers.h +1983 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeModule.cpp +72 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSettings.cpp +46 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSubsystem.cpp +581 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AnimationHandlers.cpp +2394 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetQueryHandlers.cpp +300 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetWorkflowHandlers.cpp +2807 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AudioHandlers.cpp +1087 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BehaviorTreeHandlers.cpp +488 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.cpp +643 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.h +31 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintGraphHandlers.cpp +1184 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers.cpp +5652 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers_List.cpp +152 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ControlHandlers.cpp +2614 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_DebugHandlers.cpp +42 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EditorFunctionHandlers.cpp +1237 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EffectHandlers.cpp +1701 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EnvironmentHandlers.cpp +2145 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_FoliageHandlers.cpp +954 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InputHandlers.cpp +209 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InsightsHandlers.cpp +41 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LandscapeHandlers.cpp +1164 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LevelHandlers.cpp +762 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LightingHandlers.cpp +634 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LogHandlers.cpp +136 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_MaterialGraphHandlers.cpp +494 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraGraphHandlers.cpp +278 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraHandlers.cpp +625 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PerformanceHandlers.cpp +401 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PipelineHandlers.cpp +67 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ProcessRequest.cpp +735 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PropertyHandlers.cpp +2634 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_RenderHandlers.cpp +189 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.cpp +917 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.h +39 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequenceHandlers.cpp +2670 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequencerHandlers.cpp +519 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_TestHandlers.cpp +38 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_UiHandlers.cpp +668 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_WorldPartitionHandlers.cpp +346 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.cpp +1330 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.h +149 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpConnectionManager.cpp +783 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSettings.h +115 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSubsystem.h +796 -0
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpConnectionManager.h +117 -0
- package/scripts/check-unreal-connection.mjs +19 -0
- package/scripts/clean-tmp.js +23 -0
- package/scripts/patch-wasm.js +26 -0
- package/scripts/run-all-tests.mjs +131 -0
- package/scripts/smoke-test.ts +94 -0
- package/scripts/sync-mcp-plugin.js +143 -0
- package/scripts/test-no-plugin-alternates.mjs +113 -0
- package/scripts/validate-server.js +46 -0
- package/scripts/verify-automation-bridge.js +200 -0
- package/server.json +57 -21
- package/src/automation/bridge.ts +558 -0
- package/src/automation/connection-manager.ts +130 -0
- package/src/automation/handshake.ts +99 -0
- package/src/automation/index.ts +2 -0
- package/src/automation/message-handler.ts +167 -0
- package/src/automation/request-tracker.ts +123 -0
- package/src/automation/types.ts +107 -0
- package/src/cli.ts +33 -6
- package/src/config.ts +73 -0
- package/src/constants.ts +12 -0
- package/src/graphql/resolvers.ts +1010 -0
- package/src/graphql/schema.ts +452 -0
- package/src/graphql/server.ts +154 -0
- package/src/graphql/types.ts +7 -0
- package/src/handlers/resource-handlers.ts +186 -0
- package/src/index.ts +152 -663
- package/src/prompts/index.ts +4 -4
- package/src/resources/actors.ts +58 -76
- package/src/resources/assets.ts +147 -134
- package/src/resources/levels.ts +28 -33
- package/src/server/resource-registry.ts +47 -0
- package/src/server/tool-registry.ts +354 -0
- package/src/server-setup.ts +148 -0
- package/src/services/health-monitor.ts +132 -0
- package/src/services/metrics-server.ts +142 -0
- package/src/tools/actors.ts +417 -322
- package/src/tools/animation.ts +671 -461
- package/src/tools/assets.ts +353 -289
- package/src/tools/audio.ts +323 -766
- package/src/tools/base-tool.ts +52 -0
- package/src/tools/behavior-tree.ts +45 -0
- package/src/tools/blueprint/helpers.ts +189 -0
- package/src/tools/blueprint.ts +787 -965
- package/src/tools/consolidated-tool-definitions.ts +993 -515
- package/src/tools/consolidated-tool-handlers.ts +272 -1139
- package/src/tools/debug.ts +292 -187
- package/src/tools/dynamic-handler-registry.ts +151 -0
- package/src/tools/editor.ts +309 -246
- package/src/tools/engine.ts +14 -3
- package/src/tools/environment.ts +287 -0
- package/src/tools/foliage.ts +314 -379
- package/src/tools/handlers/actor-handlers.ts +271 -0
- package/src/tools/handlers/animation-handlers.ts +237 -0
- package/src/tools/handlers/argument-helper.ts +142 -0
- package/src/tools/handlers/asset-handlers.ts +532 -0
- package/src/tools/handlers/audio-handlers.ts +194 -0
- package/src/tools/handlers/blueprint-handlers.ts +380 -0
- package/src/tools/handlers/common-handlers.ts +87 -0
- package/src/tools/handlers/editor-handlers.ts +123 -0
- package/src/tools/handlers/effect-handlers.ts +220 -0
- package/src/tools/handlers/environment-handlers.ts +183 -0
- package/src/tools/handlers/graph-handlers.ts +116 -0
- package/src/tools/handlers/input-handlers.ts +28 -0
- package/src/tools/handlers/inspect-handlers.ts +450 -0
- package/src/tools/handlers/level-handlers.ts +252 -0
- package/src/tools/handlers/lighting-handlers.ts +147 -0
- package/src/tools/handlers/performance-handlers.ts +132 -0
- package/src/tools/handlers/pipeline-handlers.ts +127 -0
- package/src/tools/handlers/sequence-handlers.ts +415 -0
- package/src/tools/handlers/system-handlers.ts +564 -0
- package/src/tools/input.ts +101 -0
- package/src/tools/introspection.ts +493 -584
- package/src/tools/landscape.ts +394 -489
- package/src/tools/level.ts +752 -694
- package/src/tools/lighting.ts +583 -984
- package/src/tools/logs.ts +9 -57
- package/src/tools/materials.ts +231 -121
- package/src/tools/niagara.ts +293 -168
- package/src/tools/performance.ts +320 -168
- package/src/tools/physics.ts +268 -613
- package/src/tools/property-dictionary.ts +98 -0
- package/src/tools/sequence.ts +255 -815
- package/src/tools/tool-definition-utils.ts +35 -0
- package/src/tools/ui.ts +207 -283
- package/src/types/env.ts +0 -10
- package/src/types/tool-interfaces.ts +250 -0
- package/src/types/tool-types.ts +243 -21
- package/src/unreal-bridge.ts +460 -1550
- package/src/utils/command-validator.ts +75 -0
- package/src/utils/elicitation.ts +10 -7
- package/src/utils/error-handler.ts +14 -90
- package/src/utils/ini-reader.ts +86 -0
- package/src/utils/logger.ts +8 -3
- package/src/utils/normalize.ts +60 -0
- package/src/utils/response-factory.ts +39 -0
- package/src/utils/response-validator.ts +176 -56
- package/src/utils/result-helpers.ts +21 -19
- package/src/utils/safe-json.ts +14 -11
- package/src/utils/unreal-command-queue.ts +152 -0
- package/src/utils/validation.ts +4 -1
- package/src/wasm/index.ts +838 -0
- package/test-server.mjs +100 -0
- package/tests/run-unreal-tool-tests.mjs +242 -14
- package/tests/test-animation.mjs +44 -0
- package/tests/test-asset-advanced.mjs +82 -0
- package/tests/test-asset-errors.mjs +35 -0
- package/tests/test-audio.mjs +219 -0
- package/tests/test-automation-timeouts.mjs +98 -0
- package/tests/test-behavior-tree.mjs +261 -0
- package/tests/test-blueprint-events.mjs +35 -0
- package/tests/test-blueprint-graph.mjs +79 -0
- package/tests/test-blueprint.mjs +577 -0
- package/tests/test-client-mode.mjs +86 -0
- package/tests/test-console-command.mjs +56 -0
- package/tests/test-control-actor.mjs +425 -0
- package/tests/test-control-editor.mjs +80 -0
- package/tests/test-extra-tools.mjs +38 -0
- package/tests/test-graphql.mjs +322 -0
- package/tests/test-inspect.mjs +72 -0
- package/tests/test-landscape.mjs +60 -0
- package/tests/test-manage-asset.mjs +438 -0
- package/tests/test-manage-level.mjs +70 -0
- package/tests/test-materials.mjs +356 -0
- package/tests/test-niagara.mjs +185 -0
- package/tests/test-no-inline-python.mjs +122 -0
- package/tests/test-plugin-handshake.mjs +82 -0
- package/tests/test-render.mjs +33 -0
- package/tests/test-runner.mjs +933 -0
- package/tests/test-search-assets.mjs +66 -0
- package/tests/test-sequence.mjs +68 -0
- package/tests/test-system.mjs +57 -0
- package/tests/test-wasm.mjs +193 -0
- package/tests/test-world-partition.mjs +215 -0
- package/tsconfig.json +3 -3
- package/wasm/Cargo.lock +363 -0
- package/wasm/Cargo.toml +42 -0
- package/wasm/LICENSE +21 -0
- package/wasm/README.md +253 -0
- package/wasm/src/dependency_resolver.rs +377 -0
- package/wasm/src/lib.rs +153 -0
- package/wasm/src/property_parser.rs +271 -0
- package/wasm/src/transform_math.rs +396 -0
- package/wasm/tests/integration.rs +109 -0
- package/.github/workflows/smithery-build.yml +0 -29
- package/dist/tools/build_environment_advanced.d.ts +0 -65
- package/dist/tools/build_environment_advanced.js +0 -633
- package/dist/tools/rc.d.ts +0 -110
- package/dist/tools/rc.js +0 -437
- package/dist/tools/visual.d.ts +0 -40
- package/dist/tools/visual.js +0 -282
- package/dist/utils/http.d.ts +0 -6
- package/dist/utils/http.js +0 -151
- package/dist/utils/python-output.d.ts +0 -18
- package/dist/utils/python-output.js +0 -290
- package/dist/utils/python.d.ts +0 -2
- package/dist/utils/python.js +0 -4
- package/dist/utils/stdio-redirect.d.ts +0 -2
- package/dist/utils/stdio-redirect.js +0 -20
- package/docs/unreal-tool-test-cases.md +0 -574
- package/smithery.yaml +0 -29
- package/src/tools/build_environment_advanced.ts +0 -732
- package/src/tools/rc.ts +0 -515
- package/src/tools/visual.ts +0 -281
- package/src/utils/http.ts +0 -187
- package/src/utils/python-output.ts +0 -351
- package/src/utils/python.ts +0 -3
- package/src/utils/stdio-redirect.ts +0 -18
|
@@ -0,0 +1,581 @@
|
|
|
1
|
+
// Ensure the subsystem type and bridge socket types are available
|
|
2
|
+
#include "McpAutomationBridgeSubsystem.h"
|
|
3
|
+
#include "HAL/PlatformFilemanager.h"
|
|
4
|
+
#include "HAL/PlatformTime.h"
|
|
5
|
+
#include "McpAutomationBridgeGlobals.h"
|
|
6
|
+
#include "McpAutomationBridgeSettings.h"
|
|
7
|
+
#include "McpBridgeWebSocket.h"
|
|
8
|
+
#include "McpConnectionManager.h"
|
|
9
|
+
#include "Misc/FileHelper.h"
|
|
10
|
+
#include "Misc/Guid.h"
|
|
11
|
+
#include "Misc/Paths.h"
|
|
12
|
+
#include "Serialization/JsonReader.h"
|
|
13
|
+
#include "Serialization/JsonSerializer.h"
|
|
14
|
+
|
|
15
|
+
// Define the subsystem log category declared in the public header.
|
|
16
|
+
DEFINE_LOG_CATEGORY(LogMcpAutomationBridgeSubsystem);
|
|
17
|
+
|
|
18
|
+
// Sanitize incoming text for logging: replace control characters with
|
|
19
|
+
// '?' and truncate long messages so logs remain readable and do not
|
|
20
|
+
// attempt to render unprintable glyphs in the editor which can spam
|
|
21
|
+
/**
|
|
22
|
+
* @brief Produces a log-safe copy of a string by replacing control characters and truncating long input.
|
|
23
|
+
*
|
|
24
|
+
* Creates a sanitized version of the input string where characters with code points less than 32 or equal to 127
|
|
25
|
+
* are replaced with '?' and the result is truncated to 512 characters with "[TRUNCATED]" appended if the input
|
|
26
|
+
* is longer.
|
|
27
|
+
*
|
|
28
|
+
* @param In Input string to sanitize.
|
|
29
|
+
* @return FString Sanitized string suitable for logging.
|
|
30
|
+
*/
|
|
31
|
+
static inline FString SanitizeForLog(const FString &In) {
|
|
32
|
+
if (In.IsEmpty())
|
|
33
|
+
return FString();
|
|
34
|
+
FString Out;
|
|
35
|
+
Out.Reserve(FMath::Min<int32>(In.Len(), 1024));
|
|
36
|
+
for (int32 i = 0; i < In.Len(); ++i) {
|
|
37
|
+
const TCHAR C = In[i];
|
|
38
|
+
if (C >= 32 && C != 127)
|
|
39
|
+
Out.AppendChar(C);
|
|
40
|
+
else
|
|
41
|
+
Out.AppendChar('?');
|
|
42
|
+
}
|
|
43
|
+
if (Out.Len() > 512)
|
|
44
|
+
Out = Out.Left(512) + TEXT("[TRUNCATED]");
|
|
45
|
+
return Out;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* @brief Initialize the automation bridge subsystem, preparing networking, handlers, and periodic processing.
|
|
50
|
+
*
|
|
51
|
+
* Creates and initializes the connection manager, registers automation action handlers and a message-received callback, starts the connection manager, and registers a recurring ticker to process pending automation requests.
|
|
52
|
+
*
|
|
53
|
+
* @param Collection Subsystem collection provided by the engine during initialization.
|
|
54
|
+
*/
|
|
55
|
+
void UMcpAutomationBridgeSubsystem::Initialize(
|
|
56
|
+
FSubsystemCollectionBase &Collection) {
|
|
57
|
+
Super::Initialize(Collection);
|
|
58
|
+
|
|
59
|
+
UE_LOG(LogMcpAutomationBridgeSubsystem, Log,
|
|
60
|
+
TEXT("McpAutomationBridgeSubsystem initializing."));
|
|
61
|
+
|
|
62
|
+
// Create and initialize the connection manager
|
|
63
|
+
ConnectionManager = MakeShared<FMcpConnectionManager>();
|
|
64
|
+
ConnectionManager->Initialize(GetDefault<UMcpAutomationBridgeSettings>());
|
|
65
|
+
|
|
66
|
+
// Bind message received delegate
|
|
67
|
+
ConnectionManager->SetOnMessageReceived(
|
|
68
|
+
FMcpMessageReceivedCallback::CreateWeakLambda(
|
|
69
|
+
this, [this](const FString &RequestId, const FString &Action,
|
|
70
|
+
const TSharedPtr<FJsonObject> &Payload,
|
|
71
|
+
TSharedPtr<FMcpBridgeWebSocket> Socket) {
|
|
72
|
+
ProcessAutomationRequest(RequestId, Action, Payload, Socket);
|
|
73
|
+
}));
|
|
74
|
+
|
|
75
|
+
// Initialize the handler registry
|
|
76
|
+
InitializeHandlers();
|
|
77
|
+
|
|
78
|
+
// Start the connection manager
|
|
79
|
+
ConnectionManager->Start();
|
|
80
|
+
|
|
81
|
+
// Register Ticker
|
|
82
|
+
TickHandle = FTSTicker::GetCoreTicker().AddTicker(
|
|
83
|
+
FTickerDelegate::CreateUObject(this,
|
|
84
|
+
&UMcpAutomationBridgeSubsystem::Tick),
|
|
85
|
+
0.1f // Tick every 0.1s is sufficient for automation queue processing
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
UE_LOG(LogMcpAutomationBridgeSubsystem, Log,
|
|
89
|
+
TEXT("McpAutomationBridgeSubsystem Initialized."));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* @brief Shuts down the MCP Automation Bridge subsystem and releases its resources.
|
|
94
|
+
*
|
|
95
|
+
* Removes the registered ticker, stops and clears the connection manager, detaches and clears the log capture device, and calls the superclass deinitialization.
|
|
96
|
+
*/
|
|
97
|
+
void UMcpAutomationBridgeSubsystem::Deinitialize() {
|
|
98
|
+
if (TickHandle.IsValid()) {
|
|
99
|
+
FTSTicker::GetCoreTicker().RemoveTicker(TickHandle);
|
|
100
|
+
TickHandle.Reset();
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
UE_LOG(LogMcpAutomationBridgeSubsystem, Log,
|
|
104
|
+
TEXT("McpAutomationBridgeSubsystem deinitializing."));
|
|
105
|
+
|
|
106
|
+
if (ConnectionManager.IsValid()) {
|
|
107
|
+
ConnectionManager->Stop();
|
|
108
|
+
ConnectionManager.Reset();
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (LogCaptureDevice.IsValid()) {
|
|
112
|
+
if (GLog)
|
|
113
|
+
GLog->RemoveOutputDevice(LogCaptureDevice.Get());
|
|
114
|
+
LogCaptureDevice.Reset();
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
Super::Deinitialize();
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* @brief Reports whether the automation bridge currently has any active connections.
|
|
122
|
+
*
|
|
123
|
+
* @return `true` if the connection manager exists and has one or more active sockets, `false` otherwise.
|
|
124
|
+
*/
|
|
125
|
+
bool UMcpAutomationBridgeSubsystem::IsBridgeActive() const {
|
|
126
|
+
return ConnectionManager.IsValid() &&
|
|
127
|
+
ConnectionManager->GetActiveSocketCount() > 0;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* @brief Determine the bridge's connection state from active sockets.
|
|
132
|
+
*
|
|
133
|
+
* @return EMcpAutomationBridgeState `EMcpAutomationBridgeState::Connected` if one or more active sockets are present, `EMcpAutomationBridgeState::Disconnected` otherwise.
|
|
134
|
+
*/
|
|
135
|
+
EMcpAutomationBridgeState
|
|
136
|
+
UMcpAutomationBridgeSubsystem::GetBridgeState() const {
|
|
137
|
+
// Map connection manager state if needed, for now just check if we have
|
|
138
|
+
// active sockets
|
|
139
|
+
return IsBridgeActive() ? EMcpAutomationBridgeState::Connected
|
|
140
|
+
: EMcpAutomationBridgeState::Disconnected;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* @brief Forward a raw text message to the connection manager for transmission.
|
|
145
|
+
*
|
|
146
|
+
* @param Message The raw message string to send.
|
|
147
|
+
* @return `true` if the connection manager accepted the message for sending, `false` otherwise.
|
|
148
|
+
*/
|
|
149
|
+
bool UMcpAutomationBridgeSubsystem::SendRawMessage(const FString &Message) {
|
|
150
|
+
if (ConnectionManager.IsValid()) {
|
|
151
|
+
return ConnectionManager->SendRawMessage(Message);
|
|
152
|
+
}
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* @brief Per-frame tick that processes deferred automation requests when it is safe to do so.
|
|
158
|
+
*
|
|
159
|
+
* Invokes processing of any pending automation requests that were previously deferred due to unsafe engine states (saving, garbage collection, or async loading).
|
|
160
|
+
*
|
|
161
|
+
* @param DeltaTime Time elapsed since the last tick, in seconds.
|
|
162
|
+
* @return true to remain registered and continue receiving ticks.
|
|
163
|
+
*/
|
|
164
|
+
bool UMcpAutomationBridgeSubsystem::Tick(float DeltaTime) {
|
|
165
|
+
// Check if we have pending requests that were deferred due to unsafe engine
|
|
166
|
+
// states
|
|
167
|
+
if (bPendingRequestsScheduled && !GIsSavingPackage &&
|
|
168
|
+
!IsGarbageCollecting() && !IsAsyncLoading()) {
|
|
169
|
+
ProcessPendingAutomationRequests();
|
|
170
|
+
}
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// The in-file implementation of ProcessAutomationRequest was intentionally
|
|
175
|
+
// removed from this translation unit. The function is now implemented in
|
|
176
|
+
// McpAutomationBridge_ProcessRequest.cpp to avoid duplicate definitions and
|
|
177
|
+
// to keep this file focused. See that file for the full request dispatcher
|
|
178
|
+
/**
|
|
179
|
+
* @brief Sends an automation response for a specific request to the given socket.
|
|
180
|
+
*
|
|
181
|
+
* If the connection manager is not available this call is a no-op.
|
|
182
|
+
*
|
|
183
|
+
* @param TargetSocket WebSocket to which the response will be sent.
|
|
184
|
+
* @param RequestId Identifier of the automation request being responded to.
|
|
185
|
+
* @param bSuccess `true` if the request succeeded, `false` otherwise.
|
|
186
|
+
* @param Message Human-readable message or description associated with the response.
|
|
187
|
+
* @param Result Optional JSON object containing result data; may be null.
|
|
188
|
+
* @param ErrorCode Error code string to include when `bSuccess` is `false`.
|
|
189
|
+
*/
|
|
190
|
+
|
|
191
|
+
void UMcpAutomationBridgeSubsystem::SendAutomationResponse(
|
|
192
|
+
TSharedPtr<FMcpBridgeWebSocket> TargetSocket, const FString &RequestId,
|
|
193
|
+
const bool bSuccess, const FString &Message,
|
|
194
|
+
const TSharedPtr<FJsonObject> &Result, const FString &ErrorCode) {
|
|
195
|
+
if (ConnectionManager.IsValid()) {
|
|
196
|
+
ConnectionManager->SendAutomationResponse(TargetSocket, RequestId, bSuccess,
|
|
197
|
+
Message, Result, ErrorCode);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* @brief Log a failure and send a standardized automation error response.
|
|
203
|
+
*
|
|
204
|
+
* Resolves an empty ErrorCode to "AUTOMATION_ERROR", logs a sanitized warning
|
|
205
|
+
* with the resolved error and message, and sends a failure response for the
|
|
206
|
+
* specified request.
|
|
207
|
+
*
|
|
208
|
+
* @param TargetSocket Optional socket to target the response; may be null to broadcast or use a default.
|
|
209
|
+
* @param RequestId Identifier of the automation request that failed.
|
|
210
|
+
* @param Message Human-readable failure message.
|
|
211
|
+
* @param ErrorCode Error code to include with the response; "AUTOMATION_ERROR" is used if empty.
|
|
212
|
+
*/
|
|
213
|
+
void UMcpAutomationBridgeSubsystem::SendAutomationError(
|
|
214
|
+
TSharedPtr<FMcpBridgeWebSocket> TargetSocket, const FString &RequestId,
|
|
215
|
+
const FString &Message, const FString &ErrorCode) {
|
|
216
|
+
const FString ResolvedError =
|
|
217
|
+
ErrorCode.IsEmpty() ? TEXT("AUTOMATION_ERROR") : ErrorCode;
|
|
218
|
+
UE_LOG(LogMcpAutomationBridgeSubsystem, Warning,
|
|
219
|
+
TEXT("Automation request failed (%s): %s"), *ResolvedError,
|
|
220
|
+
*SanitizeForLog(Message));
|
|
221
|
+
SendAutomationResponse(TargetSocket, RequestId, false, Message, nullptr,
|
|
222
|
+
ResolvedError);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* @brief Records telemetry for an automation request with outcome details.
|
|
227
|
+
*
|
|
228
|
+
* Forwards the request identifier, success flag, human-readable message, and
|
|
229
|
+
* error code to the connection manager for telemetry/logging.
|
|
230
|
+
*
|
|
231
|
+
* @param RequestId Unique identifier of the automation request.
|
|
232
|
+
* @param bSuccess `true` if the request completed successfully, `false` otherwise.
|
|
233
|
+
* @param Message Human-readable message describing the outcome or context.
|
|
234
|
+
* @param ErrorCode Short error identifier (empty if none).
|
|
235
|
+
*/
|
|
236
|
+
void UMcpAutomationBridgeSubsystem::RecordAutomationTelemetry(
|
|
237
|
+
const FString &RequestId, const bool bSuccess, const FString &Message,
|
|
238
|
+
const FString &ErrorCode) {
|
|
239
|
+
if (ConnectionManager.IsValid()) {
|
|
240
|
+
ConnectionManager->RecordAutomationTelemetry(RequestId, bSuccess, Message,
|
|
241
|
+
ErrorCode);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* @brief Registers an automation action handler for the given action string.
|
|
247
|
+
*
|
|
248
|
+
* If a non-empty handler is provided, stores it under Action (replacing any existing handler for the same key).
|
|
249
|
+
* If Handler is null/invalid, the call is a no-op.
|
|
250
|
+
*
|
|
251
|
+
* @param Action The action identifier string used to look up the handler.
|
|
252
|
+
* @param Handler Callable invoked when the specified action is requested.
|
|
253
|
+
*/
|
|
254
|
+
void UMcpAutomationBridgeSubsystem::RegisterHandler(
|
|
255
|
+
const FString &Action, FAutomationHandler Handler) {
|
|
256
|
+
if (Handler) {
|
|
257
|
+
AutomationHandlers.Add(Action, Handler);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* @brief Registers all automation action handlers used by the MCP Automation Bridge.
|
|
263
|
+
*
|
|
264
|
+
* Populates the subsystem's handler registry with mappings from action name strings
|
|
265
|
+
* (for example: core/property actions, array/map/set container ops, asset dependency queries,
|
|
266
|
+
* console/system and editor tooling actions, blueprint/world/asset management, rendering/materials,
|
|
267
|
+
* input/control, audio/lighting/physics/effects, and performance actions) to the functions that
|
|
268
|
+
* handle those actions so incoming automation requests can be dispatched by action name.
|
|
269
|
+
*
|
|
270
|
+
* This also registers a few common alias actions (e.g., "create_effect", "clear_debug_shapes")
|
|
271
|
+
* so those actions dispatch directly to the intended handler.
|
|
272
|
+
*/
|
|
273
|
+
void UMcpAutomationBridgeSubsystem::InitializeHandlers() {
|
|
274
|
+
// Core & Properties
|
|
275
|
+
RegisterHandler(TEXT("execute_editor_function"),
|
|
276
|
+
[this](const FString &R, const FString &A,
|
|
277
|
+
const TSharedPtr<FJsonObject> &P,
|
|
278
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
279
|
+
return HandleExecuteEditorFunction(R, A, P, S);
|
|
280
|
+
});
|
|
281
|
+
RegisterHandler(TEXT("set_object_property"),
|
|
282
|
+
[this](const FString &R, const FString &A,
|
|
283
|
+
const TSharedPtr<FJsonObject> &P,
|
|
284
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
285
|
+
return HandleSetObjectProperty(R, A, P, S);
|
|
286
|
+
});
|
|
287
|
+
RegisterHandler(TEXT("get_object_property"),
|
|
288
|
+
[this](const FString &R, const FString &A,
|
|
289
|
+
const TSharedPtr<FJsonObject> &P,
|
|
290
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
291
|
+
return HandleGetObjectProperty(R, A, P, S);
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
// Containers (Arrays, Maps, Sets)
|
|
295
|
+
RegisterHandler(TEXT("array_append"),
|
|
296
|
+
[this](const FString &R, const FString &A,
|
|
297
|
+
const TSharedPtr<FJsonObject> &P,
|
|
298
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
299
|
+
return HandleArrayAppend(R, A, P, S);
|
|
300
|
+
});
|
|
301
|
+
RegisterHandler(TEXT("array_remove"),
|
|
302
|
+
[this](const FString &R, const FString &A,
|
|
303
|
+
const TSharedPtr<FJsonObject> &P,
|
|
304
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
305
|
+
return HandleArrayRemove(R, A, P, S);
|
|
306
|
+
});
|
|
307
|
+
RegisterHandler(TEXT("array_insert"),
|
|
308
|
+
[this](const FString &R, const FString &A,
|
|
309
|
+
const TSharedPtr<FJsonObject> &P,
|
|
310
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
311
|
+
return HandleArrayInsert(R, A, P, S);
|
|
312
|
+
});
|
|
313
|
+
RegisterHandler(TEXT("array_get_element"),
|
|
314
|
+
[this](const FString &R, const FString &A,
|
|
315
|
+
const TSharedPtr<FJsonObject> &P,
|
|
316
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
317
|
+
return HandleArrayGetElement(R, A, P, S);
|
|
318
|
+
});
|
|
319
|
+
RegisterHandler(TEXT("array_set_element"),
|
|
320
|
+
[this](const FString &R, const FString &A,
|
|
321
|
+
const TSharedPtr<FJsonObject> &P,
|
|
322
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
323
|
+
return HandleArraySetElement(R, A, P, S);
|
|
324
|
+
});
|
|
325
|
+
RegisterHandler(TEXT("array_clear"),
|
|
326
|
+
[this](const FString &R, const FString &A,
|
|
327
|
+
const TSharedPtr<FJsonObject> &P,
|
|
328
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
329
|
+
return HandleArrayClear(R, A, P, S);
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
RegisterHandler(TEXT("map_set_value"),
|
|
333
|
+
[this](const FString &R, const FString &A,
|
|
334
|
+
const TSharedPtr<FJsonObject> &P,
|
|
335
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
336
|
+
return HandleMapSetValue(R, A, P, S);
|
|
337
|
+
});
|
|
338
|
+
RegisterHandler(TEXT("map_get_value"),
|
|
339
|
+
[this](const FString &R, const FString &A,
|
|
340
|
+
const TSharedPtr<FJsonObject> &P,
|
|
341
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
342
|
+
return HandleMapGetValue(R, A, P, S);
|
|
343
|
+
});
|
|
344
|
+
RegisterHandler(TEXT("map_remove_key"),
|
|
345
|
+
[this](const FString &R, const FString &A,
|
|
346
|
+
const TSharedPtr<FJsonObject> &P,
|
|
347
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
348
|
+
return HandleMapRemoveKey(R, A, P, S);
|
|
349
|
+
});
|
|
350
|
+
RegisterHandler(TEXT("map_has_key"),
|
|
351
|
+
[this](const FString &R, const FString &A,
|
|
352
|
+
const TSharedPtr<FJsonObject> &P,
|
|
353
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
354
|
+
return HandleMapHasKey(R, A, P, S);
|
|
355
|
+
});
|
|
356
|
+
RegisterHandler(TEXT("map_get_keys"),
|
|
357
|
+
[this](const FString &R, const FString &A,
|
|
358
|
+
const TSharedPtr<FJsonObject> &P,
|
|
359
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
360
|
+
return HandleMapGetKeys(R, A, P, S);
|
|
361
|
+
});
|
|
362
|
+
RegisterHandler(TEXT("map_clear"), [this](const FString &R, const FString &A,
|
|
363
|
+
const TSharedPtr<FJsonObject> &P,
|
|
364
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
365
|
+
return HandleMapClear(R, A, P, S);
|
|
366
|
+
});
|
|
367
|
+
|
|
368
|
+
RegisterHandler(TEXT("set_add"), [this](const FString &R, const FString &A,
|
|
369
|
+
const TSharedPtr<FJsonObject> &P,
|
|
370
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
371
|
+
return HandleSetAdd(R, A, P, S);
|
|
372
|
+
});
|
|
373
|
+
RegisterHandler(TEXT("set_remove"),
|
|
374
|
+
[this](const FString &R, const FString &A,
|
|
375
|
+
const TSharedPtr<FJsonObject> &P,
|
|
376
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
377
|
+
return HandleSetRemove(R, A, P, S);
|
|
378
|
+
});
|
|
379
|
+
RegisterHandler(TEXT("set_contains"),
|
|
380
|
+
[this](const FString &R, const FString &A,
|
|
381
|
+
const TSharedPtr<FJsonObject> &P,
|
|
382
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
383
|
+
return HandleSetContains(R, A, P, S);
|
|
384
|
+
});
|
|
385
|
+
RegisterHandler(TEXT("set_clear"), [this](const FString &R, const FString &A,
|
|
386
|
+
const TSharedPtr<FJsonObject> &P,
|
|
387
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
388
|
+
return HandleSetClear(R, A, P, S);
|
|
389
|
+
});
|
|
390
|
+
|
|
391
|
+
// Asset Dependency
|
|
392
|
+
RegisterHandler(TEXT("get_asset_references"),
|
|
393
|
+
[this](const FString &R, const FString &A,
|
|
394
|
+
const TSharedPtr<FJsonObject> &P,
|
|
395
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
396
|
+
return HandleGetAssetReferences(R, A, P, S);
|
|
397
|
+
});
|
|
398
|
+
RegisterHandler(TEXT("get_asset_dependencies"),
|
|
399
|
+
[this](const FString &R, const FString &A,
|
|
400
|
+
const TSharedPtr<FJsonObject> &P,
|
|
401
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
402
|
+
return HandleGetAssetDependencies(R, A, P, S);
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
// Tools & System
|
|
406
|
+
RegisterHandler(TEXT("console_command"),
|
|
407
|
+
[this](const FString &R, const FString &A,
|
|
408
|
+
const TSharedPtr<FJsonObject> &P,
|
|
409
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
410
|
+
return HandleConsoleCommandAction(R, A, P, S);
|
|
411
|
+
});
|
|
412
|
+
RegisterHandler(TEXT("inspect"), [this](const FString &R, const FString &A,
|
|
413
|
+
const TSharedPtr<FJsonObject> &P,
|
|
414
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
415
|
+
return HandleInspectAction(R, A, P, S);
|
|
416
|
+
});
|
|
417
|
+
RegisterHandler(TEXT("system_control"),
|
|
418
|
+
[this](const FString &R, const FString &A,
|
|
419
|
+
const TSharedPtr<FJsonObject> &P,
|
|
420
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
421
|
+
return HandleSystemControlAction(R, A, P, S);
|
|
422
|
+
});
|
|
423
|
+
RegisterHandler(TEXT("manage_blueprint_graph"),
|
|
424
|
+
[this](const FString &R, const FString &A,
|
|
425
|
+
const TSharedPtr<FJsonObject> &P,
|
|
426
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
427
|
+
return HandleBlueprintGraphAction(R, A, P, S);
|
|
428
|
+
});
|
|
429
|
+
RegisterHandler(TEXT("list_blueprints"),
|
|
430
|
+
[this](const FString &R, const FString &A,
|
|
431
|
+
const TSharedPtr<FJsonObject> &P,
|
|
432
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
433
|
+
return HandleListBlueprints(R, A, P, S);
|
|
434
|
+
});
|
|
435
|
+
RegisterHandler(TEXT("manage_world_partition"),
|
|
436
|
+
[this](const FString &R, const FString &A,
|
|
437
|
+
const TSharedPtr<FJsonObject> &P,
|
|
438
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
439
|
+
return HandleWorldPartitionAction(R, A, P, S);
|
|
440
|
+
});
|
|
441
|
+
RegisterHandler(TEXT("manage_render"),
|
|
442
|
+
[this](const FString &R, const FString &A,
|
|
443
|
+
const TSharedPtr<FJsonObject> &P,
|
|
444
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
445
|
+
return HandleRenderAction(R, A, P, S);
|
|
446
|
+
});
|
|
447
|
+
|
|
448
|
+
RegisterHandler(TEXT("manage_input"),
|
|
449
|
+
[this](const FString &R, const FString &A,
|
|
450
|
+
const TSharedPtr<FJsonObject> &P,
|
|
451
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
452
|
+
return HandleInputAction(R, A, P, S);
|
|
453
|
+
});
|
|
454
|
+
|
|
455
|
+
RegisterHandler(TEXT("control_actor"),
|
|
456
|
+
[this](const FString &R, const FString &A,
|
|
457
|
+
const TSharedPtr<FJsonObject> &P,
|
|
458
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
459
|
+
return HandleControlActorAction(R, A, P, S);
|
|
460
|
+
});
|
|
461
|
+
|
|
462
|
+
RegisterHandler(TEXT("manage_level"),
|
|
463
|
+
[this](const FString &R, const FString &A,
|
|
464
|
+
const TSharedPtr<FJsonObject> &P,
|
|
465
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
466
|
+
return HandleLevelAction(R, A, P, S);
|
|
467
|
+
});
|
|
468
|
+
|
|
469
|
+
RegisterHandler(TEXT("manage_sequence"),
|
|
470
|
+
[this](const FString &R, const FString &A,
|
|
471
|
+
const TSharedPtr<FJsonObject> &P,
|
|
472
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
473
|
+
return HandleSequenceAction(R, A, P, S);
|
|
474
|
+
});
|
|
475
|
+
|
|
476
|
+
RegisterHandler(TEXT("manage_asset"),
|
|
477
|
+
[this](const FString &R, const FString &A,
|
|
478
|
+
const TSharedPtr<FJsonObject> &P,
|
|
479
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
480
|
+
return HandleAssetAction(R, A, P, S);
|
|
481
|
+
});
|
|
482
|
+
|
|
483
|
+
RegisterHandler(TEXT("rebuild_material"),
|
|
484
|
+
[this](const FString &R, const FString &A,
|
|
485
|
+
const TSharedPtr<FJsonObject> &P,
|
|
486
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
487
|
+
return HandleRebuildMaterial(R, P, S);
|
|
488
|
+
});
|
|
489
|
+
|
|
490
|
+
RegisterHandler(TEXT("manage_behavior_tree"),
|
|
491
|
+
[this](const FString &R, const FString &A,
|
|
492
|
+
const TSharedPtr<FJsonObject> &P,
|
|
493
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
494
|
+
return HandleBehaviorTreeAction(R, A, P, S);
|
|
495
|
+
});
|
|
496
|
+
|
|
497
|
+
RegisterHandler(TEXT("manage_audio"),
|
|
498
|
+
[this](const FString &R, const FString &A,
|
|
499
|
+
const TSharedPtr<FJsonObject> &P,
|
|
500
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
501
|
+
return HandleAudioAction(R, A, P, S);
|
|
502
|
+
});
|
|
503
|
+
|
|
504
|
+
RegisterHandler(TEXT("manage_lighting"),
|
|
505
|
+
[this](const FString &R, const FString &A,
|
|
506
|
+
const TSharedPtr<FJsonObject> &P,
|
|
507
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
508
|
+
return HandleLightingAction(R, A, P, S);
|
|
509
|
+
});
|
|
510
|
+
|
|
511
|
+
RegisterHandler(TEXT("manage_physics"),
|
|
512
|
+
[this](const FString &R, const FString &A,
|
|
513
|
+
const TSharedPtr<FJsonObject> &P,
|
|
514
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
515
|
+
return HandleAnimationPhysicsAction(R, A, P, S);
|
|
516
|
+
});
|
|
517
|
+
|
|
518
|
+
RegisterHandler(TEXT("manage_effect"),
|
|
519
|
+
[this](const FString &R, const FString &A,
|
|
520
|
+
const TSharedPtr<FJsonObject> &P,
|
|
521
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
522
|
+
return HandleEffectAction(R, A, P, S);
|
|
523
|
+
});
|
|
524
|
+
|
|
525
|
+
// Common effect aliases used by the Node server; registering them here keeps
|
|
526
|
+
// dispatch O(1) and avoids relying on the late handler chain.
|
|
527
|
+
RegisterHandler(TEXT("create_effect"),
|
|
528
|
+
[this](const FString &R, const FString &A,
|
|
529
|
+
const TSharedPtr<FJsonObject> &P,
|
|
530
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
531
|
+
return HandleEffectAction(R, A, P, S);
|
|
532
|
+
});
|
|
533
|
+
RegisterHandler(TEXT("clear_debug_shapes"),
|
|
534
|
+
[this](const FString &R, const FString &A,
|
|
535
|
+
const TSharedPtr<FJsonObject> &P,
|
|
536
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
537
|
+
return HandleEffectAction(R, A, P, S);
|
|
538
|
+
});
|
|
539
|
+
|
|
540
|
+
RegisterHandler(TEXT("manage_performance"),
|
|
541
|
+
[this](const FString &R, const FString &A,
|
|
542
|
+
const TSharedPtr<FJsonObject> &P,
|
|
543
|
+
TSharedPtr<FMcpBridgeWebSocket> S) {
|
|
544
|
+
return HandlePerformanceAction(R, A, P, S);
|
|
545
|
+
});
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
// Drain and process any automation requests that were enqueued while the
|
|
549
|
+
// subsystem was busy. This implementation lives in the primary subsystem
|
|
550
|
+
// translation unit to ensure the symbol is available at link time for
|
|
551
|
+
/**
|
|
552
|
+
* @brief Processes all queued automation requests on the game thread.
|
|
553
|
+
*
|
|
554
|
+
* Ensures execution on the game thread (re-dispatches if called from another thread),
|
|
555
|
+
* moves the shared pending-request queue into a local list under a lock, clears the shared queue
|
|
556
|
+
* and the scheduled flag, then dispatches each request to ProcessAutomationRequest.
|
|
557
|
+
*/
|
|
558
|
+
void UMcpAutomationBridgeSubsystem::ProcessPendingAutomationRequests() {
|
|
559
|
+
if (!IsInGameThread()) {
|
|
560
|
+
AsyncTask(ENamedThreads::GameThread,
|
|
561
|
+
[this]() { this->ProcessPendingAutomationRequests(); });
|
|
562
|
+
return;
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
TArray<FPendingAutomationRequest> LocalQueue;
|
|
566
|
+
{
|
|
567
|
+
FScopeLock Lock(&PendingAutomationRequestsMutex);
|
|
568
|
+
if (PendingAutomationRequests.Num() == 0) {
|
|
569
|
+
bPendingRequestsScheduled = false;
|
|
570
|
+
return;
|
|
571
|
+
}
|
|
572
|
+
LocalQueue = MoveTemp(PendingAutomationRequests);
|
|
573
|
+
PendingAutomationRequests.Empty();
|
|
574
|
+
bPendingRequestsScheduled = false;
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
for (const FPendingAutomationRequest &Req : LocalQueue) {
|
|
578
|
+
ProcessAutomationRequest(Req.RequestId, Req.Action, Req.Payload,
|
|
579
|
+
Req.RequestingSocket);
|
|
580
|
+
}
|
|
581
|
+
}
|