@ai-jshook/mcp 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. package/.env.example +38 -0
  2. package/CLAUDE.md +170 -0
  3. package/README.md +564 -0
  4. package/bun.lock +1484 -0
  5. package/dist/index.d.ts +3 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +57 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/modules/analyzer/AISummarizer.d.ts +41 -0
  10. package/dist/modules/analyzer/AISummarizer.d.ts.map +1 -0
  11. package/dist/modules/analyzer/AISummarizer.js +186 -0
  12. package/dist/modules/analyzer/AISummarizer.js.map +1 -0
  13. package/dist/modules/analyzer/CodeAnalyzer.d.ts +28 -0
  14. package/dist/modules/analyzer/CodeAnalyzer.d.ts.map +1 -0
  15. package/dist/modules/analyzer/CodeAnalyzer.js +1287 -0
  16. package/dist/modules/analyzer/CodeAnalyzer.js.map +1 -0
  17. package/dist/modules/analyzer/IntelligentAnalyzer.d.ts +114 -0
  18. package/dist/modules/analyzer/IntelligentAnalyzer.d.ts.map +1 -0
  19. package/dist/modules/analyzer/IntelligentAnalyzer.js +1176 -0
  20. package/dist/modules/analyzer/IntelligentAnalyzer.js.map +1 -0
  21. package/dist/modules/browser/BrowserModeManager.d.ts +31 -0
  22. package/dist/modules/browser/BrowserModeManager.d.ts.map +1 -0
  23. package/dist/modules/browser/BrowserModeManager.js +241 -0
  24. package/dist/modules/browser/BrowserModeManager.js.map +1 -0
  25. package/dist/modules/captcha/AICaptchaDetector.d.ts +32 -0
  26. package/dist/modules/captcha/AICaptchaDetector.d.ts.map +1 -0
  27. package/dist/modules/captcha/AICaptchaDetector.js +387 -0
  28. package/dist/modules/captcha/AICaptchaDetector.js.map +1 -0
  29. package/dist/modules/captcha/CaptchaDetector.d.ts +28 -0
  30. package/dist/modules/captcha/CaptchaDetector.d.ts.map +1 -0
  31. package/dist/modules/captcha/CaptchaDetector.js +513 -0
  32. package/dist/modules/captcha/CaptchaDetector.js.map +1 -0
  33. package/dist/modules/collector/CodeCache.d.ts +37 -0
  34. package/dist/modules/collector/CodeCache.d.ts.map +1 -0
  35. package/dist/modules/collector/CodeCache.js +188 -0
  36. package/dist/modules/collector/CodeCache.js.map +1 -0
  37. package/dist/modules/collector/CodeCollector.d.ts +107 -0
  38. package/dist/modules/collector/CodeCollector.d.ts.map +1 -0
  39. package/dist/modules/collector/CodeCollector.js +796 -0
  40. package/dist/modules/collector/CodeCollector.js.map +1 -0
  41. package/dist/modules/collector/CodeCompressor.d.ts +65 -0
  42. package/dist/modules/collector/CodeCompressor.d.ts.map +1 -0
  43. package/dist/modules/collector/CodeCompressor.js +245 -0
  44. package/dist/modules/collector/CodeCompressor.js.map +1 -0
  45. package/dist/modules/collector/DOMInspector.d.ts +51 -0
  46. package/dist/modules/collector/DOMInspector.d.ts.map +1 -0
  47. package/dist/modules/collector/DOMInspector.js +437 -0
  48. package/dist/modules/collector/DOMInspector.js.map +1 -0
  49. package/dist/modules/collector/PageController.d.ts +79 -0
  50. package/dist/modules/collector/PageController.d.ts.map +1 -0
  51. package/dist/modules/collector/PageController.js +287 -0
  52. package/dist/modules/collector/PageController.js.map +1 -0
  53. package/dist/modules/collector/SmartCodeCollector.d.ts +38 -0
  54. package/dist/modules/collector/SmartCodeCollector.d.ts.map +1 -0
  55. package/dist/modules/collector/SmartCodeCollector.js +208 -0
  56. package/dist/modules/collector/SmartCodeCollector.js.map +1 -0
  57. package/dist/modules/collector/StreamingCollector.d.ts +46 -0
  58. package/dist/modules/collector/StreamingCollector.d.ts.map +1 -0
  59. package/dist/modules/collector/StreamingCollector.js +127 -0
  60. package/dist/modules/collector/StreamingCollector.js.map +1 -0
  61. package/dist/modules/crypto/CryptoDetector.d.ts +22 -0
  62. package/dist/modules/crypto/CryptoDetector.d.ts.map +1 -0
  63. package/dist/modules/crypto/CryptoDetector.js +168 -0
  64. package/dist/modules/crypto/CryptoDetector.js.map +1 -0
  65. package/dist/modules/crypto/CryptoDetectorEnhanced.d.ts +31 -0
  66. package/dist/modules/crypto/CryptoDetectorEnhanced.d.ts.map +1 -0
  67. package/dist/modules/crypto/CryptoDetectorEnhanced.js +269 -0
  68. package/dist/modules/crypto/CryptoDetectorEnhanced.js.map +1 -0
  69. package/dist/modules/crypto/CryptoRules.d.ts +59 -0
  70. package/dist/modules/crypto/CryptoRules.d.ts.map +1 -0
  71. package/dist/modules/crypto/CryptoRules.js +234 -0
  72. package/dist/modules/crypto/CryptoRules.js.map +1 -0
  73. package/dist/modules/debugger/BlackboxManager.d.ts +14 -0
  74. package/dist/modules/debugger/BlackboxManager.d.ts.map +1 -0
  75. package/dist/modules/debugger/BlackboxManager.js +98 -0
  76. package/dist/modules/debugger/BlackboxManager.js.map +1 -0
  77. package/dist/modules/debugger/DebuggerManager.d.ts +138 -0
  78. package/dist/modules/debugger/DebuggerManager.d.ts.map +1 -0
  79. package/dist/modules/debugger/DebuggerManager.js +777 -0
  80. package/dist/modules/debugger/DebuggerManager.js.map +1 -0
  81. package/dist/modules/debugger/EventBreakpointManager.d.ts +30 -0
  82. package/dist/modules/debugger/EventBreakpointManager.d.ts.map +1 -0
  83. package/dist/modules/debugger/EventBreakpointManager.js +125 -0
  84. package/dist/modules/debugger/EventBreakpointManager.js.map +1 -0
  85. package/dist/modules/debugger/RuntimeInspector.d.ts +54 -0
  86. package/dist/modules/debugger/RuntimeInspector.d.ts.map +1 -0
  87. package/dist/modules/debugger/RuntimeInspector.js +277 -0
  88. package/dist/modules/debugger/RuntimeInspector.js.map +1 -0
  89. package/dist/modules/debugger/ScriptManager.d.ts +94 -0
  90. package/dist/modules/debugger/ScriptManager.d.ts.map +1 -0
  91. package/dist/modules/debugger/ScriptManager.js +433 -0
  92. package/dist/modules/debugger/ScriptManager.js.map +1 -0
  93. package/dist/modules/debugger/WatchExpressionManager.d.ts +52 -0
  94. package/dist/modules/debugger/WatchExpressionManager.d.ts.map +1 -0
  95. package/dist/modules/debugger/WatchExpressionManager.js +136 -0
  96. package/dist/modules/debugger/WatchExpressionManager.js.map +1 -0
  97. package/dist/modules/debugger/XHRBreakpointManager.d.ts +21 -0
  98. package/dist/modules/debugger/XHRBreakpointManager.d.ts.map +1 -0
  99. package/dist/modules/debugger/XHRBreakpointManager.js +81 -0
  100. package/dist/modules/debugger/XHRBreakpointManager.js.map +1 -0
  101. package/dist/modules/deobfuscator/ASTOptimizer.d.ts +12 -0
  102. package/dist/modules/deobfuscator/ASTOptimizer.d.ts.map +1 -0
  103. package/dist/modules/deobfuscator/ASTOptimizer.js +234 -0
  104. package/dist/modules/deobfuscator/ASTOptimizer.js.map +1 -0
  105. package/dist/modules/deobfuscator/AdvancedDeobfuscator.d.ts +52 -0
  106. package/dist/modules/deobfuscator/AdvancedDeobfuscator.d.ts.map +1 -0
  107. package/dist/modules/deobfuscator/AdvancedDeobfuscator.js +985 -0
  108. package/dist/modules/deobfuscator/AdvancedDeobfuscator.js.map +1 -0
  109. package/dist/modules/deobfuscator/Deobfuscator.d.ts +23 -0
  110. package/dist/modules/deobfuscator/Deobfuscator.d.ts.map +1 -0
  111. package/dist/modules/deobfuscator/Deobfuscator.js +487 -0
  112. package/dist/modules/deobfuscator/Deobfuscator.js.map +1 -0
  113. package/dist/modules/deobfuscator/JSVMPDeobfuscator.d.ts +19 -0
  114. package/dist/modules/deobfuscator/JSVMPDeobfuscator.d.ts.map +1 -0
  115. package/dist/modules/deobfuscator/JSVMPDeobfuscator.js +594 -0
  116. package/dist/modules/deobfuscator/JSVMPDeobfuscator.js.map +1 -0
  117. package/dist/modules/deobfuscator/JScramberDeobfuscator.d.ts +28 -0
  118. package/dist/modules/deobfuscator/JScramberDeobfuscator.d.ts.map +1 -0
  119. package/dist/modules/deobfuscator/JScramberDeobfuscator.js +239 -0
  120. package/dist/modules/deobfuscator/JScramberDeobfuscator.js.map +1 -0
  121. package/dist/modules/deobfuscator/PackerDeobfuscator.d.ts +38 -0
  122. package/dist/modules/deobfuscator/PackerDeobfuscator.d.ts.map +1 -0
  123. package/dist/modules/deobfuscator/PackerDeobfuscator.js +191 -0
  124. package/dist/modules/deobfuscator/PackerDeobfuscator.js.map +1 -0
  125. package/dist/modules/detector/ObfuscationDetector.d.ts +35 -0
  126. package/dist/modules/detector/ObfuscationDetector.d.ts.map +1 -0
  127. package/dist/modules/detector/ObfuscationDetector.js +278 -0
  128. package/dist/modules/detector/ObfuscationDetector.js.map +1 -0
  129. package/dist/modules/emulator/AIEnvironmentAnalyzer.d.ts +32 -0
  130. package/dist/modules/emulator/AIEnvironmentAnalyzer.d.ts.map +1 -0
  131. package/dist/modules/emulator/AIEnvironmentAnalyzer.js +548 -0
  132. package/dist/modules/emulator/AIEnvironmentAnalyzer.js.map +1 -0
  133. package/dist/modules/emulator/BrowserAPIDatabase.d.ts +34 -0
  134. package/dist/modules/emulator/BrowserAPIDatabase.d.ts.map +1 -0
  135. package/dist/modules/emulator/BrowserAPIDatabase.js +326 -0
  136. package/dist/modules/emulator/BrowserAPIDatabase.js.map +1 -0
  137. package/dist/modules/emulator/BrowserEnvironmentRules.d.ts +47 -0
  138. package/dist/modules/emulator/BrowserEnvironmentRules.d.ts.map +1 -0
  139. package/dist/modules/emulator/BrowserEnvironmentRules.js +493 -0
  140. package/dist/modules/emulator/BrowserEnvironmentRules.js.map +1 -0
  141. package/dist/modules/emulator/EnvironmentEmulator.d.ts +27 -0
  142. package/dist/modules/emulator/EnvironmentEmulator.d.ts.map +1 -0
  143. package/dist/modules/emulator/EnvironmentEmulator.js +1113 -0
  144. package/dist/modules/emulator/EnvironmentEmulator.js.map +1 -0
  145. package/dist/modules/emulator/EnvironmentEmulatorEnhanced.d.ts +26 -0
  146. package/dist/modules/emulator/EnvironmentEmulatorEnhanced.d.ts.map +1 -0
  147. package/dist/modules/emulator/EnvironmentEmulatorEnhanced.js +493 -0
  148. package/dist/modules/emulator/EnvironmentEmulatorEnhanced.js.map +1 -0
  149. package/dist/modules/emulator/templates/chrome-env.d.ts +260 -0
  150. package/dist/modules/emulator/templates/chrome-env.d.ts.map +1 -0
  151. package/dist/modules/emulator/templates/chrome-env.js +253 -0
  152. package/dist/modules/emulator/templates/chrome-env.js.map +1 -0
  153. package/dist/modules/hook/AIHookGenerator.d.ts +53 -0
  154. package/dist/modules/hook/AIHookGenerator.d.ts.map +1 -0
  155. package/dist/modules/hook/AIHookGenerator.js +353 -0
  156. package/dist/modules/hook/AIHookGenerator.js.map +1 -0
  157. package/dist/modules/hook/HookManager.d.ts +67 -0
  158. package/dist/modules/hook/HookManager.d.ts.map +1 -0
  159. package/dist/modules/hook/HookManager.js +1225 -0
  160. package/dist/modules/hook/HookManager.js.map +1 -0
  161. package/dist/modules/monitor/ConsoleMonitor.d.ts +140 -0
  162. package/dist/modules/monitor/ConsoleMonitor.d.ts.map +1 -0
  163. package/dist/modules/monitor/ConsoleMonitor.js +834 -0
  164. package/dist/modules/monitor/ConsoleMonitor.js.map +1 -0
  165. package/dist/modules/monitor/PerformanceMonitor.d.ts +65 -0
  166. package/dist/modules/monitor/PerformanceMonitor.d.ts.map +1 -0
  167. package/dist/modules/monitor/PerformanceMonitor.js +175 -0
  168. package/dist/modules/monitor/PerformanceMonitor.js.map +1 -0
  169. package/dist/modules/stealth/StealthScripts2025.d.ts +17 -0
  170. package/dist/modules/stealth/StealthScripts2025.d.ts.map +1 -0
  171. package/dist/modules/stealth/StealthScripts2025.js +274 -0
  172. package/dist/modules/stealth/StealthScripts2025.js.map +1 -0
  173. package/dist/modules/symbolic/JSVMPSymbolicExecutor.d.ts +69 -0
  174. package/dist/modules/symbolic/JSVMPSymbolicExecutor.d.ts.map +1 -0
  175. package/dist/modules/symbolic/JSVMPSymbolicExecutor.js +232 -0
  176. package/dist/modules/symbolic/JSVMPSymbolicExecutor.js.map +1 -0
  177. package/dist/modules/symbolic/SymbolicExecutor.d.ts +69 -0
  178. package/dist/modules/symbolic/SymbolicExecutor.d.ts.map +1 -0
  179. package/dist/modules/symbolic/SymbolicExecutor.js +346 -0
  180. package/dist/modules/symbolic/SymbolicExecutor.js.map +1 -0
  181. package/dist/server/AIHookToolDefinitions.d.ts +3 -0
  182. package/dist/server/AIHookToolDefinitions.d.ts.map +1 -0
  183. package/dist/server/AIHookToolDefinitions.js +284 -0
  184. package/dist/server/AIHookToolDefinitions.js.map +1 -0
  185. package/dist/server/AIHookToolHandlers.d.ts +50 -0
  186. package/dist/server/AIHookToolHandlers.d.ts.map +1 -0
  187. package/dist/server/AIHookToolHandlers.js +311 -0
  188. package/dist/server/AIHookToolHandlers.js.map +1 -0
  189. package/dist/server/AdvancedToolDefinitions.d.ts +3 -0
  190. package/dist/server/AdvancedToolDefinitions.d.ts.map +1 -0
  191. package/dist/server/AdvancedToolDefinitions.js +218 -0
  192. package/dist/server/AdvancedToolDefinitions.js.map +1 -0
  193. package/dist/server/AdvancedToolHandlers.d.ts +85 -0
  194. package/dist/server/AdvancedToolHandlers.d.ts.map +1 -0
  195. package/dist/server/AdvancedToolHandlers.js +431 -0
  196. package/dist/server/AdvancedToolHandlers.js.map +1 -0
  197. package/dist/server/BrowserToolDefinitions.d.ts +3 -0
  198. package/dist/server/BrowserToolDefinitions.d.ts.map +1 -0
  199. package/dist/server/BrowserToolDefinitions.js +841 -0
  200. package/dist/server/BrowserToolDefinitions.js.map +1 -0
  201. package/dist/server/BrowserToolHandlers.d.ts +290 -0
  202. package/dist/server/BrowserToolHandlers.d.ts.map +1 -0
  203. package/dist/server/BrowserToolHandlers.js +784 -0
  204. package/dist/server/BrowserToolHandlers.js.map +1 -0
  205. package/dist/server/CacheToolDefinitions.d.ts +3 -0
  206. package/dist/server/CacheToolDefinitions.d.ts.map +1 -0
  207. package/dist/server/CacheToolDefinitions.js +166 -0
  208. package/dist/server/CacheToolDefinitions.js.map +1 -0
  209. package/dist/server/DebuggerToolDefinitions.d.ts +3 -0
  210. package/dist/server/DebuggerToolDefinitions.d.ts.map +1 -0
  211. package/dist/server/DebuggerToolDefinitions.js +600 -0
  212. package/dist/server/DebuggerToolDefinitions.js.map +1 -0
  213. package/dist/server/DebuggerToolHandlers.d.ts +230 -0
  214. package/dist/server/DebuggerToolHandlers.d.ts.map +1 -0
  215. package/dist/server/DebuggerToolHandlers.js +935 -0
  216. package/dist/server/DebuggerToolHandlers.js.map +1 -0
  217. package/dist/server/MCPServer.d.ts +55 -0
  218. package/dist/server/MCPServer.d.ts.map +1 -0
  219. package/dist/server/MCPServer.js +1344 -0
  220. package/dist/server/MCPServer.js.map +1 -0
  221. package/dist/server/TokenBudgetToolDefinitions.d.ts +3 -0
  222. package/dist/server/TokenBudgetToolDefinitions.d.ts.map +1 -0
  223. package/dist/server/TokenBudgetToolDefinitions.js +114 -0
  224. package/dist/server/TokenBudgetToolDefinitions.js.map +1 -0
  225. package/dist/services/LLMService.d.ts +41 -0
  226. package/dist/services/LLMService.d.ts.map +1 -0
  227. package/dist/services/LLMService.js +792 -0
  228. package/dist/services/LLMService.js.map +1 -0
  229. package/dist/types/index.d.ts +527 -0
  230. package/dist/types/index.d.ts.map +1 -0
  231. package/dist/types/index.js +2 -0
  232. package/dist/types/index.js.map +1 -0
  233. package/dist/utils/AdaptiveDataSerializer.d.ts +27 -0
  234. package/dist/utils/AdaptiveDataSerializer.d.ts.map +1 -0
  235. package/dist/utils/AdaptiveDataSerializer.js +215 -0
  236. package/dist/utils/AdaptiveDataSerializer.js.map +1 -0
  237. package/dist/utils/CacheAdapters.d.ts +30 -0
  238. package/dist/utils/CacheAdapters.d.ts.map +1 -0
  239. package/dist/utils/CacheAdapters.js +83 -0
  240. package/dist/utils/CacheAdapters.js.map +1 -0
  241. package/dist/utils/TokenBudgetManager.d.ts +52 -0
  242. package/dist/utils/TokenBudgetManager.d.ts.map +1 -0
  243. package/dist/utils/TokenBudgetManager.js +190 -0
  244. package/dist/utils/TokenBudgetManager.js.map +1 -0
  245. package/dist/utils/UnifiedCacheManager.d.ts +55 -0
  246. package/dist/utils/UnifiedCacheManager.d.ts.map +1 -0
  247. package/dist/utils/UnifiedCacheManager.js +207 -0
  248. package/dist/utils/UnifiedCacheManager.js.map +1 -0
  249. package/dist/utils/cache.d.ts +13 -0
  250. package/dist/utils/cache.d.ts.map +1 -0
  251. package/dist/utils/cache.js +92 -0
  252. package/dist/utils/cache.js.map +1 -0
  253. package/dist/utils/config.d.ts +7 -0
  254. package/dist/utils/config.d.ts.map +1 -0
  255. package/dist/utils/config.js +93 -0
  256. package/dist/utils/config.js.map +1 -0
  257. package/dist/utils/detailedDataManager.d.ts +60 -0
  258. package/dist/utils/detailedDataManager.d.ts.map +1 -0
  259. package/dist/utils/detailedDataManager.js +204 -0
  260. package/dist/utils/detailedDataManager.js.map +1 -0
  261. package/dist/utils/logger.d.ts +16 -0
  262. package/dist/utils/logger.d.ts.map +1 -0
  263. package/dist/utils/logger.js +47 -0
  264. package/dist/utils/logger.js.map +1 -0
  265. package/dist/utils/parallel.d.ts +40 -0
  266. package/dist/utils/parallel.d.ts.map +1 -0
  267. package/dist/utils/parallel.js +148 -0
  268. package/dist/utils/parallel.js.map +1 -0
  269. package/package.json +94 -0
  270. package/server.json +39 -0
  271. package/tsconfig.dev.json +14 -0
@@ -0,0 +1,777 @@
1
+ import { logger } from '../../utils/logger.js';
2
+ import * as fs from 'fs/promises';
3
+ import * as path from 'path';
4
+ import { WatchExpressionManager } from './WatchExpressionManager.js';
5
+ import { XHRBreakpointManager } from './XHRBreakpointManager.js';
6
+ import { EventBreakpointManager } from './EventBreakpointManager.js';
7
+ import { BlackboxManager } from './BlackboxManager.js';
8
+ export class DebuggerManager {
9
+ collector;
10
+ cdpSession = null;
11
+ enabled = false;
12
+ breakpoints = new Map();
13
+ pausedState = null;
14
+ pausedResolvers = [];
15
+ breakpointHitCallbacks = new Set();
16
+ pauseOnExceptionsState = 'none';
17
+ _watchManager = null;
18
+ _xhrManager = null;
19
+ _eventManager = null;
20
+ _blackboxManager = null;
21
+ pausedListener = null;
22
+ resumedListener = null;
23
+ breakpointResolvedListener = null;
24
+ constructor(collector) {
25
+ this.collector = collector;
26
+ }
27
+ getCDPSession() {
28
+ if (!this.cdpSession || !this.enabled) {
29
+ throw new Error('Debugger not enabled. Call init() or enable() first to get CDP session.');
30
+ }
31
+ return this.cdpSession;
32
+ }
33
+ getWatchManager() {
34
+ if (!this._watchManager) {
35
+ throw new Error('WatchExpressionManager not initialized. Call initAdvancedFeatures() first.');
36
+ }
37
+ return this._watchManager;
38
+ }
39
+ getXHRManager() {
40
+ if (!this._xhrManager) {
41
+ throw new Error('XHRBreakpointManager not initialized. Call initAdvancedFeatures() first.');
42
+ }
43
+ return this._xhrManager;
44
+ }
45
+ getEventManager() {
46
+ if (!this._eventManager) {
47
+ throw new Error('EventBreakpointManager not initialized. Call initAdvancedFeatures() first.');
48
+ }
49
+ return this._eventManager;
50
+ }
51
+ getBlackboxManager() {
52
+ if (!this._blackboxManager) {
53
+ throw new Error('BlackboxManager not initialized. Call initAdvancedFeatures() first.');
54
+ }
55
+ return this._blackboxManager;
56
+ }
57
+ async init() {
58
+ if (this.enabled) {
59
+ logger.warn('Debugger already enabled');
60
+ return;
61
+ }
62
+ try {
63
+ const page = await this.collector.getActivePage();
64
+ this.cdpSession = await page.createCDPSession();
65
+ await this.cdpSession.send('Debugger.enable');
66
+ this.enabled = true;
67
+ this.pausedListener = (params) => this.handlePaused(params);
68
+ this.resumedListener = () => this.handleResumed();
69
+ this.breakpointResolvedListener = (params) => this.handleBreakpointResolved(params);
70
+ this.cdpSession.on('Debugger.paused', this.pausedListener);
71
+ this.cdpSession.on('Debugger.resumed', this.resumedListener);
72
+ this.cdpSession.on('Debugger.breakpointResolved', this.breakpointResolvedListener);
73
+ logger.info('Debugger enabled successfully');
74
+ }
75
+ catch (error) {
76
+ logger.error('Failed to enable debugger:', error);
77
+ throw error;
78
+ }
79
+ }
80
+ async enable() {
81
+ return this.init();
82
+ }
83
+ async initAdvancedFeatures(runtimeInspector) {
84
+ if (!this.enabled || !this.cdpSession) {
85
+ throw new Error('Debugger must be enabled before initializing advanced features. Call init() first.');
86
+ }
87
+ try {
88
+ if (runtimeInspector) {
89
+ this._watchManager = new WatchExpressionManager(runtimeInspector);
90
+ logger.info('WatchExpressionManager initialized');
91
+ }
92
+ this._xhrManager = new XHRBreakpointManager(this.cdpSession);
93
+ logger.info('XHRBreakpointManager initialized');
94
+ this._eventManager = new EventBreakpointManager(this.cdpSession);
95
+ logger.info('EventBreakpointManager initialized');
96
+ this._blackboxManager = new BlackboxManager(this.cdpSession);
97
+ logger.info('BlackboxManager initialized');
98
+ logger.info('All advanced debugging features initialized');
99
+ }
100
+ catch (error) {
101
+ logger.error('Failed to initialize advanced features:', error);
102
+ throw error;
103
+ }
104
+ }
105
+ async disable() {
106
+ if (!this.enabled || !this.cdpSession) {
107
+ logger.warn('Debugger not enabled');
108
+ return;
109
+ }
110
+ try {
111
+ if (this._xhrManager) {
112
+ await this._xhrManager.close();
113
+ this._xhrManager = null;
114
+ }
115
+ if (this._eventManager) {
116
+ await this._eventManager.close();
117
+ this._eventManager = null;
118
+ }
119
+ if (this._blackboxManager) {
120
+ await this._blackboxManager.close();
121
+ this._blackboxManager = null;
122
+ }
123
+ if (this._watchManager) {
124
+ this._watchManager.clearAll();
125
+ this._watchManager = null;
126
+ }
127
+ if (this.pausedListener) {
128
+ this.cdpSession.off('Debugger.paused', this.pausedListener);
129
+ this.pausedListener = null;
130
+ }
131
+ if (this.resumedListener) {
132
+ this.cdpSession.off('Debugger.resumed', this.resumedListener);
133
+ this.resumedListener = null;
134
+ }
135
+ if (this.breakpointResolvedListener) {
136
+ this.cdpSession.off('Debugger.breakpointResolved', this.breakpointResolvedListener);
137
+ this.breakpointResolvedListener = null;
138
+ }
139
+ await this.cdpSession.send('Debugger.disable');
140
+ }
141
+ catch (error) {
142
+ logger.error('Failed to disable debugger:', error);
143
+ }
144
+ finally {
145
+ this.enabled = false;
146
+ this.breakpoints.clear();
147
+ this.pausedState = null;
148
+ this.pausedResolvers = [];
149
+ if (this.cdpSession) {
150
+ try {
151
+ await this.cdpSession.detach();
152
+ }
153
+ catch (e) {
154
+ logger.warn('Failed to detach CDP session:', e);
155
+ }
156
+ this.cdpSession = null;
157
+ }
158
+ logger.info('Debugger disabled and cleaned up');
159
+ }
160
+ }
161
+ isEnabled() {
162
+ return this.enabled;
163
+ }
164
+ async setBreakpointByUrl(params) {
165
+ if (!this.enabled || !this.cdpSession) {
166
+ throw new Error('Debugger is not enabled. Call init() or enable() first.');
167
+ }
168
+ if (!params.url) {
169
+ throw new Error('url parameter is required');
170
+ }
171
+ if (params.lineNumber < 0) {
172
+ throw new Error('lineNumber must be a non-negative number');
173
+ }
174
+ if (params.columnNumber !== undefined && params.columnNumber < 0) {
175
+ throw new Error('columnNumber must be a non-negative number');
176
+ }
177
+ try {
178
+ const result = await this.cdpSession.send('Debugger.setBreakpointByUrl', {
179
+ url: params.url,
180
+ lineNumber: params.lineNumber,
181
+ columnNumber: params.columnNumber,
182
+ condition: params.condition,
183
+ });
184
+ const breakpointInfo = {
185
+ breakpointId: result.breakpointId,
186
+ location: {
187
+ url: params.url,
188
+ lineNumber: params.lineNumber,
189
+ columnNumber: params.columnNumber,
190
+ },
191
+ condition: params.condition,
192
+ enabled: true,
193
+ hitCount: 0,
194
+ createdAt: Date.now(),
195
+ };
196
+ this.breakpoints.set(result.breakpointId, breakpointInfo);
197
+ logger.info(`Breakpoint set: ${params.url}:${params.lineNumber}`, {
198
+ breakpointId: result.breakpointId,
199
+ condition: params.condition,
200
+ });
201
+ return breakpointInfo;
202
+ }
203
+ catch (error) {
204
+ logger.error('Failed to set breakpoint:', error);
205
+ throw error;
206
+ }
207
+ }
208
+ async setBreakpoint(params) {
209
+ if (!this.enabled || !this.cdpSession) {
210
+ throw new Error('Debugger is not enabled. Call init() or enable() first.');
211
+ }
212
+ if (!params.scriptId) {
213
+ throw new Error('scriptId parameter is required');
214
+ }
215
+ if (params.lineNumber < 0) {
216
+ throw new Error('lineNumber must be a non-negative number');
217
+ }
218
+ if (params.columnNumber !== undefined && params.columnNumber < 0) {
219
+ throw new Error('columnNumber must be a non-negative number');
220
+ }
221
+ try {
222
+ const result = await this.cdpSession.send('Debugger.setBreakpoint', {
223
+ location: {
224
+ scriptId: params.scriptId,
225
+ lineNumber: params.lineNumber,
226
+ columnNumber: params.columnNumber,
227
+ },
228
+ condition: params.condition,
229
+ });
230
+ const breakpointInfo = {
231
+ breakpointId: result.breakpointId,
232
+ location: {
233
+ scriptId: params.scriptId,
234
+ lineNumber: params.lineNumber,
235
+ columnNumber: params.columnNumber,
236
+ },
237
+ condition: params.condition,
238
+ enabled: true,
239
+ hitCount: 0,
240
+ createdAt: Date.now(),
241
+ };
242
+ this.breakpoints.set(result.breakpointId, breakpointInfo);
243
+ logger.info(`Breakpoint set: scriptId=${params.scriptId}:${params.lineNumber}`, {
244
+ breakpointId: result.breakpointId,
245
+ });
246
+ return breakpointInfo;
247
+ }
248
+ catch (error) {
249
+ logger.error('Failed to set breakpoint:', error);
250
+ throw error;
251
+ }
252
+ }
253
+ async removeBreakpoint(breakpointId) {
254
+ if (!this.enabled || !this.cdpSession) {
255
+ throw new Error('Debugger is not enabled. Call init() or enable() first.');
256
+ }
257
+ if (!breakpointId) {
258
+ throw new Error('breakpointId parameter is required');
259
+ }
260
+ if (!this.breakpoints.has(breakpointId)) {
261
+ throw new Error(`Breakpoint not found: ${breakpointId}. Use listBreakpoints() to see active breakpoints.`);
262
+ }
263
+ try {
264
+ await this.cdpSession.send('Debugger.removeBreakpoint', { breakpointId });
265
+ this.breakpoints.delete(breakpointId);
266
+ logger.info(`Breakpoint removed: ${breakpointId}`);
267
+ }
268
+ catch (error) {
269
+ logger.error(`Failed to remove breakpoint ${breakpointId}:`, error);
270
+ throw error;
271
+ }
272
+ }
273
+ listBreakpoints() {
274
+ return Array.from(this.breakpoints.values());
275
+ }
276
+ getBreakpoint(breakpointId) {
277
+ return this.breakpoints.get(breakpointId);
278
+ }
279
+ async clearAllBreakpoints() {
280
+ const breakpointIds = Array.from(this.breakpoints.keys());
281
+ for (const id of breakpointIds) {
282
+ await this.removeBreakpoint(id);
283
+ }
284
+ logger.info(`Cleared ${breakpointIds.length} breakpoints`);
285
+ }
286
+ async setPauseOnExceptions(state) {
287
+ if (!this.enabled || !this.cdpSession) {
288
+ throw new Error('Debugger not enabled');
289
+ }
290
+ try {
291
+ await this.cdpSession.send('Debugger.setPauseOnExceptions', { state });
292
+ this.pauseOnExceptionsState = state;
293
+ logger.info(`Pause on exceptions set to: ${state}`);
294
+ }
295
+ catch (error) {
296
+ logger.error('Failed to set pause on exceptions:', error);
297
+ throw error;
298
+ }
299
+ }
300
+ getPauseOnExceptionsState() {
301
+ return this.pauseOnExceptionsState;
302
+ }
303
+ async pause() {
304
+ if (!this.enabled || !this.cdpSession) {
305
+ throw new Error('Debugger not enabled');
306
+ }
307
+ try {
308
+ await this.cdpSession.send('Debugger.pause');
309
+ logger.info('Execution paused');
310
+ }
311
+ catch (error) {
312
+ logger.error('Failed to pause execution:', error);
313
+ throw error;
314
+ }
315
+ }
316
+ async resume() {
317
+ if (!this.enabled || !this.cdpSession) {
318
+ throw new Error('Debugger not enabled');
319
+ }
320
+ try {
321
+ await this.cdpSession.send('Debugger.resume');
322
+ logger.info('Execution resumed');
323
+ }
324
+ catch (error) {
325
+ logger.error('Failed to resume execution:', error);
326
+ throw error;
327
+ }
328
+ }
329
+ async stepInto() {
330
+ if (!this.enabled || !this.cdpSession) {
331
+ throw new Error('Debugger not enabled');
332
+ }
333
+ try {
334
+ await this.cdpSession.send('Debugger.stepInto');
335
+ logger.info('Step into');
336
+ }
337
+ catch (error) {
338
+ logger.error('Failed to step into:', error);
339
+ throw error;
340
+ }
341
+ }
342
+ async stepOver() {
343
+ if (!this.enabled || !this.cdpSession) {
344
+ throw new Error('Debugger not enabled');
345
+ }
346
+ try {
347
+ await this.cdpSession.send('Debugger.stepOver');
348
+ logger.info('Step over');
349
+ }
350
+ catch (error) {
351
+ logger.error('Failed to step over:', error);
352
+ throw error;
353
+ }
354
+ }
355
+ async stepOut() {
356
+ if (!this.enabled || !this.cdpSession) {
357
+ throw new Error('Debugger not enabled');
358
+ }
359
+ try {
360
+ await this.cdpSession.send('Debugger.stepOut');
361
+ logger.info('Step out');
362
+ }
363
+ catch (error) {
364
+ logger.error('Failed to step out:', error);
365
+ throw error;
366
+ }
367
+ }
368
+ getPausedState() {
369
+ return this.pausedState;
370
+ }
371
+ isPaused() {
372
+ return this.pausedState !== null;
373
+ }
374
+ async waitForPaused(timeout = 30000) {
375
+ if (this.pausedState) {
376
+ return this.pausedState;
377
+ }
378
+ return new Promise((resolve, reject) => {
379
+ const timer = setTimeout(() => {
380
+ const index = this.pausedResolvers.indexOf(resolve);
381
+ if (index > -1) {
382
+ this.pausedResolvers.splice(index, 1);
383
+ }
384
+ reject(new Error('Timeout waiting for paused event'));
385
+ }, timeout);
386
+ this.pausedResolvers.push((state) => {
387
+ clearTimeout(timer);
388
+ resolve(state);
389
+ });
390
+ });
391
+ }
392
+ async evaluateOnCallFrame(params) {
393
+ if (!this.enabled || !this.cdpSession) {
394
+ throw new Error('Debugger not enabled');
395
+ }
396
+ if (!this.pausedState) {
397
+ throw new Error('Not in paused state');
398
+ }
399
+ try {
400
+ const result = await this.cdpSession.send('Debugger.evaluateOnCallFrame', {
401
+ callFrameId: params.callFrameId,
402
+ expression: params.expression,
403
+ returnByValue: params.returnByValue !== false,
404
+ });
405
+ logger.info(`Evaluated on call frame: ${params.expression}`, {
406
+ result: result.result.value,
407
+ });
408
+ return result.result;
409
+ }
410
+ catch (error) {
411
+ logger.error('Failed to evaluate on call frame:', error);
412
+ throw error;
413
+ }
414
+ }
415
+ async getScopeVariables(options = {}) {
416
+ if (!this.enabled || !this.cdpSession) {
417
+ throw new Error('Debugger not enabled');
418
+ }
419
+ if (!this.pausedState) {
420
+ throw new Error('Not in paused state. Use pause() or set a breakpoint first.');
421
+ }
422
+ const { callFrameId, includeObjectProperties = false, maxDepth = 1, skipErrors = true, } = options;
423
+ try {
424
+ const targetFrame = callFrameId
425
+ ? this.pausedState.callFrames.find(f => f.callFrameId === callFrameId)
426
+ : this.pausedState.callFrames[0];
427
+ if (!targetFrame) {
428
+ throw new Error(`Call frame not found: ${callFrameId || 'top frame'}`);
429
+ }
430
+ const variables = [];
431
+ const errors = [];
432
+ let successfulScopes = 0;
433
+ for (const scope of targetFrame.scopeChain) {
434
+ try {
435
+ if (scope.object.objectId) {
436
+ const properties = await this.cdpSession.send('Runtime.getProperties', {
437
+ objectId: scope.object.objectId,
438
+ ownProperties: true,
439
+ });
440
+ for (const prop of properties.result) {
441
+ if (prop.name === '__proto__')
442
+ continue;
443
+ const variable = {
444
+ name: prop.name,
445
+ value: prop.value?.value,
446
+ type: prop.value?.type || 'unknown',
447
+ scope: scope.type,
448
+ writable: prop.writable,
449
+ configurable: prop.configurable,
450
+ enumerable: prop.enumerable,
451
+ objectId: prop.value?.objectId,
452
+ };
453
+ variables.push(variable);
454
+ if (includeObjectProperties && prop.value?.objectId && maxDepth > 0) {
455
+ try {
456
+ const nestedProps = await this.getObjectProperties(prop.value.objectId, maxDepth - 1);
457
+ for (const nested of nestedProps) {
458
+ variables.push({
459
+ ...nested,
460
+ name: `${prop.name}.${nested.name}`,
461
+ scope: scope.type,
462
+ });
463
+ }
464
+ }
465
+ catch (nestedError) {
466
+ logger.debug(`Failed to get nested properties for ${prop.name}:`, nestedError);
467
+ }
468
+ }
469
+ }
470
+ successfulScopes++;
471
+ }
472
+ }
473
+ catch (error) {
474
+ const errorMsg = error.message || String(error);
475
+ logger.warn(`Failed to get properties for scope ${scope.type}:`, errorMsg);
476
+ errors.push({
477
+ scope: scope.type,
478
+ error: errorMsg,
479
+ });
480
+ if (!skipErrors) {
481
+ throw error;
482
+ }
483
+ }
484
+ }
485
+ const result = {
486
+ success: true,
487
+ variables,
488
+ callFrameId: targetFrame.callFrameId,
489
+ callFrameInfo: {
490
+ functionName: targetFrame.functionName || '(anonymous)',
491
+ location: `${targetFrame.url}:${targetFrame.location.lineNumber}:${targetFrame.location.columnNumber}`,
492
+ },
493
+ totalScopes: targetFrame.scopeChain.length,
494
+ successfulScopes,
495
+ };
496
+ if (errors.length > 0) {
497
+ result.errors = errors;
498
+ }
499
+ logger.info(`Got ${variables.length} variables from ${successfulScopes}/${targetFrame.scopeChain.length} scopes`, {
500
+ callFrameId: targetFrame.callFrameId,
501
+ functionName: targetFrame.functionName,
502
+ errors: errors.length,
503
+ });
504
+ return result;
505
+ }
506
+ catch (error) {
507
+ logger.error('Failed to get scope variables:', error);
508
+ throw error;
509
+ }
510
+ }
511
+ async getObjectProperties(objectId, maxDepth) {
512
+ if (maxDepth <= 0 || !this.cdpSession) {
513
+ return [];
514
+ }
515
+ try {
516
+ const properties = await this.cdpSession.send('Runtime.getProperties', {
517
+ objectId,
518
+ ownProperties: true,
519
+ });
520
+ const variables = [];
521
+ for (const prop of properties.result) {
522
+ if (prop.name === '__proto__')
523
+ continue;
524
+ variables.push({
525
+ name: prop.name,
526
+ value: prop.value?.value,
527
+ type: prop.value?.type || 'unknown',
528
+ scope: 'local',
529
+ objectId: prop.value?.objectId,
530
+ });
531
+ }
532
+ return variables;
533
+ }
534
+ catch (error) {
535
+ logger.debug(`Failed to get object properties for ${objectId}:`, error);
536
+ return [];
537
+ }
538
+ }
539
+ onBreakpointHit(callback) {
540
+ this.breakpointHitCallbacks.add(callback);
541
+ logger.info('Breakpoint hit callback registered', {
542
+ totalCallbacks: this.breakpointHitCallbacks.size,
543
+ });
544
+ }
545
+ offBreakpointHit(callback) {
546
+ this.breakpointHitCallbacks.delete(callback);
547
+ logger.info('Breakpoint hit callback removed', {
548
+ totalCallbacks: this.breakpointHitCallbacks.size,
549
+ });
550
+ }
551
+ clearBreakpointHitCallbacks() {
552
+ this.breakpointHitCallbacks.clear();
553
+ logger.info('All breakpoint hit callbacks cleared');
554
+ }
555
+ getBreakpointHitCallbackCount() {
556
+ return this.breakpointHitCallbacks.size;
557
+ }
558
+ async handlePaused(params) {
559
+ this.pausedState = {
560
+ callFrames: params.callFrames,
561
+ reason: params.reason,
562
+ data: params.data,
563
+ hitBreakpoints: params.hitBreakpoints,
564
+ timestamp: Date.now(),
565
+ };
566
+ if (params.hitBreakpoints) {
567
+ for (const breakpointId of params.hitBreakpoints) {
568
+ const bp = this.breakpoints.get(breakpointId);
569
+ if (bp) {
570
+ bp.hitCount++;
571
+ }
572
+ }
573
+ }
574
+ logger.info('Execution paused', {
575
+ reason: params.reason,
576
+ location: params.callFrames[0]?.location,
577
+ hitBreakpoints: params.hitBreakpoints,
578
+ });
579
+ if (params.hitBreakpoints && params.hitBreakpoints.length > 0 && this.breakpointHitCallbacks.size > 0) {
580
+ const topFrame = params.callFrames[0];
581
+ let variables;
582
+ try {
583
+ const result = await this.getScopeVariables({ skipErrors: true });
584
+ variables = result.variables;
585
+ }
586
+ catch (error) {
587
+ logger.debug('Failed to auto-fetch variables for breakpoint hit callback:', error);
588
+ }
589
+ const event = {
590
+ breakpointId: params.hitBreakpoints[0],
591
+ breakpointInfo: this.breakpoints.get(params.hitBreakpoints[0]),
592
+ location: {
593
+ scriptId: topFrame.location.scriptId,
594
+ lineNumber: topFrame.location.lineNumber,
595
+ columnNumber: topFrame.location.columnNumber,
596
+ url: topFrame.url,
597
+ },
598
+ callFrames: params.callFrames,
599
+ timestamp: Date.now(),
600
+ variables,
601
+ reason: params.reason,
602
+ };
603
+ for (const callback of this.breakpointHitCallbacks) {
604
+ try {
605
+ await Promise.resolve(callback(event));
606
+ }
607
+ catch (error) {
608
+ logger.error('Breakpoint hit callback error:', error);
609
+ }
610
+ }
611
+ }
612
+ for (const resolver of this.pausedResolvers) {
613
+ resolver(this.pausedState);
614
+ }
615
+ this.pausedResolvers = [];
616
+ }
617
+ handleResumed() {
618
+ this.pausedState = null;
619
+ logger.info('Execution resumed');
620
+ }
621
+ handleBreakpointResolved(params) {
622
+ const bp = this.breakpoints.get(params.breakpointId);
623
+ if (bp) {
624
+ logger.info('Breakpoint resolved', {
625
+ breakpointId: params.breakpointId,
626
+ location: params.location,
627
+ });
628
+ }
629
+ }
630
+ exportSession(metadata) {
631
+ const session = {
632
+ version: '1.0',
633
+ timestamp: Date.now(),
634
+ breakpoints: Array.from(this.breakpoints.values()).map(bp => ({
635
+ location: {
636
+ scriptId: bp.location.scriptId,
637
+ url: bp.location.url,
638
+ lineNumber: bp.location.lineNumber,
639
+ columnNumber: bp.location.columnNumber,
640
+ },
641
+ condition: bp.condition,
642
+ enabled: bp.enabled,
643
+ })),
644
+ pauseOnExceptions: this.pauseOnExceptionsState,
645
+ metadata: metadata || {},
646
+ };
647
+ logger.info('Session exported', {
648
+ breakpointCount: session.breakpoints.length,
649
+ pauseOnExceptions: session.pauseOnExceptions,
650
+ });
651
+ return session;
652
+ }
653
+ async saveSession(filePath, metadata) {
654
+ const session = this.exportSession(metadata);
655
+ if (!filePath) {
656
+ const sessionsDir = path.join(process.cwd(), 'debugger-sessions');
657
+ await fs.mkdir(sessionsDir, { recursive: true });
658
+ filePath = path.join(sessionsDir, `session-${Date.now()}.json`);
659
+ }
660
+ else {
661
+ const dir = path.dirname(filePath);
662
+ await fs.mkdir(dir, { recursive: true });
663
+ }
664
+ await fs.writeFile(filePath, JSON.stringify(session, null, 2), 'utf-8');
665
+ logger.info(`Session saved to ${filePath}`, {
666
+ breakpointCount: session.breakpoints.length,
667
+ });
668
+ return filePath;
669
+ }
670
+ async loadSessionFromFile(filePath) {
671
+ const content = await fs.readFile(filePath, 'utf-8');
672
+ const session = JSON.parse(content);
673
+ await this.importSession(session);
674
+ logger.info(`Session loaded from ${filePath}`, {
675
+ breakpointCount: session.breakpoints.length,
676
+ });
677
+ }
678
+ async importSession(sessionData) {
679
+ if (!this.enabled) {
680
+ throw new Error('Debugger must be enabled before importing session. Call init() or enable() first.');
681
+ }
682
+ const session = typeof sessionData === 'string'
683
+ ? JSON.parse(sessionData)
684
+ : sessionData;
685
+ if (session.version !== '1.0') {
686
+ logger.warn(`Session version mismatch: ${session.version} (expected 1.0)`);
687
+ }
688
+ logger.info('Importing session...', {
689
+ breakpointCount: session.breakpoints.length,
690
+ pauseOnExceptions: session.pauseOnExceptions,
691
+ timestamp: new Date(session.timestamp).toISOString(),
692
+ });
693
+ await this.clearAllBreakpoints();
694
+ let successCount = 0;
695
+ let failCount = 0;
696
+ for (const bp of session.breakpoints) {
697
+ try {
698
+ if (bp.location.url) {
699
+ await this.setBreakpointByUrl({
700
+ url: bp.location.url,
701
+ lineNumber: bp.location.lineNumber,
702
+ columnNumber: bp.location.columnNumber,
703
+ condition: bp.condition,
704
+ });
705
+ successCount++;
706
+ }
707
+ else if (bp.location.scriptId) {
708
+ await this.setBreakpoint({
709
+ scriptId: bp.location.scriptId,
710
+ lineNumber: bp.location.lineNumber,
711
+ columnNumber: bp.location.columnNumber,
712
+ condition: bp.condition,
713
+ });
714
+ successCount++;
715
+ }
716
+ else {
717
+ logger.warn('Breakpoint has neither url nor scriptId, skipping', bp);
718
+ failCount++;
719
+ }
720
+ }
721
+ catch (error) {
722
+ logger.error('Failed to restore breakpoint:', error, bp);
723
+ failCount++;
724
+ }
725
+ }
726
+ if (session.pauseOnExceptions) {
727
+ await this.setPauseOnExceptions(session.pauseOnExceptions);
728
+ }
729
+ logger.info('Session imported', {
730
+ totalBreakpoints: session.breakpoints.length,
731
+ successCount,
732
+ failCount,
733
+ pauseOnExceptions: session.pauseOnExceptions,
734
+ });
735
+ }
736
+ async listSavedSessions() {
737
+ const sessionsDir = path.join(process.cwd(), 'debugger-sessions');
738
+ try {
739
+ await fs.access(sessionsDir);
740
+ }
741
+ catch {
742
+ return [];
743
+ }
744
+ const files = await fs.readdir(sessionsDir);
745
+ const sessions = [];
746
+ for (const file of files) {
747
+ if (file.endsWith('.json')) {
748
+ const filePath = path.join(sessionsDir, file);
749
+ try {
750
+ const content = await fs.readFile(filePath, 'utf-8');
751
+ const session = JSON.parse(content);
752
+ sessions.push({
753
+ path: filePath,
754
+ timestamp: session.timestamp,
755
+ metadata: session.metadata,
756
+ });
757
+ }
758
+ catch (error) {
759
+ logger.warn(`Failed to read session file ${file}:`, error);
760
+ }
761
+ }
762
+ }
763
+ sessions.sort((a, b) => b.timestamp - a.timestamp);
764
+ return sessions;
765
+ }
766
+ async close() {
767
+ if (this.enabled) {
768
+ await this.disable();
769
+ }
770
+ if (this.cdpSession) {
771
+ await this.cdpSession.detach();
772
+ this.cdpSession = null;
773
+ }
774
+ logger.info('Debugger manager closed');
775
+ }
776
+ }
777
+ //# sourceMappingURL=DebuggerManager.js.map