unreal-engine-mcp-server 0.4.6 → 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 +269 -22
- package/CONTRIBUTING.md +140 -0
- package/README.md +166 -72
- 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 -604
- 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 +5475 -1627
- package/dist/tools/consolidated-tool-definitions.js +829 -482
- package/dist/tools/consolidated-tool-handlers.d.ts +2 -1
- package/dist/tools/consolidated-tool-handlers.js +211 -1009
- 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 +45 -0
- package/dist/tools/logs.js +210 -0
- 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 +195 -11
- 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 -649
- 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 -500
- package/src/tools/consolidated-tool-handlers.ts +272 -1122
- 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 +219 -0
- 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 +250 -13
- 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 -572
- 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
package/dist/tools/ui.js
CHANGED
|
@@ -1,228 +1,167 @@
|
|
|
1
1
|
import { bestEffortInterpretedText, interpretStandardResult } from '../utils/result-helpers.js';
|
|
2
2
|
export class UITools {
|
|
3
3
|
bridge;
|
|
4
|
-
|
|
4
|
+
automationBridge;
|
|
5
|
+
constructor(bridge, automationBridge) {
|
|
5
6
|
this.bridge = bridge;
|
|
7
|
+
this.automationBridge = automationBridge;
|
|
8
|
+
}
|
|
9
|
+
setAutomationBridge(automationBridge) {
|
|
10
|
+
this.automationBridge = automationBridge;
|
|
6
11
|
}
|
|
7
|
-
// Create widget blueprint
|
|
8
12
|
async createWidget(params) {
|
|
9
13
|
const path = params.savePath || '/Game/UI/Widgets';
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
pass
|
|
32
|
-
asset = asset_tools.create_asset(asset_name=name, package_path=path, asset_class=unreal.WidgetBlueprint, factory=factory)
|
|
33
|
-
if asset:
|
|
34
|
-
unreal.EditorAssetLibrary.save_asset(f"{path}/{name}")
|
|
35
|
-
print('RESULT:' + json.dumps({'success': True}))
|
|
36
|
-
else:
|
|
37
|
-
print('RESULT:' + json.dumps({'success': False, 'error': 'Failed to create WidgetBlueprint'}))
|
|
38
|
-
except Exception as e:
|
|
39
|
-
print('RESULT:' + json.dumps({'success': False, 'error': str(e)}))
|
|
40
|
-
`.trim();
|
|
41
|
-
try {
|
|
42
|
-
const resp = await this.bridge.executePython(py);
|
|
43
|
-
const interpreted = interpretStandardResult(resp, {
|
|
44
|
-
successMessage: 'Widget blueprint created',
|
|
45
|
-
failureMessage: 'Failed to create WidgetBlueprint'
|
|
46
|
-
});
|
|
47
|
-
if (interpreted.success) {
|
|
48
|
-
return { success: true, message: interpreted.message };
|
|
14
|
+
if (this.automationBridge && typeof this.automationBridge.sendAutomationRequest === 'function') {
|
|
15
|
+
try {
|
|
16
|
+
const resp = await this.automationBridge.sendAutomationRequest('system_control', {
|
|
17
|
+
action: 'create_widget',
|
|
18
|
+
name: params.name,
|
|
19
|
+
widgetType: params.type,
|
|
20
|
+
savePath: path
|
|
21
|
+
});
|
|
22
|
+
if (resp && resp.success !== false) {
|
|
23
|
+
const result = resp.result ?? resp;
|
|
24
|
+
const resultObj = result && typeof result === 'object' ? result : undefined;
|
|
25
|
+
const widgetPath = typeof resultObj?.widgetPath === 'string' ? resultObj.widgetPath : `${path}/${params.name}`;
|
|
26
|
+
const message = resp.message || `Widget created at ${widgetPath}`;
|
|
27
|
+
return {
|
|
28
|
+
success: true,
|
|
29
|
+
message,
|
|
30
|
+
widgetPath,
|
|
31
|
+
exists: Boolean(resultObj?.exists),
|
|
32
|
+
...(resultObj || {})
|
|
33
|
+
};
|
|
34
|
+
}
|
|
49
35
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
36
|
+
catch (error) {
|
|
37
|
+
console.warn('UITools.createWidget automation bridge request failed, falling back to editor function:', error);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
const payload = {
|
|
42
|
+
asset_name: params.name,
|
|
43
|
+
package_path: path,
|
|
44
|
+
factory_class: 'WidgetBlueprintFactory',
|
|
45
|
+
asset_class: 'unreal.WidgetBlueprint'
|
|
54
46
|
};
|
|
47
|
+
const resp = await this.bridge.executeEditorFunction('CREATE_ASSET', payload);
|
|
48
|
+
const result = resp && typeof resp === 'object' ? (resp.result ?? resp) : resp;
|
|
49
|
+
if (result && (result.success === true || result.created === true || Boolean(result.path))) {
|
|
50
|
+
return { success: true, message: result.message ?? `Widget created at ${result.path ?? `${path}/${params.name}`}` };
|
|
51
|
+
}
|
|
52
|
+
if (result && result.success === false) {
|
|
53
|
+
return { success: false, error: result.error ?? result.message ?? 'Failed to create widget blueprint', details: result };
|
|
54
|
+
}
|
|
55
|
+
return { success: false, error: 'Failed to create widget blueprint' };
|
|
55
56
|
}
|
|
56
57
|
catch (e) {
|
|
57
58
|
return { success: false, error: `Failed to create widget blueprint: ${e}` };
|
|
58
59
|
}
|
|
59
60
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const commands = [];
|
|
63
|
-
commands.push(`AddWidgetComponent ${params.widgetName} ${params.componentType} ${params.componentName}`);
|
|
64
|
-
if (params.slot) {
|
|
65
|
-
if (params.slot.position) {
|
|
66
|
-
commands.push(`SetWidgetPosition ${params.widgetName}.${params.componentName} ${params.slot.position.join(' ')}`);
|
|
67
|
-
}
|
|
68
|
-
if (params.slot.size) {
|
|
69
|
-
commands.push(`SetWidgetSize ${params.widgetName}.${params.componentName} ${params.slot.size.join(' ')}`);
|
|
70
|
-
}
|
|
71
|
-
if (params.slot.anchor) {
|
|
72
|
-
commands.push(`SetWidgetAnchor ${params.widgetName}.${params.componentName} ${params.slot.anchor.join(' ')}`);
|
|
73
|
-
}
|
|
74
|
-
if (params.slot.alignment) {
|
|
75
|
-
commands.push(`SetWidgetAlignment ${params.widgetName}.${params.componentName} ${params.slot.alignment.join(' ')}`);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
await this.bridge.executeConsoleCommands(commands);
|
|
79
|
-
return { success: true, message: `Component ${params.componentName} added to widget` };
|
|
61
|
+
async showWidget(widgetPath) {
|
|
62
|
+
return this.addWidgetToViewport({ widgetClass: widgetPath });
|
|
80
63
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
commands.push(`SetWidgetText ${params.widgetName}.${params.componentName} "${params.text}"`);
|
|
85
|
-
if (params.fontSize !== undefined) {
|
|
86
|
-
commands.push(`SetWidgetFontSize ${params.widgetName}.${params.componentName} ${params.fontSize}`);
|
|
64
|
+
async addWidgetComponent(_params) {
|
|
65
|
+
if (!this.automationBridge) {
|
|
66
|
+
throw new Error('Automation bridge required for widget component operations');
|
|
87
67
|
}
|
|
88
|
-
|
|
89
|
-
|
|
68
|
+
try {
|
|
69
|
+
const response = await this.automationBridge.sendAutomationRequest('manage_ui', {
|
|
70
|
+
action: 'add_widget_child',
|
|
71
|
+
widgetPath: _params.widgetName,
|
|
72
|
+
childClass: _params.componentType,
|
|
73
|
+
parentName: _params.slot ? 'Root' : undefined,
|
|
74
|
+
});
|
|
75
|
+
return response.success
|
|
76
|
+
? { success: true, message: response.message || 'Widget component added', ...(response.result || {}) }
|
|
77
|
+
: { success: false, error: response.error || response.message || 'Failed to add widget component' };
|
|
90
78
|
}
|
|
91
|
-
|
|
92
|
-
|
|
79
|
+
catch (error) {
|
|
80
|
+
return { success: false, error: `Failed to add widget component: ${error instanceof Error ? error.message : String(error)}` };
|
|
93
81
|
}
|
|
94
|
-
await this.bridge.executeConsoleCommands(commands);
|
|
95
|
-
return { success: true, message: 'Widget text updated' };
|
|
96
82
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
commands.push(`SetWidgetImage ${params.widgetName}.${params.componentName} ${params.imagePath}`);
|
|
101
|
-
if (params.tint) {
|
|
102
|
-
commands.push(`SetWidgetImageTint ${params.widgetName}.${params.componentName} ${params.tint.join(' ')}`);
|
|
83
|
+
async setWidgetText(_params) {
|
|
84
|
+
if (!this.automationBridge) {
|
|
85
|
+
throw new Error('Automation bridge required for setting widget text');
|
|
103
86
|
}
|
|
104
|
-
|
|
105
|
-
|
|
87
|
+
try {
|
|
88
|
+
const response = await this.automationBridge.sendAutomationRequest('system_control', {
|
|
89
|
+
subAction: 'set_widget_text',
|
|
90
|
+
key: _params.key,
|
|
91
|
+
value: _params.value
|
|
92
|
+
});
|
|
93
|
+
return response.success
|
|
94
|
+
? { success: true, message: response.message || 'Widget text set', ...(response.result || {}) }
|
|
95
|
+
: { success: false, error: response.error || response.message || 'Failed to set widget text' };
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
return { success: false, error: `Failed to set widget text: ${error instanceof Error ? error.message : String(error)}` };
|
|
106
99
|
}
|
|
107
|
-
await this.bridge.executeConsoleCommands(commands);
|
|
108
|
-
return { success: true, message: 'Widget image updated' };
|
|
109
100
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
101
|
+
async setWidgetImage(_params) {
|
|
102
|
+
if (!this.automationBridge) {
|
|
103
|
+
throw new Error('Automation bridge required for setting widget images');
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
const response = await this.automationBridge.sendAutomationRequest('system_control', {
|
|
107
|
+
subAction: 'set_widget_image',
|
|
108
|
+
key: _params.key,
|
|
109
|
+
texturePath: _params.texturePath
|
|
110
|
+
});
|
|
111
|
+
return response.success
|
|
112
|
+
? { success: true, message: response.message || 'Widget image set', ...(response.result || {}) }
|
|
113
|
+
: { success: false, error: response.error || response.message || 'Failed to set widget image' };
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
return { success: false, error: `Failed to set widget image: ${error instanceof Error ? error.message : String(error)}` };
|
|
119
117
|
}
|
|
120
|
-
await this.bridge.executeConsoleCommands(commands);
|
|
121
|
-
return { success: true, message: `HUD ${params.name} created` };
|
|
122
118
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
const widgetName = params.widgetName?.trim();
|
|
127
|
-
if (!widgetName) {
|
|
128
|
-
return { success: false, error: 'widgetName is required' };
|
|
119
|
+
async createHUD(_params) {
|
|
120
|
+
if (!this.automationBridge) {
|
|
121
|
+
throw new Error('Automation bridge required for creating HUDs');
|
|
129
122
|
}
|
|
130
|
-
const
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
if unreal.EditorAssetLibrary.does_asset_exist(path):
|
|
143
|
-
found_path = path
|
|
144
|
-
break
|
|
145
|
-
|
|
146
|
-
print('RESULT:' + json.dumps({'success': bool(found_path), 'path': found_path, 'candidates': candidates}))
|
|
147
|
-
`.trim();
|
|
148
|
-
const verify = await this.bridge.executePythonWithResult(verifyScript);
|
|
149
|
-
if (!verify?.success) {
|
|
150
|
-
return { success: false, error: `Widget asset not found for ${widgetName}` };
|
|
123
|
+
const widgetPath = _params.name.startsWith('/Game') ? _params.name : `/Game/UI/${_params.name}`;
|
|
124
|
+
try {
|
|
125
|
+
const response = await this.automationBridge.sendAutomationRequest('system_control', {
|
|
126
|
+
subAction: 'create_hud',
|
|
127
|
+
widgetPath: widgetPath
|
|
128
|
+
});
|
|
129
|
+
return response.success
|
|
130
|
+
? { success: true, message: response.message || 'HUD created', widgetName: response.result?.widgetName, ...(response.result || {}) }
|
|
131
|
+
: { success: false, error: response.error || response.message || 'Failed to create HUD' };
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
return { success: false, error: `Failed to create HUD: ${error instanceof Error ? error.message : String(error)}` };
|
|
151
135
|
}
|
|
152
|
-
const command = params.visible
|
|
153
|
-
? `ShowWidget ${widgetName} ${playerIndex}`
|
|
154
|
-
: `HideWidget ${widgetName} ${playerIndex}`;
|
|
155
|
-
const raw = await this.bridge.executeConsoleCommand(command);
|
|
156
|
-
const summary = this.bridge.summarizeConsoleCommand(command, raw);
|
|
157
|
-
return {
|
|
158
|
-
success: true,
|
|
159
|
-
message: params.visible ? `Widget ${widgetName} show command issued` : `Widget ${widgetName} hide command issued`,
|
|
160
|
-
command: summary.command,
|
|
161
|
-
output: summary.output || undefined,
|
|
162
|
-
logLines: summary.logLines?.length ? summary.logLines : undefined
|
|
163
|
-
};
|
|
164
136
|
}
|
|
165
|
-
|
|
137
|
+
async setWidgetVisibility(params) {
|
|
138
|
+
if (!this.automationBridge)
|
|
139
|
+
return { success: false, error: 'NO_BRIDGE' };
|
|
140
|
+
const response = await this.automationBridge.sendAutomationRequest('system_control', {
|
|
141
|
+
subAction: 'set_widget_visibility',
|
|
142
|
+
key: params.key,
|
|
143
|
+
visible: params.visible
|
|
144
|
+
});
|
|
145
|
+
return response.success
|
|
146
|
+
? { success: true, message: response.message || 'Widget visibility set', ...(response.result || {}) }
|
|
147
|
+
: { success: false, error: response.error || response.message || 'Failed to set widget visibility' };
|
|
148
|
+
}
|
|
149
|
+
async removeWidgetFromViewport(params) {
|
|
150
|
+
if (!this.automationBridge)
|
|
151
|
+
return { success: false, error: 'NO_BRIDGE' };
|
|
152
|
+
const response = await this.automationBridge.sendAutomationRequest('system_control', {
|
|
153
|
+
subAction: 'remove_widget_from_viewport',
|
|
154
|
+
key: params.key
|
|
155
|
+
});
|
|
156
|
+
return response.success
|
|
157
|
+
? { success: true, message: response.message || 'Widget removed from viewport', ...(response.result || {}) }
|
|
158
|
+
: { success: false, error: response.error || response.message || 'Failed to remove widget from viewport' };
|
|
159
|
+
}
|
|
166
160
|
async addWidgetToViewport(params) {
|
|
167
161
|
const zOrder = params.zOrder ?? 0;
|
|
168
162
|
const playerIndex = params.playerIndex ?? 0;
|
|
169
|
-
// Use Python API to create and add widget to viewport
|
|
170
|
-
const py = `
|
|
171
|
-
import unreal
|
|
172
|
-
import json
|
|
173
|
-
widget_path = r"${params.widgetClass}"
|
|
174
|
-
z_order = ${zOrder}
|
|
175
|
-
player_index = ${playerIndex}
|
|
176
|
-
try:
|
|
177
|
-
# Load the widget blueprint class
|
|
178
|
-
if not unreal.EditorAssetLibrary.does_asset_exist(widget_path):
|
|
179
|
-
print('RESULT:' + json.dumps({'success': False, 'error': f'Widget class not found: {widget_path}'}))
|
|
180
|
-
else:
|
|
181
|
-
widget_bp = unreal.EditorAssetLibrary.load_asset(widget_path)
|
|
182
|
-
if not widget_bp:
|
|
183
|
-
print('RESULT:' + json.dumps({'success': False, 'error': 'Failed to load widget blueprint'}))
|
|
184
|
-
else:
|
|
185
|
-
# Get the generated class from the widget blueprint
|
|
186
|
-
widget_class = widget_bp.generated_class() if hasattr(widget_bp, 'generated_class') else widget_bp
|
|
187
|
-
|
|
188
|
-
# Get the world and player controller via modern subsystems
|
|
189
|
-
world = None
|
|
190
|
-
try:
|
|
191
|
-
world = unreal.EditorUtilityLibrary.get_editor_world()
|
|
192
|
-
except Exception:
|
|
193
|
-
pass
|
|
194
|
-
|
|
195
|
-
if not world:
|
|
196
|
-
editor_subsystem = unreal.get_editor_subsystem(unreal.UnrealEditorSubsystem)
|
|
197
|
-
if editor_subsystem and hasattr(editor_subsystem, 'get_editor_world'):
|
|
198
|
-
world = editor_subsystem.get_editor_world()
|
|
199
|
-
|
|
200
|
-
if not world:
|
|
201
|
-
print('RESULT:' + json.dumps({'success': False, 'error': 'No editor world available. Start a PIE session or enable Editor Scripting Utilities.'}))
|
|
202
|
-
else:
|
|
203
|
-
# Try to get player controller
|
|
204
|
-
try:
|
|
205
|
-
player_controller = unreal.GameplayStatics.get_player_controller(world, player_index)
|
|
206
|
-
except Exception:
|
|
207
|
-
player_controller = None
|
|
208
|
-
|
|
209
|
-
if not player_controller:
|
|
210
|
-
# If no player controller in PIE, try to get the first one or create a dummy
|
|
211
|
-
print('RESULT:' + json.dumps({'success': False, 'error': 'No player controller available. Run in PIE mode first.'}))
|
|
212
|
-
else:
|
|
213
|
-
# Create the widget
|
|
214
|
-
widget = unreal.WidgetBlueprintLibrary.create(world, widget_class, player_controller)
|
|
215
|
-
if widget:
|
|
216
|
-
# Add to viewport
|
|
217
|
-
widget.add_to_viewport(z_order)
|
|
218
|
-
print('RESULT:' + json.dumps({'success': True}))
|
|
219
|
-
else:
|
|
220
|
-
print('RESULT:' + json.dumps({'success': False, 'error': 'Failed to create widget instance'}))
|
|
221
|
-
except Exception as e:
|
|
222
|
-
print('RESULT:' + json.dumps({'success': False, 'error': str(e)}))
|
|
223
|
-
`.trim();
|
|
224
163
|
try {
|
|
225
|
-
const resp = await this.bridge.
|
|
164
|
+
const resp = await this.bridge.executeEditorFunction('ADD_WIDGET_TO_VIEWPORT', { widget_path: params.widgetClass, z_order: zOrder, player_index: playerIndex });
|
|
226
165
|
const interpreted = interpretStandardResult(resp, {
|
|
227
166
|
successMessage: `Widget added to viewport with z-order ${zOrder}`,
|
|
228
167
|
failureMessage: 'Failed to add widget to viewport'
|
|
@@ -230,23 +169,12 @@ except Exception as e:
|
|
|
230
169
|
if (interpreted.success) {
|
|
231
170
|
return { success: true, message: interpreted.message };
|
|
232
171
|
}
|
|
233
|
-
return {
|
|
234
|
-
success: false,
|
|
235
|
-
error: interpreted.error ?? 'Failed to add widget to viewport',
|
|
236
|
-
details: bestEffortInterpretedText(interpreted)
|
|
237
|
-
};
|
|
172
|
+
return { success: false, error: interpreted.error ?? 'Failed to add widget to viewport', details: bestEffortInterpretedText(interpreted) };
|
|
238
173
|
}
|
|
239
174
|
catch (e) {
|
|
240
175
|
return { success: false, error: `Failed to add widget to viewport: ${e}` };
|
|
241
176
|
}
|
|
242
177
|
}
|
|
243
|
-
// Remove widget from viewport
|
|
244
|
-
async removeWidgetFromViewport(params) {
|
|
245
|
-
const playerIndex = params.playerIndex ?? 0;
|
|
246
|
-
const command = `RemoveWidgetFromViewport ${params.widgetName} ${playerIndex}`;
|
|
247
|
-
return this.bridge.executeConsoleCommand(command);
|
|
248
|
-
}
|
|
249
|
-
// Create menu
|
|
250
178
|
async createMenu(params) {
|
|
251
179
|
const commands = [];
|
|
252
180
|
commands.push(`CreateMenuWidget ${params.name} ${params.menuType}`);
|
|
@@ -259,7 +187,6 @@ except Exception as e:
|
|
|
259
187
|
await this.bridge.executeConsoleCommands(commands);
|
|
260
188
|
return { success: true, message: `Menu ${params.name} created` };
|
|
261
189
|
}
|
|
262
|
-
// Set widget animation
|
|
263
190
|
async createWidgetAnimation(params) {
|
|
264
191
|
const commands = [];
|
|
265
192
|
commands.push(`CreateWidgetAnimation ${params.widgetName} ${params.animationName} ${params.duration}`);
|
|
@@ -275,14 +202,12 @@ except Exception as e:
|
|
|
275
202
|
await this.bridge.executeConsoleCommands(commands);
|
|
276
203
|
return { success: true, message: `Animation ${params.animationName} created` };
|
|
277
204
|
}
|
|
278
|
-
// Play widget animation
|
|
279
205
|
async playWidgetAnimation(params) {
|
|
280
206
|
const playMode = params.playMode || 'Forward';
|
|
281
207
|
const loops = params.loops ?? 1;
|
|
282
208
|
const command = `PlayWidgetAnimation ${params.widgetName} ${params.animationName} ${playMode} ${loops}`;
|
|
283
209
|
return this.bridge.executeConsoleCommand(command);
|
|
284
210
|
}
|
|
285
|
-
// Set widget style
|
|
286
211
|
async setWidgetStyle(params) {
|
|
287
212
|
const commands = [];
|
|
288
213
|
if (params.style.backgroundColor) {
|
|
@@ -303,12 +228,10 @@ except Exception as e:
|
|
|
303
228
|
await this.bridge.executeConsoleCommands(commands);
|
|
304
229
|
return { success: true, message: 'Widget style updated' };
|
|
305
230
|
}
|
|
306
|
-
// Bind widget event
|
|
307
231
|
async bindWidgetEvent(params) {
|
|
308
232
|
const command = `BindWidgetEvent ${params.widgetName}.${params.componentName} ${params.eventType} ${params.functionName}`;
|
|
309
233
|
return this.bridge.executeConsoleCommand(command);
|
|
310
234
|
}
|
|
311
|
-
// Set input mode
|
|
312
235
|
async setInputMode(params) {
|
|
313
236
|
const commands = [];
|
|
314
237
|
commands.push(`SetInputMode ${params.mode}`);
|
|
@@ -321,13 +244,11 @@ except Exception as e:
|
|
|
321
244
|
await this.bridge.executeConsoleCommands(commands);
|
|
322
245
|
return { success: true, message: `Input mode set to ${params.mode}` };
|
|
323
246
|
}
|
|
324
|
-
// Create tooltip
|
|
325
247
|
async createTooltip(params) {
|
|
326
248
|
const delay = params.delay ?? 0.5;
|
|
327
249
|
const command = `SetWidgetTooltip ${params.widgetName}.${params.componentName} "${params.text}" ${delay}`;
|
|
328
250
|
return this.bridge.executeConsoleCommand(command);
|
|
329
251
|
}
|
|
330
|
-
// Create drag and drop
|
|
331
252
|
async setupDragDrop(params) {
|
|
332
253
|
const commands = [];
|
|
333
254
|
commands.push(`EnableDragDrop ${params.widgetName}.${params.componentName}`);
|
|
@@ -342,7 +263,6 @@ except Exception as e:
|
|
|
342
263
|
await this.bridge.executeConsoleCommands(commands);
|
|
343
264
|
return { success: true, message: 'Drag and drop configured' };
|
|
344
265
|
}
|
|
345
|
-
// Create notification
|
|
346
266
|
async showNotification(params) {
|
|
347
267
|
const duration = params.duration ?? 3.0;
|
|
348
268
|
const type = params.type || 'Info';
|
package/dist/types/env.d.ts
CHANGED
package/dist/types/env.js
CHANGED
|
@@ -1,15 +1,8 @@
|
|
|
1
1
|
export function loadEnv() {
|
|
2
|
-
const host = process.env.UE_HOST || '127.0.0.1';
|
|
3
|
-
// Note: UE5 default is HTTP on 30010, WebSocket on 30020
|
|
4
|
-
const wsPort = Number(process.env.UE_RC_WS_PORT || process.env.UE_REMOTE_CONTROL_WS_PORT || 30020);
|
|
5
|
-
const httpPort = Number(process.env.UE_RC_HTTP_PORT || process.env.UE_REMOTE_CONTROL_HTTP_PORT || 30010);
|
|
6
2
|
const projectPath = process.env.UE_PROJECT_PATH;
|
|
7
3
|
const editorExe = process.env.UE_EDITOR_EXE;
|
|
8
4
|
const screenshotDir = process.env.UE_SCREENSHOT_DIR;
|
|
9
5
|
return {
|
|
10
|
-
UE_HOST: host,
|
|
11
|
-
UE_RC_WS_PORT: wsPort,
|
|
12
|
-
UE_RC_HTTP_PORT: httpPort,
|
|
13
6
|
UE_PROJECT_PATH: projectPath,
|
|
14
7
|
UE_EDITOR_EXE: editorExe,
|
|
15
8
|
UE_SCREENSHOT_DIR: screenshotDir,
|