@jshookmcp/jshook 0.2.2 → 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/LICENSE +661 -661
- package/README.md +15 -6
- package/README.zh.md +19 -4
- package/dist/native/scripts/linux/enum-windows.sh +12 -12
- package/dist/native/scripts/macos/enum-windows.applescript +22 -22
- package/dist/native/scripts/windows/enum-windows-by-class.ps1 +51 -51
- package/dist/native/scripts/windows/enum-windows.ps1 +44 -44
- package/dist/native/scripts/windows/inject-dll.ps1 +21 -21
- 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.d.ts +6 -5
- package/dist/src/modules/browser/BrowserDiscovery.js +3 -3
- package/dist/src/modules/browser/BrowserModeManager.d.ts +1 -1
- 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 +19 -4
- package/dist/src/modules/captcha/AICaptchaDetector.d.ts +14 -23
- package/dist/src/modules/captcha/AICaptchaDetector.js +8 -202
- package/dist/src/modules/captcha/CaptchaDetector.d.ts +31 -17
- package/dist/src/modules/captcha/CaptchaDetector.js +1 -1
- package/dist/src/modules/collector/CodeCache.d.ts +2 -2
- package/dist/src/modules/collector/CodeCollector.d.ts +12 -9
- package/dist/src/modules/collector/CodeCollector.js +5 -6
- package/dist/src/modules/collector/DOMInspector.d.ts +3 -2
- package/dist/src/modules/collector/DOMInspector.js +49 -59
- 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 +5 -3
- 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 +2 -3
- package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.restore.js +5 -57
- package/dist/src/modules/deobfuscator/JScramblerDeobfuscator.js +3 -4
- package/dist/src/modules/deobfuscator/PackerDeobfuscator.js +1 -1
- 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.d.ts +1 -1
- package/dist/src/modules/external/ExternalToolRunner.js +26 -23
- 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/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/process/BaseMemoryManager.d.ts +1 -1
- package/dist/src/modules/process/LinuxProcessManager.js +4 -2
- package/dist/src/modules/process/MacProcessManager.js +1 -1
- package/dist/src/modules/process/MemoryManager.d.ts +1 -1
- package/dist/src/modules/process/MemoryManager.js +2 -2
- package/dist/src/modules/process/ProcessManager.impl.js +1 -1
- package/dist/src/modules/process/memory/AuditTrail.js +1 -1
- package/dist/src/modules/process/memory/reader.js +35 -3
- package/dist/src/modules/process/memory/regions.enumerate.js +1 -1
- package/dist/src/modules/process/memory/regions.protection.js +42 -9
- package/dist/src/modules/process/memory/scanner.d.ts +5 -1
- package/dist/src/modules/process/memory/scanner.darwin.js +57 -0
- package/dist/src/modules/process/memory/scanner.js +88 -4
- package/dist/src/modules/process/memory/writer.js +44 -4
- package/dist/src/modules/security/ExecutionSandbox.js +7 -8
- package/dist/src/modules/stealth/FingerprintManager.js +1 -1
- package/dist/src/modules/stealth/StealthScripts.d.ts +4 -2
- package/dist/src/modules/stealth/StealthScripts.js +53 -14
- package/dist/src/modules/stealth/StealthVerifier.d.ts +1 -1
- package/dist/src/modules/stealth/StealthVerifier.js +2 -4
- 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 +12 -6
- package/dist/src/modules/trace/TraceRecorder.js +1 -5
- package/dist/src/native/AntiCheatDetector.js +67 -16
- package/dist/src/native/CodeInjector.js +4 -4
- package/dist/src/native/HardwareBreakpoint.js +25 -16
- 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 +42 -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 +2 -2
- package/dist/src/server/MCPServer.tools.js +1 -1
- package/dist/src/server/MCPServer.transport.js +12 -0
- package/dist/src/server/ToolCallContextGuard.d.ts +5 -0
- package/dist/src/server/ToolCallContextGuard.js +85 -0
- package/dist/src/server/ToolRouter.d.ts +26 -10
- 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.d.ts +8 -8
- package/dist/src/server/domains/analysis/handlers.impl.js +34 -28
- package/dist/src/server/domains/analysis/handlers.web-tools.js +4 -3
- 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 +157 -386
- package/dist/src/server/domains/browser/definitions.tools.page-system.js +108 -250
- package/dist/src/server/domains/browser/definitions.tools.runtime.js +61 -174
- package/dist/src/server/domains/browser/definitions.tools.security.js +92 -237
- 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/facade-initializer.d.ts +3 -3
- package/dist/src/server/domains/browser/handlers/facade-initializer.js +3 -3
- package/dist/src/server/domains/browser/handlers/framework-state.js +231 -3
- 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/stealth-injection.js +8 -2
- package/dist/src/server/domains/browser/handlers.impl.d.ts +15 -12
- package/dist/src/server/domains/browser/handlers.impl.js +5 -6
- package/dist/src/server/domains/browser/manifest.js +37 -13
- package/dist/src/server/domains/coordination/definitions.js +50 -149
- package/dist/src/server/domains/coordination/index.d.ts +20 -1
- package/dist/src/server/domains/coordination/index.js +133 -0
- package/dist/src/server/domains/coordination/manifest.js +15 -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/hooks/ai-handlers.d.ts +0 -7
- package/dist/src/server/domains/hooks/ai-handlers.js +4 -70
- 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.d.ts +2 -2
- package/dist/src/server/domains/maintenance/handlers.extensions.js +78 -20
- package/dist/src/server/domains/maintenance/handlers.js +2 -2
- 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 +5 -1
- package/dist/src/server/domains/platform/handlers/bridge-handlers.js +194 -5
- 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.d.ts +1 -1
- package/dist/src/server/domains/platform/handlers/miniapp-handlers.js +4 -4
- 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 +19 -17
- 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.d.ts +60 -0
- package/dist/src/server/domains/trace/TraceSummarizer.js +112 -0
- package/dist/src/server/domains/trace/definitions.tools.js +51 -176
- package/dist/src/server/domains/trace/handlers.d.ts +2 -1
- package/dist/src/server/domains/trace/handlers.js +62 -9
- 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 +18 -4
- package/dist/src/server/domains/transform/definitions.js +50 -210
- package/dist/src/server/domains/transform/handlers.impl.transform-base.js +6 -6
- 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 +3 -3
- package/dist/src/server/domains/workflow/definitions.js +144 -414
- package/dist/src/server/domains/workflow/handlers.impl.workflow-account-bundle.js +2 -2
- 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 +19 -9
- 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/http/HttpMiddleware.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 +7 -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/MCPBridge.d.ts +9 -0
- package/dist/src/server/sandbox/MCPBridge.js +22 -0
- package/dist/src/server/sandbox/QuickJSSandbox.d.ts +4 -1
- package/dist/src/server/sandbox/QuickJSSandbox.js +162 -2
- package/dist/src/server/sandbox/types.d.ts +13 -0
- package/dist/src/server/search/AffinityGraph.d.ts +7 -1
- package/dist/src/server/search/AffinityGraph.js +24 -3
- 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.d.ts +1 -1
- package/dist/src/utils/UnifiedCacheManager.js +3 -3
- 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 +17 -6
- 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 +76 -72
- package/scripts/postinstall.cjs +37 -37
- package/src/native/scripts/linux/enum-windows.sh +12 -12
- package/src/native/scripts/macos/enum-windows.applescript +22 -22
- package/src/native/scripts/windows/enum-windows-by-class.ps1 +51 -51
- package/src/native/scripts/windows/enum-windows.ps1 +44 -44
- package/src/native/scripts/windows/inject-dll.ps1 +21 -21
- 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
|
@@ -1,247 +1,46 @@
|
|
|
1
1
|
import { logger } from '../utils/logger.js';
|
|
2
|
-
import {
|
|
2
|
+
import {} from './ToolSearch.js';
|
|
3
|
+
import { ensureWorkflowsLoaded } from './extensions/ExtensionManager.js';
|
|
3
4
|
import { getActiveToolNames } from './MCPServer.search.helpers.js';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
function getAllToolsByName() {
|
|
9
|
-
if (!_allToolsByName)
|
|
10
|
-
_allToolsByName = new Map(allTools.map((t) => [t.name, t]));
|
|
11
|
-
return _allToolsByName;
|
|
12
|
-
}
|
|
13
|
-
let _cachedWorkflowRules = null;
|
|
14
|
-
function getEffectiveWorkflowRules() {
|
|
15
|
-
if (_cachedWorkflowRules)
|
|
16
|
-
return _cachedWorkflowRules;
|
|
17
|
-
const rules = [];
|
|
18
|
-
for (const m of getAllManifests()) {
|
|
19
|
-
if (m.workflowRule) {
|
|
20
|
-
rules.push({
|
|
21
|
-
patterns: [...m.workflowRule.patterns],
|
|
22
|
-
domain: m.domain,
|
|
23
|
-
priority: m.workflowRule.priority,
|
|
24
|
-
tools: [...m.workflowRule.tools],
|
|
25
|
-
hint: m.workflowRule.hint,
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
_cachedWorkflowRules = rules.sort((a, b) => b.priority - a.priority);
|
|
30
|
-
return _cachedWorkflowRules;
|
|
31
|
-
}
|
|
32
|
-
const BROWSER_OR_NETWORK_TASK_PATTERN = /(browser|page|navigate|click|type|screenshot|scrape|network|request|response|api|traffic|hook|capture|intercept|monitor|浏览器|页面|导航|点击|输入|截图|爬取|网络|请求|响应|接口|流量|抓包|拦截|监控)/i;
|
|
33
|
-
const MAINTENANCE_TASK_PATTERN = /(token budget|cache|artifact|extension|plugin|reload|doctor|cleanup|memory|profile|tool list|令牌预算|缓存|工件|扩展|插件|重载|环境诊断|清理|内存|配置)/i;
|
|
34
|
-
let _cachedPrerequisites = null;
|
|
35
|
-
function getEffectivePrerequisites() {
|
|
36
|
-
if (_cachedPrerequisites)
|
|
37
|
-
return _cachedPrerequisites;
|
|
38
|
-
const merged = {};
|
|
39
|
-
for (const m of getAllManifests()) {
|
|
40
|
-
if (m.prerequisites) {
|
|
41
|
-
for (const [toolName, entries] of Object.entries(m.prerequisites)) {
|
|
42
|
-
merged[toolName] = entries.map((e) => ({
|
|
43
|
-
condition: e.condition,
|
|
44
|
-
check: () => false,
|
|
45
|
-
fix: e.fix,
|
|
46
|
-
}));
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
_cachedPrerequisites = merged;
|
|
51
|
-
return _cachedPrerequisites;
|
|
52
|
-
}
|
|
53
|
-
function detectWorkflowIntent(query) {
|
|
54
|
-
const matches = [];
|
|
55
|
-
for (const rule of getEffectiveWorkflowRules()) {
|
|
56
|
-
for (const pattern of rule.patterns) {
|
|
57
|
-
if (pattern.test(query)) {
|
|
58
|
-
matches.push(rule);
|
|
59
|
-
break;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
if (matches.length === 0)
|
|
64
|
-
return null;
|
|
65
|
-
matches.sort((a, b) => b.priority - a.priority);
|
|
66
|
-
return matches[0];
|
|
67
|
-
}
|
|
68
|
-
function getToolInputSchema(toolName, ctx) {
|
|
69
|
-
const canonicalName = normalizeToolName(toolName);
|
|
70
|
-
const builtInTool = getAllToolsByName().get(canonicalName);
|
|
71
|
-
if (builtInTool) {
|
|
72
|
-
return builtInTool.inputSchema;
|
|
73
|
-
}
|
|
74
|
-
const extTool = ctx.extensionToolsByName.get(canonicalName);
|
|
75
|
-
if (extTool) {
|
|
76
|
-
return extTool.tool.inputSchema;
|
|
77
|
-
}
|
|
78
|
-
const metaTool = ctx.metaToolsByName.get(canonicalName);
|
|
79
|
-
if (metaTool) {
|
|
80
|
-
return metaTool.inputSchema;
|
|
81
|
-
}
|
|
82
|
-
return undefined;
|
|
83
|
-
}
|
|
84
|
-
function getToolDescription(toolName, ctx) {
|
|
85
|
-
const canonicalName = normalizeToolName(toolName);
|
|
86
|
-
const builtInTool = getAllToolsByName().get(canonicalName);
|
|
87
|
-
if (builtInTool?.description) {
|
|
88
|
-
return builtInTool.description.split('\n')[0] || 'No description available';
|
|
89
|
-
}
|
|
90
|
-
const extTool = ctx.extensionToolsByName.get(canonicalName);
|
|
91
|
-
if (extTool?.tool?.description) {
|
|
92
|
-
return extTool.tool.description.split('\n')[0] || 'No description available';
|
|
93
|
-
}
|
|
94
|
-
const metaTool = ctx.metaToolsByName.get(canonicalName);
|
|
95
|
-
if (metaTool?.description) {
|
|
96
|
-
return metaTool.description.split('\n')[0] || 'No description available';
|
|
97
|
-
}
|
|
98
|
-
return 'No description available';
|
|
99
|
-
}
|
|
100
|
-
function isActive(toolName, ctx) {
|
|
101
|
-
const canonicalName = normalizeToolName(toolName);
|
|
102
|
-
const activeTools = new Set([
|
|
103
|
-
...ctx.selectedTools.map((tool) => tool.name),
|
|
104
|
-
...ctx.activatedToolNames,
|
|
105
|
-
]);
|
|
106
|
-
return activeTools.has(canonicalName);
|
|
107
|
-
}
|
|
108
|
-
function getAvailableToolNames(ctx) {
|
|
109
|
-
return new Set([...allTools.map((tool) => tool.name), ...ctx.extensionToolsByName.keys()]);
|
|
110
|
-
}
|
|
111
|
-
async function probeActivePage(ctx) {
|
|
112
|
-
if (!ctx.pageController || typeof ctx.pageController.getPage !== 'function')
|
|
113
|
-
return false;
|
|
114
|
-
try {
|
|
115
|
-
return Boolean(await ctx.pageController.getPage());
|
|
116
|
-
}
|
|
117
|
-
catch {
|
|
118
|
-
return false;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
function probeNetworkEnabled(ctx) {
|
|
122
|
-
if (!ctx.consoleMonitor)
|
|
123
|
-
return false;
|
|
124
|
-
try {
|
|
125
|
-
if (typeof ctx.consoleMonitor.getNetworkStatus === 'function') {
|
|
126
|
-
return Boolean(ctx.consoleMonitor.getNetworkStatus().enabled);
|
|
127
|
-
}
|
|
128
|
-
if (typeof ctx.consoleMonitor.isNetworkEnabled === 'function') {
|
|
129
|
-
return Boolean(ctx.consoleMonitor.isNetworkEnabled());
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
catch { }
|
|
133
|
-
return false;
|
|
134
|
-
}
|
|
135
|
-
function probeCapturedRequests(ctx) {
|
|
136
|
-
if (!ctx.consoleMonitor || typeof ctx.consoleMonitor.getNetworkRequests !== 'function')
|
|
137
|
-
return 0;
|
|
138
|
-
try {
|
|
139
|
-
const requests = ctx.consoleMonitor.getNetworkRequests({ limit: 1 });
|
|
140
|
-
return Array.isArray(requests) ? requests.length : 0;
|
|
141
|
-
}
|
|
142
|
-
catch {
|
|
143
|
-
try {
|
|
144
|
-
const requests = ctx.consoleMonitor.getNetworkRequests();
|
|
145
|
-
return Array.isArray(requests) ? requests.length : 0;
|
|
146
|
-
}
|
|
147
|
-
catch {
|
|
148
|
-
return 0;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
async function getRoutingState(ctx) {
|
|
153
|
-
return {
|
|
154
|
-
hasActivePage: await probeActivePage(ctx),
|
|
155
|
-
networkEnabled: probeNetworkEnabled(ctx),
|
|
156
|
-
capturedRequestCount: probeCapturedRequests(ctx),
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
function buildWorkflowToolSequence(workflow, state, availableToolNames) {
|
|
160
|
-
const sequence = [];
|
|
161
|
-
const pushIfAvailable = (toolName) => {
|
|
162
|
-
if (availableToolNames.has(toolName) && !sequence.includes(toolName)) {
|
|
163
|
-
sequence.push(toolName);
|
|
164
|
-
}
|
|
165
|
-
};
|
|
166
|
-
if ((workflow.domain === 'browser' || workflow.domain === 'network') && !state.hasActivePage) {
|
|
167
|
-
pushIfAvailable('browser_launch');
|
|
168
|
-
pushIfAvailable('browser_attach');
|
|
169
|
-
}
|
|
170
|
-
if (workflow.domain === 'network') {
|
|
171
|
-
if (state.hasActivePage && !state.networkEnabled) {
|
|
172
|
-
pushIfAvailable('network_enable');
|
|
173
|
-
}
|
|
174
|
-
if (state.hasActivePage && state.networkEnabled && state.capturedRequestCount > 0) {
|
|
175
|
-
pushIfAvailable('network_get_requests');
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
for (const toolName of workflow.tools) {
|
|
179
|
-
pushIfAvailable(toolName);
|
|
180
|
-
}
|
|
181
|
-
if (workflow.domain === 'network' && state.hasActivePage && state.networkEnabled) {
|
|
182
|
-
pushIfAvailable('network_get_requests');
|
|
183
|
-
}
|
|
184
|
-
return sequence;
|
|
185
|
-
}
|
|
186
|
-
function isBrowserOrNetworkTask(task, workflow) {
|
|
187
|
-
return (workflow?.domain === 'browser' ||
|
|
188
|
-
workflow?.domain === 'network' ||
|
|
189
|
-
BROWSER_OR_NETWORK_TASK_PATTERN.test(task));
|
|
190
|
-
}
|
|
191
|
-
function isMaintenanceTask(task) {
|
|
192
|
-
return MAINTENANCE_TASK_PATTERN.test(task);
|
|
193
|
-
}
|
|
194
|
-
function rerankResultsForContext(results, task, workflow, state) {
|
|
195
|
-
const browserOrNetworkTask = isBrowserOrNetworkTask(task, workflow);
|
|
196
|
-
const maintenanceTask = isMaintenanceTask(task);
|
|
197
|
-
const reranked = results.map((result) => {
|
|
198
|
-
let score = result.score;
|
|
199
|
-
if (browserOrNetworkTask && !maintenanceTask && result.domain === 'maintenance') {
|
|
200
|
-
score *= 0.1;
|
|
201
|
-
}
|
|
202
|
-
if (browserOrNetworkTask) {
|
|
203
|
-
if (!state.hasActivePage && result.name === 'browser_launch') {
|
|
204
|
-
score *= 1.4;
|
|
205
|
-
}
|
|
206
|
-
if (!state.hasActivePage && result.name === 'browser_attach') {
|
|
207
|
-
score *= 1.2;
|
|
208
|
-
}
|
|
209
|
-
if (state.hasActivePage && !state.networkEnabled && result.name === 'network_enable') {
|
|
210
|
-
score *= 1.35;
|
|
211
|
-
}
|
|
212
|
-
if (state.hasActivePage &&
|
|
213
|
-
state.networkEnabled &&
|
|
214
|
-
state.capturedRequestCount > 0 &&
|
|
215
|
-
result.name === 'network_get_requests') {
|
|
216
|
-
score *= 1.5;
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
return {
|
|
220
|
-
...result,
|
|
221
|
-
score,
|
|
222
|
-
};
|
|
223
|
-
});
|
|
224
|
-
reranked.sort((a, b) => b.score - a.score);
|
|
225
|
-
return reranked;
|
|
226
|
-
}
|
|
5
|
+
import { detectWorkflowIntent, matchWorkflowRoute, isBrowserOrNetworkTask, isMaintenanceTask, } from './ToolRouter.intent.js';
|
|
6
|
+
import { getAvailableToolNames, getRoutingState, isToolActive, getToolDomainFromContext, getToolInputSchema, } from './ToolRouter.probe.js';
|
|
7
|
+
import { getEffectivePrerequisites, buildWorkflowToolSequence, buildPresetRecommendations, buildWorkflowRouteRecommendation, buildRouteMatchMetadata, rerankResultsForContext, } from './ToolRouter.policy.js';
|
|
8
|
+
import { buildCallToolCommand, generateExampleArgs } from './ToolRouter.renderer.js';
|
|
227
9
|
export async function routeToolRequest(request, ctx, searchEngine) {
|
|
228
10
|
const { task, context = {} } = request;
|
|
229
11
|
const maxRecommendations = context.maxRecommendations || 5;
|
|
230
12
|
logger.info('[ToolRouter] Routing request', { task, context });
|
|
13
|
+
await ensureWorkflowsLoaded(ctx);
|
|
231
14
|
const workflow = detectWorkflowIntent(task);
|
|
232
15
|
const activeNames = getActiveToolNames(ctx);
|
|
233
16
|
const routingState = await getRoutingState(ctx);
|
|
234
17
|
const availableToolNames = getAvailableToolNames(ctx);
|
|
18
|
+
const routeMatch = matchWorkflowRoute(task, ctx);
|
|
19
|
+
let presetPlannedToolNames = null;
|
|
235
20
|
const searchResults = await searchEngine.search(task, maxRecommendations * 2, activeNames);
|
|
236
21
|
let finalResults = [];
|
|
237
|
-
if (workflow) {
|
|
22
|
+
if (routeMatch?.workflow.route.kind === 'preset') {
|
|
23
|
+
const presetTools = buildPresetRecommendations(routeMatch, routingState, ctx, availableToolNames);
|
|
24
|
+
presetPlannedToolNames = new Set(presetTools.map((tool) => tool.name));
|
|
25
|
+
const presetNames = new Set(presetTools.map((tool) => tool.name));
|
|
26
|
+
const otherResults = searchResults.filter((result) => !presetNames.has(result.name));
|
|
27
|
+
finalResults = [...presetTools, ...otherResults];
|
|
28
|
+
}
|
|
29
|
+
else if (routeMatch?.workflow.route.kind === 'workflow') {
|
|
30
|
+
const workflowResult = buildWorkflowRouteRecommendation(routeMatch, ctx);
|
|
31
|
+
const otherResults = searchResults.filter((result) => result.name !== workflowResult.name);
|
|
32
|
+
finalResults = [workflowResult, ...otherResults];
|
|
33
|
+
}
|
|
34
|
+
else if (workflow) {
|
|
238
35
|
const workflowSequence = buildWorkflowToolSequence(workflow, routingState, availableToolNames);
|
|
239
36
|
const workflowTools = workflowSequence.map((name, index) => ({
|
|
240
37
|
name,
|
|
241
|
-
domain:
|
|
242
|
-
shortDescription:
|
|
38
|
+
domain: getToolDomainFromContext(name, ctx),
|
|
39
|
+
shortDescription: searchResults.find((r) => r.name === name)?.shortDescription ??
|
|
40
|
+
ctx.extensionToolsByName.get(name)?.tool.description ??
|
|
41
|
+
'',
|
|
243
42
|
score: workflow.priority - index * 0.01,
|
|
244
|
-
isActive:
|
|
43
|
+
isActive: isToolActive(name, ctx),
|
|
245
44
|
}));
|
|
246
45
|
const workflowNames = new Set(workflowSequence);
|
|
247
46
|
const otherResults = searchResults.filter((result) => !workflowNames.has(result.name));
|
|
@@ -268,10 +67,12 @@ export async function routeToolRequest(request, ctx, searchEngine) {
|
|
|
268
67
|
}));
|
|
269
68
|
finalResults.sort((a, b) => b.score - a.score);
|
|
270
69
|
}
|
|
271
|
-
|
|
70
|
+
const recommendationLimit = Math.max(maxRecommendations, presetPlannedToolNames?.size ?? 0);
|
|
71
|
+
finalResults = finalResults.slice(0, recommendationLimit);
|
|
72
|
+
const routeMatchMetadata = routeMatch ? buildRouteMatchMetadata(routeMatch, ctx) : undefined;
|
|
272
73
|
const recommendations = finalResults.map((result) => {
|
|
273
74
|
const schema = getToolInputSchema(result.name, ctx);
|
|
274
|
-
const toolIsActive =
|
|
75
|
+
const toolIsActive = isToolActive(result.name, ctx);
|
|
275
76
|
const recommendation = {
|
|
276
77
|
name: result.name,
|
|
277
78
|
domain: result.domain,
|
|
@@ -295,15 +96,79 @@ export async function routeToolRequest(request, ctx, searchEngine) {
|
|
|
295
96
|
return recommendation;
|
|
296
97
|
});
|
|
297
98
|
const nextActions = [];
|
|
298
|
-
const
|
|
99
|
+
const presetRecommendations = presetPlannedToolNames
|
|
100
|
+
? recommendations.filter((recommendation) => presetPlannedToolNames.has(recommendation.name))
|
|
101
|
+
: [];
|
|
102
|
+
const inactiveTools = (presetRecommendations.length > 0 ? presetRecommendations : recommendations).filter((recommendation) => !recommendation.isActive);
|
|
299
103
|
const activationCandidates = (() => {
|
|
300
|
-
if (
|
|
104
|
+
if (presetRecommendations.length > 0 ||
|
|
105
|
+
!isBrowserOrNetworkTask(task, workflow) ||
|
|
106
|
+
isMaintenanceTask(task)) {
|
|
301
107
|
return inactiveTools;
|
|
302
108
|
}
|
|
303
109
|
const nonMaintenanceTools = inactiveTools.filter((tool) => tool.domain !== 'maintenance');
|
|
304
110
|
return nonMaintenanceTools.length > 0 ? nonMaintenanceTools : inactiveTools;
|
|
305
111
|
})();
|
|
306
|
-
if (
|
|
112
|
+
if (routeMatchMetadata?.kind === 'preset' && presetRecommendations.length > 0) {
|
|
113
|
+
let stepNumber = 1;
|
|
114
|
+
if (activationCandidates.length > 0) {
|
|
115
|
+
nextActions.push({
|
|
116
|
+
step: stepNumber++,
|
|
117
|
+
action: 'activate',
|
|
118
|
+
toolName: activationCandidates.length === 1 ? activationCandidates[0].name : undefined,
|
|
119
|
+
command: `activate_tools with names: [${activationCandidates.map((tool) => `"${tool.name}"`).join(', ')}]`,
|
|
120
|
+
description: `Activate ${activationCandidates.length} preset tool${activationCandidates.length === 1 ? '' : 's'} for ${routeMatchMetadata.name}`,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
const bootstrapRecommendations = recommendations.filter((recommendation) => recommendation.name === 'browser_launch' || recommendation.name === 'browser_attach');
|
|
124
|
+
for (const bootstrap of bootstrapRecommendations) {
|
|
125
|
+
nextActions.push({
|
|
126
|
+
step: stepNumber++,
|
|
127
|
+
action: 'call',
|
|
128
|
+
toolName: bootstrap.name,
|
|
129
|
+
command: bootstrap.name,
|
|
130
|
+
exampleArgs: generateExampleArgs(bootstrap.inputSchema),
|
|
131
|
+
description: bootstrap.description,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
for (const step of routeMatchMetadata.steps) {
|
|
135
|
+
const recommendation = presetRecommendations.find((item) => item.name === step.toolName);
|
|
136
|
+
nextActions.push({
|
|
137
|
+
step: stepNumber++,
|
|
138
|
+
action: 'call',
|
|
139
|
+
toolName: step.toolName,
|
|
140
|
+
command: step.toolName,
|
|
141
|
+
exampleArgs: generateExampleArgs(recommendation?.inputSchema ??
|
|
142
|
+
getToolInputSchema(step.toolName, ctx) ?? { type: 'object' }),
|
|
143
|
+
description: `${step.id}: ${step.description}`,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
else if (routeMatchMetadata?.kind === 'workflow') {
|
|
148
|
+
const workflowRecommendation = recommendations.find((recommendation) => recommendation.name === 'run_extension_workflow');
|
|
149
|
+
let stepNumber = 1;
|
|
150
|
+
if (!workflowRecommendation.isActive) {
|
|
151
|
+
nextActions.push({
|
|
152
|
+
step: stepNumber++,
|
|
153
|
+
action: 'activate',
|
|
154
|
+
toolName: workflowRecommendation.name,
|
|
155
|
+
command: `activate_tools with names: ["${workflowRecommendation.name}"]`,
|
|
156
|
+
description: `Activate workflow runner for ${routeMatchMetadata.name}`,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
nextActions.push({
|
|
160
|
+
step: stepNumber,
|
|
161
|
+
action: 'call',
|
|
162
|
+
toolName: 'run_extension_workflow',
|
|
163
|
+
command: 'run_extension_workflow',
|
|
164
|
+
exampleArgs: {
|
|
165
|
+
...generateExampleArgs(workflowRecommendation.inputSchema),
|
|
166
|
+
workflowId: routeMatchMetadata.id,
|
|
167
|
+
},
|
|
168
|
+
description: `Execute routed workflow ${routeMatchMetadata.name}`,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
else if (recommendations.length > 0 && recommendations[0]?.isActive) {
|
|
307
172
|
nextActions.push({
|
|
308
173
|
step: 1,
|
|
309
174
|
action: 'call',
|
|
@@ -334,57 +199,11 @@ export async function routeToolRequest(request, ctx, searchEngine) {
|
|
|
334
199
|
return {
|
|
335
200
|
recommendations,
|
|
336
201
|
nextActions,
|
|
337
|
-
workflowHint:
|
|
202
|
+
workflowHint: routeMatchMetadata
|
|
203
|
+
? `${routeMatchMetadata.kind === 'preset' ? 'Preset' : 'Workflow'} ${routeMatchMetadata.name}: ${routeMatchMetadata.description}`
|
|
204
|
+
: workflow?.hint,
|
|
205
|
+
routeMatch: routeMatchMetadata,
|
|
338
206
|
autoActivated: false,
|
|
339
207
|
};
|
|
340
208
|
}
|
|
341
|
-
export
|
|
342
|
-
return `call_tool({ name: "${toolName}", args: ${JSON.stringify(generateExampleArgs(schema))} })`;
|
|
343
|
-
}
|
|
344
|
-
export function generateExampleArgs(schema) {
|
|
345
|
-
if (!schema || schema.type !== 'object' || !schema.properties) {
|
|
346
|
-
return {};
|
|
347
|
-
}
|
|
348
|
-
const example = {};
|
|
349
|
-
const required = new Set(Array.isArray(schema.required) ? schema.required : []);
|
|
350
|
-
for (const [key, prop] of Object.entries(schema.properties)) {
|
|
351
|
-
const propSchema = prop;
|
|
352
|
-
if (!required.has(key) && propSchema.default === undefined) {
|
|
353
|
-
continue;
|
|
354
|
-
}
|
|
355
|
-
if (propSchema.default !== undefined) {
|
|
356
|
-
example[key] = propSchema.default;
|
|
357
|
-
}
|
|
358
|
-
else if (propSchema.enum && Array.isArray(propSchema.enum) && propSchema.enum.length > 0) {
|
|
359
|
-
example[key] = propSchema.enum[0];
|
|
360
|
-
}
|
|
361
|
-
else if (propSchema.type === 'string') {
|
|
362
|
-
example[key] = `<${key}>`;
|
|
363
|
-
}
|
|
364
|
-
else if (propSchema.type === 'number' || propSchema.type === 'integer') {
|
|
365
|
-
example[key] = 0;
|
|
366
|
-
}
|
|
367
|
-
else if (propSchema.type === 'boolean') {
|
|
368
|
-
example[key] = false;
|
|
369
|
-
}
|
|
370
|
-
else if (propSchema.type === 'array') {
|
|
371
|
-
example[key] = [];
|
|
372
|
-
}
|
|
373
|
-
else if (propSchema.type === 'object') {
|
|
374
|
-
example[key] = {};
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
return example;
|
|
378
|
-
}
|
|
379
|
-
export function describeTool(toolName, ctx) {
|
|
380
|
-
const canonicalName = normalizeToolName(toolName);
|
|
381
|
-
const schema = getToolInputSchema(canonicalName, ctx);
|
|
382
|
-
if (!schema) {
|
|
383
|
-
return null;
|
|
384
|
-
}
|
|
385
|
-
return {
|
|
386
|
-
name: canonicalName,
|
|
387
|
-
description: getToolDescription(canonicalName, ctx),
|
|
388
|
-
inputSchema: schema,
|
|
389
|
-
};
|
|
390
|
-
}
|
|
209
|
+
export { buildCallToolCommand, describeTool, generateExampleArgs, } from './ToolRouter.renderer.js';
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { MCPServerContext } from './MCPServer.context.js';
|
|
2
|
+
import type { ToolSearchResult } from './ToolSearch.js';
|
|
3
|
+
import type { WorkflowRule, RoutedWorkflowMatch } from './ToolRouter.intent.js';
|
|
4
|
+
import type { RoutingState } from './ToolRouter.probe.js';
|
|
5
|
+
import type { RouterResponse } from './ToolRouter.js';
|
|
6
|
+
export interface PrerequisiteEntry {
|
|
7
|
+
condition: string;
|
|
8
|
+
check: (state: RoutingState) => boolean;
|
|
9
|
+
fix: string;
|
|
10
|
+
}
|
|
11
|
+
interface PlannedTool {
|
|
12
|
+
name: string;
|
|
13
|
+
description: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function getEffectivePrerequisites(): Record<string, PrerequisiteEntry[]>;
|
|
16
|
+
export declare function buildWorkflowToolSequence(workflow: WorkflowRule, state: RoutingState, availableToolNames: Set<string>): string[];
|
|
17
|
+
export declare function buildPresetToolSequence(match: RoutedWorkflowMatch, state: RoutingState, availableToolNames: Set<string>): PlannedTool[];
|
|
18
|
+
export declare function buildPresetRecommendations(match: RoutedWorkflowMatch, state: RoutingState, ctx: MCPServerContext, availableToolNames: Set<string>): ToolSearchResult[];
|
|
19
|
+
export declare function buildWorkflowRouteRecommendation(match: RoutedWorkflowMatch, ctx: MCPServerContext): ToolSearchResult;
|
|
20
|
+
export declare function buildRouteMatchMetadata(match: RoutedWorkflowMatch, ctx: MCPServerContext): NonNullable<RouterResponse['routeMatch']>;
|
|
21
|
+
export declare function rerankResultsForContext(results: ToolSearchResult[], task: string, workflow: WorkflowRule | null, state: RoutingState): ToolSearchResult[];
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { getToolDomain } from './ToolCatalog.js';
|
|
2
|
+
import { getAllManifests } from './registry/index.js';
|
|
3
|
+
import { isBrowserOrNetworkTask, isMaintenanceTask } from './ToolRouter.intent.js';
|
|
4
|
+
import { isToolActive, getToolDomainFromContext } from './ToolRouter.probe.js';
|
|
5
|
+
function buildPrerequisiteCheck(condition) {
|
|
6
|
+
if (condition.includes('Browser must be launched')) {
|
|
7
|
+
return (state) => state.hasActivePage;
|
|
8
|
+
}
|
|
9
|
+
if (condition.includes('Network monitoring must be enabled')) {
|
|
10
|
+
return (state) => state.networkEnabled;
|
|
11
|
+
}
|
|
12
|
+
if (condition.includes('Debugger must be enabled')) {
|
|
13
|
+
return (state) => state.hasActivePage;
|
|
14
|
+
}
|
|
15
|
+
if (condition.includes('Debugger must be attached')) {
|
|
16
|
+
return (state) => state.hasActivePage;
|
|
17
|
+
}
|
|
18
|
+
if (condition.includes('Page must be navigated')) {
|
|
19
|
+
return (state) => state.hasActivePage;
|
|
20
|
+
}
|
|
21
|
+
if (condition.includes('WebSocket monitoring')) {
|
|
22
|
+
return (state) => state.hasActivePage;
|
|
23
|
+
}
|
|
24
|
+
return () => false;
|
|
25
|
+
}
|
|
26
|
+
let _cachedPrerequisites = null;
|
|
27
|
+
export function getEffectivePrerequisites() {
|
|
28
|
+
if (_cachedPrerequisites)
|
|
29
|
+
return _cachedPrerequisites;
|
|
30
|
+
const merged = {};
|
|
31
|
+
for (const m of getAllManifests()) {
|
|
32
|
+
if (m.prerequisites) {
|
|
33
|
+
for (const [toolName, entries] of Object.entries(m.prerequisites)) {
|
|
34
|
+
merged[toolName] = entries.map((e) => ({
|
|
35
|
+
condition: e.condition,
|
|
36
|
+
check: buildPrerequisiteCheck(e.condition),
|
|
37
|
+
fix: e.fix,
|
|
38
|
+
}));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
_cachedPrerequisites = merged;
|
|
43
|
+
return _cachedPrerequisites;
|
|
44
|
+
}
|
|
45
|
+
export function buildWorkflowToolSequence(workflow, state, availableToolNames) {
|
|
46
|
+
const sequence = [];
|
|
47
|
+
const pushIfAvailable = (toolName) => {
|
|
48
|
+
if (availableToolNames.has(toolName) && !sequence.includes(toolName)) {
|
|
49
|
+
sequence.push(toolName);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
if ((workflow.domain === 'browser' || workflow.domain === 'network') && !state.hasActivePage) {
|
|
53
|
+
pushIfAvailable('browser_launch');
|
|
54
|
+
pushIfAvailable('browser_attach');
|
|
55
|
+
}
|
|
56
|
+
if (workflow.domain === 'network') {
|
|
57
|
+
if (state.hasActivePage && !state.networkEnabled) {
|
|
58
|
+
pushIfAvailable('network_enable');
|
|
59
|
+
}
|
|
60
|
+
if (state.hasActivePage && state.networkEnabled && state.capturedRequestCount > 0) {
|
|
61
|
+
pushIfAvailable('network_get_requests');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
for (const toolName of workflow.tools) {
|
|
65
|
+
pushIfAvailable(toolName);
|
|
66
|
+
}
|
|
67
|
+
if (workflow.domain === 'network' && state.hasActivePage && state.networkEnabled) {
|
|
68
|
+
pushIfAvailable('network_get_requests');
|
|
69
|
+
}
|
|
70
|
+
return sequence;
|
|
71
|
+
}
|
|
72
|
+
export function buildPresetToolSequence(match, state, availableToolNames) {
|
|
73
|
+
const sequence = [];
|
|
74
|
+
const seen = new Set();
|
|
75
|
+
const requiresBrowserSession = match.workflow.route.requiredDomains.includes('browser') ||
|
|
76
|
+
match.workflow.route.requiredDomains.includes('network');
|
|
77
|
+
const pushIfAvailable = (toolName, description) => {
|
|
78
|
+
if (!availableToolNames.has(toolName) || seen.has(toolName)) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
seen.add(toolName);
|
|
82
|
+
sequence.push({ name: toolName, description });
|
|
83
|
+
};
|
|
84
|
+
if (!state.hasActivePage && requiresBrowserSession) {
|
|
85
|
+
pushIfAvailable('browser_launch', 'Launch a browser session before executing the preset');
|
|
86
|
+
pushIfAvailable('browser_attach', 'Attach preset tooling to the active browser session before capture begins');
|
|
87
|
+
}
|
|
88
|
+
for (const step of match.workflow.route.steps) {
|
|
89
|
+
pushIfAvailable(step.toolName, step.description);
|
|
90
|
+
}
|
|
91
|
+
return sequence;
|
|
92
|
+
}
|
|
93
|
+
export function buildPresetRecommendations(match, state, ctx, availableToolNames) {
|
|
94
|
+
return buildPresetToolSequence(match, state, availableToolNames).map((plannedTool, index) => ({
|
|
95
|
+
name: plannedTool.name,
|
|
96
|
+
domain: getToolDomainFromContext(plannedTool.name, ctx),
|
|
97
|
+
shortDescription: plannedTool.description,
|
|
98
|
+
score: match.workflow.route.priority + match.confidence - index * 0.01,
|
|
99
|
+
isActive: isToolActive(plannedTool.name, ctx),
|
|
100
|
+
}));
|
|
101
|
+
}
|
|
102
|
+
export function buildWorkflowRouteRecommendation(match, ctx) {
|
|
103
|
+
return {
|
|
104
|
+
name: 'run_extension_workflow',
|
|
105
|
+
domain: getToolDomainFromContext('run_extension_workflow', ctx),
|
|
106
|
+
shortDescription: `Execute routed workflow ${match.workflow.name} (${match.workflow.id}) via run_extension_workflow`,
|
|
107
|
+
score: match.workflow.route.priority + match.confidence,
|
|
108
|
+
isActive: isToolActive('run_extension_workflow', ctx),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
export function buildRouteMatchMetadata(match, ctx) {
|
|
112
|
+
return {
|
|
113
|
+
kind: match.workflow.route.kind,
|
|
114
|
+
id: match.workflow.id,
|
|
115
|
+
name: match.workflow.name,
|
|
116
|
+
description: match.workflow.description,
|
|
117
|
+
confidence: match.confidence,
|
|
118
|
+
matchedPattern: match.matchedPattern,
|
|
119
|
+
requiredDomains: [...match.workflow.route.requiredDomains],
|
|
120
|
+
steps: match.workflow.route.steps.map((step) => ({
|
|
121
|
+
id: step.id,
|
|
122
|
+
toolName: step.toolName,
|
|
123
|
+
domain: getToolDomain(step.toolName) ?? ctx.extensionToolsByName.get(step.toolName)?.domain ?? null,
|
|
124
|
+
description: step.description,
|
|
125
|
+
prerequisites: [...step.prerequisites],
|
|
126
|
+
parallel: step.parallel,
|
|
127
|
+
isActive: isToolActive(step.toolName, ctx),
|
|
128
|
+
})),
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
export function rerankResultsForContext(results, task, workflow, state) {
|
|
132
|
+
const browserOrNetworkTask = isBrowserOrNetworkTask(task, workflow);
|
|
133
|
+
const maintenanceTask = isMaintenanceTask(task);
|
|
134
|
+
const reranked = results.map((result) => {
|
|
135
|
+
let score = result.score;
|
|
136
|
+
if (browserOrNetworkTask && !maintenanceTask && result.domain === 'maintenance') {
|
|
137
|
+
score *= 0.1;
|
|
138
|
+
}
|
|
139
|
+
if (browserOrNetworkTask) {
|
|
140
|
+
if (!state.hasActivePage && result.name === 'browser_launch') {
|
|
141
|
+
score *= 1.4;
|
|
142
|
+
}
|
|
143
|
+
if (!state.hasActivePage && result.name === 'browser_attach') {
|
|
144
|
+
score *= 1.2;
|
|
145
|
+
}
|
|
146
|
+
if (state.hasActivePage && !state.networkEnabled && result.name === 'network_enable') {
|
|
147
|
+
score *= 1.35;
|
|
148
|
+
}
|
|
149
|
+
if (state.hasActivePage &&
|
|
150
|
+
state.networkEnabled &&
|
|
151
|
+
state.capturedRequestCount > 0 &&
|
|
152
|
+
result.name === 'network_get_requests') {
|
|
153
|
+
score *= 1.5;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
...result,
|
|
158
|
+
score,
|
|
159
|
+
};
|
|
160
|
+
});
|
|
161
|
+
reranked.sort((a, b) => b.score - a.score);
|
|
162
|
+
return reranked;
|
|
163
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import type { MCPServerContext } from './MCPServer.context.js';
|
|
3
|
+
export interface RoutingState {
|
|
4
|
+
hasActivePage: boolean;
|
|
5
|
+
networkEnabled: boolean;
|
|
6
|
+
capturedRequestCount: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function getAllToolsByName(): Map<string, Tool>;
|
|
9
|
+
export declare function getToolInputSchema(toolName: string, ctx: MCPServerContext): Tool['inputSchema'] | undefined;
|
|
10
|
+
export declare function getToolDescription(toolName: string, ctx: MCPServerContext): string;
|
|
11
|
+
export declare function isToolActive(toolName: string, ctx: MCPServerContext): boolean;
|
|
12
|
+
export declare function getAvailableToolNames(ctx: MCPServerContext): Set<string>;
|
|
13
|
+
export declare function getToolDomainFromContext(toolName: string, ctx: MCPServerContext): string | null;
|
|
14
|
+
export declare function probeActivePage(ctx: MCPServerContext): Promise<boolean>;
|
|
15
|
+
export declare function probeNetworkEnabled(ctx: MCPServerContext): boolean;
|
|
16
|
+
export declare function probeCapturedRequests(ctx: MCPServerContext): number;
|
|
17
|
+
export declare function getRoutingState(ctx: MCPServerContext): Promise<RoutingState>;
|