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,132 @@
|
|
|
1
|
+
import { UnrealBridge } from '../unreal-bridge.js';
|
|
2
|
+
import { Logger } from '../utils/logger.js';
|
|
3
|
+
|
|
4
|
+
export interface PerformanceMetrics {
|
|
5
|
+
totalRequests: number;
|
|
6
|
+
successfulRequests: number;
|
|
7
|
+
failedRequests: number;
|
|
8
|
+
averageResponseTime: number;
|
|
9
|
+
responseTimes: number[];
|
|
10
|
+
connectionStatus: 'connected' | 'disconnected' | 'error';
|
|
11
|
+
lastHealthCheck: Date;
|
|
12
|
+
uptime: number;
|
|
13
|
+
recentErrors: Array<{ time: string; scope: string; type: string; message: string; retriable: boolean }>;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export class HealthMonitor {
|
|
17
|
+
private logger: Logger;
|
|
18
|
+
public metrics: PerformanceMetrics;
|
|
19
|
+
private healthCheckTimer: NodeJS.Timeout | undefined;
|
|
20
|
+
private lastHealthSuccessAt = 0;
|
|
21
|
+
private readonly HEALTH_CHECK_INTERVAL_MS = 30000;
|
|
22
|
+
|
|
23
|
+
constructor(logger: Logger) {
|
|
24
|
+
this.logger = logger;
|
|
25
|
+
this.metrics = {
|
|
26
|
+
totalRequests: 0,
|
|
27
|
+
successfulRequests: 0,
|
|
28
|
+
failedRequests: 0,
|
|
29
|
+
averageResponseTime: 0,
|
|
30
|
+
responseTimes: [],
|
|
31
|
+
connectionStatus: 'disconnected',
|
|
32
|
+
lastHealthCheck: new Date(),
|
|
33
|
+
uptime: Date.now(),
|
|
34
|
+
recentErrors: []
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
trackPerformance(startTime: number, success: boolean) {
|
|
39
|
+
const responseTime = Date.now() - startTime;
|
|
40
|
+
this.metrics.totalRequests++;
|
|
41
|
+
if (success) {
|
|
42
|
+
this.metrics.successfulRequests++;
|
|
43
|
+
} else {
|
|
44
|
+
this.metrics.failedRequests++;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Keep last 100 response times for average calculation
|
|
48
|
+
this.metrics.responseTimes.push(responseTime);
|
|
49
|
+
if (this.metrics.responseTimes.length > 100) {
|
|
50
|
+
this.metrics.responseTimes.shift();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Calculate average
|
|
54
|
+
this.metrics.averageResponseTime = this.metrics.responseTimes.reduce((a, b) => a + b, 0) / this.metrics.responseTimes.length;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
recordError(errorResponse: any) {
|
|
58
|
+
try {
|
|
59
|
+
this.metrics.recentErrors.push({
|
|
60
|
+
time: new Date().toISOString(),
|
|
61
|
+
scope: (errorResponse as any).scope || 'unknown',
|
|
62
|
+
type: (errorResponse as any)._debug?.errorType || 'UNKNOWN',
|
|
63
|
+
message: (errorResponse as any).error || (errorResponse as any).message || 'Unknown error',
|
|
64
|
+
retriable: Boolean((errorResponse as any).retriable)
|
|
65
|
+
});
|
|
66
|
+
if (this.metrics.recentErrors.length > 20) this.metrics.recentErrors.splice(0, this.metrics.recentErrors.length - 20);
|
|
67
|
+
} catch { }
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async performHealthCheck(bridge: UnrealBridge): Promise<boolean> {
|
|
71
|
+
// If not connected, do not attempt any ping (stay quiet)
|
|
72
|
+
if (!bridge.isConnected) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
// Use a safe, no-op stats command that always exists
|
|
77
|
+
await bridge.executeConsoleCommand('stat none');
|
|
78
|
+
this.metrics.connectionStatus = 'connected';
|
|
79
|
+
this.metrics.lastHealthCheck = new Date();
|
|
80
|
+
this.lastHealthSuccessAt = Date.now();
|
|
81
|
+
return true;
|
|
82
|
+
} catch (err1) {
|
|
83
|
+
this.metrics.connectionStatus = 'error';
|
|
84
|
+
this.metrics.lastHealthCheck = new Date();
|
|
85
|
+
// Avoid noisy warnings when engine may be shutting down; log at debug
|
|
86
|
+
this.logger.debug('Health check failed (console):', err1);
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
startHealthChecks(bridge: UnrealBridge) {
|
|
92
|
+
if (this.healthCheckTimer) return;
|
|
93
|
+
this.lastHealthSuccessAt = Date.now();
|
|
94
|
+
this.healthCheckTimer = setInterval(async () => {
|
|
95
|
+
// Only attempt health pings while connected; stay silent otherwise
|
|
96
|
+
if (!bridge.isConnected) {
|
|
97
|
+
// Optionally pause fully after 5 minutes of no success
|
|
98
|
+
const FIVE_MIN_MS = 5 * 60 * 1000;
|
|
99
|
+
if (!this.lastHealthSuccessAt || Date.now() - this.lastHealthSuccessAt > FIVE_MIN_MS) {
|
|
100
|
+
if (this.healthCheckTimer) {
|
|
101
|
+
clearInterval(this.healthCheckTimer);
|
|
102
|
+
this.healthCheckTimer = undefined;
|
|
103
|
+
}
|
|
104
|
+
this.logger.info('Health checks paused after 5 minutes without a successful response');
|
|
105
|
+
}
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
await this.performHealthCheck(bridge);
|
|
110
|
+
// Stop sending echoes if we haven't had a successful response in > 5 minutes
|
|
111
|
+
const FIVE_MIN_MS = 5 * 60 * 1000;
|
|
112
|
+
if (!this.lastHealthSuccessAt || Date.now() - this.lastHealthSuccessAt > FIVE_MIN_MS) {
|
|
113
|
+
if (this.healthCheckTimer) {
|
|
114
|
+
clearInterval(this.healthCheckTimer);
|
|
115
|
+
this.healthCheckTimer = undefined;
|
|
116
|
+
this.logger.info('Health checks paused after 5 minutes without a successful response');
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}, this.HEALTH_CHECK_INTERVAL_MS);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
stopHealthChecks() {
|
|
123
|
+
if (this.healthCheckTimer) {
|
|
124
|
+
clearInterval(this.healthCheckTimer);
|
|
125
|
+
this.healthCheckTimer = undefined;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
setLastHealthSuccessAt(time: number) {
|
|
130
|
+
this.lastHealthSuccessAt = time;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import http from 'http';
|
|
2
|
+
import { HealthMonitor } from './health-monitor.js';
|
|
3
|
+
import { AutomationBridge } from '../automation/index.js';
|
|
4
|
+
import { Logger } from '../utils/logger.js';
|
|
5
|
+
import { wasmIntegration } from '../wasm/index.js';
|
|
6
|
+
import { DEFAULT_AUTOMATION_HOST } from '../constants.js';
|
|
7
|
+
|
|
8
|
+
interface MetricsServerOptions {
|
|
9
|
+
healthMonitor: HealthMonitor;
|
|
10
|
+
automationBridge: AutomationBridge;
|
|
11
|
+
logger: Logger;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function formatPrometheusMetrics(options: MetricsServerOptions): string {
|
|
15
|
+
const { healthMonitor, automationBridge } = options;
|
|
16
|
+
const m = healthMonitor.metrics;
|
|
17
|
+
const status = automationBridge.getStatus();
|
|
18
|
+
const wasmMetrics = wasmIntegration.getMetrics();
|
|
19
|
+
const wasmStatus = wasmIntegration.getStatus();
|
|
20
|
+
|
|
21
|
+
const lines: string[] = [];
|
|
22
|
+
|
|
23
|
+
// Basic request counters
|
|
24
|
+
lines.push('# HELP unreal_mcp_requests_total Total number of tool requests seen by the MCP server.');
|
|
25
|
+
lines.push('# TYPE unreal_mcp_requests_total counter');
|
|
26
|
+
lines.push(`unreal_mcp_requests_total ${m.totalRequests}`);
|
|
27
|
+
|
|
28
|
+
lines.push('# HELP unreal_mcp_requests_success_total Total number of successful tool requests.');
|
|
29
|
+
lines.push('# TYPE unreal_mcp_requests_success_total counter');
|
|
30
|
+
lines.push(`unreal_mcp_requests_success_total ${m.successfulRequests}`);
|
|
31
|
+
|
|
32
|
+
lines.push('# HELP unreal_mcp_requests_failed_total Total number of failed tool requests.');
|
|
33
|
+
lines.push('# TYPE unreal_mcp_requests_failed_total counter');
|
|
34
|
+
lines.push(`unreal_mcp_requests_failed_total ${m.failedRequests}`);
|
|
35
|
+
|
|
36
|
+
// Response time summary (simple gauges)
|
|
37
|
+
lines.push('# HELP unreal_mcp_average_response_time_ms Average response time of recent tool requests (ms).');
|
|
38
|
+
lines.push('# TYPE unreal_mcp_average_response_time_ms gauge');
|
|
39
|
+
lines.push(`unreal_mcp_average_response_time_ms ${Number.isFinite(m.averageResponseTime) ? m.averageResponseTime.toFixed(2) : '0'}`);
|
|
40
|
+
|
|
41
|
+
// Connection status gauges
|
|
42
|
+
lines.push('# HELP unreal_mcp_unreal_connected Whether the Unreal automation bridge is currently connected (1) or not (0).');
|
|
43
|
+
lines.push('# TYPE unreal_mcp_unreal_connected gauge');
|
|
44
|
+
lines.push(`unreal_mcp_unreal_connected ${status.connected ? 1 : 0}`);
|
|
45
|
+
|
|
46
|
+
lines.push('# HELP unreal_mcp_automation_pending_requests Number of pending automation bridge requests.');
|
|
47
|
+
lines.push('# TYPE unreal_mcp_automation_pending_requests gauge');
|
|
48
|
+
lines.push(`unreal_mcp_automation_pending_requests ${status.pendingRequests}`);
|
|
49
|
+
|
|
50
|
+
lines.push('# HELP unreal_mcp_automation_max_pending_requests Configured maximum number of pending automation bridge requests.');
|
|
51
|
+
lines.push('# TYPE unreal_mcp_automation_max_pending_requests gauge');
|
|
52
|
+
lines.push(`unreal_mcp_automation_max_pending_requests ${status.maxPendingRequests}`);
|
|
53
|
+
|
|
54
|
+
lines.push('# HELP unreal_mcp_automation_max_concurrent_connections Configured maximum concurrent automation bridge connections.');
|
|
55
|
+
lines.push('# TYPE unreal_mcp_automation_max_concurrent_connections gauge');
|
|
56
|
+
lines.push(`unreal_mcp_automation_max_concurrent_connections ${status.maxConcurrentConnections}`);
|
|
57
|
+
|
|
58
|
+
// WASM integration metrics
|
|
59
|
+
lines.push('# HELP unreal_mcp_wasm_enabled Whether the optional WebAssembly integration is enabled (1) or not (0).');
|
|
60
|
+
lines.push('# TYPE unreal_mcp_wasm_enabled gauge');
|
|
61
|
+
lines.push(`unreal_mcp_wasm_enabled ${wasmStatus.enabled ? 1 : 0}`);
|
|
62
|
+
|
|
63
|
+
lines.push('# HELP unreal_mcp_wasm_ready Whether the WebAssembly module has been initialized successfully (1) or not (0).');
|
|
64
|
+
lines.push('# TYPE unreal_mcp_wasm_ready gauge');
|
|
65
|
+
lines.push(`unreal_mcp_wasm_ready ${wasmStatus.ready ? 1 : 0}`);
|
|
66
|
+
|
|
67
|
+
lines.push('# HELP unreal_mcp_wasm_operations_total Total number of WASM-related operations recorded by the integration layer.');
|
|
68
|
+
lines.push('# TYPE unreal_mcp_wasm_operations_total counter');
|
|
69
|
+
lines.push(`unreal_mcp_wasm_operations_total ${wasmMetrics.totalOperations}`);
|
|
70
|
+
|
|
71
|
+
lines.push('# HELP unreal_mcp_wasm_operations_wasm_total Number of operations that used the WebAssembly implementation.');
|
|
72
|
+
lines.push('# TYPE unreal_mcp_wasm_operations_wasm_total counter');
|
|
73
|
+
lines.push(`unreal_mcp_wasm_operations_wasm_total ${wasmMetrics.wasmOperations}`);
|
|
74
|
+
|
|
75
|
+
lines.push('# HELP unreal_mcp_wasm_operations_ts_total Number of operations that used the TypeScript fallback implementation.');
|
|
76
|
+
lines.push('# TYPE unreal_mcp_wasm_operations_ts_total counter');
|
|
77
|
+
lines.push(`unreal_mcp_wasm_operations_ts_total ${wasmMetrics.tsOperations}`);
|
|
78
|
+
|
|
79
|
+
// Uptime in seconds
|
|
80
|
+
const uptimeSeconds = Math.floor((Date.now() - m.uptime) / 1000);
|
|
81
|
+
lines.push('# HELP unreal_mcp_uptime_seconds MCP server uptime in seconds (since HealthMonitor was created).');
|
|
82
|
+
lines.push('# TYPE unreal_mcp_uptime_seconds gauge');
|
|
83
|
+
lines.push(`unreal_mcp_uptime_seconds ${uptimeSeconds}`);
|
|
84
|
+
|
|
85
|
+
return lines.join('\n') + '\n';
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function startMetricsServer(options: MetricsServerOptions): void {
|
|
89
|
+
const { logger } = options;
|
|
90
|
+
|
|
91
|
+
const portEnv = process.env.MCP_METRICS_PORT || process.env.PROMETHEUS_PORT;
|
|
92
|
+
const port = portEnv ? Number(portEnv) : 0;
|
|
93
|
+
|
|
94
|
+
if (!port || !Number.isFinite(port) || port <= 0) {
|
|
95
|
+
logger.debug('Metrics server disabled (set MCP_METRICS_PORT to enable Prometheus /metrics endpoint).');
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
try {
|
|
100
|
+
const server = http.createServer((req, res) => {
|
|
101
|
+
if (!req.url) {
|
|
102
|
+
res.statusCode = 400;
|
|
103
|
+
res.end('Bad Request');
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (req.method !== 'GET') {
|
|
108
|
+
res.statusCode = 405;
|
|
109
|
+
res.setHeader('Allow', 'GET');
|
|
110
|
+
res.end('Method Not Allowed');
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (!req.url.startsWith('/metrics')) {
|
|
115
|
+
res.statusCode = 404;
|
|
116
|
+
res.end('Not Found');
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
try {
|
|
121
|
+
const body = formatPrometheusMetrics(options);
|
|
122
|
+
res.statusCode = 200;
|
|
123
|
+
res.setHeader('Content-Type', 'text/plain; version=0.0.4; charset=utf-8');
|
|
124
|
+
res.end(body);
|
|
125
|
+
} catch (err) {
|
|
126
|
+
logger.warn('Failed to render /metrics payload', err as any);
|
|
127
|
+
res.statusCode = 500;
|
|
128
|
+
res.end('Internal Server Error');
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
server.listen(port, () => {
|
|
133
|
+
logger.info(`Prometheus metrics server listening on http://${DEFAULT_AUTOMATION_HOST}:${port}/metrics`);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
server.on('error', (err) => {
|
|
137
|
+
logger.warn('Metrics server error', err as any);
|
|
138
|
+
});
|
|
139
|
+
} catch (err) {
|
|
140
|
+
logger.warn('Failed to start metrics server', err as any);
|
|
141
|
+
}
|
|
142
|
+
}
|