@jshookmcp/jshook 0.2.3 → 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -5
- package/README.zh.md +18 -3
- package/dist/packages/extension-sdk/src/bridges/shared.js +2 -2
- package/dist/packages/extension-sdk/src/plugin.d.ts +5 -0
- package/dist/packages/extension-sdk/src/plugin.js +119 -33
- package/dist/packages/extension-sdk/src/workflow.d.ts +156 -0
- package/dist/packages/extension-sdk/src/workflow.js +236 -0
- package/dist/src/config/search-defaults.js +161 -0
- package/dist/src/constants.d.ts +3 -0
- package/dist/src/constants.js +4 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +13 -17
- package/dist/src/modules/analyzer/CodeAnalyzer.d.ts +1 -3
- package/dist/src/modules/analyzer/CodeAnalyzer.js +16 -28
- package/dist/src/modules/analyzer/CodeAnalyzerDataFlow.d.ts +1 -2
- package/dist/src/modules/analyzer/CodeAnalyzerDataFlow.js +1 -45
- package/dist/src/modules/analyzer/IntelligentAnalyzer.d.ts +1 -37
- package/dist/src/modules/analyzer/IntelligentAnalyzer.js +9 -142
- package/dist/src/modules/analyzer/PatternDetector.js +3 -3
- package/dist/src/modules/analyzer/PatternDetectorAuthPatterns.js +1 -1
- package/dist/src/modules/browser/BrowserDiscovery.js +2 -2
- package/dist/src/modules/browser/BrowserModeManager.js +11 -10
- package/dist/src/modules/browser/TabRegistry.js +2 -2
- package/dist/src/modules/browser/UnifiedBrowserManager.d.ts +1 -0
- package/dist/src/modules/browser/UnifiedBrowserManager.js +18 -3
- package/dist/src/modules/captcha/AICaptchaDetector.d.ts +1 -10
- package/dist/src/modules/captcha/AICaptchaDetector.js +7 -201
- package/dist/src/modules/collector/CodeCollector.js +4 -5
- package/dist/src/modules/collector/DOMInspector.js +48 -58
- package/dist/src/modules/collector/PageController.d.ts +17 -4
- package/dist/src/modules/collector/PageController.js +2 -5
- package/dist/src/modules/collector/PageScriptCollectors.js +3 -3
- package/dist/src/modules/crypto/CryptoDetector.d.ts +1 -4
- package/dist/src/modules/crypto/CryptoDetector.js +2 -42
- package/dist/src/modules/crypto/CryptoRules.js +1 -1
- package/dist/src/modules/debugger/BlackboxManager.js +1 -1
- package/dist/src/modules/debugger/DebuggerManager.impl.core.scope.js +1 -1
- package/dist/src/modules/debugger/ScriptManager.impl.extract-function-tree.js +4 -2
- package/dist/src/modules/debugger/WatchExpressionManager.js +1 -1
- package/dist/src/modules/deobfuscator/Deobfuscator.d.ts +1 -4
- package/dist/src/modules/deobfuscator/Deobfuscator.js +4 -39
- package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.d.ts +0 -3
- package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.js +2 -8
- package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.restore.d.ts +1 -2
- package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.restore.js +3 -55
- package/dist/src/modules/deobfuscator/JScramblerDeobfuscator.js +3 -4
- package/dist/src/modules/deobfuscator/VMDeobfuscator.d.ts +2 -10
- package/dist/src/modules/deobfuscator/VMDeobfuscator.js +3 -128
- package/dist/src/modules/deobfuscator/webcrack.js +15 -2
- package/dist/src/modules/emulator/AIEnvironmentAnalyzer.d.ts +5 -8
- package/dist/src/modules/emulator/AIEnvironmentAnalyzer.js +10 -102
- package/dist/src/modules/emulator/EnvironmentEmulator.d.ts +1 -5
- package/dist/src/modules/emulator/EnvironmentEmulator.js +7 -91
- package/dist/src/modules/emulator/EnvironmentEmulatorFetch.js +58 -61
- package/dist/src/modules/emulator/templates/chrome-env.d.ts +17 -7
- package/dist/src/modules/emulator/templates/chrome-env.js +14 -7
- package/dist/src/modules/external/ExternalToolRunner.js +25 -22
- package/dist/src/modules/hook/HookGeneratorBuilders.core.generators.compose.js +5 -5
- package/dist/src/modules/hook/HookGeneratorBuilders.core.generators.network.js +311 -311
- package/dist/src/modules/hook/HookGeneratorBuilders.core.generators.runtime.js +410 -410
- package/dist/src/modules/hook/HookGeneratorBuilders.core.generators.storage.js +122 -122
- package/dist/src/modules/monitor/ConsoleMonitor.impl.core.class.d.ts +13 -0
- package/dist/src/modules/monitor/ConsoleMonitor.impl.core.class.js +42 -0
- package/dist/src/modules/monitor/ConsoleMonitor.impl.core.dynamic.js +194 -194
- package/dist/src/modules/monitor/FetchInterceptor.d.ts +46 -0
- package/dist/src/modules/monitor/FetchInterceptor.js +191 -0
- package/dist/src/modules/monitor/PerformanceMonitor.js +8 -7
- package/dist/src/modules/monitor/PlaywrightNetworkMonitor.js +62 -62
- package/dist/src/modules/process/BaseMemoryManager.d.ts +1 -1
- package/dist/src/modules/process/LinuxProcessManager.js +2 -0
- package/dist/src/modules/process/MacProcessManager.js +25 -25
- package/dist/src/modules/process/MemoryManager.d.ts +1 -1
- package/dist/src/modules/process/MemoryManager.js +2 -2
- package/dist/src/modules/process/memory/AuditTrail.js +1 -1
- package/dist/src/modules/process/memory/availability.js +49 -49
- package/dist/src/modules/process/memory/injector.js +185 -185
- package/dist/src/modules/process/memory/reader.js +85 -53
- package/dist/src/modules/process/memory/regions.dump.js +51 -51
- package/dist/src/modules/process/memory/regions.enumerate.js +108 -108
- package/dist/src/modules/process/memory/regions.modules.js +80 -80
- package/dist/src/modules/process/memory/regions.protection.js +148 -115
- package/dist/src/modules/process/memory/scanner.d.ts +5 -1
- package/dist/src/modules/process/memory/scanner.darwin.js +98 -41
- package/dist/src/modules/process/memory/scanner.js +88 -4
- package/dist/src/modules/process/memory/scanner.windows.js +124 -124
- package/dist/src/modules/process/memory/writer.js +98 -58
- package/dist/src/modules/security/ExecutionSandbox.js +51 -52
- package/dist/src/modules/stealth/FingerprintManager.js +1 -1
- package/dist/src/modules/stealth/StealthScripts.d.ts +1 -0
- package/dist/src/modules/stealth/StealthScripts.js +18 -13
- package/dist/src/modules/stealth/StealthVerifier.js +1 -3
- package/dist/src/modules/symbolic/JSVMPSymbolicExecutor.d.ts +14 -0
- package/dist/src/modules/symbolic/JSVMPSymbolicExecutor.js +181 -2
- package/dist/src/modules/trace/TraceDB.js +75 -69
- package/dist/src/modules/trace/TraceRecorder.js +1 -5
- package/dist/src/native/AntiCheatDetector.js +67 -16
- package/dist/src/native/CodeInjector.js +3 -3
- package/dist/src/native/HardwareBreakpoint.js +24 -15
- package/dist/src/native/HeapAnalyzer.js +2 -2
- package/dist/src/native/MemoryController.js +1 -1
- package/dist/src/native/MemoryScanSession.js +2 -2
- package/dist/src/native/MemoryScanner.js +4 -8
- package/dist/src/native/NativeMemoryManager.impl.js +2 -2
- package/dist/src/native/PEAnalyzer.js +14 -15
- package/dist/src/native/PointerChainEngine.js +2 -4
- package/dist/src/native/ScriptLoader.js +4 -9
- package/dist/src/native/Speedhack.js +1 -1
- package/dist/src/native/StructureAnalyzer.js +52 -33
- package/dist/src/native/Win32API.d.ts +1 -0
- package/dist/src/native/Win32API.js +13 -0
- package/dist/src/native/Win32Debug.js +19 -19
- package/dist/src/native/platform/darwin/DarwinAPI.d.ts +2 -0
- package/dist/src/native/platform/darwin/DarwinAPI.js +8 -0
- package/dist/src/native/platform/darwin/DarwinMemoryProvider.js +6 -1
- package/dist/src/server/MCPServer.context.d.ts +2 -1
- package/dist/src/server/MCPServer.d.ts +2 -1
- package/dist/src/server/MCPServer.domain.d.ts +1 -1
- package/dist/src/server/MCPServer.domain.js +81 -16
- package/dist/src/server/MCPServer.js +41 -14
- package/dist/src/server/MCPServer.resources.d.ts +2 -0
- package/dist/src/server/MCPServer.resources.js +91 -0
- package/dist/src/server/MCPServer.search.handlers.call.js +2 -1
- package/dist/src/server/MCPServer.search.helpers.js +1 -1
- package/dist/src/server/MCPServer.transport.js +12 -0
- package/dist/src/server/ToolCallContextGuard.js +8 -0
- package/dist/src/server/ToolRouter.d.ts +25 -9
- package/dist/src/server/ToolRouter.intent.d.ts +26 -0
- package/dist/src/server/ToolRouter.intent.js +77 -0
- package/dist/src/server/ToolRouter.js +103 -284
- package/dist/src/server/ToolRouter.policy.d.ts +22 -0
- package/dist/src/server/ToolRouter.policy.js +163 -0
- package/dist/src/server/ToolRouter.probe.d.ts +17 -0
- package/dist/src/server/ToolRouter.probe.js +103 -0
- package/dist/src/server/ToolRouter.renderer.d.ts +9 -0
- package/dist/src/server/ToolRouter.renderer.js +52 -0
- package/dist/src/server/activation/ActivationController.js +15 -12
- package/dist/src/server/activation/CompoundConditionEngine.js +1 -1
- package/dist/src/server/activation/PredictiveBooster.js +1 -3
- package/dist/src/server/domains/analysis/definitions.js +155 -655
- package/dist/src/server/domains/analysis/handlers.impl.js +26 -20
- package/dist/src/server/domains/analysis/handlers.web-tools.js +2 -1
- package/dist/src/server/domains/analysis/manifest.js +6 -4
- package/dist/src/server/domains/antidebug/definitions.js +25 -111
- package/dist/src/server/domains/browser/definitions.tools.advanced.js +59 -88
- package/dist/src/server/domains/browser/definitions.tools.behavior.js +120 -227
- package/dist/src/server/domains/browser/definitions.tools.page-core.js +210 -439
- package/dist/src/server/domains/browser/definitions.tools.page-system.js +108 -250
- package/dist/src/server/domains/browser/definitions.tools.runtime.js +98 -211
- package/dist/src/server/domains/browser/definitions.tools.security.js +194 -339
- package/dist/src/server/domains/browser/handlers/camoufox-browser.js +3 -2
- package/dist/src/server/domains/browser/handlers/captcha-solver.js +3 -3
- package/dist/src/server/domains/browser/handlers/dom-query.js +2 -1
- package/dist/src/server/domains/browser/handlers/framework-state.js +27 -9
- package/dist/src/server/domains/browser/handlers/indexeddb-dump.js +21 -20
- package/dist/src/server/domains/browser/handlers/script-management.js +1 -1
- package/dist/src/server/domains/browser/handlers.impl.d.ts +1 -2
- package/dist/src/server/domains/browser/handlers.impl.js +2 -3
- package/dist/src/server/domains/browser/manifest.js +37 -13
- package/dist/src/server/domains/coordination/definitions.js +50 -216
- package/dist/src/server/domains/coordination/index.d.ts +2 -1
- package/dist/src/server/domains/coordination/index.js +1 -0
- package/dist/src/server/domains/debugger/definitions.tools.advanced.js +72 -189
- package/dist/src/server/domains/debugger/definitions.tools.core.js +114 -288
- package/dist/src/server/domains/debugger/manifest.js +9 -2
- package/dist/src/server/domains/encoding/definitions.js +43 -153
- package/dist/src/server/domains/encoding/handlers.base.js +2 -2
- package/dist/src/server/domains/evidence/definitions.d.ts +2 -0
- package/dist/src/server/domains/evidence/definitions.js +42 -0
- package/dist/src/server/domains/evidence/handlers.d.ts +582 -0
- package/dist/src/server/domains/evidence/handlers.js +60 -0
- package/dist/src/server/domains/evidence/index.d.ts +2 -0
- package/dist/src/server/domains/evidence/index.js +2 -0
- package/dist/src/server/domains/evidence/manifest.d.ts +63 -0
- package/dist/src/server/domains/evidence/manifest.js +78 -0
- package/dist/src/server/domains/graphql/definitions.js +53 -141
- package/dist/src/server/domains/graphql/handlers.impl.core.runtime.replay.js +92 -114
- package/dist/src/server/domains/graphql/handlers.impl.core.runtime.shared.js +77 -77
- package/dist/src/server/domains/hooks/ai-handlers.d.ts +0 -7
- package/dist/src/server/domains/hooks/ai-handlers.js +1 -67
- package/dist/src/server/domains/hooks/definitions.js +69 -335
- package/dist/src/server/domains/hooks/manifest.d.ts +1 -1
- package/dist/src/server/domains/hooks/manifest.js +1 -2
- package/dist/src/server/domains/instrumentation/definitions.d.ts +2 -0
- package/dist/src/server/domains/instrumentation/definitions.js +99 -0
- package/dist/src/server/domains/instrumentation/handlers.d.ts +78 -0
- package/dist/src/server/domains/instrumentation/handlers.js +206 -0
- package/dist/src/server/domains/instrumentation/index.d.ts +2 -0
- package/dist/src/server/domains/instrumentation/index.js +2 -0
- package/dist/src/server/domains/instrumentation/manifest.d.ts +63 -0
- package/dist/src/server/domains/instrumentation/manifest.js +114 -0
- package/dist/src/server/domains/macro/definitions.js +16 -43
- package/dist/src/server/domains/maintenance/definitions.js +60 -219
- package/dist/src/server/domains/maintenance/handlers.extensions.js +78 -20
- package/dist/src/server/domains/memory/definitions.js +387 -559
- package/dist/src/server/domains/memory/handlers/hooks.d.ts +55 -0
- package/dist/src/server/domains/memory/handlers/hooks.js +115 -0
- package/dist/src/server/domains/memory/handlers/integrity.d.ts +77 -0
- package/dist/src/server/domains/memory/handlers/integrity.js +180 -0
- package/dist/src/server/domains/memory/handlers/pointer-chain.d.ts +29 -0
- package/dist/src/server/domains/memory/handlers/pointer-chain.js +82 -0
- package/dist/src/server/domains/memory/handlers/readwrite.d.ts +41 -0
- package/dist/src/server/domains/memory/handlers/readwrite.js +78 -0
- package/dist/src/server/domains/memory/handlers/scan.d.ts +35 -0
- package/dist/src/server/domains/memory/handlers/scan.js +97 -0
- package/dist/src/server/domains/memory/handlers/session.d.ts +23 -0
- package/dist/src/server/domains/memory/handlers/session.js +49 -0
- package/dist/src/server/domains/memory/handlers/structure.d.ts +29 -0
- package/dist/src/server/domains/memory/handlers/structure.js +74 -0
- package/dist/src/server/domains/memory/handlers.impl.d.ts +49 -54
- package/dist/src/server/domains/memory/handlers.impl.js +63 -494
- package/dist/src/server/domains/memory/manifest.js +236 -64
- package/dist/src/server/domains/native-bridge/definitions.js +54 -192
- package/dist/src/server/domains/native-bridge/index.d.ts +1 -0
- package/dist/src/server/domains/native-bridge/index.js +2 -1
- package/dist/src/server/domains/network/auth-extractor.js +1 -1
- package/dist/src/server/domains/network/definitions.js +175 -578
- package/dist/src/server/domains/network/handlers.base.core.d.ts +64 -0
- package/dist/src/server/domains/network/handlers.base.core.js +623 -0
- package/dist/src/server/domains/network/handlers.base.d.ts +2 -124
- package/dist/src/server/domains/network/handlers.base.js +3 -878
- package/dist/src/server/domains/network/handlers.base.performance.d.ts +63 -0
- package/dist/src/server/domains/network/handlers.base.performance.js +193 -0
- package/dist/src/server/domains/network/handlers.base.types.d.ts +42 -0
- package/dist/src/server/domains/network/handlers.base.types.js +89 -0
- package/dist/src/server/domains/network/handlers.impl.core.runtime.d.ts +1 -1
- package/dist/src/server/domains/network/handlers.impl.core.runtime.intercept.d.ts +21 -0
- package/dist/src/server/domains/network/handlers.impl.core.runtime.intercept.js +186 -0
- package/dist/src/server/domains/network/handlers.impl.core.runtime.js +1 -1
- package/dist/src/server/domains/network/manifest.js +15 -0
- package/dist/src/server/domains/network/replay.js +1 -4
- package/dist/src/server/domains/platform/definitions.js +121 -112
- package/dist/src/server/domains/platform/handlers/bridge-handlers.d.ts +4 -0
- package/dist/src/server/domains/platform/handlers/bridge-handlers.js +193 -4
- package/dist/src/server/domains/platform/handlers/electron-asar-helpers.js +26 -6
- package/dist/src/server/domains/platform/handlers/electron-dual-cdp.d.ts +3 -0
- package/dist/src/server/domains/platform/handlers/electron-dual-cdp.js +170 -0
- package/dist/src/server/domains/platform/handlers/electron-fuse-handler.d.ts +3 -0
- package/dist/src/server/domains/platform/handlers/electron-fuse-handler.js +193 -0
- package/dist/src/server/domains/platform/handlers/electron-handlers.d.ts +6 -0
- package/dist/src/server/domains/platform/handlers/electron-handlers.js +95 -2
- package/dist/src/server/domains/platform/handlers/electron-ipc-sniffer.d.ts +2 -0
- package/dist/src/server/domains/platform/handlers/electron-ipc-sniffer.js +370 -0
- package/dist/src/server/domains/platform/handlers/electron-userdata-handler.d.ts +2 -0
- package/dist/src/server/domains/platform/handlers/electron-userdata-handler.js +78 -0
- package/dist/src/server/domains/platform/handlers/miniapp-handlers.js +3 -3
- package/dist/src/server/domains/platform/handlers/v8-bytecode-handler.d.ts +2 -0
- package/dist/src/server/domains/platform/handlers/v8-bytecode-handler.js +207 -0
- package/dist/src/server/domains/platform/handlers.d.ts +48 -0
- package/dist/src/server/domains/platform/handlers.js +29 -0
- package/dist/src/server/domains/platform/manifest.js +38 -0
- package/dist/src/server/domains/process/definitions.js +163 -647
- package/dist/src/server/domains/process/handlers.base.d.ts +3 -95
- package/dist/src/server/domains/process/handlers.base.js +7 -462
- package/dist/src/server/domains/process/handlers.base.process.d.ts +61 -0
- package/dist/src/server/domains/process/handlers.base.process.js +417 -0
- package/dist/src/server/domains/process/handlers.base.types.d.ts +57 -0
- package/dist/src/server/domains/process/handlers.base.types.js +50 -0
- package/dist/src/server/domains/process/handlers.impl.core.runtime.inject.js +18 -16
- package/dist/src/server/domains/process/manifest.js +6 -1
- package/dist/src/server/domains/sandbox/definitions.js +11 -33
- package/dist/src/server/domains/sandbox/handlers.js +8 -3
- package/dist/src/server/domains/shared/ResponseBuilder.d.ts +209 -0
- package/dist/src/server/domains/shared/ResponseBuilder.js +48 -0
- package/dist/src/server/domains/shared/modules.d.ts +0 -2
- package/dist/src/server/domains/shared/modules.js +0 -1
- package/dist/src/server/domains/sourcemap/definitions.js +27 -111
- package/dist/src/server/domains/sourcemap/handlers.impl.sourcemap-common.js +7 -2
- package/dist/src/server/domains/sourcemap/handlers.impl.sourcemap-main.js +1 -1
- package/dist/src/server/domains/sourcemap/handlers.impl.sourcemap-parse-base.js +1 -1
- package/dist/src/server/domains/sourcemap/manifest.d.ts +1 -1
- package/dist/src/server/domains/sourcemap/manifest.js +1 -1
- package/dist/src/server/domains/streaming/definitions.js +36 -148
- package/dist/src/server/domains/streaming/handlers.impl.streaming-sse.js +163 -164
- package/dist/src/server/domains/streaming/handlers.impl.streaming-ws.js +1 -1
- package/dist/src/server/domains/trace/TraceSummarizer.js +8 -5
- package/dist/src/server/domains/trace/definitions.tools.js +51 -206
- package/dist/src/server/domains/trace/handlers.js +10 -12
- package/dist/src/server/domains/trace/index.d.ts +2 -1
- package/dist/src/server/domains/trace/index.js +2 -1
- package/dist/src/server/domains/trace/manifest.js +15 -3
- package/dist/src/server/domains/transform/definitions.js +50 -210
- package/dist/src/server/domains/transform/handlers.impl.transform-base.js +108 -108
- package/dist/src/server/domains/transform/handlers.impl.transform-crypto.js +18 -19
- package/dist/src/server/domains/transform/manifest.d.ts +1 -1
- package/dist/src/server/domains/transform/manifest.js +1 -1
- package/dist/src/server/domains/wasm/definitions.js +55 -232
- package/dist/src/server/domains/wasm/handlers.js +1 -1
- package/dist/src/server/domains/workflow/definitions.js +144 -414
- package/dist/src/server/domains/workflow/handlers.impl.workflow-account-bundle.js +1 -1
- package/dist/src/server/domains/workflow/handlers.impl.workflow-api.js +51 -51
- package/dist/src/server/domains/workflow/handlers.impl.workflow-base.d.ts +2 -0
- package/dist/src/server/domains/workflow/handlers.impl.workflow-base.js +126 -87
- package/dist/src/server/domains/workflow/handlers.impl.workflow-batch.js +5 -5
- package/dist/src/server/evidence/ReverseEvidenceGraph.d.ts +20 -0
- package/dist/src/server/evidence/ReverseEvidenceGraph.js +208 -0
- package/dist/src/server/evidence/index.d.ts +2 -0
- package/dist/src/server/evidence/index.js +1 -0
- package/dist/src/server/evidence/types.d.ts +22 -0
- package/dist/src/server/evidence/types.js +1 -0
- package/dist/src/server/extensions/ExtensionManager.d.ts +1 -0
- package/dist/src/server/extensions/ExtensionManager.discovery.js +72 -9
- package/dist/src/server/extensions/ExtensionManager.integrity.js +1 -1
- package/dist/src/server/extensions/ExtensionManager.js +193 -40
- package/dist/src/server/extensions/ExtensionManager.roots.d.ts +1 -1
- package/dist/src/server/extensions/ExtensionManager.roots.js +4 -4
- package/dist/src/server/extensions/plugin-config.js +1 -1
- package/dist/src/server/extensions/plugin-env.d.ts +1 -1
- package/dist/src/server/extensions/plugin-env.js +10 -4
- package/dist/src/server/extensions/types.d.ts +17 -0
- package/dist/src/server/extensions/types.js +1 -1
- package/dist/src/server/instrumentation/EvidenceGraphBridge.d.ts +13 -0
- package/dist/src/server/instrumentation/EvidenceGraphBridge.js +150 -0
- package/dist/src/server/instrumentation/InstrumentationSession.d.ts +60 -0
- package/dist/src/server/instrumentation/InstrumentationSession.js +269 -0
- package/dist/src/server/instrumentation/index.d.ts +2 -0
- package/dist/src/server/instrumentation/index.js +2 -0
- package/dist/src/server/instrumentation/types.d.ts +62 -0
- package/dist/src/server/instrumentation/types.js +7 -0
- package/dist/src/server/macros/MacroConfigLoader.d.ts +6 -5
- package/dist/src/server/macros/MacroConfigLoader.js +61 -59
- package/dist/src/server/macros/MacroRunner.js +6 -2
- package/dist/src/server/macros/builtins/index.d.ts +2 -3
- package/dist/src/server/macros/builtins/index.js +51 -7
- package/dist/src/server/plugins/PluginContract.d.ts +1 -1
- package/dist/src/server/registry/contracts.d.ts +1 -1
- package/dist/src/server/registry/discovery.js +5 -4
- package/dist/src/server/registry/ensure-browser-core.js +0 -3
- package/dist/src/server/registry/index.js +4 -4
- package/dist/src/server/registry/tool-builder.d.ts +46 -0
- package/dist/src/server/registry/tool-builder.js +105 -0
- package/dist/src/server/sandbox/QuickJSSandbox.js +16 -5
- package/dist/src/server/sandbox/SandboxHelpers.js +250 -250
- package/dist/src/server/search/EmbeddingWorker.js +5 -3
- package/dist/src/server/search/FeedbackTracker.d.ts +9 -0
- package/dist/src/server/search/FeedbackTracker.js +26 -0
- package/dist/src/server/search/QueryNormalizer.d.ts +6 -0
- package/dist/src/server/search/QueryNormalizer.js +94 -0
- package/dist/src/server/search/ToolSearchEngineImpl.d.ts +2 -3
- package/dist/src/server/search/ToolSearchEngineImpl.js +38 -88
- package/dist/src/server/workflows/WorkflowContract.d.ts +24 -0
- package/dist/src/server/workflows/WorkflowContract.js +12 -0
- package/dist/src/server/workflows/WorkflowEngine.d.ts +1 -0
- package/dist/src/server/workflows/WorkflowEngine.js +136 -3
- package/dist/src/types/config.d.ts +0 -14
- package/dist/src/types/deobfuscator.d.ts +0 -1
- package/dist/src/types/index.d.ts +1 -1
- package/dist/src/utils/DetailedDataManager.js +2 -0
- package/dist/src/utils/RingBuffer.js +5 -5
- package/dist/src/utils/TokenBudgetManager.js +1 -1
- package/dist/src/utils/UnifiedCacheManager.js +1 -1
- package/dist/src/utils/artifactRetention.js +2 -2
- package/dist/src/utils/betterSqlite3.d.ts +11 -0
- package/dist/src/utils/betterSqlite3.js +88 -0
- package/dist/src/utils/browserExecutable.js +2 -2
- package/dist/src/utils/cliFastPath.js +5 -8
- package/dist/src/utils/config.js +4 -26
- package/dist/src/utils/environmentDoctor.js +138 -11
- package/dist/src/utils/outputPaths.js +16 -9
- package/dist/src/utils/parallel.js +1 -3
- package/package.json +74 -72
- package/workflows/.gitkeep +0 -0
- package/dist/src/modules/analyzer/AISummarizer.d.ts +0 -39
- package/dist/src/modules/analyzer/AISummarizer.js +0 -122
- package/dist/src/modules/hook/AIHookGenerator.d.ts +0 -52
- package/dist/src/modules/hook/AIHookGenerator.js +0 -360
- package/dist/src/modules/hook/AIHookGeneratorTemplates.d.ts +0 -9
- package/dist/src/modules/hook/AIHookGeneratorTemplates.js +0 -157
- package/dist/src/server/macros/builtins/deobfuscate-ast-flow.d.ts +0 -2
- package/dist/src/server/macros/builtins/deobfuscate-ast-flow.js +0 -25
- package/dist/src/server/macros/builtins/unpacker-flow.d.ts +0 -2
- package/dist/src/server/macros/builtins/unpacker-flow.js +0 -25
- package/dist/src/services/LLMService.d.ts +0 -37
- package/dist/src/services/LLMService.js +0 -233
- package/dist/src/services/prompts/analysis.d.ts +0 -9
- package/dist/src/services/prompts/analysis.js +0 -158
- package/dist/src/services/prompts/crypto.d.ts +0 -2
- package/dist/src/services/prompts/crypto.js +0 -108
- package/dist/src/services/prompts/deobfuscation.d.ts +0 -6
- package/dist/src/services/prompts/deobfuscation.js +0 -300
- package/dist/src/services/prompts/environment.d.ts +0 -16
- package/dist/src/services/prompts/environment.js +0 -372
- package/dist/src/services/prompts/intelligence.d.ts +0 -4
- package/dist/src/services/prompts/intelligence.js +0 -250
- package/dist/src/services/prompts/taint.d.ts +0 -2
- package/dist/src/services/prompts/taint.js +0 -54
|
@@ -125,7 +125,7 @@ export class UnifiedCacheManager {
|
|
|
125
125
|
async cleanupLargeItems() {
|
|
126
126
|
logger.info('Cleaning up large caches...');
|
|
127
127
|
const stats = await this.getGlobalStats();
|
|
128
|
-
const sortedCaches = stats.caches.
|
|
128
|
+
const sortedCaches = stats.caches.toSorted((a, b) => b.size - a.size);
|
|
129
129
|
for (const cacheStats of sortedCaches.slice(0, 2)) {
|
|
130
130
|
const cache = this.caches.get(cacheStats.name);
|
|
131
131
|
if (cache?.clear) {
|
|
@@ -38,7 +38,7 @@ export async function cleanupArtifacts(options) {
|
|
|
38
38
|
if (cutoff > 0) {
|
|
39
39
|
const agedOut = remaining
|
|
40
40
|
.filter((entry) => entry.mtimeMs < cutoff)
|
|
41
|
-
.
|
|
41
|
+
.toSorted((a, b) => a.mtimeMs - b.mtimeMs);
|
|
42
42
|
if (agedOut.length > 0) {
|
|
43
43
|
const agedOutPaths = new Set(agedOut.map((entry) => entry.path));
|
|
44
44
|
remaining = remaining.filter((entry) => !agedOutPaths.has(entry.path));
|
|
@@ -54,7 +54,7 @@ export async function cleanupArtifacts(options) {
|
|
|
54
54
|
if (config.maxTotalBytes > 0) {
|
|
55
55
|
let totalBytes = remaining.reduce((sum, entry) => sum + entry.size, 0);
|
|
56
56
|
if (totalBytes > config.maxTotalBytes) {
|
|
57
|
-
const sizeCandidates = [...remaining].
|
|
57
|
+
const sizeCandidates = [...remaining].toSorted((a, b) => a.mtimeMs - b.mtimeMs);
|
|
58
58
|
const removedPaths = new Set();
|
|
59
59
|
for (const entry of sizeCandidates) {
|
|
60
60
|
if (totalBytes <= config.maxTotalBytes)
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type BetterSqlite3Issue = 'missing' | 'abi-mismatch' | 'load-failed';
|
|
2
|
+
export interface BetterSqlite3ProbeResult {
|
|
3
|
+
status: 'ok' | 'missing' | 'warn';
|
|
4
|
+
detail: string;
|
|
5
|
+
version: string | null;
|
|
6
|
+
issue?: BetterSqlite3Issue;
|
|
7
|
+
}
|
|
8
|
+
export declare function isBetterSqlite3RelatedError(error: unknown): boolean;
|
|
9
|
+
export declare function classifyBetterSqlite3Issue(error: unknown): BetterSqlite3Issue;
|
|
10
|
+
export declare function formatBetterSqlite3Error(error: unknown): string;
|
|
11
|
+
export declare function probeBetterSqlite3(): BetterSqlite3ProbeResult;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
const require = createRequire(import.meta.url);
|
|
3
|
+
const BETTER_SQLITE3_VERSION = '12.6.2';
|
|
4
|
+
const INSTALL_HINT = `pnpm add -O better-sqlite3@${BETTER_SQLITE3_VERSION}`;
|
|
5
|
+
const REBUILD_HINT = 'npm rebuild better-sqlite3 --foreground-scripts';
|
|
6
|
+
function extractErrorMessage(error) {
|
|
7
|
+
if (error instanceof Error) {
|
|
8
|
+
return error.message;
|
|
9
|
+
}
|
|
10
|
+
return String(error);
|
|
11
|
+
}
|
|
12
|
+
export function isBetterSqlite3RelatedError(error) {
|
|
13
|
+
return /better-sqlite3|better_sqlite3\.node|NODE_MODULE_VERSION|compiled against a different Node\.js version/i.test(extractErrorMessage(error));
|
|
14
|
+
}
|
|
15
|
+
export function classifyBetterSqlite3Issue(error) {
|
|
16
|
+
const message = extractErrorMessage(error);
|
|
17
|
+
if (/Cannot find module 'better-sqlite3'|Cannot find package 'better-sqlite3'|better-sqlite3 is not installed/i.test(message)) {
|
|
18
|
+
return 'missing';
|
|
19
|
+
}
|
|
20
|
+
if (/better_sqlite3\.node|NODE_MODULE_VERSION|compiled against a different Node\.js version|module was compiled against/i.test(message)) {
|
|
21
|
+
return 'abi-mismatch';
|
|
22
|
+
}
|
|
23
|
+
return 'load-failed';
|
|
24
|
+
}
|
|
25
|
+
export function formatBetterSqlite3Error(error) {
|
|
26
|
+
const issue = classifyBetterSqlite3Issue(error);
|
|
27
|
+
const message = extractErrorMessage(error);
|
|
28
|
+
if (issue === 'missing') {
|
|
29
|
+
return `better-sqlite3 is not installed. Install the optional trace backend with \`${INSTALL_HINT}\`.`;
|
|
30
|
+
}
|
|
31
|
+
if (issue === 'abi-mismatch') {
|
|
32
|
+
return `better-sqlite3 is installed but its native binary is incompatible with the current Node.js runtime (${process.version}, ABI ${process.versions.modules}). Rebuild it with \`${REBUILD_HINT}\` or reinstall dependencies under the active Node version. Original error: ${message}`;
|
|
33
|
+
}
|
|
34
|
+
return `better-sqlite3 failed to initialize. Try \`${REBUILD_HINT}\` or reinstall dependencies under the active Node version. Original error: ${message}`;
|
|
35
|
+
}
|
|
36
|
+
function readBetterSqlite3Version() {
|
|
37
|
+
try {
|
|
38
|
+
const packageJsonPath = require.resolve('better-sqlite3/package.json');
|
|
39
|
+
const packageJson = require(packageJsonPath);
|
|
40
|
+
return packageJson.version ?? null;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export function probeBetterSqlite3() {
|
|
47
|
+
const version = readBetterSqlite3Version();
|
|
48
|
+
if (!version) {
|
|
49
|
+
return {
|
|
50
|
+
status: 'missing',
|
|
51
|
+
detail: `Optional SQLite backend for trace tools is not installed. Install it with: ${INSTALL_HINT}`,
|
|
52
|
+
version: null,
|
|
53
|
+
issue: 'missing',
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
const Database = require('better-sqlite3');
|
|
58
|
+
const db = new Database(':memory:');
|
|
59
|
+
try {
|
|
60
|
+
db.prepare('SELECT 1 AS ok').get();
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
db.close();
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
status: 'ok',
|
|
67
|
+
detail: `installed (${version}) — native trace backend healthy`,
|
|
68
|
+
version,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
const issue = classifyBetterSqlite3Issue(error);
|
|
73
|
+
if (issue === 'missing') {
|
|
74
|
+
return {
|
|
75
|
+
status: 'missing',
|
|
76
|
+
detail: `Optional SQLite backend for trace tools is not installed. Install it with: ${INSTALL_HINT}`,
|
|
77
|
+
version,
|
|
78
|
+
issue,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
status: 'warn',
|
|
83
|
+
detail: `installed (${version}) but ${formatBetterSqlite3Error(error)}`,
|
|
84
|
+
version,
|
|
85
|
+
issue,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { existsSync } from 'fs';
|
|
2
|
-
import
|
|
2
|
+
import { executablePath } from 'rebrowser-puppeteer-core';
|
|
3
3
|
const ENV_KEYS = ['CHROME_PATH', 'PUPPETEER_EXECUTABLE_PATH', 'BROWSER_EXECUTABLE_PATH'];
|
|
4
4
|
let cachedBrowserPath = null;
|
|
5
5
|
function resolveFromEnvironment() {
|
|
@@ -13,7 +13,7 @@ function resolveFromEnvironment() {
|
|
|
13
13
|
}
|
|
14
14
|
function resolveFromPuppeteer() {
|
|
15
15
|
try {
|
|
16
|
-
const candidate =
|
|
16
|
+
const candidate = executablePath('chrome');
|
|
17
17
|
if (candidate && existsSync(candidate)) {
|
|
18
18
|
return candidate;
|
|
19
19
|
}
|
|
@@ -1,22 +1,21 @@
|
|
|
1
1
|
import { readFileSync } from 'node:fs';
|
|
2
2
|
import { fileURLToPath } from 'node:url';
|
|
3
|
-
import { dirname, join } from 'node:path';
|
|
4
3
|
function getPackageVersion(moduleUrl) {
|
|
5
4
|
try {
|
|
6
|
-
let
|
|
5
|
+
let dirUrl = new URL('.', moduleUrl);
|
|
7
6
|
for (let i = 0; i < 5; i++) {
|
|
8
7
|
try {
|
|
9
|
-
const candidate =
|
|
8
|
+
const candidate = fileURLToPath(new URL('package.json', dirUrl));
|
|
10
9
|
const pkg = JSON.parse(readFileSync(candidate, 'utf8'));
|
|
11
10
|
if (pkg.version)
|
|
12
11
|
return pkg.version;
|
|
13
12
|
}
|
|
14
13
|
catch {
|
|
15
14
|
}
|
|
16
|
-
const
|
|
17
|
-
if (
|
|
15
|
+
const parentUrl = new URL('../', dirUrl);
|
|
16
|
+
if (parentUrl.href === dirUrl.href)
|
|
18
17
|
break;
|
|
19
|
-
|
|
18
|
+
dirUrl = parentUrl;
|
|
20
19
|
}
|
|
21
20
|
}
|
|
22
21
|
catch {
|
|
@@ -35,8 +34,6 @@ function buildHelpText(version) {
|
|
|
35
34
|
' Starts the MCP server by default.',
|
|
36
35
|
'',
|
|
37
36
|
'Common environment variables:',
|
|
38
|
-
' OPENAI_API_KEY',
|
|
39
|
-
' DEFAULT_LLM_PROVIDER=openai|anthropic',
|
|
40
37
|
' MCP_TRANSPORT=stdio|http',
|
|
41
38
|
' MCP_TOOL_PROFILE=search|workflow|full',
|
|
42
39
|
'',
|
package/dist/src/utils/config.js
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import { fileURLToPath } from 'url';
|
|
2
|
-
import {
|
|
1
|
+
import { fileURLToPath } from 'node:url';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
3
|
import { config as dotenvConfig } from 'dotenv';
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
import { DEFAULT_SEARCH_CONFIG } from '../config/search-defaults.js';
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
export const projectRoot = join(currentDirname, '..', '..');
|
|
9
|
-
const envPath = join(projectRoot, '.env');
|
|
6
|
+
export const projectRoot = fileURLToPath(new URL('../..', import.meta.url));
|
|
7
|
+
const envPath = fileURLToPath(new URL('../../.env', import.meta.url));
|
|
10
8
|
let envLoaded = false;
|
|
11
9
|
function loadEnvIfNeeded() {
|
|
12
10
|
if (envLoaded) {
|
|
@@ -34,13 +32,6 @@ const envBool = (fallback) => z
|
|
|
34
32
|
.optional()
|
|
35
33
|
.transform((v) => (v === undefined ? fallback : v === 'true'));
|
|
36
34
|
const ConfigSchema = z.object({
|
|
37
|
-
DEFAULT_LLM_PROVIDER: z.enum(['openai', 'anthropic']).optional().default('openai'),
|
|
38
|
-
OPENAI_API_KEY: z.string().optional().default(''),
|
|
39
|
-
OPENAI_MODEL: z.string().optional().default('gpt-4-turbo-preview'),
|
|
40
|
-
OPENAI_BASE_URL: z.string().optional(),
|
|
41
|
-
ANTHROPIC_API_KEY: z.string().optional().default(''),
|
|
42
|
-
ANTHROPIC_MODEL: z.string().optional().default('claude-3-5-sonnet-20241022'),
|
|
43
|
-
ANTHROPIC_BASE_URL: z.string().optional(),
|
|
44
35
|
PUPPETEER_HEADLESS: envBool(false),
|
|
45
36
|
PUPPETEER_TIMEOUT: envInt(30000).pipe(z.number().min(1000).max(300000)),
|
|
46
37
|
PUPPETEER_EXECUTABLE_PATH: z.string().optional(),
|
|
@@ -192,19 +183,6 @@ export function getConfig() {
|
|
|
192
183
|
: join(projectRoot, cacheDir);
|
|
193
184
|
const search = buildSearchConfig();
|
|
194
185
|
return {
|
|
195
|
-
llm: {
|
|
196
|
-
provider: (env.DEFAULT_LLM_PROVIDER || 'openai'),
|
|
197
|
-
openai: {
|
|
198
|
-
apiKey: env.OPENAI_API_KEY || '',
|
|
199
|
-
model: env.OPENAI_MODEL || 'gpt-4-turbo-preview',
|
|
200
|
-
baseURL: env.OPENAI_BASE_URL,
|
|
201
|
-
},
|
|
202
|
-
anthropic: {
|
|
203
|
-
apiKey: env.ANTHROPIC_API_KEY || '',
|
|
204
|
-
model: env.ANTHROPIC_MODEL || 'claude-3-5-sonnet-20241022',
|
|
205
|
-
baseURL: env.ANTHROPIC_BASE_URL,
|
|
206
|
-
},
|
|
207
|
-
},
|
|
208
186
|
puppeteer: {
|
|
209
187
|
headless: parsed.success
|
|
210
188
|
? env.PUPPETEER_HEADLESS
|
|
@@ -5,22 +5,30 @@ import { ToolRegistry } from '../modules/external/ToolRegistry.js';
|
|
|
5
5
|
import { GHIDRA_BRIDGE_ENDPOINT, IDA_BRIDGE_ENDPOINT } from '../constants.js';
|
|
6
6
|
import { getProjectRoot } from './outputPaths.js';
|
|
7
7
|
import { getArtifactRetentionConfig } from './artifactRetention.js';
|
|
8
|
+
import { probeBetterSqlite3 } from './betterSqlite3.js';
|
|
8
9
|
const execFileAsync = promisify(execFile);
|
|
9
10
|
const require = createRequire(import.meta.url);
|
|
10
11
|
export async function runEnvironmentDoctor(options) {
|
|
11
12
|
const includeBridgeHealth = options?.includeBridgeHealth ?? true;
|
|
12
13
|
const registry = new ToolRegistry();
|
|
13
14
|
const externalResults = await registry.probeAll(true);
|
|
15
|
+
const gitCommand = await checkCommand('git', ['--version']);
|
|
16
|
+
const pythonCommand = await checkCommand('python', ['--version']);
|
|
17
|
+
const pnpmCommand = await checkPnpmCommand();
|
|
18
|
+
const corepackCommand = normalizeCorepackCheck(await checkCommand('corepack', ['--version']), pnpmCommand);
|
|
14
19
|
const packages = [
|
|
15
20
|
checkPackage('@modelcontextprotocol/sdk'),
|
|
16
21
|
checkPackage('rebrowser-puppeteer-core'),
|
|
22
|
+
checkBetterSqlite3(),
|
|
17
23
|
checkPackage('camoufox-js', 'Optional Firefox anti-detect driver'),
|
|
18
24
|
checkPackage('playwright-core', 'Optional browser automation dependency'),
|
|
25
|
+
checkNativeMemory(),
|
|
19
26
|
];
|
|
20
27
|
const commands = [
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
28
|
+
gitCommand,
|
|
29
|
+
pythonCommand,
|
|
30
|
+
pnpmCommand,
|
|
31
|
+
corepackCommand,
|
|
24
32
|
...Object.entries(externalResults).map(([name, result]) => ({
|
|
25
33
|
name,
|
|
26
34
|
status: (result.available ? 'ok' : 'missing'),
|
|
@@ -127,17 +135,118 @@ function checkPackage(packageName, missingHint) {
|
|
|
127
135
|
};
|
|
128
136
|
}
|
|
129
137
|
}
|
|
130
|
-
|
|
138
|
+
function checkBetterSqlite3() {
|
|
139
|
+
const result = probeBetterSqlite3();
|
|
140
|
+
return {
|
|
141
|
+
name: 'better-sqlite3',
|
|
142
|
+
status: result.status,
|
|
143
|
+
detail: result.detail,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
function isPnpmOperational(pnpm) {
|
|
147
|
+
return pnpm.status === 'ok' || pnpm.detail.includes('npx fallback works');
|
|
148
|
+
}
|
|
149
|
+
async function checkPnpmCommand() {
|
|
150
|
+
const direct = await checkCommand('pnpm', ['--version']);
|
|
151
|
+
if (direct.status === 'ok') {
|
|
152
|
+
return direct;
|
|
153
|
+
}
|
|
154
|
+
const npxFallback = await checkCommand('npx', ['pnpm', '--version'], 10_000);
|
|
155
|
+
if (npxFallback.status === 'ok') {
|
|
156
|
+
return {
|
|
157
|
+
name: 'pnpm',
|
|
158
|
+
status: 'warn',
|
|
159
|
+
detail: `direct pnpm command unavailable; npx fallback works (${npxFallback.detail})`,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
return direct;
|
|
163
|
+
}
|
|
164
|
+
function normalizeCorepackCheck(corepack, pnpm) {
|
|
165
|
+
if (corepack.status !== 'missing' || !isPnpmOperational(pnpm)) {
|
|
166
|
+
return corepack;
|
|
167
|
+
}
|
|
168
|
+
return {
|
|
169
|
+
name: corepack.name,
|
|
170
|
+
status: 'warn',
|
|
171
|
+
detail: process.platform === 'win32'
|
|
172
|
+
? pnpm.detail.includes('npx fallback works')
|
|
173
|
+
? 'corepack not found; use `npx pnpm` directly (common with nvm4w-managed Node on Windows)'
|
|
174
|
+
: 'corepack not found; standalone pnpm is available (common with nvm4w-managed Node on Windows)'
|
|
175
|
+
: pnpm.detail.includes('npx fallback works')
|
|
176
|
+
? 'corepack not found; use `npx pnpm` directly'
|
|
177
|
+
: 'corepack not found; standalone pnpm is available',
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
function checkNativeMemory() {
|
|
181
|
+
try {
|
|
182
|
+
const koffiPkg = require.resolve('koffi/package.json');
|
|
183
|
+
const koffiJson = require(koffiPkg);
|
|
184
|
+
const koffiVersion = koffiJson.version ?? 'unknown';
|
|
185
|
+
if (process.platform === 'win32') {
|
|
186
|
+
return {
|
|
187
|
+
name: 'native-memory',
|
|
188
|
+
status: 'ok',
|
|
189
|
+
detail: `koffi ${koffiVersion} — Win32 kernel32.dll available`,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
if (process.platform === 'darwin') {
|
|
193
|
+
try {
|
|
194
|
+
const koffi = require('koffi');
|
|
195
|
+
const lib = koffi.load('/usr/lib/libSystem.B.dylib');
|
|
196
|
+
lib.unload();
|
|
197
|
+
return {
|
|
198
|
+
name: 'native-memory',
|
|
199
|
+
status: 'ok',
|
|
200
|
+
detail: `koffi ${koffiVersion} — macOS libSystem.B.dylib available (Mach APIs need root + SIP config)`,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
return {
|
|
205
|
+
name: 'native-memory',
|
|
206
|
+
status: 'warn',
|
|
207
|
+
detail: `koffi ${koffiVersion} installed but cannot load libSystem.B.dylib`,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return {
|
|
212
|
+
name: 'native-memory',
|
|
213
|
+
status: 'warn',
|
|
214
|
+
detail: `koffi ${koffiVersion} — no native FFI memory provider for ${process.platform} (proc-based ops available on Linux)`,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
return {
|
|
219
|
+
name: 'native-memory',
|
|
220
|
+
status: 'missing',
|
|
221
|
+
detail: 'koffi not installed — native memory tools unavailable. Install with: pnpm add koffi',
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
async function checkCommand(command, args, timeout = 4000) {
|
|
131
226
|
try {
|
|
132
227
|
const { stdout, stderr } = await execFileAsync(command, args, {
|
|
133
|
-
timeout
|
|
228
|
+
timeout,
|
|
134
229
|
windowsHide: true,
|
|
135
230
|
});
|
|
136
231
|
const detail = `${stdout || stderr}`.trim().split(/\r?\n/)[0] || 'available';
|
|
137
232
|
return { name: command, status: 'ok', detail };
|
|
138
233
|
}
|
|
139
234
|
catch (error) {
|
|
140
|
-
|
|
235
|
+
let finalError = error;
|
|
236
|
+
if (process.platform === 'win32') {
|
|
237
|
+
try {
|
|
238
|
+
const { stdout, stderr } = await execFileAsync('cmd', ['/c', command, ...args], {
|
|
239
|
+
timeout,
|
|
240
|
+
windowsHide: true,
|
|
241
|
+
});
|
|
242
|
+
const detail = `${stdout || stderr}`.trim().split(/\r?\n/)[0] || 'available';
|
|
243
|
+
return { name: command, status: 'ok', detail: `${detail} (via cmd)` };
|
|
244
|
+
}
|
|
245
|
+
catch (cmdError) {
|
|
246
|
+
finalError = cmdError;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
const detail = finalError instanceof Error ? finalError.message : String(finalError);
|
|
141
250
|
const missing = /ENOENT|not recognized|not found/i.test(detail);
|
|
142
251
|
return {
|
|
143
252
|
name: command,
|
|
@@ -168,25 +277,43 @@ async function checkHttpEndpoint(name, url) {
|
|
|
168
277
|
}
|
|
169
278
|
function buildPlatformLimitations() {
|
|
170
279
|
const limitations = [];
|
|
171
|
-
if (process.platform
|
|
172
|
-
limitations.push('
|
|
280
|
+
if (process.platform === 'darwin') {
|
|
281
|
+
limitations.push('26 cross-platform memory tools available (scan, pointer-chain, structure-analysis, heap). ' +
|
|
282
|
+
'15 Windows-only tools unavailable (PE analysis, anti-cheat, code injection, speedhack, hardware breakpoints).');
|
|
283
|
+
limitations.push('Native memory operations (mach_vm_read/write) require root privileges and may require SIP configuration on ARM64.');
|
|
173
284
|
}
|
|
174
|
-
if (process.platform === 'linux') {
|
|
285
|
+
else if (process.platform === 'linux') {
|
|
286
|
+
limitations.push('Process management available via /proc. Native FFI memory provider not implemented — memory read/write uses /proc/pid/mem (requires root or CAP_SYS_PTRACE).');
|
|
175
287
|
limitations.push('Camoufox runs on Linux, but some Chrome/CDP-heavy workflows are better served by the Chrome driver.');
|
|
176
288
|
}
|
|
177
|
-
if (process.platform
|
|
178
|
-
limitations.push(
|
|
289
|
+
else if (process.platform !== 'win32') {
|
|
290
|
+
limitations.push(`Platform ${process.platform} is not supported for native memory operations. Use Windows or macOS.`);
|
|
179
291
|
}
|
|
180
292
|
return limitations;
|
|
181
293
|
}
|
|
182
294
|
function buildRecommendations(packages, commands, bridges, limitations) {
|
|
183
295
|
const recommendations = [];
|
|
296
|
+
const pnpmCommand = commands.find((item) => item.name === 'pnpm');
|
|
297
|
+
const corepackCommand = commands.find((item) => item.name === 'corepack');
|
|
298
|
+
if (packages.some((item) => item.name === 'better-sqlite3' && item.status !== 'ok')) {
|
|
299
|
+
recommendations.push('Install or rebuild the optional SQLite trace backend with `pnpm add -O better-sqlite3@12.6.2` or `npm rebuild better-sqlite3 --foreground-scripts` under the active Node version if you need trace tooling.');
|
|
300
|
+
}
|
|
184
301
|
if (packages.some((item) => item.name === 'camoufox-js' && item.status !== 'ok')) {
|
|
185
302
|
recommendations.push('Install optional browser dependencies with `pnpm run install:full` if you need Camoufox support.');
|
|
186
303
|
}
|
|
187
304
|
if (commands.some((item) => item.name.startsWith('wabt.') && item.status !== 'ok')) {
|
|
188
305
|
recommendations.push('Install wabt if you need full WASM disassembly/decompilation; otherwise the server will stay in basic mode.');
|
|
189
306
|
}
|
|
307
|
+
if (pnpmCommand && !isPnpmOperational(pnpmCommand)) {
|
|
308
|
+
recommendations.push('Install pnpm or enable Corepack (`corepack enable`) before running package-management workflows.');
|
|
309
|
+
}
|
|
310
|
+
else if (pnpmCommand?.detail.includes('npx fallback works')) {
|
|
311
|
+
recommendations.push('Use `npx pnpm` directly on this machine or repair the local pnpm/Corepack shim if scripts expect bare `pnpm`.');
|
|
312
|
+
}
|
|
313
|
+
else if (corepackCommand?.status === 'warn' &&
|
|
314
|
+
corepackCommand.detail.includes('standalone pnpm')) {
|
|
315
|
+
recommendations.push('Use `pnpm` or `npx pnpm` directly on this machine; `corepack` is optional and may be absent on nvm4w-managed Windows installs.');
|
|
316
|
+
}
|
|
190
317
|
if (bridges.some((item) => item.status !== 'ok')) {
|
|
191
318
|
recommendations.push('Check local bridge endpoints (Ghidra / IDA / Burp) before relying on native-bridge workflows.');
|
|
192
319
|
}
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import { mkdir } from 'node:fs/promises';
|
|
2
2
|
import { basename, dirname, extname, isAbsolute, normalize, relative, resolve, sep, } from 'node:path';
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
const
|
|
4
|
+
const defaultProjectRoot = fileURLToPath(new URL('../..', import.meta.url));
|
|
5
|
+
function resolveProjectRoot(env = process.env) {
|
|
6
|
+
const requestedRoot = env.MCP_PROJECT_ROOT?.trim();
|
|
7
|
+
if (!requestedRoot) {
|
|
8
|
+
return defaultProjectRoot;
|
|
9
|
+
}
|
|
10
|
+
return normalize(isAbsolute(requestedRoot) ? requestedRoot : resolve(defaultProjectRoot, requestedRoot));
|
|
11
|
+
}
|
|
7
12
|
function isInside(baseDir, targetPath) {
|
|
8
13
|
const rel = relative(baseDir, targetPath);
|
|
9
14
|
if (!rel || rel === '..' || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {
|
|
@@ -11,11 +16,11 @@ function isInside(baseDir, targetPath) {
|
|
|
11
16
|
}
|
|
12
17
|
return true;
|
|
13
18
|
}
|
|
14
|
-
function resolveWithinProject(inputPath) {
|
|
15
|
-
const candidate = isAbsolute(inputPath) ? normalize(inputPath) : resolve(
|
|
16
|
-
return isInside(
|
|
19
|
+
function resolveWithinProject(inputPath, baseRoot = getProjectRoot()) {
|
|
20
|
+
const candidate = isAbsolute(inputPath) ? normalize(inputPath) : resolve(baseRoot, inputPath);
|
|
21
|
+
return isInside(baseRoot, candidate)
|
|
17
22
|
? candidate
|
|
18
|
-
: resolve(
|
|
23
|
+
: resolve(baseRoot, 'screenshots', 'external', normalize(inputPath).split(/[\\/]/).pop() || 'output.bin');
|
|
19
24
|
}
|
|
20
25
|
function withDefaultExtension(filePath, extension) {
|
|
21
26
|
if (extname(filePath)) {
|
|
@@ -24,20 +29,22 @@ function withDefaultExtension(filePath, extension) {
|
|
|
24
29
|
return `${filePath}.${extension.replace(/^\./, '')}`;
|
|
25
30
|
}
|
|
26
31
|
export function getProjectRoot() {
|
|
27
|
-
return
|
|
32
|
+
return resolveProjectRoot();
|
|
28
33
|
}
|
|
29
34
|
export function resolveOutputDirectory(inputDir, fallbackDir = 'screenshots') {
|
|
35
|
+
const projectRoot = getProjectRoot();
|
|
30
36
|
const requested = inputDir?.trim();
|
|
31
37
|
if (!requested) {
|
|
32
38
|
return resolve(projectRoot, fallbackDir);
|
|
33
39
|
}
|
|
34
|
-
const resolved = resolveWithinProject(requested);
|
|
40
|
+
const resolved = resolveWithinProject(requested, projectRoot);
|
|
35
41
|
if (isInside(projectRoot, resolved)) {
|
|
36
42
|
return resolved;
|
|
37
43
|
}
|
|
38
44
|
return resolve(projectRoot, fallbackDir);
|
|
39
45
|
}
|
|
40
46
|
export async function resolveScreenshotOutputPath(options) {
|
|
47
|
+
const projectRoot = getProjectRoot();
|
|
41
48
|
const extension = options.type === 'jpeg' ? 'jpg' : 'png';
|
|
42
49
|
const fallbackDir = options.fallbackDir || 'screenshots/manual';
|
|
43
50
|
const fallbackName = options.fallbackName || 'page';
|
|
@@ -44,9 +44,7 @@ export async function parallelExecute(items, executor, options = {}) {
|
|
|
44
44
|
duration: Date.now() - startTime,
|
|
45
45
|
};
|
|
46
46
|
})();
|
|
47
|
-
const wrappedTask = task.
|
|
48
|
-
executing.delete(wrappedTask);
|
|
49
|
-
}, () => {
|
|
47
|
+
const wrappedTask = task.finally(() => {
|
|
50
48
|
executing.delete(wrappedTask);
|
|
51
49
|
});
|
|
52
50
|
executing.add(wrappedTask);
|