@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
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
export function summarizeEvents(events, detail = 'balanced') {
|
|
2
|
+
if (events.length === 0) {
|
|
3
|
+
return {
|
|
4
|
+
detail,
|
|
5
|
+
totalEvents: 0,
|
|
6
|
+
timeRange: { start: 0, end: 0, durationMs: 0 },
|
|
7
|
+
categories: [],
|
|
8
|
+
keyMoments: detail !== 'compact' ? [] : undefined,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
const timestamps = events.map((e) => e.timestamp);
|
|
12
|
+
const start = Math.min(...timestamps);
|
|
13
|
+
const end = Math.max(...timestamps);
|
|
14
|
+
const catMap = new Map();
|
|
15
|
+
for (const event of events) {
|
|
16
|
+
let cat = catMap.get(event.category);
|
|
17
|
+
if (!cat) {
|
|
18
|
+
cat = { count: 0, first: event.timestamp, last: event.timestamp, types: new Map() };
|
|
19
|
+
catMap.set(event.category, cat);
|
|
20
|
+
}
|
|
21
|
+
cat.count++;
|
|
22
|
+
cat.first = Math.min(cat.first, event.timestamp);
|
|
23
|
+
cat.last = Math.max(cat.last, event.timestamp);
|
|
24
|
+
cat.types.set(event.eventType, (cat.types.get(event.eventType) ?? 0) + 1);
|
|
25
|
+
}
|
|
26
|
+
const categories = [...catMap.entries()]
|
|
27
|
+
.toSorted((a, b) => b[1].count - a[1].count)
|
|
28
|
+
.map(([category, info]) => ({
|
|
29
|
+
category,
|
|
30
|
+
count: info.count,
|
|
31
|
+
firstTimestamp: info.first,
|
|
32
|
+
lastTimestamp: info.last,
|
|
33
|
+
topEventTypes: [...info.types.entries()]
|
|
34
|
+
.toSorted((a, b) => b[1] - a[1])
|
|
35
|
+
.slice(0, 5)
|
|
36
|
+
.map(([type, count]) => ({ type, count })),
|
|
37
|
+
}));
|
|
38
|
+
const summary = {
|
|
39
|
+
detail,
|
|
40
|
+
totalEvents: events.length,
|
|
41
|
+
timeRange: { start, end, durationMs: end - start },
|
|
42
|
+
categories,
|
|
43
|
+
};
|
|
44
|
+
if (detail === 'balanced' || detail === 'full') {
|
|
45
|
+
summary.keyMoments = extractKeyMoments(events);
|
|
46
|
+
}
|
|
47
|
+
return summary;
|
|
48
|
+
}
|
|
49
|
+
export function extractKeyMoments(events) {
|
|
50
|
+
const moments = [];
|
|
51
|
+
for (const event of events) {
|
|
52
|
+
if (event.eventType === 'Debugger.paused') {
|
|
53
|
+
moments.push({
|
|
54
|
+
timestamp: event.timestamp,
|
|
55
|
+
type: 'breakpoint',
|
|
56
|
+
description: `Debugger paused${event.scriptId ? ` at script ${event.scriptId}` : ''}${event.lineNumber ? `:${event.lineNumber}` : ''}`,
|
|
57
|
+
data: event.data,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
else if (event.eventType === 'Network.loadingFinished') {
|
|
61
|
+
moments.push({
|
|
62
|
+
timestamp: event.timestamp,
|
|
63
|
+
type: 'network_complete',
|
|
64
|
+
description: 'Network request completed',
|
|
65
|
+
data: event.data,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
else if (event.eventType === 'Runtime.exceptionThrown') {
|
|
69
|
+
moments.push({
|
|
70
|
+
timestamp: event.timestamp,
|
|
71
|
+
type: 'exception',
|
|
72
|
+
description: 'Runtime exception thrown',
|
|
73
|
+
data: event.data,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
else if (event.eventType === 'Page.frameNavigated' ||
|
|
77
|
+
event.eventType === 'Page.navigatedWithinDocument') {
|
|
78
|
+
moments.push({
|
|
79
|
+
timestamp: event.timestamp,
|
|
80
|
+
type: 'navigation',
|
|
81
|
+
description: 'Page navigation',
|
|
82
|
+
data: event.data,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return moments;
|
|
87
|
+
}
|
|
88
|
+
export function summarizeMemoryDeltas(deltas) {
|
|
89
|
+
if (deltas.length === 0) {
|
|
90
|
+
return { totalDeltas: 0, uniqueAddresses: 0, anomalies: [], topAddresses: [] };
|
|
91
|
+
}
|
|
92
|
+
const writeMap = new Map();
|
|
93
|
+
for (const delta of deltas) {
|
|
94
|
+
writeMap.set(delta.address, (writeMap.get(delta.address) ?? 0) + 1);
|
|
95
|
+
}
|
|
96
|
+
const uniqueAddresses = writeMap.size;
|
|
97
|
+
const totalWrites = deltas.length;
|
|
98
|
+
const meanWrites = totalWrites / uniqueAddresses;
|
|
99
|
+
const sorted = [...writeMap.entries()].toSorted((a, b) => b[1] - a[1]);
|
|
100
|
+
const topAddresses = sorted
|
|
101
|
+
.slice(0, 10)
|
|
102
|
+
.map(([address, writeCount]) => ({ address, writeCount }));
|
|
103
|
+
const anomalyThreshold = meanWrites * 3;
|
|
104
|
+
const anomalies = sorted
|
|
105
|
+
.filter(([, count]) => count > anomalyThreshold)
|
|
106
|
+
.map(([address, writeCount]) => ({
|
|
107
|
+
address,
|
|
108
|
+
writeCount,
|
|
109
|
+
description: `${writeCount} writes (${(writeCount / meanWrites).toFixed(1)}× average)`,
|
|
110
|
+
}));
|
|
111
|
+
return { totalDeltas: totalWrites, uniqueAddresses, anomalies, topAddresses };
|
|
112
|
+
}
|
|
@@ -1,178 +1,53 @@
|
|
|
1
|
+
import { tool } from '../../registry/tool-builder.js';
|
|
1
2
|
export const TRACE_TOOLS = [
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
name: 'query_trace_sql',
|
|
53
|
-
description: `Execute a read-only SQL query against a trace database.
|
|
54
|
-
|
|
55
|
-
Available tables:
|
|
56
|
-
- events(id, timestamp, category, event_type, data, script_id, line_number)
|
|
57
|
-
- memory_deltas(id, timestamp, address, old_value, new_value, size, value_type)
|
|
58
|
-
- heap_snapshots(id, timestamp, snapshot_data, summary)
|
|
59
|
-
- metadata(key, value)
|
|
60
|
-
|
|
61
|
-
Returns columns, rows, and row count.
|
|
62
|
-
|
|
63
|
-
Examples:
|
|
64
|
-
query_trace_sql(sql="SELECT * FROM events WHERE category='debugger' ORDER BY timestamp")
|
|
65
|
-
query_trace_sql(sql="SELECT address, COUNT(*) as writes FROM memory_deltas GROUP BY address ORDER BY writes DESC LIMIT 10")
|
|
66
|
-
query_trace_sql(sql="SELECT * FROM events WHERE timestamp BETWEEN 1000 AND 2000", dbPath="artifacts/traces/my-trace.db")`,
|
|
67
|
-
inputSchema: {
|
|
68
|
-
type: 'object',
|
|
69
|
-
properties: {
|
|
70
|
-
sql: {
|
|
71
|
-
type: 'string',
|
|
72
|
-
description: 'SQL query to execute (SELECT only — write operations are rejected)',
|
|
73
|
-
},
|
|
74
|
-
dbPath: {
|
|
75
|
-
type: 'string',
|
|
76
|
-
description: 'Path to trace DB file. Uses the active recording if omitted.',
|
|
77
|
-
},
|
|
78
|
-
},
|
|
79
|
-
required: ['sql'],
|
|
80
|
-
},
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
name: 'seek_to_timestamp',
|
|
84
|
-
description: `Reconstruct application state at a specific timestamp from a recorded trace.
|
|
85
|
-
|
|
86
|
-
Returns a structured snapshot including:
|
|
87
|
-
- Events near the timestamp
|
|
88
|
-
- Debugger state (last pause, call stack)
|
|
89
|
-
- Memory state (latest values per address)
|
|
90
|
-
- Network state (completed requests)
|
|
91
|
-
- Nearest heap snapshot
|
|
92
|
-
|
|
93
|
-
Examples:
|
|
94
|
-
seek_to_timestamp(timestamp=1711000000000)
|
|
95
|
-
seek_to_timestamp(timestamp=1711000000000, windowMs=500)
|
|
96
|
-
seek_to_timestamp(timestamp=1711000000000, dbPath="artifacts/traces/my-trace.db")`,
|
|
97
|
-
inputSchema: {
|
|
98
|
-
type: 'object',
|
|
99
|
-
properties: {
|
|
100
|
-
timestamp: {
|
|
101
|
-
type: 'number',
|
|
102
|
-
description: 'Target timestamp in milliseconds since epoch',
|
|
103
|
-
},
|
|
104
|
-
dbPath: {
|
|
105
|
-
type: 'string',
|
|
106
|
-
description: 'Path to trace DB file. Uses the active recording if omitted.',
|
|
107
|
-
},
|
|
108
|
-
windowMs: {
|
|
109
|
-
type: 'number',
|
|
110
|
-
description: 'Time window around timestamp to include in ms (default: 100)',
|
|
111
|
-
},
|
|
112
|
-
},
|
|
113
|
-
required: ['timestamp'],
|
|
114
|
-
},
|
|
115
|
-
},
|
|
116
|
-
{
|
|
117
|
-
name: 'diff_heap_snapshots',
|
|
118
|
-
description: `Compare two heap snapshots from a trace and return the differences.
|
|
119
|
-
|
|
120
|
-
Shows:
|
|
121
|
-
- New object types (in snapshot 2 but not 1)
|
|
122
|
-
- Deleted object types (in snapshot 1 but not 2)
|
|
123
|
-
- Changed objects (count or size differs)
|
|
124
|
-
- Total size delta
|
|
125
|
-
|
|
126
|
-
Useful for identifying state changes in obfuscated code.
|
|
127
|
-
|
|
128
|
-
Examples:
|
|
129
|
-
diff_heap_snapshots(snapshotId1=1, snapshotId2=2)
|
|
130
|
-
diff_heap_snapshots(snapshotId1=1, snapshotId2=3, dbPath="artifacts/traces/my-trace.db")`,
|
|
131
|
-
inputSchema: {
|
|
132
|
-
type: 'object',
|
|
133
|
-
properties: {
|
|
134
|
-
snapshotId1: {
|
|
135
|
-
type: 'number',
|
|
136
|
-
description: 'First snapshot ID (earlier)',
|
|
137
|
-
},
|
|
138
|
-
snapshotId2: {
|
|
139
|
-
type: 'number',
|
|
140
|
-
description: 'Second snapshot ID (later)',
|
|
141
|
-
},
|
|
142
|
-
dbPath: {
|
|
143
|
-
type: 'string',
|
|
144
|
-
description: 'Path to trace DB file. Uses the active recording if omitted.',
|
|
145
|
-
},
|
|
146
|
-
},
|
|
147
|
-
required: ['snapshotId1', 'snapshotId2'],
|
|
148
|
-
},
|
|
149
|
-
},
|
|
150
|
-
{
|
|
151
|
-
name: 'export_trace',
|
|
152
|
-
description: `Export a trace database to Chrome Trace Event JSON format.
|
|
153
|
-
|
|
154
|
-
The resulting file can be loaded in:
|
|
155
|
-
- chrome://tracing
|
|
156
|
-
- Perfetto UI (ui.perfetto.dev)
|
|
157
|
-
|
|
158
|
-
Maps events to the standard trace event format with name, category, phase, timestamp.
|
|
159
|
-
|
|
160
|
-
Examples:
|
|
161
|
-
export_trace()
|
|
162
|
-
export_trace(dbPath="artifacts/traces/my-trace.db")
|
|
163
|
-
export_trace(outputPath="my-export.json")`,
|
|
164
|
-
inputSchema: {
|
|
165
|
-
type: 'object',
|
|
166
|
-
properties: {
|
|
167
|
-
dbPath: {
|
|
168
|
-
type: 'string',
|
|
169
|
-
description: 'Path to trace DB file. Uses the active recording if omitted.',
|
|
170
|
-
},
|
|
171
|
-
outputPath: {
|
|
172
|
-
type: 'string',
|
|
173
|
-
description: 'Output JSON file path. Auto-generated if omitted.',
|
|
174
|
-
},
|
|
175
|
-
},
|
|
176
|
-
},
|
|
177
|
-
},
|
|
3
|
+
tool('start_trace_recording')
|
|
4
|
+
.desc('Start recording CDP events, debugger state, and memory writes into a SQLite trace database.\n\nRecording captures events from:\n- Debugger: breakpoints, pauses, script parsing\n- Runtime: console calls, exceptions\n- Network: requests, responses\n- Page: navigation events\n- EventBus: tool calls, memory scans, browser events\n\nCall stop_trace_recording to end the recording session.\n\nExamples:\nstart_trace_recording()\nstart_trace_recording(cdpDomains=["Debugger", "Network"])')
|
|
5
|
+
.array('cdpDomains', { type: 'string' }, 'CDP domains to record (default: Debugger, Runtime, Network, Page)')
|
|
6
|
+
.boolean('recordMemoryDeltas', 'Record memory write deltas', { default: true })
|
|
7
|
+
.idempotent()
|
|
8
|
+
.build(),
|
|
9
|
+
tool('stop_trace_recording')
|
|
10
|
+
.desc('Stop the active trace recording and finalize the SQLite database.\n\nReturns session summary including:\n- Database file path\n- Total event count\n- Memory delta count\n- Heap snapshot count\n- Recording duration\n\nExamples:\nstop_trace_recording()')
|
|
11
|
+
.build(),
|
|
12
|
+
tool('query_trace_sql')
|
|
13
|
+
.desc('Execute a read-only SQL query against a trace database.\n\nAvailable tables:\n- events(id, timestamp, category, event_type, data, script_id, line_number)\n- memory_deltas(id, timestamp, address, old_value, new_value, size, value_type)\n- heap_snapshots(id, timestamp, snapshot_data, summary)\n- metadata(key, value)\n\nReturns columns, rows, and row count.\n\nExamples:\nquery_trace_sql(sql="SELECT * FROM events WHERE category=\'debugger\' ORDER BY timestamp")\nquery_trace_sql(sql="SELECT address, COUNT(*) as writes FROM memory_deltas GROUP BY address ORDER BY writes DESC LIMIT 10")\nquery_trace_sql(sql="SELECT * FROM events WHERE timestamp BETWEEN 1000 AND 2000", dbPath="artifacts/traces/my-trace.db")')
|
|
14
|
+
.string('sql', 'SQL query to execute (SELECT only — write operations are rejected)')
|
|
15
|
+
.string('dbPath', 'Path to trace DB file. Uses the active recording if omitted.')
|
|
16
|
+
.required('sql')
|
|
17
|
+
.readOnly()
|
|
18
|
+
.idempotent()
|
|
19
|
+
.build(),
|
|
20
|
+
tool('seek_to_timestamp')
|
|
21
|
+
.desc('Reconstruct application state at a specific timestamp from a recorded trace.\n\nReturns a structured snapshot including:\n- Events near the timestamp\n- Debugger state (last pause, call stack)\n- Memory state (latest values per address)\n- Network state (completed requests)\n- Nearest heap snapshot\n\nExamples:\nseek_to_timestamp(timestamp=1711000000000)\nseek_to_timestamp(timestamp=1711000000000, windowMs=500)\nseek_to_timestamp(timestamp=1711000000000, dbPath="artifacts/traces/my-trace.db")')
|
|
22
|
+
.number('timestamp', 'Target timestamp in milliseconds since epoch')
|
|
23
|
+
.string('dbPath', 'Path to trace DB file. Uses the active recording if omitted.')
|
|
24
|
+
.number('windowMs', 'Time window around timestamp to include in ms', { default: 100 })
|
|
25
|
+
.required('timestamp')
|
|
26
|
+
.readOnly()
|
|
27
|
+
.idempotent()
|
|
28
|
+
.build(),
|
|
29
|
+
tool('diff_heap_snapshots')
|
|
30
|
+
.desc('Compare two heap snapshots from a trace and return the differences.\n\nShows:\n- New object types (in snapshot 2 but not 1)\n- Deleted object types (in snapshot 1 but not 2)\n- Changed objects (count or size differs)\n- Total size delta\n\nUseful for identifying state changes in obfuscated code.\n\nExamples:\ndiff_heap_snapshots(snapshotId1=1, snapshotId2=2)\ndiff_heap_snapshots(snapshotId1=1, snapshotId2=3, dbPath="artifacts/traces/my-trace.db")')
|
|
31
|
+
.number('snapshotId1', 'First snapshot ID (earlier)')
|
|
32
|
+
.number('snapshotId2', 'Second snapshot ID (later)')
|
|
33
|
+
.string('dbPath', 'Path to trace DB file. Uses the active recording if omitted.')
|
|
34
|
+
.required('snapshotId1', 'snapshotId2')
|
|
35
|
+
.readOnly()
|
|
36
|
+
.idempotent()
|
|
37
|
+
.build(),
|
|
38
|
+
tool('export_trace')
|
|
39
|
+
.desc('Export a trace database to Chrome Trace Event JSON format.\n\nThe resulting file can be loaded in:\n- chrome://tracing\n- Perfetto UI (ui.perfetto.dev)\n\nMaps events to the standard trace event format with name, category, phase, timestamp.\n\nExamples:\nexport_trace()\nexport_trace(dbPath="artifacts/traces/my-trace.db")\nexport_trace(outputPath="my-export.json")')
|
|
40
|
+
.string('dbPath', 'Path to trace DB file. Uses the active recording if omitted.')
|
|
41
|
+
.string('outputPath', 'Output JSON file path. Auto-generated if omitted.')
|
|
42
|
+
.idempotent()
|
|
43
|
+
.build(),
|
|
44
|
+
tool('summarize_trace')
|
|
45
|
+
.desc('Generate a compact, LLM-friendly summary of a trace database.\n\nAvoids sending raw trace data that may exceed context windows. Three detail levels:\n- compact: category aggregation + timeline overview (~10% of raw size)\n- balanced: compact + key moments (breakpoints, exceptions, network completions) [DEFAULT]\n- full: passthrough — returns all events without compression\n\nAlso detects memory anomalies: addresses with significantly more writes than average.\n\nExamples:\nsummarize_trace()\nsummarize_trace(detail="compact")\nsummarize_trace(detail="balanced", dbPath="artifacts/traces/my-trace.db")')
|
|
46
|
+
.enum('detail', ['compact', 'balanced', 'full'], 'Summary detail level', {
|
|
47
|
+
default: 'balanced',
|
|
48
|
+
})
|
|
49
|
+
.string('dbPath', 'Path to trace DB file. Uses the active recording if omitted.')
|
|
50
|
+
.readOnly()
|
|
51
|
+
.idempotent()
|
|
52
|
+
.build(),
|
|
178
53
|
];
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { MCPServerContext } from '../../MCPServer.context.js';
|
|
2
|
-
import { TraceRecorder } from '../../../modules/trace/TraceRecorder.js';
|
|
2
|
+
import { type TraceRecorder } from '../../../modules/trace/TraceRecorder.js';
|
|
3
3
|
export declare class TraceToolHandlers {
|
|
4
4
|
private readonly recorder;
|
|
5
5
|
private readonly ctx;
|
|
@@ -13,4 +13,5 @@ export declare class TraceToolHandlers {
|
|
|
13
13
|
private getDbForReading;
|
|
14
14
|
private rowToObject;
|
|
15
15
|
private safeParseJSON;
|
|
16
|
+
handleSummarizeTrace(args: Record<string, unknown>): Promise<unknown>;
|
|
16
17
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { writeFile } from 'node:fs/promises';
|
|
2
2
|
import { TraceDB } from '../../../modules/trace/TraceDB.js';
|
|
3
|
-
import {
|
|
3
|
+
import {} from '../../../modules/trace/TraceRecorder.js';
|
|
4
4
|
import { resolveArtifactPath } from '../../../utils/artifacts.js';
|
|
5
|
+
import { summarizeEvents, summarizeMemoryDeltas, } from '../../domains/trace/TraceSummarizer.js';
|
|
5
6
|
export class TraceToolHandlers {
|
|
6
7
|
recorder;
|
|
7
8
|
ctx;
|
|
@@ -41,9 +42,7 @@ export class TraceToolHandlers {
|
|
|
41
42
|
}
|
|
42
43
|
async handleStopTraceRecording() {
|
|
43
44
|
const session = this.recorder.stop();
|
|
44
|
-
const duration = session.stoppedAt
|
|
45
|
-
? session.stoppedAt - session.startedAt
|
|
46
|
-
: 0;
|
|
45
|
+
const duration = session.stoppedAt ? session.stoppedAt - session.startedAt : 0;
|
|
47
46
|
return {
|
|
48
47
|
status: 'stopped',
|
|
49
48
|
sessionId: session.sessionId,
|
|
@@ -111,7 +110,7 @@ export class TraceToolHandlers {
|
|
|
111
110
|
return {
|
|
112
111
|
seekTimestamp: timestamp,
|
|
113
112
|
windowMs,
|
|
114
|
-
events: events.map(e => ({
|
|
113
|
+
events: events.map((e) => ({
|
|
115
114
|
timestamp: e.timestamp,
|
|
116
115
|
category: e.category,
|
|
117
116
|
eventType: e.eventType,
|
|
@@ -120,13 +119,13 @@ export class TraceToolHandlers {
|
|
|
120
119
|
lineNumber: e.lineNumber,
|
|
121
120
|
})),
|
|
122
121
|
debuggerState: {
|
|
123
|
-
recentEvents: debuggerEventsResult.rows.map(row => this.rowToObject(debuggerEventsResult.columns, row)),
|
|
122
|
+
recentEvents: debuggerEventsResult.rows.map((row) => this.rowToObject(debuggerEventsResult.columns, row)),
|
|
124
123
|
},
|
|
125
124
|
memoryState: {
|
|
126
|
-
addressValues: memoryStateResult.rows.map(row => this.rowToObject(memoryStateResult.columns, row)),
|
|
125
|
+
addressValues: memoryStateResult.rows.map((row) => this.rowToObject(memoryStateResult.columns, row)),
|
|
127
126
|
},
|
|
128
127
|
networkState: {
|
|
129
|
-
completedRequests: networkResult.rows.map(row => this.rowToObject(networkResult.columns, row)),
|
|
128
|
+
completedRequests: networkResult.rows.map((row) => this.rowToObject(networkResult.columns, row)),
|
|
130
129
|
},
|
|
131
130
|
nearestHeapSnapshot: snapshotResult.rows.length > 0
|
|
132
131
|
? this.rowToObject(snapshotResult.columns, snapshotResult.rows[0])
|
|
@@ -224,7 +223,7 @@ export class TraceToolHandlers {
|
|
|
224
223
|
const allEvents = db.query('SELECT timestamp, category, event_type, data, script_id, line_number FROM events ORDER BY timestamp ASC');
|
|
225
224
|
const PAIRED_BEGIN = new Set(['Debugger.paused']);
|
|
226
225
|
const PAIRED_END = new Set(['Debugger.resumed']);
|
|
227
|
-
const traceEvents = allEvents.rows.map(row => {
|
|
226
|
+
const traceEvents = allEvents.rows.map((row) => {
|
|
228
227
|
const ts = row[0] * 1000;
|
|
229
228
|
const cat = row[1];
|
|
230
229
|
const name = row[2];
|
|
@@ -297,4 +296,58 @@ export class TraceToolHandlers {
|
|
|
297
296
|
return str;
|
|
298
297
|
}
|
|
299
298
|
}
|
|
299
|
+
async handleSummarizeTrace(args) {
|
|
300
|
+
const detail = args['detail'] ?? 'balanced';
|
|
301
|
+
const dbPath = args['dbPath'];
|
|
302
|
+
let db;
|
|
303
|
+
let shouldClose = false;
|
|
304
|
+
if (dbPath) {
|
|
305
|
+
db = new TraceDB({ dbPath });
|
|
306
|
+
shouldClose = true;
|
|
307
|
+
}
|
|
308
|
+
else if (this.recorder.getState() === 'recording') {
|
|
309
|
+
const activeDb = this.recorder.getDB();
|
|
310
|
+
if (!activeDb)
|
|
311
|
+
throw new Error('Active recording has no database');
|
|
312
|
+
db = activeDb;
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
throw new Error('No trace database specified and no active recording');
|
|
316
|
+
}
|
|
317
|
+
try {
|
|
318
|
+
const eventsResult = db.query('SELECT timestamp, category, event_type, data, script_id, line_number FROM events ORDER BY timestamp');
|
|
319
|
+
const events = eventsResult.rows.map((row) => ({
|
|
320
|
+
timestamp: row[0],
|
|
321
|
+
category: row[1],
|
|
322
|
+
eventType: row[2],
|
|
323
|
+
data: typeof row[3] === 'string' ? this.safeParseJSON(row[3]) : row[3],
|
|
324
|
+
scriptId: row[4],
|
|
325
|
+
lineNumber: row[5],
|
|
326
|
+
}));
|
|
327
|
+
const deltasResult = db.query('SELECT timestamp, address, old_value, new_value, size, value_type FROM memory_deltas ORDER BY timestamp');
|
|
328
|
+
const deltas = deltasResult.rows.map((row) => ({
|
|
329
|
+
timestamp: row[0],
|
|
330
|
+
address: row[1],
|
|
331
|
+
oldValue: row[2],
|
|
332
|
+
newValue: row[3],
|
|
333
|
+
size: row[4],
|
|
334
|
+
valueType: row[5],
|
|
335
|
+
}));
|
|
336
|
+
const eventSummary = summarizeEvents(events, detail);
|
|
337
|
+
const memorySummary = summarizeMemoryDeltas(deltas);
|
|
338
|
+
return {
|
|
339
|
+
events: eventSummary,
|
|
340
|
+
memory: memorySummary,
|
|
341
|
+
metadata: {
|
|
342
|
+
dbPath: dbPath ?? 'active recording',
|
|
343
|
+
generatedAt: new Date().toISOString(),
|
|
344
|
+
},
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
finally {
|
|
348
|
+
if (shouldClose) {
|
|
349
|
+
db.close();
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
300
353
|
}
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export
|
|
1
|
+
export * from './definitions.tools.js';
|
|
2
|
+
export { TraceToolHandlers } from './handlers.js';
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export
|
|
1
|
+
export * from './definitions.tools.js';
|
|
2
|
+
export { TraceToolHandlers } from './handlers.js';
|
|
@@ -33,16 +33,30 @@ const manifest = {
|
|
|
33
33
|
'seek_to_timestamp',
|
|
34
34
|
'diff_heap_snapshots',
|
|
35
35
|
'export_trace',
|
|
36
|
+
'summarize_trace',
|
|
36
37
|
],
|
|
37
|
-
hint: 'Start recording → perform actions → stop recording → query/seek/diff/export',
|
|
38
|
+
hint: 'Start recording → perform actions → stop recording → summarize/query/seek/diff/export',
|
|
38
39
|
},
|
|
39
40
|
registrations: [
|
|
40
|
-
{
|
|
41
|
-
|
|
41
|
+
{
|
|
42
|
+
tool: t('start_trace_recording'),
|
|
43
|
+
domain: DOMAIN,
|
|
44
|
+
bind: b((h, a) => h.handleStartTraceRecording(a)),
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
tool: t('stop_trace_recording'),
|
|
48
|
+
domain: DOMAIN,
|
|
49
|
+
bind: b((h) => h.handleStopTraceRecording()),
|
|
50
|
+
},
|
|
42
51
|
{ tool: t('query_trace_sql'), domain: DOMAIN, bind: b((h, a) => h.handleQueryTraceSql(a)) },
|
|
43
52
|
{ tool: t('seek_to_timestamp'), domain: DOMAIN, bind: b((h, a) => h.handleSeekToTimestamp(a)) },
|
|
44
|
-
{
|
|
53
|
+
{
|
|
54
|
+
tool: t('diff_heap_snapshots'),
|
|
55
|
+
domain: DOMAIN,
|
|
56
|
+
bind: b((h, a) => h.handleDiffHeapSnapshots(a)),
|
|
57
|
+
},
|
|
45
58
|
{ tool: t('export_trace'), domain: DOMAIN, bind: b((h, a) => h.handleExportTrace(a)) },
|
|
59
|
+
{ tool: t('summarize_trace'), domain: DOMAIN, bind: b((h, a) => h.handleSummarizeTrace(a)) },
|
|
46
60
|
],
|
|
47
61
|
};
|
|
48
62
|
export default manifest;
|