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
package/dist/tools/visual.js
DELETED
|
@@ -1,282 +0,0 @@
|
|
|
1
|
-
import { loadEnv } from '../types/env.js';
|
|
2
|
-
import { Logger } from '../utils/logger.js';
|
|
3
|
-
import { coerceStringArray, interpretStandardResult } from '../utils/result-helpers.js';
|
|
4
|
-
import { promises as fs } from 'fs';
|
|
5
|
-
import path from 'path';
|
|
6
|
-
export class VisualTools {
|
|
7
|
-
bridge;
|
|
8
|
-
env = loadEnv();
|
|
9
|
-
log = new Logger('VisualTools');
|
|
10
|
-
constructor(bridge) {
|
|
11
|
-
this.bridge = bridge;
|
|
12
|
-
}
|
|
13
|
-
// Take a screenshot of viewport (high res or standard). Returns path and base64 (truncated)
|
|
14
|
-
async takeScreenshot(params) {
|
|
15
|
-
const res = params.resolution && /^\d+x\d+$/i.test(params.resolution) ? params.resolution : '';
|
|
16
|
-
const primaryCommand = res ? `HighResShot ${res}` : 'Shot';
|
|
17
|
-
const captureStartedAt = Date.now();
|
|
18
|
-
try {
|
|
19
|
-
const firstAttempt = await this.bridge.executeConsoleCommand(primaryCommand);
|
|
20
|
-
const firstSummary = this.bridge.summarizeConsoleCommand(primaryCommand, firstAttempt);
|
|
21
|
-
if (!res) {
|
|
22
|
-
const output = (firstSummary.output || '').toLowerCase();
|
|
23
|
-
const badInput = output.includes('bad input') || output.includes('unrecognized command');
|
|
24
|
-
const hasErrorLine = firstSummary.logLines?.some(line => /error:/i.test(line));
|
|
25
|
-
if (badInput || hasErrorLine) {
|
|
26
|
-
this.log.debug(`Screenshot primary command reported an error (${firstSummary.output || 'no output'})`);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
// Give the engine a moment to write the file (UE can flush asynchronously)
|
|
30
|
-
await new Promise(r => setTimeout(r, 1200));
|
|
31
|
-
const p = await this.findLatestScreenshot(captureStartedAt);
|
|
32
|
-
if (!p) {
|
|
33
|
-
this.log.warn('Screenshot captured but output file was not found');
|
|
34
|
-
return { success: true, message: 'Screenshot triggered, but could not locate output file' };
|
|
35
|
-
}
|
|
36
|
-
let b64;
|
|
37
|
-
let truncated = false;
|
|
38
|
-
let sizeBytes;
|
|
39
|
-
let mime;
|
|
40
|
-
try {
|
|
41
|
-
const stat = await fs.stat(p);
|
|
42
|
-
sizeBytes = stat.size;
|
|
43
|
-
const max = 1024 * 1024; // 1 MiB cap for inline payloads
|
|
44
|
-
if (stat.size <= max) {
|
|
45
|
-
const buf = await fs.readFile(p);
|
|
46
|
-
b64 = buf.toString('base64');
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
49
|
-
truncated = true;
|
|
50
|
-
}
|
|
51
|
-
const ext = path.extname(p).toLowerCase();
|
|
52
|
-
if (ext === '.png')
|
|
53
|
-
mime = 'image/png';
|
|
54
|
-
else if (ext === '.jpg' || ext === '.jpeg')
|
|
55
|
-
mime = 'image/jpeg';
|
|
56
|
-
else if (ext === '.bmp')
|
|
57
|
-
mime = 'image/bmp';
|
|
58
|
-
}
|
|
59
|
-
catch { }
|
|
60
|
-
return {
|
|
61
|
-
success: true,
|
|
62
|
-
imagePath: p.replace(/\\/g, '/'),
|
|
63
|
-
imageMimeType: mime,
|
|
64
|
-
imageSizeBytes: sizeBytes,
|
|
65
|
-
imageBase64: b64,
|
|
66
|
-
imageBase64Truncated: truncated
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
catch (err) {
|
|
70
|
-
return { success: false, error: String(err?.message || err) };
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
async getEngineScreenshotDirectories() {
|
|
74
|
-
const python = `
|
|
75
|
-
import unreal
|
|
76
|
-
import json
|
|
77
|
-
import os
|
|
78
|
-
|
|
79
|
-
result = {
|
|
80
|
-
"success": True,
|
|
81
|
-
"message": "",
|
|
82
|
-
"error": "",
|
|
83
|
-
"directories": [],
|
|
84
|
-
"warnings": [],
|
|
85
|
-
"details": []
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
def finalize():
|
|
89
|
-
data = dict(result)
|
|
90
|
-
if data.get("success"):
|
|
91
|
-
if not data.get("message"):
|
|
92
|
-
data["message"] = "Collected screenshot directories"
|
|
93
|
-
data.pop("error", None)
|
|
94
|
-
else:
|
|
95
|
-
if not data.get("error"):
|
|
96
|
-
data["error"] = data.get("message") or "Failed to collect screenshot directories"
|
|
97
|
-
if not data.get("message"):
|
|
98
|
-
data["message"] = data["error"]
|
|
99
|
-
if not data.get("warnings"):
|
|
100
|
-
data.pop("warnings", None)
|
|
101
|
-
if not data.get("details"):
|
|
102
|
-
data.pop("details", None)
|
|
103
|
-
if not data.get("directories"):
|
|
104
|
-
data.pop("directories", None)
|
|
105
|
-
return data
|
|
106
|
-
|
|
107
|
-
def add_path(candidate, note=None):
|
|
108
|
-
if not candidate:
|
|
109
|
-
return
|
|
110
|
-
try:
|
|
111
|
-
abs_path = os.path.abspath(os.path.normpath(candidate))
|
|
112
|
-
except Exception as normalize_error:
|
|
113
|
-
result["warnings"].append(f"Failed to normalize path {candidate}: {normalize_error}")
|
|
114
|
-
return
|
|
115
|
-
if abs_path not in result["directories"]:
|
|
116
|
-
result["directories"].append(abs_path)
|
|
117
|
-
if note:
|
|
118
|
-
result["details"].append(f"{note}: {abs_path}")
|
|
119
|
-
else:
|
|
120
|
-
result["details"].append(f"Discovered screenshot directory: {abs_path}")
|
|
121
|
-
|
|
122
|
-
try:
|
|
123
|
-
automation_dir = unreal.AutomationLibrary.get_screenshot_directory()
|
|
124
|
-
add_path(automation_dir, "Automation screenshot directory")
|
|
125
|
-
except Exception as automation_error:
|
|
126
|
-
result["warnings"].append(f"Automation screenshot directory unavailable: {automation_error}")
|
|
127
|
-
|
|
128
|
-
try:
|
|
129
|
-
project_saved = unreal.Paths.project_saved_dir()
|
|
130
|
-
add_path(project_saved, "Project Saved directory")
|
|
131
|
-
if project_saved:
|
|
132
|
-
add_path(os.path.join(project_saved, 'Screenshots'), "Project Saved screenshots")
|
|
133
|
-
add_path(os.path.join(project_saved, 'Screenshots', 'Windows'), "Project Saved Windows screenshots")
|
|
134
|
-
add_path(os.path.join(project_saved, 'Screenshots', 'WindowsEditor'), "Project Saved WindowsEditor screenshots")
|
|
135
|
-
try:
|
|
136
|
-
platform_name = unreal.SystemLibrary.get_platform_user_name()
|
|
137
|
-
if platform_name:
|
|
138
|
-
add_path(os.path.join(project_saved, 'Screenshots', platform_name), f"Project Saved screenshots for {platform_name}")
|
|
139
|
-
add_path(os.path.join(project_saved, 'Screenshots', f"{platform_name}Editor"), f"Project Saved editor screenshots for {platform_name}")
|
|
140
|
-
except Exception as platform_error:
|
|
141
|
-
result["warnings"].append(f"Failed to resolve platform-specific screenshot directories: {platform_error}")
|
|
142
|
-
except Exception as saved_error:
|
|
143
|
-
result["warnings"].append(f"Project Saved directory unavailable: {saved_error}")
|
|
144
|
-
|
|
145
|
-
try:
|
|
146
|
-
project_file = unreal.Paths.get_project_file_path()
|
|
147
|
-
if project_file:
|
|
148
|
-
project_dir = os.path.dirname(project_file)
|
|
149
|
-
add_path(os.path.join(project_dir, 'Saved', 'Screenshots'), "Project directory screenshots")
|
|
150
|
-
add_path(os.path.join(project_dir, 'Saved', 'Screenshots', 'Windows'), "Project directory Windows screenshots")
|
|
151
|
-
add_path(os.path.join(project_dir, 'Saved', 'Screenshots', 'WindowsEditor'), "Project directory WindowsEditor screenshots")
|
|
152
|
-
except Exception as project_error:
|
|
153
|
-
result["warnings"].append(f"Project directory screenshots unavailable: {project_error}")
|
|
154
|
-
|
|
155
|
-
if not result["directories"]:
|
|
156
|
-
result["warnings"].append("No screenshot directories discovered")
|
|
157
|
-
|
|
158
|
-
print('RESULT:' + json.dumps(finalize()))
|
|
159
|
-
`.trim()
|
|
160
|
-
.replace(/\r?\n/g, '\n');
|
|
161
|
-
try {
|
|
162
|
-
const response = await this.bridge.executePython(python);
|
|
163
|
-
const interpreted = interpretStandardResult(response, {
|
|
164
|
-
successMessage: 'Collected screenshot directories',
|
|
165
|
-
failureMessage: 'Failed to collect screenshot directories'
|
|
166
|
-
});
|
|
167
|
-
if (interpreted.details) {
|
|
168
|
-
for (const entry of interpreted.details) {
|
|
169
|
-
this.log.debug(entry);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
if (interpreted.warnings) {
|
|
173
|
-
for (const warning of interpreted.warnings) {
|
|
174
|
-
this.log.debug(`Screenshot directory warning: ${warning}`);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
const directories = coerceStringArray(interpreted.payload.directories);
|
|
178
|
-
if (directories?.length) {
|
|
179
|
-
return directories;
|
|
180
|
-
}
|
|
181
|
-
if (!interpreted.success && interpreted.error) {
|
|
182
|
-
this.log.warn(`Screenshot path probe failed: ${interpreted.error}`);
|
|
183
|
-
}
|
|
184
|
-
if (interpreted.rawText) {
|
|
185
|
-
try {
|
|
186
|
-
const fallback = JSON.parse(interpreted.rawText);
|
|
187
|
-
const fallbackDirs = coerceStringArray(fallback);
|
|
188
|
-
if (fallbackDirs?.length) {
|
|
189
|
-
return fallbackDirs;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
catch { }
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
catch (err) {
|
|
196
|
-
this.log.debug('Screenshot path probe failed', err);
|
|
197
|
-
}
|
|
198
|
-
return [];
|
|
199
|
-
}
|
|
200
|
-
async findLatestScreenshot(since) {
|
|
201
|
-
// Try env override, otherwise look in common UE Saved/Screenshots folder under project
|
|
202
|
-
const candidates = [];
|
|
203
|
-
const seen = new Set();
|
|
204
|
-
const addCandidate = (candidate) => {
|
|
205
|
-
if (!candidate)
|
|
206
|
-
return;
|
|
207
|
-
const normalized = path.isAbsolute(candidate)
|
|
208
|
-
? path.normalize(candidate)
|
|
209
|
-
: path.resolve(candidate);
|
|
210
|
-
if (!seen.has(normalized)) {
|
|
211
|
-
seen.add(normalized);
|
|
212
|
-
candidates.push(normalized);
|
|
213
|
-
}
|
|
214
|
-
};
|
|
215
|
-
if (this.env.UE_SCREENSHOT_DIR)
|
|
216
|
-
addCandidate(this.env.UE_SCREENSHOT_DIR);
|
|
217
|
-
if (this.env.UE_PROJECT_PATH) {
|
|
218
|
-
const projectDir = path.dirname(this.env.UE_PROJECT_PATH);
|
|
219
|
-
addCandidate(path.join(projectDir, 'Saved', 'Screenshots'));
|
|
220
|
-
addCandidate(path.join(projectDir, 'Saved', 'Screenshots', 'Windows'));
|
|
221
|
-
addCandidate(path.join(projectDir, 'Saved', 'Screenshots', 'WindowsEditor'));
|
|
222
|
-
}
|
|
223
|
-
const engineDirs = await this.getEngineScreenshotDirectories();
|
|
224
|
-
for (const dir of engineDirs) {
|
|
225
|
-
addCandidate(dir);
|
|
226
|
-
}
|
|
227
|
-
// Fallback: common locations relative to current working directory
|
|
228
|
-
addCandidate(path.join(process.cwd(), 'Saved', 'Screenshots'));
|
|
229
|
-
addCandidate(path.join(process.cwd(), 'Saved', 'Screenshots', 'Windows'));
|
|
230
|
-
addCandidate(path.join(process.cwd(), 'Saved', 'Screenshots', 'WindowsEditor'));
|
|
231
|
-
const searchDirs = new Set();
|
|
232
|
-
const queue = [...candidates];
|
|
233
|
-
while (queue.length) {
|
|
234
|
-
const candidate = queue.pop();
|
|
235
|
-
if (!candidate || searchDirs.has(candidate))
|
|
236
|
-
continue;
|
|
237
|
-
searchDirs.add(candidate);
|
|
238
|
-
try {
|
|
239
|
-
const entries = await fs.readdir(candidate, { withFileTypes: true });
|
|
240
|
-
for (const entry of entries) {
|
|
241
|
-
if (entry.isDirectory()) {
|
|
242
|
-
queue.push(path.join(candidate, entry.name));
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
catch { }
|
|
247
|
-
}
|
|
248
|
-
let latest = null;
|
|
249
|
-
let latestSince = null;
|
|
250
|
-
const cutoff = since ? since - 2000 : undefined; // allow slight clock drift
|
|
251
|
-
for (const dirPath of searchDirs) {
|
|
252
|
-
let entries;
|
|
253
|
-
try {
|
|
254
|
-
entries = await fs.readdir(dirPath);
|
|
255
|
-
}
|
|
256
|
-
catch {
|
|
257
|
-
continue;
|
|
258
|
-
}
|
|
259
|
-
for (const entry of entries) {
|
|
260
|
-
const fp = path.join(dirPath, entry);
|
|
261
|
-
if (!/\.(png|jpg|jpeg|bmp)$/i.test(fp))
|
|
262
|
-
continue;
|
|
263
|
-
try {
|
|
264
|
-
const st = await fs.stat(fp);
|
|
265
|
-
const info = { path: fp, mtime: st.mtimeMs };
|
|
266
|
-
if (!latest || info.mtime > latest.mtime) {
|
|
267
|
-
latest = info;
|
|
268
|
-
}
|
|
269
|
-
if (cutoff !== undefined && st.mtimeMs >= cutoff) {
|
|
270
|
-
if (!latestSince || info.mtime > latestSince.mtime) {
|
|
271
|
-
latestSince = info;
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
catch { }
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
const chosen = latestSince || latest;
|
|
279
|
-
return chosen?.path || null;
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
//# sourceMappingURL=visual.js.map
|
package/dist/utils/http.d.ts
DELETED
package/dist/utils/http.js
DELETED
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
import axios from 'axios';
|
|
2
|
-
import http from 'http';
|
|
3
|
-
import https from 'https';
|
|
4
|
-
import { Logger } from './logger.js';
|
|
5
|
-
class SimpleCache {
|
|
6
|
-
cache = new Map();
|
|
7
|
-
maxSize = 100;
|
|
8
|
-
set(key, data, ttl = 60000) {
|
|
9
|
-
// Prevent unbounded growth
|
|
10
|
-
if (this.cache.size >= this.maxSize) {
|
|
11
|
-
const firstKey = this.cache.keys().next().value;
|
|
12
|
-
if (firstKey !== undefined) {
|
|
13
|
-
this.cache.delete(firstKey);
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
this.cache.set(key, {
|
|
17
|
-
data,
|
|
18
|
-
timestamp: Date.now(),
|
|
19
|
-
ttl
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
get(key) {
|
|
23
|
-
const entry = this.cache.get(key);
|
|
24
|
-
if (!entry)
|
|
25
|
-
return null;
|
|
26
|
-
// Check if expired
|
|
27
|
-
if (Date.now() - entry.timestamp > entry.ttl) {
|
|
28
|
-
this.cache.delete(key);
|
|
29
|
-
return null;
|
|
30
|
-
}
|
|
31
|
-
return entry.data;
|
|
32
|
-
}
|
|
33
|
-
clear() {
|
|
34
|
-
this.cache.clear();
|
|
35
|
-
}
|
|
36
|
-
getStats() {
|
|
37
|
-
return { size: this.cache.size, maxSize: this.maxSize };
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
const responseCache = new SimpleCache();
|
|
41
|
-
// Enhanced connection pooling configuration to prevent socket failures
|
|
42
|
-
const httpAgent = new http.Agent({
|
|
43
|
-
keepAlive: true,
|
|
44
|
-
keepAliveMsecs: 60000, // Increased keep-alive time
|
|
45
|
-
maxSockets: 20, // Increased socket pool
|
|
46
|
-
maxFreeSockets: 10, // More free sockets
|
|
47
|
-
timeout: 60000, // Longer timeout
|
|
48
|
-
});
|
|
49
|
-
const httpsAgent = new https.Agent({
|
|
50
|
-
keepAlive: true,
|
|
51
|
-
keepAliveMsecs: 60000, // Increased keep-alive time
|
|
52
|
-
maxSockets: 20, // Increased socket pool
|
|
53
|
-
maxFreeSockets: 10, // More free sockets
|
|
54
|
-
timeout: 60000, // Longer timeout
|
|
55
|
-
});
|
|
56
|
-
const log = new Logger('HTTP');
|
|
57
|
-
/**
|
|
58
|
-
* Enhanced HTTP client factory with connection pooling and request timing
|
|
59
|
-
*/
|
|
60
|
-
export function createHttpClient(baseURL) {
|
|
61
|
-
const client = axios.create({
|
|
62
|
-
baseURL,
|
|
63
|
-
headers: {
|
|
64
|
-
'Content-Type': 'application/json',
|
|
65
|
-
'Accept': 'application/json'
|
|
66
|
-
},
|
|
67
|
-
timeout: 15000,
|
|
68
|
-
httpAgent,
|
|
69
|
-
httpsAgent,
|
|
70
|
-
// Ensure proper handling of request body transformation
|
|
71
|
-
transformRequest: [(data, headers) => {
|
|
72
|
-
// Remove Content-Length if it's set incorrectly
|
|
73
|
-
delete headers['Content-Length'];
|
|
74
|
-
delete headers['content-length'];
|
|
75
|
-
// Properly stringify JSON data
|
|
76
|
-
if (data && typeof data === 'object') {
|
|
77
|
-
const jsonStr = JSON.stringify(data);
|
|
78
|
-
// Let axios set Content-Length automatically
|
|
79
|
-
return jsonStr;
|
|
80
|
-
}
|
|
81
|
-
return data;
|
|
82
|
-
}],
|
|
83
|
-
// Optimize response handling
|
|
84
|
-
maxContentLength: 50 * 1024 * 1024, // 50MB
|
|
85
|
-
maxBodyLength: 50 * 1024 * 1024,
|
|
86
|
-
decompress: true
|
|
87
|
-
});
|
|
88
|
-
// Request interceptor: timing, caching check, and logging
|
|
89
|
-
client.interceptors.request.use((config) => {
|
|
90
|
-
// Add metadata for performance tracking
|
|
91
|
-
config.metadata = { startTime: Date.now() };
|
|
92
|
-
// Check cache for GET requests
|
|
93
|
-
if (config.method?.toLowerCase() === 'get' && config.url) {
|
|
94
|
-
const cacheKey = `${config.url}:${JSON.stringify(config.params || {})}`;
|
|
95
|
-
const cached = responseCache.get(cacheKey);
|
|
96
|
-
if (cached) {
|
|
97
|
-
log.debug(`[HTTP Cache Hit] ${config.url}`);
|
|
98
|
-
// Return cached response
|
|
99
|
-
config.cached = cached;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
return config;
|
|
103
|
-
}, (error) => {
|
|
104
|
-
log.error('[HTTP Request Error]', error);
|
|
105
|
-
return Promise.reject(error);
|
|
106
|
-
});
|
|
107
|
-
// Response interceptor: timing, caching, and error handling
|
|
108
|
-
client.interceptors.response.use((response) => {
|
|
109
|
-
// Check if we used cached response
|
|
110
|
-
if (response.config.cached) {
|
|
111
|
-
return Promise.resolve({
|
|
112
|
-
...response,
|
|
113
|
-
data: response.config.cached,
|
|
114
|
-
status: 200,
|
|
115
|
-
statusText: 'OK (Cached)',
|
|
116
|
-
headers: {},
|
|
117
|
-
config: response.config
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
// Performance tracking
|
|
121
|
-
const duration = Date.now() - (response.config.metadata?.startTime || 0);
|
|
122
|
-
if (duration > 5000) {
|
|
123
|
-
log.warn(`[HTTP Slow] ${response.config.url} took ${duration}ms`);
|
|
124
|
-
}
|
|
125
|
-
else if (duration > 1000) {
|
|
126
|
-
log.debug(`[HTTP] ${response.config.url} took ${duration}ms`);
|
|
127
|
-
}
|
|
128
|
-
// Cache successful GET responses
|
|
129
|
-
if (response.config.method?.toLowerCase() === 'get' &&
|
|
130
|
-
response.status === 200 &&
|
|
131
|
-
response.config.url) {
|
|
132
|
-
const cacheKey = `${response.config.url}:${JSON.stringify(response.config.params || {})}`;
|
|
133
|
-
// Cache for 30 seconds by default
|
|
134
|
-
responseCache.set(cacheKey, response.data, 30000);
|
|
135
|
-
}
|
|
136
|
-
return response;
|
|
137
|
-
}, (error) => {
|
|
138
|
-
// Enhanced error logging
|
|
139
|
-
const duration = Date.now() - (error.config?.metadata?.startTime || 0);
|
|
140
|
-
log.error(`[HTTP Error] ${error.config?.url} failed after ${duration}ms:`, {
|
|
141
|
-
status: error.response?.status,
|
|
142
|
-
message: error.message,
|
|
143
|
-
code: error.code
|
|
144
|
-
});
|
|
145
|
-
return Promise.reject(error);
|
|
146
|
-
});
|
|
147
|
-
return client;
|
|
148
|
-
}
|
|
149
|
-
// No retry helpers are exported; consolidated command flows rely on
|
|
150
|
-
// Unreal's own retry/backoff semantics to avoid duplicate side effects.
|
|
151
|
-
//# sourceMappingURL=http.js.map
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
export interface PythonOutput {
|
|
2
|
-
raw: unknown;
|
|
3
|
-
text: string;
|
|
4
|
-
}
|
|
5
|
-
export interface TaggedJsonResult<T> extends PythonOutput {
|
|
6
|
-
data: T | null;
|
|
7
|
-
}
|
|
8
|
-
export interface StandardResultPayload {
|
|
9
|
-
success?: boolean;
|
|
10
|
-
message?: string;
|
|
11
|
-
error?: string;
|
|
12
|
-
[key: string]: unknown;
|
|
13
|
-
}
|
|
14
|
-
export declare function toPythonOutput(response: unknown): PythonOutput;
|
|
15
|
-
export declare function parseStandardResult(response: unknown, tag?: string): TaggedJsonResult<StandardResultPayload>;
|
|
16
|
-
export declare function stripTaggedResultLines(text: string, tag?: string): string;
|
|
17
|
-
export declare function extractTaggedLine(output: string | PythonOutput, prefix: string): string | null;
|
|
18
|
-
//# sourceMappingURL=python-output.d.ts.map
|