unreal-engine-mcp-server 0.4.7 → 0.5.1
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-config.yml +51 -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 +27 -0
- package/.github/workflows/labeler.yml +17 -0
- package/.github/workflows/links.yml +80 -0
- package/.github/workflows/pr-size-labeler.yml +137 -0
- package/.github/workflows/publish-mcp.yml +13 -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 +338 -31
- package/CONTRIBUTING.md +140 -0
- package/GEMINI.md +115 -0
- package/Public/Plugin_setup_guide.mp4 +0 -0
- package/README.md +189 -128
- 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 +26 -0
- package/dist/config.js +59 -0
- package/dist/constants.d.ts +16 -0
- package/dist/constants.js +16 -0
- package/dist/graphql/loaders.d.ts +64 -0
- package/dist/graphql/loaders.js +117 -0
- package/dist/graphql/resolvers.d.ts +268 -0
- package/dist/graphql/resolvers.js +746 -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 +117 -0
- package/dist/graphql/types.d.ts +9 -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 +33 -18
- package/dist/index.js +130 -619
- 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 +20 -0
- package/dist/server-setup.js +71 -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 +163 -9
- package/dist/tools/actors.js +356 -311
- package/dist/tools/animation.d.ts +135 -4
- package/dist/tools/animation.js +510 -411
- package/dist/tools/assets.d.ts +75 -29
- package/dist/tools/assets.js +265 -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.d.ts +208 -126
- package/dist/tools/blueprint.js +685 -832
- package/dist/tools/consolidated-tool-definitions.d.ts +5462 -1781
- package/dist/tools/consolidated-tool-definitions.js +829 -496
- package/dist/tools/consolidated-tool-handlers.d.ts +2 -1
- package/dist/tools/consolidated-tool-handlers.js +198 -1027
- package/dist/tools/debug.d.ts +143 -85
- package/dist/tools/debug.js +234 -180
- package/dist/tools/dynamic-handler-registry.d.ts +13 -0
- package/dist/tools/dynamic-handler-registry.js +23 -0
- package/dist/tools/editor.d.ts +30 -83
- package/dist/tools/editor.js +247 -244
- package/dist/tools/engine.d.ts +10 -4
- package/dist/tools/engine.js +13 -5
- package/dist/tools/environment.d.ts +30 -0
- package/dist/tools/environment.js +267 -0
- package/dist/tools/foliage.d.ts +65 -99
- package/dist/tools/foliage.js +221 -331
- package/dist/tools/handlers/actor-handlers.d.ts +3 -0
- package/dist/tools/handlers/actor-handlers.js +227 -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 +54 -93
- package/dist/tools/landscape.js +284 -409
- package/dist/tools/level.d.ts +66 -27
- package/dist/tools/level.js +647 -675
- package/dist/tools/lighting.d.ts +77 -38
- package/dist/tools/lighting.js +445 -943
- package/dist/tools/logs.d.ts +3 -3
- package/dist/tools/logs.js +5 -57
- package/dist/tools/materials.d.ts +91 -24
- package/dist/tools/materials.js +194 -118
- package/dist/tools/niagara.d.ts +149 -39
- package/dist/tools/niagara.js +267 -182
- package/dist/tools/performance.d.ts +27 -13
- package/dist/tools/performance.js +203 -122
- package/dist/tools/physics.d.ts +32 -77
- package/dist/tools/physics.js +175 -582
- package/dist/tools/property-dictionary.d.ts +13 -0
- package/dist/tools/property-dictionary.js +82 -0
- package/dist/tools/sequence.d.ts +85 -60
- package/dist/tools/sequence.js +208 -747
- 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 +64 -34
- package/dist/tools/ui.js +134 -214
- package/dist/types/automation-responses.d.ts +115 -0
- package/dist/types/automation-responses.js +2 -0
- package/dist/types/env.d.ts +0 -3
- package/dist/types/env.js +0 -7
- package/dist/types/responses.d.ts +249 -0
- package/dist/types/responses.js +2 -0
- package/dist/types/tool-interfaces.d.ts +898 -0
- package/dist/types/tool-interfaces.js +2 -0
- package/dist/types/tool-types.d.ts +183 -19
- package/dist/types/tool-types.js +0 -4
- package/dist/unreal-bridge.d.ts +24 -131
- package/dist/unreal-bridge.js +364 -1506
- package/dist/utils/command-validator.d.ts +9 -0
- package/dist/utils/command-validator.js +68 -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/path-security.d.ts +2 -0
- package/dist/utils/path-security.js +24 -0
- package/dist/utils/response-factory.d.ts +7 -0
- package/dist/utils/response-factory.js +27 -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 +684 -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 +67 -28
- 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 +136 -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 +58 -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 +19 -0
- package/src/graphql/loaders.ts +244 -0
- package/src/graphql/resolvers.ts +1008 -0
- package/src/graphql/schema.ts +452 -0
- package/src/graphql/server.ts +156 -0
- package/src/graphql/types.ts +10 -0
- package/src/handlers/resource-handlers.ts +186 -0
- package/src/index.ts +166 -664
- package/src/resources/actors.ts +58 -76
- package/src/resources/assets.ts +148 -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 +114 -0
- package/src/services/health-monitor.ts +132 -0
- package/src/services/metrics-server.ts +142 -0
- package/src/tools/actors.ts +426 -323
- package/src/tools/animation.ts +672 -461
- package/src/tools/assets.ts +364 -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.ts +792 -970
- package/src/tools/consolidated-tool-definitions.ts +993 -515
- package/src/tools/consolidated-tool-handlers.ts +258 -1146
- package/src/tools/debug.ts +292 -187
- package/src/tools/dynamic-handler-registry.ts +33 -0
- package/src/tools/editor.ts +329 -253
- package/src/tools/engine.ts +14 -3
- package/src/tools/environment.ts +281 -0
- package/src/tools/foliage.ts +330 -392
- package/src/tools/handlers/actor-handlers.ts +265 -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 +418 -507
- package/src/tools/level.ts +786 -708
- package/src/tools/lighting.ts +588 -984
- package/src/tools/logs.ts +9 -57
- package/src/tools/materials.ts +237 -121
- package/src/tools/niagara.ts +335 -168
- package/src/tools/performance.ts +320 -169
- package/src/tools/physics.ts +274 -613
- package/src/tools/property-dictionary.ts +98 -0
- package/src/tools/sequence.ts +276 -820
- package/src/tools/tool-definition-utils.ts +35 -0
- package/src/tools/ui.ts +205 -283
- package/src/types/automation-responses.ts +119 -0
- package/src/types/env.ts +0 -10
- package/src/types/responses.ts +355 -0
- package/src/types/tool-interfaces.ts +250 -0
- package/src/types/tool-types.ts +243 -21
- package/src/unreal-bridge.ts +460 -1550
- package/src/utils/command-validator.ts +76 -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.test.ts +162 -0
- package/src/utils/normalize.ts +60 -0
- package/src/utils/path-security.ts +43 -0
- package/src/utils/response-factory.ts +44 -0
- package/src/utils/response-validator.ts +176 -56
- package/src/utils/result-helpers.ts +21 -19
- package/src/utils/safe-json.test.ts +90 -0
- package/src/utils/safe-json.ts +14 -11
- package/src/utils/unreal-command-queue.ts +152 -0
- package/src/utils/validation.test.ts +184 -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 +369 -0
- package/tests/test-asset-advanced.mjs +82 -0
- package/tests/test-asset-errors.mjs +35 -0
- package/tests/test-asset-graph.mjs +311 -0
- package/tests/test-audio.mjs +417 -0
- package/tests/test-automation-timeouts.mjs +98 -0
- package/tests/test-behavior-tree.mjs +444 -0
- package/tests/test-blueprint-graph.mjs +410 -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 +112 -0
- package/tests/test-graphql.mjs +372 -0
- package/tests/test-input.mjs +349 -0
- package/tests/test-inspect.mjs +302 -0
- package/tests/test-landscape.mjs +316 -0
- package/tests/test-lighting.mjs +428 -0
- package/tests/test-manage-asset.mjs +438 -0
- package/tests/test-manage-level.mjs +89 -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-performance.mjs +539 -0
- package/tests/test-plugin-handshake.mjs +82 -0
- package/tests/test-runner.mjs +933 -0
- package/tests/test-sequence.mjs +104 -0
- package/tests/test-system.mjs +96 -0
- package/tests/test-wasm.mjs +283 -0
- package/tests/test-world-partition.mjs +215 -0
- package/tsconfig.json +3 -3
- package/vitest.config.ts +35 -0
- 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/prompts/index.d.ts +0 -21
- package/dist/prompts/index.js +0 -217
- package/dist/tools/build_environment_advanced.d.ts +0 -65
- package/dist/tools/build_environment_advanced.js +0 -633
- package/dist/tools/rc.d.ts +0 -110
- package/dist/tools/rc.js +0 -437
- package/dist/tools/visual.d.ts +0 -40
- package/dist/tools/visual.js +0 -282
- package/dist/utils/http.d.ts +0 -6
- package/dist/utils/http.js +0 -151
- package/dist/utils/python-output.d.ts +0 -18
- package/dist/utils/python-output.js +0 -290
- package/dist/utils/python.d.ts +0 -2
- package/dist/utils/python.js +0 -4
- package/dist/utils/stdio-redirect.d.ts +0 -2
- package/dist/utils/stdio-redirect.js +0 -20
- package/docs/unreal-tool-test-cases.md +0 -574
- package/smithery.yaml +0 -29
- package/src/prompts/index.ts +0 -249
- 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
|
@@ -1,11 +1,28 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Logger } from '../utils/logger.js';
|
|
2
2
|
export class PerformanceTools {
|
|
3
3
|
bridge;
|
|
4
|
-
|
|
4
|
+
log = new Logger('PerformanceTools');
|
|
5
|
+
automationBridge;
|
|
6
|
+
constructor(bridge, automationBridge) {
|
|
5
7
|
this.bridge = bridge;
|
|
8
|
+
this.automationBridge = automationBridge;
|
|
9
|
+
}
|
|
10
|
+
setAutomationBridge(automationBridge) {
|
|
11
|
+
this.automationBridge = automationBridge;
|
|
6
12
|
}
|
|
7
|
-
// Start profiling
|
|
8
13
|
async startProfiling(params) {
|
|
14
|
+
if (this.automationBridge) {
|
|
15
|
+
try {
|
|
16
|
+
const response = await this.automationBridge.sendAutomationRequest('start_profiling', {
|
|
17
|
+
type: params.type,
|
|
18
|
+
duration: params.duration
|
|
19
|
+
});
|
|
20
|
+
if (response.success)
|
|
21
|
+
return { success: true, message: `${params.type} profiling started (bridge)` };
|
|
22
|
+
}
|
|
23
|
+
catch (_e) {
|
|
24
|
+
}
|
|
25
|
+
}
|
|
9
26
|
const commands = [];
|
|
10
27
|
switch (params.type) {
|
|
11
28
|
case 'CPU':
|
|
@@ -35,8 +52,16 @@ export class PerformanceTools {
|
|
|
35
52
|
await this.bridge.executeConsoleCommands(commands);
|
|
36
53
|
return { success: true, message: `${params.type} profiling started` };
|
|
37
54
|
}
|
|
38
|
-
// Stop profiling
|
|
39
55
|
async stopProfiling() {
|
|
56
|
+
if (this.automationBridge) {
|
|
57
|
+
try {
|
|
58
|
+
const response = await this.automationBridge.sendAutomationRequest('stop_profiling', {});
|
|
59
|
+
if (response.success)
|
|
60
|
+
return { success: true, message: 'Profiling stopped (bridge)' };
|
|
61
|
+
}
|
|
62
|
+
catch (_e) {
|
|
63
|
+
}
|
|
64
|
+
}
|
|
40
65
|
const commands = [
|
|
41
66
|
'stat stopfile',
|
|
42
67
|
'stat none'
|
|
@@ -44,19 +69,32 @@ export class PerformanceTools {
|
|
|
44
69
|
await this.bridge.executeConsoleCommands(commands);
|
|
45
70
|
return { success: true, message: 'Profiling stopped' };
|
|
46
71
|
}
|
|
47
|
-
// Show FPS
|
|
48
72
|
async showFPS(params) {
|
|
49
73
|
const startTime = Date.now();
|
|
50
|
-
|
|
74
|
+
this.log.debug('Starting showFPS with params:', params);
|
|
75
|
+
if (this.automationBridge) {
|
|
76
|
+
try {
|
|
77
|
+
const response = await this.automationBridge.sendAutomationRequest('show_fps', {
|
|
78
|
+
enabled: params.enabled,
|
|
79
|
+
verbose: params.verbose
|
|
80
|
+
});
|
|
81
|
+
if (response.success)
|
|
82
|
+
return {
|
|
83
|
+
success: true,
|
|
84
|
+
message: params.enabled ? 'FPS display enabled (bridge)' : 'FPS display disabled (bridge)',
|
|
85
|
+
fpsVisible: params.enabled
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
catch (_e) {
|
|
89
|
+
}
|
|
90
|
+
}
|
|
51
91
|
try {
|
|
52
|
-
// Use stat fps as requested - shows FPS counter
|
|
53
|
-
// For more detailed timing info, use 'stat unit' instead
|
|
54
92
|
const command = params.enabled
|
|
55
93
|
? (params.verbose ? 'stat unit' : 'stat fps')
|
|
56
94
|
: 'stat none';
|
|
57
|
-
|
|
95
|
+
this.log.debug(`Executing command: ${command}`);
|
|
58
96
|
await this.bridge.executeConsoleCommand(command);
|
|
59
|
-
|
|
97
|
+
this.log.debug(`Command completed in ${Date.now() - startTime}ms`);
|
|
60
98
|
return {
|
|
61
99
|
success: true,
|
|
62
100
|
message: params.enabled ? 'FPS display enabled' : 'FPS display disabled',
|
|
@@ -72,17 +110,37 @@ export class PerformanceTools {
|
|
|
72
110
|
};
|
|
73
111
|
}
|
|
74
112
|
}
|
|
75
|
-
// Show performance stats
|
|
76
113
|
async showStats(params) {
|
|
114
|
+
if (this.automationBridge) {
|
|
115
|
+
try {
|
|
116
|
+
const response = await this.automationBridge.sendAutomationRequest('show_stats', {
|
|
117
|
+
category: params.category,
|
|
118
|
+
enabled: params.enabled
|
|
119
|
+
});
|
|
120
|
+
if (response.success)
|
|
121
|
+
return { success: true, message: `Stat '${params.category}' configured (bridge)` };
|
|
122
|
+
}
|
|
123
|
+
catch (_e) {
|
|
124
|
+
}
|
|
125
|
+
}
|
|
77
126
|
const command = params.enabled
|
|
78
127
|
? `stat ${params.category.toLowerCase()}`
|
|
79
128
|
: 'stat none';
|
|
80
129
|
return this.bridge.executeConsoleCommand(command);
|
|
81
130
|
}
|
|
82
|
-
// Set scalability settings using console commands
|
|
83
131
|
async setScalability(params) {
|
|
84
|
-
|
|
85
|
-
|
|
132
|
+
if (this.automationBridge) {
|
|
133
|
+
try {
|
|
134
|
+
const response = await this.automationBridge.sendAutomationRequest('set_scalability', {
|
|
135
|
+
category: params.category,
|
|
136
|
+
level: params.level
|
|
137
|
+
});
|
|
138
|
+
if (response.success)
|
|
139
|
+
return { success: true, message: `${params.category} quality set to level ${params.level} (bridge)` };
|
|
140
|
+
}
|
|
141
|
+
catch (_e) {
|
|
142
|
+
}
|
|
143
|
+
}
|
|
86
144
|
const categoryBaseMap = {
|
|
87
145
|
ViewDistance: 'ViewDistance',
|
|
88
146
|
AntiAliasing: 'AntiAliasing',
|
|
@@ -104,98 +162,35 @@ export class PerformanceTools {
|
|
|
104
162
|
};
|
|
105
163
|
}
|
|
106
164
|
const base = categoryBaseMap[params.category] || params.category;
|
|
107
|
-
// Use direct console command to set with highest priority (SetByConsole)
|
|
108
|
-
// This avoids conflicts with the scalability system
|
|
109
165
|
const setCommand = `sg.${base}Quality ${requestedLevel}`;
|
|
110
|
-
// Apply the console command directly
|
|
111
166
|
await this.bridge.executeConsoleCommand(setCommand);
|
|
112
|
-
// Skip GameUserSettings entirely to avoid any scalability triggers
|
|
113
|
-
// Console command already applied with correct priority
|
|
114
|
-
/* eslint-disable no-useless-escape */
|
|
115
|
-
const py = `
|
|
116
|
-
import unreal, json
|
|
117
|
-
result = {'success': True, 'category': '${base}', 'requested': ${requestedLevel}, 'actual': ${requestedLevel}, 'method': 'ConsoleOnly'}
|
|
118
|
-
|
|
119
|
-
# Simply verify the console variable was set correctly
|
|
120
|
-
try:
|
|
121
|
-
# Try to read the console variable directly to verify it was set
|
|
122
|
-
# This doesn't trigger any scalability system
|
|
123
|
-
import sys
|
|
124
|
-
from io import StringIO
|
|
125
|
-
|
|
126
|
-
# Capture console output
|
|
127
|
-
old_stdout = sys.stdout
|
|
128
|
-
sys.stdout = StringIO()
|
|
129
|
-
|
|
130
|
-
# Execute console command to query the value
|
|
131
|
-
try:
|
|
132
|
-
unreal.SystemLibrary.execute_console_command(None, 'sg.${base}Quality', None)
|
|
133
|
-
except:
|
|
134
|
-
pass
|
|
135
|
-
|
|
136
|
-
# Get the output
|
|
137
|
-
console_output = sys.stdout.getvalue()
|
|
138
|
-
sys.stdout = old_stdout
|
|
139
|
-
|
|
140
|
-
# Parse the output to get the actual value
|
|
141
|
-
if 'sg.${base}Quality' in console_output:
|
|
142
|
-
# Extract the value from output like 'sg.ShadowQuality = "3"'
|
|
143
|
-
import re
|
|
144
|
-
match = re.search(r'sg\.${base}Quality\\s*=\\s*"(\\d+)"', console_output)
|
|
145
|
-
if match:
|
|
146
|
-
result['actual'] = int(match.group(1))
|
|
147
|
-
result['verified'] = True
|
|
148
|
-
|
|
149
|
-
result['method'] = 'ConsoleOnly'
|
|
150
|
-
except Exception as e:
|
|
151
|
-
# Even on error, the console command was applied
|
|
152
|
-
result['method'] = 'ConsoleOnly'
|
|
153
|
-
result['note'] = str(e)
|
|
154
|
-
|
|
155
|
-
print('RESULT:' + json.dumps(result))
|
|
156
|
-
`.trim();
|
|
157
|
-
/* eslint-enable no-useless-escape */
|
|
158
|
-
// Always try to apply through Python for consistency
|
|
159
|
-
try {
|
|
160
|
-
const pyResp = await this.bridge.executePython(py);
|
|
161
|
-
const interpreted = interpretStandardResult(pyResp, {
|
|
162
|
-
successMessage: `${params.category} quality set to level ${requestedLevel}`,
|
|
163
|
-
failureMessage: `Failed to set ${params.category} quality`
|
|
164
|
-
});
|
|
165
|
-
if (interpreted.success) {
|
|
166
|
-
const actual = coerceNumber(interpreted.payload.actual) ?? requestedLevel;
|
|
167
|
-
const verified = coerceBoolean(interpreted.payload.success, true) === true && actual === requestedLevel;
|
|
168
|
-
return {
|
|
169
|
-
success: true,
|
|
170
|
-
message: interpreted.message,
|
|
171
|
-
verified,
|
|
172
|
-
readback: actual,
|
|
173
|
-
method: interpreted.payload.method || 'ConsoleOnly'
|
|
174
|
-
};
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
catch {
|
|
178
|
-
// Ignore Python errors and fall through
|
|
179
|
-
}
|
|
180
|
-
// If Python fails, the console command was still applied
|
|
181
167
|
return {
|
|
182
168
|
success: true,
|
|
183
169
|
message: `${params.category} quality set to level ${requestedLevel}`,
|
|
184
|
-
method: '
|
|
170
|
+
method: 'Console'
|
|
185
171
|
};
|
|
186
172
|
}
|
|
187
|
-
// Set resolution scale
|
|
188
173
|
async setResolutionScale(params) {
|
|
189
|
-
// Validate input
|
|
190
174
|
if (params.scale === undefined || params.scale === null || isNaN(params.scale)) {
|
|
191
175
|
return { success: false, error: 'Invalid scale parameter' };
|
|
192
176
|
}
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
177
|
+
let percentage;
|
|
178
|
+
if (params.scale >= 10) {
|
|
179
|
+
percentage = Math.round(params.scale);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
percentage = Math.round(params.scale * 100);
|
|
183
|
+
}
|
|
198
184
|
const finalPercentage = Math.max(10, Math.min(200, percentage));
|
|
185
|
+
if (this.automationBridge) {
|
|
186
|
+
try {
|
|
187
|
+
const response = await this.automationBridge.sendAutomationRequest('set_resolution_scale', { scale: finalPercentage });
|
|
188
|
+
if (response.success)
|
|
189
|
+
return { success: true, message: `Resolution scale set to ${finalPercentage}% (bridge)`, actualScale: finalPercentage / 100 };
|
|
190
|
+
}
|
|
191
|
+
catch (_e) {
|
|
192
|
+
}
|
|
193
|
+
}
|
|
199
194
|
const command = `r.ScreenPercentage ${finalPercentage}`;
|
|
200
195
|
try {
|
|
201
196
|
await this.bridge.executeConsoleCommand(command);
|
|
@@ -209,23 +204,53 @@ print('RESULT:' + json.dumps(result))
|
|
|
209
204
|
return { success: false, error: `Failed to set resolution scale: ${e}` };
|
|
210
205
|
}
|
|
211
206
|
}
|
|
212
|
-
// Enable/disable vsync
|
|
213
207
|
async setVSync(params) {
|
|
208
|
+
if (this.automationBridge) {
|
|
209
|
+
try {
|
|
210
|
+
const response = await this.automationBridge.sendAutomationRequest('set_vsync', { enabled: params.enabled });
|
|
211
|
+
if (response.success)
|
|
212
|
+
return { success: true, message: 'VSync configured (bridge)' };
|
|
213
|
+
}
|
|
214
|
+
catch (_e) {
|
|
215
|
+
}
|
|
216
|
+
}
|
|
214
217
|
const command = `r.VSync ${params.enabled ? 1 : 0}`;
|
|
215
218
|
return this.bridge.executeConsoleCommand(command);
|
|
216
219
|
}
|
|
217
|
-
// Set frame rate limit
|
|
218
220
|
async setFrameRateLimit(params) {
|
|
221
|
+
if (this.automationBridge) {
|
|
222
|
+
try {
|
|
223
|
+
const response = await this.automationBridge.sendAutomationRequest('set_frame_rate_limit', { maxFPS: params.maxFPS });
|
|
224
|
+
if (response.success)
|
|
225
|
+
return { success: true, message: 'Max FPS set (bridge)' };
|
|
226
|
+
}
|
|
227
|
+
catch (_e) {
|
|
228
|
+
}
|
|
229
|
+
}
|
|
219
230
|
const command = `t.MaxFPS ${params.maxFPS}`;
|
|
220
231
|
return this.bridge.executeConsoleCommand(command);
|
|
221
232
|
}
|
|
222
|
-
// Enable GPU timing
|
|
223
233
|
async enableGPUTiming(params) {
|
|
224
234
|
const command = `r.GPUStatsEnabled ${params.enabled ? 1 : 0}`;
|
|
225
235
|
return this.bridge.executeConsoleCommand(command);
|
|
226
236
|
}
|
|
227
|
-
// Memory report
|
|
228
237
|
async generateMemoryReport(params) {
|
|
238
|
+
if (this.automationBridge) {
|
|
239
|
+
try {
|
|
240
|
+
const response = await this.automationBridge.sendAutomationRequest('generate_memory_report', {
|
|
241
|
+
detailed: params.detailed ?? false,
|
|
242
|
+
outputPath: params.outputPath
|
|
243
|
+
});
|
|
244
|
+
if (response.success) {
|
|
245
|
+
return { success: true, message: response.message || 'Memory report generated' };
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
if (params.outputPath) {
|
|
250
|
+
return { success: false, error: `Failed to generate memory report: ${error instanceof Error ? error.message : String(error)}` };
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
229
254
|
const commands = [];
|
|
230
255
|
if (params.detailed) {
|
|
231
256
|
commands.push('memreport -full');
|
|
@@ -234,43 +259,67 @@ print('RESULT:' + json.dumps(result))
|
|
|
234
259
|
commands.push('memreport');
|
|
235
260
|
}
|
|
236
261
|
if (params.outputPath) {
|
|
237
|
-
|
|
262
|
+
throw new Error('Saving memreport to a file requires Automation Bridge support');
|
|
238
263
|
}
|
|
239
264
|
await this.bridge.executeConsoleCommands(commands);
|
|
240
265
|
return { success: true, message: 'Memory report generated' };
|
|
241
266
|
}
|
|
242
|
-
// Texture streaming
|
|
243
267
|
async configureTextureStreaming(params) {
|
|
268
|
+
if (this.automationBridge) {
|
|
269
|
+
try {
|
|
270
|
+
const response = await this.automationBridge.sendAutomationRequest('configure_texture_streaming', {
|
|
271
|
+
enabled: params.enabled,
|
|
272
|
+
poolSize: params.poolSize,
|
|
273
|
+
boostPlayerLocation: params.boostPlayerLocation
|
|
274
|
+
});
|
|
275
|
+
if (response.success)
|
|
276
|
+
return { success: true, message: response.message || 'Texture streaming configured (bridge)' };
|
|
277
|
+
}
|
|
278
|
+
catch (_error) {
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
if (params.boostPlayerLocation && !this.automationBridge) {
|
|
282
|
+
throw new Error('Boosting player location for streaming requires Automation Bridge support');
|
|
283
|
+
}
|
|
244
284
|
const commands = [];
|
|
245
285
|
commands.push(`r.TextureStreaming ${params.enabled ? 1 : 0}`);
|
|
246
286
|
if (params.poolSize !== undefined) {
|
|
247
287
|
commands.push(`r.Streaming.PoolSize ${params.poolSize}`);
|
|
248
288
|
}
|
|
249
|
-
if (params.boostPlayerLocation !== undefined) {
|
|
250
|
-
commands.push(`r.Streaming.UseFixedPoolSize ${params.boostPlayerLocation ? 1 : 0}`);
|
|
251
|
-
}
|
|
252
289
|
await this.bridge.executeConsoleCommands(commands);
|
|
253
290
|
return { success: true, message: 'Texture streaming configured' };
|
|
254
291
|
}
|
|
255
|
-
// LOD settings
|
|
256
292
|
async configureLOD(params) {
|
|
293
|
+
if (this.automationBridge) {
|
|
294
|
+
try {
|
|
295
|
+
const response = await this.automationBridge.sendAutomationRequest('configure_lod', {
|
|
296
|
+
forceLOD: params.forceLOD,
|
|
297
|
+
lodBias: params.lodBias
|
|
298
|
+
});
|
|
299
|
+
if (params.distanceScale !== undefined) {
|
|
300
|
+
await this.bridge.executeConsoleCommand(`r.StaticMeshLODDistanceScale ${params.distanceScale}`);
|
|
301
|
+
await this.bridge.executeConsoleCommand(`r.SkeletalMeshLODDistanceScale ${params.distanceScale}`);
|
|
302
|
+
}
|
|
303
|
+
if (response.success)
|
|
304
|
+
return { success: true, message: 'LOD settings configured' };
|
|
305
|
+
}
|
|
306
|
+
catch (_e) {
|
|
307
|
+
}
|
|
308
|
+
}
|
|
257
309
|
const commands = [];
|
|
258
310
|
if (params.forceLOD !== undefined) {
|
|
259
311
|
commands.push(`r.ForceLOD ${params.forceLOD}`);
|
|
260
312
|
}
|
|
261
313
|
if (params.lodBias !== undefined) {
|
|
262
|
-
// Skeletal mesh LOD bias is an integer bias value
|
|
263
314
|
commands.push(`r.SkeletalMeshLODBias ${params.lodBias}`);
|
|
264
315
|
}
|
|
265
316
|
if (params.distanceScale !== undefined) {
|
|
266
|
-
// Apply distance scale to both static and skeletal meshes
|
|
267
317
|
commands.push(`r.StaticMeshLODDistanceScale ${params.distanceScale}`);
|
|
268
318
|
commands.push(`r.SkeletalMeshLODDistanceScale ${params.distanceScale}`);
|
|
269
319
|
}
|
|
270
320
|
await this.bridge.executeConsoleCommands(commands);
|
|
271
321
|
return { success: true, message: 'LOD settings configured' };
|
|
272
322
|
}
|
|
273
|
-
// Apply a baseline performance profile (explicit CVar enforcement)
|
|
274
323
|
async applyBaselinePerformanceSettings(params) {
|
|
275
324
|
const p = {
|
|
276
325
|
distanceScale: params?.distanceScale ?? 1.0,
|
|
@@ -290,32 +339,51 @@ print('RESULT:' + json.dumps(result))
|
|
|
290
339
|
await this.bridge.executeConsoleCommands(commands);
|
|
291
340
|
return { success: true, message: 'Baseline performance settings applied', params: p };
|
|
292
341
|
}
|
|
293
|
-
// Draw call optimization
|
|
294
342
|
async optimizeDrawCalls(params) {
|
|
343
|
+
if (params.mergeActors) {
|
|
344
|
+
if (this.automationBridge) {
|
|
345
|
+
try {
|
|
346
|
+
const actors = Array.isArray(params.actors)
|
|
347
|
+
? params.actors.filter((name) => typeof name === 'string' && name.length > 0)
|
|
348
|
+
: undefined;
|
|
349
|
+
if (!actors || actors.length < 2) {
|
|
350
|
+
return {
|
|
351
|
+
success: false,
|
|
352
|
+
error: 'Merge actors requires an "actors" array with at least 2 valid actor names.'
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
const payload = {
|
|
356
|
+
enableInstancing: params.enableInstancing,
|
|
357
|
+
mergeActors: params.mergeActors,
|
|
358
|
+
actors: actors
|
|
359
|
+
};
|
|
360
|
+
const response = await this.automationBridge.sendAutomationRequest('merge_actors', payload);
|
|
361
|
+
return response.success
|
|
362
|
+
? { success: true, message: response.message || 'Actors merged for optimization' }
|
|
363
|
+
: { success: false, error: response.message || response.error || 'Failed to merge actors' };
|
|
364
|
+
}
|
|
365
|
+
catch (error) {
|
|
366
|
+
return { success: false, error: `Failed to merge actors: ${error instanceof Error ? error.message : String(error)}` };
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
throw new Error('Actor merging requires Automation Bridge support');
|
|
370
|
+
}
|
|
295
371
|
const commands = [];
|
|
296
372
|
if (params.enableInstancing !== undefined) {
|
|
297
373
|
commands.push(`r.MeshDrawCommands.DynamicInstancing ${params.enableInstancing ? 1 : 0}`);
|
|
298
374
|
}
|
|
299
|
-
// Avoid using r.RHICmdBypass; it's a low-level debug toggle and not suitable for general batching control
|
|
300
|
-
if (params.mergeActors) {
|
|
301
|
-
commands.push('MergeActors');
|
|
302
|
-
}
|
|
303
375
|
await this.bridge.executeConsoleCommands(commands);
|
|
304
376
|
return { success: true, message: 'Draw call optimization configured' };
|
|
305
377
|
}
|
|
306
|
-
// Occlusion culling
|
|
307
378
|
async configureOcclusionCulling(params) {
|
|
308
379
|
const commands = [];
|
|
309
|
-
// Enable/disable HZB occlusion (boolean)
|
|
310
380
|
commands.push(`r.HZBOcclusion ${params.enabled ? 1 : 0}`);
|
|
311
|
-
// Optional freeze rendering toggle
|
|
312
381
|
if (params.freezeRendering !== undefined) {
|
|
313
382
|
commands.push(`FreezeRendering ${params.freezeRendering ? 1 : 0}`);
|
|
314
383
|
}
|
|
315
384
|
await this.bridge.executeConsoleCommands(commands);
|
|
316
385
|
return { success: true, message: 'Occlusion culling configured' };
|
|
317
386
|
}
|
|
318
|
-
// Shader compilation
|
|
319
387
|
async optimizeShaders(params) {
|
|
320
388
|
const commands = [];
|
|
321
389
|
if (params.compileOnDemand !== undefined) {
|
|
@@ -330,8 +398,26 @@ print('RESULT:' + json.dumps(result))
|
|
|
330
398
|
await this.bridge.executeConsoleCommands(commands);
|
|
331
399
|
return { success: true, message: 'Shader optimization configured' };
|
|
332
400
|
}
|
|
333
|
-
// Nanite settings
|
|
334
401
|
async configureNanite(params) {
|
|
402
|
+
if (this.automationBridge) {
|
|
403
|
+
try {
|
|
404
|
+
const response = await this.automationBridge.sendAutomationRequest('configure_nanite', {
|
|
405
|
+
enabled: params.enabled,
|
|
406
|
+
maxPixelsPerEdge: params.maxPixelsPerEdge,
|
|
407
|
+
streamingPoolSize: params.streamingPoolSize
|
|
408
|
+
});
|
|
409
|
+
if (params.maxPixelsPerEdge !== undefined) {
|
|
410
|
+
await this.bridge.executeConsoleCommand(`r.Nanite.MaxPixelsPerEdge ${params.maxPixelsPerEdge}`);
|
|
411
|
+
}
|
|
412
|
+
if (params.streamingPoolSize !== undefined) {
|
|
413
|
+
await this.bridge.executeConsoleCommand(`r.Nanite.StreamingPoolSize ${params.streamingPoolSize}`);
|
|
414
|
+
}
|
|
415
|
+
if (response.success)
|
|
416
|
+
return { success: true, message: 'Nanite configured' };
|
|
417
|
+
}
|
|
418
|
+
catch (_e) {
|
|
419
|
+
}
|
|
420
|
+
}
|
|
335
421
|
const commands = [];
|
|
336
422
|
commands.push(`r.Nanite ${params.enabled ? 1 : 0}`);
|
|
337
423
|
if (params.maxPixelsPerEdge !== undefined) {
|
|
@@ -343,7 +429,6 @@ print('RESULT:' + json.dumps(result))
|
|
|
343
429
|
await this.bridge.executeConsoleCommands(commands);
|
|
344
430
|
return { success: true, message: 'Nanite configured' };
|
|
345
431
|
}
|
|
346
|
-
// World Partition streaming
|
|
347
432
|
async configureWorldPartition(params) {
|
|
348
433
|
const commands = [];
|
|
349
434
|
commands.push(`wp.Runtime.EnableStreaming ${params.enabled ? 1 : 0}`);
|
|
@@ -356,14 +441,10 @@ print('RESULT:' + json.dumps(result))
|
|
|
356
441
|
await this.bridge.executeConsoleCommands(commands);
|
|
357
442
|
return { success: true, message: 'World Partition configured' };
|
|
358
443
|
}
|
|
359
|
-
// Benchmark
|
|
360
444
|
async runBenchmark(params) {
|
|
361
445
|
const duration = params.duration || 60;
|
|
362
|
-
// Start recording and GPU profiling
|
|
363
446
|
await this.bridge.executeConsoleCommands(['stat startfile', 'profilegpu']);
|
|
364
|
-
// Wait for the requested duration
|
|
365
447
|
await new Promise(resolve => setTimeout(resolve, duration * 1000));
|
|
366
|
-
// Stop recording and clear stats
|
|
367
448
|
await this.bridge.executeConsoleCommands(['stat stopfile', 'stat none']);
|
|
368
449
|
return { success: true, message: `Benchmark completed for ${duration} seconds` };
|
|
369
450
|
}
|
package/dist/tools/physics.d.ts
CHANGED
|
@@ -1,18 +1,11 @@
|
|
|
1
1
|
import { UnrealBridge } from '../unreal-bridge.js';
|
|
2
|
+
import { AutomationBridge } from '../automation/index.js';
|
|
2
3
|
export declare class PhysicsTools {
|
|
3
4
|
private bridge;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
*/
|
|
5
|
+
private automationBridge?;
|
|
6
|
+
constructor(bridge: UnrealBridge, automationBridge?: AutomationBridge | undefined);
|
|
7
|
+
setAutomationBridge(automationBridge?: AutomationBridge): void;
|
|
8
8
|
private findValidSkeletalMesh;
|
|
9
|
-
/**
|
|
10
|
-
* Setup Ragdoll Physics
|
|
11
|
-
* NOTE: Requires a valid skeletal mesh to create physics asset
|
|
12
|
-
* @param skeletonPath - Path to an existing skeletal mesh asset (required)
|
|
13
|
-
* @param physicsAssetName - Name for the new physics asset
|
|
14
|
-
* @param savePath - Directory to save the asset (default: /Game/Physics)
|
|
15
|
-
*/
|
|
16
9
|
setupRagdoll(params: {
|
|
17
10
|
skeletonPath: string;
|
|
18
11
|
physicsAssetName: string;
|
|
@@ -27,35 +20,7 @@ export declare class PhysicsTools {
|
|
|
27
20
|
twist?: number;
|
|
28
21
|
};
|
|
29
22
|
}>;
|
|
30
|
-
}): Promise<
|
|
31
|
-
success: true;
|
|
32
|
-
message: string;
|
|
33
|
-
path: string;
|
|
34
|
-
existingAsset?: boolean;
|
|
35
|
-
warnings?: string[];
|
|
36
|
-
details?: string[];
|
|
37
|
-
} | {
|
|
38
|
-
success: boolean;
|
|
39
|
-
message: string;
|
|
40
|
-
error: string | undefined;
|
|
41
|
-
warnings?: undefined;
|
|
42
|
-
details?: undefined;
|
|
43
|
-
} | {
|
|
44
|
-
success: false;
|
|
45
|
-
message: string;
|
|
46
|
-
error: string;
|
|
47
|
-
warnings: string[] | undefined;
|
|
48
|
-
details: string[] | undefined;
|
|
49
|
-
} | {
|
|
50
|
-
success: boolean;
|
|
51
|
-
error: string;
|
|
52
|
-
message?: undefined;
|
|
53
|
-
warnings?: undefined;
|
|
54
|
-
details?: undefined;
|
|
55
|
-
}>;
|
|
56
|
-
/**
|
|
57
|
-
* Create Physics Constraint
|
|
58
|
-
*/
|
|
23
|
+
}): Promise<any>;
|
|
59
24
|
createConstraint(params: {
|
|
60
25
|
name: string;
|
|
61
26
|
actor1: string;
|
|
@@ -78,9 +43,6 @@ export declare class PhysicsTools {
|
|
|
78
43
|
error: string;
|
|
79
44
|
message?: undefined;
|
|
80
45
|
}>;
|
|
81
|
-
/**
|
|
82
|
-
* Setup Chaos Destruction
|
|
83
|
-
*/
|
|
84
46
|
setupDestruction(params: {
|
|
85
47
|
meshPath: string;
|
|
86
48
|
destructionName: string;
|
|
@@ -103,9 +65,6 @@ export declare class PhysicsTools {
|
|
|
103
65
|
message?: undefined;
|
|
104
66
|
path?: undefined;
|
|
105
67
|
}>;
|
|
106
|
-
/**
|
|
107
|
-
* Configure Vehicle Physics
|
|
108
|
-
*/
|
|
109
68
|
configureVehicle(params: {
|
|
110
69
|
vehicleName: string;
|
|
111
70
|
vehicleType: 'Car' | 'Bike' | 'Tank' | 'Aircraft';
|
|
@@ -125,46 +84,27 @@ export declare class PhysicsTools {
|
|
|
125
84
|
gears: number[];
|
|
126
85
|
finalDriveRatio: number;
|
|
127
86
|
};
|
|
87
|
+
pluginDependencies?: string[];
|
|
128
88
|
}): Promise<{
|
|
129
89
|
success: boolean;
|
|
90
|
+
error: string;
|
|
91
|
+
missingPlugins: string[];
|
|
130
92
|
message: string;
|
|
131
|
-
|
|
93
|
+
warnings?: undefined;
|
|
132
94
|
} | {
|
|
133
95
|
success: boolean;
|
|
134
|
-
|
|
135
|
-
|
|
96
|
+
message: string;
|
|
97
|
+
warnings: string[];
|
|
98
|
+
error?: undefined;
|
|
99
|
+
missingPlugins?: undefined;
|
|
136
100
|
}>;
|
|
137
|
-
/**
|
|
138
|
-
* Apply Force or Impulse to Actor
|
|
139
|
-
*/
|
|
140
101
|
applyForce(params: {
|
|
141
102
|
actorName: string;
|
|
142
103
|
forceType: 'Force' | 'Impulse' | 'Velocity' | 'Torque';
|
|
143
104
|
vector: [number, number, number];
|
|
144
105
|
boneName?: string;
|
|
145
106
|
isLocal?: boolean;
|
|
146
|
-
}): Promise<
|
|
147
|
-
success: boolean;
|
|
148
|
-
message: string;
|
|
149
|
-
availableActors: string[] | undefined;
|
|
150
|
-
details: string[] | undefined;
|
|
151
|
-
error?: undefined;
|
|
152
|
-
} | {
|
|
153
|
-
success: boolean;
|
|
154
|
-
error: string;
|
|
155
|
-
availableActors: string[] | undefined;
|
|
156
|
-
details: string[] | undefined;
|
|
157
|
-
message?: undefined;
|
|
158
|
-
} | {
|
|
159
|
-
success: boolean;
|
|
160
|
-
error: string;
|
|
161
|
-
message?: undefined;
|
|
162
|
-
availableActors?: undefined;
|
|
163
|
-
details?: undefined;
|
|
164
|
-
}>;
|
|
165
|
-
/**
|
|
166
|
-
* Configure Cloth Simulation
|
|
167
|
-
*/
|
|
107
|
+
}): Promise<any>;
|
|
168
108
|
setupCloth(params: {
|
|
169
109
|
meshName: string;
|
|
170
110
|
clothPreset: 'Silk' | 'Leather' | 'Denim' | 'Rubber' | 'Custom';
|
|
@@ -185,9 +125,6 @@ export declare class PhysicsTools {
|
|
|
185
125
|
error: string;
|
|
186
126
|
message?: undefined;
|
|
187
127
|
}>;
|
|
188
|
-
/**
|
|
189
|
-
* Create Fluid Simulation (Niagara-based)
|
|
190
|
-
*/
|
|
191
128
|
createFluidSimulation(params: {
|
|
192
129
|
name: string;
|
|
193
130
|
fluidType: 'Water' | 'Smoke' | 'Fire' | 'Lava' | 'Custom';
|
|
@@ -209,5 +146,23 @@ export declare class PhysicsTools {
|
|
|
209
146
|
error: string;
|
|
210
147
|
message?: undefined;
|
|
211
148
|
}>;
|
|
149
|
+
setupPhysicsSimulation(params: {
|
|
150
|
+
meshPath?: string;
|
|
151
|
+
skeletonPath?: string;
|
|
152
|
+
physicsAssetName?: string;
|
|
153
|
+
savePath?: string;
|
|
154
|
+
}): Promise<{
|
|
155
|
+
success: boolean;
|
|
156
|
+
message: string;
|
|
157
|
+
error: string | undefined;
|
|
158
|
+
} | {
|
|
159
|
+
success: boolean;
|
|
160
|
+
message: string;
|
|
161
|
+
error?: undefined;
|
|
162
|
+
} | {
|
|
163
|
+
success: boolean;
|
|
164
|
+
error: string;
|
|
165
|
+
message?: undefined;
|
|
166
|
+
}>;
|
|
212
167
|
}
|
|
213
168
|
//# sourceMappingURL=physics.d.ts.map
|