unreal-engine-mcp-server 0.5.4 → 0.5.5
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/dist/automation/bridge.d.ts.map +1 -0
- package/dist/automation/bridge.js.map +1 -0
- package/dist/automation/connection-manager.d.ts.map +1 -0
- package/dist/automation/connection-manager.js.map +1 -0
- package/dist/automation/handshake.d.ts.map +1 -0
- package/dist/automation/handshake.js.map +1 -0
- package/dist/automation/index.d.ts.map +1 -0
- package/dist/automation/index.js.map +1 -0
- package/dist/automation/message-handler.d.ts.map +1 -0
- package/dist/automation/message-handler.js.map +1 -0
- package/dist/automation/request-tracker.d.ts.map +1 -0
- package/dist/automation/request-tracker.js.map +1 -0
- package/dist/automation/types.d.ts.map +1 -0
- package/dist/automation/types.js.map +1 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +4 -3
- package/dist/cli.js.map +1 -0
- package/dist/config/class-aliases.d.ts.map +1 -0
- package/dist/config/class-aliases.js.map +1 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js.map +1 -0
- package/dist/graphql/loaders.d.ts.map +1 -0
- package/dist/graphql/loaders.js.map +1 -0
- package/dist/graphql/resolvers.d.ts.map +1 -0
- package/dist/graphql/resolvers.js +29 -29
- package/dist/graphql/resolvers.js.map +1 -0
- package/dist/graphql/schema.d.ts.map +1 -0
- package/dist/graphql/schema.js.map +1 -0
- package/dist/graphql/server.d.ts.map +1 -0
- package/dist/graphql/server.js.map +1 -0
- package/dist/graphql/types.d.ts.map +1 -0
- package/dist/graphql/types.js.map +1 -0
- package/dist/handlers/resource-handlers.d.ts.map +1 -0
- package/dist/handlers/resource-handlers.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +64 -7
- package/dist/index.js.map +1 -0
- package/dist/resources/actors.d.ts.map +1 -0
- package/dist/resources/actors.js.map +1 -0
- package/dist/resources/assets.d.ts.map +1 -0
- package/dist/resources/assets.js +6 -4
- package/dist/resources/assets.js.map +1 -0
- package/dist/resources/levels.d.ts.map +1 -0
- package/dist/resources/levels.js.map +1 -0
- package/dist/server/resource-registry.d.ts.map +1 -0
- package/dist/server/resource-registry.js.map +1 -0
- package/dist/server/tool-registry.d.ts.map +1 -0
- package/dist/server/tool-registry.js.map +1 -0
- package/dist/server-setup.d.ts.map +1 -0
- package/dist/server-setup.js.map +1 -0
- package/dist/services/health-monitor.d.ts.map +1 -0
- package/dist/services/health-monitor.js.map +1 -0
- package/dist/services/metrics-server.d.ts.map +1 -0
- package/dist/services/metrics-server.js.map +1 -0
- package/dist/tools/actors.d.ts.map +1 -0
- package/dist/tools/actors.js +3 -1
- package/dist/tools/actors.js.map +1 -0
- package/dist/tools/animation.d.ts.map +1 -0
- package/dist/tools/animation.js +2 -2
- package/dist/tools/animation.js.map +1 -0
- package/dist/tools/assets.d.ts.map +1 -0
- package/dist/tools/assets.js.map +1 -0
- package/dist/tools/audio.d.ts.map +1 -0
- package/dist/tools/audio.js.map +1 -0
- package/dist/tools/base-tool.d.ts.map +1 -0
- package/dist/tools/base-tool.js.map +1 -0
- package/dist/tools/behavior-tree.d.ts.map +1 -0
- package/dist/tools/behavior-tree.js.map +1 -0
- package/dist/tools/blueprint.d.ts.map +1 -0
- package/dist/tools/blueprint.js +4 -2
- package/dist/tools/blueprint.js.map +1 -0
- package/dist/tools/consolidated-tool-definitions.d.ts.map +1 -0
- package/dist/tools/consolidated-tool-definitions.js.map +1 -0
- package/dist/tools/consolidated-tool-handlers.d.ts.map +1 -0
- package/dist/tools/consolidated-tool-handlers.js.map +1 -0
- package/dist/tools/debug.d.ts.map +1 -0
- package/dist/tools/debug.js +3 -1
- package/dist/tools/debug.js.map +1 -0
- package/dist/tools/dynamic-handler-registry.d.ts.map +1 -0
- package/dist/tools/dynamic-handler-registry.js +3 -1
- package/dist/tools/dynamic-handler-registry.js.map +1 -0
- package/dist/tools/editor.d.ts.map +1 -0
- package/dist/tools/editor.js +1 -1
- package/dist/tools/editor.js.map +1 -0
- package/dist/tools/engine.d.ts.map +1 -0
- package/dist/tools/engine.js.map +1 -0
- package/dist/tools/environment.d.ts.map +1 -0
- package/dist/tools/environment.js +2 -2
- package/dist/tools/environment.js.map +1 -0
- package/dist/tools/foliage.d.ts.map +1 -0
- package/dist/tools/foliage.js.map +1 -0
- package/dist/tools/handlers/actor-handlers.d.ts +1 -1
- package/dist/tools/handlers/actor-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/actor-handlers.js +6 -5
- package/dist/tools/handlers/actor-handlers.js.map +1 -0
- package/dist/tools/handlers/animation-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/animation-handlers.js.map +1 -0
- package/dist/tools/handlers/argument-helper.d.ts.map +1 -0
- package/dist/tools/handlers/argument-helper.js.map +1 -0
- package/dist/tools/handlers/asset-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/asset-handlers.js +5 -1
- package/dist/tools/handlers/asset-handlers.js.map +1 -0
- package/dist/tools/handlers/audio-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/audio-handlers.js.map +1 -0
- package/dist/tools/handlers/blueprint-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/blueprint-handlers.js +2 -1
- package/dist/tools/handlers/blueprint-handlers.js.map +1 -0
- package/dist/tools/handlers/common-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/common-handlers.js.map +1 -0
- package/dist/tools/handlers/editor-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/editor-handlers.js +12 -2
- package/dist/tools/handlers/editor-handlers.js.map +1 -0
- package/dist/tools/handlers/effect-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/effect-handlers.js.map +1 -0
- package/dist/tools/handlers/environment-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/environment-handlers.js.map +1 -0
- package/dist/tools/handlers/graph-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/graph-handlers.js +61 -1
- package/dist/tools/handlers/graph-handlers.js.map +1 -0
- package/dist/tools/handlers/input-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/input-handlers.js.map +1 -0
- package/dist/tools/handlers/inspect-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/inspect-handlers.js.map +1 -0
- package/dist/tools/handlers/level-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/level-handlers.js.map +1 -0
- package/dist/tools/handlers/lighting-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/lighting-handlers.js +23 -1
- package/dist/tools/handlers/lighting-handlers.js.map +1 -0
- package/dist/tools/handlers/performance-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/performance-handlers.js +15 -2
- package/dist/tools/handlers/performance-handlers.js.map +1 -0
- package/dist/tools/handlers/pipeline-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/pipeline-handlers.js.map +1 -0
- package/dist/tools/handlers/sequence-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/sequence-handlers.js.map +1 -0
- package/dist/tools/handlers/system-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/system-handlers.js +16 -1
- package/dist/tools/handlers/system-handlers.js.map +1 -0
- package/dist/tools/input.d.ts.map +1 -0
- package/dist/tools/input.js +3 -1
- package/dist/tools/input.js.map +1 -0
- package/dist/tools/introspection.d.ts.map +1 -0
- package/dist/tools/introspection.js.map +1 -0
- package/dist/tools/landscape.d.ts.map +1 -0
- package/dist/tools/landscape.js +3 -1
- package/dist/tools/landscape.js.map +1 -0
- package/dist/tools/level.d.ts.map +1 -0
- package/dist/tools/level.js.map +1 -0
- package/dist/tools/lighting.d.ts.map +1 -0
- package/dist/tools/lighting.js +3 -1
- package/dist/tools/lighting.js.map +1 -0
- package/dist/tools/logs.d.ts.map +1 -0
- package/dist/tools/logs.js.map +1 -0
- package/dist/tools/materials.d.ts.map +1 -0
- package/dist/tools/materials.js +3 -1
- package/dist/tools/materials.js.map +1 -0
- package/dist/tools/niagara.d.ts.map +1 -0
- package/dist/tools/niagara.js +7 -5
- package/dist/tools/niagara.js.map +1 -0
- package/dist/tools/performance.d.ts.map +1 -0
- package/dist/tools/performance.js.map +1 -0
- package/dist/tools/physics.d.ts.map +1 -0
- package/dist/tools/physics.js +9 -7
- package/dist/tools/physics.js.map +1 -0
- package/dist/tools/property-dictionary.d.ts.map +1 -0
- package/dist/tools/property-dictionary.js.map +1 -0
- package/dist/tools/sequence.d.ts.map +1 -0
- package/dist/tools/sequence.js +3 -1
- package/dist/tools/sequence.js.map +1 -0
- package/dist/tools/tool-definition-utils.d.ts.map +1 -0
- package/dist/tools/tool-definition-utils.js.map +1 -0
- package/dist/tools/ui.d.ts.map +1 -0
- package/dist/tools/ui.js +3 -1
- package/dist/tools/ui.js.map +1 -0
- package/dist/types/automation-responses.d.ts.map +1 -0
- package/dist/types/automation-responses.js.map +1 -0
- package/dist/types/env.d.ts.map +1 -0
- package/dist/types/env.js.map +1 -0
- package/dist/types/handler-types.d.ts.map +1 -0
- package/dist/types/handler-types.js.map +1 -0
- package/dist/types/tool-interfaces.d.ts.map +1 -0
- package/dist/types/tool-interfaces.js.map +1 -0
- package/dist/types/tool-types.d.ts.map +1 -0
- package/dist/types/tool-types.js.map +1 -0
- package/dist/unreal-bridge.d.ts +1 -0
- package/dist/unreal-bridge.d.ts.map +1 -0
- package/dist/unreal-bridge.js +8 -0
- package/dist/unreal-bridge.js.map +1 -0
- package/dist/utils/command-validator.d.ts.map +1 -0
- package/dist/utils/command-validator.js.map +1 -0
- package/dist/utils/elicitation.d.ts.map +1 -0
- package/dist/utils/elicitation.js.map +1 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/ini-reader.d.ts.map +1 -0
- package/dist/utils/ini-reader.js.map +1 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/normalize.d.ts.map +1 -0
- package/dist/utils/normalize.js.map +1 -0
- package/dist/utils/path-security.d.ts.map +1 -0
- package/dist/utils/path-security.js.map +1 -0
- package/dist/utils/response-factory.d.ts.map +1 -0
- package/dist/utils/response-factory.js +3 -1
- package/dist/utils/response-factory.js.map +1 -0
- package/dist/utils/response-validator.d.ts.map +1 -0
- package/dist/utils/response-validator.js.map +1 -0
- package/dist/utils/result-helpers.d.ts.map +1 -0
- package/dist/utils/result-helpers.js.map +1 -0
- package/dist/utils/safe-json.d.ts.map +1 -0
- package/dist/utils/safe-json.js.map +1 -0
- package/dist/utils/unreal-command-queue.d.ts.map +1 -0
- package/dist/utils/unreal-command-queue.js.map +1 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/wasm/index.d.ts.map +1 -0
- package/dist/wasm/index.js.map +1 -0
- package/package.json +12 -34
- package/server.json +2 -2
- package/.dockerignore +0 -57
- package/.env.example +0 -26
- package/.env.production +0 -61
- package/.eslintrc.json +0 -0
- package/.eslintrc.override.json +0 -8
- package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -94
- package/.github/ISSUE_TEMPLATE/config.yml +0 -8
- package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -56
- package/.github/copilot-instructions.md +0 -478
- package/.github/dependabot.yml +0 -19
- package/.github/labeler.yml +0 -24
- package/.github/labels.yml +0 -70
- package/.github/pull_request_template.md +0 -42
- package/.github/release-drafter-config.yml +0 -51
- package/.github/workflows/auto-merge.yml +0 -38
- package/.github/workflows/ci.yml +0 -38
- package/.github/workflows/dependency-review.yml +0 -17
- package/.github/workflows/gemini-issue-triage.yml +0 -172
- package/.github/workflows/greetings.yml +0 -27
- package/.github/workflows/labeler.yml +0 -17
- package/.github/workflows/links.yml +0 -80
- package/.github/workflows/pr-size-labeler.yml +0 -137
- package/.github/workflows/publish-mcp.yml +0 -79
- package/.github/workflows/release-drafter.yml +0 -24
- package/.github/workflows/release.yml +0 -112
- package/.github/workflows/semantic-pull-request.yml +0 -35
- package/.github/workflows/smoke-test.yml +0 -36
- package/.github/workflows/stale.yml +0 -28
- package/CONTRIBUTING.md +0 -140
- package/Dockerfile +0 -37
- package/GEMINI.md +0 -115
- package/Public/Plugin_setup_guide.mp4 +0 -0
- package/Public/icon.png +0 -0
- package/claude_desktop_config_example.json +0 -15
- package/dist/types/responses.d.ts +0 -249
- package/dist/types/responses.js +0 -2
- package/docs/GraphQL-API.md +0 -888
- package/docs/Migration-Guide-v0.5.0.md +0 -684
- package/docs/Roadmap.md +0 -53
- package/docs/WebAssembly-Integration.md +0 -628
- package/docs/editor-plugin-extension.md +0 -370
- package/docs/handler-mapping.md +0 -249
- package/docs/native-automation-progress.md +0 -128
- package/docs/testing-guide.md +0 -423
- package/eslint.config.mjs +0 -68
- package/mcp-config-example.json +0 -14
- package/plugins/McpAutomationBridge/Config/FilterPlugin.ini +0 -8
- package/plugins/McpAutomationBridge/McpAutomationBridge.uplugin +0 -64
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/McpAutomationBridge.Build.cs +0 -189
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.cpp +0 -22
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.h +0 -30
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeHelpers.h +0 -1983
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeModule.cpp +0 -72
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSettings.cpp +0 -46
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSubsystem.cpp +0 -846
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AnimationHandlers.cpp +0 -2393
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetQueryHandlers.cpp +0 -300
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetWorkflowHandlers.cpp +0 -2807
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AudioHandlers.cpp +0 -1087
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BehaviorTreeHandlers.cpp +0 -488
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.cpp +0 -643
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.h +0 -31
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintGraphHandlers.cpp +0 -1094
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers.cpp +0 -5750
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers_List.cpp +0 -152
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ControlHandlers.cpp +0 -2614
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_DebugHandlers.cpp +0 -42
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EditorFunctionHandlers.cpp +0 -1237
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EffectHandlers.cpp +0 -1725
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EnvironmentHandlers.cpp +0 -2265
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_FoliageHandlers.cpp +0 -954
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InputHandlers.cpp +0 -209
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InsightsHandlers.cpp +0 -41
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LandscapeHandlers.cpp +0 -1164
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LevelHandlers.cpp +0 -762
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LightingHandlers.cpp +0 -663
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LogHandlers.cpp +0 -136
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_MaterialGraphHandlers.cpp +0 -494
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraGraphHandlers.cpp +0 -278
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraHandlers.cpp +0 -625
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PerformanceHandlers.cpp +0 -401
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PipelineHandlers.cpp +0 -67
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ProcessRequest.cpp +0 -472
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PropertyHandlers.cpp +0 -2634
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_RenderHandlers.cpp +0 -189
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.cpp +0 -917
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.h +0 -39
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequenceHandlers.cpp +0 -2706
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequencerHandlers.cpp +0 -519
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_TestHandlers.cpp +0 -38
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_UiHandlers.cpp +0 -668
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_WorldPartitionHandlers.cpp +0 -346
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.cpp +0 -1345
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.h +0 -149
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpConnectionManager.cpp +0 -782
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSettings.h +0 -115
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSubsystem.h +0 -796
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpConnectionManager.h +0 -117
- package/scripts/check-unreal-connection.mjs +0 -19
- package/scripts/clean-tmp.js +0 -23
- package/scripts/patch-wasm.js +0 -26
- package/scripts/run-all-tests.mjs +0 -136
- package/scripts/smoke-test.ts +0 -94
- package/scripts/sync-mcp-plugin.js +0 -143
- package/scripts/test-no-plugin-alternates.mjs +0 -113
- package/scripts/validate-server.js +0 -46
- package/scripts/verify-automation-bridge.js +0 -200
- package/src/automation/bridge.ts +0 -630
- package/src/automation/connection-manager.ts +0 -148
- package/src/automation/handshake.ts +0 -99
- package/src/automation/index.ts +0 -2
- package/src/automation/message-handler.ts +0 -192
- package/src/automation/request-tracker.ts +0 -155
- package/src/automation/types.ts +0 -108
- package/src/cli.ts +0 -34
- package/src/config/class-aliases.ts +0 -65
- package/src/config.ts +0 -73
- package/src/constants.ts +0 -29
- package/src/graphql/loaders.ts +0 -244
- package/src/graphql/resolvers.ts +0 -1008
- package/src/graphql/schema.ts +0 -452
- package/src/graphql/server.ts +0 -156
- package/src/graphql/types.ts +0 -10
- package/src/handlers/resource-handlers.ts +0 -186
- package/src/index.ts +0 -243
- package/src/resources/actors.ts +0 -127
- package/src/resources/assets.ts +0 -286
- package/src/resources/levels.ts +0 -68
- package/src/server/resource-registry.ts +0 -47
- package/src/server/tool-registry.ts +0 -354
- package/src/server-setup.ts +0 -114
- package/src/services/health-monitor.ts +0 -132
- package/src/services/metrics-server.ts +0 -176
- package/src/tools/actors.ts +0 -564
- package/src/tools/animation.ts +0 -941
- package/src/tools/assets.ts +0 -394
- package/src/tools/audio.ts +0 -499
- package/src/tools/base-tool.ts +0 -52
- package/src/tools/behavior-tree.ts +0 -45
- package/src/tools/blueprint.ts +0 -940
- package/src/tools/consolidated-tool-definitions.ts +0 -1256
- package/src/tools/consolidated-tool-handlers.ts +0 -302
- package/src/tools/debug.ts +0 -622
- package/src/tools/dynamic-handler-registry.ts +0 -33
- package/src/tools/editor.ts +0 -435
- package/src/tools/engine.ts +0 -43
- package/src/tools/environment.ts +0 -281
- package/src/tools/foliage.ts +0 -596
- package/src/tools/handlers/actor-handlers.ts +0 -244
- package/src/tools/handlers/animation-handlers.ts +0 -237
- package/src/tools/handlers/argument-helper.ts +0 -142
- package/src/tools/handlers/asset-handlers.ts +0 -550
- package/src/tools/handlers/audio-handlers.ts +0 -194
- package/src/tools/handlers/blueprint-handlers.ts +0 -380
- package/src/tools/handlers/common-handlers.ts +0 -108
- package/src/tools/handlers/editor-handlers.ts +0 -124
- package/src/tools/handlers/effect-handlers.ts +0 -224
- package/src/tools/handlers/environment-handlers.ts +0 -183
- package/src/tools/handlers/graph-handlers.ts +0 -117
- package/src/tools/handlers/input-handlers.ts +0 -28
- package/src/tools/handlers/inspect-handlers.ts +0 -450
- package/src/tools/handlers/level-handlers.ts +0 -253
- package/src/tools/handlers/lighting-handlers.ts +0 -151
- package/src/tools/handlers/performance-handlers.ts +0 -132
- package/src/tools/handlers/pipeline-handlers.ts +0 -194
- package/src/tools/handlers/sequence-handlers.ts +0 -438
- package/src/tools/handlers/system-handlers.ts +0 -564
- package/src/tools/input.ts +0 -160
- package/src/tools/introspection.ts +0 -689
- package/src/tools/landscape.ts +0 -649
- package/src/tools/level.ts +0 -989
- package/src/tools/lighting.ts +0 -1052
- package/src/tools/logs.ts +0 -219
- package/src/tools/materials.ts +0 -295
- package/src/tools/niagara.ts +0 -485
- package/src/tools/performance.ts +0 -661
- package/src/tools/physics.ts +0 -679
- package/src/tools/property-dictionary.ts +0 -98
- package/src/tools/sequence.ts +0 -385
- package/src/tools/tool-definition-utils.ts +0 -35
- package/src/tools/ui.ts +0 -452
- package/src/types/automation-responses.ts +0 -119
- package/src/types/env.ts +0 -17
- package/src/types/handler-types.ts +0 -442
- package/src/types/responses.ts +0 -355
- package/src/types/tool-interfaces.ts +0 -250
- package/src/types/tool-types.ts +0 -575
- package/src/unreal-bridge.ts +0 -693
- package/src/utils/command-validator.ts +0 -139
- package/src/utils/elicitation.ts +0 -132
- package/src/utils/error-handler.ts +0 -287
- package/src/utils/ini-reader.ts +0 -86
- package/src/utils/logger.ts +0 -35
- package/src/utils/normalize.test.ts +0 -162
- package/src/utils/normalize.ts +0 -146
- package/src/utils/path-security.ts +0 -43
- package/src/utils/response-factory.ts +0 -44
- package/src/utils/response-validator.ts +0 -395
- package/src/utils/result-helpers.ts +0 -195
- package/src/utils/safe-json.test.ts +0 -90
- package/src/utils/safe-json.ts +0 -70
- package/src/utils/unreal-command-queue.ts +0 -166
- package/src/utils/validation.test.ts +0 -184
- package/src/utils/validation.ts +0 -312
- package/src/wasm/index.ts +0 -838
- package/test-server.mjs +0 -100
- package/tests/test-animation.mjs +0 -369
- package/tests/test-asset-advanced.mjs +0 -82
- package/tests/test-asset-graph.mjs +0 -311
- package/tests/test-audio.mjs +0 -417
- package/tests/test-automation-timeouts.mjs +0 -98
- package/tests/test-behavior-tree.mjs +0 -444
- package/tests/test-blueprint-graph.mjs +0 -410
- package/tests/test-blueprint.mjs +0 -577
- package/tests/test-client-mode.mjs +0 -86
- package/tests/test-console-command.mjs +0 -56
- package/tests/test-control-actor.mjs +0 -425
- package/tests/test-control-editor.mjs +0 -112
- package/tests/test-graphql.mjs +0 -372
- package/tests/test-input.mjs +0 -349
- package/tests/test-inspect.mjs +0 -302
- package/tests/test-landscape.mjs +0 -316
- package/tests/test-lighting.mjs +0 -428
- package/tests/test-manage-asset.mjs +0 -438
- package/tests/test-manage-level.mjs +0 -89
- package/tests/test-materials.mjs +0 -356
- package/tests/test-niagara.mjs +0 -185
- package/tests/test-no-inline-python.mjs +0 -122
- package/tests/test-performance.mjs +0 -539
- package/tests/test-plugin-handshake.mjs +0 -82
- package/tests/test-runner.mjs +0 -993
- package/tests/test-sequence.mjs +0 -104
- package/tests/test-system.mjs +0 -96
- package/tests/test-wasm.mjs +0 -283
- package/tests/test-world-partition.mjs +0 -215
- package/tsconfig.json +0 -56
- package/vitest.config.ts +0 -35
- package/wasm/Cargo.lock +0 -363
- package/wasm/Cargo.toml +0 -42
- package/wasm/LICENSE +0 -21
- package/wasm/README.md +0 -253
- package/wasm/src/dependency_resolver.rs +0 -377
- package/wasm/src/lib.rs +0 -153
- package/wasm/src/property_parser.rs +0 -271
- package/wasm/src/transform_math.rs +0 -396
- package/wasm/tests/integration.rs +0 -109
package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpConnectionManager.h
DELETED
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
#include "CoreMinimal.h"
|
|
4
|
-
#include "Containers/Ticker.h"
|
|
5
|
-
#include "Dom/JsonObject.h"
|
|
6
|
-
#include "Templates/SharedPointer.h"
|
|
7
|
-
#include "Misc/ScopeLock.h"
|
|
8
|
-
|
|
9
|
-
class FMcpBridgeWebSocket;
|
|
10
|
-
class UMcpAutomationBridgeSettings;
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Delegate for handling incoming automation requests.
|
|
14
|
-
* Params: RequestId, Action, Payload, RequestingSocket
|
|
15
|
-
*/
|
|
16
|
-
DECLARE_DELEGATE_FourParams(FMcpMessageReceivedCallback, const FString&, const FString&, const TSharedPtr<FJsonObject>&, TSharedPtr<FMcpBridgeWebSocket>);
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Manages WebSocket connections for the MCP Automation Bridge.
|
|
20
|
-
* Handles listening, connecting, reconnecting, heartbeats, and message dispatching.
|
|
21
|
-
*/
|
|
22
|
-
class MCPAUTOMATIONBRIDGE_API FMcpConnectionManager : public TSharedFromThis<FMcpConnectionManager>
|
|
23
|
-
{
|
|
24
|
-
public:
|
|
25
|
-
FMcpConnectionManager();
|
|
26
|
-
~FMcpConnectionManager();
|
|
27
|
-
|
|
28
|
-
void Initialize(const UMcpAutomationBridgeSettings* Settings);
|
|
29
|
-
void Start();
|
|
30
|
-
void Stop();
|
|
31
|
-
|
|
32
|
-
bool IsConnected() const;
|
|
33
|
-
bool IsBridgeActive() const { return bBridgeAvailable; }
|
|
34
|
-
|
|
35
|
-
bool SendRawMessage(const FString& Message);
|
|
36
|
-
void SendAutomationResponse(TSharedPtr<FMcpBridgeWebSocket> TargetSocket, const FString& RequestId, bool bSuccess, const FString& Message, const TSharedPtr<FJsonObject>& Result, const FString& ErrorCode);
|
|
37
|
-
void SendControlMessage(const TSharedPtr<FJsonObject>& Message);
|
|
38
|
-
|
|
39
|
-
void SetOnMessageReceived(FMcpMessageReceivedCallback InCallback);
|
|
40
|
-
|
|
41
|
-
// Request tracking helpers
|
|
42
|
-
int32 GetActiveSocketCount() const;
|
|
43
|
-
void RegisterRequestSocket(const FString& RequestId, TSharedPtr<FMcpBridgeWebSocket> Socket);
|
|
44
|
-
|
|
45
|
-
// Telemetry helpers
|
|
46
|
-
void StartRequestTelemetry(const FString& RequestId, const FString& Action);
|
|
47
|
-
void RecordAutomationTelemetry(const FString& RequestId, bool bSuccess, const FString& Message, const FString& ErrorCode);
|
|
48
|
-
|
|
49
|
-
bool Tick(float DeltaTime);
|
|
50
|
-
|
|
51
|
-
private:
|
|
52
|
-
void AttemptConnection();
|
|
53
|
-
void ForceReconnect(const FString& Reason, float ReconnectDelayOverride = -1.0f);
|
|
54
|
-
|
|
55
|
-
void HandleConnected(TSharedPtr<FMcpBridgeWebSocket> Socket);
|
|
56
|
-
void HandleClientConnected(TSharedPtr<FMcpBridgeWebSocket> ClientSocket);
|
|
57
|
-
void HandleConnectionError(TSharedPtr<FMcpBridgeWebSocket> Socket, const FString& Error);
|
|
58
|
-
void HandleServerConnectionError(const FString& Error);
|
|
59
|
-
void HandleClosed(TSharedPtr<FMcpBridgeWebSocket> Socket, int32 StatusCode, const FString& Reason, bool bWasClean);
|
|
60
|
-
void HandleMessage(TSharedPtr<FMcpBridgeWebSocket> Socket, const FString& Message);
|
|
61
|
-
void HandleHeartbeat(TSharedPtr<FMcpBridgeWebSocket> Socket);
|
|
62
|
-
|
|
63
|
-
void EmitAutomationTelemetrySummaryIfNeeded(double NowSeconds);
|
|
64
|
-
|
|
65
|
-
private:
|
|
66
|
-
TArray<TSharedPtr<FMcpBridgeWebSocket>> ActiveSockets;
|
|
67
|
-
TMap<FString, TSharedPtr<FMcpBridgeWebSocket>> PendingRequestsToSockets;
|
|
68
|
-
FTSTicker::FDelegateHandle TickerHandle;
|
|
69
|
-
FMcpMessageReceivedCallback OnMessageReceived;
|
|
70
|
-
|
|
71
|
-
// Configuration
|
|
72
|
-
FString EnvListenHost;
|
|
73
|
-
FString EnvListenPorts;
|
|
74
|
-
FString EndpointUrl;
|
|
75
|
-
FString CapabilityToken;
|
|
76
|
-
FString ServerName;
|
|
77
|
-
FString ServerVersion;
|
|
78
|
-
FString ActiveSessionId;
|
|
79
|
-
|
|
80
|
-
int32 ClientPort = 0;
|
|
81
|
-
float AutoReconnectDelaySeconds = 5.0f;
|
|
82
|
-
float HeartbeatTimeoutSeconds = 0.0f;
|
|
83
|
-
|
|
84
|
-
bool bRequireCapabilityToken = false;
|
|
85
|
-
bool bEnvListenPortsSet = false;
|
|
86
|
-
bool bHeartbeatTrackingEnabled = false;
|
|
87
|
-
|
|
88
|
-
// State
|
|
89
|
-
bool bBridgeAvailable = false;
|
|
90
|
-
bool bReconnectEnabled = true;
|
|
91
|
-
float TimeUntilReconnect = 0.0f;
|
|
92
|
-
double LastHeartbeatTimestamp = 0.0;
|
|
93
|
-
|
|
94
|
-
// Telemetry
|
|
95
|
-
struct FAutomationRequestTelemetry
|
|
96
|
-
{
|
|
97
|
-
FString Action;
|
|
98
|
-
double StartTimeSeconds = 0.0;
|
|
99
|
-
};
|
|
100
|
-
|
|
101
|
-
struct FAutomationActionStats
|
|
102
|
-
{
|
|
103
|
-
int32 SuccessCount = 0;
|
|
104
|
-
int32 FailureCount = 0;
|
|
105
|
-
double TotalSuccessDurationSeconds = 0.0;
|
|
106
|
-
double TotalFailureDurationSeconds = 0.0;
|
|
107
|
-
double LastDurationSeconds = 0.0;
|
|
108
|
-
double LastUpdatedSeconds = 0.0;
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
TMap<FString, FAutomationRequestTelemetry> ActiveRequestTelemetry;
|
|
112
|
-
TMap<FString, FAutomationActionStats> AutomationActionTelemetry;
|
|
113
|
-
double TelemetrySummaryIntervalSeconds = 120.0;
|
|
114
|
-
double LastTelemetrySummaryLogSeconds = 0.0;
|
|
115
|
-
|
|
116
|
-
mutable FCriticalSection PendingRequestsMutex;
|
|
117
|
-
};
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import net from 'node:net';
|
|
3
|
-
|
|
4
|
-
const HOST = process.env.MCP_AUTOMATION_WS_HOST || '127.0.0.1';
|
|
5
|
-
const PORT = process.env.MCP_AUTOMATION_WS_PORT ? parseInt(process.env.MCP_AUTOMATION_WS_PORT) : 8091;
|
|
6
|
-
console.log(`Checking connection to Unreal Engine on port ${PORT}...`);
|
|
7
|
-
|
|
8
|
-
function check(host, port, timeoutMs = 2000) {
|
|
9
|
-
return new Promise((resolve) => {
|
|
10
|
-
const socket = new net.Socket();
|
|
11
|
-
const timer = setTimeout(() => { try { socket.destroy(); } catch {} resolve(false); }, timeoutMs);
|
|
12
|
-
socket.once('error', () => { clearTimeout(timer); resolve(false); });
|
|
13
|
-
socket.connect(port, host, () => { clearTimeout(timer); try { socket.destroy(); } catch {} resolve(true); });
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
const ok = await check(HOST, PORT);
|
|
18
|
-
console.log(ok ? `OK: ${HOST}:${PORT} accepting TCP` : `DOWN: ${HOST}:${PORT} not reachable`);
|
|
19
|
-
process.exit(ok ? 0 : 1);
|
package/scripts/clean-tmp.js
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import { fileURLToPath } from 'url';
|
|
4
|
-
|
|
5
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
-
const __dirname = path.dirname(__filename);
|
|
7
|
-
|
|
8
|
-
const TMP_DIR = path.resolve(__dirname, '..', 'tmp');
|
|
9
|
-
if (!fs.existsSync(TMP_DIR)) {
|
|
10
|
-
console.log('No tmp directory present.');
|
|
11
|
-
process.exit(0);
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
for (const f of fs.readdirSync(TMP_DIR)) {
|
|
15
|
-
const p = path.join(TMP_DIR, f);
|
|
16
|
-
try {
|
|
17
|
-
fs.unlinkSync(p);
|
|
18
|
-
console.log('Removed', p);
|
|
19
|
-
} catch (e) {
|
|
20
|
-
console.warn('Failed to remove', p, e.message || e);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
console.log('tmp cleanup complete.');
|
package/scripts/patch-wasm.js
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import { fileURLToPath } from 'url';
|
|
4
|
-
|
|
5
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
-
const __dirname = path.dirname(__filename);
|
|
7
|
-
|
|
8
|
-
const wasmPkgPath = path.resolve(__dirname, '../src/wasm/pkg/unreal_mcp_wasm.js');
|
|
9
|
-
|
|
10
|
-
try {
|
|
11
|
-
if (fs.existsSync(wasmPkgPath)) {
|
|
12
|
-
let content = fs.readFileSync(wasmPkgPath, 'utf8');
|
|
13
|
-
if (content.includes('console.log(getObject(arg0));')) {
|
|
14
|
-
content = content.replace('console.log(getObject(arg0));', 'console.error(getObject(arg0));');
|
|
15
|
-
fs.writeFileSync(wasmPkgPath, content);
|
|
16
|
-
console.log('Successfully patched console.log to console.error in WASM bindings.');
|
|
17
|
-
} else {
|
|
18
|
-
console.log('WASM bindings already patched or console.log not found.');
|
|
19
|
-
}
|
|
20
|
-
} else {
|
|
21
|
-
console.warn('WASM binding file not found at:', wasmPkgPath);
|
|
22
|
-
}
|
|
23
|
-
} catch (error) {
|
|
24
|
-
console.error('Error patching WASM bindings:', error);
|
|
25
|
-
process.exit(1);
|
|
26
|
-
}
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { spawn } from 'node:child_process';
|
|
3
|
-
|
|
4
|
-
const tests = [
|
|
5
|
-
'test:control_actor', // 1
|
|
6
|
-
'test:control_editor', // 1
|
|
7
|
-
'test:manage_level', // crashed 1
|
|
8
|
-
'test:animation',
|
|
9
|
-
'test:materials',
|
|
10
|
-
'test:niagara',
|
|
11
|
-
'test:landscape',
|
|
12
|
-
'test:sequence', // crashed 1
|
|
13
|
-
'test:system',
|
|
14
|
-
'test:console_command',
|
|
15
|
-
'test:inspect',
|
|
16
|
-
'test:manage_asset',
|
|
17
|
-
'test:blueprint',
|
|
18
|
-
'test:blueprint_graph',
|
|
19
|
-
'test:audio',
|
|
20
|
-
'test:behavior_tree',
|
|
21
|
-
'test:lighting',
|
|
22
|
-
'test:performance',
|
|
23
|
-
'test:input',
|
|
24
|
-
'test:asset_graph',
|
|
25
|
-
'test:graphql',
|
|
26
|
-
'test:wasm:all',
|
|
27
|
-
'test:no-inline-python',
|
|
28
|
-
'test:plugin-handshake',
|
|
29
|
-
'test:asset_advanced',
|
|
30
|
-
'test:world_partition'
|
|
31
|
-
];
|
|
32
|
-
|
|
33
|
-
const isWindows = process.platform === 'win32';
|
|
34
|
-
const npmExecPath = process.env.npm_execpath;
|
|
35
|
-
const npmCommand = isWindows ? 'npm.cmd' : 'npm';
|
|
36
|
-
|
|
37
|
-
function spawnNpm(cmd) {
|
|
38
|
-
if (npmExecPath && npmExecPath.endsWith('.js')) {
|
|
39
|
-
return spawn(process.execPath, [npmExecPath, 'run', cmd], {
|
|
40
|
-
stdio: 'inherit',
|
|
41
|
-
cwd: process.cwd(),
|
|
42
|
-
env: process.env,
|
|
43
|
-
windowsHide: true
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
return spawn(npmCommand, ['run', cmd], {
|
|
47
|
-
stdio: 'inherit',
|
|
48
|
-
cwd: process.cwd(),
|
|
49
|
-
env: process.env,
|
|
50
|
-
windowsHide: true
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
function runOne(cmd) {
|
|
55
|
-
return new Promise((resolve) => {
|
|
56
|
-
const startedAt = Date.now();
|
|
57
|
-
const child = spawnNpm(cmd);
|
|
58
|
-
|
|
59
|
-
let errorMsg = '';
|
|
60
|
-
child.on('error', (err) => {
|
|
61
|
-
errorMsg = `Failed to launch npm run ${cmd}: ${err.message}`;
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
child.on('exit', (code, signal) => {
|
|
65
|
-
const durationMs = Date.now() - startedAt;
|
|
66
|
-
if (signal) {
|
|
67
|
-
resolve({ name: cmd, ok: false, code: null, signal, durationMs, error: `${cmd} terminated via signal ${signal}` });
|
|
68
|
-
} else {
|
|
69
|
-
resolve({ name: cmd, ok: code === 0, code, signal: null, durationMs, error: code === 0 ? null : (errorMsg || `${cmd} failed with code ${code}`) });
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
const forwardSignal = (sig) => {
|
|
74
|
-
if (child.killed) return;
|
|
75
|
-
child.kill(sig);
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
process.once('SIGTERM', forwardSignal);
|
|
79
|
-
|
|
80
|
-
child.once('exit', () => {
|
|
81
|
-
process.removeListener('SIGINT', forwardSignal);
|
|
82
|
-
process.removeListener('SIGTERM', forwardSignal);
|
|
83
|
-
});
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
(async () => {
|
|
88
|
-
// Pass 0: Build once
|
|
89
|
-
console.log('\n============================================================');
|
|
90
|
-
console.log('Running Pre-Test Build');
|
|
91
|
-
console.log('============================================================');
|
|
92
|
-
|
|
93
|
-
// Use runOne to execute the build command
|
|
94
|
-
// We can't use npm run build directly if it's not in the 'tests' array, so let's just trigger it.
|
|
95
|
-
const buildRes = await runOne('build');
|
|
96
|
-
if (!buildRes.ok) {
|
|
97
|
-
console.error(`\nBuild failed (code=${buildRes.code ?? 'n/a'}). Aborting tests.`);
|
|
98
|
-
process.exit(1);
|
|
99
|
-
}
|
|
100
|
-
console.log('Build completed successfully. Disabling auto-build for tests.');
|
|
101
|
-
|
|
102
|
-
// Set the environment variable to disable auto-build for subsequent tests
|
|
103
|
-
process.env.UNREAL_MCP_NO_AUTO_BUILD = '1';
|
|
104
|
-
// Force use of the just-built dist folder to prevent falling back to ts-node
|
|
105
|
-
// (which can happen if build:wasm updates timestamps in src/ after build:core)
|
|
106
|
-
process.env.UNREAL_MCP_FORCE_DIST = '1';
|
|
107
|
-
|
|
108
|
-
const results = [];
|
|
109
|
-
for (const t of tests) {
|
|
110
|
-
const res = await runOne(t);
|
|
111
|
-
results.push(res);
|
|
112
|
-
if (!res.ok) {
|
|
113
|
-
console.error(`\n${t} failed (code=${res.code ?? 'n/a'}, signal=${res.signal ?? 'n/a'}) after ${res.durationMs}ms`);
|
|
114
|
-
if (res.error) console.error(res.error);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// Summary
|
|
119
|
-
const passed = results.filter(r => r.ok).length;
|
|
120
|
-
const failed = results.length - passed;
|
|
121
|
-
console.log('\n============================================================');
|
|
122
|
-
console.log('Test Suite Summary');
|
|
123
|
-
console.log('============================================================');
|
|
124
|
-
for (const r of results) {
|
|
125
|
-
const status = r.ok ? 'PASSED' : 'FAILED';
|
|
126
|
-
console.log(`${status} - ${r.name} (${r.durationMs} ms)`);
|
|
127
|
-
}
|
|
128
|
-
console.log('------------------------------------------------------------');
|
|
129
|
-
console.log(`Total: ${results.length} Passed: ${passed} Failed: ${failed}`);
|
|
130
|
-
console.log('============================================================');
|
|
131
|
-
|
|
132
|
-
process.exit(failed > 0 ? 1 : 0);
|
|
133
|
-
})().catch((err) => {
|
|
134
|
-
console.error(err.message || err);
|
|
135
|
-
process.exit(1);
|
|
136
|
-
});
|
package/scripts/smoke-test.ts
DELETED
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { spawn } from 'child_process';
|
|
3
|
-
import path from 'path';
|
|
4
|
-
import { fileURLToPath } from 'url';
|
|
5
|
-
|
|
6
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
-
const serverPath = path.join(__dirname, '../dist/cli.js');
|
|
8
|
-
|
|
9
|
-
console.log('🚬 Running Smoke Test (Mock Mode)...');
|
|
10
|
-
console.log(`🔌 Server Path: ${serverPath}`);
|
|
11
|
-
|
|
12
|
-
const env = { ...process.env, MOCK_UNREAL_CONNECTION: 'true' };
|
|
13
|
-
|
|
14
|
-
const child = spawn('node', [serverPath], {
|
|
15
|
-
env,
|
|
16
|
-
stdio: ['pipe', 'pipe', 'inherit'] // pipe stdin/stdout, inherit stderr
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
const requests = [
|
|
20
|
-
{
|
|
21
|
-
jsonrpc: '2.0',
|
|
22
|
-
id: 1,
|
|
23
|
-
method: 'initialize',
|
|
24
|
-
params: {
|
|
25
|
-
protocolVersion: '2024-11-05',
|
|
26
|
-
capabilities: {},
|
|
27
|
-
clientInfo: { name: 'smoke-test', version: '1.0' }
|
|
28
|
-
}
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
jsonrpc: '2.0',
|
|
32
|
-
id: 2,
|
|
33
|
-
method: 'tools/list',
|
|
34
|
-
params: {}
|
|
35
|
-
}
|
|
36
|
-
];
|
|
37
|
-
|
|
38
|
-
let buffer = '';
|
|
39
|
-
let passed = false;
|
|
40
|
-
|
|
41
|
-
child.stdout.on('data', (data) => {
|
|
42
|
-
const chunk = data.toString();
|
|
43
|
-
buffer += chunk;
|
|
44
|
-
|
|
45
|
-
// Try to parse JSON lines
|
|
46
|
-
const lines = buffer.split('\n');
|
|
47
|
-
buffer = lines.pop() || ''; // Keep the incomplete last line
|
|
48
|
-
|
|
49
|
-
for (const line of lines) {
|
|
50
|
-
if (!line.trim()) continue;
|
|
51
|
-
try {
|
|
52
|
-
const msg = JSON.parse(line);
|
|
53
|
-
console.log('Received:', JSON.stringify(msg).substring(0, 100) + '...');
|
|
54
|
-
|
|
55
|
-
if (msg.id === 1 && msg.result) {
|
|
56
|
-
console.log('✅ Initialize success');
|
|
57
|
-
// Send list tools request
|
|
58
|
-
child.stdin.write(JSON.stringify(requests[1]) + '\n');
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
if (msg.id === 2 && msg.result) {
|
|
62
|
-
console.log(`✅ Tools check success: Found ${msg.result.tools?.length || 0} tools`);
|
|
63
|
-
passed = true;
|
|
64
|
-
child.kill();
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
} catch (_e) {
|
|
68
|
-
// Ignore non-JSON output (logs)
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
child.on('exit', (_code) => {
|
|
74
|
-
if (passed) {
|
|
75
|
-
console.log('🎉 Smoke Test PASSED');
|
|
76
|
-
process.exit(0);
|
|
77
|
-
} else {
|
|
78
|
-
console.error('❌ Smoke Test FAILED - Server exited without passing checks');
|
|
79
|
-
process.exit(1);
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
// Start by sending initialize
|
|
84
|
-
console.log('Sending initialize...');
|
|
85
|
-
child.stdin.write(JSON.stringify(requests[0]) + '\n');
|
|
86
|
-
|
|
87
|
-
// Timeout safety
|
|
88
|
-
setTimeout(() => {
|
|
89
|
-
if (!passed) {
|
|
90
|
-
console.error('❌ Timeout waiting for smoke test');
|
|
91
|
-
child.kill();
|
|
92
|
-
process.exit(1);
|
|
93
|
-
}
|
|
94
|
-
}, 10000);
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import fs from 'fs';
|
|
3
|
-
import path from 'path';
|
|
4
|
-
import { fileURLToPath } from 'url';
|
|
5
|
-
|
|
6
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
7
|
-
const __dirname = path.dirname(__filename);
|
|
8
|
-
|
|
9
|
-
const SOURCE_RELATIVE = ['..', 'plugins', 'McpAutomationBridge'];
|
|
10
|
-
const sourceDir = path.resolve(__dirname, ...SOURCE_RELATIVE);
|
|
11
|
-
|
|
12
|
-
function showHelp() {
|
|
13
|
-
const scriptName = path.basename(process.argv[1]);
|
|
14
|
-
console.log(`Usage: node ${scriptName} [--engine <engine_plugins_dir>] [--project <project_plugins_dir>] [--dry-run] [--clean-engine] [--clean-project]`);
|
|
15
|
-
console.log('Copies the MCP Automation Bridge plugin from this repository into Engine and/or Project plugin directories.');
|
|
16
|
-
console.log('--engine <dir> Path to the Engine/Plugins directory (the script appends McpAutomationBridge automatically).');
|
|
17
|
-
console.log('--project <dir> Path to the Project/Plugins directory (the script appends McpAutomationBridge automatically).');
|
|
18
|
-
console.log('--dry-run Log the operations without modifying the filesystem.');
|
|
19
|
-
console.log('--clean-engine Remove the destination engine plugin directory before copying.');
|
|
20
|
-
console.log('--clean-project Remove the destination project plugin directory before copying.');
|
|
21
|
-
console.log('--help Show this message.');
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function parseArgs(argv) {
|
|
25
|
-
const args = {
|
|
26
|
-
engine: null,
|
|
27
|
-
project: null,
|
|
28
|
-
dryRun: false,
|
|
29
|
-
cleanEngine: false,
|
|
30
|
-
cleanProject: false,
|
|
31
|
-
help: false
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
for (let i = 2; i < argv.length; i += 1) {
|
|
35
|
-
const token = argv[i];
|
|
36
|
-
switch (token) {
|
|
37
|
-
case '--engine':
|
|
38
|
-
args.engine = argv[++i];
|
|
39
|
-
break;
|
|
40
|
-
case '--project':
|
|
41
|
-
args.project = argv[++i];
|
|
42
|
-
break;
|
|
43
|
-
case '--dry-run':
|
|
44
|
-
args.dryRun = true;
|
|
45
|
-
break;
|
|
46
|
-
case '--clean-engine':
|
|
47
|
-
args.cleanEngine = true;
|
|
48
|
-
break;
|
|
49
|
-
case '--clean-project':
|
|
50
|
-
args.cleanProject = true;
|
|
51
|
-
break;
|
|
52
|
-
case '--help':
|
|
53
|
-
case '-h':
|
|
54
|
-
args.help = true;
|
|
55
|
-
break;
|
|
56
|
-
default:
|
|
57
|
-
console.error(`Unknown argument: ${token}`);
|
|
58
|
-
args.help = true;
|
|
59
|
-
break;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
return args;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
function ensureSourceExists() {
|
|
67
|
-
if (!fs.existsSync(sourceDir) || !fs.statSync(sourceDir).isDirectory()) {
|
|
68
|
-
throw new Error(`Source directory missing: ${sourceDir}`);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
function resolveDestination(rootDir, label) {
|
|
73
|
-
if (!rootDir) {
|
|
74
|
-
return null;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
const fullPath = path.resolve(rootDir, 'McpAutomationBridge');
|
|
78
|
-
if (!fs.existsSync(path.dirname(fullPath))) {
|
|
79
|
-
throw new Error(`Destination parent directory does not exist for ${label}: ${path.dirname(fullPath)}`);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
return fullPath;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
function removeDir(targetPath, dryRun) {
|
|
86
|
-
if (!fs.existsSync(targetPath)) {
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
if (dryRun) {
|
|
91
|
-
console.log(`[dry-run] Would remove directory: ${targetPath}`);
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
fs.rmSync(targetPath, { recursive: true, force: true });
|
|
96
|
-
console.log(`Removed existing directory: ${targetPath}`);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
function copyDir(targetPath, dryRun) {
|
|
100
|
-
if (dryRun) {
|
|
101
|
-
console.log(`[dry-run] Would copy ${sourceDir} -> ${targetPath}`);
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
fs.cpSync(sourceDir, targetPath, { recursive: true });
|
|
106
|
-
console.log(`Copied ${sourceDir} -> ${targetPath}`);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
function main() {
|
|
110
|
-
const args = parseArgs(process.argv);
|
|
111
|
-
|
|
112
|
-
if (args.help || (!args.engine && !args.project)) {
|
|
113
|
-
showHelp();
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
ensureSourceExists();
|
|
118
|
-
|
|
119
|
-
if (args.engine) {
|
|
120
|
-
const engineDest = resolveDestination(args.engine, 'engine');
|
|
121
|
-
if (args.cleanEngine) {
|
|
122
|
-
removeDir(engineDest, args.dryRun);
|
|
123
|
-
}
|
|
124
|
-
copyDir(engineDest, args.dryRun);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
if (args.project) {
|
|
128
|
-
const projectDest = resolveDestination(args.project, 'project');
|
|
129
|
-
if (args.cleanProject) {
|
|
130
|
-
removeDir(projectDest, args.dryRun);
|
|
131
|
-
}
|
|
132
|
-
copyDir(projectDest, args.dryRun);
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
console.log('Done. Remember to clear the plugin Binaries/Intermediate folders if requested by Unreal.');
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
try {
|
|
139
|
-
main();
|
|
140
|
-
} catch (err) {
|
|
141
|
-
console.error(`Error: ${err.message}`);
|
|
142
|
-
process.exitCode = 1;
|
|
143
|
-
}
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import fs from 'node:fs/promises';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import { fileURLToPath } from 'node:url';
|
|
5
|
-
|
|
6
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
-
const repoRoot = path.resolve(__dirname, '..');
|
|
8
|
-
const srcRoot = path.resolve(repoRoot, 'src');
|
|
9
|
-
|
|
10
|
-
function isPositionInsideLiteralOrComment(content, pos) {
|
|
11
|
-
let inSingle = false;
|
|
12
|
-
let inDouble = false;
|
|
13
|
-
let inBacktick = false;
|
|
14
|
-
let inLineComment = false;
|
|
15
|
-
let inBlockComment = false;
|
|
16
|
-
|
|
17
|
-
for (let i = 0; i < pos; i += 1) {
|
|
18
|
-
const ch = content[i];
|
|
19
|
-
const next = content[i + 1];
|
|
20
|
-
|
|
21
|
-
if (inLineComment) {
|
|
22
|
-
if (ch === '\n') inLineComment = false;
|
|
23
|
-
continue;
|
|
24
|
-
}
|
|
25
|
-
if (inBlockComment) {
|
|
26
|
-
if (ch === '*' && next === '/') {
|
|
27
|
-
inBlockComment = false; i += 1; continue;
|
|
28
|
-
}
|
|
29
|
-
continue;
|
|
30
|
-
}
|
|
31
|
-
if (inSingle) {
|
|
32
|
-
if (ch === "\\") { i += 1; continue; }
|
|
33
|
-
if (ch === "'") { inSingle = false; }
|
|
34
|
-
continue;
|
|
35
|
-
}
|
|
36
|
-
if (inDouble) {
|
|
37
|
-
if (ch === "\\") { i += 1; continue; }
|
|
38
|
-
if (ch === '"') { inDouble = false; }
|
|
39
|
-
continue;
|
|
40
|
-
}
|
|
41
|
-
if (inBacktick) {
|
|
42
|
-
if (ch === "\\") { i += 1; continue; }
|
|
43
|
-
if (ch === '`') { inBacktick = false; }
|
|
44
|
-
continue;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
if (ch === '/' && next === '/') { inLineComment = true; i += 1; continue; }
|
|
48
|
-
if (ch === '/' && next === '*') { inBlockComment = true; i += 1; continue; }
|
|
49
|
-
if (ch === "'") { inSingle = true; continue; }
|
|
50
|
-
if (ch === '"') { inDouble = true; continue; }
|
|
51
|
-
if (ch === '`') { inBacktick = true; continue; }
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
return inSingle || inDouble || inBacktick || inLineComment || inBlockComment;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
async function listTsFiles(dir) {
|
|
58
|
-
const out = [];
|
|
59
|
-
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
60
|
-
for (const ent of entries) {
|
|
61
|
-
if (ent.name === 'node_modules' || ent.name === 'dist' || ent.name === '.git') continue;
|
|
62
|
-
const full = path.join(dir, ent.name);
|
|
63
|
-
if (ent.isDirectory()) {
|
|
64
|
-
out.push(...(await listTsFiles(full)));
|
|
65
|
-
} else if (ent.isFile() && full.endsWith('.ts')) {
|
|
66
|
-
out.push(full);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
return out;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
function toLineCol(content, index) {
|
|
73
|
-
const before = content.slice(0, index);
|
|
74
|
-
const lines = before.split(/\r?\n/);
|
|
75
|
-
const line = lines.length;
|
|
76
|
-
const col = lines[lines.length - 1].length + 1;
|
|
77
|
-
return { line, col };
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
async function main() {
|
|
81
|
-
const pattern = /simulated\s*:/g;
|
|
82
|
-
const files = await listTsFiles(srcRoot);
|
|
83
|
-
const failures = [];
|
|
84
|
-
|
|
85
|
-
for (const f of files) {
|
|
86
|
-
const content = await fs.readFile(f, 'utf8');
|
|
87
|
-
let m;
|
|
88
|
-
while ((m = pattern.exec(content)) !== null) {
|
|
89
|
-
const idx = m.index;
|
|
90
|
-
if (isPositionInsideLiteralOrComment(content, idx)) continue;
|
|
91
|
-
const pos = toLineCol(content, idx);
|
|
92
|
-
const snippetLine = content.split(/\r?\n/)[pos.line - 1] ?? '';
|
|
93
|
-
failures.push({ file: f, line: pos.line, col: pos.col, snippet: snippetLine.trim() });
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
if (failures.length > 0) {
|
|
98
|
-
console.error('\nDetected per-tool "simulated" alternatives usages in TypeScript files:');
|
|
99
|
-
for (const fail of failures) {
|
|
100
|
-
console.error(`\n - ${path.relative(repoRoot, fail.file)}:${fail.line}:${fail.col} -> ${fail.snippet}`);
|
|
101
|
-
}
|
|
102
|
-
console.error('\nPer-tool simulated alternatives are disallowed. Replace simulated behavior with explicit plugin actions or return an explicit error (e.g. MISSING_ENGINE_PLUGINS).');
|
|
103
|
-
process.exitCode = 1;
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
console.log('No per-tool plugin "simulated" alternatives found in TypeScript source files.');
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
main().catch((err) => {
|
|
111
|
-
console.error('Test failed with unexpected error:', err);
|
|
112
|
-
process.exitCode = 2;
|
|
113
|
-
});
|